Skip to content

Commit 708caef

Browse files
committed
Fix #1165 some avfilters broken in FFmpeg 8
Refactor to `mlt_color_trc_from_colorspace()` and use it to default `AVFrame.color_primaries` and `AVFrame.color_trc` in avfilter.
1 parent da6b2c1 commit 708caef

File tree

5 files changed

+40
-26
lines changed

5 files changed

+40
-26
lines changed

src/modules/avformat/common.c

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -610,11 +610,34 @@ mlt_color_primaries mlt_color_primaries_from_colorspace(mlt_colorspace colorspac
610610
return mlt_color_pri_none;
611611
}
612612

613+
613614
int mlt_to_av_color_range(int full_range)
614615
{
615616
return full_range ? AVCOL_RANGE_JPEG : AVCOL_RANGE_MPEG;
616617
}
617618

619+
mlt_color_trc mlt_color_trc_from_colorspace(mlt_colorspace colorspace)
620+
{
621+
switch (colorspace) {
622+
case mlt_colorspace_bt709:
623+
return mlt_color_trc_bt709;
624+
case mlt_colorspace_bt470bg:
625+
return mlt_color_trc_gamma28;
626+
case mlt_colorspace_smpte240m:
627+
return mlt_color_trc_smpte240m;
628+
case mlt_colorspace_rgb: // sRGB
629+
return mlt_color_trc_iec61966_2_1;
630+
case mlt_colorspace_bt601:
631+
case mlt_colorspace_smpte170m:
632+
return mlt_color_trc_smpte170m;
633+
case mlt_colorspace_bt2020_ncl:
634+
return mlt_color_trc_bt2020_10;
635+
default:
636+
break;
637+
}
638+
return mlt_color_trc_none;
639+
}
640+
618641
void mlt_image_to_avframe(mlt_image image, mlt_frame mltframe, AVFrame *avframe)
619642
{
620643
mlt_properties frame_properties = MLT_FRAME_PROPERTIES(mltframe);

src/modules/avformat/common.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ mlt_colorspace av_to_mlt_colorspace(int colorspace, int width, int height);
5151
int mlt_to_av_color_primaries(mlt_color_primaries primaries);
5252
mlt_color_primaries av_to_mlt_color_primaries(int primaries);
5353
mlt_color_primaries mlt_color_primaries_from_colorspace(mlt_colorspace colorspace, int height);
54+
mlt_color_trc mlt_color_trc_from_colorspace(mlt_colorspace colorspace);
5455
int mlt_to_av_color_range(int full_range);
5556
void mlt_image_to_avframe(mlt_image image, mlt_frame mltframe, AVFrame *avframe);
5657
void avframe_to_mlt_image(AVFrame *avframe, mlt_image image);

src/modules/avformat/consumer_avformat.c

Lines changed: 4 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -370,30 +370,9 @@ static void color_trc_from_colorspace(mlt_properties properties)
370370
{
371371
// Default color transfer characteristic from MLT colorspace.
372372
const char *colorspace_str = mlt_properties_get(properties, "colorspace");
373-
mlt_colorspace colorspace = mlt_image_colorspace_id(colorspace_str);
374-
switch (colorspace) {
375-
case mlt_colorspace_bt709:
376-
mlt_properties_set_int(properties, "color_trc", mlt_color_trc_bt709);
377-
break;
378-
case mlt_colorspace_bt470bg:
379-
mlt_properties_set_int(properties, "color_trc", mlt_color_trc_gamma28);
380-
break;
381-
case mlt_colorspace_smpte240m:
382-
mlt_properties_set_int(properties, "color_trc", mlt_color_trc_smpte240m);
383-
break;
384-
case mlt_colorspace_rgb: // sRGB
385-
mlt_properties_set_int(properties, "color_trc", mlt_color_trc_iec61966_2_1);
386-
break;
387-
case mlt_colorspace_bt601:
388-
case mlt_colorspace_smpte170m:
389-
mlt_properties_set_int(properties, "color_trc", mlt_color_trc_smpte170m);
390-
break;
391-
case mlt_colorspace_bt2020_ncl:
392-
mlt_properties_set_int(properties, "color_trc", mlt_color_trc_bt2020_10);
393-
break;
394-
default:
395-
break;
396-
}
373+
const mlt_colorspace colorspace = mlt_image_colorspace_id(colorspace_str);
374+
const mlt_color_trc trc = mlt_color_trc_from_colorspace(colorspace);
375+
mlt_properties_set_int(properties, "color_trc", trc);
397376
}
398377

399378
static void color_primaries_from_colorspace(mlt_properties properties)
@@ -956,6 +935,7 @@ static AVStream *add_video_stream(mlt_consumer consumer,
956935
// Temporarily convert the mlt colorspace to av colorspace before applying the properties
957936
const char *colorspace_str = mlt_properties_get(properties, "colorspace");
958937
mlt_colorspace colorspace = mlt_image_colorspace_id(colorspace_str);
938+
colorspace = mlt_colorspace_rgb;
959939
mlt_properties_clear(properties, "colorspace");
960940
int av_colorspace = mlt_to_av_colorspace(colorspace,
961941
mlt_properties_get_int(properties, "height"));

src/modules/avformat/filter_avfilter.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -862,9 +862,14 @@ static int filter_get_image(mlt_frame frame,
862862
#endif
863863
const char *primaries_str = mlt_properties_get(frame_properties, "color_primaries");
864864
mlt_color_primaries primaries = mlt_image_color_pri_id(primaries_str);
865+
if (primaries == mlt_color_pri_none)
866+
primaries = mlt_color_primaries_from_colorspace(colorspace, *height);
865867
pdata->avinframe->color_primaries = mlt_to_av_color_primaries(primaries);
866868
const char *color_trc_str = mlt_properties_get(frame_properties, "color_trc");
867-
pdata->avinframe->color_trc = mlt_to_av_color_trc(mlt_image_color_trc_id(color_trc_str));
869+
mlt_color_trc trc = mlt_image_color_trc_id(color_trc_str);
870+
if (trc == mlt_color_trc_none)
871+
trc = mlt_color_trc_from_colorspace(colorspace);
872+
pdata->avinframe->color_trc = mlt_to_av_color_trc(trc);
868873
pdata->avinframe->color_range = mlt_to_av_color_range(full_range);
869874

870875
if (is_rgb(*format)) {

src/modules/avformat/link_avfilter.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -966,9 +966,14 @@ static int link_get_image(mlt_frame frame,
966966
#endif
967967
const char *primaries_str = mlt_properties_get(frame_properties, "color_primaries");
968968
mlt_color_primaries primaries = mlt_image_color_pri_id(primaries_str);
969+
if (primaries == mlt_color_pri_none)
970+
primaries = mlt_color_primaries_from_colorspace(colorspace, *height);
969971
pdata->avinframe->color_primaries = mlt_to_av_color_primaries(primaries);
970972
const char *color_trc_str = mlt_properties_get(frame_properties, "color_trc");
971-
pdata->avinframe->color_trc = mlt_to_av_color_trc(mlt_image_color_trc_id(color_trc_str));
973+
mlt_color_trc trc = mlt_image_color_trc_id(color_trc_str);
974+
pdata->avinframe->color_trc = mlt_to_av_color_trc(trc);
975+
if (trc == mlt_color_trc_none)
976+
trc = mlt_color_trc_from_colorspace(colorspace);
972977
pdata->avinframe->color_range = mlt_to_av_color_range(full_range);
973978
const char *colorspace_str = mlt_properties_get(frame_properties, "colorspace");
974979
mlt_colorspace colorspace = mlt_image_colorspace_id(colorspace_str);

0 commit comments

Comments
 (0)