|
|
|
@@ -1934,6 +1934,40 @@ static int mov_write_clli_tag(AVIOContext *pb, MOVTrack *track) |
|
|
|
return 12; |
|
|
|
} |
|
|
|
|
|
|
|
static inline int64_t rescale_mdcv(AVRational q, int b) |
|
|
|
{ |
|
|
|
return av_rescale(q.num, b, q.den); |
|
|
|
} |
|
|
|
|
|
|
|
static int mov_write_mdcv_tag(AVIOContext *pb, MOVTrack *track) |
|
|
|
{ |
|
|
|
const int chroma_den = 50000; |
|
|
|
const int luma_den = 10000; |
|
|
|
const uint8_t *side_data; |
|
|
|
const AVMasteringDisplayMetadata *metadata; |
|
|
|
|
|
|
|
side_data = av_stream_get_side_data(track->st, AV_PKT_DATA_MASTERING_DISPLAY_METADATA, NULL); |
|
|
|
metadata = (const AVMasteringDisplayMetadata*)side_data; |
|
|
|
if (!metadata || !metadata->has_primaries || !metadata->has_luminance) { |
|
|
|
av_log(NULL, AV_LOG_VERBOSE, "Not writing 'mdcv' atom. Missing mastering metadata.\n"); |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
avio_wb32(pb, 32); // size |
|
|
|
ffio_wfourcc(pb, "mdcv"); |
|
|
|
avio_wb16(pb, rescale_mdcv(metadata->display_primaries[1][0], chroma_den)); |
|
|
|
avio_wb16(pb, rescale_mdcv(metadata->display_primaries[1][1], chroma_den)); |
|
|
|
avio_wb16(pb, rescale_mdcv(metadata->display_primaries[2][0], chroma_den)); |
|
|
|
avio_wb16(pb, rescale_mdcv(metadata->display_primaries[2][1], chroma_den)); |
|
|
|
avio_wb16(pb, rescale_mdcv(metadata->display_primaries[0][0], chroma_den)); |
|
|
|
avio_wb16(pb, rescale_mdcv(metadata->display_primaries[0][1], chroma_den)); |
|
|
|
avio_wb16(pb, rescale_mdcv(metadata->white_point[0], chroma_den)); |
|
|
|
avio_wb16(pb, rescale_mdcv(metadata->white_point[1], chroma_den)); |
|
|
|
avio_wb32(pb, rescale_mdcv(metadata->max_luminance, luma_den)); |
|
|
|
avio_wb32(pb, rescale_mdcv(metadata->min_luminance, luma_den)); |
|
|
|
return 32; |
|
|
|
} |
|
|
|
|
|
|
|
static void find_compressor(char * compressor_name, int len, MOVTrack *track) |
|
|
|
{ |
|
|
|
AVDictionaryEntry *encoder; |
|
|
|
@@ -2107,8 +2141,10 @@ static int mov_write_video_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContex |
|
|
|
else |
|
|
|
av_log(mov->fc, AV_LOG_WARNING, "Not writing 'colr' atom. Format is not MOV or MP4.\n"); |
|
|
|
} |
|
|
|
if (track->mode == MODE_MOV || track->mode == MODE_MP4) |
|
|
|
if (track->mode == MODE_MOV || track->mode == MODE_MP4) { |
|
|
|
mov_write_clli_tag(pb, track); |
|
|
|
mov_write_mdcv_tag(pb, track); |
|
|
|
} |
|
|
|
|
|
|
|
if (track->mode == MODE_MP4 && mov->fc->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL) { |
|
|
|
AVStereo3D* stereo_3d = (AVStereo3D*) av_stream_get_side_data(track->st, AV_PKT_DATA_STEREO3D, NULL); |
|
|
|
|