Merge commit 'ee6ca11b657515ad736ec0d2b8635e098d0a2680'
authorMichael Niedermayer <michaelni@gmx.at>
Wed, 13 Feb 2013 11:42:14 +0000 (12:42 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Wed, 13 Feb 2013 11:42:14 +0000 (12:42 +0100)
* commit 'ee6ca11b657515ad736ec0d2b8635e098d0a2680':
  vorbis: decode directly to the user-provided AVFrame
  vmdaudio: decode directly to the user-provided AVFrame
  twinvq: decode directly to the user-provided AVFrame
  tta: decode directly to the user-provided AVFrame
  truespeech: decode directly to the user-provided AVFrame

Conflicts:
libavcodec/tta.c
libavcodec/twinvq.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavcodec/truespeech.c
libavcodec/tta.c
libavcodec/twinvq.c
libavcodec/vmdav.c
libavcodec/vorbisdec.c

Simple merge
@@@ -59,9 -57,7 +59,8 @@@ typedef struct TTAChannel 
  } TTAChannel;
  
  typedef struct TTAContext {
 +    AVClass *class;
      AVCodecContext *avctx;
-     AVFrame frame;
      GetBitContext gb;
      const AVCRC *crc_table;
  
@@@ -309,12 -299,9 +308,9 @@@ static av_cold int tta_decode_init(AVCo
          }
      } else {
          av_log(avctx, AV_LOG_ERROR, "Wrong extradata present\n");
 -        return -1;
 +        return AVERROR_INVALIDDATA;
      }
  
-     avcodec_get_frame_defaults(&s->frame);
-     avctx->coded_frame = &s->frame;
      return 0;
  }
  
@@@ -447,32 -435,20 +444,31 @@@ static int tta_decode_frame(AVCodecCont
      skip_bits_long(&s->gb, 32); // frame crc
  
      // convert to output buffer
 -    if (s->bps == 2) {
 +    switch (s->bps) {
 +    case 1: {
-         uint8_t *samples = (uint8_t *)s->frame.data[0];
++        uint8_t *samples = (uint8_t *)frame->data[0];
 +        for (p = s->decode_buffer; p < s->decode_buffer + (framelen * s->channels); p++)
 +            *samples++ = *p + 0x80;
 +        break;
 +        }
 +    case 2: {
-         int16_t *samples = (int16_t *)s->frame.data[0];
+         int16_t *samples = (int16_t *)frame->data[0];
          for (p = s->decode_buffer; p < s->decode_buffer + (framelen * s->channels); p++)
              *samples++ = *p;
 -    } else {
 +        break;
 +        }
 +    case 3: {
          // shift samples for 24-bit sample format
-         int32_t *samples = (int32_t *)s->frame.data[0];
+         int32_t *samples = (int32_t *)frame->data[0];
 -        for (i = 0; i < framelen * s->channels; i++)
 +        for (p = s->decode_buffer; p < s->decode_buffer + (framelen * s->channels); p++)
              *samples++ <<= 8;
          // reset decode buffer
          s->decode_buffer = NULL;
 +        break;
 +        }
      }
  
-     *got_frame_ptr   = 1;
-     *(AVFrame *)data = s->frame;
+     *got_frame_ptr = 1;
  
      return buf_size;
  error:
Simple merge
Simple merge
@@@ -1659,48 -1646,9 +1656,48 @@@ static int vorbis_decode_frame(AVCodecC
  
      av_dlog(NULL, "packet length %d \n", buf_size);
  
 +    if (*buf == 1 && buf_size > 7) {
 +        init_get_bits(gb, buf+1, buf_size*8 - 8);
 +        vorbis_free(vc);
 +        if ((ret = vorbis_parse_id_hdr(vc))) {
 +            av_log(avccontext, AV_LOG_ERROR, "Id header corrupt.\n");
 +            vorbis_free(vc);
 +            return ret;
 +        }
 +
 +        if (vc->audio_channels > 8)
 +            avccontext->channel_layout = 0;
 +        else
 +            avccontext->channel_layout = ff_vorbis_channel_layouts[vc->audio_channels - 1];
 +
 +        avccontext->channels    = vc->audio_channels;
 +        avccontext->sample_rate = vc->audio_samplerate;
 +        return buf_size;
 +    }
 +
 +    if (*buf == 3 && buf_size > 7) {
 +        av_log(avccontext, AV_LOG_DEBUG, "Ignoring comment header\n");
 +        return buf_size;
 +    }
 +
 +    if (*buf == 5 && buf_size > 7 && vc->channel_residues && !vc->modes) {
 +        init_get_bits(gb, buf+1, buf_size*8 - 8);
 +        if ((ret = vorbis_parse_setup_hdr(vc))) {
 +            av_log(avccontext, AV_LOG_ERROR, "Setup header corrupt.\n");
 +            vorbis_free(vc);
 +            return ret;
 +        }
 +        return buf_size;
 +    }
 +
 +    if (!vc->channel_residues || !vc->modes) {
 +        av_log(avccontext, AV_LOG_ERROR, "Data packet before valid headers\n");
 +        return AVERROR_INVALIDDATA;
 +    }
 +
      /* get output buffer */
-     vc->frame.nb_samples = vc->blocksize[1] / 2;
-     if ((ret = ff_get_buffer(avccontext, &vc->frame)) < 0) {
+     frame->nb_samples = vc->blocksize[1] / 2;
+     if ((ret = ff_get_buffer(avccontext, frame)) < 0) {
          av_log(avccontext, AV_LOG_ERROR, "get_buffer() failed\n");
          return ret;
      }