diff --git a/libavcodec/cook.c b/libavcodec/cook.c index 6039cfcf57..1a58ad8e21 100644 --- a/libavcodec/cook.c +++ b/libavcodec/cook.c @@ -68,7 +68,29 @@ typedef struct { int *previous; } cook_gains; -typedef struct { +typedef struct cook { + /* + * The following 5 functions provide the lowlevel arithmetic on + * the internal audio buffers. + */ + void (* scalar_dequant)(struct cook *q, int index, int quant_index, + int* subband_coef_index, int* subband_coef_sign, + float* mlt_p); + + void (* decouple) (struct cook *q, + int subband, + float f1, float f2, + float *decode_buffer, + float *mlt_buffer1, float *mlt_buffer2); + + void (* imlt_window) (struct cook *q, float *buffer1, + cook_gains *gains_ptr, float *previous_buffer); + + void (* interpolate) (struct cook *q, float* buffer, + int gain_index, int gain_index_next); + + void (* saturate_output) (struct cook *q, int chan, int16_t *out); + GetBitContext gb; /* stream data */ int nb_channels; @@ -597,7 +619,7 @@ static void decode_vectors(COOKContext* q, int* category, memset(subband_coef_index, 0, sizeof(subband_coef_index)); memset(subband_coef_sign, 0, sizeof(subband_coef_sign)); } - scalar_dequant(q, index, quant_index_table[band], + q->scalar_dequant(q, index, quant_index_table[band], subband_coef_index, subband_coef_sign, &mlt_buffer[band * SUBBAND_SIZE]); } @@ -712,12 +734,12 @@ static void imlt_gain(COOKContext *q, float *inbuffer, q->mdct_ctx.fft.imdct_calc(&q->mdct_ctx, q->mono_mdct_output, inbuffer, q->mdct_tmp); - imlt_window_float (q, buffer1, gains_ptr, previous_buffer); + q->imlt_window (q, buffer1, gains_ptr, previous_buffer); /* Apply gain profile */ for (i = 0; i < 8; i++) { if (gains_ptr->now[i] || gains_ptr->now[i + 1]) - interpolate(q, &buffer1[q->gain_size_factor * i], + q->interpolate(q, &buffer1[q->gain_size_factor * i], gains_ptr->now[i], gains_ptr->now[i + 1]); } @@ -824,7 +846,7 @@ static void joint_decode(COOKContext *q, float* mlt_buffer1, cplscale = (float*)cplscales[q->js_vlc_bits-2]; //choose decoupler table f1 = cplscale[decouple_tab[cpl_tmp]]; f2 = cplscale[idx-1]; - decouple_float (q, i, f1, f2, decode_buffer, mlt_buffer1, mlt_buffer2); + q->decouple (q, i, f1, f2, decode_buffer, mlt_buffer1, mlt_buffer2); idx = (1 << q->js_vlc_bits) - 1; } } @@ -893,7 +915,7 @@ mlt_compensate_output(COOKContext *q, float *decode_buffer, int16_t *out, int chan) { imlt_gain(q, decode_buffer, gains, previous_buffer); - saturate_output_float (q, chan, out); + q->saturate_output (q, chan, out); } @@ -1125,6 +1147,15 @@ static int cook_decode_init(AVCodecContext *avctx) if ( init_cook_mlt(q) != 0 ) return -1; + /* Initialize COOK signal arithmetic handling */ + if (1) { + q->scalar_dequant = scalar_dequant; + q->decouple = decouple_float; + q->imlt_window = imlt_window_float; + q->interpolate = interpolate; + q->saturate_output = saturate_output_float; + } + /* Try to catch some obviously faulty streams, othervise it might be exploitable */ if (q->total_subbands > 53) { av_log(avctx,AV_LOG_ERROR,"total_subbands > 53, report sample!\n");