On Wed, Oct 28, 2015 at 12:58:53PM +0100, Michael Niedermayer wrote:
> On Wed, Oct 28, 2015 at 02:57:14AM +0100, Michael Niedermayer wrote:
> > On Tue, Oct 27, 2015 at 11:15:29PM +0100, Matthieu Bouron wrote:
> > > 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
> > 
> > >  mjpegdec.c |   26 ++++++++++++++++++++++++++
> > >  1 file changed, 26 insertions(+)
> > > 36d41f1bded2f864394843c6a49d8cc24933688c  
> > > 0002-lavc-mjpegdec-honor-skip_frame-option.patch
> > > 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;
> > > +            }
> 
> i think this would be simpler and shorter if implemented as a
> switch(start_code)/case
> 

Patch updated using a switch/case to implement the skip logic.

[...]
>From cb09375d6cf5051ce51e43a2787f0242bd6450bc 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 | 25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)

diff --git a/libavcodec/mjpegdec.c b/libavcodec/mjpegdec.c
index 1a86b7b..e17b213 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) {
+            switch(start_code) {
+            case SOF0:
+            case SOF1:
+            case SOF2:
+            case SOF3:
+            case SOF48:
+            case SOI:
+            case SOS:
+            case EOI:
+                break;
+            default:
+                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_no_picture;
+            }
             if ((ret = av_frame_ref(frame, s->picture_ptr)) < 0)
                 return ret;
             *got_frame = 1;
@@ -2126,6 +2146,9 @@ eoi_parser:
             goto the_end;
         case SOS:
             s->cur_scan++;
+            if (avctx->skip_frame == AVDISCARD_ALL)
+                break;
+
             if ((ret = ff_mjpeg_decode_sos(s, NULL, 0, NULL)) < 0 &&
                 (avctx->err_recognition & AV_EF_EXPLODE))
                 goto fail;
@@ -2148,6 +2171,7 @@ eoi_parser:
             break;
         }
 
+skip:
         /* eof process start code */
         buf_ptr += (get_bits_count(&s->gb) + 7) / 8;
         av_log(avctx, AV_LOG_DEBUG,
@@ -2344,6 +2368,7 @@ the_end:
     av_dict_copy(avpriv_frame_get_metadatap(data), s->exif_metadata, 0);
     av_dict_free(&s->exif_metadata);
 
+the_end_no_picture:
     av_log(avctx, AV_LOG_DEBUG, "decode frame unused %"PTRDIFF_SPECIFIER" bytes\n",
            buf_end - buf_ptr);
 //  return buf_end - buf_ptr;
-- 
2.6.2

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

Reply via email to