[FFmpeg-cvslog] ffmpeg: dont exit 0 if fewer than 1/3 of the input could be decoded.
Michael Niedermayer
git at videolan.org
Wed Apr 10 01:46:10 CEST 2013
ffmpeg | branch: master | Michael Niedermayer <michaelni at gmx.at> | Wed Apr 10 01:10:06 2013 +0200| [eedcac68f31ca8d6784bb77ed5c471f04eb2301e] | committer: Michael Niedermayer
ffmpeg: dont exit 0 if fewer than 1/3 of the input could be decoded.
Fixes Ticket2405
Signed-off-by: Michael Niedermayer <michaelni at gmx.at>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=eedcac68f31ca8d6784bb77ed5c471f04eb2301e
---
ffmpeg.c | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/ffmpeg.c b/ffmpeg.c
index effb042..010fa9c 100644
--- a/ffmpeg.c
+++ b/ffmpeg.c
@@ -129,6 +129,7 @@ static int64_t subtitle_size = 0;
static int64_t extra_size = 0;
static int nb_frames_dup = 0;
static int nb_frames_drop = 0;
+static int64_t decode_error_stat[2];
static int current_time;
AVIOContext *progress_avio = NULL;
@@ -1506,6 +1507,9 @@ static int decode_audio(InputStream *ist, AVPacket *pkt, int *got_output)
ret = AVERROR_INVALIDDATA;
}
+ if (*got_output || ret<0 || pkt->size)
+ decode_error_stat[ret<0] ++;
+
if (!*got_output || ret < 0) {
if (!pkt->size) {
for (i = 0; i < ist->nb_filters; i++)
@@ -1640,6 +1644,10 @@ static int decode_video(InputStream *ist, AVPacket *pkt, int *got_output)
ret = avcodec_decode_video2(ist->st->codec,
decoded_frame, got_output, pkt);
update_benchmark("decode_video %d.%d", ist->file_index, ist->st->index);
+
+ if (*got_output || ret<0 || pkt->size)
+ decode_error_stat[ret<0] ++;
+
if (!*got_output || ret < 0) {
if (!pkt->size) {
for (i = 0; i < ist->nb_filters; i++)
@@ -1730,6 +1738,10 @@ static int transcode_subtitles(InputStream *ist, AVPacket *pkt, int *got_output)
AVSubtitle subtitle;
int i, ret = avcodec_decode_subtitle2(ist->st->codec,
&subtitle, got_output, pkt);
+
+ if (*got_output || ret<0 || pkt->size)
+ decode_error_stat[ret<0] ++;
+
if (ret < 0 || !*got_output) {
if (!pkt->size)
sub2video_flush(ist);
@@ -3349,6 +3361,8 @@ int main(int argc, char **argv)
if (do_benchmark) {
printf("bench: utime=%0.3fs\n", ti / 1000000.0);
}
+ if (2*decode_error_stat[0] < decode_error_stat[1])
+ exit(254);
exit(received_nb_signals ? 255 : 0);
return 0;
More information about the ffmpeg-cvslog
mailing list