Merge remote-tracking branch 'qatar/master'
authorMichael Niedermayer <michaelni@gmx.at>
Tue, 28 May 2013 09:58:46 +0000 (11:58 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Tue, 28 May 2013 09:58:46 +0000 (11:58 +0200)
* qatar/master:
  smacker: assign video frame PTS
  matroskadec: export full wavpack blocks.

Conflicts:
libavcodec/wavpack.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavcodec/wavpack.c
libavformat/matroskadec.c
libavformat/smacker.c

@@@ -1165,15 -1138,9 +1149,9 @@@ static int wavpack_decode_frame(AVCodec
      s->ch_offset = 0;
  
      /* determine number of samples */
-     if (s->mkv_mode) {
-         s->samples  = AV_RL32(buf);
-         buf        += 4;
-         frame_flags = AV_RL32(buf);
-     } else {
-         s->samples  = AV_RL32(buf + 20);
-         frame_flags = AV_RL32(buf + 24);
-     }
+     s->samples  = AV_RL32(buf + 20);
+     frame_flags = AV_RL32(buf + 24);
 -    if (s->samples <= 0) {
 +    if (s->samples <= 0 || s->samples > WV_MAX_SAMPLES) {
          av_log(avctx, AV_LOG_ERROR, "Invalid number of samples: %d\n",
                 s->samples);
          return AVERROR_INVALIDDATA;
      }
  
      /* get output buffer */
 -    frame->nb_samples = s->samples;
 -    if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) {
 -        av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
 +    frame->nb_samples = s->samples + 1;
 +    if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
          return ret;
 -    }
 +    frame->nb_samples = s->samples;
  
      while (buf_size > 0) {
-         if (!s->mkv_mode) {
-             if (buf_size <= WV_HEADER_SIZE)
-                 break;
-             frame_size = AV_RL32(buf + 4) - 12;
-             buf       += 20;
-             buf_size  -= 20;
-         } else {
-             if (buf_size < 12) // MKV files can have zero flags after last block
-                 break;
-             frame_size = AV_RL32(buf + 8) + 12;
-         }
+         if (buf_size <= WV_HEADER_SIZE)
+             break;
+         frame_size = AV_RL32(buf + 4) - 12;
+         buf       += 20;
+         buf_size  -= 20;
          if (frame_size <= 0 || frame_size > buf_size) {
              av_log(avctx, AV_LOG_ERROR,
                     "Block %d has invalid size (size %d vs. %d bytes left)\n",
@@@ -2243,12 -2088,12 +2337,16 @@@ static int matroska_parse_frame(Matrosk
          dynarray_add(&matroska->packets,&matroska->num_packets,pkt);
          matroska->prev_pkt = pkt;
      }
 +#else
 +    dynarray_add(&matroska->packets, &matroska->num_packets, pkt);
 +    matroska->prev_pkt = pkt;
 +#endif
  
      return 0;
+ fail:
+     if (pkt_data != data)
+         av_freep(&pkt_data);
+     return res;
  }
  
  static int matroska_parse_block(MatroskaDemuxContext *matroska, uint8_t *data,
Simple merge