diff --git a/configure b/configure index 8651e2272e..8c1190f0ae 100755 --- a/configure +++ b/configure @@ -2660,6 +2660,8 @@ msvc_flags(){ -fno-common) ;; -fno-signed-zeros) ;; -fPIC) ;; + -mthumb) ;; + -march=*) ;; -lz) echo zlib.lib ;; -lavifil32) echo vfw32.lib ;; -lavicap32) echo vfw32.lib user32.lib ;; diff --git a/libavcodec/mpeg12dec.c b/libavcodec/mpeg12dec.c index b5ef9663a3..c6861519de 100644 --- a/libavcodec/mpeg12dec.c +++ b/libavcodec/mpeg12dec.c @@ -2121,7 +2121,7 @@ static int decode_chunks(AVCodecContext *avctx, const uint8_t *buf_ptr = buf; const uint8_t *buf_end = buf + buf_size; int ret, input_size; - int last_code = 0; + int last_code = 0, skip_frame = 0; int picture_start_code_seen = 0; for (;;) { @@ -2129,7 +2129,7 @@ static int decode_chunks(AVCodecContext *avctx, uint32_t start_code = -1; buf_ptr = avpriv_find_start_code(buf_ptr, buf_end, &start_code); if (start_code > 0x1ff) { - if (s2->pict_type != AV_PICTURE_TYPE_B || avctx->skip_frame <= AVDISCARD_DEFAULT) { + if (!skip_frame) { if (HAVE_THREADS && (avctx->active_thread_type & FF_THREAD_SLICE)) { int i; av_assert0(avctx->thread_count > 1); @@ -2316,20 +2316,27 @@ static int decode_chunks(AVCodecContext *avctx, if (s2->last_picture_ptr == NULL) { /* Skip B-frames if we do not have reference frames and gop is not closed */ if (s2->pict_type == AV_PICTURE_TYPE_B) { - if (!s2->closed_gop) + if (!s2->closed_gop) { + skip_frame = 1; break; + } } } if (s2->pict_type == AV_PICTURE_TYPE_I || (s2->flags2 & CODEC_FLAG2_SHOW_ALL)) s->sync=1; if (s2->next_picture_ptr == NULL) { /* Skip P-frames if we do not have a reference frame or we have an invalid header. */ - if (s2->pict_type == AV_PICTURE_TYPE_P && !s->sync) break; + if (s2->pict_type == AV_PICTURE_TYPE_P && !s->sync) { + skip_frame = 1; + break; + } } if ((avctx->skip_frame >= AVDISCARD_NONREF && s2->pict_type == AV_PICTURE_TYPE_B) || (avctx->skip_frame >= AVDISCARD_NONKEY && s2->pict_type != AV_PICTURE_TYPE_I) || - avctx->skip_frame >= AVDISCARD_ALL) + avctx->skip_frame >= AVDISCARD_ALL) { + skip_frame = 1; break; + } if (!s->mpeg_enc_ctx_allocated) break; @@ -2347,6 +2354,7 @@ static int decode_chunks(AVCodecContext *avctx, } if (s2->first_slice) { + skip_frame = 0; s2->first_slice = 0; if (mpeg_field_start(s2, buf, buf_size) < 0) return -1;