@@ -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,