]> git.sesse.net Git - ffmpeg/commitdiff
Merge commit 'd9a2e87b1ce44cce23801e7ec6810f8bf994fa23'
authorMichael Niedermayer <michaelni@gmx.at>
Sun, 30 Sep 2012 12:10:25 +0000 (14:10 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Sun, 30 Sep 2012 12:10:25 +0000 (14:10 +0200)
* commit 'd9a2e87b1ce44cce23801e7ec6810f8bf994fa23':
  mpeg12: move mpeg_decode_frame() lower
  avsdec: Set dimensions instead of relying on the demuxer.
  wmalosslessdec: Reset put bit buffer when num_saved_bits is reset.

Conflicts:
libavcodec/avs.c
libavcodec/mpeg12.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavcodec/mpeg12.c
libavcodec/wmalosslessdec.c

index 1e7ff9cf6fb0b9504a5a7eb3725942484eada2f2,035ee5661d8f1b52db969f7611c505aa3a205bea..2cf65e11c9ee443342e1d8c4abbe5cccb47cc3f9
@@@ -2564,6 -2416,50 +2508,58 @@@ static int decode_chunks(AVCodecContex
      }
  }
  
 -    if (s->mpeg_enc_ctx_allocated == 0 && avctx->codec_tag == AV_RL32("VCR2"))
+ static int mpeg_decode_frame(AVCodecContext *avctx,
+                              void *data, int *data_size,
+                              AVPacket *avpkt)
+ {
+     const uint8_t *buf = avpkt->data;
+     int buf_size = avpkt->size;
+     Mpeg1Context *s = avctx->priv_data;
+     AVFrame *picture = data;
+     MpegEncContext *s2 = &s->mpeg_enc_ctx;
+     av_dlog(avctx, "fill_buffer\n");
+     if (buf_size == 0 || (buf_size == 4 && AV_RB32(buf) == SEQ_END_CODE)) {
+         /* special case for last picture */
+         if (s2->low_delay == 0 && s2->next_picture_ptr) {
+             *picture = s2->next_picture_ptr->f;
+             s2->next_picture_ptr = NULL;
+             *data_size = sizeof(AVFrame);
+         }
+         return buf_size;
+     }
+     if (s2->flags & CODEC_FLAG_TRUNCATED) {
+         int next = ff_mpeg1_find_frame_end(&s2->parse_context, buf, buf_size, NULL);
+         if (ff_combine_frame(&s2->parse_context, next, (const uint8_t **)&buf, &buf_size) < 0)
+             return buf_size;
+     }
 -    if (avctx->extradata && !avctx->frame_number) {
++    s2->codec_tag = avpriv_toupper4(avctx->codec_tag);
++    if (s->mpeg_enc_ctx_allocated == 0 && (   s2->codec_tag == AV_RL32("VCR2")
++                                           || s2->codec_tag == AV_RL32("BW10")
++                                          ))
+         vcr2_init_sequence(avctx);
+     s->slice_count = 0;
++    if (avctx->extradata && !s->parsed_extra) {
+         int ret = decode_chunks(avctx, picture, data_size, avctx->extradata, avctx->extradata_size);
++        if(*data_size) {
++            av_log(avctx, AV_LOG_ERROR, "picture in extradata\n");
++            *data_size = 0;
++        }
++        s->parsed_extra = 1;
+         if (ret < 0 && (avctx->err_recognition & AV_EF_EXPLODE))
+             return ret;
+     }
+     return decode_chunks(avctx, picture, data_size, buf, buf_size);
+ }
  static void flush(AVCodecContext *avctx)
  {
      Mpeg1Context *s = avctx->priv_data;
Simple merge