annotate cook.c @ 4443:54bed3ee58f3 libavcodec

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