summaryrefslogtreecommitdiff
path: root/libavcodec/cook.c
diff options
context:
space:
mode:
authorMarc Hoffman <mmhoffm@gmail.com>2007-07-16 12:32:41 +0000
committerMarc Hoffman <mmhoffm@gmail.com>2007-07-16 12:32:41 +0000
commit28d997f9327a80ff38e857c971716fa165fafe3f (patch)
tree4762ac0ceca98f1ecd55fe780d90e149b92f7a4d /libavcodec/cook.c
parente66442f4e34fd2753ba5540c329255e898a4ee21 (diff)
fixpoint: lowlevel functional abstraction for all buffer arithmetics
Originally committed as revision 9701 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/cook.c')
-rw-r--r--libavcodec/cook.c43
1 files changed, 37 insertions, 6 deletions
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");