annotate cook.c @ 3014:959b8ad880dc libavcodec

Dual mono stereo strems sound ok now, added sanity checks and removed some unused variables and redundant memsets. Patch by Benjamin Larsson
author rtognimp
date Fri, 06 Jan 2006 12:41:57 +0000
parents f5898b9b8a8a
children 08da190c65e2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2956
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1 /*
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
2 * COOK compatible decoder
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
3 * Copyright (c) 2003 Sascha Sommer
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
4 * Copyright (c) 2005 Benjamin Larsson
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
5 *
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
6 * This library is free software; you can redistribute it and/or
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
7 * modify it under the terms of the GNU Lesser General Public
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
8 * License as published by the Free Software Foundation; either
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
9 * version 2 of the License, or (at your option) any later version.
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
10 *
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
11 * This library is distributed in the hope that it will be useful,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
14 * Lesser General Public License for more details.
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
15 *
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
16 * You should have received a copy of the GNU Lesser General Public
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
17 * License along with this library; if not, write to the Free Software
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
19 *
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
20 */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
21
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
22 /**
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
23 * @file cook.c
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
24 * Cook compatible decoder.
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
25 * This decoder handles RealNetworks, RealAudio G2 data.
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
26 * Cook is identified by the codec name cook in RM files.
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
27 *
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
28 * To use this decoder, a calling application must supply the extradata
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
29 * bytes provided from the RM container; 8+ bytes for mono streams and
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
30 * 16+ for stereo streams (maybe more).
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
31 *
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
32 * Codec technicalities (all this assume a buffer length of 1024):
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
33 * Cook works with several different techniques to achieve its compression.
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
34 * In the timedomain the buffer is divided into 8 pieces and quantized. If
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
35 * two neighboring pieces have different quantization index a smooth
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
36 * quantization curve is used to get a smooth overlap between the different
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
37 * pieces.
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
38 * To get to the transformdomain Cook uses a modulated lapped transform.
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
39 * The transform domain has 50 subbands with 20 elements each. This
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
40 * means only a maximum of 50*20=1000 coefficients are used out of the 1024
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
41 * available.
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
42 */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
43
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
44 #include <math.h>
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
45 #include <stddef.h>
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
46 #include <stdio.h>
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
47
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
48 #define ALT_BITSTREAM_READER
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
49 #include "avcodec.h"
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
50 #include "bitstream.h"
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
51 #include "dsputil.h"
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
52
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
53 #include "cookdata.h"
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
54
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
55 /* the different Cook versions */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
56 #define MONO_COOK1 0x1000001
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
57 #define MONO_COOK2 0x1000002
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
58 #define JOINT_STEREO 0x1000003
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
59 #define MC_COOK 0x2000000 //multichannel Cook, not supported
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
60
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
61 #define SUBBAND_SIZE 20
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
62 //#define COOKDEBUG
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
63
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
64 typedef struct {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
65 int size;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
66 int qidx_table1[8];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
67 int qidx_table2[8];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
68 } COOKgain;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
69
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
70 typedef struct __attribute__((__packed__)){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
71 /* codec data start */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
72 uint32_t cookversion; //in network order, bigendian
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
73 uint16_t samples_per_frame; //amount of samples per frame per channel, bigendian
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
74 uint16_t subbands; //amount of bands used in the frequency domain, bigendian
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
75 /* Mono extradata ends here. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
76 uint32_t unused;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
77 uint16_t js_subband_start; //bigendian
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
78 uint16_t js_vlc_bits; //bigendian
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
79 /* Stereo extradata ends here. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
80 } COOKextradata;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
81
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
82
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
83 typedef struct {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
84 GetBitContext gb;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
85 /* stream data */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
86 int nb_channels;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
87 int joint_stereo;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
88 int bit_rate;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
89 int sample_rate;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
90 int samples_per_channel;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
91 int samples_per_frame;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
92 int subbands;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
93 int numvector_bits;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
94 int numvector_size; //1 << numvector_bits;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
95 int js_subband_start;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
96 int total_subbands;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
97 int num_vectors;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
98 int bits_per_subpacket;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
99 /* states */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
100 int random_state;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
101
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
102 /* transform data */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
103 FFTContext fft_ctx;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
104 FFTSample mlt_tmp[1024] __attribute__((aligned(16))); /* temporary storage for imlt */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
105 float* mlt_window;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
106 float* mlt_precos;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
107 float* mlt_presin;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
108 float* mlt_postcos;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
109 int fft_size;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
110 int fft_order;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
111 int mlt_size; //modulated lapped transform size
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
112
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
113 /* gain buffers */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
114 COOKgain* gain_now_ptr;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
115 COOKgain* gain_previous_ptr;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
116 COOKgain gain_current;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
117 COOKgain gain_now;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
118 COOKgain gain_previous;
3014
959b8ad880dc Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents: 3009
diff changeset
119 COOKgain gain_channel1[2];
959b8ad880dc Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents: 3009
diff changeset
120 COOKgain gain_channel2[2];
2956
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
121
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
122 /* VLC data */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
123 int js_vlc_bits;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
124 VLC envelope_quant_index[13];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
125 VLC sqvh[7]; //scalar quantization
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
126 VLC ccpl; //channel coupling
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
127
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
128 /* generatable tables and related variables */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
129 int gain_size_factor;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
130 float gain_table[23];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
131 float pow2tab[127];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
132 float rootpow2tab[127];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
133
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
134 /* data buffers */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
135
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
136 uint8_t* decoded_bytes_buffer;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
137 float mono_mdct_output[2048] __attribute__((aligned(16)));
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
138 float* previous_buffer_ptr[2];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
139 float mono_previous_buffer1[1024];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
140 float mono_previous_buffer2[1024];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
141 float* decode_buf_ptr[4];
3014
959b8ad880dc Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents: 3009
diff changeset
142 float* decode_buf_ptr2[2];
2956
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
143 float decode_buffer_1[1024];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
144 float decode_buffer_2[1024];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
145 float decode_buffer_3[1024];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
146 float decode_buffer_4[1024];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
147 } COOKContext;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
148
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
149 /* debug functions */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
150
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
151 #ifdef COOKDEBUG
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
152 static void dump_float_table(float* table, int size, int delimiter) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
153 int i=0;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
154 av_log(NULL,AV_LOG_ERROR,"\n[%d]: ",i);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
155 for (i=0 ; i<size ; i++) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
156 av_log(NULL, AV_LOG_ERROR, "%5.1f, ", table[i]);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
157 if ((i+1)%delimiter == 0) av_log(NULL,AV_LOG_ERROR,"\n[%d]: ",i+1);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
158 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
159 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
160
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
161 static void dump_int_table(int* table, int size, int delimiter) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
162 int i=0;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
163 av_log(NULL,AV_LOG_ERROR,"\n[%d]: ",i);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
164 for (i=0 ; i<size ; i++) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
165 av_log(NULL, AV_LOG_ERROR, "%d, ", table[i]);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
166 if ((i+1)%delimiter == 0) av_log(NULL,AV_LOG_ERROR,"\n[%d]: ",i+1);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
167 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
168 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
169
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
170 static void dump_short_table(short* table, int size, int delimiter) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
171 int i=0;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
172 av_log(NULL,AV_LOG_ERROR,"\n[%d]: ",i);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
173 for (i=0 ; i<size ; i++) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
174 av_log(NULL, AV_LOG_ERROR, "%d, ", table[i]);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
175 if ((i+1)%delimiter == 0) av_log(NULL,AV_LOG_ERROR,"\n[%d]: ",i+1);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
176 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
177 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
178
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
179 #endif
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
180
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
181 /*************** init functions ***************/
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
182
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
183 /* table generator */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
184 static void init_pow2table(COOKContext *q){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
185 int i;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
186 q->pow2tab[63] = 1.0;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
187 for (i=1 ; i<64 ; i++){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
188 q->pow2tab[63+i]=(float)pow(2.0,(double)i);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
189 q->pow2tab[63-i]=1.0/(float)pow(2.0,(double)i);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
190 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
191 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
192
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
193 /* table generator */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
194 static void init_rootpow2table(COOKContext *q){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
195 int i;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
196 q->rootpow2tab[63] = 1.0;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
197 for (i=1 ; i<64 ; i++){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
198 q->rootpow2tab[63+i]=sqrt((float)powf(2.0,(float)i));
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
199 q->rootpow2tab[63-i]=sqrt(1.0/(float)powf(2.0,(float)i));
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
200 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
201 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
202
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
203 /* table generator */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
204 static void init_gain_table(COOKContext *q) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
205 int i;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
206 q->gain_size_factor = q->samples_per_channel/8;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
207 for (i=0 ; i<23 ; i++) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
208 q->gain_table[i] = pow((double)q->pow2tab[i+52] ,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
209 (1.0/(double)q->gain_size_factor));
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
210 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
211 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
212
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
213
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
214 static int init_cook_vlc_tables(COOKContext *q) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
215 int i, result;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
216
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
217 result = 0;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
218 for (i=0 ; i<13 ; i++) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
219 result &= init_vlc (&q->envelope_quant_index[i], 9, 24,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
220 envelope_quant_index_huffbits[i], 1, 1,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
221 envelope_quant_index_huffcodes[i], 2, 2, 0);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
222 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
223 av_log(NULL,AV_LOG_DEBUG,"sqvh VLC init\n");
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
224 for (i=0 ; i<7 ; i++) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
225 result &= init_vlc (&q->sqvh[i], vhvlcsize_tab[i], vhsize_tab[i],
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
226 cvh_huffbits[i], 1, 1,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
227 cvh_huffcodes[i], 2, 2, 0);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
228 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
229
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
230 if (q->nb_channels==2 && q->joint_stereo==1){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
231 result &= init_vlc (&q->ccpl, 6, (1<<q->js_vlc_bits)-1,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
232 ccpl_huffbits[q->js_vlc_bits-2], 1, 1,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
233 ccpl_huffcodes[q->js_vlc_bits-2], 2, 2, 0);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
234 av_log(NULL,AV_LOG_DEBUG,"Joint-stereo VLC used.\n");
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
235 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
236
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
237 av_log(NULL,AV_LOG_DEBUG,"VLC tables initialized.\n");
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
238 return result;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
239 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
240
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
241 static int init_cook_mlt(COOKContext *q) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
242 int j;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
243 float alpha;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
244
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
245 /* Allocate the buffers, could be replaced with a static [512]
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
246 array if needed. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
247 q->mlt_size = q->samples_per_channel;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
248 q->mlt_window = av_malloc(sizeof(float)*q->mlt_size);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
249 q->mlt_precos = av_malloc(sizeof(float)*q->mlt_size/2);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
250 q->mlt_presin = av_malloc(sizeof(float)*q->mlt_size/2);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
251 q->mlt_postcos = av_malloc(sizeof(float)*q->mlt_size/2);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
252
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
253 /* Initialize the MLT window: simple sine window. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
254 alpha = M_PI / (2.0 * (float)q->mlt_size);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
255 for(j=0 ; j<q->mlt_size ; j++) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
256 q->mlt_window[j] = sin((j + 512.0/(float)q->mlt_size) * alpha);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
257 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
258
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
259 /* pre/post twiddle factors */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
260 for (j=0 ; j<q->mlt_size/2 ; j++){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
261 q->mlt_precos[j] = cos( ((j+0.25)*M_PI)/q->mlt_size);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
262 q->mlt_presin[j] = sin( ((j+0.25)*M_PI)/q->mlt_size);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
263 q->mlt_postcos[j] = (float)sqrt(2.0/(float)q->mlt_size)*cos( ((float)j*M_PI) /q->mlt_size); //sqrt(2/MLT_size) = scalefactor
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
264 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
265
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
266 /* Initialize the FFT. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
267 ff_fft_init(&q->fft_ctx, av_log2(q->mlt_size)-1, 0);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
268 av_log(NULL,AV_LOG_DEBUG,"FFT initialized, order = %d.\n",
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
269 av_log2(q->samples_per_channel)-1);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
270
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
271 return (int)(q->mlt_window && q->mlt_precos && q->mlt_presin && q->mlt_postcos);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
272 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
273
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
274 /*************** init functions end ***********/
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
275
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
276 /**
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
277 * Cook indata decoding, every 32 bits are XORed with 0x37c511f2.
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
278 * Why? No idea, some checksum/error detection method maybe.
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
279 * Nice way to waste CPU cycles.
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
280 *
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
281 * @param in pointer to 32bit array of indata
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
282 * @param bits amount of bits
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
283 * @param out pointer to 32bit array of outdata
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
284 */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
285
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
286 static inline void decode_bytes(uint8_t* inbuffer, uint8_t* out, int bytes){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
287 int i;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
288 uint32_t* buf = (uint32_t*) inbuffer;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
289 uint32_t* obuf = (uint32_t*) out;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
290 /* FIXME: 64 bit platforms would be able to do 64 bits at a time.
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
291 * I'm too lazy though, should be something like
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
292 * for(i=0 ; i<bitamount/64 ; i++)
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
293 * (int64_t)out[i] = 0x37c511f237c511f2^be2me_64(int64_t)in[i]);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
294 * Buffer alignment needs to be checked. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
295
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
296
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
297 for(i=0 ; i<bytes/4 ; i++){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
298 #ifdef WORDS_BIGENDIAN
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
299 obuf[i] = 0x37c511f2^buf[i];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
300 #else
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
301 obuf[i] = 0xf211c537^buf[i];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
302 #endif
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
303 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
304 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
305
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
306 /**
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
307 * Cook uninit
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
308 */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
309
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
310 static int cook_decode_close(AVCodecContext *avctx)
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
311 {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
312 int i;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
313 COOKContext *q = avctx->priv_data;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
314 av_log(NULL,AV_LOG_DEBUG, "Deallocating memory.\n");
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
315
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
316 /* Free allocated memory buffers. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
317 av_free(q->mlt_window);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
318 av_free(q->mlt_precos);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
319 av_free(q->mlt_presin);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
320 av_free(q->mlt_postcos);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
321 av_free(q->decoded_bytes_buffer);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
322
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
323 /* Free the transform. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
324 ff_fft_end(&q->fft_ctx);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
325
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
326 /* Free the VLC tables. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
327 for (i=0 ; i<13 ; i++) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
328 free_vlc(&q->envelope_quant_index[i]);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
329 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
330 for (i=0 ; i<7 ; i++) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
331 free_vlc(&q->sqvh[i]);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
332 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
333 if(q->nb_channels==2 && q->joint_stereo==1 ){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
334 free_vlc(&q->ccpl);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
335 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
336
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
337 av_log(NULL,AV_LOG_DEBUG,"Memory deallocated.\n");
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
338
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
339 return 0;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
340 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
341
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
342 /**
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
343 * Fill the COOKgain structure for the timedomain quantization.
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
344 *
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
345 * @param q pointer to the COOKContext
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
346 * @param gaininfo pointer to the COOKgain
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
347 */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
348
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
349 static void decode_gain_info(GetBitContext *gb, COOKgain* gaininfo) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
350 int i;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
351
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
352 while (get_bits1(gb)) {}
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
353
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
354 gaininfo->size = get_bits_count(gb) - 1; //amount of elements*2 to update
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
355
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
356 if (get_bits_count(gb) - 1 <= 0) return;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
357
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
358 for (i=0 ; i<gaininfo->size ; i++){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
359 gaininfo->qidx_table1[i] = get_bits(gb,3);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
360 if (get_bits1(gb)) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
361 gaininfo->qidx_table2[i] = get_bits(gb,4) - 7; //convert to signed
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
362 } else {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
363 gaininfo->qidx_table2[i] = -1;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
364 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
365 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
366 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
367
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
368 /**
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
369 * Create the quant index table needed for the envelope.
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
370 *
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
371 * @param q pointer to the COOKContext
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
372 * @param quant_index_table pointer to the array
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
373 */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
374
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
375 static void decode_envelope(COOKContext *q, int* quant_index_table) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
376 int i,j, vlc_index;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
377 int bitbias;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
378
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
379 bitbias = get_bits_count(&q->gb);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
380 quant_index_table[0]= get_bits(&q->gb,6) - 6; //This is used later in categorize
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
381
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
382 for (i=1 ; i < q->total_subbands ; i++){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
383 vlc_index=i;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
384 if (i >= q->js_subband_start * 2) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
385 vlc_index-=q->js_subband_start;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
386 } else {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
387 vlc_index/=2;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
388 if(vlc_index < 1) vlc_index = 1;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
389 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
390 if (vlc_index>13) vlc_index = 13; //the VLC tables >13 are identical to No. 13
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
391
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
392 j = get_vlc2(&q->gb, q->envelope_quant_index[vlc_index-1].table,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
393 q->envelope_quant_index[vlc_index-1].bits,2);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
394 quant_index_table[i] = quant_index_table[i-1] + j - 12; //differential encoding
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
395 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
396 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
397
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
398 /**
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
399 * Create the quant value table.
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
400 *
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
401 * @param q pointer to the COOKContext
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
402 * @param quant_value_table pointer to the array
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
403 */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
404
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
405 static void inline dequant_envelope(COOKContext *q, int* quant_index_table,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
406 float* quant_value_table){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
407
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
408 int i;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
409 for(i=0 ; i < q->total_subbands ; i++){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
410 quant_value_table[i] = q->rootpow2tab[quant_index_table[i]+63];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
411 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
412 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
413
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
414 /**
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
415 * Calculate the category and category_index vector.
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
416 *
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
417 * @param q pointer to the COOKContext
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
418 * @param quant_index_table pointer to the array
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
419 * @param category pointer to the category array
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
420 * @param category_index pointer to the category_index array
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
421 */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
422
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
423 static void categorize(COOKContext *q, int* quant_index_table,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
424 int* category, int* category_index){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
425 int exp_idx, bias, tmpbias, bits_left, num_bits, index, v, i, j;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
426 int exp_index2[102];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
427 int exp_index1[102];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
428
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
429 int tmp_categorize_array1[128];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
430 int tmp_categorize_array1_idx=0;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
431 int tmp_categorize_array2[128];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
432 int tmp_categorize_array2_idx=0;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
433 int category_index_size=0;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
434
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
435 bits_left = q->bits_per_subpacket - get_bits_count(&q->gb);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
436
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
437 if(bits_left > q->samples_per_channel) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
438 bits_left = q->samples_per_channel +
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
439 ((bits_left - q->samples_per_channel)*5)/8;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
440 //av_log(NULL, AV_LOG_ERROR, "bits_left = %d\n",bits_left);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
441 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
442
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
443 memset(&exp_index1,0,102*sizeof(int));
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
444 memset(&exp_index2,0,102*sizeof(int));
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
445 memset(&tmp_categorize_array1,0,128*sizeof(int));
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
446 memset(&tmp_categorize_array2,0,128*sizeof(int));
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
447
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
448 bias=-32;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
449
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
450 /* Estimate bias. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
451 for (i=32 ; i>0 ; i=i/2){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
452 num_bits = 0;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
453 index = 0;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
454 for (j=q->total_subbands ; j>0 ; j--){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
455 exp_idx = (i - quant_index_table[index] + bias) / 2;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
456 if (exp_idx<0){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
457 exp_idx=0;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
458 } else if(exp_idx >7) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
459 exp_idx=7;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
460 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
461 index++;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
462 num_bits+=expbits_tab[exp_idx];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
463 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
464 if(num_bits >= bits_left - 32){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
465 bias+=i;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
466 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
467 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
468
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
469 /* Calculate total number of bits. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
470 num_bits=0;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
471 for (i=0 ; i<q->total_subbands ; i++) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
472 exp_idx = (bias - quant_index_table[i]) / 2;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
473 if (exp_idx<0) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
474 exp_idx=0;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
475 } else if(exp_idx >7) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
476 exp_idx=7;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
477 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
478 num_bits += expbits_tab[exp_idx];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
479 exp_index1[i] = exp_idx;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
480 exp_index2[i] = exp_idx;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
481 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
482 tmpbias = bias = num_bits;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
483
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
484 for (j = 1 ; j < q->numvector_size ; j++) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
485 if (tmpbias + bias > 2*bits_left) { /* ---> */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
486 int max = -999999;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
487 index=-1;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
488 for (i=0 ; i<q->total_subbands ; i++){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
489 if (exp_index1[i] < 7) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
490 v = (-2*exp_index1[i]) - quant_index_table[i] - 32;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
491 if ( v >= max) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
492 max = v;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
493 index = i;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
494 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
495 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
496 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
497 if(index==-1)break;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
498 tmp_categorize_array1[tmp_categorize_array1_idx++] = index;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
499 tmpbias -= expbits_tab[exp_index1[index]] -
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
500 expbits_tab[exp_index1[index]+1];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
501 ++exp_index1[index];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
502 } else { /* <--- */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
503 int min = 999999;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
504 index=-1;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
505 for (i=0 ; i<q->total_subbands ; i++){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
506 if(exp_index2[i] > 0){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
507 v = (-2*exp_index2[i])-quant_index_table[i];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
508 if ( v < min) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
509 min = v;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
510 index = i;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
511 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
512 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
513 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
514 if(index == -1)break;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
515 tmp_categorize_array2[tmp_categorize_array2_idx++] = index;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
516 tmpbias -= expbits_tab[exp_index2[index]] -
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
517 expbits_tab[exp_index2[index]-1];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
518 --exp_index2[index];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
519 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
520 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
521
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
522 for(i=0 ; i<q->total_subbands ; i++)
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
523 category[i] = exp_index2[i];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
524
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
525 /* Concatenate the two arrays. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
526 for(i=tmp_categorize_array2_idx-1 ; i >= 0; i--)
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
527 category_index[category_index_size++] = tmp_categorize_array2[i];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
528
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
529 for(i=0;i<tmp_categorize_array1_idx;i++)
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
530 category_index[category_index_size++ ] = tmp_categorize_array1[i];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
531
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
532 /* FIXME: mc_sich_ra8_20.rm triggers this, not sure with what we
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
533 should fill the remaining bytes. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
534 for(i=category_index_size;i<q->numvector_size;i++)
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
535 category_index[i]=0;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
536
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
537 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
538
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
539
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
540 /**
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
541 * Expand the category vector.
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
542 *
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
543 * @param q pointer to the COOKContext
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
544 * @param category pointer to the category array
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
545 * @param category_index pointer to the category_index array
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
546 */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
547
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
548 static void inline expand_category(COOKContext *q, int* category,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
549 int* category_index){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
550 int i;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
551 for(i=0 ; i<q->num_vectors ; i++){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
552 ++category[category_index[i]];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
553 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
554 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
555
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
556 /**
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
557 * The real requantization of the mltcoefs
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
558 *
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
559 * @param q pointer to the COOKContext
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
560 * @param index index
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
561 * @param band current subband
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
562 * @param quant_value_table pointer to the array
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
563 * @param subband_coef_index array of indexes to quant_centroid_tab
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
564 * @param subband_coef_noise use random noise instead of predetermined value
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
565 * @param mlt_buffer pointer to the mlt buffer
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
566 */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
567
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
568
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
569 static void scalar_dequant(COOKContext *q, int index, int band,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
570 float* quant_value_table, int* subband_coef_index,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
571 int* subband_coef_noise, float* mlt_buffer){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
572 int i;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
573 float f1;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
574
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
575 for(i=0 ; i<SUBBAND_SIZE ; i++) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
576 if (subband_coef_index[i]) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
577 if (subband_coef_noise[i]) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
578 f1 = -quant_centroid_tab[index][subband_coef_index[i]];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
579 } else {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
580 f1 = quant_centroid_tab[index][subband_coef_index[i]];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
581 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
582 } else {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
583 /* noise coding if subband_coef_noise[i] == 0 */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
584 q->random_state = q->random_state * 214013 + 2531011; //typical RNG numbers
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
585 f1 = randsign[(q->random_state/0x1000000)&1] * dither_tab[index]; //>>31
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
586 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
587 mlt_buffer[band*20+ i] = f1 * quant_value_table[band];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
588 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
589 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
590 /**
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
591 * Unpack the subband_coef_index and subband_coef_noise vectors.
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
592 *
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
593 * @param q pointer to the COOKContext
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
594 * @param category pointer to the category array
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
595 * @param subband_coef_index array of indexes to quant_centroid_tab
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
596 * @param subband_coef_noise use random noise instead of predetermined value
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
597 */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
598
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
599 static int unpack_SQVH(COOKContext *q, int category, int* subband_coef_index,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
600 int* subband_coef_noise) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
601 int i,j;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
602 int vlc, vd ,tmp, result;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
603 int ub;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
604 int cb;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
605
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
606 vd = vd_tab[category];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
607 result = 0;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
608 for(i=0 ; i<vpr_tab[category] ; i++){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
609 ub = get_bits_count(&q->gb);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
610 vlc = get_vlc2(&q->gb, q->sqvh[category].table, q->sqvh[category].bits, 3);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
611 cb = get_bits_count(&q->gb);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
612 if (q->bits_per_subpacket < get_bits_count(&q->gb)){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
613 vlc = 0;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
614 result = 1;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
615 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
616 for(j=vd-1 ; j>=0 ; j--){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
617 tmp = (vlc * invradix_tab[category])/0x100000;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
618 subband_coef_index[vd*i+j] = vlc - tmp * (kmax_tab[category]+1);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
619 vlc = tmp;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
620 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
621 for(j=0 ; j<vd ; j++){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
622 if (subband_coef_index[i*vd + j]) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
623 if(get_bits_count(&q->gb) < q->bits_per_subpacket){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
624 subband_coef_noise[i*vd+j] = get_bits1(&q->gb);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
625 } else {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
626 result=1;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
627 subband_coef_noise[i*vd+j]=0;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
628 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
629 } else {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
630 subband_coef_noise[i*vd+j]=0;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
631 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
632 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
633 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
634 return result;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
635 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
636
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
637
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
638 /**
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
639 * Fill the mlt_buffer with mlt coefficients.
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
640 *
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
641 * @param q pointer to the COOKContext
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
642 * @param category pointer to the category array
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
643 * @param quant_value_table pointer to the array
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
644 * @param mlt_buffer pointer to mlt coefficients
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
645 */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
646
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
647
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
648 static void decode_vectors(COOKContext* q, int* category,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
649 float* quant_value_table, float* mlt_buffer){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
650 /* A zero in this table means that the subband coefficient is
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
651 random noise coded. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
652 int subband_coef_noise[SUBBAND_SIZE];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
653 /* A zero in this table means that the subband coefficient is a
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
654 positive multiplicator. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
655 int subband_coef_index[SUBBAND_SIZE];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
656 int band, j;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
657 int index=0;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
658
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
659 for(band=0 ; band<q->total_subbands ; band++){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
660 index = category[band];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
661 if(category[band] < 7){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
662 if(unpack_SQVH(q, category[band], subband_coef_index, subband_coef_noise)){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
663 index=7;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
664 for(j=0 ; j<q->total_subbands ; j++) category[band+j]=7;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
665 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
666 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
667 if(index==7) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
668 memset(subband_coef_index, 0, sizeof(subband_coef_index));
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
669 memset(subband_coef_noise, 0, sizeof(subband_coef_noise));
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
670 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
671 scalar_dequant(q, index, band, quant_value_table, subband_coef_index,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
672 subband_coef_noise, mlt_buffer);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
673 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
674
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
675 if(q->total_subbands*SUBBAND_SIZE >= q->samples_per_channel){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
676 return;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
677 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
678 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
679
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
680
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
681 /**
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
682 * function for decoding mono data
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
683 *
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
684 * @param q pointer to the COOKContext
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
685 * @param mlt_buffer1 pointer to left channel mlt coefficients
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
686 * @param mlt_buffer2 pointer to right channel mlt coefficients
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
687 */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
688
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
689 static void mono_decode(COOKContext *q, float* mlt_buffer) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
690
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
691 int category_index[128];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
692 float quant_value_table[102];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
693 int quant_index_table[102];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
694 int category[128];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
695
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
696 memset(&category, 0, 128*sizeof(int));
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
697 memset(&quant_value_table, 0, 102*sizeof(int));
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
698 memset(&category_index, 0, 128*sizeof(int));
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
699
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
700 decode_envelope(q, quant_index_table);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
701 q->num_vectors = get_bits(&q->gb,q->numvector_bits);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
702 dequant_envelope(q, quant_index_table, quant_value_table);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
703 categorize(q, quant_index_table, category, category_index);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
704 expand_category(q, category, category_index);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
705 decode_vectors(q, category, quant_value_table, mlt_buffer);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
706 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
707
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
708
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
709 /**
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
710 * The modulated lapped transform, this takes transform coefficients
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
711 * and transforms them into timedomain samples. This is done through
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
712 * an FFT-based algorithm with pre- and postrotation steps.
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
713 * A window and reorder step is also included.
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
714 *
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
715 * @param q pointer to the COOKContext
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
716 * @param inbuffer pointer to the mltcoefficients
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
717 * @param outbuffer pointer to the timedomain buffer
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
718 * @param mlt_tmp pointer to temporary storage space
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
719 */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
720
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
721 static void cook_imlt(COOKContext *q, float* inbuffer, float* outbuffer,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
722 float* mlt_tmp){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
723 int i;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
724
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
725 /* prerotation */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
726 for(i=0 ; i<q->mlt_size ; i+=2){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
727 outbuffer[i] = (q->mlt_presin[i/2] * inbuffer[q->mlt_size-1-i]) +
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
728 (q->mlt_precos[i/2] * inbuffer[i]);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
729 outbuffer[i+1] = (q->mlt_precos[i/2] * inbuffer[q->mlt_size-1-i]) -
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
730 (q->mlt_presin[i/2] * inbuffer[i]);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
731 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
732
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
733 /* FFT */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
734 ff_fft_permute(&q->fft_ctx, (FFTComplex *) outbuffer);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
735 ff_fft_calc (&q->fft_ctx, (FFTComplex *) outbuffer);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
736
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
737 /* postrotation */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
738 for(i=0 ; i<q->mlt_size ; i+=2){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
739 mlt_tmp[i] = (q->mlt_postcos[(q->mlt_size-1-i)/2] * outbuffer[i+1]) +
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
740 (q->mlt_postcos[i/2] * outbuffer[i]);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
741 mlt_tmp[q->mlt_size-1-i] = (q->mlt_postcos[(q->mlt_size-1-i)/2] * outbuffer[i]) -
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
742 (q->mlt_postcos[i/2] * outbuffer[i+1]);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
743 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
744
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
745 /* window and reorder */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
746 for(i=0 ; i<q->mlt_size/2 ; i++){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
747 outbuffer[i] = mlt_tmp[q->mlt_size/2-1-i] * q->mlt_window[i];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
748 outbuffer[q->mlt_size-1-i]= mlt_tmp[q->mlt_size/2-1-i] *
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
749 q->mlt_window[q->mlt_size-1-i];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
750 outbuffer[q->mlt_size+i]= mlt_tmp[q->mlt_size/2+i] *
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
751 q->mlt_window[q->mlt_size-1-i];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
752 outbuffer[2*q->mlt_size-1-i]= -(mlt_tmp[q->mlt_size/2+i] *
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
753 q->mlt_window[i]);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
754 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
755 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
756
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
757
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
758 /**
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
759 * the actual requantization of the timedomain samples
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
760 *
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
761 * @param q pointer to the COOKContext
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
762 * @param buffer pointer to the timedomain buffer
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
763 * @param gain_index index for the block multiplier
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
764 * @param gain_index_next index for the next block multiplier
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
765 */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
766
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
767 static void interpolate(COOKContext *q, float* buffer,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
768 int gain_index, int gain_index_next){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
769 int i;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
770 float fc1, fc2;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
771 fc1 = q->pow2tab[gain_index+63];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
772
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
773 if(gain_index == gain_index_next){ //static gain
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
774 for(i=0 ; i<q->gain_size_factor ; i++){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
775 buffer[i]*=fc1;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
776 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
777 return;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
778 } else { //smooth gain
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
779 fc2 = q->gain_table[11 + (gain_index_next-gain_index)];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
780 for(i=0 ; i<q->gain_size_factor ; i++){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
781 buffer[i]*=fc1;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
782 fc1*=fc2;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
783 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
784 return;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
785 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
786 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
787
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
788 /**
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
789 * timedomain requantization of the timedomain samples
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
790 *
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
791 * @param q pointer to the COOKContext
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
792 * @param buffer pointer to the timedomain buffer
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
793 * @param gain_now current gain structure
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
794 * @param gain_previous previous gain structure
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
795 */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
796
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
797 static void gain_window(COOKContext *q, float* buffer, COOKgain* gain_now,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
798 COOKgain* gain_previous){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
799 int i, index;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
800 int gain_index[9];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
801 int tmp_gain_index;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
802
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
803 gain_index[8]=0;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
804 index = gain_previous->size;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
805 for (i=7 ; i>=0 ; i--) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
806 if(index && gain_previous->qidx_table1[index-1]==i) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
807 gain_index[i] = gain_previous->qidx_table2[index-1];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
808 index--;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
809 } else {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
810 gain_index[i]=gain_index[i+1];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
811 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
812 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
813 /* This is applied to the to be previous data buffer. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
814 for(i=0;i<8;i++){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
815 interpolate(q, &buffer[q->samples_per_channel+q->gain_size_factor*i],
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
816 gain_index[i], gain_index[i+1]);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
817 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
818
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
819 tmp_gain_index = gain_index[0];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
820 index = gain_now->size;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
821 for (i=7 ; i>=0 ; i--) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
822 if(index && gain_now->qidx_table1[index-1]==i) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
823 gain_index[i]= gain_now->qidx_table2[index-1];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
824 index--;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
825 } else {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
826 gain_index[i]=gain_index[i+1];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
827 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
828 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
829
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
830 /* This is applied to the to be current block. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
831 for(i=0;i<8;i++){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
832 interpolate(q, &buffer[i*q->gain_size_factor],
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
833 tmp_gain_index+gain_index[i],
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
834 tmp_gain_index+gain_index[i+1]);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
835 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
836 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
837
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
838
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
839 /**
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
840 * mlt overlapping and buffer management
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
841 *
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
842 * @param q pointer to the COOKContext
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
843 * @param buffer pointer to the timedomain buffer
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
844 * @param gain_now current gain structure
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
845 * @param gain_previous previous gain structure
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
846 * @param previous_buffer pointer to the previous buffer to be used for overlapping
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
847 *
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
848 */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
849
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
850 static void gain_compensate(COOKContext *q, float* buffer, COOKgain* gain_now,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
851 COOKgain* gain_previous, float* previous_buffer) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
852 int i;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
853 if((gain_now->size || gain_previous->size)) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
854 gain_window(q, buffer, gain_now, gain_previous);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
855 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
856
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
857 /* Overlap with the previous block. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
858 for(i=0 ; i<q->samples_per_channel ; i++) buffer[i]+=previous_buffer[i];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
859
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
860 /* Save away the current to be previous block. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
861 memcpy(previous_buffer, buffer+q->samples_per_channel,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
862 sizeof(float)*q->samples_per_channel);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
863 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
864
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
865
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
866 /**
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
867 * function for getting the jointstereo coupling information
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
868 *
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
869 * @param q pointer to the COOKContext
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
870 * @param decouple_tab decoupling array
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
871 *
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
872 */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
873
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
874 static void decouple_info(COOKContext *q, int* decouple_tab){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
875 int length, i;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
876
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
877 if(get_bits1(&q->gb)) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
878 if(cplband[q->js_subband_start] > cplband[q->subbands-1]) return;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
879
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
880 length = cplband[q->subbands-1] - cplband[q->js_subband_start] + 1;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
881 for (i=0 ; i<length ; i++) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
882 decouple_tab[cplband[q->js_subband_start] + i] = get_vlc2(&q->gb, q->ccpl.table, q->ccpl.bits, 2);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
883 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
884 return;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
885 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
886
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
887 if(cplband[q->js_subband_start] > cplband[q->subbands-1]) return;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
888
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
889 length = cplband[q->subbands-1] - cplband[q->js_subband_start] + 1;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
890 for (i=0 ; i<length ; i++) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
891 decouple_tab[cplband[q->js_subband_start] + i] = get_bits(&q->gb, q->js_vlc_bits);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
892 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
893 return;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
894 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
895
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
896
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
897 /**
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
898 * function for decoding joint stereo data
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
899 *
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
900 * @param q pointer to the COOKContext
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
901 * @param mlt_buffer1 pointer to left channel mlt coefficients
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
902 * @param mlt_buffer2 pointer to right channel mlt coefficients
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
903 */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
904
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
905 static void joint_decode(COOKContext *q, float* mlt_buffer1,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
906 float* mlt_buffer2) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
907 int i,j;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
908 int decouple_tab[SUBBAND_SIZE];
3009
f5898b9b8a8a Fix an out of array access and some minor cleanup of the code.
diego
parents: 2959
diff changeset
909 float decode_buffer[1060];
2956
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
910 int idx, cpl_tmp,tmp_idx;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
911 float f1,f2;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
912 float* cplscale;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
913
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
914 memset(decouple_tab, 0, sizeof(decouple_tab));
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
915 memset(decode_buffer, 0, sizeof(decode_buffer));
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
916
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
917 /* Make sure the buffers are zeroed out. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
918 memset(mlt_buffer1,0, 1024*sizeof(float));
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
919 memset(mlt_buffer2,0, 1024*sizeof(float));
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
920 decouple_info(q, decouple_tab);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
921 mono_decode(q, decode_buffer);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
922
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
923 /* The two channels are stored interleaved in decode_buffer. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
924 for (i=0 ; i<q->js_subband_start ; i++) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
925 for (j=0 ; j<SUBBAND_SIZE ; j++) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
926 mlt_buffer1[i*20+j] = decode_buffer[i*40+j];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
927 mlt_buffer2[i*20+j] = decode_buffer[i*40+20+j];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
928 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
929 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
930
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
931 /* When we reach js_subband_start (the higher frequencies)
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
932 the coefficients are stored in a coupling scheme. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
933 idx = (1 << q->js_vlc_bits) - 1;
3009
f5898b9b8a8a Fix an out of array access and some minor cleanup of the code.
diego
parents: 2959
diff changeset
934 for (i=q->js_subband_start ; i<q->subbands ; i++) {
f5898b9b8a8a Fix an out of array access and some minor cleanup of the code.
diego
parents: 2959
diff changeset
935 cpl_tmp = cplband[i];
f5898b9b8a8a Fix an out of array access and some minor cleanup of the code.
diego
parents: 2959
diff changeset
936 idx -=decouple_tab[cpl_tmp];
f5898b9b8a8a Fix an out of array access and some minor cleanup of the code.
diego
parents: 2959
diff changeset
937 cplscale = (float*)cplscales[q->js_vlc_bits-2]; //choose decoupler table
f5898b9b8a8a Fix an out of array access and some minor cleanup of the code.
diego
parents: 2959
diff changeset
938 f1 = cplscale[decouple_tab[cpl_tmp]];
f5898b9b8a8a Fix an out of array access and some minor cleanup of the code.
diego
parents: 2959
diff changeset
939 f2 = cplscale[idx-1];
f5898b9b8a8a Fix an out of array access and some minor cleanup of the code.
diego
parents: 2959
diff changeset
940 for (j=0 ; j<SUBBAND_SIZE ; j++) {
f5898b9b8a8a Fix an out of array access and some minor cleanup of the code.
diego
parents: 2959
diff changeset
941 tmp_idx = ((q->js_subband_start + i)*20)+j;
f5898b9b8a8a Fix an out of array access and some minor cleanup of the code.
diego
parents: 2959
diff changeset
942 mlt_buffer1[20*i + j] = f1 * decode_buffer[tmp_idx];
f5898b9b8a8a Fix an out of array access and some minor cleanup of the code.
diego
parents: 2959
diff changeset
943 mlt_buffer2[20*i + j] = f2 * decode_buffer[tmp_idx];
2956
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
944 }
3009
f5898b9b8a8a Fix an out of array access and some minor cleanup of the code.
diego
parents: 2959
diff changeset
945 idx = (1 << q->js_vlc_bits) - 1;
2956
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
946 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
947 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
948
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
949 /**
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
950 * Cook subpacket decoding. This function returns one decoded subpacket,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
951 * usually 1024 samples per channel.
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
952 *
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
953 * @param q pointer to the COOKContext
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
954 * @param inbuffer pointer to the inbuffer
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
955 * @param sub_packet_size subpacket size
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
956 * @param outbuffer pointer to the outbuffer
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
957 * @param pos the subpacket number in the frame
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
958 */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
959
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
960
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
961 static int decode_subpacket(COOKContext *q, uint8_t *inbuffer,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
962 int sub_packet_size, int16_t *outbuffer) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
963 int i,j;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
964 int value;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
965 float* tmp_ptr;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
966
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
967 /* packet dump */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
968 // for (i=0 ; i<sub_packet_size ; i++) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
969 // av_log(NULL, AV_LOG_ERROR, "%02x", inbuffer[i]);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
970 // }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
971 // av_log(NULL, AV_LOG_ERROR, "\n");
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
972
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
973 decode_bytes(inbuffer, q->decoded_bytes_buffer, sub_packet_size);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
974 init_get_bits(&q->gb, q->decoded_bytes_buffer, sub_packet_size*8);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
975 decode_gain_info(&q->gb, &q->gain_current);
2959
24805f4d1b84 This patch adds some support for non-joint stereo streams. It also
rtognimp
parents: 2956
diff changeset
976
2956
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
977 if(q->nb_channels==2 && q->joint_stereo==1){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
978 joint_decode(q, q->decode_buf_ptr[0], q->decode_buf_ptr[2]);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
979
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
980 /* Swap buffer pointers. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
981 tmp_ptr = q->decode_buf_ptr[1];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
982 q->decode_buf_ptr[1] = q->decode_buf_ptr[0];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
983 q->decode_buf_ptr[0] = tmp_ptr;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
984 tmp_ptr = q->decode_buf_ptr[3];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
985 q->decode_buf_ptr[3] = q->decode_buf_ptr[2];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
986 q->decode_buf_ptr[2] = tmp_ptr;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
987
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
988 /* FIXME: Rethink the gainbuffer handling, maybe a rename?
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
989 now/previous swap */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
990 q->gain_now_ptr = &q->gain_now;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
991 q->gain_previous_ptr = &q->gain_previous;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
992 for (i=0 ; i<q->nb_channels ; i++){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
993
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
994 cook_imlt(q, q->decode_buf_ptr[i*2], q->mono_mdct_output, q->mlt_tmp);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
995 gain_compensate(q, q->mono_mdct_output, q->gain_now_ptr,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
996 q->gain_previous_ptr, q->previous_buffer_ptr[0]);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
997
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
998 /* Swap out the previous buffer. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
999 tmp_ptr = q->previous_buffer_ptr[0];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1000 q->previous_buffer_ptr[0] = q->previous_buffer_ptr[1];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1001 q->previous_buffer_ptr[1] = tmp_ptr;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1002
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1003 /* Clip and convert the floats to 16 bits. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1004 for (j=0 ; j<q->samples_per_frame ; j++){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1005 value = lrintf(q->mono_mdct_output[j]);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1006 if(value < -32768) value = -32768;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1007 else if(value > 32767) value = 32767;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1008 outbuffer[2*j+i] = value;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1009 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1010 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1011
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1012 memcpy(&q->gain_now, &q->gain_previous, sizeof(COOKgain));
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1013 memcpy(&q->gain_previous, &q->gain_current, sizeof(COOKgain));
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1014
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1015 } else if (q->nb_channels==2 && q->joint_stereo==0) {
2959
24805f4d1b84 This patch adds some support for non-joint stereo streams. It also
rtognimp
parents: 2956
diff changeset
1016 /* channel 0 */
3014
959b8ad880dc Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents: 3009
diff changeset
1017 mono_decode(q, q->decode_buf_ptr2[0]);
2956
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1018
3014
959b8ad880dc Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents: 3009
diff changeset
1019 tmp_ptr = q->decode_buf_ptr2[0];
959b8ad880dc Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents: 3009
diff changeset
1020 q->decode_buf_ptr2[0] = q->decode_buf_ptr2[1];
959b8ad880dc Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents: 3009
diff changeset
1021 q->decode_buf_ptr2[1] = tmp_ptr;
2956
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1022
3014
959b8ad880dc Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents: 3009
diff changeset
1023 memcpy(&q->gain_channel1[0], &q->gain_current ,sizeof(COOKgain));
959b8ad880dc Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents: 3009
diff changeset
1024 q->gain_now_ptr = &q->gain_channel1[0];
959b8ad880dc Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents: 3009
diff changeset
1025 q->gain_previous_ptr = &q->gain_channel1[1];
2956
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1026
3014
959b8ad880dc Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents: 3009
diff changeset
1027 cook_imlt(q, q->decode_buf_ptr2[0], q->mono_mdct_output,q->mlt_tmp);
2956
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1028 gain_compensate(q, q->mono_mdct_output, q->gain_now_ptr,
3014
959b8ad880dc Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents: 3009
diff changeset
1029 q->gain_previous_ptr, q->mono_previous_buffer1);
959b8ad880dc Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents: 3009
diff changeset
1030
959b8ad880dc Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents: 3009
diff changeset
1031 memcpy(&q->gain_channel1[1], &q->gain_channel1[0],sizeof(COOKgain));
959b8ad880dc Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents: 3009
diff changeset
1032
2956
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1033
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1034 for (j=0 ; j<q->samples_per_frame ; j++){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1035 value = lrintf(q->mono_mdct_output[j]);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1036 if(value < -32768) value = -32768;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1037 else if(value > 32767) value = 32767;
2959
24805f4d1b84 This patch adds some support for non-joint stereo streams. It also
rtognimp
parents: 2956
diff changeset
1038 outbuffer[2*j+1] = value;
2956
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1039 }
2959
24805f4d1b84 This patch adds some support for non-joint stereo streams. It also
rtognimp
parents: 2956
diff changeset
1040
24805f4d1b84 This patch adds some support for non-joint stereo streams. It also
rtognimp
parents: 2956
diff changeset
1041 /* channel 1 */
24805f4d1b84 This patch adds some support for non-joint stereo streams. It also
rtognimp
parents: 2956
diff changeset
1042 //av_log(NULL,AV_LOG_ERROR,"bits = %d\n",get_bits_count(&q->gb));
24805f4d1b84 This patch adds some support for non-joint stereo streams. It also
rtognimp
parents: 2956
diff changeset
1043 init_get_bits(&q->gb, q->decoded_bytes_buffer, sub_packet_size*8+q->bits_per_subpacket);
3014
959b8ad880dc Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents: 3009
diff changeset
1044
959b8ad880dc Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents: 3009
diff changeset
1045 q->gain_now_ptr = &q->gain_channel2[0];
959b8ad880dc Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents: 3009
diff changeset
1046 q->gain_previous_ptr = &q->gain_channel2[1];
959b8ad880dc Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents: 3009
diff changeset
1047
959b8ad880dc Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents: 3009
diff changeset
1048 decode_gain_info(&q->gb, &q->gain_channel2[0]);
2959
24805f4d1b84 This patch adds some support for non-joint stereo streams. It also
rtognimp
parents: 2956
diff changeset
1049 mono_decode(q, q->decode_buf_ptr[0]);
3014
959b8ad880dc Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents: 3009
diff changeset
1050
2959
24805f4d1b84 This patch adds some support for non-joint stereo streams. It also
rtognimp
parents: 2956
diff changeset
1051 tmp_ptr = q->decode_buf_ptr[0];
3014
959b8ad880dc Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents: 3009
diff changeset
1052 q->decode_buf_ptr[0] = q->decode_buf_ptr[1];
959b8ad880dc Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents: 3009
diff changeset
1053 q->decode_buf_ptr[1] = tmp_ptr;
2959
24805f4d1b84 This patch adds some support for non-joint stereo streams. It also
rtognimp
parents: 2956
diff changeset
1054
24805f4d1b84 This patch adds some support for non-joint stereo streams. It also
rtognimp
parents: 2956
diff changeset
1055 cook_imlt(q, q->decode_buf_ptr[0], q->mono_mdct_output,q->mlt_tmp);
3014
959b8ad880dc Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents: 3009
diff changeset
1056 gain_compensate(q, q->mono_mdct_output, q->gain_now_ptr,
959b8ad880dc Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents: 3009
diff changeset
1057 q->gain_previous_ptr, q->mono_previous_buffer2);
2959
24805f4d1b84 This patch adds some support for non-joint stereo streams. It also
rtognimp
parents: 2956
diff changeset
1058
24805f4d1b84 This patch adds some support for non-joint stereo streams. It also
rtognimp
parents: 2956
diff changeset
1059 /* Swap out the previous buffer. */
24805f4d1b84 This patch adds some support for non-joint stereo streams. It also
rtognimp
parents: 2956
diff changeset
1060 tmp_ptr = q->previous_buffer_ptr[0];
24805f4d1b84 This patch adds some support for non-joint stereo streams. It also
rtognimp
parents: 2956
diff changeset
1061 q->previous_buffer_ptr[0] = q->previous_buffer_ptr[1];
24805f4d1b84 This patch adds some support for non-joint stereo streams. It also
rtognimp
parents: 2956
diff changeset
1062 q->previous_buffer_ptr[1] = tmp_ptr;
24805f4d1b84 This patch adds some support for non-joint stereo streams. It also
rtognimp
parents: 2956
diff changeset
1063
3014
959b8ad880dc Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents: 3009
diff changeset
1064 memcpy(&q->gain_channel2[1], &q->gain_channel2[0] ,sizeof(COOKgain));
959b8ad880dc Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents: 3009
diff changeset
1065
2959
24805f4d1b84 This patch adds some support for non-joint stereo streams. It also
rtognimp
parents: 2956
diff changeset
1066 for (j=0 ; j<q->samples_per_frame ; j++){
24805f4d1b84 This patch adds some support for non-joint stereo streams. It also
rtognimp
parents: 2956
diff changeset
1067 value = lrintf(q->mono_mdct_output[j]);
24805f4d1b84 This patch adds some support for non-joint stereo streams. It also
rtognimp
parents: 2956
diff changeset
1068 if(value < -32768) value = -32768;
24805f4d1b84 This patch adds some support for non-joint stereo streams. It also
rtognimp
parents: 2956
diff changeset
1069 else if(value > 32767) value = 32767;
24805f4d1b84 This patch adds some support for non-joint stereo streams. It also
rtognimp
parents: 2956
diff changeset
1070 outbuffer[2*j] = value;
24805f4d1b84 This patch adds some support for non-joint stereo streams. It also
rtognimp
parents: 2956
diff changeset
1071 }
24805f4d1b84 This patch adds some support for non-joint stereo streams. It also
rtognimp
parents: 2956
diff changeset
1072
2956
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1073 } else {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1074 mono_decode(q, q->decode_buf_ptr[0]);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1075
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1076 /* Swap buffer pointers. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1077 tmp_ptr = q->decode_buf_ptr[1];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1078 q->decode_buf_ptr[1] = q->decode_buf_ptr[0];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1079 q->decode_buf_ptr[0] = tmp_ptr;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1080
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1081 /* FIXME: Rethink the gainbuffer handling, maybe a rename?
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1082 now/previous swap */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1083 q->gain_now_ptr = &q->gain_now;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1084 q->gain_previous_ptr = &q->gain_previous;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1085
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1086 cook_imlt(q, q->decode_buf_ptr[0], q->mono_mdct_output,q->mlt_tmp);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1087 gain_compensate(q, q->mono_mdct_output, q->gain_now_ptr,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1088 q->gain_previous_ptr, q->mono_previous_buffer1);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1089
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1090 /* Clip and convert the floats to 16 bits */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1091 for (j=0 ; j<q->samples_per_frame ; j++){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1092 value = lrintf(q->mono_mdct_output[j]);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1093 if(value < -32768) value = -32768;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1094 else if(value > 32767) value = 32767;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1095 outbuffer[j] = value;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1096 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1097 memcpy(&q->gain_now, &q->gain_previous, sizeof(COOKgain));
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1098 memcpy(&q->gain_previous, &q->gain_current, sizeof(COOKgain));
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1099 }
2959
24805f4d1b84 This patch adds some support for non-joint stereo streams. It also
rtognimp
parents: 2956
diff changeset
1100 return q->samples_per_frame * sizeof(int16_t);
2956
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1101 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1102
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1103
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1104 /**
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1105 * Cook frame decoding
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1106 *
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1107 * @param avctx pointer to the AVCodecContext
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1108 */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1109
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1110 static int cook_decode_frame(AVCodecContext *avctx,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1111 void *data, int *data_size,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1112 uint8_t *buf, int buf_size) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1113 COOKContext *q = avctx->priv_data;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1114
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1115 if (buf_size < avctx->block_align)
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1116 return buf_size;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1117
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1118 *data_size = decode_subpacket(q, buf, avctx->block_align, data);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1119
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1120 return avctx->block_align;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1121 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1122 #ifdef COOKDEBUG
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1123 static void dump_cook_context(COOKContext *q, COOKextradata *e)
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1124 {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1125 //int i=0;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1126 #define PRINT(a,b) av_log(NULL,AV_LOG_ERROR," %s = %d\n", a, b);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1127 av_log(NULL,AV_LOG_ERROR,"COOKextradata\n");
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1128 av_log(NULL,AV_LOG_ERROR,"cookversion=%x\n",e->cookversion);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1129 if (e->cookversion > MONO_COOK2) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1130 PRINT("js_subband_start",e->js_subband_start);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1131 PRINT("js_vlc_bits",e->js_vlc_bits);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1132 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1133 av_log(NULL,AV_LOG_ERROR,"COOKContext\n");
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1134 PRINT("nb_channels",q->nb_channels);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1135 PRINT("bit_rate",q->bit_rate);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1136 PRINT("sample_rate",q->sample_rate);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1137 PRINT("samples_per_channel",q->samples_per_channel);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1138 PRINT("samples_per_frame",q->samples_per_frame);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1139 PRINT("subbands",q->subbands);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1140 PRINT("random_state",q->random_state);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1141 PRINT("mlt_size",q->mlt_size);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1142 PRINT("js_subband_start",q->js_subband_start);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1143 PRINT("numvector_bits",q->numvector_bits);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1144 PRINT("numvector_size",q->numvector_size);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1145 PRINT("total_subbands",q->total_subbands);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1146 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1147 #endif
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1148 /**
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1149 * Cook initialization
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1150 *
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1151 * @param avctx pointer to the AVCodecContext
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1152 */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1153
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1154 static int cook_decode_init(AVCodecContext *avctx)
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1155 {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1156 COOKextradata *e = avctx->extradata;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1157 COOKContext *q = avctx->priv_data;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1158
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1159 /* Take care of the codec specific extradata. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1160 if (avctx->extradata_size <= 0) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1161 av_log(NULL,AV_LOG_ERROR,"Necessary extradata missing!\n");
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1162 return -1;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1163 } else {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1164 /* 8 for mono, 16 for stereo, ? for multichannel
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1165 Swap to right endianness so we don't need to care later on. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1166 av_log(NULL,AV_LOG_DEBUG,"codecdata_length=%d\n",avctx->extradata_size);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1167 if (avctx->extradata_size >= 8){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1168 e->cookversion = be2me_32(e->cookversion);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1169 e->samples_per_frame = be2me_16(e->samples_per_frame);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1170 e->subbands = be2me_16(e->subbands);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1171 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1172 if (avctx->extradata_size >= 16){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1173 e->js_subband_start = be2me_16(e->js_subband_start);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1174 e->js_vlc_bits = be2me_16(e->js_vlc_bits);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1175 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1176 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1177
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1178 /* Take data from the AVCodecContext (RM container). */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1179 q->sample_rate = avctx->sample_rate;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1180 q->nb_channels = avctx->channels;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1181 q->bit_rate = avctx->bit_rate;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1182
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1183 /* Initialize state. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1184 q->random_state = 1;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1185
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1186 /* Initialize extradata related variables. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1187 q->samples_per_channel = e->samples_per_frame / q->nb_channels;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1188 q->samples_per_frame = e->samples_per_frame;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1189 q->subbands = e->subbands;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1190 q->bits_per_subpacket = avctx->block_align * 8;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1191
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1192 /* Initialize default data states. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1193 q->js_subband_start = 0;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1194 q->numvector_bits = 5;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1195 q->total_subbands = q->subbands;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1196
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1197 /* Initialize version-dependent variables */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1198 av_log(NULL,AV_LOG_DEBUG,"e->cookversion=%x\n",e->cookversion);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1199 switch (e->cookversion) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1200 case MONO_COOK1:
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1201 if (q->nb_channels != 1) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1202 av_log(NULL,AV_LOG_ERROR,"Container channels != 1, report sample!\n");
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1203 return -1;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1204 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1205 av_log(NULL,AV_LOG_DEBUG,"MONO_COOK1\n");
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1206 break;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1207 case MONO_COOK2:
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1208 if (q->nb_channels != 1) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1209 q->joint_stereo = 0;
2959
24805f4d1b84 This patch adds some support for non-joint stereo streams. It also
rtognimp
parents: 2956
diff changeset
1210 q->bits_per_subpacket = q->bits_per_subpacket/2;
2956
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1211 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1212 av_log(NULL,AV_LOG_DEBUG,"MONO_COOK2\n");
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1213 break;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1214 case JOINT_STEREO:
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1215 if (q->nb_channels != 2) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1216 av_log(NULL,AV_LOG_ERROR,"Container channels != 2, report sample!\n");
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1217 return -1;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1218 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1219 av_log(NULL,AV_LOG_DEBUG,"JOINT_STEREO\n");
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1220 if (avctx->extradata_size >= 16){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1221 q->total_subbands = q->subbands + e->js_subband_start;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1222 q->js_subband_start = e->js_subband_start;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1223 q->joint_stereo = 1;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1224 q->js_vlc_bits = e->js_vlc_bits;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1225 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1226 if (q->samples_per_channel > 256) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1227 q->numvector_bits++; // q->numvector_bits = 6
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1228 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1229 if (q->samples_per_channel > 512) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1230 q->numvector_bits++; // q->numvector_bits = 7
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1231 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1232 break;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1233 case MC_COOK:
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1234 av_log(NULL,AV_LOG_ERROR,"MC_COOK not supported!\n");
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1235 return -1;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1236 break;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1237 default:
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1238 av_log(NULL,AV_LOG_ERROR,"Unknown Cook version, report sample!\n");
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1239 return -1;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1240 break;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1241 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1242
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1243 /* Initialize variable relations */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1244 q->mlt_size = q->samples_per_channel;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1245 q->numvector_size = (1 << q->numvector_bits);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1246
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1247 /* Generate tables */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1248 init_rootpow2table(q);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1249 init_pow2table(q);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1250 init_gain_table(q);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1251
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1252 if (init_cook_vlc_tables(q) != 0)
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1253 return -1;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1254
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1255 /* Pad the databuffer with FF_INPUT_BUFFER_PADDING_SIZE,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1256 this is for the bitstreamreader. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1257 if ((q->decoded_bytes_buffer = av_mallocz((avctx->block_align+(4-avctx->block_align%4) + FF_INPUT_BUFFER_PADDING_SIZE)*sizeof(uint8_t))) == NULL)
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1258 return -1;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1259
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1260 q->decode_buf_ptr[0] = q->decode_buffer_1;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1261 q->decode_buf_ptr[1] = q->decode_buffer_2;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1262 q->decode_buf_ptr[2] = q->decode_buffer_3;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1263 q->decode_buf_ptr[3] = q->decode_buffer_4;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1264
3014
959b8ad880dc Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents: 3009
diff changeset
1265 q->decode_buf_ptr2[0] = q->decode_buffer_3;
959b8ad880dc Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents: 3009
diff changeset
1266 q->decode_buf_ptr2[1] = q->decode_buffer_4;
959b8ad880dc Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents: 3009
diff changeset
1267
2956
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1268 q->previous_buffer_ptr[0] = q->mono_previous_buffer1;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1269 q->previous_buffer_ptr[1] = q->mono_previous_buffer2;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1270
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1271 /* Initialize transform. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1272 if ( init_cook_mlt(q) == 0 )
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1273 return -1;
3014
959b8ad880dc Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents: 3009
diff changeset
1274
959b8ad880dc Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents: 3009
diff changeset
1275 /* Try to catch some obviously faulty streams, othervise it might be exploitable */
959b8ad880dc Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents: 3009
diff changeset
1276 if (q->total_subbands > 53) {
959b8ad880dc Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents: 3009
diff changeset
1277 av_log(NULL,AV_LOG_ERROR,"total_subbands > 53, report sample!\n");
959b8ad880dc Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents: 3009
diff changeset
1278 return -1;
959b8ad880dc Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents: 3009
diff changeset
1279 }
959b8ad880dc Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents: 3009
diff changeset
1280 if (((q->subbands > 34) || (q->js_subband_start > 19)) && (q->joint_stereo)) {
959b8ad880dc Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents: 3009
diff changeset
1281 av_log(NULL,AV_LOG_ERROR,"subbands > 34 or js_subband_start > 19, report sample!\n");
959b8ad880dc Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents: 3009
diff changeset
1282 return -1;
959b8ad880dc Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents: 3009
diff changeset
1283 }
959b8ad880dc Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents: 3009
diff changeset
1284 if (q->subbands > 50) {
959b8ad880dc Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents: 3009
diff changeset
1285 av_log(NULL,AV_LOG_ERROR,"subbands > 50, report sample!\n");
959b8ad880dc Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents: 3009
diff changeset
1286 return -1;
959b8ad880dc Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents: 3009
diff changeset
1287 }
959b8ad880dc Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents: 3009
diff changeset
1288
3009
f5898b9b8a8a Fix an out of array access and some minor cleanup of the code.
diego
parents: 2959
diff changeset
1289 #ifdef COOKDEBUG
f5898b9b8a8a Fix an out of array access and some minor cleanup of the code.
diego
parents: 2959
diff changeset
1290 dump_cook_context(q,e);
f5898b9b8a8a Fix an out of array access and some minor cleanup of the code.
diego
parents: 2959
diff changeset
1291 #endif
2956
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1292 return 0;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1293 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1294
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1295
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1296 AVCodec cook_decoder =
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1297 {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1298 .name = "cook",
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1299 .type = CODEC_TYPE_AUDIO,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1300 .id = CODEC_ID_COOK,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1301 .priv_data_size = sizeof(COOKContext),
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1302 .init = cook_decode_init,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1303 .close = cook_decode_close,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1304 .decode = cook_decode_frame,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1305 };