diff options
author | Anton Khirnov <anton@khirnov.net> | 2012-01-02 09:22:41 +0100 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2012-01-17 09:39:32 +0100 |
commit | 999328479305e317d9fdaeae791a60d299986073 (patch) | |
tree | b4b68d23f18d959c3855cadc705f2f0ac2f988f4 | |
parent | 9e12002f114d7e0b0ef69519518cdc0391e5e198 (diff) | |
download | ffmpeg-999328479305e317d9fdaeae791a60d299986073.tar.gz |
avconv: fix -frames for video encoders with delay.
Frames must be counted when they are passed to the encoder, not when
they come out.
Fixes Bug 202.
-rw-r--r-- | avconv.c | 20 |
1 files changed, 19 insertions, 1 deletions
@@ -875,6 +875,19 @@ static void write_frame(AVFormatContext *s, AVPacket *pkt, OutputStream *ost) AVCodecContext *avctx = ost->st->codec; int ret; + /* + * Audio encoders may split the packets -- #frames in != #packets out. + * But there is no reordering, so we can limit the number of output packets + * by simply dropping them here. + * Counting encoded video frames needs to be done separately because of + * reordering, see do_video_out() + */ + if (!(avctx->codec_type == AVMEDIA_TYPE_VIDEO && avctx->codec)) { + if (ost->frame_number >= ost->max_frames) + return; + ost->frame_number++; + } + while (bsfc) { AVPacket new_pkt = *pkt; int a = av_bitstream_filter_filter(bsfc, avctx, NULL, @@ -902,7 +915,6 @@ static void write_frame(AVFormatContext *s, AVPacket *pkt, OutputStream *ost) print_error("av_interleaved_write_frame()", ret); exit_program(1); } - ost->frame_number++; } static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size) @@ -1450,6 +1462,12 @@ static void do_video_out(AVFormatContext *s, } } ost->sync_opts++; + /* + * For video, number of frames in == number of packets out. + * But there may be reordering, so we can't throw away frames on encoder + * flush, we need to limit them here, before they go into encoder. + */ + ost->frame_number++; } } |