From 56304b850d2de207d327034e265e5f631ccad0c6 Mon Sep 17 00:00:00 2001 From: James Almer Date: Sat, 15 Jun 2024 15:35:52 -0300 Subject: avformat/movenc: add support for writing lhvC boxes Signed-off-by: James Almer --- libavformat/movenc.c | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/libavformat/movenc.c b/libavformat/movenc.c index a6d6e00cde..2030539d68 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -1556,6 +1556,26 @@ static int mov_write_hvcc_tag(AVIOContext *pb, MOVTrack *track) return update_size(pb, pos); } +static int mov_write_lhvc_tag(AVIOContext *pb, MOVTrack *track) +{ + int64_t pos = avio_tell(pb); + int ret; + + avio_wb32(pb, 0); + ffio_wfourcc(pb, "lhvC"); + if (track->tag == MKTAG('h','v','c','1')) + ret = ff_isom_write_lhvc(pb, track->vos_data, track->vos_len, 1); + else + ret = ff_isom_write_lhvc(pb, track->vos_data, track->vos_len, 0); + + if (ret < 0) { + avio_seek(pb, pos, SEEK_SET); + return ret; + } + + return update_size(pb, pos); +} + static int mov_write_evcc_tag(AVIOContext *pb, MOVTrack *track) { int64_t pos = avio_tell(pb); @@ -2522,9 +2542,14 @@ static int mov_write_video_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContex } else if (track->par->codec_id == AV_CODEC_ID_DNXHD) { mov_write_avid_tag(pb, track); avid = 1; - } else if (track->par->codec_id == AV_CODEC_ID_HEVC) + } else if (track->par->codec_id == AV_CODEC_ID_HEVC) { mov_write_hvcc_tag(pb, track); - else if (track->par->codec_id == AV_CODEC_ID_VVC) + if (track->st->disposition & AV_DISPOSITION_MULTILAYER) { + ret = mov_write_lhvc_tag(pb, track); + if (ret < 0) + av_log(mov->fc, AV_LOG_WARNING, "Not writing 'lhvC' atom for multilayer stream.\n"); + } + } else if (track->par->codec_id == AV_CODEC_ID_VVC) mov_write_vvcc_tag(pb, track); else if (track->par->codec_id == AV_CODEC_ID_H264 && !TAG_IS_AVCI(track->tag)) { mov_write_avcc_tag(pb, track); -- cgit v1.2.3