You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-08-10 06:10:52 +02:00
avformat/mxfdec: Read video range from CDCIEssenceDescriptor
* Capture black_ref, white_ref and color_range and recognise full and narrow range. Signed-off-by: Harry Mallon <harry.mallon@codex.online>
This commit is contained in:
committed by
Tomas Härdin
parent
1a35fffaf2
commit
719eb8a2e4
@@ -199,6 +199,9 @@ typedef struct MXFDescriptor {
|
|||||||
int bits_per_sample;
|
int bits_per_sample;
|
||||||
int64_t duration; /* ContainerDuration optional property */
|
int64_t duration; /* ContainerDuration optional property */
|
||||||
unsigned int component_depth;
|
unsigned int component_depth;
|
||||||
|
unsigned int black_ref_level;
|
||||||
|
unsigned int white_ref_level;
|
||||||
|
unsigned int color_range;
|
||||||
unsigned int horiz_subsampling;
|
unsigned int horiz_subsampling;
|
||||||
unsigned int vert_subsampling;
|
unsigned int vert_subsampling;
|
||||||
UID *sub_descriptors_refs;
|
UID *sub_descriptors_refs;
|
||||||
@@ -1222,6 +1225,15 @@ static int mxf_read_generic_descriptor(void *arg, AVIOContext *pb, int tag, int
|
|||||||
case 0x3302:
|
case 0x3302:
|
||||||
descriptor->horiz_subsampling = avio_rb32(pb);
|
descriptor->horiz_subsampling = avio_rb32(pb);
|
||||||
break;
|
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:
|
case 0x3308:
|
||||||
descriptor->vert_subsampling = avio_rb32(pb);
|
descriptor->vert_subsampling = avio_rb32(pb);
|
||||||
break;
|
break;
|
||||||
@@ -2157,6 +2169,30 @@ static int mxf_add_metadata_stream(MXFContext *mxf, MXFTrack *track)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static enum AVColorRange mxf_get_color_range(MXFContext *mxf, MXFDescriptor *descriptor)
|
||||||
|
{
|
||||||
|
if (descriptor->black_ref_level || descriptor->white_ref_level || descriptor->color_range) {
|
||||||
|
/* CDCI range metadata */
|
||||||
|
if (!descriptor->component_depth)
|
||||||
|
return AVCOL_RANGE_UNSPECIFIED;
|
||||||
|
if (descriptor->black_ref_level == 0 &&
|
||||||
|
descriptor->white_ref_level == ((1<<descriptor->component_depth) - 1) &&
|
||||||
|
(descriptor->color_range == (1<<descriptor->component_depth) ||
|
||||||
|
descriptor->color_range == ((1<<descriptor->component_depth) - 1)))
|
||||||
|
return AVCOL_RANGE_JPEG;
|
||||||
|
if (descriptor->component_depth >= 8 &&
|
||||||
|
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))
|
||||||
|
return AVCOL_RANGE_MPEG;
|
||||||
|
avpriv_request_sample(mxf->fc, "Unrecognized CDCI color range (color diff range %d, b %d, w %d, depth %d)",
|
||||||
|
descriptor->color_range, descriptor->black_ref_level,
|
||||||
|
descriptor->white_ref_level, descriptor->component_depth);
|
||||||
|
}
|
||||||
|
|
||||||
|
return AVCOL_RANGE_UNSPECIFIED;
|
||||||
|
}
|
||||||
|
|
||||||
static int mxf_parse_structural_metadata(MXFContext *mxf)
|
static int mxf_parse_structural_metadata(MXFContext *mxf)
|
||||||
{
|
{
|
||||||
MXFPackage *material_package = NULL;
|
MXFPackage *material_package = NULL;
|
||||||
@@ -2492,6 +2528,7 @@ static int mxf_parse_structural_metadata(MXFContext *mxf)
|
|||||||
}
|
}
|
||||||
if (descriptor->aspect_ratio.num && descriptor->aspect_ratio.den)
|
if (descriptor->aspect_ratio.num && descriptor->aspect_ratio.den)
|
||||||
st->display_aspect_ratio = descriptor->aspect_ratio;
|
st->display_aspect_ratio = descriptor->aspect_ratio;
|
||||||
|
st->codecpar->color_range = mxf_get_color_range(mxf, descriptor);
|
||||||
st->codecpar->color_primaries = mxf_get_codec_ul(ff_mxf_color_primaries_uls, &descriptor->color_primaries_ul)->id;
|
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_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;
|
st->codecpar->color_space = mxf_get_codec_ul(ff_mxf_color_space_uls, &descriptor->color_space_ul)->id;
|
||||||
|
@@ -124,7 +124,7 @@ sample_aspect_ratio=1:1
|
|||||||
display_aspect_ratio=4:3
|
display_aspect_ratio=4:3
|
||||||
pix_fmt=yuv422p
|
pix_fmt=yuv422p
|
||||||
level=-99
|
level=-99
|
||||||
color_range=unknown
|
color_range=tv
|
||||||
color_space=bt709
|
color_space=bt709
|
||||||
color_transfer=bt709
|
color_transfer=bt709
|
||||||
color_primaries=bt709
|
color_primaries=bt709
|
||||||
|
@@ -16,7 +16,7 @@ sample_aspect_ratio=16:15
|
|||||||
display_aspect_ratio=4:3
|
display_aspect_ratio=4:3
|
||||||
pix_fmt=yuv420p
|
pix_fmt=yuv420p
|
||||||
level=-99
|
level=-99
|
||||||
color_range=unknown
|
color_range=tv
|
||||||
color_space=unknown
|
color_space=unknown
|
||||||
color_transfer=bt470m
|
color_transfer=bt470m
|
||||||
color_primaries=unknown
|
color_primaries=unknown
|
||||||
|
Reference in New Issue
Block a user