Thanks to Tomas for reviewing these MXF patches. Here is another. FFMPEG already writes out the three range tags. This just reads them in.
Best, Harry From c49f77d1e887d8c84752df11213dcf5afa8f761e Mon Sep 17 00:00:00 2001 From: Harry Mallon <harry.mallon@codex.online> Date: Wed, 12 Aug 2020 10:26:23 +0100 Subject: [PATCH] avformat/mxfdec: Read video range from PictureDescriptor * Capture black_ref, white_ref and color_range and recognise full and narrow range. Signed-off-by: Harry Mallon <harry.mallon@codex.online> --- libavformat/mxfdec.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/libavformat/mxfdec.c b/libavformat/mxfdec.c index fa9dcab658..9d2563239e 100644 --- a/libavformat/mxfdec.c +++ b/libavformat/mxfdec.c @@ -201,6 +201,9 @@ typedef struct MXFDescriptor { int bits_per_sample; int64_t duration; /* ContainerDuration optional property */ unsigned int component_depth; + unsigned int black_ref_level; + unsigned int white_ref_level; + unsigned int color_range; unsigned int horiz_subsampling; unsigned int vert_subsampling; UID *sub_descriptors_refs; @@ -1230,6 +1233,15 @@ static int mxf_read_generic_descriptor(void *arg, AVIOContext *pb, int tag, int case 0x3302: descriptor->horiz_subsampling = avio_rb32(pb); break; + case 0x3304: + descriptor->black_ref_level = avio_rb32(pb); + break; + case 0x3305: + descriptor->white_ref_level = avio_rb32(pb); + break; + case 0x3306: + descriptor->color_range = avio_rb32(pb); + break; case 0x3308: descriptor->vert_subsampling = avio_rb32(pb); break; @@ -2557,6 +2569,16 @@ static int mxf_parse_structural_metadata(MXFContext *mxf) st->codecpar->color_primaries = mxf_get_codec_ul(ff_mxf_color_primaries_uls, &descriptor->color_primaries_ul)->id; st->codecpar->color_trc = mxf_get_codec_ul(ff_mxf_color_trc_uls, &descriptor->color_trc_ul)->id; st->codecpar->color_space = mxf_get_codec_ul(ff_mxf_color_space_uls, &descriptor->color_space_ul)->id; + if (descriptor->black_ref_level == 0 && + descriptor->white_ref_level == ((1<<descriptor->component_depth) - 1) && + descriptor->color_range == ((1<<descriptor->component_depth) - 1)) { + st->codecpar->color_range = AVCOL_RANGE_JPEG; + } + else if (descriptor->black_ref_level == (1 <<(descriptor->component_depth - 4)) && + descriptor->white_ref_level == (235<<(descriptor->component_depth - 8)) && + descriptor->color_range == ((14<<(descriptor->component_depth - 4)) + 1)) { + st->codecpar->color_range = AVCOL_RANGE_MPEG; + } if (descriptor->mastering) { ret = av_stream_add_side_data(st, AV_PKT_DATA_MASTERING_DISPLAY_METADATA, (uint8_t *)descriptor->mastering, -- 2.28.0 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".