1dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/* ------------------------------------------------------------------ 2dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Copyright (C) 1998-2009 PacketVideo 3dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 4dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * you may not use this file except in compliance with the License. 6dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * You may obtain a copy of the License at 7dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 8dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 10dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Unless required by applicable law or agreed to in writing, software 11dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 13dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * express or implied. 14dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * See the License for the specific language governing permissions 15dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * and limitations under the License. 16dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * ------------------------------------------------------------------- 17dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 18dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/* 19dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 20dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Pathname: ./src/unpack_idx.c 21dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Function: unpack_idx 22dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber unpack_idx_sgn 23dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber unpack_idx_esc 24dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 25dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 26dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REVISION HISTORY 27dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 28dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Modified from original shareware code 29dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 30dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Eliminated 3 divisions and 1 multiplication through a table 31dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber look-up method for calculating 1/mod and constant allocation of 1/mod^3 32dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber and 1/mod^2. 33dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Eliminated 3 additions through simple optimizations in the code. 34dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Changed if/else statement to a switch/case utilizing fall-through. 35dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 36dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Made changes per review comments. Main improvements were 37dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber in change of switch/case to if statement, and use of temporary variable 38dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber to hold value of *pQuantSpec. 39dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 40dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: (1) Typecast codeword_indx to Int32 before multiplication, this 41dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber assures the shift operation happens on a 32-bit product on 42dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber TI-C55x processor. 43dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (2) define temp_spec as Int32 to avoid overflow 44dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 45dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Modified per review comments 46dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (1) remove the two typecastings of codeword_indx when 47dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pHuffCodebook->dim == DIMENSION_4 48dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (2) temp_spec is Int because the result never exceeds 16 bits 49dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 50dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Break up and combine unpack index with sign bit reading and for 51dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber special escape code. Parent function must know which one of the 52dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 3 functions should be called. 53dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 54dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: Put back if-statement to get the max. 55dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 56dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: When searching for the max, there was some instances where the 57dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber max was compared against a negative number, so the max was never 58dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber updated (defaulted to 0), leading to block processing in other 59dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber magnitude sensitive stages. 60dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 61dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Who: Date: 62dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: 63dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 64dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber INPUT AND OUTPUT DEFINITIONS 65dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 66dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Inputs: 67dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int quant_spec[] = Array for storage of the quantized 68dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber spectral coefficients. Length is either 2 or 4. 69dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber See Ref #1, Page 76 for a complete description. 70dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 71dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int codeword_indx = The index into the Huffman table. 72dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Range is [1-288] 73dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 74dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber const Hcb *pHuffCodebook = Pointer to HuffmanCodebook information. 75dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 76dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber BITS *pInputStream = Pointer to the bitstream buffer. 77dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int *max = Pointer to maximum coefficient value. 78dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 79dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Local Stores/Buffers/Pointers Needed: 80dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber const UInt div_mod[18] = An array with the values for 1/mod 81dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber stored in Q-formats 13. 82dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 83dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Global Stores/Buffers/Pointers Needed: 84dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber None 85dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 86dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Outputs: 87dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber None 88dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 89dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Pointers and Buffers Modified: 90dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int quant_spec[] = Output (the quantized and signed spectral coefficients) 91dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber returned via this pointer. 92dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 93dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Local Stores Modified: 94dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber None 95dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 96dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Global Stores Modified: 97dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber None 98dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 99dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 100dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FUNCTION DESCRIPTION 101dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 102dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber This function decodes quantized spectral coefficients and decode their signs 103dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber from the input bitstream. Quantized spectral coefficients are transmitted as 104dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber four-tuples or 2-tuples, and this information is conveyed to the function via 105dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber the variable HuffCodebook->dim. 106dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 107dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber See Reference #1 for a complete description 108dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 109dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REQUIREMENTS 110dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 111dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber This function shall correctly calculate pQuantSpec[], given the inputs 112dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 113dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber codeword_indx = {1-288}; 114dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber HuffCodebook->off = {0, 1, 4}; 115dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber HuffCodebook->mod = {3, 8, 9, 13, 17}; 116dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 117dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber mod = LAV + 1 if unsigned codebook 118dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber mod = 2*LAV + 1 if signed codebook 119dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 120dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Range of values for LAV is {2,7,12,16} if unsigned 121dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber {1,4} if signed 122dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 123dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Additionally, 124dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber LAV <= 2 if dim == 4 125dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 126dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber This restricts mod == 3 if dim == 4 127dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber and mod == {3, 8, 9, 13, 17} if dim == 2 128dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 129dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber This function will NOT function correctly if fed values that do not 130dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber meet the requirements as stated above. 131dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 132dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber This limitation on the range of values was determined by analysis 133dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber of Reference #1 (see below.) 134dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 135dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 136dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REFERENCES 137dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 138dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (1) ISO/IEC 14496-3:1999(E) 139dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Part 3 140dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Subpart 4.6.3.3 Decoding Process 141dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Subpart 4.6.4 Tables 142dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (2) MPEG-2 NBC Audio Decoder 143dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber "This software module was originally developed by AT&T, Dolby 144dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Laboratories, Fraunhofer Gesellschaft IIS in the course of development 145dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber of the MPEG-2 NBC/MPEG-4 Audio standard ISO/IEC 13818-7, 14496-1,2 and 146dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 3. This software module is an implementation of a part of one or more 147dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber MPEG-2 NBC/MPEG-4 Audio tools as specified by the MPEG-2 NBC/MPEG-4 148dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Audio standard. ISO/IEC gives users of the MPEG-2 NBC/MPEG-4 Audio 149dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber standards free license to this software module or modifications thereof 150dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for use in hardware or software products claiming conformance to the 151dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber MPEG-2 NBC/MPEG-4 Audio standards. Those intending to use this software 152dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber module in hardware or software products are advised that this use may 153dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber infringe existing patents. The original developer of this software 154dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber module and his/her company, the subsequent editors and their companies, 155dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber and ISO/IEC have no liability for use of this software module or 156dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber modifications thereof in an implementation. Copyright is not released 157dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for non MPEG-2 NBC/MPEG-4 Audio conforming products.The original 158dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber developer retains full right to use the code for his/her own purpose, 159dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber assign or donate the code to a third party and to inhibit third party 160dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber from using the code for non MPEG-2 NBC/MPEG-4 Audio conforming products. 161dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber This copyright notice must be included in all copies or derivative 162dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber works." 163dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Copyright(c)1996. 164dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 165dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 166dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber PSEUDO-CODE 167dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 168dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber IF (pHuffCodebook->dim == 4) 169dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pQuantSpec) = codeword_indx/(3^3); 170dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber codeword_indx = codeword_indx - *(pQuantSpec)*(3^3); 171dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pQuantSpec) = *(pQuantSpec) - off; 172dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 173dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pQuantSpec = pQuantSpec + 1; 174dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 175dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pQuantSpec) = codeword_indx/(3^2); 176dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber codeword_indx = codeword_indx - *(pQuantSpec)*(3^2); 177dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pQuantSpec) = *(pQuantSpec) - off; 178dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 179dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pQuantSpec = pQuantSpec + 1; 180dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ENDIF 181dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 182dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pQuantSpec) = codeword_indx/mod; 183dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber codeword_indx = codeword_indx - (*pQuantSpec)*mod; 184dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pQuantSpec) = *(pQuantSpec) - off; 185dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 186dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pQuantSpec = pQuantSpec + 1; 187dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 188dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(pQuantSpec) = codeword_indx - off; 189dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 190dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 191dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber RESOURCES USED 192dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber When the code is written for a specific target processor the 193dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber the resources used should be documented below. 194dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 195dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber STACK USAGE: [stack count for this module] + [variable to represent 196dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber stack usage for each subroutine called] 197dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 198dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber where: [stack usage variable] = stack usage for [subroutine 199dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber name] (see [filename].ext) 200dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 201dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber DATA MEMORY USED: x words 202dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 203dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber PROGRAM MEMORY USED: x words 204dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 205dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber CLOCK CYCLES: [cycle count equation for this module] + [variable 206dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber used to represent cycle count for each subroutine 207dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber called] 208dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 209dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber where: [cycle count variable] = cycle count for [subroutine 210dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber name] (see [filename].ext) 211dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 212dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 213dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber*/ 214dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 215dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 216dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 217dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; INCLUDES 218dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 219dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "pv_audio_type_defs.h" 220dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "s_hcb.h" 221dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "ibstream.h" 222dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "unpack_idx.h" 223dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 224dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "fxp_mul32.h" 225dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 226dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 227dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 228dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; MACROS 229dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Define module specific macros here 230dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 231dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 232dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 233dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; DEFINES 234dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Include all pre-processor statements here. Include conditional 235dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; compile variables also. 236dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 237dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define DIV_3_CUBED 19 /* 19 = 1/27 in Q-9 format */ 238dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define THREE_CUBED 27 /* 27 = 3^3 */ 239dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 240dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define DIV_3_SQUARED 57 /* 57 = 1/9 in Q-9 format */ 241dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define THREE_SQUARED 9 /* 9 = 3^2 */ 242dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 243dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define Q_FORMAT_MOD 13 /* Q-format for 1/mod table */ 244dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define Q_FORMAT_MOD2 9 /* Q-format for DIV_3_SQUARED */ 245dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define Q_FORMAT_MOD3 9 /* Q-format for DIV_3_CUBED */ 246dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 247dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define LOWER_5_BITS_MASK 0x1F 248dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 249dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 250dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#if ( defined(PV_ARM_V5) || defined(PV_ARM_V4)) 251dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 252dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber__inline Int32 abs1(Int32 x) 253dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{ 254dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 z; 255dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 256dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber z = x - (x<0); 257dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber x = z ^ sign(z) 258dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 259dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber __asm 260dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 261dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sub z, x, x, lsr #31 262dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber eor x, z, z, asr #31 263dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 264dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return (x); 265dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber} 266dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 267dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define pv_abs(x) abs1(x) 268dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 269dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 270dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#else 271dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 272dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define pv_abs(x) ((x) > 0)? (x) : (-x) 273dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 274dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif 275dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 276dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 277dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 278dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 279dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL FUNCTION DEFINITIONS 280dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Function Prototype declaration 281dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 282dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 283dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 284dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL STORE/BUFFER/POINTER DEFINITIONS 285dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Variable declaration - defined here and used outside this module 286dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 287dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*-------------------------------------------------------------------------- 288dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Possible values for mod = {3,8,9,13,17} 289dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 290dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber There exists "empty" spaces in the table. These can potentially 291dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber be utilized by other const tables, if available memory becomes an issue. 292dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber---------------------------------------------------------------------------*/ 293dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 294dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberconst Int div_mod[18] = /* mod index Q-format */ 295dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{ 296dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* ----------------------- */ 297dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 0xCC, /* | | 0 | */ 298dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 0xCC, /* | | 1 | */ 299dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 0xCC, /* | | 2 | */ 300dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2731, /* | 3 | 3 | 13 */ 301dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 0xCC, /* | | 4 | */ 302dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 0xCC, /* | | 5 | */ 303dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 0xCC, /* | | 6 | */ 304dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 0xCC, /* | | 7 | */ 305dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1025, /* | 8 | 8 | 13 */ 306dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 911, /* | 9 | 9 | 13 */ 307dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 0xCC, /* | | 10 | */ 308dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 0xCC, /* | | 11 | */ 309dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 0xCC, /* | | 12 | */ 310dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 631, /* | 13 | 13 | 13 */ 311dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 0xCC, /* | | 14 | */ 312dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 0xCC, /* | | 15 | */ 313dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 0xCC, /* | | 16 | */ 314dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 482, /* | 17 | 17 | 13 */ 315dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber}; 316dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 317dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 318dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL FUNCTION REFERENCES 319dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare functions defined elsewhere and referenced in this module 320dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 321dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 322dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 323dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES 324dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare variables used in this module but defined elsewhere 325dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 326dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 327dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 328dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; FUNCTION CODE 329dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 330dacaa73ae5010b66f4224d70a520945e5b653544Andreas Hubervoid unpack_idx( 331dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 quant_spec[], 332dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int codeword_indx, 333dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber const Hcb *pHuffCodebook, 334dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber BITS *pInputStream, 335dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int *max) 336dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{ 337dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 *pQuantSpec = &quant_spec[0]; 338dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int temp_spec; 339dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 340dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber const Int mod = pHuffCodebook->mod; 341dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber const Int off = pHuffCodebook->off; 342dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 343dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber OSCL_UNUSED_ARG(pInputStream); 344dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 345dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 346dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (pHuffCodebook->dim == DIMENSION_4) 347dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 348dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* Calculate pQuantSpec[0] */ 349dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 350dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp_spec = (codeword_indx * DIV_3_CUBED) >> Q_FORMAT_MOD3; 351dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 352dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber codeword_indx -= temp_spec * THREE_CUBED; 353dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 354dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp_spec -= off; 355dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *pQuantSpec++ = (Int16)temp_spec; 356dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 357dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp_spec = pv_abs(temp_spec); 358dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 359dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (temp_spec > *max) 360dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 361dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *max = temp_spec; 362dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 363dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 364dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* Calculate pQuantSpec[1] */ 365dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp_spec = (codeword_indx * DIV_3_SQUARED) >> Q_FORMAT_MOD2; 366dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 367dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber codeword_indx -= temp_spec * THREE_SQUARED; 368dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 369dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp_spec -= off; 370dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *pQuantSpec++ = (Int16)temp_spec; 371dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 372dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp_spec = pv_abs(temp_spec); 373dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 374dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (temp_spec > *max) 375dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 376dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *max = temp_spec; 377dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 378dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 379dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 380dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 381dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Calculate pQuantSpec[2] if dim == 4 382dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Calculate pQuantSpec[0] if dim == 2 383dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 384dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 385dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp_spec = ((Int32) codeword_indx * div_mod[mod]) >> Q_FORMAT_MOD; 386dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 387dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber codeword_indx -= temp_spec * mod; 388dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 389dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp_spec -= off; 390dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *pQuantSpec++ = (Int16)temp_spec; 391dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 392dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp_spec = pv_abs(temp_spec); 393dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 394dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 395dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (temp_spec > *max) 396dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 397dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *max = temp_spec; 398dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 399dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 400dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 401dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Calculate pQuantSpec[3] if dim == 4 402dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Calculate pQuantSpec[1] if dim == 2 403dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 404dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber codeword_indx -= off; 405dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *pQuantSpec = (Int16)codeword_indx ; 406dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 407dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 408dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber codeword_indx = pv_abs(codeword_indx); 409dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 410dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (codeword_indx > *max) 411dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 412dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *max = codeword_indx; 413dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 414dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 415dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 416dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return ; 417dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber} /* unpack_idx */ 418dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 419dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 420dacaa73ae5010b66f4224d70a520945e5b653544Andreas Hubervoid unpack_idx_sgn( 421dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 quant_spec[], 422dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int codeword_indx, 423dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber const Hcb *pHuffCodebook, 424dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber BITS *pInputStream, 425dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int *max) 426dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{ 427dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 *pQuantSpec = &quant_spec[0]; 428dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int temp_spec; 429dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int sgn; 430dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 431dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber const Int mod = pHuffCodebook->mod; 432dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber const Int off = pHuffCodebook->off; 433dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 434dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 435dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 436dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (pHuffCodebook->dim == DIMENSION_4) 437dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 438dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* Calculate pQuantSpec[0] */ 439dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber preload_cache((Int32 *)pQuantSpec); 440dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp_spec = (codeword_indx * DIV_3_CUBED) >> Q_FORMAT_MOD3; 441dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 442dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber codeword_indx -= temp_spec * THREE_CUBED; 443dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 444dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp_spec -= off; 445dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (temp_spec) 446dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 447dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sgn = get1bits(pInputStream); 448dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 449dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 450dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *pQuantSpec++ = (Int16)((sgn) ? -temp_spec : temp_spec); 451dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 452dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp_spec = pv_abs(temp_spec); 453dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 454dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (temp_spec > *max) 455dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 456dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *max = temp_spec; 457dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 458dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 459dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 460dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 461dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 462dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *pQuantSpec++ = 0; 463dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 464dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 465dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* Calculate pQuantSpec[1] */ 466dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp_spec = (codeword_indx * DIV_3_SQUARED) >> Q_FORMAT_MOD2; 467dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 468dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber codeword_indx -= temp_spec * THREE_SQUARED; 469dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 470dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp_spec -= off; 471dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (temp_spec) 472dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 473dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 474dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sgn = get1bits(pInputStream); 475dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 476dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *pQuantSpec++ = (Int16)((sgn) ? -temp_spec : temp_spec); 477dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 478dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp_spec = pv_abs(temp_spec); 479dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 480dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (temp_spec > *max) 481dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 482dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *max = temp_spec; 483dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 484dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 485dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 486dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 487dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *pQuantSpec++ = 0; 488dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 489dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 490dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 491dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 492dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Calculate pQuantSpec[2] if dim == 4 493dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Calculate pQuantSpec[0] if dim == 2 494dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 495dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 496dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp_spec = ((Int32) codeword_indx * div_mod[mod]) >> Q_FORMAT_MOD; 497dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 498dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber codeword_indx -= temp_spec * mod; 499dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 500dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp_spec -= off; 501dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (temp_spec) 502dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 503dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 504dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sgn = get1bits(pInputStream); 505dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 506dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *pQuantSpec++ = (Int16)((sgn) ? -temp_spec : temp_spec); 507dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 508dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp_spec = pv_abs(temp_spec); 509dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 510dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (temp_spec > *max) 511dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 512dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *max = temp_spec; 513dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 514dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 515dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 516dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 517dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *pQuantSpec++ = 0; 518dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 519dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 520dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 521dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Calculate pQuantSpec[3] if dim == 4 522dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Calculate pQuantSpec[1] if dim == 2 523dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 524dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber codeword_indx -= off; 525dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (codeword_indx) 526dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 527dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 528dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sgn = get1bits(pInputStream); 529dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 530dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *pQuantSpec = (Int16)((sgn) ? -codeword_indx : codeword_indx); 531dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 532dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber codeword_indx = pv_abs(codeword_indx); 533dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 534dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (codeword_indx > *max) 535dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 536dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *max = codeword_indx; 537dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 538dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 539dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 540dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 541dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *pQuantSpec = 0; 542dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 543dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 544dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return ; 545dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber} /* unpack_idx_sgn */ 546dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 547dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 548dacaa73ae5010b66f4224d70a520945e5b653544Andreas Hubervoid unpack_idx_esc( 549dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 quant_spec[], 550dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int codeword_indx, 551dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber const Hcb *pHuffCodebook, 552dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber BITS *pInputStream, 553dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int *max) 554dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{ 555dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int temp_spec; 556dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int sgn1 = 0, sgn2 = 0; 557dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int N; 558dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 esc_seq; 559dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 560dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber const Int mod = pHuffCodebook->mod; 561dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber const Int off = pHuffCodebook->off; 562dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 563dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 564dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp_spec = ((Int32) codeword_indx * div_mod[mod]) >> Q_FORMAT_MOD; 565dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 566dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber codeword_indx -= temp_spec * mod; 567dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 568dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp_spec -= off; 569dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (temp_spec) 570dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 571dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sgn1 = get1bits(pInputStream); 572dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 573dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 574dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber codeword_indx -= off; 575dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (codeword_indx) 576dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 577dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sgn2 = get1bits(pInputStream); 578dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 579dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 580dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 581dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if ((temp_spec & LOWER_5_BITS_MASK) == 16) 582dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 583dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber N = 3; 584dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber do 585dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 586dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber N++; 587dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 588dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber esc_seq = get1bits(pInputStream); 589dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 590dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 591dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber while (esc_seq != 0); 592dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 593dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber esc_seq = getbits(N, pInputStream); 594dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 595dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber esc_seq += (1 << N); 596dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 597dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 598dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp_spec = (Int)((temp_spec * esc_seq) >> 4); 599dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 600dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 601dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 602dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 603dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (sgn1) 604dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 605dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber quant_spec[0] = (Int16)(-temp_spec); 606dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 607dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 608dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 609dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber quant_spec[0] = (Int16)temp_spec; 610dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 611dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 612dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber temp_spec = pv_abs(temp_spec); 613dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 614dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (temp_spec > *max) 615dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 616dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *max = temp_spec; 617dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 618dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 619dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if ((codeword_indx & LOWER_5_BITS_MASK) == 16) 620dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 621dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber N = 3; 622dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber do 623dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 624dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber N++; 625dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 626dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber esc_seq = get1bits(pInputStream); 627dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 628dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 629dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber while (esc_seq != 0); 630dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 631dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber esc_seq = getbits(N, pInputStream); 632dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 633dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber esc_seq += (1 << N); 634dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 635dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber codeword_indx = (Int)((codeword_indx * esc_seq) >> 4); 636dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 637dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 638dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 639dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 640dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 641dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (sgn2) 642dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 643dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber quant_spec[1] = (Int16)(-codeword_indx); 644dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 645dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 646dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 647dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber quant_spec[1] = (Int16)codeword_indx; 648dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 649dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 650dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 651dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber codeword_indx = pv_abs(codeword_indx); 652dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 653dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (codeword_indx > *max) 654dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 655dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *max = codeword_indx; 656dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 657dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 658dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 659dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber return ; 660dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber} /* unpack_idx_esc */ 661