aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthieu Bouron <matthieu.bouron@stupeflix.com>2015-10-09 15:15:15 +0200
committerMatthieu Bouron <matthieu.bouron@stupeflix.com>2015-10-29 12:04:11 +0100
commitff0dfb5c361aae841147f9f0ad2f72c45b973da5 (patch)
tree84f176c770f8a78f14a10391d173a198e5e41153
parentcbe2dfa4e51b92b0e291ed71be6fcee595c4201d (diff)
downloadffmpeg-ff0dfb5c361aae841147f9f0ad2f72c45b973da5.tar.gz
lavc/mjpegdec: honor skip_frame option
-rw-r--r--libavcodec/mjpegdec.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/libavcodec/mjpegdec.c b/libavcodec/mjpegdec.c
index 1a86b7bc31..e17b21357f 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;