Commit da227603 authored by Paul B Mahol's avatar Paul B Mahol

vima: generate predict_table once, and share it with all decoders

Signed-off-by: 's avatarPaul B Mahol <onemda@gmail.com>
parent 77570a39
...@@ -25,9 +25,8 @@ ...@@ -25,9 +25,8 @@
#include "internal.h" #include "internal.h"
#include "adpcm_data.h" #include "adpcm_data.h"
typedef struct { static int predict_table_init = 0;
uint16_t predict_table[5786 * 2]; static uint16_t predict_table[5786 * 2];
} VimaContext;
static const uint8_t size_table[] = static const uint8_t size_table[] =
{ {
...@@ -103,8 +102,12 @@ static const int8_t* const step_index_tables[] = ...@@ -103,8 +102,12 @@ static const int8_t* const step_index_tables[] =
static av_cold int decode_init(AVCodecContext *avctx) static av_cold int decode_init(AVCodecContext *avctx)
{ {
VimaContext *vima = avctx->priv_data; int start_pos;
int start_pos;
avctx->sample_fmt = AV_SAMPLE_FMT_S16;
if (predict_table_init)
return 0;
for (start_pos = 0; start_pos < 64; start_pos++) { for (start_pos = 0; start_pos < 64; start_pos++) {
unsigned int dest_pos, table_pos; unsigned int dest_pos, table_pos;
...@@ -120,11 +123,10 @@ static av_cold int decode_init(AVCodecContext *avctx) ...@@ -120,11 +123,10 @@ static av_cold int decode_init(AVCodecContext *avctx)
put += table_value; put += table_value;
table_value >>= 1; table_value >>= 1;
} }
vima->predict_table[dest_pos] = put; predict_table[dest_pos] = put;
} }
} }
predict_table_init = 1;
avctx->sample_fmt = AV_SAMPLE_FMT_S16;
return 0; return 0;
} }
...@@ -133,7 +135,6 @@ static int decode_frame(AVCodecContext *avctx, void *data, ...@@ -133,7 +135,6 @@ static int decode_frame(AVCodecContext *avctx, void *data,
int *got_frame_ptr, AVPacket *pkt) int *got_frame_ptr, AVPacket *pkt)
{ {
GetBitContext gb; GetBitContext gb;
VimaContext *vima = avctx->priv_data;
AVFrame *frame = data; AVFrame *frame = data;
int16_t pcm_data[2]; int16_t pcm_data[2];
uint32_t samples; uint32_t samples;
...@@ -200,7 +201,7 @@ static int decode_frame(AVCodecContext *avctx, void *data, ...@@ -200,7 +201,7 @@ static int decode_frame(AVCodecContext *avctx, void *data,
predict_index = (lookup << (7 - lookup_size)) | (step_index << 6); predict_index = (lookup << (7 - lookup_size)) | (step_index << 6);
predict_index = av_clip(predict_index, 0, 5785); predict_index = av_clip(predict_index, 0, 5785);
diff = vima->predict_table[predict_index]; diff = predict_table[predict_index];
if (lookup) if (lookup)
diff += ff_adpcm_step_table[step_index] >> (lookup_size - 1); diff += ff_adpcm_step_table[step_index] >> (lookup_size - 1);
if (highbit) if (highbit)
...@@ -225,7 +226,6 @@ AVCodec ff_vima_decoder = { ...@@ -225,7 +226,6 @@ AVCodec ff_vima_decoder = {
.name = "vima", .name = "vima",
.type = AVMEDIA_TYPE_AUDIO, .type = AVMEDIA_TYPE_AUDIO,
.id = AV_CODEC_ID_VIMA, .id = AV_CODEC_ID_VIMA,
.priv_data_size = sizeof(VimaContext),
.init = decode_init, .init = decode_init,
.decode = decode_frame, .decode = decode_frame,
.capabilities = CODEC_CAP_DR1, .capabilities = CODEC_CAP_DR1,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment