1d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/* ------------------------------------------------------------------ 2d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * Copyright (C) 1998-2009 PacketVideo 3d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * 4d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * you may not use this file except in compliance with the License. 6d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * You may obtain a copy of the License at 7d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * 8d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * 10d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * Unless required by applicable law or agreed to in writing, software 11d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 13d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * express or implied. 14d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * See the License for the specific language governing permissions 15d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * and limitations under the License. 16d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber * ------------------------------------------------------------------- 17d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber */ 18d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 19d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/* 20d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------ 21d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 22d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber PacketVideo Corp. 23d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber MP3 Decoder Library 24d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 25d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Filename: pvmp3_huffman_decoding.cpp 26d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 27d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Funtions: 28d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber pvmp3_huffman_quad_decoding 29d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber pvmp3_huffman_pair_decoding 30d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber pvmp3_huffman_pair_decoding_linbits 31d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 32d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Date: 09/21/2007 33d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 34d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------ 35d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber REVISION HISTORY 36d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 37d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 38d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Description: 39d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 40d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------ 41d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber INPUT AND OUTPUT DEFINITIONS 42d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 43d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Inputs: 44d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber int32 is[], 45d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber granuleInfo *grInfo, information for the given channel and granule 46d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber tmp3dec_file *pVars, decoder state structure 47d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber int32 part2_start, index to beginning of part 2 data 48d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber mp3Header *info mp3 header info 49d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 50d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Outputs: 51d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber int32 is[], uncompressed data 52d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 53d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber Return: 54d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber non zero frequency lines 55d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 56d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------ 57d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber FUNCTION DESCRIPTION 58d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 59d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber These functions are used to decode huffman codewords from the input 60d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber bitstream using combined binary search and look-up table approach. 61d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 62d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------ 63d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber REQUIREMENTS 64d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 65d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 66d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------ 67d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber REFERENCES 68d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber [1] ISO MPEG Audio Subgroup Software Simulation Group (1996) 69d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension 70d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 71d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 72d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------ 73d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber PSEUDO-CODE 74d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 75d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber------------------------------------------------------------------------------ 76d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber*/ 77d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 78d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 79d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*---------------------------------------------------------------------------- 80d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; INCLUDES 81d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/ 82d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "pv_mp3_huffman.h" 83d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "s_mp3bits.h" 84d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "mp3_mem_funcs.h" 85d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber#include "pvmp3_tables.h" 86d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 87d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 88d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*---------------------------------------------------------------------------- 89d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; MACROS 90d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Define module specific macros here 91d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/ 92d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 93d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 94d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*---------------------------------------------------------------------------- 95d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; DEFINES 96d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Include all pre-processor statements here. Include conditional 97d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; compile variables also. 98d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/ 99d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 100d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 101d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*---------------------------------------------------------------------------- 102d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; LOCAL FUNCTION DEFINITIONS 103d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Function Prototype declaration 104d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/ 105d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 106d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*---------------------------------------------------------------------------- 107d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; LOCAL STORE/BUFFER/POINTER DEFINITIONS 108d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Variable declaration - defined here and used outside this module 109d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/ 110d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 111d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*---------------------------------------------------------------------------- 112d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; EXTERNAL FUNCTION REFERENCES 113d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Declare functions defined elsewhere and referenced in this module 114d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/ 115d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 116d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*---------------------------------------------------------------------------- 117d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES 118d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; Declare variables used in this module but defined elsewhere 119d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/ 120d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 121d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber/*---------------------------------------------------------------------------- 122d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber; FUNCTION CODE 123d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber----------------------------------------------------------------------------*/ 124d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 125d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huberint32 pvmp3_huffman_parsing(int32 is[SUBBANDS_NUMBER*FILTERBANK_BANDS], 126d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber granuleInfo *grInfo, 127d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber tmp3dec_file *pVars, 128d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber int32 part2_start, 129d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber mp3Header *info) 130d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 131d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 132d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber{ 133d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber int32 i; 134d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber int32 region1Start; 135d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber int32 region2Start; 136d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber int32 sfreq; 137d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber uint32 grBits; 138d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber void(*pt_huff)(struct huffcodetab *, int32 *, tmp3Bits *); 139d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber struct huffcodetab *h; 140d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 141d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber tmp3Bits *pMainData = &pVars->mainDataStream; 142d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 143d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 144d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber /*int32 bt = (*si).ch[ch].gr[gr].window_switching_flag && ((*si).ch[ch].gr[gr].block_type == 2);*/ 145d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 146d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber sfreq = info->sampling_frequency + info->version_x + (info->version_x << 1); 147d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 148d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber /* Find region boundary for short block case. */ 149d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 150d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 151d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber if ((grInfo->window_switching_flag) && (grInfo->block_type == 2)) 152d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber { 153d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber if (info->version_x == MPEG_1) 154d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber { 155d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber /* Region2. */ 156d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber region1Start = 12; 157d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber } 158d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber else 159d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber { 160d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber /* Region2. */ 161d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber i = grInfo->region0_count + 1; 162d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber region1Start = mp3_sfBandIndex[sfreq].s[i/3]; 163d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber } 164d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 165d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber region1Start += region1Start << 1; 166d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber region2Start = 576; /* No Region2 for short block case. */ 167d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber } 168d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber else 169d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber { /* Find region boundary for long block case. */ 170d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber i = grInfo->region0_count + 1; 171d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber region1Start = mp3_sfBandIndex[sfreq].l[i]; 172d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber region2Start = mp3_sfBandIndex[sfreq].l[i + grInfo->region1_count + 1]; 173d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber } 174d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 175d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber /* Read bigvalues area. */ 176d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 177d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 178d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber if (grInfo->big_values > (FILTERBANK_BANDS*SUBBANDS_NUMBER >> 1)) 179d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber { 180d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber grInfo->big_values = (FILTERBANK_BANDS * SUBBANDS_NUMBER >> 1); 181d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber } 182d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 183d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber if ((grInfo->big_values << 1) > (uint32)region2Start) 184d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber { 185d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber h = &(pVars->ht[grInfo->table_select[0]]); 186d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber if (h->linbits) 187d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber { 188d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber pt_huff = pvmp3_huffman_pair_decoding_linbits; 189d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber } 190d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber else 191d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber { 192d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber pt_huff = pvmp3_huffman_pair_decoding; 193d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber } 194d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 195d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber for (i = 0; i < region1Start; i += 2) 196d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber { 197d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber (*pt_huff)(h, &is[i], pMainData); 198d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber } 199d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 200d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber h = &(pVars->ht[grInfo->table_select[1]]); 201d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber if (h->linbits) 202d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber { 203d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber pt_huff = pvmp3_huffman_pair_decoding_linbits; 204d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber } 205d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber else 206d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber { 207d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber pt_huff = pvmp3_huffman_pair_decoding; 208d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber } 209d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 210d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber for (; i < region2Start; i += 2) 211d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber { 212d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber (*pt_huff)(h, &is[i], pMainData); 213d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber } 214d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 215d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber h = &(pVars->ht[grInfo->table_select[2]]); 216d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber if (h->linbits) 217d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber { 218d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber pt_huff = pvmp3_huffman_pair_decoding_linbits; 219d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber } 220d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber else 221d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber { 222d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber pt_huff = pvmp3_huffman_pair_decoding; 223d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber } 224d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 225d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber for (; (uint32)i < (grInfo->big_values << 1); i += 2) 226d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber { 227d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber (*pt_huff)(h, &is[i], pMainData); 228d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber } 229d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber } 230d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber else if ((grInfo->big_values << 1) > (uint32)region1Start) 231d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber { 232d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber h = &(pVars->ht[grInfo->table_select[0]]); 233d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber if (h->linbits) 234d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber { 235d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber pt_huff = pvmp3_huffman_pair_decoding_linbits; 236d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber } 237d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber else 238d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber { 239d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber pt_huff = pvmp3_huffman_pair_decoding; 240d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber } 241d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber for (i = 0; i < region1Start; i += 2) 242d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber { 243d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber (*pt_huff)(h, &is[i], pMainData); 244d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber } 245d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 246d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber h = &(pVars->ht[grInfo->table_select[1]]); 247d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber if (h->linbits) 248d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber { 249d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber pt_huff = pvmp3_huffman_pair_decoding_linbits; 250d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber } 251d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber else 252d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber { 253d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber pt_huff = pvmp3_huffman_pair_decoding; 254d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber } 255d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber for (; (uint32)i < (grInfo->big_values << 1); i += 2) 256d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber { 257d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber (*pt_huff)(h, &is[i], pMainData); 258d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber } 259d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber } 260d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber else 261d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber { 262d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber h = &(pVars->ht[grInfo->table_select[0]]); 263d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber if (h->linbits) 264d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber { 265d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber pt_huff = pvmp3_huffman_pair_decoding_linbits; 266d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber } 267d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber else 268d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber { 269d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber pt_huff = pvmp3_huffman_pair_decoding; 270d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber } 271d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 272d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber for (i = 0; (uint32)i < (grInfo->big_values << 1); i += 2) 273d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber { 274d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber (*pt_huff)(h, &is[i], pMainData); 275d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber } 276d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber } 277d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 278d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 279d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 280d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber /* Read count1 area. */ 281d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber h = &(pVars->ht[grInfo->count1table_select+32]); 282d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 283d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber grBits = part2_start + grInfo->part2_3_length; 284d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 285d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber while ((pMainData->usedBits < grBits) && 286d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber (i < FILTERBANK_BANDS*SUBBANDS_NUMBER - 4)) 287d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber { 288d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber pvmp3_huffman_quad_decoding(h, &is[i], pMainData); 289d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber i += 4; 290d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber } 291d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 292d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber if ((pMainData->usedBits < grBits) && 293d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber (i < FILTERBANK_BANDS*SUBBANDS_NUMBER)) 294d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber { 295d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber pvmp3_huffman_quad_decoding(h, &is[i], pMainData); 296d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber i += 4; 297d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 298d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber if ((i - 2) >= FILTERBANK_BANDS*SUBBANDS_NUMBER) 299d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber { 300d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber i -= 2; 301d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber is[i] = 0; 302d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber is[(i+1)] = 0; 303d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber } 304d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber } 305d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 306d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber if (pMainData->usedBits > grBits) 307d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber { 308d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber i -= 4; 309d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 310d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber if (i < 0 || i > FILTERBANK_BANDS*SUBBANDS_NUMBER - 4) 311d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber { 312d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber /* illegal parameters may cause invalid access, set i to 0 */ 313d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber i = 0; 314d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber } 315d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 316d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber is[i] = 0; 317d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber is[(i+1)] = 0; 318d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber is[(i+2)] = 0; 319d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber is[(i+3)] = 0; 320d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 321d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber } 322d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 323d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber pMainData->usedBits = grBits; 324d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 325d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber return (i); 326d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 327d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber} 328d9618f23226f46c752e56f712bc4b505117d8b4bAndreas Huber 329