On Sun, Oct 18, 2015 at 11:06:50AM +0200, Matthieu Bouron wrote:
[...]
> 
> Patch updated, the markers are now properly skipped (which also fixes a
> crash).

Patch updated. It fixes an issue with mjpeg streams (and in particular with
the fate sample ffmpeg-issue-897.avi) due to the EOI marker not handled when
skip_frame is set to AVDISCARD_ALL.

Matthieu
>From 7325810d812c4182cd42946687a1f4abc04999d1 Mon Sep 17 00:00:00 2001
From: Matthieu Bouron <matthieu.bou...@stupeflix.com>
Date: Fri, 9 Oct 2015 15:15:15 +0200
Subject: [PATCH 2/3] lavc/mjpegdec: honor skip_frame option

---
 libavcodec/mjpegdec.c | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/libavcodec/mjpegdec.c b/libavcodec/mjpegdec.c
index 1a86b7b..b4ff83c 100644
--- a/libavcodec/mjpegdec.c
+++ b/libavcodec/mjpegdec.c
@@ -2038,6 +2038,22 @@ int ff_mjpeg_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
             return AVERROR(ENOSYS);
         }
 
+        if (avctx->skip_frame == AVDISCARD_ALL) {
+            int i, found = 0;
+            static const int start_codes[] = { SOF0,
+                SOF1, SOF2, SOF3, SOF48, SOI, EOI };
+
+            for (i = 0; i < FF_ARRAY_ELEMS(start_codes); i++) {
+                if (start_code == start_codes[i]) {
+                    found = 1;
+                    break;
+                }
+            }
+            if (!found) {
+                goto skip;
+            }
+        }
+
         switch (start_code) {
         case SOI:
             s->restart_interval = 0;
@@ -2103,6 +2119,10 @@ eoi_parser:
                 if (s->bottom_field == !s->interlace_polarity)
                     break;
             }
+            if (avctx->skip_frame == AVDISCARD_ALL) {
+                s->got_picture = 0;
+                goto the_end;
+            }
             if ((ret = av_frame_ref(frame, s->picture_ptr)) < 0)
                 return ret;
             *got_frame = 1;
@@ -2148,6 +2168,7 @@ eoi_parser:
             break;
         }
 
+skip:
         /* eof process start code */
         buf_ptr += (get_bits_count(&s->gb) + 7) / 8;
         av_log(avctx, AV_LOG_DEBUG,
@@ -2158,6 +2179,11 @@ eoi_parser:
         av_log(avctx, AV_LOG_WARNING, "EOI missing, emulating\n");
         goto eoi_parser;
     }
+
+    if (avctx->skip_frame == AVDISCARD_ALL) {
+        return buf_ptr - buf;
+    }
+
     av_log(avctx, AV_LOG_FATAL, "No JPEG data found in image\n");
     return AVERROR_INVALIDDATA;
 fail:
-- 
2.6.2

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Reply via email to