/* * DCA compatible decoder * Copyright (C) 2004 Gildas Bazin * Copyright (C) 2004 Benjamin Zores * Copyright (C) 2006 Benjamin Larsson * Copyright (C) 2007 Konstantin Shishkov * * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * FFmpeg is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with FFmpeg; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include <math.h>#include <stddef.h>#include <stdio.h> #include "libavutil/intmath.h"#include "libavutil/intreadwrite.h"#include "avcodec.h"#include "dsputil.h"#include "fft.h"#include "get_bits.h"#include "put_bits.h"#include "dcadata.h"#include "dcahuff.h"#include "dca.h"#include "synth_filter.h"#include "dcadsp.h" //#define TRACE #define DCA_PRIM_CHANNELS_MAX (5)#define DCA_SUBBANDS (32)#define DCA_ABITS_MAX (32) /* Should be 28 */#define DCA_SUBSUBFAMES_MAX (4)#define DCA_LFE_MAX (3) enum DCAMode { DCA_MONO = 0, DCA_CHANNEL, DCA_STEREO, DCA_STEREO_SUMDIFF, DCA_STEREO_TOTAL, DCA_3F, DCA_2F1R, DCA_3F1R, DCA_2F2R, DCA_3F2R, DCA_4F2R}; /* Tables for mapping dts channel configurations to libavcodec multichannel api. * Some compromises have been made for special configurations. Most configurations * are never used so complete accuracy is not needed. * * L = left, R = right, C = center, S = surround, F = front, R = rear, T = total, OV = overhead. * S -> side, when both rear and back are configured move one of them to the side channel * OV -> center back * All 2 channel configurations -> CH_LAYOUT_STEREO */ static const int64_t dca_core_channel_layout[] = { CH_FRONT_CENTER, ///< 1, A CH_LAYOUT_STEREO, ///< 2, A + B (dual mono) CH_LAYOUT_STEREO, ///< 2, L + R (stereo) CH_LAYOUT_STEREO, ///< 2, (L+R) + (L-R) (sum-difference) CH_LAYOUT_STEREO, ///< 2, LT +RT (left and right total) CH_LAYOUT_STEREO|CH_FRONT_CENTER, ///< 3, C+L+R CH_LAYOUT_STEREO|CH_BACK_CENTER, ///< 3, L+R+S CH_LAYOUT_STEREO|CH_FRONT_CENTER|CH_BACK_CENTER, ///< 4, C + L + R+ S CH_LAYOUT_STEREO|CH_SIDE_LEFT|CH_SIDE_RIGHT, ///< 4, L + R +SL+ SR CH_LAYOUT_STEREO|CH_FRONT_CENTER|CH_SIDE_LEFT|CH_SIDE_RIGHT, ///< 5, C + L + R+ SL+SR CH_LAYOUT_STEREO|CH_SIDE_LEFT|CH_SIDE_RIGHT|CH_FRONT_LEFT_OF_CENTER|CH_FRONT_RIGHT_OF_CENTER, ///< 6, CL + CR + L + R + SL + SR CH_LAYOUT_STEREO|CH_BACK_LEFT|CH_BACK_RIGHT|CH_FRONT_CENTER|CH_BACK_CENTER, ///< 6, C + L + R+ LR + RR + OV CH_FRONT_CENTER|CH_FRONT_RIGHT_OF_CENTER|CH_FRONT_LEFT_OF_CENTER|CH_BACK_CENTER|CH_BACK_LEFT|CH_BACK_RIGHT, ///< 6, CF+ CR+LF+ RF+LR + RR CH_FRONT_LEFT_OF_CENTER|CH_FRONT_CENTER|CH_FRONT_RIGHT_OF_CENTER|CH_LAYOUT_STEREO|CH_SIDE_LEFT|CH_SIDE_RIGHT, ///< 7, CL + C + CR + L + R + SL + SR CH_FRONT_LEFT_OF_CENTER|CH_FRONT_RIGHT_OF_CENTER|CH_LAYOUT_STEREO|CH_SIDE_LEFT|CH_SIDE_RIGHT|CH_BACK_LEFT|CH_BACK_RIGHT, ///< 8, CL + CR + L + R + SL1 + SL2+ SR1 + SR2 CH_FRONT_LEFT_OF_CENTER|CH_FRONT_CENTER|CH_FRONT_RIGHT_OF_CENTER|CH_LAYOUT_STEREO|CH_SIDE_LEFT|CH_BACK_CENTER|CH_SIDE_RIGHT, ///< 8, CL + C+ CR + L + R + SL + S+ SR}; static const int8_t dca_lfe_index[] = { 1,2,2,2,2,3,2,3,2,3,2,3,1,3,2,3}; static const int8_t dca_channel_reorder_lfe[][8] = { { 0, -1, -1, -1, -1, -1, -1, -1}, { 0, 1, -1, -1, -1, -1, -1, -1}, { 0, 1, -1, -1, -1, -1, -1, -1}, { 0, 1, -1, -1, -1, -1, -1, -1}, { 0, 1, -1, -1, -1, -1, -1, -1}, { 2, 0, 1, -1, -1, -1, -1, -1}, { 0, 1, 3, -1, -1, -1, -1, -1}, { 2, 0, 1, 4, -1, -1, -1, -1}, { 0, 1, 3, 4, -1, -1, -1, -1}, { 2, 0, 1, 4, 5, -1, -1, -1}, { 3, 4, 0, 1, 5, 6, -1, -1}, { 2, 0, 1, 4, 5, 6, -1, -1}, { 0, 6, 4, 5, 2, 3, -1, -1}, { 4, 2, 5, 0, 1, 6, 7, -1}, { 5, 6, 0, 1, 7, 3, 8, 4}, { 4, 2, 5, 0, 1, 6, 8, 7},}; static const int8_t dca_channel_reorder_nolfe[][8] = { { 0, -1, -1, -1, -1, -1, -1, -1}, { 0, 1, -1, -1, -1, -1, -1, -1}, { 0, 1, -1, -1, -1, -1, -1, -1}, { 0, 1, -1, -1, -1, -1, -1, -1}, { 0, 1, -1, -1, -1, -1, -1, -1}, { 2, 0, 1, -1, -1, -1, -1, -1}, { 0, 1, 2, -1, -1, -1, -1, -1}, { 2, 0, 1, 3, -1, -1, -1, -1}, { 0, 1, 2, 3, -1, -1, -1, -1}, { 2, 0, 1, 3, 4, -1, -1, -1}, { 2, 3, 0, 1, 4, 5, -1, -1}, { 2, 0, 1, 3, 4, 5, -1, -1}, { 0, 5, 3, 4, 1, 2, -1, -1}, { 3, 2, 4, 0, 1, 5, 6, -1}, { 4, 5, 0, 1, 6, 2, 7, 3}, { 3, 2, 4, 0, 1, 5, 7, 6},}; #define DCA_DOLBY 101 /* FIXME */ #define DCA_CHANNEL_BITS 6#define DCA_CHANNEL_MASK 0x3F #define DCA_LFE 0x80 #define HEADER_SIZE 14 #define DCA_MAX_FRAME_SIZE 16384 /** Bit allocation */typedef struct { int offset; ///< code values offset int maxbits[8]; ///< max bits in VLC int wrap; ///< wrap for get_vlc2() VLC vlc[8]; ///< actual codes} BitAlloc; static BitAlloc dca_bitalloc_index; ///< indexes for samples VLC selectstatic BitAlloc dca_tmode; ///< transition mode VLCsstatic BitAlloc dca_scalefactor; ///< scalefactor VLCsstatic BitAlloc dca_smpl_bitalloc[11]; ///< samples VLCs static av_always_inline int get_bitalloc(GetBitContext *gb, BitAlloc *ba, int idx){ return get_vlc2(gb, ba->vlc[idx].table, ba->vlc[idx].bits, ba->wrap) + ba->offset;} typedef struct { AVCodecContext *avctx; /* Frame header */ int frame_type; ///< type of the current frame int samples_deficit; ///< deficit sample count int crc_present; ///< crc is present in the bitstream int sample_blocks; ///< number of PCM sample blocks int frame_size; ///< primary frame byte size int amode; ///< audio channels arrangement int sample_rate; ///< audio sampling rate int bit_rate; ///< transmission bit rate int bit_rate_index; ///< transmission bit rate index int downmix; ///< embedded downmix enabled int dynrange; ///< embedded dynamic range flag int timestamp; ///< embedded time stamp flag int aux_data; ///< auxiliary data flag int hdcd; ///< source material is mastered in HDCD int ext_descr; ///< extension audio descriptor flag int ext_coding; ///< extended coding flag int aspf; ///< audio sync word insertion flag int lfe; ///< low frequency effects flag int predictor_history; ///< predictor history flag int header_crc; ///< header crc check bytes int multirate_inter; ///< multirate interpolator switch int version; ///< encoder software revision int copy_history; ///< copy history int source_pcm_res; ///< source pcm resolution int front_sum; ///< front sum/difference flag int surround_sum; ///< surround sum/difference flag int dialog_norm; ///< dialog normalisation parameter /* Primary audio coding header */ int subframes; ///< number of subframes int total_channels; ///< number of channels including extensions int prim_channels; ///< number of primary audio channels int subband_activity[DCA_PRIM_CHANNELS_MAX]; ///< subband activity count int vq_start_subband[DCA_PRIM_CHANNELS_MAX]; ///< high frequency vq start subband int joint_intensity[DCA_PRIM_CHANNELS_MAX]; ///< joint intensity coding index int transient_huffman[DCA_PRIM_CHANNELS_MAX]; ///< transient mode code book int scalefactor_huffman[DCA_PRIM_CHANNELS_MAX]; ///< scale factor code book int bitalloc_huffman[DCA_PRIM_CHANNELS_MAX]; ///< bit allocation quantizer select int quant_index_huffman[DCA_PRIM_CHANNELS_MAX][DCA_ABITS_MAX]; ///< quantization index codebook select float scalefactor_adj[DCA_PRIM_CHANNELS_MAX][DCA_ABITS_MAX]; ///< scale factor adjustment /* Primary audio coding side information */ int subsubframes; ///< number of subsubframes int partial_samples; ///< partial subsubframe samples count int prediction_mode[DCA_PRIM_CHANNELS_MAX][DCA_SUBBANDS]; ///< prediction mode (ADPCM used or not) int prediction_vq[DCA_PRIM_CHANNELS_MAX][DCA_SUBBANDS]; ///< prediction VQ coefs int bitalloc[DCA_PRIM_CHANNELS_MAX][DCA_SUBBANDS]; ///< bit allocation index int transition_mode[DCA_PRIM_CHANNELS_MAX][DCA_SUBBANDS]; ///< transition mode (transients) int scale_factor[DCA_PRIM_CHANNELS_MAX][DCA_SUBBANDS][2]; ///< scale factors (2 if transient) int joint_huff[DCA_PRIM_CHANNELS_MAX]; ///< joint subband scale factors codebook int joint_scale_factor[DCA_PRIM_CHANNELS_MAX][DCA_SUBBANDS]; ///< joint subband scale factors int downmix_coef[DCA_PRIM_CHANNELS_MAX][2]; ///< stereo downmix coefficients int dynrange_coef; ///< dynamic range coefficient int high_freq_vq[DCA_PRIM_CHANNELS_MAX][DCA_SUBBANDS]; ///< VQ encoded high frequency subbands float lfe_data[2 * DCA_SUBSUBFAMES_MAX * DCA_LFE_MAX * 2 /*history */ ]; ///< Low frequency effect data int lfe_scale_factor; /* Subband samples history (for ADPCM) */ float subband_samples_hist[DCA_PRIM_CHANNELS_MAX][DCA_SUBBANDS][4]; DECLARE_ALIGNED(16, float, subband_fir_hist)[DCA_PRIM_CHANNELS_MAX][512]; DECLARE_ALIGNED(16, float, subband_fir_noidea)[DCA_PRIM_CHANNELS_MAX][32]; int hist_index[DCA_PRIM_CHANNELS_MAX]; DECLARE_ALIGNED(16, float, raXin)[32]; int output; ///< type of output float add_bias; ///< output bias float scale_bias; ///< output scale DECLARE_ALIGNED(16, float, samples)[1536]; /* 6 * 256 = 1536, might only need 5 */ const float *samples_chanptr[6]; uint8_t dca_buffer[DCA_MAX_FRAME_SIZE]; int dca_buffer_size; ///< how much data is in the dca_buffer const int8_t* channel_order_tab; ///< channel reordering table, lfe and non lfe GetBitContext gb; /* Current position in DCA frame */ int current_subframe; int current_subsubframe; int debug_flag; ///< used for suppressing repeated error messages output DSPContext dsp; FFTContext imdct; SynthFilterContext synth; DCADSPContext dcadsp;} DCAContext; static const uint16_t dca_vlc_offs[] = { 0, 512, 640, 768, 1282, 1794, 2436, 3080, 3770, 4454, 5364, 5372, 5380, 5388, 5392, 5396, 5412, 5420, 5428, 5460, 5492, 5508, 5572, 5604, 5668, 5796, 5860, 5892, 6412, 6668, 6796, 7308, 7564, 7820, 8076, 8620, 9132, 9388, 9910, 10166, 10680, 11196, 11726, 12240, 12752, 13298, 13810, 14326, 14840, 15500, 16022, 16540, 17158, 17678, 18264, 18796, 19352, 19926, 20468, 21472, 22398, 23014, 23622,}; static av_cold void dca_init_vlcs(void){ static int vlcs_initialized = 0; int i, j, c = 14; static VLC_TYPE dca_table[23622][2]; if (vlcs_initialized) return; dca_bitalloc_index.offset = 1; dca_bitalloc_index.wrap = 2; for (i = 0; i < 5; i++) { dca_bitalloc_index.vlc[i].table = &dca_table[dca_vlc_offs[i]]; dca_bitalloc_index.vlc[i].table_allocated = dca_vlc_offs[i + 1] - dca_vlc_offs[i]; init_vlc(&dca_bitalloc_index.vlc[i], bitalloc_12_vlc_bits[i], 12, bitalloc_12_bits[i], 1, 1, bitalloc_12_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC); } dca_scalefactor.offset = -64; dca_scalefactor.wrap = 2; for (i = 0; i < 5; i++) { dca_scalefactor.vlc[i].table = &dca_table[dca_vlc_offs[i + 5]]; dca_scalefactor.vlc[i].table_allocated = dca_vlc_offs[i + 6] - dca_vlc_offs[i + 5]; init_vlc(&dca_scalefactor.vlc[i], SCALES_VLC_BITS, 129, scales_bits[i], 1, 1, scales_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC); } dca_tmode.offset = 0; dca_tmode.wrap = 1; for (i = 0; i < 4; i++) { dca_tmode.vlc[i].table = &dca_table[dca_vlc_offs[i + 10]]; dca_tmode.vlc[i].table_allocated = dca_vlc_offs[i + 11] - dca_vlc_offs[i + 10]; init_vlc(&dca_tmode.vlc[i], tmode_vlc_bits[i], 4, tmode_bits[i], 1, 1, tmode_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC); } for(i = 0; i < 10; i++) for(j = 0; j < 7; j++){ if(!bitalloc_codes[i][j]) break; dca_smpl_bitalloc[i+1].offset = bitalloc_offsets[i]; dca_smpl_bitalloc[i+1].wrap = 1 + (j > 4); dca_smpl_bitalloc[i+1].vlc[j].table = &dca_table[dca_vlc_offs[c]]; dca_smpl_bitalloc[i+1].vlc[j].table_allocated = dca_vlc_offs[c + 1] - dca_vlc_offs[c]; init_vlc(&dca_smpl_bitalloc[i+1].vlc[j], bitalloc_maxbits[i][j], bitalloc_sizes[i], bitalloc_bits[i][j], 1, 1, bitalloc_codes[i][j], 2, 2, INIT_VLC_USE_NEW_STATIC); c++; } vlcs_initialized = 1;} static inline void get_array(GetBitContext *gb, int *dst, int len, int bits){ while(len--) *dst++ = get_bits(gb, bits);} static int dca_parse_frame_header(DCAContext * s){ int i, j; static const float adj_table[4] = { 1.0, 1.1250, 1.2500, 1.4375 }; static const int bitlen[11] = { 0, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3 }; static const int thr[11] = { 0, 1, 3, 3, 3, 3, 7, 7, 7, 7, 7 }; init_get_bits(&s->gb, s->dca_buffer, s->dca_buffer_size * 8); /* Sync code */ get_bits(&s->gb, 32); /* Frame header */ s->frame_type = get_bits(&s->gb, 1); s->samples_deficit = get_bits(&s->gb, 5) + 1; s->crc_present = get_bits(&s->gb, 1); s->sample_blocks = get_bits(&s->gb, 7) + 1; s->frame_size = get_bits(&s->gb, 14) + 1; if (s->frame_size < 95) return -1; s->amode = get_bits(&s->gb, 6); s->sample_rate = dca_sample_rates[get_bits(&s->gb, 4)]; if (!s->sample_rate) return -1; s->bit_rate_index = get_bits(&s->gb, 5); s->bit_rate = dca_bit_rates[s->bit_rate_index]; if (!s->bit_rate) return -1; s->downmix = get_bits(&s->gb, 1); s->dynrange = get_bits(&s->gb, 1); s->timestamp = get_bits(&s->gb, 1); s->aux_data = get_bits(&s->gb, 1); s->hdcd = get_bits(&s->gb, 1); s->ext_descr = get_bits(&s->gb, 3); s->ext_coding = get_bits(&s->gb, 1); s->aspf = get_bits(&s->gb, 1); s->lfe = get_bits(&s->gb, 2); s->predictor_history = get_bits(&s->gb, 1); /* TODO: check CRC */ if (s->crc_present) s->header_crc = get_bits(&s->gb, 16); s->multirate_inter = get_bits(&s->gb, 1); s->version = get_bits(&s->gb, 4); s->copy_history = get_bits(&s->gb, 2); s->source_pcm_res = get_bits(&s->gb, 3); s->front_sum = get_bits(&s->gb, 1); s->surround_sum = get_bits(&s->gb, 1); s->dialog_norm = get_bits(&s->gb, 4); /* FIXME: channels mixing levels */ s->output = s->amode; if(s->lfe) s->output |= DCA_LFE; #ifdef TRACE av_log(s->avctx, AV_LOG_DEBUG, "frame type: %i\n", s->frame_type); av_log(s->avctx, AV_LOG_DEBUG, "samples deficit: %i\n", s->samples_deficit); av_log(s->avctx, AV_LOG_DEBUG, "crc present: %i\n", s->crc_present); av_log(s->avctx, AV_LOG_DEBUG, "sample blocks: %i (%i samples)\n", s->sample_blocks, s->sample_blocks * 32); av_log(s->avctx, AV_LOG_DEBUG, "frame size: %i bytes\n", s->frame_size); av_log(s->avctx, AV_LOG_DEBUG, "amode: %i (%i channels)\n", s->amode, dca_channels[s->amode]); av_log(s->avctx, AV_LOG_DEBUG, "sample rate: %i Hz\n", s->sample_rate); av_log(s->avctx, AV_LOG_DEBUG, "bit rate: %i bits/s\n", s->bit_rate); av_log(s->avctx, AV_LOG_DEBUG, "downmix: %i\n", s->downmix); av_log(s->avctx, AV_LOG_DEBUG, "dynrange: %i\n", s->dynrange); av_log(s->avctx, AV_LOG_DEBUG, "timestamp: %i\n", s->timestamp); av_log(s->avctx, AV_LOG_DEBUG, "aux_data: %i\n", s->aux_data); av_log(s->avctx, AV_LOG_DEBUG, "hdcd: %i\n", s->hdcd); av_log(s->avctx, AV_LOG_DEBUG, "ext descr: %i\n", s->ext_descr); av_log(s->avctx, AV_LOG_DEBUG, "ext coding: %i\n", s->ext_coding); av_log(s->avctx, AV_LOG_DEBUG, "aspf: %i\n", s->aspf); av_log(s->avctx, AV_LOG_DEBUG, "lfe: %i\n", s->lfe); av_log(s->avctx, AV_LOG_DEBUG, "predictor history: %i\n", s->predictor_history); av_log(s->avctx, AV_LOG_DEBUG, "header crc: %i\n", s->header_crc); av_log(s->avctx, AV_LOG_DEBUG, "multirate inter: %i\n", s->multirate_inter); av_log(s->avctx, AV_LOG_DEBUG, "version number: %i\n", s->version); av_log(s->avctx, AV_LOG_DEBUG, "copy history: %i\n", s->copy_history); av_log(s->avctx, AV_LOG_DEBUG, "source pcm resolution: %i (%i bits/sample)\n", s->source_pcm_res, dca_bits_per_sample[s->source_pcm_res]); av_log(s->avctx, AV_LOG_DEBUG, "front sum: %i\n", s->front_sum); av_log(s->avctx, AV_LOG_DEBUG, "surround sum: %i\n", s->surround_sum); av_log(s->avctx, AV_LOG_DEBUG, "dialog norm: %i\n", s->dialog_norm); av_log(s->avctx, AV_LOG_DEBUG, "\n");#endif /* Primary audio coding header */ s->subframes = get_bits(&s->gb, 4) + 1; s->total_channels = get_bits(&s->gb, 3) + 1; s->prim_channels = s->total_channels; if (s->prim_channels > DCA_PRIM_CHANNELS_MAX) s->prim_channels = DCA_PRIM_CHANNELS_MAX; /* We only support DTS core */ for (i = 0; i < s->prim_channels; i++) { s->subband_activity[i] = get_bits(&s->gb, 5) + 2; if (s->subband_activity[i] > DCA_SUBBANDS) s->subband_activity[i] = DCA_SUBBANDS; } for (i = 0; i < s->prim_channels; i++) { s->vq_start_subband[i] = get_bits(&s->gb, 5) + 1; if (s->vq_start_subband[i] > DCA_SUBBANDS) s->vq_start_subband[i] = DCA_SUBBANDS; } get_array(&s->gb, s->joint_intensity, s->prim_channels, 3); get_array(&s->gb, s->transient_huffman, s->prim_channels, 2); get_array(&s->gb, s->scalefactor_huffman, s->prim_channels, 3); get_array(&s->gb, s->bitalloc_huffman, s->prim_channels, 3); /* Get codebooks quantization indexes */ memset(s->quant_index_huffman, 0, sizeof(s->quant_index_huffman)); for (j = 1; j < 11; j++) for (i = 0; i < s->prim_channels; i++) s->quant_index_huffman[i][j] = get_bits(&s->gb, bitlen[j]); /* Get scale factor adjustment */ for (j = 0; j < 11; j++) for (i = 0; i < s->prim_channels; i++) s->scalefactor_adj[i][j] = 1; for (j = 1; j < 11; j++) for (i = 0; i < s->prim_channels; i++) if (s->quant_index_huffman[i][j] < thr[j]) s->scalefactor_adj[i][j] = adj_table[get_bits(&s->gb, 2)]; if (s->crc_present) { /* Audio header CRC check */ get_bits(&s->gb, 16); } s->current_subframe = 0; s->current_subsubframe = 0; #ifdef TRACE av_log(s->avctx, AV_LOG_DEBUG, "subframes: %i\n", s->subframes); av_log(s->avctx, AV_LOG_DEBUG, "prim channels: %i\n", s->prim_channels); for(i = 0; i < s->prim_channels; i++){ av_log(s->avctx, AV_LOG_DEBUG, "subband activity: %i\n", s->subband_activity[i]); av_log(s->avctx, AV_LOG_DEBUG, "vq start subband: %i\n", s->vq_start_subband[i]); av_log(s->avctx, AV_LOG_DEBUG, "joint intensity: %i\n", s->joint_intensity[i]); av_log(s->avctx, AV_LOG_DEBUG, "transient mode codebook: %i\n", s->transient_huffman[i]); av_log(s->avctx, AV_LOG_DEBUG, "scale factor codebook: %i\n", s->scalefactor_huffman[i]); av_log(s->avctx, AV_LOG_DEBUG, "bit allocation quantizer: %i\n", s->bitalloc_huffman[i]); av_log(s->avctx, AV_LOG_DEBUG, "quant index huff:"); for (j = 0; j < 11; j++) av_log(s->avctx, AV_LOG_DEBUG, " %i", s->quant_index_huffman[i][j]); av_log(s->avctx, AV_LOG_DEBUG, "\n"); av_log(s->avctx, AV_LOG_DEBUG, "scalefac adj:"); for (j = 0; j < 11; j++) av_log(s->avctx, AV_LOG_DEBUG, " %1.3f", s->scalefactor_adj[i][j]); av_log(s->avctx, AV_LOG_DEBUG, "\n"); }#endif return 0;} static inline int get_scale(GetBitContext *gb, int level, int value){ if (level < 5) { /* huffman encoded */ value += get_bitalloc(gb, &dca_scalefactor, level); } else if(level < 8) value = get_bits(gb, level + 1);Lines 1–500 of 1333. Load more
/* * DCA compatible decoder * Copyright (C) 2004 Gildas Bazin * Copyright (C) 2004 Benjamin Zores * Copyright (C) 2006 Benjamin Larsson * Copyright (C) 2007 Konstantin Shishkov * * This file is part of FFmpeg. * * FFmpeg is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * FFmpeg is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with FFmpeg; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include <math.h> #include <stddef.h> #include <stdio.h> #include "libavutil/intmath.h" #include "libavutil/intreadwrite.h" #include "avcodec.h" #include "dsputil.h" #include "fft.h" #include "get_bits.h" #include "put_bits.h" #include "dcadata.h" #include "dcahuff.h" #include "dca.h" #include "synth_filter.h" #include "dcadsp.h" //#define TRACE #define DCA_PRIM_CHANNELS_MAX (5) #define DCA_SUBBANDS (32) #define DCA_ABITS_MAX (32) /* Should be 28 */ #define DCA_SUBSUBFAMES_MAX (4) #define DCA_LFE_MAX (3) enum DCAMode { DCA_MONO = 0, DCA_CHANNEL, DCA_STEREO, DCA_STEREO_SUMDIFF, DCA_STEREO_TOTAL, DCA_3F, DCA_2F1R, DCA_3F1R, DCA_2F2R, DCA_3F2R, DCA_4F2R }; /* Tables for mapping dts channel configurations to libavcodec multichannel api. * Some compromises have been made for special configurations. Most configurations * are never used so complete accuracy is not needed. * * L = left, R = right, C = center, S = surround, F = front, R = rear, T = total, OV = overhead. * S -> side, when both rear and back are configured move one of them to the side channel * OV -> center back * All 2 channel configurations -> CH_LAYOUT_STEREO */ static const int64_t dca_core_channel_layout[] = { CH_FRONT_CENTER, ///< 1, A CH_LAYOUT_STEREO, ///< 2, A + B (dual mono) CH_LAYOUT_STEREO, ///< 2, L + R (stereo) CH_LAYOUT_STEREO, ///< 2, (L+R) + (L-R) (sum-difference) CH_LAYOUT_STEREO, ///< 2, LT +RT (left and right total) CH_LAYOUT_STEREO|CH_FRONT_CENTER, ///< 3, C+L+R CH_LAYOUT_STEREO|CH_BACK_CENTER, ///< 3, L+R+S CH_LAYOUT_STEREO|CH_FRONT_CENTER|CH_BACK_CENTER, ///< 4, C + L + R+ S CH_LAYOUT_STEREO|CH_SIDE_LEFT|CH_SIDE_RIGHT, ///< 4, L + R +SL+ SR CH_LAYOUT_STEREO|CH_FRONT_CENTER|CH_SIDE_LEFT|CH_SIDE_RIGHT, ///< 5, C + L + R+ SL+SR CH_LAYOUT_STEREO|CH_SIDE_LEFT|CH_SIDE_RIGHT|CH_FRONT_LEFT_OF_CENTER|CH_FRONT_RIGHT_OF_CENTER, ///< 6, CL + CR + L + R + SL + SR CH_LAYOUT_STEREO|CH_BACK_LEFT|CH_BACK_RIGHT|CH_FRONT_CENTER|CH_BACK_CENTER, ///< 6, C + L + R+ LR + RR + OV CH_FRONT_CENTER|CH_FRONT_RIGHT_OF_CENTER|CH_FRONT_LEFT_OF_CENTER|CH_BACK_CENTER|CH_BACK_LEFT|CH_BACK_RIGHT, ///< 6, CF+ CR+LF+ RF+LR + RR CH_FRONT_LEFT_OF_CENTER|CH_FRONT_CENTER|CH_FRONT_RIGHT_OF_CENTER|CH_LAYOUT_STEREO|CH_SIDE_LEFT|CH_SIDE_RIGHT, ///< 7, CL + C + CR + L + R + SL + SR CH_FRONT_LEFT_OF_CENTER|CH_FRONT_RIGHT_OF_CENTER|CH_LAYOUT_STEREO|CH_SIDE_LEFT|CH_SIDE_RIGHT|CH_BACK_LEFT|CH_BACK_RIGHT, ///< 8, CL + CR + L + R + SL1 + SL2+ SR1 + SR2 CH_FRONT_LEFT_OF_CENTER|CH_FRONT_CENTER|CH_FRONT_RIGHT_OF_CENTER|CH_LAYOUT_STEREO|CH_SIDE_LEFT|CH_BACK_CENTER|CH_SIDE_RIGHT, ///< 8, CL + C+ CR + L + R + SL + S+ SR }; static const int8_t dca_lfe_index[] = { 1,2,2,2,2,3,2,3,2,3,2,3,1,3,2,3 }; static const int8_t dca_channel_reorder_lfe[][8] = { { 0, -1, -1, -1, -1, -1, -1, -1}, { 0, 1, -1, -1, -1, -1, -1, -1}, { 0, 1, -1, -1, -1, -1, -1, -1}, { 0, 1, -1, -1, -1, -1, -1, -1}, { 0, 1, -1, -1, -1, -1, -1, -1}, { 2, 0, 1, -1, -1, -1, -1, -1}, { 0, 1, 3, -1, -1, -1, -1, -1}, { 2, 0, 1, 4, -1, -1, -1, -1}, { 0, 1, 3, 4, -1, -1, -1, -1}, { 2, 0, 1, 4, 5, -1, -1, -1}, { 3, 4, 0, 1, 5, 6, -1, -1}, { 2, 0, 1, 4, 5, 6, -1, -1}, { 0, 6, 4, 5, 2, 3, -1, -1}, { 4, 2, 5, 0, 1, 6, 7, -1}, { 5, 6, 0, 1, 7, 3, 8, 4}, { 4, 2, 5, 0, 1, 6, 8, 7}, }; static const int8_t dca_channel_reorder_nolfe[][8] = { { 0, -1, -1, -1, -1, -1, -1, -1}, { 0, 1, -1, -1, -1, -1, -1, -1}, { 0, 1, -1, -1, -1, -1, -1, -1}, { 0, 1, -1, -1, -1, -1, -1, -1}, { 0, 1, -1, -1, -1, -1, -1, -1}, { 2, 0, 1, -1, -1, -1, -1, -1}, { 0, 1, 2, -1, -1, -1, -1, -1}, { 2, 0, 1, 3, -1, -1, -1, -1}, { 0, 1, 2, 3, -1, -1, -1, -1}, { 2, 0, 1, 3, 4, -1, -1, -1}, { 2, 3, 0, 1, 4, 5, -1, -1}, { 2, 0, 1, 3, 4, 5, -1, -1}, { 0, 5, 3, 4, 1, 2, -1, -1}, { 3, 2, 4, 0, 1, 5, 6, -1}, { 4, 5, 0, 1, 6, 2, 7, 3}, { 3, 2, 4, 0, 1, 5, 7, 6}, }; #define DCA_DOLBY 101 /* FIXME */ #define DCA_CHANNEL_BITS 6 #define DCA_CHANNEL_MASK 0x3F #define DCA_LFE 0x80 #define HEADER_SIZE 14 #define DCA_MAX_FRAME_SIZE 16384 /** Bit allocation */ typedef struct { int offset; ///< code values offset int maxbits[8]; ///< max bits in VLC int wrap; ///< wrap for get_vlc2() VLC vlc[8]; ///< actual codes } BitAlloc; static BitAlloc dca_bitalloc_index; ///< indexes for samples VLC select static BitAlloc dca_tmode; ///< transition mode VLCs static BitAlloc dca_scalefactor; ///< scalefactor VLCs static BitAlloc dca_smpl_bitalloc[11]; ///< samples VLCs static av_always_inline int get_bitalloc(GetBitContext *gb, BitAlloc *ba, int idx) { return get_vlc2(gb, ba->vlc[idx].table, ba->vlc[idx].bits, ba->wrap) + ba->offset; } typedef struct { AVCodecContext *avctx; /* Frame header */ int frame_type; ///< type of the current frame int samples_deficit; ///< deficit sample count int crc_present; ///< crc is present in the bitstream int sample_blocks; ///< number of PCM sample blocks int frame_size; ///< primary frame byte size int amode; ///< audio channels arrangement int sample_rate; ///< audio sampling rate int bit_rate; ///< transmission bit rate int bit_rate_index; ///< transmission bit rate index int downmix; ///< embedded downmix enabled int dynrange; ///< embedded dynamic range flag int timestamp; ///< embedded time stamp flag int aux_data; ///< auxiliary data flag int hdcd; ///< source material is mastered in HDCD int ext_descr; ///< extension audio descriptor flag int ext_coding; ///< extended coding flag int aspf; ///< audio sync word insertion flag int lfe; ///< low frequency effects flag int predictor_history; ///< predictor history flag int header_crc; ///< header crc check bytes int multirate_inter; ///< multirate interpolator switch int version; ///< encoder software revision int copy_history; ///< copy history int source_pcm_res; ///< source pcm resolution int front_sum; ///< front sum/difference flag int surround_sum; ///< surround sum/difference flag int dialog_norm; ///< dialog normalisation parameter /* Primary audio coding header */ int subframes; ///< number of subframes int total_channels; ///< number of channels including extensions int prim_channels; ///< number of primary audio channels int subband_activity[DCA_PRIM_CHANNELS_MAX]; ///< subband activity count int vq_start_subband[DCA_PRIM_CHANNELS_MAX]; ///< high frequency vq start subband int joint_intensity[DCA_PRIM_CHANNELS_MAX]; ///< joint intensity coding index int transient_huffman[DCA_PRIM_CHANNELS_MAX]; ///< transient mode code book int scalefactor_huffman[DCA_PRIM_CHANNELS_MAX]; ///< scale factor code book int bitalloc_huffman[DCA_PRIM_CHANNELS_MAX]; ///< bit allocation quantizer select int quant_index_huffman[DCA_PRIM_CHANNELS_MAX][DCA_ABITS_MAX]; ///< quantization index codebook select float scalefactor_adj[DCA_PRIM_CHANNELS_MAX][DCA_ABITS_MAX]; ///< scale factor adjustment /* Primary audio coding side information */ int subsubframes; ///< number of subsubframes int partial_samples; ///< partial subsubframe samples count int prediction_mode[DCA_PRIM_CHANNELS_MAX][DCA_SUBBANDS]; ///< prediction mode (ADPCM used or not) int prediction_vq[DCA_PRIM_CHANNELS_MAX][DCA_SUBBANDS]; ///< prediction VQ coefs int bitalloc[DCA_PRIM_CHANNELS_MAX][DCA_SUBBANDS]; ///< bit allocation index int transition_mode[DCA_PRIM_CHANNELS_MAX][DCA_SUBBANDS]; ///< transition mode (transients) int scale_factor[DCA_PRIM_CHANNELS_MAX][DCA_SUBBANDS][2]; ///< scale factors (2 if transient) int joint_huff[DCA_PRIM_CHANNELS_MAX]; ///< joint subband scale factors codebook int joint_scale_factor[DCA_PRIM_CHANNELS_MAX][DCA_SUBBANDS]; ///< joint subband scale factors int downmix_coef[DCA_PRIM_CHANNELS_MAX][2]; ///< stereo downmix coefficients int dynrange_coef; ///< dynamic range coefficient int high_freq_vq[DCA_PRIM_CHANNELS_MAX][DCA_SUBBANDS]; ///< VQ encoded high frequency subbands float lfe_data[2 * DCA_SUBSUBFAMES_MAX * DCA_LFE_MAX * 2 /*history */ ]; ///< Low frequency effect data int lfe_scale_factor; /* Subband samples history (for ADPCM) */ float subband_samples_hist[DCA_PRIM_CHANNELS_MAX][DCA_SUBBANDS][4]; DECLARE_ALIGNED(16, float, subband_fir_hist)[DCA_PRIM_CHANNELS_MAX][512]; DECLARE_ALIGNED(16, float, subband_fir_noidea)[DCA_PRIM_CHANNELS_MAX][32]; int hist_index[DCA_PRIM_CHANNELS_MAX]; DECLARE_ALIGNED(16, float, raXin)[32]; int output; ///< type of output float add_bias; ///< output bias float scale_bias; ///< output scale DECLARE_ALIGNED(16, float, samples)[1536]; /* 6 * 256 = 1536, might only need 5 */ const float *samples_chanptr[6]; uint8_t dca_buffer[DCA_MAX_FRAME_SIZE]; int dca_buffer_size; ///< how much data is in the dca_buffer const int8_t* channel_order_tab; ///< channel reordering table, lfe and non lfe GetBitContext gb; /* Current position in DCA frame */ int current_subframe; int current_subsubframe; int debug_flag; ///< used for suppressing repeated error messages output DSPContext dsp; FFTContext imdct; SynthFilterContext synth; DCADSPContext dcadsp; } DCAContext; static const uint16_t dca_vlc_offs[] = { 0, 512, 640, 768, 1282, 1794, 2436, 3080, 3770, 4454, 5364, 5372, 5380, 5388, 5392, 5396, 5412, 5420, 5428, 5460, 5492, 5508, 5572, 5604, 5668, 5796, 5860, 5892, 6412, 6668, 6796, 7308, 7564, 7820, 8076, 8620, 9132, 9388, 9910, 10166, 10680, 11196, 11726, 12240, 12752, 13298, 13810, 14326, 14840, 15500, 16022, 16540, 17158, 17678, 18264, 18796, 19352, 19926, 20468, 21472, 22398, 23014, 23622, }; static av_cold void dca_init_vlcs(void) { static int vlcs_initialized = 0; int i, j, c = 14; static VLC_TYPE dca_table[23622][2]; if (vlcs_initialized) return; dca_bitalloc_index.offset = 1; dca_bitalloc_index.wrap = 2; for (i = 0; i < 5; i++) { dca_bitalloc_index.vlc[i].table = &dca_table[dca_vlc_offs[i]]; dca_bitalloc_index.vlc[i].table_allocated = dca_vlc_offs[i + 1] - dca_vlc_offs[i]; init_vlc(&dca_bitalloc_index.vlc[i], bitalloc_12_vlc_bits[i], 12, bitalloc_12_bits[i], 1, 1, bitalloc_12_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC); } dca_scalefactor.offset = -64; dca_scalefactor.wrap = 2; for (i = 0; i < 5; i++) { dca_scalefactor.vlc[i].table = &dca_table[dca_vlc_offs[i + 5]]; dca_scalefactor.vlc[i].table_allocated = dca_vlc_offs[i + 6] - dca_vlc_offs[i + 5]; init_vlc(&dca_scalefactor.vlc[i], SCALES_VLC_BITS, 129, scales_bits[i], 1, 1, scales_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC); } dca_tmode.offset = 0; dca_tmode.wrap = 1; for (i = 0; i < 4; i++) { dca_tmode.vlc[i].table = &dca_table[dca_vlc_offs[i + 10]]; dca_tmode.vlc[i].table_allocated = dca_vlc_offs[i + 11] - dca_vlc_offs[i + 10]; init_vlc(&dca_tmode.vlc[i], tmode_vlc_bits[i], 4, tmode_bits[i], 1, 1, tmode_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC); } for(i = 0; i < 10; i++) for(j = 0; j < 7; j++){ if(!bitalloc_codes[i][j]) break; dca_smpl_bitalloc[i+1].offset = bitalloc_offsets[i]; dca_smpl_bitalloc[i+1].wrap = 1 + (j > 4); dca_smpl_bitalloc[i+1].vlc[j].table = &dca_table[dca_vlc_offs[c]]; dca_smpl_bitalloc[i+1].vlc[j].table_allocated = dca_vlc_offs[c + 1] - dca_vlc_offs[c]; init_vlc(&dca_smpl_bitalloc[i+1].vlc[j], bitalloc_maxbits[i][j], bitalloc_sizes[i], bitalloc_bits[i][j], 1, 1, bitalloc_codes[i][j], 2, 2, INIT_VLC_USE_NEW_STATIC); c++; } vlcs_initialized = 1; } static inline void get_array(GetBitContext *gb, int *dst, int len, int bits) { while(len--) *dst++ = get_bits(gb, bits); } static int dca_parse_frame_header(DCAContext * s) { int i, j; static const float adj_table[4] = { 1.0, 1.1250, 1.2500, 1.4375 }; static const int bitlen[11] = { 0, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3 }; static const int thr[11] = { 0, 1, 3, 3, 3, 3, 7, 7, 7, 7, 7 }; init_get_bits(&s->gb, s->dca_buffer, s->dca_buffer_size * 8); /* Sync code */ get_bits(&s->gb, 32); /* Frame header */ s->frame_type = get_bits(&s->gb, 1); s->samples_deficit = get_bits(&s->gb, 5) + 1; s->crc_present = get_bits(&s->gb, 1); s->sample_blocks = get_bits(&s->gb, 7) + 1; s->frame_size = get_bits(&s->gb, 14) + 1; if (s->frame_size < 95) return -1; s->amode = get_bits(&s->gb, 6); s->sample_rate = dca_sample_rates[get_bits(&s->gb, 4)]; if (!s->sample_rate) return -1; s->bit_rate_index = get_bits(&s->gb, 5); s->bit_rate = dca_bit_rates[s->bit_rate_index]; if (!s->bit_rate) return -1; s->downmix = get_bits(&s->gb, 1); s->dynrange = get_bits(&s->gb, 1); s->timestamp = get_bits(&s->gb, 1); s->aux_data = get_bits(&s->gb, 1); s->hdcd = get_bits(&s->gb, 1); s->ext_descr = get_bits(&s->gb, 3); s->ext_coding = get_bits(&s->gb, 1); s->aspf = get_bits(&s->gb, 1); s->lfe = get_bits(&s->gb, 2); s->predictor_history = get_bits(&s->gb, 1); /* TODO: check CRC */ if (s->crc_present) s->header_crc = get_bits(&s->gb, 16); s->multirate_inter = get_bits(&s->gb, 1); s->version = get_bits(&s->gb, 4); s->copy_history = get_bits(&s->gb, 2); s->source_pcm_res = get_bits(&s->gb, 3); s->front_sum = get_bits(&s->gb, 1); s->surround_sum = get_bits(&s->gb, 1); s->dialog_norm = get_bits(&s->gb, 4); /* FIXME: channels mixing levels */ s->output = s->amode; if(s->lfe) s->output |= DCA_LFE; #ifdef TRACE av_log(s->avctx, AV_LOG_DEBUG, "frame type: %i\n", s->frame_type); av_log(s->avctx, AV_LOG_DEBUG, "samples deficit: %i\n", s->samples_deficit); av_log(s->avctx, AV_LOG_DEBUG, "crc present: %i\n", s->crc_present); av_log(s->avctx, AV_LOG_DEBUG, "sample blocks: %i (%i samples)\n", s->sample_blocks, s->sample_blocks * 32); av_log(s->avctx, AV_LOG_DEBUG, "frame size: %i bytes\n", s->frame_size); av_log(s->avctx, AV_LOG_DEBUG, "amode: %i (%i channels)\n", s->amode, dca_channels[s->amode]); av_log(s->avctx, AV_LOG_DEBUG, "sample rate: %i Hz\n", s->sample_rate); av_log(s->avctx, AV_LOG_DEBUG, "bit rate: %i bits/s\n", s->bit_rate); av_log(s->avctx, AV_LOG_DEBUG, "downmix: %i\n", s->downmix); av_log(s->avctx, AV_LOG_DEBUG, "dynrange: %i\n", s->dynrange); av_log(s->avctx, AV_LOG_DEBUG, "timestamp: %i\n", s->timestamp); av_log(s->avctx, AV_LOG_DEBUG, "aux_data: %i\n", s->aux_data); av_log(s->avctx, AV_LOG_DEBUG, "hdcd: %i\n", s->hdcd); av_log(s->avctx, AV_LOG_DEBUG, "ext descr: %i\n", s->ext_descr); av_log(s->avctx, AV_LOG_DEBUG, "ext coding: %i\n", s->ext_coding); av_log(s->avctx, AV_LOG_DEBUG, "aspf: %i\n", s->aspf); av_log(s->avctx, AV_LOG_DEBUG, "lfe: %i\n", s->lfe); av_log(s->avctx, AV_LOG_DEBUG, "predictor history: %i\n", s->predictor_history); av_log(s->avctx, AV_LOG_DEBUG, "header crc: %i\n", s->header_crc); av_log(s->avctx, AV_LOG_DEBUG, "multirate inter: %i\n", s->multirate_inter); av_log(s->avctx, AV_LOG_DEBUG, "version number: %i\n", s->version); av_log(s->avctx, AV_LOG_DEBUG, "copy history: %i\n", s->copy_history); av_log(s->avctx, AV_LOG_DEBUG, "source pcm resolution: %i (%i bits/sample)\n", s->source_pcm_res, dca_bits_per_sample[s->source_pcm_res]); av_log(s->avctx, AV_LOG_DEBUG, "front sum: %i\n", s->front_sum); av_log(s->avctx, AV_LOG_DEBUG, "surround sum: %i\n", s->surround_sum); av_log(s->avctx, AV_LOG_DEBUG, "dialog norm: %i\n", s->dialog_norm); av_log(s->avctx, AV_LOG_DEBUG, "\n"); #endif /* Primary audio coding header */ s->subframes = get_bits(&s->gb, 4) + 1; s->total_channels = get_bits(&s->gb, 3) + 1; s->prim_channels = s->total_channels; if (s->prim_channels > DCA_PRIM_CHANNELS_MAX) s->prim_channels = DCA_PRIM_CHANNELS_MAX; /* We only support DTS core */ for (i = 0; i < s->prim_channels; i++) { s->subband_activity[i] = get_bits(&s->gb, 5) + 2; if (s->subband_activity[i] > DCA_SUBBANDS) s->subband_activity[i] = DCA_SUBBANDS; } for (i = 0; i < s->prim_channels; i++) { s->vq_start_subband[i] = get_bits(&s->gb, 5) + 1; if (s->vq_start_subband[i] > DCA_SUBBANDS) s->vq_start_subband[i] = DCA_SUBBANDS; } get_array(&s->gb, s->joint_intensity, s->prim_channels, 3); get_array(&s->gb, s->transient_huffman, s->prim_channels, 2); get_array(&s->gb, s->scalefactor_huffman, s->prim_channels, 3); get_array(&s->gb, s->bitalloc_huffman, s->prim_channels, 3); /* Get codebooks quantization indexes */ memset(s->quant_index_huffman, 0, sizeof(s->quant_index_huffman)); for (j = 1; j < 11; j++) for (i = 0; i < s->prim_channels; i++) s->quant_index_huffman[i][j] = get_bits(&s->gb, bitlen[j]); /* Get scale factor adjustment */ for (j = 0; j < 11; j++) for (i = 0; i < s->prim_channels; i++) s->scalefactor_adj[i][j] = 1; for (j = 1; j < 11; j++) for (i = 0; i < s->prim_channels; i++) if (s->quant_index_huffman[i][j] < thr[j]) s->scalefactor_adj[i][j] = adj_table[get_bits(&s->gb, 2)]; if (s->crc_present) { /* Audio header CRC check */ get_bits(&s->gb, 16); } s->current_subframe = 0; s->current_subsubframe = 0; #ifdef TRACE av_log(s->avctx, AV_LOG_DEBUG, "subframes: %i\n", s->subframes); av_log(s->avctx, AV_LOG_DEBUG, "prim channels: %i\n", s->prim_channels); for(i = 0; i < s->prim_channels; i++){ av_log(s->avctx, AV_LOG_DEBUG, "subband activity: %i\n", s->subband_activity[i]); av_log(s->avctx, AV_LOG_DEBUG, "vq start subband: %i\n", s->vq_start_subband[i]); av_log(s->avctx, AV_LOG_DEBUG, "joint intensity: %i\n", s->joint_intensity[i]); av_log(s->avctx, AV_LOG_DEBUG, "transient mode codebook: %i\n", s->transient_huffman[i]); av_log(s->avctx, AV_LOG_DEBUG, "scale factor codebook: %i\n", s->scalefactor_huffman[i]); av_log(s->avctx, AV_LOG_DEBUG, "bit allocation quantizer: %i\n", s->bitalloc_huffman[i]); av_log(s->avctx, AV_LOG_DEBUG, "quant index huff:"); for (j = 0; j < 11; j++) av_log(s->avctx, AV_LOG_DEBUG, " %i", s->quant_index_huffman[i][j]); av_log(s->avctx, AV_LOG_DEBUG, "\n"); av_log(s->avctx, AV_LOG_DEBUG, "scalefac adj:"); for (j = 0; j < 11; j++) av_log(s->avctx, AV_LOG_DEBUG, " %1.3f", s->scalefactor_adj[i][j]); av_log(s->avctx, AV_LOG_DEBUG, "\n"); } #endif return 0; } static inline int get_scale(GetBitContext *gb, int level, int value) { if (level < 5) { /* huffman encoded */ value += get_bitalloc(gb, &dca_scalefactor, level); } else if(level < 8) value = get_bits(gb, level + 1);