10c1bc742181ded4930842b46e9507372f0b1b963James Dong/* 20c1bc742181ded4930842b46e9507372f0b1b963James Dong * Copyright (C) 2009 The Android Open Source Project 30c1bc742181ded4930842b46e9507372f0b1b963James Dong * 40c1bc742181ded4930842b46e9507372f0b1b963James Dong * Licensed under the Apache License, Version 2.0 (the "License"); 50c1bc742181ded4930842b46e9507372f0b1b963James Dong * you may not use this file except in compliance with the License. 60c1bc742181ded4930842b46e9507372f0b1b963James Dong * You may obtain a copy of the License at 70c1bc742181ded4930842b46e9507372f0b1b963James Dong * 80c1bc742181ded4930842b46e9507372f0b1b963James Dong * http://www.apache.org/licenses/LICENSE-2.0 90c1bc742181ded4930842b46e9507372f0b1b963James Dong * 100c1bc742181ded4930842b46e9507372f0b1b963James Dong * Unless required by applicable law or agreed to in writing, software 110c1bc742181ded4930842b46e9507372f0b1b963James Dong * distributed under the License is distributed on an "AS IS" BASIS, 120c1bc742181ded4930842b46e9507372f0b1b963James Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130c1bc742181ded4930842b46e9507372f0b1b963James Dong * See the License for the specific language governing permissions and 140c1bc742181ded4930842b46e9507372f0b1b963James Dong * limitations under the License. 150c1bc742181ded4930842b46e9507372f0b1b963James Dong */ 160c1bc742181ded4930842b46e9507372f0b1b963James Dong 170c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------ 180c1bc742181ded4930842b46e9507372f0b1b963James Dong 190c1bc742181ded4930842b46e9507372f0b1b963James Dong Table of contents 200c1bc742181ded4930842b46e9507372f0b1b963James Dong 210c1bc742181ded4930842b46e9507372f0b1b963James Dong 1. Include headers 220c1bc742181ded4930842b46e9507372f0b1b963James Dong 2. External compiler flags 230c1bc742181ded4930842b46e9507372f0b1b963James Dong 3. Module defines 240c1bc742181ded4930842b46e9507372f0b1b963James Dong 4. Local function prototypes 250c1bc742181ded4930842b46e9507372f0b1b963James Dong 5. Functions 260c1bc742181ded4930842b46e9507372f0b1b963James Dong h264bsdDecodeExpGolombUnsigned 270c1bc742181ded4930842b46e9507372f0b1b963James Dong h264bsdDecodeExpGolombSigned 280c1bc742181ded4930842b46e9507372f0b1b963James Dong h264bsdDecodeExpGolombMapped 290c1bc742181ded4930842b46e9507372f0b1b963James Dong h264bsdDecodeExpGolombTruncated 300c1bc742181ded4930842b46e9507372f0b1b963James Dong 310c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/ 320c1bc742181ded4930842b46e9507372f0b1b963James Dong 330c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------ 340c1bc742181ded4930842b46e9507372f0b1b963James Dong 1. Include headers 350c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/ 360c1bc742181ded4930842b46e9507372f0b1b963James Dong 370c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "h264bsd_vlc.h" 380c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "basetype.h" 390c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "h264bsd_stream.h" 400c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "h264bsd_util.h" 410c1bc742181ded4930842b46e9507372f0b1b963James Dong 420c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------ 430c1bc742181ded4930842b46e9507372f0b1b963James Dong 2. External compiler flags 440c1bc742181ded4930842b46e9507372f0b1b963James Dong-------------------------------------------------------------------------------- 450c1bc742181ded4930842b46e9507372f0b1b963James Dong 460c1bc742181ded4930842b46e9507372f0b1b963James Dong-------------------------------------------------------------------------------- 470c1bc742181ded4930842b46e9507372f0b1b963James Dong 3. Module defines 480c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/ 490c1bc742181ded4930842b46e9507372f0b1b963James Dong 500c1bc742181ded4930842b46e9507372f0b1b963James Dong/* definition of special code num, this along with the return value is used 510c1bc742181ded4930842b46e9507372f0b1b963James Dong * to handle code num in the range [0, 2^32] in the DecodeExpGolombUnsigned 520c1bc742181ded4930842b46e9507372f0b1b963James Dong * function */ 530c1bc742181ded4930842b46e9507372f0b1b963James Dong#define BIG_CODE_NUM 0xFFFFFFFFU 540c1bc742181ded4930842b46e9507372f0b1b963James Dong 550c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Mapping tables for coded_block_pattern, used for decoding of mapped 560c1bc742181ded4930842b46e9507372f0b1b963James Dong * Exp-Golomb codes */ 570c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic const u8 codedBlockPatternIntra4x4[48] = { 580c1bc742181ded4930842b46e9507372f0b1b963James Dong 47,31,15,0,23,27,29,30,7,11,13,14,39,43,45,46,16,3,5,10,12,19,21,26,28,35, 590c1bc742181ded4930842b46e9507372f0b1b963James Dong 37,42,44,1,2,4,8,17,18,20,24,6,9,22,25,32,33,34,36,40,38,41}; 600c1bc742181ded4930842b46e9507372f0b1b963James Dong 610c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic const u8 codedBlockPatternInter[48] = { 620c1bc742181ded4930842b46e9507372f0b1b963James Dong 0,16,1,2,4,8,32,3,5,10,12,15,47,7,11,13,14,6,9,31,35,37,42,44,33,34,36,40, 630c1bc742181ded4930842b46e9507372f0b1b963James Dong 39,43,45,46,17,18,20,24,19,21,26,28,23,27,29,30,22,25,38,41}; 640c1bc742181ded4930842b46e9507372f0b1b963James Dong 650c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------ 660c1bc742181ded4930842b46e9507372f0b1b963James Dong 4. Local function prototypes 670c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/ 680c1bc742181ded4930842b46e9507372f0b1b963James Dong 690c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------ 700c1bc742181ded4930842b46e9507372f0b1b963James Dong 710c1bc742181ded4930842b46e9507372f0b1b963James Dong 5.1 Function: h264bsdDecodeExpGolombUnsigned 720c1bc742181ded4930842b46e9507372f0b1b963James Dong 730c1bc742181ded4930842b46e9507372f0b1b963James Dong Functional description: 740c1bc742181ded4930842b46e9507372f0b1b963James Dong Decode unsigned Exp-Golomb code. This is the same as codeNum used 750c1bc742181ded4930842b46e9507372f0b1b963James Dong in other Exp-Golomb code mappings. Code num (i.e. the decoded 760c1bc742181ded4930842b46e9507372f0b1b963James Dong symbol) is determined as 770c1bc742181ded4930842b46e9507372f0b1b963James Dong 780c1bc742181ded4930842b46e9507372f0b1b963James Dong codeNum = 2^leadingZeros - 1 + GetBits(leadingZeros) 790c1bc742181ded4930842b46e9507372f0b1b963James Dong 800c1bc742181ded4930842b46e9507372f0b1b963James Dong Normal decoded symbols are in the range [0, 2^32 - 2]. Symbol 810c1bc742181ded4930842b46e9507372f0b1b963James Dong 2^32-1 is indicated by BIG_CODE_NUM with return value HANTRO_OK 820c1bc742181ded4930842b46e9507372f0b1b963James Dong while symbol 2^32 is indicated by BIG_CODE_NUM with return value 830c1bc742181ded4930842b46e9507372f0b1b963James Dong HANTRO_NOK. These two symbols are special cases with code length 840c1bc742181ded4930842b46e9507372f0b1b963James Dong of 65, i.e. 32 '0' bits, a '1' bit, and either 0 or 1 represented 850c1bc742181ded4930842b46e9507372f0b1b963James Dong by 32 bits. 860c1bc742181ded4930842b46e9507372f0b1b963James Dong 870c1bc742181ded4930842b46e9507372f0b1b963James Dong Symbol 2^32 is out of unsigned 32-bit range but is needed for 880c1bc742181ded4930842b46e9507372f0b1b963James Dong DecodeExpGolombSigned to express value -2^31. 890c1bc742181ded4930842b46e9507372f0b1b963James Dong 900c1bc742181ded4930842b46e9507372f0b1b963James Dong Inputs: 910c1bc742181ded4930842b46e9507372f0b1b963James Dong pStrmData pointer to stream data structure 920c1bc742181ded4930842b46e9507372f0b1b963James Dong 930c1bc742181ded4930842b46e9507372f0b1b963James Dong Outputs: 940c1bc742181ded4930842b46e9507372f0b1b963James Dong codeNum decoded code word is stored here 950c1bc742181ded4930842b46e9507372f0b1b963James Dong 960c1bc742181ded4930842b46e9507372f0b1b963James Dong Returns: 970c1bc742181ded4930842b46e9507372f0b1b963James Dong HANTRO_OK success 980c1bc742181ded4930842b46e9507372f0b1b963James Dong HANTRO_NOK failure, no valid code word found, note exception 990c1bc742181ded4930842b46e9507372f0b1b963James Dong with BIG_CODE_NUM 1000c1bc742181ded4930842b46e9507372f0b1b963James Dong 1010c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/ 1020c1bc742181ded4930842b46e9507372f0b1b963James Dong 1030c1bc742181ded4930842b46e9507372f0b1b963James Dongu32 h264bsdDecodeExpGolombUnsigned(strmData_t *pStrmData, u32 *codeNum) 1040c1bc742181ded4930842b46e9507372f0b1b963James Dong{ 1050c1bc742181ded4930842b46e9507372f0b1b963James Dong 1060c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Variables */ 1070c1bc742181ded4930842b46e9507372f0b1b963James Dong 1080c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 bits, numZeros; 1090c1bc742181ded4930842b46e9507372f0b1b963James Dong 1100c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */ 1110c1bc742181ded4930842b46e9507372f0b1b963James Dong 1120c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(pStrmData); 1130c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(codeNum); 1140c1bc742181ded4930842b46e9507372f0b1b963James Dong 1150c1bc742181ded4930842b46e9507372f0b1b963James Dong bits = h264bsdShowBits32(pStrmData); 1160c1bc742181ded4930842b46e9507372f0b1b963James Dong 1170c1bc742181ded4930842b46e9507372f0b1b963James Dong /* first bit is 1 -> code length 1 */ 1180c1bc742181ded4930842b46e9507372f0b1b963James Dong if (bits >= 0x80000000) 1190c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1200c1bc742181ded4930842b46e9507372f0b1b963James Dong h264bsdFlushBits(pStrmData, 1); 1210c1bc742181ded4930842b46e9507372f0b1b963James Dong *codeNum = 0; 1220c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_OK); 1230c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1240c1bc742181ded4930842b46e9507372f0b1b963James Dong /* second bit is 1 -> code length 3 */ 1250c1bc742181ded4930842b46e9507372f0b1b963James Dong else if (bits >= 0x40000000) 1260c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1270c1bc742181ded4930842b46e9507372f0b1b963James Dong if (h264bsdFlushBits(pStrmData, 3) == END_OF_STREAM) 1280c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 1290c1bc742181ded4930842b46e9507372f0b1b963James Dong *codeNum = 1 + ((bits >> 29) & 0x1); 1300c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_OK); 1310c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1320c1bc742181ded4930842b46e9507372f0b1b963James Dong /* third bit is 1 -> code length 5 */ 1330c1bc742181ded4930842b46e9507372f0b1b963James Dong else if (bits >= 0x20000000) 1340c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1350c1bc742181ded4930842b46e9507372f0b1b963James Dong if (h264bsdFlushBits(pStrmData, 5) == END_OF_STREAM) 1360c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 1370c1bc742181ded4930842b46e9507372f0b1b963James Dong *codeNum = 3 + ((bits >> 27) & 0x3); 1380c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_OK); 1390c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1400c1bc742181ded4930842b46e9507372f0b1b963James Dong /* fourth bit is 1 -> code length 7 */ 1410c1bc742181ded4930842b46e9507372f0b1b963James Dong else if (bits >= 0x10000000) 1420c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1430c1bc742181ded4930842b46e9507372f0b1b963James Dong if (h264bsdFlushBits(pStrmData, 7) == END_OF_STREAM) 1440c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 1450c1bc742181ded4930842b46e9507372f0b1b963James Dong *codeNum = 7 + ((bits >> 25) & 0x7); 1460c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_OK); 1470c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1480c1bc742181ded4930842b46e9507372f0b1b963James Dong /* other code lengths */ 1490c1bc742181ded4930842b46e9507372f0b1b963James Dong else 1500c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1510c1bc742181ded4930842b46e9507372f0b1b963James Dong#ifndef H264DEC_NEON 1520c1bc742181ded4930842b46e9507372f0b1b963James Dong numZeros = 4 + h264bsdCountLeadingZeros(bits, 28); 1530c1bc742181ded4930842b46e9507372f0b1b963James Dong#else 1540c1bc742181ded4930842b46e9507372f0b1b963James Dong numZeros = h264bsdCountLeadingZeros(bits); 1550c1bc742181ded4930842b46e9507372f0b1b963James Dong#endif 1560c1bc742181ded4930842b46e9507372f0b1b963James Dong /* all 32 bits are zero */ 1570c1bc742181ded4930842b46e9507372f0b1b963James Dong if (numZeros == 32) 1580c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1590c1bc742181ded4930842b46e9507372f0b1b963James Dong *codeNum = 0; 1600c1bc742181ded4930842b46e9507372f0b1b963James Dong h264bsdFlushBits(pStrmData,32); 1610c1bc742181ded4930842b46e9507372f0b1b963James Dong bits = h264bsdGetBits(pStrmData, 1); 1620c1bc742181ded4930842b46e9507372f0b1b963James Dong /* check 33rd bit, must be 1 */ 1630c1bc742181ded4930842b46e9507372f0b1b963James Dong if (bits == 1) 1640c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1650c1bc742181ded4930842b46e9507372f0b1b963James Dong /* cannot use h264bsdGetBits, limited to 31 bits */ 1660c1bc742181ded4930842b46e9507372f0b1b963James Dong bits = h264bsdShowBits32(pStrmData); 1670c1bc742181ded4930842b46e9507372f0b1b963James Dong if (h264bsdFlushBits(pStrmData, 32) == END_OF_STREAM) 1680c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 1690c1bc742181ded4930842b46e9507372f0b1b963James Dong /* code num 2^32 - 1, needed for unsigned mapping */ 1700c1bc742181ded4930842b46e9507372f0b1b963James Dong if (bits == 0) 1710c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1720c1bc742181ded4930842b46e9507372f0b1b963James Dong *codeNum = BIG_CODE_NUM; 1730c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_OK); 1740c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1750c1bc742181ded4930842b46e9507372f0b1b963James Dong /* code num 2^32, needed for unsigned mapping 1760c1bc742181ded4930842b46e9507372f0b1b963James Dong * (results in -2^31) */ 1770c1bc742181ded4930842b46e9507372f0b1b963James Dong else if (bits == 1) 1780c1bc742181ded4930842b46e9507372f0b1b963James Dong { 1790c1bc742181ded4930842b46e9507372f0b1b963James Dong *codeNum = BIG_CODE_NUM; 1800c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 1810c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1820c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1830c1bc742181ded4930842b46e9507372f0b1b963James Dong /* if more zeros than 32, it is an error */ 1840c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 1850c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1860c1bc742181ded4930842b46e9507372f0b1b963James Dong else 1870c1bc742181ded4930842b46e9507372f0b1b963James Dong h264bsdFlushBits(pStrmData,numZeros+1); 1880c1bc742181ded4930842b46e9507372f0b1b963James Dong 1890c1bc742181ded4930842b46e9507372f0b1b963James Dong bits = h264bsdGetBits(pStrmData, numZeros); 1900c1bc742181ded4930842b46e9507372f0b1b963James Dong if (bits == END_OF_STREAM) 1910c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 1920c1bc742181ded4930842b46e9507372f0b1b963James Dong 1930c1bc742181ded4930842b46e9507372f0b1b963James Dong *codeNum = (1 << numZeros) - 1 + bits; 1940c1bc742181ded4930842b46e9507372f0b1b963James Dong 1950c1bc742181ded4930842b46e9507372f0b1b963James Dong } 1960c1bc742181ded4930842b46e9507372f0b1b963James Dong 1970c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_OK); 1980c1bc742181ded4930842b46e9507372f0b1b963James Dong 1990c1bc742181ded4930842b46e9507372f0b1b963James Dong} 2000c1bc742181ded4930842b46e9507372f0b1b963James Dong 2010c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------ 2020c1bc742181ded4930842b46e9507372f0b1b963James Dong 2030c1bc742181ded4930842b46e9507372f0b1b963James Dong 5.2 Function: h264bsdDecodeExpGolombSigned 2040c1bc742181ded4930842b46e9507372f0b1b963James Dong 2050c1bc742181ded4930842b46e9507372f0b1b963James Dong Functional description: 2060c1bc742181ded4930842b46e9507372f0b1b963James Dong Decode signed Exp-Golomb code. Code num is determined by 2070c1bc742181ded4930842b46e9507372f0b1b963James Dong h264bsdDecodeExpGolombUnsigned and then mapped to signed 2080c1bc742181ded4930842b46e9507372f0b1b963James Dong representation as 2090c1bc742181ded4930842b46e9507372f0b1b963James Dong 2100c1bc742181ded4930842b46e9507372f0b1b963James Dong symbol = (-1)^(codeNum+1) * (codeNum+1)/2 2110c1bc742181ded4930842b46e9507372f0b1b963James Dong 2120c1bc742181ded4930842b46e9507372f0b1b963James Dong Signed symbols shall be in the range [-2^31, 2^31 - 1]. Symbol 2130c1bc742181ded4930842b46e9507372f0b1b963James Dong -2^31 is obtained when codeNum is 2^32, which cannot be expressed 2140c1bc742181ded4930842b46e9507372f0b1b963James Dong by unsigned 32-bit value. This is signaled as a special case from 2150c1bc742181ded4930842b46e9507372f0b1b963James Dong the h264bsdDecodeExpGolombUnsigned by setting codeNum to 2160c1bc742181ded4930842b46e9507372f0b1b963James Dong BIG_CODE_NUM and returning HANTRO_NOK status. 2170c1bc742181ded4930842b46e9507372f0b1b963James Dong 2180c1bc742181ded4930842b46e9507372f0b1b963James Dong Inputs: 2190c1bc742181ded4930842b46e9507372f0b1b963James Dong pStrmData pointer to stream data structure 2200c1bc742181ded4930842b46e9507372f0b1b963James Dong 2210c1bc742181ded4930842b46e9507372f0b1b963James Dong Outputs: 2220c1bc742181ded4930842b46e9507372f0b1b963James Dong value decoded code word is stored here 2230c1bc742181ded4930842b46e9507372f0b1b963James Dong 2240c1bc742181ded4930842b46e9507372f0b1b963James Dong Returns: 2250c1bc742181ded4930842b46e9507372f0b1b963James Dong HANTRO_OK success 2260c1bc742181ded4930842b46e9507372f0b1b963James Dong HANTRO_NOK failure, no valid code word found 2270c1bc742181ded4930842b46e9507372f0b1b963James Dong 2280c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/ 2290c1bc742181ded4930842b46e9507372f0b1b963James Dong 2300c1bc742181ded4930842b46e9507372f0b1b963James Dongu32 h264bsdDecodeExpGolombSigned(strmData_t *pStrmData, i32 *value) 2310c1bc742181ded4930842b46e9507372f0b1b963James Dong{ 2320c1bc742181ded4930842b46e9507372f0b1b963James Dong 2330c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Variables */ 2340c1bc742181ded4930842b46e9507372f0b1b963James Dong 2350c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 status, codeNum = 0; 2360c1bc742181ded4930842b46e9507372f0b1b963James Dong 2370c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */ 2380c1bc742181ded4930842b46e9507372f0b1b963James Dong 2390c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(pStrmData); 2400c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(value); 2410c1bc742181ded4930842b46e9507372f0b1b963James Dong 2420c1bc742181ded4930842b46e9507372f0b1b963James Dong status = h264bsdDecodeExpGolombUnsigned(pStrmData, &codeNum); 2430c1bc742181ded4930842b46e9507372f0b1b963James Dong 2440c1bc742181ded4930842b46e9507372f0b1b963James Dong if (codeNum == BIG_CODE_NUM) 2450c1bc742181ded4930842b46e9507372f0b1b963James Dong { 2460c1bc742181ded4930842b46e9507372f0b1b963James Dong /* BIG_CODE_NUM and HANTRO_OK status means codeNum 2^32-1 which would 2470c1bc742181ded4930842b46e9507372f0b1b963James Dong * result in signed integer valued 2^31 (i.e. out of 32-bit signed 2480c1bc742181ded4930842b46e9507372f0b1b963James Dong * integer range) */ 2490c1bc742181ded4930842b46e9507372f0b1b963James Dong if (status == HANTRO_OK) 2500c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 2510c1bc742181ded4930842b46e9507372f0b1b963James Dong /* BIG_CODE_NUM and HANTRO_NOK status means codeNum 2^32 which results 2520c1bc742181ded4930842b46e9507372f0b1b963James Dong * in signed integer valued -2^31 */ 2530c1bc742181ded4930842b46e9507372f0b1b963James Dong else 2540c1bc742181ded4930842b46e9507372f0b1b963James Dong { 2550c1bc742181ded4930842b46e9507372f0b1b963James Dong *value = (i32)(2147483648U); 2560c1bc742181ded4930842b46e9507372f0b1b963James Dong return (HANTRO_OK); 2570c1bc742181ded4930842b46e9507372f0b1b963James Dong } 2580c1bc742181ded4930842b46e9507372f0b1b963James Dong } 2590c1bc742181ded4930842b46e9507372f0b1b963James Dong else if (status == HANTRO_OK) 2600c1bc742181ded4930842b46e9507372f0b1b963James Dong { 2610c1bc742181ded4930842b46e9507372f0b1b963James Dong /* (-1)^(codeNum+1) results in positive sign if codeNum is odd, 2620c1bc742181ded4930842b46e9507372f0b1b963James Dong * negative when it is even. (codeNum+1)/2 is obtained as 2630c1bc742181ded4930842b46e9507372f0b1b963James Dong * (codeNum+1)>>1 when value is positive and as (-codeNum)>>1 for 2640c1bc742181ded4930842b46e9507372f0b1b963James Dong * negative value */ 2650c1bc742181ded4930842b46e9507372f0b1b963James Dong /*lint -e702 */ 2660c1bc742181ded4930842b46e9507372f0b1b963James Dong *value = (codeNum & 0x1) ? (i32)((codeNum + 1) >> 1) : 2670c1bc742181ded4930842b46e9507372f0b1b963James Dong -(i32)((codeNum + 1) >> 1); 2680c1bc742181ded4930842b46e9507372f0b1b963James Dong /*lint +e702 */ 2690c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_OK); 2700c1bc742181ded4930842b46e9507372f0b1b963James Dong } 2710c1bc742181ded4930842b46e9507372f0b1b963James Dong 2720c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_NOK); 2730c1bc742181ded4930842b46e9507372f0b1b963James Dong 2740c1bc742181ded4930842b46e9507372f0b1b963James Dong} 2750c1bc742181ded4930842b46e9507372f0b1b963James Dong 2760c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------ 2770c1bc742181ded4930842b46e9507372f0b1b963James Dong 2780c1bc742181ded4930842b46e9507372f0b1b963James Dong 5.3 Function: h264bsdDecodeExpGolombMapped 2790c1bc742181ded4930842b46e9507372f0b1b963James Dong 2800c1bc742181ded4930842b46e9507372f0b1b963James Dong Functional description: 2810c1bc742181ded4930842b46e9507372f0b1b963James Dong Decode mapped Exp-Golomb code. Code num is determined by 2820c1bc742181ded4930842b46e9507372f0b1b963James Dong h264bsdDecodeExpGolombUnsigned and then mapped to codedBlockPattern 2830c1bc742181ded4930842b46e9507372f0b1b963James Dong either for intra or inter macroblock. The mapping is implemented by 2840c1bc742181ded4930842b46e9507372f0b1b963James Dong look-up tables defined in the beginning of the file. 2850c1bc742181ded4930842b46e9507372f0b1b963James Dong 2860c1bc742181ded4930842b46e9507372f0b1b963James Dong Inputs: 2870c1bc742181ded4930842b46e9507372f0b1b963James Dong pStrmData pointer to stream data structure 2880c1bc742181ded4930842b46e9507372f0b1b963James Dong isIntra flag to indicate if intra or inter mapping is to 2890c1bc742181ded4930842b46e9507372f0b1b963James Dong be used 2900c1bc742181ded4930842b46e9507372f0b1b963James Dong 2910c1bc742181ded4930842b46e9507372f0b1b963James Dong Outputs: 2920c1bc742181ded4930842b46e9507372f0b1b963James Dong value decoded code word is stored here 2930c1bc742181ded4930842b46e9507372f0b1b963James Dong 2940c1bc742181ded4930842b46e9507372f0b1b963James Dong Returns: 2950c1bc742181ded4930842b46e9507372f0b1b963James Dong HANTRO_OK success 2960c1bc742181ded4930842b46e9507372f0b1b963James Dong HANTRO_NOK failure, no valid code word found 2970c1bc742181ded4930842b46e9507372f0b1b963James Dong 2980c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/ 2990c1bc742181ded4930842b46e9507372f0b1b963James Dong 3000c1bc742181ded4930842b46e9507372f0b1b963James Dongu32 h264bsdDecodeExpGolombMapped(strmData_t *pStrmData, u32 *value, 3010c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 isIntra) 3020c1bc742181ded4930842b46e9507372f0b1b963James Dong{ 3030c1bc742181ded4930842b46e9507372f0b1b963James Dong 3040c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Variables */ 3050c1bc742181ded4930842b46e9507372f0b1b963James Dong 3060c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 status, codeNum; 3070c1bc742181ded4930842b46e9507372f0b1b963James Dong 3080c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */ 3090c1bc742181ded4930842b46e9507372f0b1b963James Dong 3100c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(pStrmData); 3110c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(value); 3120c1bc742181ded4930842b46e9507372f0b1b963James Dong 3130c1bc742181ded4930842b46e9507372f0b1b963James Dong status = h264bsdDecodeExpGolombUnsigned(pStrmData, &codeNum); 3140c1bc742181ded4930842b46e9507372f0b1b963James Dong 3150c1bc742181ded4930842b46e9507372f0b1b963James Dong if (status != HANTRO_OK) 3160c1bc742181ded4930842b46e9507372f0b1b963James Dong return (HANTRO_NOK); 3170c1bc742181ded4930842b46e9507372f0b1b963James Dong else 3180c1bc742181ded4930842b46e9507372f0b1b963James Dong { 3190c1bc742181ded4930842b46e9507372f0b1b963James Dong /* range of valid codeNums [0,47] */ 3200c1bc742181ded4930842b46e9507372f0b1b963James Dong if (codeNum > 47) 3210c1bc742181ded4930842b46e9507372f0b1b963James Dong return (HANTRO_NOK); 3220c1bc742181ded4930842b46e9507372f0b1b963James Dong if (isIntra) 3230c1bc742181ded4930842b46e9507372f0b1b963James Dong *value = codedBlockPatternIntra4x4[codeNum]; 3240c1bc742181ded4930842b46e9507372f0b1b963James Dong else 3250c1bc742181ded4930842b46e9507372f0b1b963James Dong *value = codedBlockPatternInter[codeNum]; 3260c1bc742181ded4930842b46e9507372f0b1b963James Dong return(HANTRO_OK); 3270c1bc742181ded4930842b46e9507372f0b1b963James Dong } 3280c1bc742181ded4930842b46e9507372f0b1b963James Dong 3290c1bc742181ded4930842b46e9507372f0b1b963James Dong} 3300c1bc742181ded4930842b46e9507372f0b1b963James Dong 3310c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------ 3320c1bc742181ded4930842b46e9507372f0b1b963James Dong 3330c1bc742181ded4930842b46e9507372f0b1b963James Dong 5.4 Function: h264bsdDecodeExpGolombTruncated 3340c1bc742181ded4930842b46e9507372f0b1b963James Dong 3350c1bc742181ded4930842b46e9507372f0b1b963James Dong Functional description: 3360c1bc742181ded4930842b46e9507372f0b1b963James Dong Decode truncated Exp-Golomb code. greaterThanOne flag indicates 3370c1bc742181ded4930842b46e9507372f0b1b963James Dong the range of the symbol to be decoded as follows: 3380c1bc742181ded4930842b46e9507372f0b1b963James Dong FALSE -> [0,1] 3390c1bc742181ded4930842b46e9507372f0b1b963James Dong TRUE -> [0,2^32-1] 3400c1bc742181ded4930842b46e9507372f0b1b963James Dong 3410c1bc742181ded4930842b46e9507372f0b1b963James Dong If flag is false the decoding is performed by reading one bit 3420c1bc742181ded4930842b46e9507372f0b1b963James Dong from the stream with h264bsdGetBits and mapping this to decoded 3430c1bc742181ded4930842b46e9507372f0b1b963James Dong symbol as 3440c1bc742181ded4930842b46e9507372f0b1b963James Dong symbol = bit ? 0 : 1 3450c1bc742181ded4930842b46e9507372f0b1b963James Dong 3460c1bc742181ded4930842b46e9507372f0b1b963James Dong Otherwise, i.e. when flag is TRUE, code num is determined by 3470c1bc742181ded4930842b46e9507372f0b1b963James Dong h264bsdDecodeExpGolombUnsigned and this is used as the decoded 3480c1bc742181ded4930842b46e9507372f0b1b963James Dong symbol. 3490c1bc742181ded4930842b46e9507372f0b1b963James Dong 3500c1bc742181ded4930842b46e9507372f0b1b963James Dong Inputs: 3510c1bc742181ded4930842b46e9507372f0b1b963James Dong pStrmData pointer to stream data structure 3520c1bc742181ded4930842b46e9507372f0b1b963James Dong greaterThanOne flag to indicate if range is wider than [0,1] 3530c1bc742181ded4930842b46e9507372f0b1b963James Dong 3540c1bc742181ded4930842b46e9507372f0b1b963James Dong Outputs: 3550c1bc742181ded4930842b46e9507372f0b1b963James Dong value decoded code word is stored here 3560c1bc742181ded4930842b46e9507372f0b1b963James Dong 3570c1bc742181ded4930842b46e9507372f0b1b963James Dong Returns: 3580c1bc742181ded4930842b46e9507372f0b1b963James Dong HANTRO_OK success 3590c1bc742181ded4930842b46e9507372f0b1b963James Dong HANTRO_NOK failure, no valid code word found 3600c1bc742181ded4930842b46e9507372f0b1b963James Dong 3610c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/ 3620c1bc742181ded4930842b46e9507372f0b1b963James Dong 3630c1bc742181ded4930842b46e9507372f0b1b963James Dongu32 h264bsdDecodeExpGolombTruncated( 3640c1bc742181ded4930842b46e9507372f0b1b963James Dong strmData_t *pStrmData, 3650c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 *value, 3660c1bc742181ded4930842b46e9507372f0b1b963James Dong u32 greaterThanOne) 3670c1bc742181ded4930842b46e9507372f0b1b963James Dong{ 3680c1bc742181ded4930842b46e9507372f0b1b963James Dong 3690c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Variables */ 3700c1bc742181ded4930842b46e9507372f0b1b963James Dong 3710c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */ 3720c1bc742181ded4930842b46e9507372f0b1b963James Dong 3730c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(pStrmData); 3740c1bc742181ded4930842b46e9507372f0b1b963James Dong ASSERT(value); 3750c1bc742181ded4930842b46e9507372f0b1b963James Dong 3760c1bc742181ded4930842b46e9507372f0b1b963James Dong if (greaterThanOne) 3770c1bc742181ded4930842b46e9507372f0b1b963James Dong { 3780c1bc742181ded4930842b46e9507372f0b1b963James Dong return(h264bsdDecodeExpGolombUnsigned(pStrmData, value)); 3790c1bc742181ded4930842b46e9507372f0b1b963James Dong } 3800c1bc742181ded4930842b46e9507372f0b1b963James Dong else 3810c1bc742181ded4930842b46e9507372f0b1b963James Dong { 3820c1bc742181ded4930842b46e9507372f0b1b963James Dong *value = h264bsdGetBits(pStrmData,1); 3830c1bc742181ded4930842b46e9507372f0b1b963James Dong if (*value == END_OF_STREAM) 3840c1bc742181ded4930842b46e9507372f0b1b963James Dong return (HANTRO_NOK); 3850c1bc742181ded4930842b46e9507372f0b1b963James Dong *value ^= 0x1; 3860c1bc742181ded4930842b46e9507372f0b1b963James Dong } 3870c1bc742181ded4930842b46e9507372f0b1b963James Dong 3880c1bc742181ded4930842b46e9507372f0b1b963James Dong return (HANTRO_OK); 3890c1bc742181ded4930842b46e9507372f0b1b963James Dong 3900c1bc742181ded4930842b46e9507372f0b1b963James Dong} 3910c1bc742181ded4930842b46e9507372f0b1b963James Dong 392