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