From: Gabriel Hege <g+ffmpeg@hege.cc> To: ffmpeg-devel@ffmpeg.org Subject: [FFmpeg-devel] [PATCH] avformat/movenc: fix VVC encoding with leading pictures Date: Fri, 16 May 2025 13:05:01 +0200 Message-ID: <1aff505d-06f0-4773-9b25-747e3fca21a8@hege.cc> (raw) [-- Attachment #1: Type: text/plain, Size: 1431 bytes --] This is a resubmission with a corrected commit message. The default behavior for VVenC (since v1.10.0) is to create an IDR with leading pictures for the first picture in decoding order (POC 32). This leads to FFmpeg generating an edit list with an empty entry, skipping the leading pictures. This patch fixes the calculation for the start_pts, while the DTS is negative (as produced by libvvenc). How to reproduce the issue (needs --enable-libvvenc and a recent libvvenc, e.g. v1.13): Encode VVC directly into MP4 container: ./ffmpeg -i /data/YUV/foreman_352x288_30Hz_i420_8.y4m -an -preset faster -vcodec vvc test.mp4 -> encodes 300 frames. Decode to YUV (or play back using ffplay): ./ffmpeg -i test.mp4 test.yuv -> outputs 271 frames When dumping the mp4-structure using 'MP4Box -diso test.mp4', I see the following EditListBox, which skips the first couple of frames:<EditListBox Size="40" Type="elst" Version="0" Flags="0" Specification="p12" Container="edts" EntryCount="2"> <EditListEntry Duration="1033" MediaTime="-1" MediaRate="1"/> <EditListEntry Duration="8967" MediaTime="18432" MediaRate="1"/> </EditListBox> With the fix applied 300 frames are decoded as expected and the EditListBox looks like this: <EditListBox Size="28" Type="elst" Version="0" Flags="0" Specification="p12" Container="edts" EntryCount="1"> <EditListEntry Duration="10000" MediaTime="2560" MediaRate="1"/> </EditListBox> [-- Attachment #2: 0001-avformat-movenc-fix-VVC-encoding-with-leading-pictur.patch --] [-- Type: text/x-patch, Size: 1852 bytes --] From d241417038ef78c1d2eb6c38e515a5153082a65f Mon Sep 17 00:00:00 2001 From: Gabriel Hege <g+ffmpeg@hege.cc> Date: Wed, 16 Apr 2025 13:51:06 +0200 Subject: [PATCH] avformat/movenc: fix VVC encoding with leading pictures The default behavior for VVenC (since v1.10.0) is to create an IDR with leading pictures for the first picture in decoding order (POC 32). This leads to FFmpeg generating an edit list with an empty entry, skipping the leading pictures. This patch fixes the calculation for the start_pts, while the DTS is negative (as produced by vvenc). Signed-off-by: Gabriel Hege <g+ffmpeg@hege.cc> --- libavformat/movenc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libavformat/movenc.c b/libavformat/movenc.c index 4bc8bd1b2a..305f920022 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -3966,7 +3966,7 @@ static int mov_write_edts_tag(AVIOContext *pb, MOVMuxContext *mov, int flags = 0; if (track->entry) { - if (start_dts != track->cluster[0].dts || start_ct != track->cluster[0].cts) { + if (start_dts != track->cluster[0].dts || (start_ct != track->cluster[0].cts && track->cluster[0].dts >= 0)) { av_log(mov->fc, AV_LOG_DEBUG, "EDTS using dts:%"PRId64" cts:%d instead of dts:%"PRId64" cts:%"PRId64" tid:%d\n", @@ -6928,7 +6928,7 @@ int ff_mov_write_packet(AVFormatContext *s, AVPacket *pkt) trk->flags |= MOV_TRACK_CTTS; trk->cluster[trk->entry].cts = pkt->pts - pkt->dts; trk->cluster[trk->entry].flags = 0; - if (trk->start_cts == AV_NOPTS_VALUE) + if (trk->start_cts == AV_NOPTS_VALUE || (pkt->dts <= 0 && trk->start_cts > pkt->pts - pkt->dts)) trk->start_cts = pkt->pts - pkt->dts; if (trk->end_pts == AV_NOPTS_VALUE) trk->end_pts = trk->cluster[trk->entry].dts + -- 2.43.0 [-- Attachment #3: Type: text/plain, Size: 251 bytes --] _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
next reply other threads:[~2025-05-16 11:05 UTC|newest] Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top 2025-05-16 11:05 Gabriel Hege [this message] 2025-05-17 2:26 ` Nuo Mi 2025-05-22 8:34 ` Gabriel Hege 2025-05-25 2:08 ` Nuo Mi 2025-05-27 14:52 ` Gabriel Hege 2025-05-31 1:51 ` Nuo Mi
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=1aff505d-06f0-4773-9b25-747e3fca21a8@hege.cc \ --to=g+ffmpeg@hege.cc \ --cc=ffmpeg-devel@ffmpeg.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel This inbox may be cloned and mirrored by anyone: git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \ ffmpegdev@gitmailbox.com public-inbox-index ffmpegdev Example config snippet for mirrors. AGPL code for this site: git clone https://public-inbox.org/public-inbox.git