annotate cook.c @ 2956:5f51b1e0bed6 libavcodec

Cook compatibe decoder, patch by Benjamin Larsson Add cook demucing, change rm demuxer so that it reorders audio packets before sending them to the decoder, and send minimum decodeable sized packets; pass only real codec extradata fo the decoder Fix 28_8 decoder for the new demuxer strategy
author rtognimp
date Fri, 09 Dec 2005 16:08:18 +0000
parents
children 24805f4d1b84
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_copy;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
117 COOKgain gain_current;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
118 COOKgain gain_now;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
119 COOKgain gain_previous;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
120
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
121 /* VLC data */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
122 int js_vlc_bits;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
123 VLC envelope_quant_index[13];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
124 VLC sqvh[7]; //scalar quantization
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
125 VLC ccpl; //channel coupling
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
126
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
127 /* generatable tables and related variables */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
128 int gain_size_factor;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
129 float gain_table[23];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
130 float pow2tab[127];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
131 float rootpow2tab[127];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
132
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
133 /* data buffers */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
134 uint8_t* frame_reorder_buffer;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
135 int* frame_reorder_index;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
136 int frame_reorder_counter;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
137 int frame_reorder_complete;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
138 int frame_reorder_index_size;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
139
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
140 uint8_t* decoded_bytes_buffer;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
141 float mono_mdct_output[2048] __attribute__((aligned(16)));
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
142 float* previous_buffer_ptr[2];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
143 float mono_previous_buffer1[1024];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
144 float mono_previous_buffer2[1024];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
145 float* decode_buf_ptr[4];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
146 float decode_buffer_1[1024];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
147 float decode_buffer_2[1024];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
148 float decode_buffer_3[1024];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
149 float decode_buffer_4[1024];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
150 } COOKContext;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
151
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
152 /* debug functions */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
153
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
154 #ifdef COOKDEBUG
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
155 static void dump_float_table(float* table, int size, int delimiter) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
156 int i=0;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
157 av_log(NULL,AV_LOG_ERROR,"\n[%d]: ",i);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
158 for (i=0 ; i<size ; i++) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
159 av_log(NULL, AV_LOG_ERROR, "%5.1f, ", table[i]);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
160 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
161 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
162 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
163
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
164 static void dump_int_table(int* table, int size, int delimiter) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
165 int i=0;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
166 av_log(NULL,AV_LOG_ERROR,"\n[%d]: ",i);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
167 for (i=0 ; i<size ; i++) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
168 av_log(NULL, AV_LOG_ERROR, "%d, ", table[i]);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
169 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
170 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
171 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
172
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
173 static void dump_short_table(short* table, int size, int delimiter) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
174 int i=0;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
175 av_log(NULL,AV_LOG_ERROR,"\n[%d]: ",i);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
176 for (i=0 ; i<size ; i++) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
177 av_log(NULL, AV_LOG_ERROR, "%d, ", table[i]);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
178 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
179 }
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
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
182 #endif
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
183
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
184 /*************** init functions ***************/
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
185
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
186 /* table generator */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
187 static void init_pow2table(COOKContext *q){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
188 int i;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
189 q->pow2tab[63] = 1.0;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
190 for (i=1 ; i<64 ; i++){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
191 q->pow2tab[63+i]=(float)pow(2.0,(double)i);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
192 q->pow2tab[63-i]=1.0/(float)pow(2.0,(double)i);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
193 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
194 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
195
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
196 /* table generator */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
197 static void init_rootpow2table(COOKContext *q){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
198 int i;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
199 q->rootpow2tab[63] = 1.0;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
200 for (i=1 ; i<64 ; i++){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
201 q->rootpow2tab[63+i]=sqrt((float)powf(2.0,(float)i));
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
202 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
203 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
204 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
205
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
206 /* table generator */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
207 static void init_gain_table(COOKContext *q) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
208 int i;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
209 q->gain_size_factor = q->samples_per_channel/8;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
210 for (i=0 ; i<23 ; i++) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
211 q->gain_table[i] = pow((double)q->pow2tab[i+52] ,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
212 (1.0/(double)q->gain_size_factor));
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 memset(&q->gain_copy, 0, sizeof(COOKgain));
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
215 memset(&q->gain_current, 0, sizeof(COOKgain));
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
216 memset(&q->gain_now, 0, sizeof(COOKgain));
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
217 memset(&q->gain_previous, 0, sizeof(COOKgain));
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
218 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
219
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
220
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
221 static int init_cook_vlc_tables(COOKContext *q) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
222 int i, result;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
223
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
224 result = 0;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
225 for (i=0 ; i<13 ; i++) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
226 result &= init_vlc (&q->envelope_quant_index[i], 9, 24,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
227 envelope_quant_index_huffbits[i], 1, 1,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
228 envelope_quant_index_huffcodes[i], 2, 2, 0);
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 av_log(NULL,AV_LOG_DEBUG,"sqvh VLC init\n");
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
231 for (i=0 ; i<7 ; i++) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
232 result &= init_vlc (&q->sqvh[i], vhvlcsize_tab[i], vhsize_tab[i],
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
233 cvh_huffbits[i], 1, 1,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
234 cvh_huffcodes[i], 2, 2, 0);
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 if (q->nb_channels==2 && q->joint_stereo==1){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
238 result &= init_vlc (&q->ccpl, 6, (1<<q->js_vlc_bits)-1,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
239 ccpl_huffbits[q->js_vlc_bits-2], 1, 1,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
240 ccpl_huffcodes[q->js_vlc_bits-2], 2, 2, 0);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
241 av_log(NULL,AV_LOG_DEBUG,"Joint-stereo VLC used.\n");
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
242 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
243
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
244 av_log(NULL,AV_LOG_DEBUG,"VLC tables initialized.\n");
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
245 return result;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
246 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
247
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
248 static int init_cook_mlt(COOKContext *q) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
249 int j;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
250 float alpha;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
251
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
252 /* Allocate the buffers, could be replaced with a static [512]
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
253 array if needed. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
254 q->mlt_size = q->samples_per_channel;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
255 q->mlt_window = av_malloc(sizeof(float)*q->mlt_size);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
256 q->mlt_precos = av_malloc(sizeof(float)*q->mlt_size/2);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
257 q->mlt_presin = av_malloc(sizeof(float)*q->mlt_size/2);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
258 q->mlt_postcos = av_malloc(sizeof(float)*q->mlt_size/2);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
259
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
260 /* Initialize the MLT window: simple sine window. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
261 alpha = M_PI / (2.0 * (float)q->mlt_size);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
262 for(j=0 ; j<q->mlt_size ; j++) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
263 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
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 /* pre/post twiddle factors */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
267 for (j=0 ; j<q->mlt_size/2 ; j++){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
268 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
269 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
270 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
271 }
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 /* Initialize the FFT. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
274 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
275 av_log(NULL,AV_LOG_DEBUG,"FFT initialized, order = %d.\n",
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
276 av_log2(q->samples_per_channel)-1);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
277
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
278 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
279 }
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 /*************** init functions end ***********/
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
282
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
283 /**
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
284 * Cook indata decoding, every 32 bits are XORed with 0x37c511f2.
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
285 * Why? No idea, some checksum/error detection method maybe.
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
286 * Nice way to waste CPU cycles.
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
287 *
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
288 * @param in pointer to 32bit array of indata
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
289 * @param bits amount of bits
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
290 * @param out pointer to 32bit array of outdata
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
291 */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
292
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
293 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
294 int i;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
295 uint32_t* buf = (uint32_t*) inbuffer;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
296 uint32_t* obuf = (uint32_t*) out;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
297 /* 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
298 * I'm too lazy though, should be something like
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
299 * for(i=0 ; i<bitamount/64 ; i++)
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
300 * (int64_t)out[i] = 0x37c511f237c511f2^be2me_64(int64_t)in[i]);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
301 * Buffer alignment needs to be checked. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
302
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 for(i=0 ; i<bytes/4 ; i++){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
305 #ifdef WORDS_BIGENDIAN
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
306 obuf[i] = 0x37c511f2^buf[i];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
307 #else
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
308 obuf[i] = 0xf211c537^buf[i];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
309 #endif
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
310 }
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
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
313 /**
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
314 * Cook uninit
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
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
317 static int cook_decode_close(AVCodecContext *avctx)
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
318 {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
319 int i;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
320 COOKContext *q = avctx->priv_data;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
321 av_log(NULL,AV_LOG_DEBUG, "Deallocating memory.\n");
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 allocated memory buffers. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
324 av_free(q->mlt_window);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
325 av_free(q->mlt_precos);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
326 av_free(q->mlt_presin);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
327 av_free(q->mlt_postcos);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
328 av_free(q->frame_reorder_index);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
329 av_free(q->frame_reorder_buffer);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
330 av_free(q->decoded_bytes_buffer);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
331
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
332 /* Free the transform. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
333 ff_fft_end(&q->fft_ctx);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
334
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
335 /* Free the VLC tables. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
336 for (i=0 ; i<13 ; i++) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
337 free_vlc(&q->envelope_quant_index[i]);
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 for (i=0 ; i<7 ; i++) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
340 free_vlc(&q->sqvh[i]);
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 if(q->nb_channels==2 && q->joint_stereo==1 ){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
343 free_vlc(&q->ccpl);
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
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
346 av_log(NULL,AV_LOG_DEBUG,"Memory deallocated.\n");
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 return 0;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
349 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
350
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 * Fill the COOKgain structure for the timedomain quantization.
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 * @param q pointer to the COOKContext
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
355 * @param gaininfo pointer to the COOKgain
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
356 */
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 static void decode_gain_info(GetBitContext *gb, COOKgain* gaininfo) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
359 int i;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
360
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
361 while (get_bits1(gb)) {}
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
362
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
363 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
364
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
365 if (get_bits_count(gb) - 1 <= 0) return;
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 for (i=0 ; i<gaininfo->size ; i++){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
368 gaininfo->qidx_table1[i] = get_bits(gb,3);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
369 if (get_bits1(gb)) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
370 gaininfo->qidx_table2[i] = get_bits(gb,4) - 7; //convert to signed
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
371 } else {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
372 gaininfo->qidx_table2[i] = -1;
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 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
376
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
377 /**
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
378 * Create the quant index table needed for the envelope.
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
379 *
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
380 * @param q pointer to the COOKContext
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
381 * @param quant_index_table pointer to the array
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
382 */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
383
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
384 static void decode_envelope(COOKContext *q, int* quant_index_table) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
385 int i,j, vlc_index;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
386 int bitbias;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
387
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
388 bitbias = get_bits_count(&q->gb);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
389 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
390
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
391 for (i=1 ; i < q->total_subbands ; i++){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
392 vlc_index=i;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
393 if (i >= q->js_subband_start * 2) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
394 vlc_index-=q->js_subband_start;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
395 } else {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
396 vlc_index/=2;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
397 if(vlc_index < 1) vlc_index = 1;
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 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
400
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
401 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
402 q->envelope_quant_index[vlc_index-1].bits,2);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
403 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
404 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
405 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
406
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 * Create the quant value table.
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
409 *
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
410 * @param q pointer to the COOKContext
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
411 * @param quant_value_table pointer to the array
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 static void inline dequant_envelope(COOKContext *q, int* quant_index_table,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
415 float* quant_value_table){
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 int i;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
418 for(i=0 ; i < q->total_subbands ; i++){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
419 quant_value_table[i] = q->rootpow2tab[quant_index_table[i]+63];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
420 }
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 /**
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
424 * Calculate the category and category_index vector.
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
425 *
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
426 * @param q pointer to the COOKContext
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
427 * @param quant_index_table pointer to the array
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
428 * @param category pointer to the category array
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
429 * @param category_index pointer to the category_index array
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
430 */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
431
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
432 static void categorize(COOKContext *q, int* quant_index_table,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
433 int* category, int* category_index){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
434 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
435 int exp_index2[102];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
436 int exp_index1[102];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
437
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
438 int tmp_categorize_array1[128];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
439 int tmp_categorize_array1_idx=0;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
440 int tmp_categorize_array2[128];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
441 int tmp_categorize_array2_idx=0;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
442 int category_index_size=0;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
443
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
444 bits_left = q->bits_per_subpacket - get_bits_count(&q->gb);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
445
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
446 if(bits_left > q->samples_per_channel) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
447 bits_left = q->samples_per_channel +
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
448 ((bits_left - q->samples_per_channel)*5)/8;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
449 //av_log(NULL, AV_LOG_ERROR, "bits_left = %d\n",bits_left);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
450 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
451
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
452 memset(&exp_index1,0,102*sizeof(int));
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
453 memset(&exp_index2,0,102*sizeof(int));
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
454 memset(&tmp_categorize_array1,0,128*sizeof(int));
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
455 memset(&tmp_categorize_array2,0,128*sizeof(int));
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
456
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
457 bias=-32;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
458
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
459 /* Estimate bias. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
460 for (i=32 ; i>0 ; i=i/2){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
461 num_bits = 0;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
462 index = 0;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
463 for (j=q->total_subbands ; j>0 ; j--){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
464 exp_idx = (i - quant_index_table[index] + bias) / 2;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
465 if (exp_idx<0){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
466 exp_idx=0;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
467 } else if(exp_idx >7) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
468 exp_idx=7;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
469 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
470 index++;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
471 num_bits+=expbits_tab[exp_idx];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
472 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
473 if(num_bits >= bits_left - 32){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
474 bias+=i;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
475 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
476 }
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 /* Calculate total number of bits. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
479 num_bits=0;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
480 for (i=0 ; i<q->total_subbands ; i++) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
481 exp_idx = (bias - quant_index_table[i]) / 2;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
482 if (exp_idx<0) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
483 exp_idx=0;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
484 } else if(exp_idx >7) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
485 exp_idx=7;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
486 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
487 num_bits += expbits_tab[exp_idx];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
488 exp_index1[i] = exp_idx;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
489 exp_index2[i] = exp_idx;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
490 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
491 tmpbias = bias = num_bits;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
492
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
493 for (j = 1 ; j < q->numvector_size ; j++) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
494 if (tmpbias + bias > 2*bits_left) { /* ---> */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
495 int max = -999999;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
496 index=-1;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
497 for (i=0 ; i<q->total_subbands ; i++){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
498 if (exp_index1[i] < 7) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
499 v = (-2*exp_index1[i]) - quant_index_table[i] - 32;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
500 if ( v >= max) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
501 max = v;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
502 index = i;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
503 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
504 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
505 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
506 if(index==-1)break;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
507 tmp_categorize_array1[tmp_categorize_array1_idx++] = index;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
508 tmpbias -= expbits_tab[exp_index1[index]] -
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
509 expbits_tab[exp_index1[index]+1];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
510 ++exp_index1[index];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
511 } else { /* <--- */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
512 int min = 999999;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
513 index=-1;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
514 for (i=0 ; i<q->total_subbands ; i++){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
515 if(exp_index2[i] > 0){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
516 v = (-2*exp_index2[i])-quant_index_table[i];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
517 if ( v < min) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
518 min = v;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
519 index = i;
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 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
523 if(index == -1)break;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
524 tmp_categorize_array2[tmp_categorize_array2_idx++] = index;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
525 tmpbias -= expbits_tab[exp_index2[index]] -
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
526 expbits_tab[exp_index2[index]-1];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
527 --exp_index2[index];
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 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
530
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
531 for(i=0 ; i<q->total_subbands ; i++)
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
532 category[i] = exp_index2[i];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
533
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
534 /* Concatenate the two arrays. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
535 for(i=tmp_categorize_array2_idx-1 ; i >= 0; i--)
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
536 category_index[category_index_size++] = tmp_categorize_array2[i];
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 for(i=0;i<tmp_categorize_array1_idx;i++)
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
539 category_index[category_index_size++ ] = tmp_categorize_array1[i];
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 /* 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
542 should fill the remaining bytes. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
543 for(i=category_index_size;i<q->numvector_size;i++)
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
544 category_index[i]=0;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
545
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
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
549 /**
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
550 * Expand the category vector.
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
551 *
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
552 * @param q pointer to the COOKContext
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
553 * @param category pointer to the category array
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
554 * @param category_index pointer to the category_index array
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 static void inline expand_category(COOKContext *q, int* category,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
558 int* category_index){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
559 int i;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
560 for(i=0 ; i<q->num_vectors ; i++){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
561 ++category[category_index[i]];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
562 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
563 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
564
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
565 /**
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
566 * The real requantization of the mltcoefs
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 * @param q pointer to the COOKContext
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
569 * @param index index
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
570 * @param band current subband
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
571 * @param quant_value_table pointer to the array
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
572 * @param subband_coef_index array of indexes to quant_centroid_tab
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
573 * @param subband_coef_noise use random noise instead of predetermined value
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
574 * @param mlt_buffer pointer to the mlt buffer
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
575 */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
576
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
577
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
578 static void scalar_dequant(COOKContext *q, int index, int band,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
579 float* quant_value_table, int* subband_coef_index,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
580 int* subband_coef_noise, float* mlt_buffer){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
581 int i;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
582 float f1;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
583
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
584 for(i=0 ; i<SUBBAND_SIZE ; i++) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
585 if (subband_coef_index[i]) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
586 if (subband_coef_noise[i]) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
587 f1 = -quant_centroid_tab[index][subband_coef_index[i]];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
588 } else {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
589 f1 = quant_centroid_tab[index][subband_coef_index[i]];
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 } else {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
592 /* noise coding if subband_coef_noise[i] == 0 */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
593 q->random_state = q->random_state * 214013 + 2531011; //typical RNG numbers
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
594 f1 = randsign[(q->random_state/0x1000000)&1] * dither_tab[index]; //>>31
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
595 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
596 mlt_buffer[band*20+ i] = f1 * quant_value_table[band];
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 /**
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
600 * Unpack the subband_coef_index and subband_coef_noise vectors.
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
601 *
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
602 * @param q pointer to the COOKContext
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
603 * @param category pointer to the category array
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
604 * @param subband_coef_index array of indexes to quant_centroid_tab
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
605 * @param subband_coef_noise use random noise instead of predetermined value
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
606 */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
607
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
608 static int unpack_SQVH(COOKContext *q, int category, int* subband_coef_index,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
609 int* subband_coef_noise) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
610 int i,j;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
611 int vlc, vd ,tmp, result;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
612 int ub;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
613 int cb;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
614
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
615 vd = vd_tab[category];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
616 result = 0;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
617 for(i=0 ; i<vpr_tab[category] ; i++){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
618 ub = get_bits_count(&q->gb);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
619 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
620 cb = get_bits_count(&q->gb);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
621 if (q->bits_per_subpacket < get_bits_count(&q->gb)){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
622 vlc = 0;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
623 result = 1;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
624 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
625 for(j=vd-1 ; j>=0 ; j--){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
626 tmp = (vlc * invradix_tab[category])/0x100000;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
627 subband_coef_index[vd*i+j] = vlc - tmp * (kmax_tab[category]+1);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
628 vlc = tmp;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
629 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
630 for(j=0 ; j<vd ; j++){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
631 if (subband_coef_index[i*vd + j]) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
632 if(get_bits_count(&q->gb) < q->bits_per_subpacket){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
633 subband_coef_noise[i*vd+j] = get_bits1(&q->gb);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
634 } else {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
635 result=1;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
636 subband_coef_noise[i*vd+j]=0;
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 } else {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
639 subband_coef_noise[i*vd+j]=0;
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 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
642 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
643 return result;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
644 }
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 * Fill the mlt_buffer with mlt coefficients.
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
649 *
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
650 * @param q pointer to the COOKContext
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
651 * @param category pointer to the category array
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
652 * @param quant_value_table pointer to the array
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
653 * @param mlt_buffer pointer to mlt coefficients
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
654 */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
655
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
656
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
657 static void decode_vectors(COOKContext* q, int* category,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
658 float* quant_value_table, float* mlt_buffer){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
659 /* A zero in this table means that the subband coefficient is
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
660 random noise coded. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
661 int subband_coef_noise[SUBBAND_SIZE];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
662 /* A zero in this table means that the subband coefficient is a
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
663 positive multiplicator. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
664 int subband_coef_index[SUBBAND_SIZE];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
665 int band, j;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
666 int index=0;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
667
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
668 for(band=0 ; band<q->total_subbands ; band++){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
669 index = category[band];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
670 if(category[band] < 7){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
671 if(unpack_SQVH(q, category[band], subband_coef_index, subband_coef_noise)){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
672 index=7;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
673 for(j=0 ; j<q->total_subbands ; j++) category[band+j]=7;
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 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
676 if(index==7) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
677 memset(subband_coef_index, 0, sizeof(subband_coef_index));
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
678 memset(subband_coef_noise, 0, sizeof(subband_coef_noise));
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 scalar_dequant(q, index, band, quant_value_table, subband_coef_index,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
681 subband_coef_noise, mlt_buffer);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
682 }
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 if(q->total_subbands*SUBBAND_SIZE >= q->samples_per_channel){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
685 return;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
686 }
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
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 * function for decoding mono data
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
692 *
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
693 * @param q pointer to the COOKContext
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
694 * @param mlt_buffer1 pointer to left channel mlt coefficients
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
695 * @param mlt_buffer2 pointer to right channel mlt coefficients
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
696 */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
697
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
698 static void mono_decode(COOKContext *q, float* mlt_buffer) {
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 int category_index[128];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
701 float quant_value_table[102];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
702 int quant_index_table[102];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
703 int category[128];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
704
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
705 memset(&category, 0, 128*sizeof(int));
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
706 memset(&quant_value_table, 0, 102*sizeof(int));
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
707 memset(&category_index, 0, 128*sizeof(int));
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 decode_envelope(q, quant_index_table);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
710 q->num_vectors = get_bits(&q->gb,q->numvector_bits);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
711 dequant_envelope(q, quant_index_table, quant_value_table);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
712 categorize(q, quant_index_table, category, category_index);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
713 expand_category(q, category, category_index);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
714 decode_vectors(q, category, quant_value_table, mlt_buffer);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
715 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
716
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
717
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
718 /**
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
719 * The modulated lapped transform, this takes transform coefficients
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
720 * and transforms them into timedomain samples. This is done through
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
721 * an FFT-based algorithm with pre- and postrotation steps.
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
722 * A window and reorder step is also included.
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
723 *
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
724 * @param q pointer to the COOKContext
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
725 * @param inbuffer pointer to the mltcoefficients
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
726 * @param outbuffer pointer to the timedomain buffer
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
727 * @param mlt_tmp pointer to temporary storage space
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
728 */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
729
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
730 static void cook_imlt(COOKContext *q, float* inbuffer, float* outbuffer,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
731 float* mlt_tmp){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
732 int i;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
733
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
734 /* prerotation */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
735 for(i=0 ; i<q->mlt_size ; i+=2){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
736 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
737 (q->mlt_precos[i/2] * inbuffer[i]);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
738 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
739 (q->mlt_presin[i/2] * inbuffer[i]);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
740 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
741
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
742 /* FFT */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
743 ff_fft_permute(&q->fft_ctx, (FFTComplex *) outbuffer);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
744 ff_fft_calc (&q->fft_ctx, (FFTComplex *) outbuffer);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
745
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
746 /* postrotation */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
747 for(i=0 ; i<q->mlt_size ; i+=2){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
748 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
749 (q->mlt_postcos[i/2] * outbuffer[i]);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
750 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
751 (q->mlt_postcos[i/2] * outbuffer[i+1]);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
752 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
753
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
754 /* window and reorder */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
755 for(i=0 ; i<q->mlt_size/2 ; i++){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
756 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
757 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
758 q->mlt_window[q->mlt_size-1-i];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
759 outbuffer[q->mlt_size+i]= mlt_tmp[q->mlt_size/2+i] *
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
760 q->mlt_window[q->mlt_size-1-i];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
761 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
762 q->mlt_window[i]);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
763 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
764 }
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 /**
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
768 * the actual requantization of the timedomain samples
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
769 *
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
770 * @param q pointer to the COOKContext
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
771 * @param buffer pointer to the timedomain buffer
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
772 * @param gain_index index for the block multiplier
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
773 * @param gain_index_next index for the next block multiplier
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
774 */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
775
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
776 static void interpolate(COOKContext *q, float* buffer,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
777 int gain_index, int gain_index_next){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
778 int i;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
779 float fc1, fc2;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
780 fc1 = q->pow2tab[gain_index+63];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
781
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
782 if(gain_index == gain_index_next){ //static gain
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
783 for(i=0 ; i<q->gain_size_factor ; i++){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
784 buffer[i]*=fc1;
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 return;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
787 } else { //smooth gain
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
788 fc2 = q->gain_table[11 + (gain_index_next-gain_index)];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
789 for(i=0 ; i<q->gain_size_factor ; i++){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
790 buffer[i]*=fc1;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
791 fc1*=fc2;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
792 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
793 return;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
794 }
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 /**
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
798 * timedomain requantization of the timedomain samples
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
799 *
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
800 * @param q pointer to the COOKContext
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
801 * @param buffer pointer to the timedomain buffer
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
802 * @param gain_now current gain structure
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
803 * @param gain_previous previous gain structure
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
804 */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
805
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
806 static void gain_window(COOKContext *q, float* buffer, COOKgain* gain_now,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
807 COOKgain* gain_previous){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
808 int i, index;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
809 int gain_index[9];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
810 int tmp_gain_index;
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 gain_index[8]=0;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
813 index = gain_previous->size;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
814 for (i=7 ; i>=0 ; i--) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
815 if(index && gain_previous->qidx_table1[index-1]==i) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
816 gain_index[i] = gain_previous->qidx_table2[index-1];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
817 index--;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
818 } else {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
819 gain_index[i]=gain_index[i+1];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
820 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
821 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
822 /* This is applied to the to be previous data buffer. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
823 for(i=0;i<8;i++){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
824 interpolate(q, &buffer[q->samples_per_channel+q->gain_size_factor*i],
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
825 gain_index[i], gain_index[i+1]);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
826 }
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 tmp_gain_index = gain_index[0];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
829 index = gain_now->size;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
830 for (i=7 ; i>=0 ; i--) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
831 if(index && gain_now->qidx_table1[index-1]==i) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
832 gain_index[i]= gain_now->qidx_table2[index-1];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
833 index--;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
834 } else {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
835 gain_index[i]=gain_index[i+1];
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 /* This is applied to the to be current block. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
840 for(i=0;i<8;i++){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
841 interpolate(q, &buffer[i*q->gain_size_factor],
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
842 tmp_gain_index+gain_index[i],
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
843 tmp_gain_index+gain_index[i+1]);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
844 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
845 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
846
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 * mlt overlapping and buffer management
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
850 *
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
851 * @param q pointer to the COOKContext
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
852 * @param buffer pointer to the timedomain buffer
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
853 * @param gain_now current gain structure
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
854 * @param gain_previous previous gain structure
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
855 * @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
856 *
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
857 */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
858
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
859 static void gain_compensate(COOKContext *q, float* buffer, COOKgain* gain_now,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
860 COOKgain* gain_previous, float* previous_buffer) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
861 int i;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
862 if((gain_now->size || gain_previous->size)) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
863 gain_window(q, buffer, gain_now, gain_previous);
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 /* Overlap with the previous block. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
867 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
868
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
869 /* Save away the current to be previous block. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
870 memcpy(previous_buffer, buffer+q->samples_per_channel,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
871 sizeof(float)*q->samples_per_channel);
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
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
875 /**
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
876 * function for getting the jointstereo coupling information
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
877 *
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
878 * @param q pointer to the COOKContext
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
879 * @param decouple_tab decoupling array
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
880 *
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
881 */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
882
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
883 static void decouple_info(COOKContext *q, int* decouple_tab){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
884 int length, i;
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 if(get_bits1(&q->gb)) {
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_vlc2(&q->gb, q->ccpl.table, q->ccpl.bits, 2);
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 if(cplband[q->js_subband_start] > cplband[q->subbands-1]) return;
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 length = cplband[q->subbands-1] - cplband[q->js_subband_start] + 1;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
899 for (i=0 ; i<length ; i++) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
900 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
901 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
902 return;
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
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
906 /**
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
907 * function for decoding joint stereo data
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
908 *
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
909 * @param q pointer to the COOKContext
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
910 * @param mlt_buffer1 pointer to left channel mlt coefficients
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
911 * @param mlt_buffer2 pointer to right channel mlt coefficients
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
912 */
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 static void joint_decode(COOKContext *q, float* mlt_buffer1,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
915 float* mlt_buffer2) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
916 int i,j;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
917 int decouple_tab[SUBBAND_SIZE];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
918 float decode_buffer[2048]; //Only 1060 might be needed.
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
919 int idx, cpl_tmp,tmp_idx;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
920 float f1,f2;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
921 float* cplscale;
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 memset(decouple_tab, 0, sizeof(decouple_tab));
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
924 memset(decode_buffer, 0, sizeof(decode_buffer));
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
925
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
926 /* Make sure the buffers are zeroed out. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
927 memset(mlt_buffer1,0, 1024*sizeof(float));
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
928 memset(mlt_buffer2,0, 1024*sizeof(float));
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
929 decouple_info(q, decouple_tab);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
930 mono_decode(q, decode_buffer);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
931
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
932 /* The two channels are stored interleaved in decode_buffer. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
933 for (i=0 ; i<q->js_subband_start ; i++) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
934 for (j=0 ; j<SUBBAND_SIZE ; j++) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
935 mlt_buffer1[i*20+j] = decode_buffer[i*40+j];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
936 mlt_buffer2[i*20+j] = decode_buffer[i*40+20+j];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
937 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
938 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
939
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
940 /* When we reach js_subband_start (the higher frequencies)
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
941 the coefficients are stored in a coupling scheme. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
942 idx = (1 << q->js_vlc_bits) - 1;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
943 if (q->js_subband_start < q->subbands) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
944 for (i=0 ; i<q->subbands ; i++) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
945 cpl_tmp = cplband[i + q->js_subband_start];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
946 idx -=decouple_tab[cpl_tmp];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
947 cplscale = (float*)cplscales[q->js_vlc_bits-2]; //choose decoupler table
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
948 f1 = cplscale[decouple_tab[cpl_tmp]];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
949 f2 = cplscale[idx-1];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
950 for (j=0 ; j<SUBBAND_SIZE ; j++) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
951 tmp_idx = ((2*q->js_subband_start + i)*20)+j;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
952 mlt_buffer1[20*(i+q->js_subband_start) + j] = f1 * decode_buffer[tmp_idx];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
953 mlt_buffer2[20*(i+q->js_subband_start) + j] = f2 * decode_buffer[tmp_idx];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
954 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
955 idx = (1 << q->js_vlc_bits) - 1;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
956 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
957 }
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 * Cook subpacket decoding. This function returns one decoded subpacket,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
962 * usually 1024 samples per channel.
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
963 *
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
964 * @param q pointer to the COOKContext
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
965 * @param inbuffer pointer to the inbuffer
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
966 * @param sub_packet_size subpacket size
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
967 * @param outbuffer pointer to the outbuffer
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
968 * @param pos the subpacket number in the frame
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
969 */
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
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
972 static int decode_subpacket(COOKContext *q, uint8_t *inbuffer,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
973 int sub_packet_size, int16_t *outbuffer) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
974 int i,j;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
975 int value;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
976 float* tmp_ptr;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
977
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
978 /* packet dump */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
979 // for (i=0 ; i<sub_packet_size ; i++) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
980 // av_log(NULL, AV_LOG_ERROR, "%02x", inbuffer[i]);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
981 // }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
982 // av_log(NULL, AV_LOG_ERROR, "\n");
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
983
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
984 decode_bytes(inbuffer, q->decoded_bytes_buffer, sub_packet_size);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
985 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
986 decode_gain_info(&q->gb, &q->gain_current);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
987 memcpy(&q->gain_copy, &q->gain_current ,sizeof(COOKgain)); //This copy does not seem to be used. FIXME
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
988 //fprintf(stdout,"cu bits ds = %d\n",get_bits_count(&q->gb));
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
989 if(q->nb_channels==2 && q->joint_stereo==1){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
990 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
991
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
992 /* Swap buffer pointers. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
993 tmp_ptr = q->decode_buf_ptr[1];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
994 q->decode_buf_ptr[1] = q->decode_buf_ptr[0];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
995 q->decode_buf_ptr[0] = tmp_ptr;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
996 tmp_ptr = q->decode_buf_ptr[3];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
997 q->decode_buf_ptr[3] = q->decode_buf_ptr[2];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
998 q->decode_buf_ptr[2] = tmp_ptr;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
999
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1000 /* FIXME: Rethink the gainbuffer handling, maybe a rename?
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1001 now/previous swap */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1002 q->gain_now_ptr = &q->gain_now;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1003 q->gain_previous_ptr = &q->gain_previous;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1004 for (i=0 ; i<q->nb_channels ; i++){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1005
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1006 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
1007 gain_compensate(q, q->mono_mdct_output, q->gain_now_ptr,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1008 q->gain_previous_ptr, q->previous_buffer_ptr[0]);
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 /* Swap out the previous buffer. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1011 tmp_ptr = q->previous_buffer_ptr[0];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1012 q->previous_buffer_ptr[0] = q->previous_buffer_ptr[1];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1013 q->previous_buffer_ptr[1] = tmp_ptr;
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 /* Clip and convert the floats to 16 bits. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1016 for (j=0 ; j<q->samples_per_frame ; j++){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1017 value = lrintf(q->mono_mdct_output[j]);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1018 if(value < -32768) value = -32768;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1019 else if(value > 32767) value = 32767;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1020 outbuffer[2*j+i] = value;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1021 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1022 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1023
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1024 memcpy(&q->gain_now, &q->gain_previous, sizeof(COOKgain));
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1025 memcpy(&q->gain_previous, &q->gain_current, sizeof(COOKgain));
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1026
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1027 } else if (q->nb_channels==2 && q->joint_stereo==0) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1028 for (i=0 ; i<q->nb_channels ; i++){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1029 mono_decode(q, q->decode_buf_ptr[0]);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1030
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1031 av_log(NULL,AV_LOG_ERROR,"Non-joint-stereo files are not supported at the moment, do not report as a bug!\n");
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1032 tmp_ptr = q->decode_buf_ptr[0];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1033 q->decode_buf_ptr[0] = q->decode_buf_ptr[1];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1034 q->decode_buf_ptr[1] = q->decode_buf_ptr[2];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1035 q->decode_buf_ptr[2] = q->decode_buf_ptr[3];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1036 q->decode_buf_ptr[3] = tmp_ptr;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1037
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1038 q->gain_now_ptr = &q->gain_now;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1039 q->gain_previous_ptr = &q->gain_previous;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1040
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1041 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
1042 gain_compensate(q, q->mono_mdct_output, q->gain_now_ptr,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1043 q->gain_previous_ptr, q->previous_buffer_ptr[0]);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1044 /* Swap out the previous buffer. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1045 tmp_ptr = q->previous_buffer_ptr[0];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1046 q->previous_buffer_ptr[0] = q->previous_buffer_ptr[1];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1047 q->previous_buffer_ptr[1] = tmp_ptr;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1048
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1049 for (j=0 ; j<q->samples_per_frame ; j++){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1050 value = lrintf(q->mono_mdct_output[j]);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1051 if(value < -32768) value = -32768;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1052 else if(value > 32767) value = 32767;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1053 outbuffer[2*j+i] = value;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1054 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1055 memcpy(&q->gain_now, &q->gain_previous, sizeof(COOKgain));
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1056 memcpy(&q->gain_previous, &q->gain_current, sizeof(COOKgain));
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1057 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1058 } else {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1059 mono_decode(q, q->decode_buf_ptr[0]);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1060
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1061 /* Swap buffer pointers. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1062 tmp_ptr = q->decode_buf_ptr[1];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1063 q->decode_buf_ptr[1] = q->decode_buf_ptr[0];
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1064 q->decode_buf_ptr[0] = tmp_ptr;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1065
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1066 /* FIXME: Rethink the gainbuffer handling, maybe a rename?
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1067 now/previous swap */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1068 q->gain_now_ptr = &q->gain_now;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1069 q->gain_previous_ptr = &q->gain_previous;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1070
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1071 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
1072 gain_compensate(q, q->mono_mdct_output, q->gain_now_ptr,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1073 q->gain_previous_ptr, q->mono_previous_buffer1);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1074
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1075 /* Clip and convert the floats to 16 bits */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1076 for (j=0 ; j<q->samples_per_frame ; j++){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1077 value = lrintf(q->mono_mdct_output[j]);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1078 if(value < -32768) value = -32768;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1079 else if(value > 32767) value = 32767;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1080 outbuffer[j] = value;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1081 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1082 memcpy(&q->gain_now, &q->gain_previous, sizeof(COOKgain));
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1083 memcpy(&q->gain_previous, &q->gain_current, sizeof(COOKgain));
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1084 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1085 /* FIXME: Shouldn't the total number of bytes be returned? */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1086 return /*q->nb_channels*/ q->samples_per_frame * sizeof(int16_t);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1087 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1088
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 /**
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1091 * Cook frame decoding
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1092 *
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1093 * @param avctx pointer to the AVCodecContext
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1094 */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1095
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1096 static int cook_decode_frame(AVCodecContext *avctx,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1097 void *data, int *data_size,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1098 uint8_t *buf, int buf_size) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1099 /* This stuff is quite messy, the Cook packets are sent unordered
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1100 * and need to be ordered before they are sent to the rest of the
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1101 * decoder. The order can be found in the q->frame_reorder_index.
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1102 * Currently decoding of the last packets is not handled at
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1103 * all. FIXME */
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 COOKContext *q = avctx->priv_data;
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 if (buf_size < avctx->block_align)
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1108 return buf_size;
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 *data_size = decode_subpacket(q, buf, avctx->block_align, data);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1111
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1112 return avctx->block_align;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1113 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1114 #ifdef COOKDEBUG
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1115 static void dump_cook_context(COOKContext *q, COOKextradata *e)
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1116 {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1117 //int i=0;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1118 #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
1119 av_log(NULL,AV_LOG_ERROR,"COOKextradata\n");
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1120 av_log(NULL,AV_LOG_ERROR,"cookversion=%x\n",e->cookversion);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1121 if (e->cookversion > MONO_COOK2) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1122 PRINT("js_subband_start",e->js_subband_start);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1123 PRINT("js_vlc_bits",e->js_vlc_bits);
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 av_log(NULL,AV_LOG_ERROR,"COOKContext\n");
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1126 PRINT("nb_channels",q->nb_channels);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1127 PRINT("bit_rate",q->bit_rate);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1128 PRINT("sample_rate",q->sample_rate);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1129 PRINT("samples_per_channel",q->samples_per_channel);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1130 PRINT("samples_per_frame",q->samples_per_frame);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1131 PRINT("subbands",q->subbands);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1132 PRINT("random_state",q->random_state);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1133 PRINT("mlt_size",q->mlt_size);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1134 PRINT("js_subband_start",q->js_subband_start);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1135 PRINT("numvector_bits",q->numvector_bits);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1136 PRINT("numvector_size",q->numvector_size);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1137 PRINT("total_subbands",q->total_subbands);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1138 PRINT("frame_reorder_counter",q->frame_reorder_counter);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1139 PRINT("frame_reorder_index_size",q->frame_reorder_index_size);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1140 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1141 #endif
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1142 /**
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1143 * Cook initialization
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1144 *
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1145 * @param avctx pointer to the AVCodecContext
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
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1148 static int cook_decode_init(AVCodecContext *avctx)
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1149 {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1150 COOKextradata *e = avctx->extradata;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1151 COOKContext *q = avctx->priv_data;
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 /* Take care of the codec specific extradata. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1154 if (avctx->extradata_size <= 0) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1155 av_log(NULL,AV_LOG_ERROR,"Necessary extradata missing!\n");
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1156 return -1;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1157 } else {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1158 /* 8 for mono, 16 for stereo, ? for multichannel
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1159 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
1160 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
1161 if (avctx->extradata_size >= 8){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1162 e->cookversion = be2me_32(e->cookversion);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1163 e->samples_per_frame = be2me_16(e->samples_per_frame);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1164 e->subbands = be2me_16(e->subbands);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1165 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1166 if (avctx->extradata_size >= 16){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1167 e->js_subband_start = be2me_16(e->js_subband_start);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1168 e->js_vlc_bits = be2me_16(e->js_vlc_bits);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1169 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1170 }
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 /* Take data from the AVCodecContext (RM container). */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1173 q->sample_rate = avctx->sample_rate;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1174 q->nb_channels = avctx->channels;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1175 q->bit_rate = avctx->bit_rate;
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 /* Initialize state. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1178 q->random_state = 1;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1179
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1180 /* Initialize extradata related variables. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1181 q->samples_per_channel = e->samples_per_frame / q->nb_channels;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1182 q->samples_per_frame = e->samples_per_frame;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1183 q->subbands = e->subbands;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1184 q->bits_per_subpacket = avctx->block_align * 8;
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 default data states. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1187 q->js_subband_start = 0;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1188 q->numvector_bits = 5;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1189 q->total_subbands = q->subbands;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1190
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1191 /* Initialize version-dependent variables */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1192 av_log(NULL,AV_LOG_DEBUG,"e->cookversion=%x\n",e->cookversion);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1193 switch (e->cookversion) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1194 case MONO_COOK1:
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1195 if (q->nb_channels != 1) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1196 av_log(NULL,AV_LOG_ERROR,"Container channels != 1, report sample!\n");
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1197 return -1;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1198 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1199 av_log(NULL,AV_LOG_DEBUG,"MONO_COOK1\n");
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1200 break;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1201 case MONO_COOK2:
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1202 if (q->nb_channels != 1) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1203 q->joint_stereo = 0;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1204 av_log(NULL,AV_LOG_ERROR,"Non-joint-stereo files are not supported at the moment!\n");
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1205 return -1;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1206 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1207 av_log(NULL,AV_LOG_DEBUG,"MONO_COOK2\n");
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1208 break;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1209 case JOINT_STEREO:
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1210 if (q->nb_channels != 2) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1211 av_log(NULL,AV_LOG_ERROR,"Container channels != 2, report sample!\n");
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1212 return -1;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1213 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1214 av_log(NULL,AV_LOG_DEBUG,"JOINT_STEREO\n");
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1215 if (avctx->extradata_size >= 16){
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1216 q->total_subbands = q->subbands + e->js_subband_start;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1217 q->js_subband_start = e->js_subband_start;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1218 q->joint_stereo = 1;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1219 q->js_vlc_bits = e->js_vlc_bits;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1220 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1221 if (q->samples_per_channel > 256) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1222 q->numvector_bits++; // q->numvector_bits = 6
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1223 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1224 if (q->samples_per_channel > 512) {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1225 q->numvector_bits++; // q->numvector_bits = 7
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1226 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1227 break;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1228 case MC_COOK:
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1229 av_log(NULL,AV_LOG_ERROR,"MC_COOK not supported!\n");
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1230 return -1;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1231 break;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1232 default:
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1233 av_log(NULL,AV_LOG_ERROR,"Unknown Cook version, report sample!\n");
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1234 return -1;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1235 break;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1236 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1237
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1238 /* Initialize variable relations */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1239 q->mlt_size = q->samples_per_channel;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1240 q->numvector_size = (1 << q->numvector_bits);
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 /* Generate tables */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1243 init_rootpow2table(q);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1244 init_pow2table(q);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1245 init_gain_table(q);
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 if (init_cook_vlc_tables(q) != 0)
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1248 return -1;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1249
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1250 /* Pad the databuffer with FF_INPUT_BUFFER_PADDING_SIZE,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1251 this is for the bitstreamreader. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1252 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
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 q->decode_buf_ptr[0] = q->decode_buffer_1;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1256 q->decode_buf_ptr[1] = q->decode_buffer_2;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1257 q->decode_buf_ptr[2] = q->decode_buffer_3;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1258 q->decode_buf_ptr[3] = q->decode_buffer_4;
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->previous_buffer_ptr[0] = q->mono_previous_buffer1;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1261 q->previous_buffer_ptr[1] = q->mono_previous_buffer2;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1262
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1263 memset(q->decode_buffer_1,0,1024*sizeof(float));
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1264 memset(q->decode_buffer_2,0,1024*sizeof(float));
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1265 memset(q->decode_buffer_3,0,1024*sizeof(float));
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1266 memset(q->decode_buffer_4,0,1024*sizeof(float));
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1267
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1268 /* Initialize transform. */
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1269 if ( init_cook_mlt(q) == 0 )
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1270 return -1;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1271
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1272 //dump_cook_context(q,e);
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1273 return 0;
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1274 }
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1275
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1276
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1277 AVCodec cook_decoder =
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1278 {
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1279 .name = "cook",
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1280 .type = CODEC_TYPE_AUDIO,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1281 .id = CODEC_ID_COOK,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1282 .priv_data_size = sizeof(COOKContext),
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1283 .init = cook_decode_init,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1284 .close = cook_decode_close,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1285 .decode = cook_decode_frame,
5f51b1e0bed6 Cook compatibe decoder, patch by Benjamin Larsson
rtognimp
parents:
diff changeset
1286 };