Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
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".

  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