* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
-#include "libavutil/audioconvert.h"
+#include "libavutil/channel_layout.h"
#include "libavutil/float_dsp.h"
#include "avcodec.h"
#include "get_bits.h"
-#include "dsputil.h"
#include "fft.h"
+#include "internal.h"
#include "lsp.h"
#include "sinewin.h"
typedef struct TwinContext {
AVCodecContext *avctx;
- AVFrame frame;
- DSPContext dsp;
AVFloatDSPContext fdsp;
FFTContext mdct_ctx[3];
mdct->imdct_half(mdct, buf1 + bsize*j, in + bsize*j);
- tctx->dsp.vector_fmul_window(out2,
- prev_buf + (bsize-wsize)/2,
- buf1 + bsize*j,
- ff_sine_windows[av_log2(wsize)],
- wsize/2);
+ tctx->fdsp.vector_fmul_window(out2, prev_buf + (bsize-wsize) / 2,
+ buf1 + bsize * j,
+ ff_sine_windows[av_log2(wsize)],
+ wsize / 2);
out2 += wsize;
memcpy(out2, buf1 + bsize*j + wsize/2, (bsize - wsize/2)*sizeof(float));
if (tctx->avctx->channels == 2) {
memcpy(&out[1][0], &prev_buf[2*mtab->size], size1 * sizeof(out[1][0]));
memcpy(&out[1][size1], &tctx->curr_frame[2*mtab->size], size2 * sizeof(out[1][0]));
- tctx->dsp.butterflies_float(out[0], out[1], mtab->size);
+ tctx->fdsp.butterflies_float(out[0], out[1], mtab->size);
}
}
static int twin_decode_frame(AVCodecContext * avctx, void *data,
int *got_frame_ptr, AVPacket *avpkt)
{
+ AVFrame *frame = data;
const uint8_t *buf = avpkt->data;
int buf_size = avpkt->size;
TwinContext *tctx = avctx->priv_data;
/* get output buffer */
if (tctx->discarded_packets >= 2) {
- tctx->frame.nb_samples = mtab->size;
- if ((ret = avctx->get_buffer(avctx, &tctx->frame)) < 0) {
+ frame->nb_samples = mtab->size;
+ if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) {
av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
return ret;
}
- out = (float **)tctx->frame.extended_data;
+ out = (float **)frame->extended_data;
}
init_get_bits(&gb, buf, buf_size * 8);
return buf_size;
}
- *got_frame_ptr = 1;
- *(AVFrame *)data = tctx->frame;;
+ *got_frame_ptr = 1;
return buf_size;
}
avctx->channels = AV_RB32(avctx->extradata ) + 1;
avctx->bit_rate = AV_RB32(avctx->extradata + 4) * 1000;
isampf = AV_RB32(avctx->extradata + 8);
+
+ if (isampf < 8 || isampf > 44) {
+ av_log(avctx, AV_LOG_ERROR, "Unsupported sample rate\n");
+ return AVERROR_INVALIDDATA;
+ }
switch (isampf) {
case 44: avctx->sample_rate = 44100; break;
case 22: avctx->sample_rate = 22050; break;
return -1;
}
- ff_dsputil_init(&tctx->dsp, avctx);
avpriv_float_dsp_init(&tctx->fdsp, avctx->flags & CODEC_FLAG_BITEXACT);
if ((ret = init_mdct_win(tctx))) {
av_log(avctx, AV_LOG_ERROR, "Error initializing MDCT\n");
memset_float(tctx->bark_hist[0][0], 0.1, FF_ARRAY_ELEMS(tctx->bark_hist));
- avcodec_get_frame_defaults(&tctx->frame);
- avctx->coded_frame = &tctx->frame;
-
return 0;
}