aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2012-01-02 09:22:41 +0100
committerAnton Khirnov <anton@khirnov.net>2012-01-17 09:39:32 +0100
commit999328479305e317d9fdaeae791a60d299986073 (patch)
treeb4b68d23f18d959c3855cadc705f2f0ac2f988f4
parent9e12002f114d7e0b0ef69519518cdc0391e5e198 (diff)
downloadffmpeg-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.c20
1 files changed, 19 insertions, 1 deletions
diff --git a/avconv.c b/avconv.c
index 2246851301..e2cc4b0381 100644
--- a/avconv.c
+++ b/avconv.c
@@ -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++;
}
}