annotate dca.c @ 5875:5a61e8e2f65c libavcodec

Remove libvorbis Vorbis decoding support. Our native decoder is complete and has no known bugs, any remaining issues will hopefully be uncovered now.
author diego
date Sun, 04 Nov 2007 12:55:32 +0000
parents abf90ea2c392
children ae05d6d12f12
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4599
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1 /*
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
2 * DCA compatible decoder
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
3 * Copyright (C) 2004 Gildas Bazin
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
4 * Copyright (C) 2004 Benjamin Zores
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
5 * Copyright (C) 2006 Benjamin Larsson
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
6 * Copyright (C) 2007 Konstantin Shishkov
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
7 *
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
8 * This file is part of FFmpeg.
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
9 *
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
10 * FFmpeg is free software; you can redistribute it and/or
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
11 * modify it under the terms of the GNU Lesser General Public
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
12 * License as published by the Free Software Foundation; either
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
13 * version 2.1 of the License, or (at your option) any later version.
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
14 *
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
15 * FFmpeg is distributed in the hope that it will be useful,
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
18 * Lesser General Public License for more details.
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
19 *
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
20 * You should have received a copy of the GNU Lesser General Public
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
21 * License along with FFmpeg; if not, write to the Free Software
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
23 */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
24
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
25 /**
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
26 * @file dca.c
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
27 */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
28
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
29 #include <math.h>
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
30 #include <stddef.h>
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
31 #include <stdio.h>
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
32
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
33 #include "avcodec.h"
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
34 #include "dsputil.h"
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
35 #include "bitstream.h"
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
36 #include "dcadata.h"
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
37 #include "dcahuff.h"
4899
e153b9ff47d3 Move dca parser to its own file.
diego
parents: 4895
diff changeset
38 #include "dca.h"
4599
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
39
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
40 //#define TRACE
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
41
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
42 #define DCA_PRIM_CHANNELS_MAX (5)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
43 #define DCA_SUBBANDS (32)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
44 #define DCA_ABITS_MAX (32) /* Should be 28 */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
45 #define DCA_SUBSUBFAMES_MAX (4)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
46 #define DCA_LFE_MAX (3)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
47
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
48 enum DCAMode {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
49 DCA_MONO = 0,
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
50 DCA_CHANNEL,
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
51 DCA_STEREO,
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
52 DCA_STEREO_SUMDIFF,
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
53 DCA_STEREO_TOTAL,
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
54 DCA_3F,
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
55 DCA_2F1R,
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
56 DCA_3F1R,
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
57 DCA_2F2R,
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
58 DCA_3F2R,
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
59 DCA_4F2R
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
60 };
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
61
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
62 #define DCA_DOLBY 101 /* FIXME */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
63
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
64 #define DCA_CHANNEL_BITS 6
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
65 #define DCA_CHANNEL_MASK 0x3F
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
66
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
67 #define DCA_LFE 0x80
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
68
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
69 #define HEADER_SIZE 14
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
70 #define CONVERT_BIAS 384
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
71
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
72 #define DCA_MAX_FRAME_SIZE 16383
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
73
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
74 /** Bit allocation */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
75 typedef struct {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
76 int offset; ///< code values offset
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
77 int maxbits[8]; ///< max bits in VLC
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
78 int wrap; ///< wrap for get_vlc2()
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
79 VLC vlc[8]; ///< actual codes
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
80 } BitAlloc;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
81
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
82 static BitAlloc dca_bitalloc_index; ///< indexes for samples VLC select
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
83 static BitAlloc dca_tmode; ///< transition mode VLCs
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
84 static BitAlloc dca_scalefactor; ///< scalefactor VLCs
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
85 static BitAlloc dca_smpl_bitalloc[11]; ///< samples VLCs
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
86
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
87 /** Pre-calculated cosine modulation coefs for the QMF */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
88 static float cos_mod[544];
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
89
4908
777f250df232 Fix multiple "¡Æinline/static¡Ç is not at beginning of declaration" warnings.
diego
parents: 4899
diff changeset
90 static av_always_inline int get_bitalloc(GetBitContext *gb, BitAlloc *ba, int idx)
4599
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
91 {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
92 return get_vlc2(gb, ba->vlc[idx].table, ba->vlc[idx].bits, ba->wrap) + ba->offset;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
93 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
94
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
95 typedef struct {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
96 AVCodecContext *avctx;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
97 /* Frame header */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
98 int frame_type; ///< type of the current frame
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
99 int samples_deficit; ///< deficit sample count
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
100 int crc_present; ///< crc is present in the bitstream
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
101 int sample_blocks; ///< number of PCM sample blocks
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
102 int frame_size; ///< primary frame byte size
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
103 int amode; ///< audio channels arrangement
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
104 int sample_rate; ///< audio sampling rate
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
105 int bit_rate; ///< transmission bit rate
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
106
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
107 int downmix; ///< embedded downmix enabled
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
108 int dynrange; ///< embedded dynamic range flag
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
109 int timestamp; ///< embedded time stamp flag
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
110 int aux_data; ///< auxiliary data flag
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
111 int hdcd; ///< source material is mastered in HDCD
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
112 int ext_descr; ///< extension audio descriptor flag
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
113 int ext_coding; ///< extended coding flag
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
114 int aspf; ///< audio sync word insertion flag
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
115 int lfe; ///< low frequency effects flag
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
116 int predictor_history; ///< predictor history flag
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
117 int header_crc; ///< header crc check bytes
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
118 int multirate_inter; ///< multirate interpolator switch
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
119 int version; ///< encoder software revision
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
120 int copy_history; ///< copy history
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
121 int source_pcm_res; ///< source pcm resolution
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
122 int front_sum; ///< front sum/difference flag
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
123 int surround_sum; ///< surround sum/difference flag
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
124 int dialog_norm; ///< dialog normalisation parameter
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
125
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
126 /* Primary audio coding header */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
127 int subframes; ///< number of subframes
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
128 int prim_channels; ///< number of primary audio channels
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
129 int subband_activity[DCA_PRIM_CHANNELS_MAX]; ///< subband activity count
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
130 int vq_start_subband[DCA_PRIM_CHANNELS_MAX]; ///< high frequency vq start subband
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
131 int joint_intensity[DCA_PRIM_CHANNELS_MAX]; ///< joint intensity coding index
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
132 int transient_huffman[DCA_PRIM_CHANNELS_MAX]; ///< transient mode code book
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
133 int scalefactor_huffman[DCA_PRIM_CHANNELS_MAX]; ///< scale factor code book
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
134 int bitalloc_huffman[DCA_PRIM_CHANNELS_MAX]; ///< bit allocation quantizer select
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
135 int quant_index_huffman[DCA_PRIM_CHANNELS_MAX][DCA_ABITS_MAX]; ///< quantization index codebook select
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
136 float scalefactor_adj[DCA_PRIM_CHANNELS_MAX][DCA_ABITS_MAX]; ///< scale factor adjustment
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
137
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
138 /* Primary audio coding side information */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
139 int subsubframes; ///< number of subsubframes
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
140 int partial_samples; ///< partial subsubframe samples count
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
141 int prediction_mode[DCA_PRIM_CHANNELS_MAX][DCA_SUBBANDS]; ///< prediction mode (ADPCM used or not)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
142 int prediction_vq[DCA_PRIM_CHANNELS_MAX][DCA_SUBBANDS]; ///< prediction VQ coefs
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
143 int bitalloc[DCA_PRIM_CHANNELS_MAX][DCA_SUBBANDS]; ///< bit allocation index
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
144 int transition_mode[DCA_PRIM_CHANNELS_MAX][DCA_SUBBANDS]; ///< transition mode (transients)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
145 int scale_factor[DCA_PRIM_CHANNELS_MAX][DCA_SUBBANDS][2]; ///< scale factors (2 if transient)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
146 int joint_huff[DCA_PRIM_CHANNELS_MAX]; ///< joint subband scale factors codebook
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
147 int joint_scale_factor[DCA_PRIM_CHANNELS_MAX][DCA_SUBBANDS]; ///< joint subband scale factors
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
148 int downmix_coef[DCA_PRIM_CHANNELS_MAX][2]; ///< stereo downmix coefficients
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
149 int dynrange_coef; ///< dynamic range coefficient
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
150
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
151 int high_freq_vq[DCA_PRIM_CHANNELS_MAX][DCA_SUBBANDS]; ///< VQ encoded high frequency subbands
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
152
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
153 float lfe_data[2 * DCA_SUBSUBFAMES_MAX * DCA_LFE_MAX *
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
154 2 /*history */ ]; ///< Low frequency effect data
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
155 int lfe_scale_factor;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
156
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
157 /* Subband samples history (for ADPCM) */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
158 float subband_samples_hist[DCA_PRIM_CHANNELS_MAX][DCA_SUBBANDS][4];
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
159 float subband_fir_hist[DCA_PRIM_CHANNELS_MAX][512];
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
160 float subband_fir_noidea[DCA_PRIM_CHANNELS_MAX][64];
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
161
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
162 int output; ///< type of output
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
163 int bias; ///< output bias
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
164
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
165 DECLARE_ALIGNED_16(float, samples[1536]); /* 6 * 256 = 1536, might only need 5 */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
166 DECLARE_ALIGNED_16(int16_t, tsamples[1536]);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
167
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
168 uint8_t dca_buffer[DCA_MAX_FRAME_SIZE];
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
169 int dca_buffer_size; ///< how much data is in the dca_buffer
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
170
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
171 GetBitContext gb;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
172 /* Current position in DCA frame */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
173 int current_subframe;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
174 int current_subsubframe;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
175
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
176 int debug_flag; ///< used for suppressing repeated error messages output
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
177 DSPContext dsp;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
178 } DCAContext;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
179
4783
011fb289e3b0 changes some function declarations from () to (void) as per ansi c.
gpoirier
parents: 4599
diff changeset
180 static void dca_init_vlcs(void)
4599
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
181 {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
182 static int vlcs_inited = 0;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
183 int i, j;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
184
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
185 if (vlcs_inited)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
186 return;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
187
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
188 dca_bitalloc_index.offset = 1;
5070
b2b6d7f4cda4 fix dca_bitalloc_index decoder init
kostya
parents: 5069
diff changeset
189 dca_bitalloc_index.wrap = 2;
4599
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
190 for (i = 0; i < 5; i++)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
191 init_vlc(&dca_bitalloc_index.vlc[i], bitalloc_12_vlc_bits[i], 12,
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
192 bitalloc_12_bits[i], 1, 1,
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
193 bitalloc_12_codes[i], 2, 2, 1);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
194 dca_scalefactor.offset = -64;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
195 dca_scalefactor.wrap = 2;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
196 for (i = 0; i < 5; i++)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
197 init_vlc(&dca_scalefactor.vlc[i], SCALES_VLC_BITS, 129,
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
198 scales_bits[i], 1, 1,
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
199 scales_codes[i], 2, 2, 1);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
200 dca_tmode.offset = 0;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
201 dca_tmode.wrap = 1;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
202 for (i = 0; i < 4; i++)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
203 init_vlc(&dca_tmode.vlc[i], tmode_vlc_bits[i], 4,
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
204 tmode_bits[i], 1, 1,
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
205 tmode_codes[i], 2, 2, 1);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
206
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
207 for(i = 0; i < 10; i++)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
208 for(j = 0; j < 7; j++){
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
209 if(!bitalloc_codes[i][j]) break;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
210 dca_smpl_bitalloc[i+1].offset = bitalloc_offsets[i];
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
211 dca_smpl_bitalloc[i+1].wrap = 1 + (j > 4);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
212 init_vlc(&dca_smpl_bitalloc[i+1].vlc[j], bitalloc_maxbits[i][j],
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
213 bitalloc_sizes[i],
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
214 bitalloc_bits[i][j], 1, 1,
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
215 bitalloc_codes[i][j], 2, 2, 1);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
216 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
217 vlcs_inited = 1;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
218 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
219
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
220 static inline void get_array(GetBitContext *gb, int *dst, int len, int bits)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
221 {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
222 while(len--)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
223 *dst++ = get_bits(gb, bits);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
224 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
225
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
226 static int dca_parse_frame_header(DCAContext * s)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
227 {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
228 int i, j;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
229 static const float adj_table[4] = { 1.0, 1.1250, 1.2500, 1.4375 };
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
230 static const int bitlen[11] = { 0, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3 };
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
231 static const int thr[11] = { 0, 1, 3, 3, 3, 3, 7, 7, 7, 7, 7 };
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
232
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
233 s->bias = CONVERT_BIAS;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
234
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
235 init_get_bits(&s->gb, s->dca_buffer, s->dca_buffer_size * 8);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
236
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
237 /* Sync code */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
238 get_bits(&s->gb, 32);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
239
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
240 /* Frame header */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
241 s->frame_type = get_bits(&s->gb, 1);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
242 s->samples_deficit = get_bits(&s->gb, 5) + 1;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
243 s->crc_present = get_bits(&s->gb, 1);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
244 s->sample_blocks = get_bits(&s->gb, 7) + 1;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
245 s->frame_size = get_bits(&s->gb, 14) + 1;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
246 if (s->frame_size < 95)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
247 return -1;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
248 s->amode = get_bits(&s->gb, 6);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
249 s->sample_rate = dca_sample_rates[get_bits(&s->gb, 4)];
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
250 if (!s->sample_rate)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
251 return -1;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
252 s->bit_rate = dca_bit_rates[get_bits(&s->gb, 5)];
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
253 if (!s->bit_rate)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
254 return -1;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
255
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
256 s->downmix = get_bits(&s->gb, 1);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
257 s->dynrange = get_bits(&s->gb, 1);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
258 s->timestamp = get_bits(&s->gb, 1);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
259 s->aux_data = get_bits(&s->gb, 1);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
260 s->hdcd = get_bits(&s->gb, 1);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
261 s->ext_descr = get_bits(&s->gb, 3);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
262 s->ext_coding = get_bits(&s->gb, 1);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
263 s->aspf = get_bits(&s->gb, 1);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
264 s->lfe = get_bits(&s->gb, 2);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
265 s->predictor_history = get_bits(&s->gb, 1);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
266
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
267 /* TODO: check CRC */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
268 if (s->crc_present)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
269 s->header_crc = get_bits(&s->gb, 16);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
270
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
271 s->multirate_inter = get_bits(&s->gb, 1);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
272 s->version = get_bits(&s->gb, 4);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
273 s->copy_history = get_bits(&s->gb, 2);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
274 s->source_pcm_res = get_bits(&s->gb, 3);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
275 s->front_sum = get_bits(&s->gb, 1);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
276 s->surround_sum = get_bits(&s->gb, 1);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
277 s->dialog_norm = get_bits(&s->gb, 4);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
278
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
279 /* FIXME: channels mixing levels */
4893
2b3fbf807734 enable multichannel output in dca decoder.
jbr
parents: 4883
diff changeset
280 s->output = s->amode;
2b3fbf807734 enable multichannel output in dca decoder.
jbr
parents: 4883
diff changeset
281 if(s->lfe) s->output |= DCA_LFE;
4599
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
282
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
283 #ifdef TRACE
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
284 av_log(s->avctx, AV_LOG_DEBUG, "frame type: %i\n", s->frame_type);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
285 av_log(s->avctx, AV_LOG_DEBUG, "samples deficit: %i\n", s->samples_deficit);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
286 av_log(s->avctx, AV_LOG_DEBUG, "crc present: %i\n", s->crc_present);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
287 av_log(s->avctx, AV_LOG_DEBUG, "sample blocks: %i (%i samples)\n",
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
288 s->sample_blocks, s->sample_blocks * 32);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
289 av_log(s->avctx, AV_LOG_DEBUG, "frame size: %i bytes\n", s->frame_size);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
290 av_log(s->avctx, AV_LOG_DEBUG, "amode: %i (%i channels)\n",
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
291 s->amode, dca_channels[s->amode]);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
292 av_log(s->avctx, AV_LOG_DEBUG, "sample rate: %i (%i Hz)\n",
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
293 s->sample_rate, dca_sample_rates[s->sample_rate]);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
294 av_log(s->avctx, AV_LOG_DEBUG, "bit rate: %i (%i bits/s)\n",
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
295 s->bit_rate, dca_bit_rates[s->bit_rate]);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
296 av_log(s->avctx, AV_LOG_DEBUG, "downmix: %i\n", s->downmix);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
297 av_log(s->avctx, AV_LOG_DEBUG, "dynrange: %i\n", s->dynrange);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
298 av_log(s->avctx, AV_LOG_DEBUG, "timestamp: %i\n", s->timestamp);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
299 av_log(s->avctx, AV_LOG_DEBUG, "aux_data: %i\n", s->aux_data);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
300 av_log(s->avctx, AV_LOG_DEBUG, "hdcd: %i\n", s->hdcd);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
301 av_log(s->avctx, AV_LOG_DEBUG, "ext descr: %i\n", s->ext_descr);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
302 av_log(s->avctx, AV_LOG_DEBUG, "ext coding: %i\n", s->ext_coding);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
303 av_log(s->avctx, AV_LOG_DEBUG, "aspf: %i\n", s->aspf);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
304 av_log(s->avctx, AV_LOG_DEBUG, "lfe: %i\n", s->lfe);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
305 av_log(s->avctx, AV_LOG_DEBUG, "predictor history: %i\n",
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
306 s->predictor_history);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
307 av_log(s->avctx, AV_LOG_DEBUG, "header crc: %i\n", s->header_crc);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
308 av_log(s->avctx, AV_LOG_DEBUG, "multirate inter: %i\n",
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
309 s->multirate_inter);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
310 av_log(s->avctx, AV_LOG_DEBUG, "version number: %i\n", s->version);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
311 av_log(s->avctx, AV_LOG_DEBUG, "copy history: %i\n", s->copy_history);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
312 av_log(s->avctx, AV_LOG_DEBUG,
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
313 "source pcm resolution: %i (%i bits/sample)\n",
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
314 s->source_pcm_res, dca_bits_per_sample[s->source_pcm_res]);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
315 av_log(s->avctx, AV_LOG_DEBUG, "front sum: %i\n", s->front_sum);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
316 av_log(s->avctx, AV_LOG_DEBUG, "surround sum: %i\n", s->surround_sum);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
317 av_log(s->avctx, AV_LOG_DEBUG, "dialog norm: %i\n", s->dialog_norm);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
318 av_log(s->avctx, AV_LOG_DEBUG, "\n");
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
319 #endif
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
320
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
321 /* Primary audio coding header */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
322 s->subframes = get_bits(&s->gb, 4) + 1;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
323 s->prim_channels = get_bits(&s->gb, 3) + 1;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
324
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
325
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
326 for (i = 0; i < s->prim_channels; i++) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
327 s->subband_activity[i] = get_bits(&s->gb, 5) + 2;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
328 if (s->subband_activity[i] > DCA_SUBBANDS)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
329 s->subband_activity[i] = DCA_SUBBANDS;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
330 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
331 for (i = 0; i < s->prim_channels; i++) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
332 s->vq_start_subband[i] = get_bits(&s->gb, 5) + 1;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
333 if (s->vq_start_subband[i] > DCA_SUBBANDS)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
334 s->vq_start_subband[i] = DCA_SUBBANDS;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
335 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
336 get_array(&s->gb, s->joint_intensity, s->prim_channels, 3);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
337 get_array(&s->gb, s->transient_huffman, s->prim_channels, 2);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
338 get_array(&s->gb, s->scalefactor_huffman, s->prim_channels, 3);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
339 get_array(&s->gb, s->bitalloc_huffman, s->prim_channels, 3);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
340
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
341 /* Get codebooks quantization indexes */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
342 memset(s->quant_index_huffman, 0, sizeof(s->quant_index_huffman));
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
343 for (j = 1; j < 11; j++)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
344 for (i = 0; i < s->prim_channels; i++)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
345 s->quant_index_huffman[i][j] = get_bits(&s->gb, bitlen[j]);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
346
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
347 /* Get scale factor adjustment */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
348 for (j = 0; j < 11; j++)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
349 for (i = 0; i < s->prim_channels; i++)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
350 s->scalefactor_adj[i][j] = 1;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
351
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
352 for (j = 1; j < 11; j++)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
353 for (i = 0; i < s->prim_channels; i++)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
354 if (s->quant_index_huffman[i][j] < thr[j])
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
355 s->scalefactor_adj[i][j] = adj_table[get_bits(&s->gb, 2)];
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
356
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
357 if (s->crc_present) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
358 /* Audio header CRC check */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
359 get_bits(&s->gb, 16);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
360 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
361
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
362 s->current_subframe = 0;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
363 s->current_subsubframe = 0;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
364
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
365 #ifdef TRACE
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
366 av_log(s->avctx, AV_LOG_DEBUG, "subframes: %i\n", s->subframes);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
367 av_log(s->avctx, AV_LOG_DEBUG, "prim channels: %i\n", s->prim_channels);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
368 for(i = 0; i < s->prim_channels; i++){
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
369 av_log(s->avctx, AV_LOG_DEBUG, "subband activity: %i\n", s->subband_activity[i]);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
370 av_log(s->avctx, AV_LOG_DEBUG, "vq start subband: %i\n", s->vq_start_subband[i]);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
371 av_log(s->avctx, AV_LOG_DEBUG, "joint intensity: %i\n", s->joint_intensity[i]);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
372 av_log(s->avctx, AV_LOG_DEBUG, "transient mode codebook: %i\n", s->transient_huffman[i]);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
373 av_log(s->avctx, AV_LOG_DEBUG, "scale factor codebook: %i\n", s->scalefactor_huffman[i]);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
374 av_log(s->avctx, AV_LOG_DEBUG, "bit allocation quantizer: %i\n", s->bitalloc_huffman[i]);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
375 av_log(s->avctx, AV_LOG_DEBUG, "quant index huff:");
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
376 for (j = 0; j < 11; j++)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
377 av_log(s->avctx, AV_LOG_DEBUG, " %i",
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
378 s->quant_index_huffman[i][j]);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
379 av_log(s->avctx, AV_LOG_DEBUG, "\n");
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
380 av_log(s->avctx, AV_LOG_DEBUG, "scalefac adj:");
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
381 for (j = 0; j < 11; j++)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
382 av_log(s->avctx, AV_LOG_DEBUG, " %1.3f", s->scalefactor_adj[i][j]);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
383 av_log(s->avctx, AV_LOG_DEBUG, "\n");
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
384 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
385 #endif
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
386
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
387 return 0;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
388 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
389
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
390
4876
384c95879d8b 1000l to myself as used VLC indexes were totally wrong
kostya
parents: 4783
diff changeset
391 static inline int get_scale(GetBitContext *gb, int level, int value)
4599
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
392 {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
393 if (level < 5) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
394 /* huffman encoded */
4876
384c95879d8b 1000l to myself as used VLC indexes were totally wrong
kostya
parents: 4783
diff changeset
395 value += get_bitalloc(gb, &dca_scalefactor, level);
4599
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
396 } else if(level < 8)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
397 value = get_bits(gb, level + 1);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
398 return value;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
399 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
400
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
401 static int dca_subframe_header(DCAContext * s)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
402 {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
403 /* Primary audio coding side information */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
404 int j, k;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
405
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
406 s->subsubframes = get_bits(&s->gb, 2) + 1;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
407 s->partial_samples = get_bits(&s->gb, 3);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
408 for (j = 0; j < s->prim_channels; j++) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
409 for (k = 0; k < s->subband_activity[j]; k++)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
410 s->prediction_mode[j][k] = get_bits(&s->gb, 1);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
411 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
412
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
413 /* Get prediction codebook */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
414 for (j = 0; j < s->prim_channels; j++) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
415 for (k = 0; k < s->subband_activity[j]; k++) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
416 if (s->prediction_mode[j][k] > 0) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
417 /* (Prediction coefficient VQ address) */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
418 s->prediction_vq[j][k] = get_bits(&s->gb, 12);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
419 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
420 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
421 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
422
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
423 /* Bit allocation index */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
424 for (j = 0; j < s->prim_channels; j++) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
425 for (k = 0; k < s->vq_start_subband[j]; k++) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
426 if (s->bitalloc_huffman[j] == 6)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
427 s->bitalloc[j][k] = get_bits(&s->gb, 5);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
428 else if (s->bitalloc_huffman[j] == 5)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
429 s->bitalloc[j][k] = get_bits(&s->gb, 4);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
430 else {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
431 s->bitalloc[j][k] =
4876
384c95879d8b 1000l to myself as used VLC indexes were totally wrong
kostya
parents: 4783
diff changeset
432 get_bitalloc(&s->gb, &dca_bitalloc_index, s->bitalloc_huffman[j]);
4599
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
433 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
434
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
435 if (s->bitalloc[j][k] > 26) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
436 // av_log(s->avctx,AV_LOG_DEBUG,"bitalloc index [%i][%i] too big (%i)\n",
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
437 // j, k, s->bitalloc[j][k]);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
438 return -1;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
439 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
440 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
441 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
442
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
443 /* Transition mode */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
444 for (j = 0; j < s->prim_channels; j++) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
445 for (k = 0; k < s->subband_activity[j]; k++) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
446 s->transition_mode[j][k] = 0;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
447 if (s->subsubframes > 1 &&
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
448 k < s->vq_start_subband[j] && s->bitalloc[j][k] > 0) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
449 s->transition_mode[j][k] =
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
450 get_bitalloc(&s->gb, &dca_tmode, s->transient_huffman[j]);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
451 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
452 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
453 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
454
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
455 for (j = 0; j < s->prim_channels; j++) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
456 uint32_t *scale_table;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
457 int scale_sum;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
458
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
459 memset(s->scale_factor[j], 0, s->subband_activity[j] * sizeof(s->scale_factor[0][0][0]) * 2);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
460
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
461 if (s->scalefactor_huffman[j] == 6)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
462 scale_table = (uint32_t *) scale_factor_quant7;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
463 else
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
464 scale_table = (uint32_t *) scale_factor_quant6;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
465
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
466 /* When huffman coded, only the difference is encoded */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
467 scale_sum = 0;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
468
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
469 for (k = 0; k < s->subband_activity[j]; k++) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
470 if (k >= s->vq_start_subband[j] || s->bitalloc[j][k] > 0) {
4876
384c95879d8b 1000l to myself as used VLC indexes were totally wrong
kostya
parents: 4783
diff changeset
471 scale_sum = get_scale(&s->gb, s->scalefactor_huffman[j], scale_sum);
4599
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
472 s->scale_factor[j][k][0] = scale_table[scale_sum];
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
473 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
474
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
475 if (k < s->vq_start_subband[j] && s->transition_mode[j][k]) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
476 /* Get second scale factor */
4876
384c95879d8b 1000l to myself as used VLC indexes were totally wrong
kostya
parents: 4783
diff changeset
477 scale_sum = get_scale(&s->gb, s->scalefactor_huffman[j], scale_sum);
4599
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
478 s->scale_factor[j][k][1] = scale_table[scale_sum];
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
479 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
480 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
481 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
482
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
483 /* Joint subband scale factor codebook select */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
484 for (j = 0; j < s->prim_channels; j++) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
485 /* Transmitted only if joint subband coding enabled */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
486 if (s->joint_intensity[j] > 0)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
487 s->joint_huff[j] = get_bits(&s->gb, 3);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
488 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
489
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
490 /* Scale factors for joint subband coding */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
491 for (j = 0; j < s->prim_channels; j++) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
492 int source_channel;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
493
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
494 /* Transmitted only if joint subband coding enabled */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
495 if (s->joint_intensity[j] > 0) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
496 int scale = 0;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
497 source_channel = s->joint_intensity[j] - 1;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
498
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
499 /* When huffman coded, only the difference is encoded
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
500 * (is this valid as well for joint scales ???) */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
501
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
502 for (k = s->subband_activity[j]; k < s->subband_activity[source_channel]; k++) {
4876
384c95879d8b 1000l to myself as used VLC indexes were totally wrong
kostya
parents: 4783
diff changeset
503 scale = get_scale(&s->gb, s->joint_huff[j], 0);
4599
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
504 scale += 64; /* bias */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
505 s->joint_scale_factor[j][k] = scale; /*joint_scale_table[scale]; */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
506 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
507
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
508 if (!s->debug_flag & 0x02) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
509 av_log(s->avctx, AV_LOG_DEBUG,
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
510 "Joint stereo coding not supported\n");
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
511 s->debug_flag |= 0x02;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
512 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
513 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
514 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
515
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
516 /* Stereo downmix coefficients */
4894
9b2e61b0ec52 use downmixing coefficients in dca decoder.
jbr
parents: 4893
diff changeset
517 if (s->prim_channels > 2) {
9b2e61b0ec52 use downmixing coefficients in dca decoder.
jbr
parents: 4893
diff changeset
518 if(s->downmix) {
4895
bcff4564b786 cosmetics: indention after last commit
jbr
parents: 4894
diff changeset
519 for (j = 0; j < s->prim_channels; j++) {
bcff4564b786 cosmetics: indention after last commit
jbr
parents: 4894
diff changeset
520 s->downmix_coef[j][0] = get_bits(&s->gb, 7);
bcff4564b786 cosmetics: indention after last commit
jbr
parents: 4894
diff changeset
521 s->downmix_coef[j][1] = get_bits(&s->gb, 7);
bcff4564b786 cosmetics: indention after last commit
jbr
parents: 4894
diff changeset
522 }
4894
9b2e61b0ec52 use downmixing coefficients in dca decoder.
jbr
parents: 4893
diff changeset
523 } else {
9b2e61b0ec52 use downmixing coefficients in dca decoder.
jbr
parents: 4893
diff changeset
524 int am = s->amode & DCA_CHANNEL_MASK;
9b2e61b0ec52 use downmixing coefficients in dca decoder.
jbr
parents: 4893
diff changeset
525 for (j = 0; j < s->prim_channels; j++) {
9b2e61b0ec52 use downmixing coefficients in dca decoder.
jbr
parents: 4893
diff changeset
526 s->downmix_coef[j][0] = dca_default_coeffs[am][j][0];
9b2e61b0ec52 use downmixing coefficients in dca decoder.
jbr
parents: 4893
diff changeset
527 s->downmix_coef[j][1] = dca_default_coeffs[am][j][1];
9b2e61b0ec52 use downmixing coefficients in dca decoder.
jbr
parents: 4893
diff changeset
528 }
9b2e61b0ec52 use downmixing coefficients in dca decoder.
jbr
parents: 4893
diff changeset
529 }
4599
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
530 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
531
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
532 /* Dynamic range coefficient */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
533 if (s->dynrange)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
534 s->dynrange_coef = get_bits(&s->gb, 8);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
535
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
536 /* Side information CRC check word */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
537 if (s->crc_present) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
538 get_bits(&s->gb, 16);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
539 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
540
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
541 /*
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
542 * Primary audio data arrays
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
543 */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
544
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
545 /* VQ encoded high frequency subbands */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
546 for (j = 0; j < s->prim_channels; j++)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
547 for (k = s->vq_start_subband[j]; k < s->subband_activity[j]; k++)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
548 /* 1 vector -> 32 samples */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
549 s->high_freq_vq[j][k] = get_bits(&s->gb, 10);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
550
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
551 /* Low frequency effect data */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
552 if (s->lfe) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
553 /* LFE samples */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
554 int lfe_samples = 2 * s->lfe * s->subsubframes;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
555 float lfe_scale;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
556
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
557 for (j = lfe_samples; j < lfe_samples * 2; j++) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
558 /* Signed 8 bits int */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
559 s->lfe_data[j] = get_sbits(&s->gb, 8);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
560 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
561
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
562 /* Scale factor index */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
563 s->lfe_scale_factor = scale_factor_quant7[get_bits(&s->gb, 8)];
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
564
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
565 /* Quantization step size * scale factor */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
566 lfe_scale = 0.035 * s->lfe_scale_factor;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
567
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
568 for (j = lfe_samples; j < lfe_samples * 2; j++)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
569 s->lfe_data[j] *= lfe_scale;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
570 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
571
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
572 #ifdef TRACE
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
573 av_log(s->avctx, AV_LOG_DEBUG, "subsubframes: %i\n", s->subsubframes);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
574 av_log(s->avctx, AV_LOG_DEBUG, "partial samples: %i\n",
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
575 s->partial_samples);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
576 for (j = 0; j < s->prim_channels; j++) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
577 av_log(s->avctx, AV_LOG_DEBUG, "prediction mode:");
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
578 for (k = 0; k < s->subband_activity[j]; k++)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
579 av_log(s->avctx, AV_LOG_DEBUG, " %i", s->prediction_mode[j][k]);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
580 av_log(s->avctx, AV_LOG_DEBUG, "\n");
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
581 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
582 for (j = 0; j < s->prim_channels; j++) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
583 for (k = 0; k < s->subband_activity[j]; k++)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
584 av_log(s->avctx, AV_LOG_DEBUG,
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
585 "prediction coefs: %f, %f, %f, %f\n",
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
586 (float) adpcm_vb[s->prediction_vq[j][k]][0] / 8192,
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
587 (float) adpcm_vb[s->prediction_vq[j][k]][1] / 8192,
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
588 (float) adpcm_vb[s->prediction_vq[j][k]][2] / 8192,
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
589 (float) adpcm_vb[s->prediction_vq[j][k]][3] / 8192);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
590 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
591 for (j = 0; j < s->prim_channels; j++) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
592 av_log(s->avctx, AV_LOG_DEBUG, "bitalloc index: ");
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
593 for (k = 0; k < s->vq_start_subband[j]; k++)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
594 av_log(s->avctx, AV_LOG_DEBUG, "%2.2i ", s->bitalloc[j][k]);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
595 av_log(s->avctx, AV_LOG_DEBUG, "\n");
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
596 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
597 for (j = 0; j < s->prim_channels; j++) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
598 av_log(s->avctx, AV_LOG_DEBUG, "Transition mode:");
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
599 for (k = 0; k < s->subband_activity[j]; k++)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
600 av_log(s->avctx, AV_LOG_DEBUG, " %i", s->transition_mode[j][k]);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
601 av_log(s->avctx, AV_LOG_DEBUG, "\n");
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
602 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
603 for (j = 0; j < s->prim_channels; j++) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
604 av_log(s->avctx, AV_LOG_DEBUG, "Scale factor:");
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
605 for (k = 0; k < s->subband_activity[j]; k++) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
606 if (k >= s->vq_start_subband[j] || s->bitalloc[j][k] > 0)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
607 av_log(s->avctx, AV_LOG_DEBUG, " %i", s->scale_factor[j][k][0]);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
608 if (k < s->vq_start_subband[j] && s->transition_mode[j][k])
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
609 av_log(s->avctx, AV_LOG_DEBUG, " %i(t)", s->scale_factor[j][k][1]);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
610 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
611 av_log(s->avctx, AV_LOG_DEBUG, "\n");
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
612 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
613 for (j = 0; j < s->prim_channels; j++) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
614 if (s->joint_intensity[j] > 0) {
5069
341a60a511ab Fix dca.c compilation with #define TRACE
kostya
parents: 5027
diff changeset
615 int source_channel = s->joint_intensity[j] - 1;
4599
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
616 av_log(s->avctx, AV_LOG_DEBUG, "Joint scale factor index:\n");
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
617 for (k = s->subband_activity[j]; k < s->subband_activity[source_channel]; k++)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
618 av_log(s->avctx, AV_LOG_DEBUG, " %i", s->joint_scale_factor[j][k]);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
619 av_log(s->avctx, AV_LOG_DEBUG, "\n");
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
620 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
621 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
622 if (s->prim_channels > 2 && s->downmix) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
623 av_log(s->avctx, AV_LOG_DEBUG, "Downmix coeffs:\n");
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
624 for (j = 0; j < s->prim_channels; j++) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
625 av_log(s->avctx, AV_LOG_DEBUG, "Channel 0,%d = %f\n", j, dca_downmix_coeffs[s->downmix_coef[j][0]]);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
626 av_log(s->avctx, AV_LOG_DEBUG, "Channel 1,%d = %f\n", j, dca_downmix_coeffs[s->downmix_coef[j][1]]);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
627 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
628 av_log(s->avctx, AV_LOG_DEBUG, "\n");
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
629 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
630 for (j = 0; j < s->prim_channels; j++)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
631 for (k = s->vq_start_subband[j]; k < s->subband_activity[j]; k++)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
632 av_log(s->avctx, AV_LOG_DEBUG, "VQ index: %i\n", s->high_freq_vq[j][k]);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
633 if(s->lfe){
5069
341a60a511ab Fix dca.c compilation with #define TRACE
kostya
parents: 5027
diff changeset
634 int lfe_samples = 2 * s->lfe * s->subsubframes;
4599
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
635 av_log(s->avctx, AV_LOG_DEBUG, "LFE samples:\n");
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
636 for (j = lfe_samples; j < lfe_samples * 2; j++)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
637 av_log(s->avctx, AV_LOG_DEBUG, " %f", s->lfe_data[j]);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
638 av_log(s->avctx, AV_LOG_DEBUG, "\n");
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
639 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
640 #endif
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
641
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
642 return 0;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
643 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
644
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
645 static void qmf_32_subbands(DCAContext * s, int chans,
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
646 float samples_in[32][8], float *samples_out,
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
647 float scale, float bias)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
648 {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
649 float *prCoeff;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
650 int i, j, k;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
651 float praXin[33], *raXin = &praXin[1];
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
652
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
653 float *subband_fir_hist = s->subband_fir_hist[chans];
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
654 float *subband_fir_hist2 = s->subband_fir_noidea[chans];
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
655
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
656 int chindex = 0, subindex;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
657
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
658 praXin[0] = 0.0;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
659
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
660 /* Select filter */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
661 if (!s->multirate_inter) /* Non-perfect reconstruction */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
662 prCoeff = (float *) fir_32bands_nonperfect;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
663 else /* Perfect reconstruction */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
664 prCoeff = (float *) fir_32bands_perfect;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
665
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
666 /* Reconstructed channel sample index */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
667 for (subindex = 0; subindex < 8; subindex++) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
668 float t1, t2, sum[16], diff[16];
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
669
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
670 /* Load in one sample from each subband and clear inactive subbands */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
671 for (i = 0; i < s->subband_activity[chans]; i++)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
672 raXin[i] = samples_in[i][subindex];
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
673 for (; i < 32; i++)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
674 raXin[i] = 0.0;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
675
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
676 /* Multiply by cosine modulation coefficients and
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
677 * create temporary arrays SUM and DIFF */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
678 for (j = 0, k = 0; k < 16; k++) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
679 t1 = 0.0;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
680 t2 = 0.0;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
681 for (i = 0; i < 16; i++, j++){
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
682 t1 += (raXin[2 * i] + raXin[2 * i + 1]) * cos_mod[j];
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
683 t2 += (raXin[2 * i] + raXin[2 * i - 1]) * cos_mod[j + 256];
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
684 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
685 sum[k] = t1 + t2;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
686 diff[k] = t1 - t2;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
687 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
688
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
689 j = 512;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
690 /* Store history */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
691 for (k = 0; k < 16; k++)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
692 subband_fir_hist[k] = cos_mod[j++] * sum[k];
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
693 for (k = 0; k < 16; k++)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
694 subband_fir_hist[32-k-1] = cos_mod[j++] * diff[k];
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
695
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
696 /* Multiply by filter coefficients */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
697 for (k = 31, i = 0; i < 32; i++, k--)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
698 for (j = 0; j < 512; j += 64){
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
699 subband_fir_hist2[i] += prCoeff[i+j] * ( subband_fir_hist[i+j] - subband_fir_hist[j+k]);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
700 subband_fir_hist2[i+32] += prCoeff[i+j+32]*(-subband_fir_hist[i+j] - subband_fir_hist[j+k]);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
701 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
702
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
703 /* Create 32 PCM output samples */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
704 for (i = 0; i < 32; i++)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
705 samples_out[chindex++] = subband_fir_hist2[i] * scale + bias;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
706
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
707 /* Update working arrays */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
708 memmove(&subband_fir_hist[32], &subband_fir_hist[0], (512 - 32) * sizeof(float));
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
709 memmove(&subband_fir_hist2[0], &subband_fir_hist2[32], 32 * sizeof(float));
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
710 memset(&subband_fir_hist2[32], 0, 32 * sizeof(float));
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
711 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
712 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
713
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
714 static void lfe_interpolation_fir(int decimation_select,
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
715 int num_deci_sample, float *samples_in,
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
716 float *samples_out, float scale,
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
717 float bias)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
718 {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
719 /* samples_in: An array holding decimated samples.
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
720 * Samples in current subframe starts from samples_in[0],
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
721 * while samples_in[-1], samples_in[-2], ..., stores samples
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
722 * from last subframe as history.
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
723 *
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
724 * samples_out: An array holding interpolated samples
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
725 */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
726
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
727 int decifactor, k, j;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
728 const float *prCoeff;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
729
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
730 int interp_index = 0; /* Index to the interpolated samples */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
731 int deciindex;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
732
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
733 /* Select decimation filter */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
734 if (decimation_select == 1) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
735 decifactor = 128;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
736 prCoeff = lfe_fir_128;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
737 } else {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
738 decifactor = 64;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
739 prCoeff = lfe_fir_64;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
740 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
741 /* Interpolation */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
742 for (deciindex = 0; deciindex < num_deci_sample; deciindex++) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
743 /* One decimated sample generates decifactor interpolated ones */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
744 for (k = 0; k < decifactor; k++) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
745 float rTmp = 0.0;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
746 //FIXME the coeffs are symetric, fix that
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
747 for (j = 0; j < 512 / decifactor; j++)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
748 rTmp += samples_in[deciindex - j] * prCoeff[k + j * decifactor];
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
749 samples_out[interp_index++] = rTmp / scale + bias;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
750 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
751 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
752 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
753
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
754 /* downmixing routines */
4894
9b2e61b0ec52 use downmixing coefficients in dca decoder.
jbr
parents: 4893
diff changeset
755 #define MIX_REAR1(samples, si1, rs, coef) \
9b2e61b0ec52 use downmixing coefficients in dca decoder.
jbr
parents: 4893
diff changeset
756 samples[i] += samples[si1] * coef[rs][0]; \
9b2e61b0ec52 use downmixing coefficients in dca decoder.
jbr
parents: 4893
diff changeset
757 samples[i+256] += samples[si1] * coef[rs][1];
4599
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
758
4894
9b2e61b0ec52 use downmixing coefficients in dca decoder.
jbr
parents: 4893
diff changeset
759 #define MIX_REAR2(samples, si1, si2, rs, coef) \
9b2e61b0ec52 use downmixing coefficients in dca decoder.
jbr
parents: 4893
diff changeset
760 samples[i] += samples[si1] * coef[rs][0] + samples[si2] * coef[rs+1][0]; \
9b2e61b0ec52 use downmixing coefficients in dca decoder.
jbr
parents: 4893
diff changeset
761 samples[i+256] += samples[si1] * coef[rs][1] + samples[si2] * coef[rs+1][1];
4599
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
762
4894
9b2e61b0ec52 use downmixing coefficients in dca decoder.
jbr
parents: 4893
diff changeset
763 #define MIX_FRONT3(samples, coef) \
4599
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
764 t = samples[i]; \
4894
9b2e61b0ec52 use downmixing coefficients in dca decoder.
jbr
parents: 4893
diff changeset
765 samples[i] = t * coef[0][0] + samples[i+256] * coef[1][0] + samples[i+512] * coef[2][0]; \
9b2e61b0ec52 use downmixing coefficients in dca decoder.
jbr
parents: 4893
diff changeset
766 samples[i+256] = t * coef[0][1] + samples[i+256] * coef[1][1] + samples[i+512] * coef[2][1];
4599
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
767
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
768 #define DOWNMIX_TO_STEREO(op1, op2) \
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
769 for(i = 0; i < 256; i++){ \
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
770 op1 \
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
771 op2 \
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
772 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
773
4894
9b2e61b0ec52 use downmixing coefficients in dca decoder.
jbr
parents: 4893
diff changeset
774 static void dca_downmix(float *samples, int srcfmt,
9b2e61b0ec52 use downmixing coefficients in dca decoder.
jbr
parents: 4893
diff changeset
775 int downmix_coef[DCA_PRIM_CHANNELS_MAX][2])
4599
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
776 {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
777 int i;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
778 float t;
4894
9b2e61b0ec52 use downmixing coefficients in dca decoder.
jbr
parents: 4893
diff changeset
779 float coef[DCA_PRIM_CHANNELS_MAX][2];
9b2e61b0ec52 use downmixing coefficients in dca decoder.
jbr
parents: 4893
diff changeset
780
9b2e61b0ec52 use downmixing coefficients in dca decoder.
jbr
parents: 4893
diff changeset
781 for(i=0; i<DCA_PRIM_CHANNELS_MAX; i++) {
9b2e61b0ec52 use downmixing coefficients in dca decoder.
jbr
parents: 4893
diff changeset
782 coef[i][0] = dca_downmix_coeffs[downmix_coef[i][0]];
9b2e61b0ec52 use downmixing coefficients in dca decoder.
jbr
parents: 4893
diff changeset
783 coef[i][1] = dca_downmix_coeffs[downmix_coef[i][1]];
9b2e61b0ec52 use downmixing coefficients in dca decoder.
jbr
parents: 4893
diff changeset
784 }
4599
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
785
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
786 switch (srcfmt) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
787 case DCA_MONO:
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
788 case DCA_CHANNEL:
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
789 case DCA_STEREO_TOTAL:
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
790 case DCA_STEREO_SUMDIFF:
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
791 case DCA_4F2R:
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
792 av_log(NULL, 0, "Not implemented!\n");
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
793 break;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
794 case DCA_STEREO:
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
795 break;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
796 case DCA_3F:
4894
9b2e61b0ec52 use downmixing coefficients in dca decoder.
jbr
parents: 4893
diff changeset
797 DOWNMIX_TO_STEREO(MIX_FRONT3(samples, coef),);
4599
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
798 break;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
799 case DCA_2F1R:
4894
9b2e61b0ec52 use downmixing coefficients in dca decoder.
jbr
parents: 4893
diff changeset
800 DOWNMIX_TO_STEREO(MIX_REAR1(samples, i + 512, 2, coef),);
4599
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
801 break;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
802 case DCA_3F1R:
4894
9b2e61b0ec52 use downmixing coefficients in dca decoder.
jbr
parents: 4893
diff changeset
803 DOWNMIX_TO_STEREO(MIX_FRONT3(samples, coef),
9b2e61b0ec52 use downmixing coefficients in dca decoder.
jbr
parents: 4893
diff changeset
804 MIX_REAR1(samples, i + 768, 3, coef));
4599
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
805 break;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
806 case DCA_2F2R:
4894
9b2e61b0ec52 use downmixing coefficients in dca decoder.
jbr
parents: 4893
diff changeset
807 DOWNMIX_TO_STEREO(MIX_REAR2(samples, i + 512, i + 768, 2, coef),);
4599
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
808 break;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
809 case DCA_3F2R:
4894
9b2e61b0ec52 use downmixing coefficients in dca decoder.
jbr
parents: 4893
diff changeset
810 DOWNMIX_TO_STEREO(MIX_FRONT3(samples, coef),
9b2e61b0ec52 use downmixing coefficients in dca decoder.
jbr
parents: 4893
diff changeset
811 MIX_REAR2(samples, i + 768, i + 1024, 3, coef));
4599
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
812 break;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
813 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
814 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
815
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
816
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
817 /* Very compact version of the block code decoder that does not use table
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
818 * look-up but is slightly slower */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
819 static int decode_blockcode(int code, int levels, int *values)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
820 {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
821 int i;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
822 int offset = (levels - 1) >> 1;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
823
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
824 for (i = 0; i < 4; i++) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
825 values[i] = (code % levels) - offset;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
826 code /= levels;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
827 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
828
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
829 if (code == 0)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
830 return 0;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
831 else {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
832 av_log(NULL, AV_LOG_ERROR, "ERROR: block code look-up failed\n");
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
833 return -1;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
834 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
835 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
836
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
837 static const uint8_t abits_sizes[7] = { 7, 10, 12, 13, 15, 17, 19 };
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
838 static const uint8_t abits_levels[7] = { 3, 5, 7, 9, 13, 17, 25 };
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
839
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
840 static int dca_subsubframe(DCAContext * s)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
841 {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
842 int k, l;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
843 int subsubframe = s->current_subsubframe;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
844
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
845 float *quant_step_table;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
846
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
847 /* FIXME */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
848 float subband_samples[DCA_PRIM_CHANNELS_MAX][DCA_SUBBANDS][8];
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
849
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
850 /*
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
851 * Audio data
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
852 */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
853
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
854 /* Select quantization step size table */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
855 if (s->bit_rate == 0x1f)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
856 quant_step_table = (float *) lossless_quant_d;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
857 else
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
858 quant_step_table = (float *) lossy_quant_d;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
859
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
860 for (k = 0; k < s->prim_channels; k++) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
861 for (l = 0; l < s->vq_start_subband[k]; l++) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
862 int m;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
863
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
864 /* Select the mid-tread linear quantizer */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
865 int abits = s->bitalloc[k][l];
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
866
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
867 float quant_step_size = quant_step_table[abits];
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
868 float rscale;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
869
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
870 /*
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
871 * Determine quantization index code book and its type
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
872 */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
873
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
874 /* Select quantization index code book */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
875 int sel = s->quant_index_huffman[k][abits];
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
876
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
877 /*
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
878 * Extract bits from the bit stream
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
879 */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
880 if(!abits){
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
881 memset(subband_samples[k][l], 0, 8 * sizeof(subband_samples[0][0][0]));
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
882 }else if(abits >= 11 || !dca_smpl_bitalloc[abits].vlc[sel].table){
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
883 if(abits <= 7){
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
884 /* Block code */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
885 int block_code1, block_code2, size, levels;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
886 int block[8];
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
887
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
888 size = abits_sizes[abits-1];
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
889 levels = abits_levels[abits-1];
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
890
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
891 block_code1 = get_bits(&s->gb, size);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
892 /* FIXME Should test return value */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
893 decode_blockcode(block_code1, levels, block);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
894 block_code2 = get_bits(&s->gb, size);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
895 decode_blockcode(block_code2, levels, &block[4]);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
896 for (m = 0; m < 8; m++)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
897 subband_samples[k][l][m] = block[m];
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
898 }else{
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
899 /* no coding */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
900 for (m = 0; m < 8; m++)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
901 subband_samples[k][l][m] = get_sbits(&s->gb, abits - 3);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
902 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
903 }else{
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
904 /* Huffman coded */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
905 for (m = 0; m < 8; m++)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
906 subband_samples[k][l][m] = get_bitalloc(&s->gb, &dca_smpl_bitalloc[abits], sel);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
907 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
908
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
909 /* Deal with transients */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
910 if (s->transition_mode[k][l] &&
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
911 subsubframe >= s->transition_mode[k][l])
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
912 rscale = quant_step_size * s->scale_factor[k][l][1];
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
913 else
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
914 rscale = quant_step_size * s->scale_factor[k][l][0];
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
915
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
916 rscale *= s->scalefactor_adj[k][sel];
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
917
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
918 for (m = 0; m < 8; m++)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
919 subband_samples[k][l][m] *= rscale;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
920
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
921 /*
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
922 * Inverse ADPCM if in prediction mode
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
923 */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
924 if (s->prediction_mode[k][l]) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
925 int n;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
926 for (m = 0; m < 8; m++) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
927 for (n = 1; n <= 4; n++)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
928 if (m >= n)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
929 subband_samples[k][l][m] +=
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
930 (adpcm_vb[s->prediction_vq[k][l]][n - 1] *
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
931 subband_samples[k][l][m - n] / 8192);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
932 else if (s->predictor_history)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
933 subband_samples[k][l][m] +=
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
934 (adpcm_vb[s->prediction_vq[k][l]][n - 1] *
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
935 s->subband_samples_hist[k][l][m - n +
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
936 4] / 8192);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
937 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
938 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
939 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
940
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
941 /*
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
942 * Decode VQ encoded high frequencies
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
943 */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
944 for (l = s->vq_start_subband[k]; l < s->subband_activity[k]; l++) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
945 /* 1 vector -> 32 samples but we only need the 8 samples
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
946 * for this subsubframe. */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
947 int m;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
948
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
949 if (!s->debug_flag & 0x01) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
950 av_log(s->avctx, AV_LOG_DEBUG, "Stream with high frequencies VQ coding\n");
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
951 s->debug_flag |= 0x01;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
952 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
953
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
954 for (m = 0; m < 8; m++) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
955 subband_samples[k][l][m] =
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
956 high_freq_vq[s->high_freq_vq[k][l]][subsubframe * 8 +
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
957 m]
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
958 * (float) s->scale_factor[k][l][0] / 16.0;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
959 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
960 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
961 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
962
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
963 /* Check for DSYNC after subsubframe */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
964 if (s->aspf || subsubframe == s->subsubframes - 1) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
965 if (0xFFFF == get_bits(&s->gb, 16)) { /* 0xFFFF */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
966 #ifdef TRACE
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
967 av_log(s->avctx, AV_LOG_DEBUG, "Got subframe DSYNC\n");
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
968 #endif
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
969 } else {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
970 av_log(s->avctx, AV_LOG_ERROR, "Didn't get subframe DSYNC\n");
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
971 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
972 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
973
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
974 /* Backup predictor history for adpcm */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
975 for (k = 0; k < s->prim_channels; k++)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
976 for (l = 0; l < s->vq_start_subband[k]; l++)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
977 memcpy(s->subband_samples_hist[k][l], &subband_samples[k][l][4],
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
978 4 * sizeof(subband_samples[0][0][0]));
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
979
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
980 /* 32 subbands QMF */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
981 for (k = 0; k < s->prim_channels; k++) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
982 /* static float pcm_to_double[8] =
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
983 {32768.0, 32768.0, 524288.0, 524288.0, 0, 8388608.0, 8388608.0};*/
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
984 qmf_32_subbands(s, k, subband_samples[k], &s->samples[256 * k],
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
985 2.0 / 3 /*pcm_to_double[s->source_pcm_res] */ ,
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
986 0 /*s->bias */ );
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
987 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
988
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
989 /* Down mixing */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
990
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
991 if (s->prim_channels > dca_channels[s->output & DCA_CHANNEL_MASK]) {
4894
9b2e61b0ec52 use downmixing coefficients in dca decoder.
jbr
parents: 4893
diff changeset
992 dca_downmix(s->samples, s->amode, s->downmix_coef);
4599
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
993 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
994
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
995 /* Generate LFE samples for this subsubframe FIXME!!! */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
996 if (s->output & DCA_LFE) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
997 int lfe_samples = 2 * s->lfe * s->subsubframes;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
998 int i_channels = dca_channels[s->output & DCA_CHANNEL_MASK];
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
999
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1000 lfe_interpolation_fir(s->lfe, 2 * s->lfe,
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1001 s->lfe_data + lfe_samples +
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1002 2 * s->lfe * subsubframe,
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1003 &s->samples[256 * i_channels],
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1004 8388608.0, s->bias);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1005 /* Outputs 20bits pcm samples */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1006 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1007
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1008 return 0;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1009 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1010
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1011
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1012 static int dca_subframe_footer(DCAContext * s)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1013 {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1014 int aux_data_count = 0, i;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1015 int lfe_samples;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1016
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1017 /*
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1018 * Unpack optional information
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1019 */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1020
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1021 if (s->timestamp)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1022 get_bits(&s->gb, 32);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1023
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1024 if (s->aux_data)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1025 aux_data_count = get_bits(&s->gb, 6);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1026
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1027 for (i = 0; i < aux_data_count; i++)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1028 get_bits(&s->gb, 8);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1029
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1030 if (s->crc_present && (s->downmix || s->dynrange))
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1031 get_bits(&s->gb, 16);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1032
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1033 lfe_samples = 2 * s->lfe * s->subsubframes;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1034 for (i = 0; i < lfe_samples; i++) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1035 s->lfe_data[i] = s->lfe_data[i + lfe_samples];
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1036 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1037
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1038 return 0;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1039 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1040
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1041 /**
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1042 * Decode a dca frame block
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1043 *
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1044 * @param s pointer to the DCAContext
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1045 */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1046
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1047 static int dca_decode_block(DCAContext * s)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1048 {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1049
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1050 /* Sanity check */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1051 if (s->current_subframe >= s->subframes) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1052 av_log(s->avctx, AV_LOG_DEBUG, "check failed: %i>%i",
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1053 s->current_subframe, s->subframes);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1054 return -1;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1055 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1056
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1057 if (!s->current_subsubframe) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1058 #ifdef TRACE
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1059 av_log(s->avctx, AV_LOG_DEBUG, "DSYNC dca_subframe_header\n");
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1060 #endif
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1061 /* Read subframe header */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1062 if (dca_subframe_header(s))
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1063 return -1;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1064 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1065
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1066 /* Read subsubframe */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1067 #ifdef TRACE
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1068 av_log(s->avctx, AV_LOG_DEBUG, "DSYNC dca_subsubframe\n");
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1069 #endif
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1070 if (dca_subsubframe(s))
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1071 return -1;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1072
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1073 /* Update state */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1074 s->current_subsubframe++;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1075 if (s->current_subsubframe >= s->subsubframes) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1076 s->current_subsubframe = 0;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1077 s->current_subframe++;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1078 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1079 if (s->current_subframe >= s->subframes) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1080 #ifdef TRACE
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1081 av_log(s->avctx, AV_LOG_DEBUG, "DSYNC dca_subframe_footer\n");
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1082 #endif
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1083 /* Read subframe footer */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1084 if (dca_subframe_footer(s))
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1085 return -1;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1086 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1087
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1088 return 0;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1089 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1090
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1091 /**
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1092 * Convert bitstream to one representation based on sync marker
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1093 */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1094 static int dca_convert_bitstream(uint8_t * src, int src_size, uint8_t * dst,
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1095 int max_size)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1096 {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1097 uint32_t mrk;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1098 int i, tmp;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1099 uint16_t *ssrc = (uint16_t *) src, *sdst = (uint16_t *) dst;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1100 PutBitContext pb;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1101
5027
696cda281304 Better error reporting.
banan
parents: 4908
diff changeset
1102 if((unsigned)src_size > (unsigned)max_size) {
696cda281304 Better error reporting.
banan
parents: 4908
diff changeset
1103 av_log(NULL, AV_LOG_ERROR, "Input frame size larger then DCA_MAX_FRAME_SIZE!\n");
4883
9055ed00a295 fix exploitable buffer overflow
michael
parents: 4876
diff changeset
1104 return -1;
5027
696cda281304 Better error reporting.
banan
parents: 4908
diff changeset
1105 }
4883
9055ed00a295 fix exploitable buffer overflow
michael
parents: 4876
diff changeset
1106
4599
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1107 mrk = AV_RB32(src);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1108 switch (mrk) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1109 case DCA_MARKER_RAW_BE:
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1110 memcpy(dst, src, FFMIN(src_size, max_size));
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1111 return FFMIN(src_size, max_size);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1112 case DCA_MARKER_RAW_LE:
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1113 for (i = 0; i < (FFMIN(src_size, max_size) + 1) >> 1; i++)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1114 *sdst++ = bswap_16(*ssrc++);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1115 return FFMIN(src_size, max_size);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1116 case DCA_MARKER_14B_BE:
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1117 case DCA_MARKER_14B_LE:
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1118 init_put_bits(&pb, dst, max_size);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1119 for (i = 0; i < (src_size + 1) >> 1; i++, src += 2) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1120 tmp = ((mrk == DCA_MARKER_14B_BE) ? AV_RB16(src) : AV_RL16(src)) & 0x3FFF;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1121 put_bits(&pb, 14, tmp);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1122 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1123 flush_put_bits(&pb);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1124 return (put_bits_count(&pb) + 7) >> 3;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1125 default:
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1126 return -1;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1127 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1128 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1129
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1130 /**
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1131 * Main frame decoding function
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1132 * FIXME add arguments
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1133 */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1134 static int dca_decode_frame(AVCodecContext * avctx,
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1135 void *data, int *data_size,
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1136 uint8_t * buf, int buf_size)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1137 {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1138
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1139 int i, j, k;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1140 int16_t *samples = data;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1141 DCAContext *s = avctx->priv_data;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1142 int channels;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1143
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1144
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1145 s->dca_buffer_size = dca_convert_bitstream(buf, buf_size, s->dca_buffer, DCA_MAX_FRAME_SIZE);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1146 if (s->dca_buffer_size == -1) {
5027
696cda281304 Better error reporting.
banan
parents: 4908
diff changeset
1147 av_log(avctx, AV_LOG_ERROR, "Not a valid DCA frame\n");
4599
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1148 return -1;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1149 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1150
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1151 init_get_bits(&s->gb, s->dca_buffer, s->dca_buffer_size * 8);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1152 if (dca_parse_frame_header(s) < 0) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1153 //seems like the frame is corrupt, try with the next one
5645
abf90ea2c392 Set data_size to zero when DCA header parse failed
kostya
parents: 5576
diff changeset
1154 *data_size=0;
4599
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1155 return buf_size;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1156 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1157 //set AVCodec values with parsed data
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1158 avctx->sample_rate = s->sample_rate;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1159 avctx->bit_rate = s->bit_rate;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1160
4893
2b3fbf807734 enable multichannel output in dca decoder.
jbr
parents: 4883
diff changeset
1161 channels = s->prim_channels + !!s->lfe;
5576
1a92e129a679 Add request_channels member to AVCodecContext so we now have a proper
reimar
parents: 5070
diff changeset
1162 avctx->channels = avctx->request_channels;
4893
2b3fbf807734 enable multichannel output in dca decoder.
jbr
parents: 4883
diff changeset
1163 if(avctx->channels == 0) {
2b3fbf807734 enable multichannel output in dca decoder.
jbr
parents: 4883
diff changeset
1164 avctx->channels = channels;
2b3fbf807734 enable multichannel output in dca decoder.
jbr
parents: 4883
diff changeset
1165 } else if(channels < avctx->channels) {
2b3fbf807734 enable multichannel output in dca decoder.
jbr
parents: 4883
diff changeset
1166 av_log(avctx, AV_LOG_WARNING, "DTS source channels are less than "
2b3fbf807734 enable multichannel output in dca decoder.
jbr
parents: 4883
diff changeset
1167 "specified: output to %d channels.\n", channels);
2b3fbf807734 enable multichannel output in dca decoder.
jbr
parents: 4883
diff changeset
1168 avctx->channels = channels;
2b3fbf807734 enable multichannel output in dca decoder.
jbr
parents: 4883
diff changeset
1169 }
2b3fbf807734 enable multichannel output in dca decoder.
jbr
parents: 4883
diff changeset
1170 if(avctx->channels == 2) {
2b3fbf807734 enable multichannel output in dca decoder.
jbr
parents: 4883
diff changeset
1171 s->output = DCA_STEREO;
2b3fbf807734 enable multichannel output in dca decoder.
jbr
parents: 4883
diff changeset
1172 } else if(avctx->channels != channels) {
2b3fbf807734 enable multichannel output in dca decoder.
jbr
parents: 4883
diff changeset
1173 av_log(avctx, AV_LOG_ERROR, "Cannot downmix DTS to %d channels.\n",
2b3fbf807734 enable multichannel output in dca decoder.
jbr
parents: 4883
diff changeset
1174 avctx->channels);
2b3fbf807734 enable multichannel output in dca decoder.
jbr
parents: 4883
diff changeset
1175 return -1;
2b3fbf807734 enable multichannel output in dca decoder.
jbr
parents: 4883
diff changeset
1176 }
2b3fbf807734 enable multichannel output in dca decoder.
jbr
parents: 4883
diff changeset
1177
2b3fbf807734 enable multichannel output in dca decoder.
jbr
parents: 4883
diff changeset
1178 channels = avctx->channels;
4599
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1179 if(*data_size < (s->sample_blocks / 8) * 256 * sizeof(int16_t) * channels)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1180 return -1;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1181 *data_size = 0;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1182 for (i = 0; i < (s->sample_blocks / 8); i++) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1183 dca_decode_block(s);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1184 s->dsp.float_to_int16(s->tsamples, s->samples, 256 * channels);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1185 /* interleave samples */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1186 for (j = 0; j < 256; j++) {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1187 for (k = 0; k < channels; k++)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1188 samples[k] = s->tsamples[j + k * 256];
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1189 samples += channels;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1190 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1191 *data_size += 256 * sizeof(int16_t) * channels;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1192 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1193
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1194 return buf_size;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1195 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1196
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1197
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1198
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1199 /**
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1200 * Build the cosine modulation tables for the QMF
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1201 *
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1202 * @param s pointer to the DCAContext
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1203 */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1204
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1205 static void pre_calc_cosmod(DCAContext * s)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1206 {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1207 int i, j, k;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1208 static int cosmod_inited = 0;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1209
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1210 if(cosmod_inited) return;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1211 for (j = 0, k = 0; k < 16; k++)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1212 for (i = 0; i < 16; i++)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1213 cos_mod[j++] = cos((2 * i + 1) * (2 * k + 1) * M_PI / 64);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1214
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1215 for (k = 0; k < 16; k++)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1216 for (i = 0; i < 16; i++)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1217 cos_mod[j++] = cos((i) * (2 * k + 1) * M_PI / 32);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1218
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1219 for (k = 0; k < 16; k++)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1220 cos_mod[j++] = 0.25 / (2 * cos((2 * k + 1) * M_PI / 128));
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1221
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1222 for (k = 0; k < 16; k++)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1223 cos_mod[j++] = -0.25 / (2.0 * sin((2 * k + 1) * M_PI / 128));
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1224
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1225 cosmod_inited = 1;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1226 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1227
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1228
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1229 /**
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1230 * DCA initialization
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1231 *
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1232 * @param avctx pointer to the AVCodecContext
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1233 */
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1234
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1235 static int dca_decode_init(AVCodecContext * avctx)
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1236 {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1237 DCAContext *s = avctx->priv_data;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1238
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1239 s->avctx = avctx;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1240 dca_init_vlcs();
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1241 pre_calc_cosmod(s);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1242
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1243 dsputil_init(&s->dsp, avctx);
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1244 return 0;
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1245 }
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1246
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1247
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1248 AVCodec dca_decoder = {
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1249 .name = "dca",
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1250 .type = CODEC_TYPE_AUDIO,
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1251 .id = CODEC_ID_DTS,
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1252 .priv_data_size = sizeof(DCAContext),
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1253 .init = dca_decode_init,
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1254 .decode = dca_decode_frame,
2cd245d65761 DCA decoder
kostya
parents:
diff changeset
1255 };