From: James Almer <jamrial@gmail.com>
To: ffmpeg-devel@ffmpeg.org
Subject: Re: [FFmpeg-devel] [PATCH 5/5] avcodec/mpeg4videodec: duplicate the last decoded frame when the last coded frame was skipped
Date: Tue, 6 Dec 2022 08:21:11 -0300
Message-ID: <28be1785-a2f0-a1a1-db86-17321fa3786d@gmail.com> (raw)
In-Reply-To: <GV1P250MB0737F2EB218D18543D0115B58F1B9@GV1P250MB0737.EURP250.PROD.OUTLOOK.COM>
On 12/6/2022 6:17 AM, Andreas Rheinhardt wrote:
> James Almer:
>> This ensures the video stream duration is not lost after decoding.
>>
>> Signed-off-by: James Almer <jamrial@gmail.com>
>> ---
>> libavcodec/h263dec.c | 13 +++++++++++++
>> libavcodec/mpegvideo.h | 1 +
>> 2 files changed, 14 insertions(+)
>>
>> diff --git a/libavcodec/h263dec.c b/libavcodec/h263dec.c
>> index ac7a8521e5..0a2d7487a8 100644
>> --- a/libavcodec/h263dec.c
>> +++ b/libavcodec/h263dec.c
>> @@ -430,6 +430,18 @@ int ff_h263_decode_frame(AVCodecContext *avctx, AVFrame *pict,
>> return ret;
>> s->next_picture_ptr = NULL;
>>
>> + *got_frame = 1;
>> + } else if (s->skipped_last_frame && s->current_picture_ptr) {
>> + /* Output the last picture we decoded again if the stream ended with
>> + * an NVOP */
>> + if ((ret = av_frame_ref(pict, s->current_picture_ptr->f)) < 0)
>> + return ret;
>> + /* Copy props from the last input packet. Otherwise, props from the last
>> + * returned picture would be reused */
>> + if ((ret = ff_decode_frame_props(avctx, pict)) < 0)
>> + return ret;
>> + s->current_picture_ptr = NULL;
>> +
>> *got_frame = 1;
>> }
>>
>> @@ -500,6 +512,7 @@ retry:
>> s->extradata_parsed = 1;
>> }
>> ret = ff_mpeg4_decode_picture_header(avctx->priv_data, &s->gb, 0, 0);
>> + s->skipped_last_frame = (ret == FRAME_SKIPPED);
>> } else if (CONFIG_H263I_DECODER && s->codec_id == AV_CODEC_ID_H263I) {
>> ret = ff_intel_h263_decode_picture_header(s);
>> } else if (CONFIG_FLV_DECODER && s->h263_flv) {
>> diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h
>> index 6440b906b1..42275953b9 100644
>> --- a/libavcodec/mpegvideo.h
>> +++ b/libavcodec/mpegvideo.h
>> @@ -175,6 +175,7 @@ typedef struct MpegEncContext {
>> Picture *last_picture_ptr; ///< pointer to the previous picture.
>> Picture *next_picture_ptr; ///< pointer to the next picture (for bidir pred)
>> Picture *current_picture_ptr; ///< pointer to the current picture
>> + int skipped_last_frame;
>> int last_dc[3]; ///< last DC values for MPEG-1
>> int16_t *dc_val_base;
>> int16_t *dc_val[3]; ///< used for MPEG-4 DC prediction, all 3 arrays must be continuous
>
> Can you give an example where this matters? And what does the spec say
> about this? Is "output the last frame again" really the appropriate
> response upon encountering a NVOP?
>
The reference decoder returns a frame for every packet, nvop or
otherwise. If nvop, it will be the last decoded frame. Doing that here
was rejected some years ago as it would make the decoder unconditionally
cfr, and that's undesired.
Say you have a video stream that's 6 minutes and 30 seconds long, where
the last thirty seconds worth of packets are NVOPs. The decoder will
consume them and generate nothing, as expected, but then at EOF the last
returned frame was that with a pts at the 6 minutes mark, resulting in
the decoded stream being 6 minutes, and as such stream length
information is lost.
By returning the last frame again at the end with the last input
packet's pts, you will get the correct stream length with no difference
in video output while remaining vfr.
_______________________________________________
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 prev parent reply other threads:[~2022-12-06 11:21 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-12-04 21:52 [FFmpeg-devel] [PATCH 1/5] avcodec/binkaudio: clear pts when returning more than one frame per input packet James Almer
2022-12-04 21:52 ` [FFmpeg-devel] [PATCH 2/5] Revert "avcodec/decode: use a packet list to store packet properties" James Almer
2022-12-05 21:26 ` Michael Niedermayer
2022-12-06 0:03 ` [FFmpeg-devel] [PATCH 2/6] avcodec/wmadec: clear pts when returning a frame during flush James Almer
2022-12-06 8:27 ` Paul B Mahol
2022-12-06 11:42 ` James Almer
2022-12-04 21:52 ` [FFmpeg-devel] [PATCH 3/5] avcodec/decode: don't set last_pkt_props->size James Almer
2022-12-04 21:52 ` [FFmpeg-devel] [PATCH 4/5] avcodec/pthread_frame.c: keep the last_pkt_props from worker threads in sync with the user context James Almer
2022-12-04 21:52 ` [FFmpeg-devel] [PATCH 5/5] avcodec/mpeg4videodec: duplicate the last decoded frame when the last coded frame was skipped James Almer
2022-12-06 9:17 ` Andreas Rheinhardt
2022-12-06 11:21 ` James Almer [this message]
2022-12-12 11:37 ` James Almer
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=28be1785-a2f0-a1a1-db86-17321fa3786d@gmail.com \
--to=jamrial@gmail.com \
--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