Home | History | Annotate | Download | only in source
      1 /*
      2  * Copyright (C) 2009 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 /*------------------------------------------------------------------------------
     18 
     19     Table of contents
     20 
     21      1. Include headers
     22      2. External compiler flags
     23      3. Module defines
     24      4. Local function prototypes
     25      5. Functions
     26           h264bsdDecodeExpGolombUnsigned
     27           h264bsdDecodeExpGolombSigned
     28           h264bsdDecodeExpGolombMapped
     29           h264bsdDecodeExpGolombTruncated
     30 
     31 ------------------------------------------------------------------------------*/
     32 
     33 /*------------------------------------------------------------------------------
     34     1. Include headers
     35 ------------------------------------------------------------------------------*/
     36 
     37 #include "h264bsd_vlc.h"
     38 #include "basetype.h"
     39 #include "h264bsd_stream.h"
     40 #include "h264bsd_util.h"
     41 
     42 /*------------------------------------------------------------------------------
     43     2. External compiler flags
     44 --------------------------------------------------------------------------------
     45 
     46 --------------------------------------------------------------------------------
     47     3. Module defines
     48 ------------------------------------------------------------------------------*/
     49 
     50 /* definition of special code num, this along with the return value is used
     51  * to handle code num in the range [0, 2^32] in the DecodeExpGolombUnsigned
     52  * function */
     53 #define BIG_CODE_NUM 0xFFFFFFFFU
     54 
     55 /* Mapping tables for coded_block_pattern, used for decoding of mapped
     56  * Exp-Golomb codes */
     57 static const u8 codedBlockPatternIntra4x4[48] = {
     58     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,
     59     37,42,44,1,2,4,8,17,18,20,24,6,9,22,25,32,33,34,36,40,38,41};
     60 
     61 static const u8 codedBlockPatternInter[48] = {
     62     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,
     63     39,43,45,46,17,18,20,24,19,21,26,28,23,27,29,30,22,25,38,41};
     64 
     65 /*------------------------------------------------------------------------------
     66     4. Local function prototypes
     67 ------------------------------------------------------------------------------*/
     68 
     69 /*------------------------------------------------------------------------------
     70 
     71    5.1  Function: h264bsdDecodeExpGolombUnsigned
     72 
     73         Functional description:
     74             Decode unsigned Exp-Golomb code. This is the same as codeNum used
     75             in other Exp-Golomb code mappings. Code num (i.e. the decoded
     76             symbol) is determined as
     77 
     78                 codeNum = 2^leadingZeros - 1 + GetBits(leadingZeros)
     79 
     80             Normal decoded symbols are in the range [0, 2^32 - 2]. Symbol
     81             2^32-1 is indicated by BIG_CODE_NUM with return value HANTRO_OK
     82             while symbol 2^32  is indicated by BIG_CODE_NUM with return value
     83             HANTRO_NOK.  These two symbols are special cases with code length
     84             of 65, i.e.  32 '0' bits, a '1' bit, and either 0 or 1 represented
     85             by 32 bits.
     86 
     87             Symbol 2^32 is out of unsigned 32-bit range but is needed for
     88             DecodeExpGolombSigned to express value -2^31.
     89 
     90         Inputs:
     91             pStrmData       pointer to stream data structure
     92 
     93         Outputs:
     94             codeNum         decoded code word is stored here
     95 
     96         Returns:
     97             HANTRO_OK       success
     98             HANTRO_NOK      failure, no valid code word found, note exception
     99                             with BIG_CODE_NUM
    100 
    101 ------------------------------------------------------------------------------*/
    102 
    103 u32 h264bsdDecodeExpGolombUnsigned(strmData_t *pStrmData, u32 *codeNum)
    104 {
    105 
    106 /* Variables */
    107 
    108     u32 bits, numZeros;
    109 
    110 /* Code */
    111 
    112     ASSERT(pStrmData);
    113     ASSERT(codeNum);
    114 
    115     bits = h264bsdShowBits32(pStrmData);
    116 
    117     /* first bit is 1 -> code length 1 */
    118     if (bits >= 0x80000000)
    119     {
    120         h264bsdFlushBits(pStrmData, 1);
    121         *codeNum = 0;
    122         return(HANTRO_OK);
    123     }
    124     /* second bit is 1 -> code length 3 */
    125     else if (bits >= 0x40000000)
    126     {
    127         if (h264bsdFlushBits(pStrmData, 3) == END_OF_STREAM)
    128             return(HANTRO_NOK);
    129         *codeNum = 1 + ((bits >> 29) & 0x1);
    130         return(HANTRO_OK);
    131     }
    132     /* third bit is 1 -> code length 5 */
    133     else if (bits >= 0x20000000)
    134     {
    135         if (h264bsdFlushBits(pStrmData, 5) == END_OF_STREAM)
    136             return(HANTRO_NOK);
    137         *codeNum = 3 + ((bits >> 27) & 0x3);
    138         return(HANTRO_OK);
    139     }
    140     /* fourth bit is 1 -> code length 7 */
    141     else if (bits >= 0x10000000)
    142     {
    143         if (h264bsdFlushBits(pStrmData, 7) == END_OF_STREAM)
    144             return(HANTRO_NOK);
    145         *codeNum = 7 + ((bits >> 25) & 0x7);
    146         return(HANTRO_OK);
    147     }
    148     /* other code lengths */
    149     else
    150     {
    151 #ifndef H264DEC_NEON
    152         numZeros = 4 + h264bsdCountLeadingZeros(bits, 28);
    153 #else
    154         numZeros = h264bsdCountLeadingZeros(bits);
    155 #endif
    156         /* all 32 bits are zero */
    157         if (numZeros == 32)
    158         {
    159             *codeNum = 0;
    160             h264bsdFlushBits(pStrmData,32);
    161             bits = h264bsdGetBits(pStrmData, 1);
    162             /* check 33rd bit, must be 1 */
    163             if (bits == 1)
    164             {
    165                 /* cannot use h264bsdGetBits, limited to 31 bits */
    166                 bits = h264bsdShowBits32(pStrmData);
    167                 if (h264bsdFlushBits(pStrmData, 32) == END_OF_STREAM)
    168                     return(HANTRO_NOK);
    169                 /* code num 2^32 - 1, needed for unsigned mapping */
    170                 if (bits == 0)
    171                 {
    172                     *codeNum = BIG_CODE_NUM;
    173                     return(HANTRO_OK);
    174                 }
    175                 /* code num 2^32, needed for unsigned mapping
    176                  * (results in -2^31) */
    177                 else if (bits == 1)
    178                 {
    179                     *codeNum = BIG_CODE_NUM;
    180                     return(HANTRO_NOK);
    181                 }
    182             }
    183             /* if more zeros than 32, it is an error */
    184             return(HANTRO_NOK);
    185         }
    186         else
    187             h264bsdFlushBits(pStrmData,numZeros+1);
    188 
    189         bits = h264bsdGetBits(pStrmData, numZeros);
    190         if (bits == END_OF_STREAM)
    191             return(HANTRO_NOK);
    192 
    193         *codeNum = (1 << numZeros) - 1 + bits;
    194 
    195     }
    196 
    197     return(HANTRO_OK);
    198 
    199 }
    200 
    201 /*------------------------------------------------------------------------------
    202 
    203    5.2  Function: h264bsdDecodeExpGolombSigned
    204 
    205         Functional description:
    206             Decode signed Exp-Golomb code. Code num is determined by
    207             h264bsdDecodeExpGolombUnsigned and then mapped to signed
    208             representation as
    209 
    210                 symbol = (-1)^(codeNum+1) * (codeNum+1)/2
    211 
    212             Signed symbols shall be in the range [-2^31, 2^31 - 1]. Symbol
    213             -2^31 is obtained when codeNum is 2^32, which cannot be expressed
    214             by unsigned 32-bit value. This is signaled as a special case from
    215             the h264bsdDecodeExpGolombUnsigned by setting codeNum to
    216             BIG_CODE_NUM and returning HANTRO_NOK status.
    217 
    218         Inputs:
    219             pStrmData       pointer to stream data structure
    220 
    221         Outputs:
    222             value           decoded code word is stored here
    223 
    224         Returns:
    225             HANTRO_OK       success
    226             HANTRO_NOK      failure, no valid code word found
    227 
    228 ------------------------------------------------------------------------------*/
    229 
    230 u32 h264bsdDecodeExpGolombSigned(strmData_t *pStrmData, i32 *value)
    231 {
    232 
    233 /* Variables */
    234 
    235     u32 status, codeNum = 0;
    236 
    237 /* Code */
    238 
    239     ASSERT(pStrmData);
    240     ASSERT(value);
    241 
    242     status = h264bsdDecodeExpGolombUnsigned(pStrmData, &codeNum);
    243 
    244     if (codeNum == BIG_CODE_NUM)
    245     {
    246         /* BIG_CODE_NUM and HANTRO_OK status means codeNum 2^32-1 which would
    247          * result in signed integer valued 2^31 (i.e. out of 32-bit signed
    248          * integer range) */
    249         if (status == HANTRO_OK)
    250             return(HANTRO_NOK);
    251         /* BIG_CODE_NUM and HANTRO_NOK status means codeNum 2^32 which results
    252          * in signed integer valued -2^31 */
    253         else
    254         {
    255             *value = (i32)(2147483648U);
    256             return (HANTRO_OK);
    257         }
    258     }
    259     else if (status == HANTRO_OK)
    260     {
    261         /* (-1)^(codeNum+1) results in positive sign if codeNum is odd,
    262          * negative when it is even. (codeNum+1)/2 is obtained as
    263          * (codeNum+1)>>1 when value is positive and as (-codeNum)>>1 for
    264          * negative value */
    265         /*lint -e702 */
    266         *value = (codeNum & 0x1) ? (i32)((codeNum + 1) >> 1) :
    267                                   -(i32)((codeNum + 1) >> 1);
    268         /*lint +e702 */
    269         return(HANTRO_OK);
    270     }
    271 
    272     return(HANTRO_NOK);
    273 
    274 }
    275 
    276 /*------------------------------------------------------------------------------
    277 
    278    5.3  Function: h264bsdDecodeExpGolombMapped
    279 
    280         Functional description:
    281             Decode mapped Exp-Golomb code. Code num is determined by
    282             h264bsdDecodeExpGolombUnsigned and then mapped to codedBlockPattern
    283             either for intra or inter macroblock. The mapping is implemented by
    284             look-up tables defined in the beginning of the file.
    285 
    286         Inputs:
    287             pStrmData       pointer to stream data structure
    288             isIntra         flag to indicate if intra or inter mapping is to
    289                             be used
    290 
    291         Outputs:
    292             value           decoded code word is stored here
    293 
    294         Returns:
    295             HANTRO_OK       success
    296             HANTRO_NOK      failure, no valid code word found
    297 
    298 ------------------------------------------------------------------------------*/
    299 
    300 u32 h264bsdDecodeExpGolombMapped(strmData_t *pStrmData, u32 *value,
    301     u32 isIntra)
    302 {
    303 
    304 /* Variables */
    305 
    306     u32 status, codeNum;
    307 
    308 /* Code */
    309 
    310     ASSERT(pStrmData);
    311     ASSERT(value);
    312 
    313     status = h264bsdDecodeExpGolombUnsigned(pStrmData, &codeNum);
    314 
    315     if (status != HANTRO_OK)
    316         return (HANTRO_NOK);
    317     else
    318     {
    319         /* range of valid codeNums [0,47] */
    320         if (codeNum > 47)
    321             return (HANTRO_NOK);
    322         if (isIntra)
    323             *value = codedBlockPatternIntra4x4[codeNum];
    324         else
    325             *value = codedBlockPatternInter[codeNum];
    326         return(HANTRO_OK);
    327     }
    328 
    329 }
    330 
    331 /*------------------------------------------------------------------------------
    332 
    333    5.4  Function: h264bsdDecodeExpGolombTruncated
    334 
    335         Functional description:
    336             Decode truncated Exp-Golomb code. greaterThanOne flag indicates
    337             the range of the symbol to be decoded as follows:
    338                 FALSE   ->  [0,1]
    339                 TRUE    ->  [0,2^32-1]
    340 
    341             If flag is false the decoding is performed by reading one bit
    342             from the stream with h264bsdGetBits and mapping this to decoded
    343             symbol as
    344                 symbol = bit ? 0 : 1
    345 
    346             Otherwise, i.e. when flag is TRUE, code num is determined by
    347             h264bsdDecodeExpGolombUnsigned and this is used as the decoded
    348             symbol.
    349 
    350         Inputs:
    351             pStrmData       pointer to stream data structure
    352             greaterThanOne  flag to indicate if range is wider than [0,1]
    353 
    354         Outputs:
    355             value           decoded code word is stored here
    356 
    357         Returns:
    358             HANTRO_OK       success
    359             HANTRO_NOK      failure, no valid code word found
    360 
    361 ------------------------------------------------------------------------------*/
    362 
    363 u32 h264bsdDecodeExpGolombTruncated(
    364   strmData_t *pStrmData,
    365   u32 *value,
    366   u32 greaterThanOne)
    367 {
    368 
    369 /* Variables */
    370 
    371 /* Code */
    372 
    373     ASSERT(pStrmData);
    374     ASSERT(value);
    375 
    376     if (greaterThanOne)
    377     {
    378         return(h264bsdDecodeExpGolombUnsigned(pStrmData, value));
    379     }
    380     else
    381     {
    382         *value = h264bsdGetBits(pStrmData,1);
    383         if (*value == END_OF_STREAM)
    384             return (HANTRO_NOK);
    385         *value ^= 0x1;
    386     }
    387 
    388     return (HANTRO_OK);
    389 
    390 }
    391 
    392