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           DecodeCoeffToken
     27           DecodeLevelPrefix
     28           DecodeTotalZeros
     29           DecodeRunBefore
     30           DecodeResidualBlockCavlc
     31 
     32 ------------------------------------------------------------------------------*/
     33 
     34 /*------------------------------------------------------------------------------
     35     1. Include headers
     36 ------------------------------------------------------------------------------*/
     37 
     38 #include "h264bsd_cavlc.h"
     39 #include "h264bsd_util.h"
     40 
     41 /*------------------------------------------------------------------------------
     42     2. External compiler flags
     43 --------------------------------------------------------------------------------
     44 
     45 --------------------------------------------------------------------------------
     46     3. Module defines
     47 ------------------------------------------------------------------------------*/
     48 
     49 /* Following descriptions use term "information field" to represent combination
     50  * of certain decoded symbol value and the length of the corresponding variable
     51  * length code word. For example, total_zeros information field consists of
     52  * 4 bits symbol value (bits [4,7]) along with four bits to represent length
     53  * of the VLC code word (bits [0,3]) */
     54 
     55 /* macro to obtain length of the coeff token information field, bits [0,4]  */
     56 #define LENGTH_TC(vlc) ((vlc) & 0x1F)
     57 /* macro to obtain length of the other information fields, bits [0,3] */
     58 #define LENGTH(vlc) ((vlc) & 0xF)
     59 /* macro to obtain code word from the information fields, bits [4,7] */
     60 #define INFO(vlc) (((vlc) >> 4) & 0xF)  /* 4 MSB bits contain information */
     61 /* macro to obtain trailing ones from the coeff token information word,
     62  * bits [5,10] */
     63 #define TRAILING_ONES(coeffToken) ((coeffToken>>5) & 0x3F)
     64 /* macro to obtain total coeff from the coeff token information word,
     65  * bits [11,15] */
     66 #define TOTAL_COEFF(coeffToken) (((coeffToken) >> 11) & 0x1F)
     67 
     68 #define VLC_NOT_FOUND 0xFFFFFFFEU
     69 
     70 /* VLC tables for coeff_token. Because of long codes (max. 16 bits) some of the
     71  * tables have been splitted into multiple separate tables. Each array/table
     72  * element has the following structure:
     73  * [5 bits for tot.coeff.] [6 bits for tr.ones] [5 bits for VLC length]
     74  * If there is a 0x0000 value, it means that there is not corresponding VLC
     75  * codeword for that index. */
     76 
     77 /* VLC lengths up to 6 bits, 0 <= nC < 2 */
     78 static const u16 coeffToken0_0[32] = {
     79     0x0000,0x0000,0x0000,0x2066,0x1026,0x0806,0x1865,0x1865,
     80     0x1043,0x1043,0x1043,0x1043,0x1043,0x1043,0x1043,0x1043,
     81     0x0822,0x0822,0x0822,0x0822,0x0822,0x0822,0x0822,0x0822,
     82     0x0822,0x0822,0x0822,0x0822,0x0822,0x0822,0x0822,0x0822};
     83 
     84 /* VLC lengths up to 10 bits, 0 <= nC < 2 */
     85 static const u16 coeffToken0_1[48] = {
     86     0x0000,0x0000,0x0000,0x0000,0x406a,0x304a,0x282a,0x200a,
     87     0x3869,0x3869,0x2849,0x2849,0x2029,0x2029,0x1809,0x1809,
     88     0x3068,0x3068,0x3068,0x3068,0x2048,0x2048,0x2048,0x2048,
     89     0x1828,0x1828,0x1828,0x1828,0x1008,0x1008,0x1008,0x1008,
     90     0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,
     91     0x1847,0x1847,0x1847,0x1847,0x1847,0x1847,0x1847,0x1847};
     92 
     93 /* VLC lengths up to 14 bits, 0 <= nC < 2 */
     94 static const u16 coeffToken0_2[56] = {
     95     0x606e,0x584e,0x502e,0x500e,0x586e,0x504e,0x482e,0x480e,
     96     0x400d,0x400d,0x484d,0x484d,0x402d,0x402d,0x380d,0x380d,
     97     0x506d,0x506d,0x404d,0x404d,0x382d,0x382d,0x300d,0x300d,
     98     0x486b,0x486b,0x486b,0x486b,0x486b,0x486b,0x486b,0x486b,
     99     0x384b,0x384b,0x384b,0x384b,0x384b,0x384b,0x384b,0x384b,
    100     0x302b,0x302b,0x302b,0x302b,0x302b,0x302b,0x302b,0x302b,
    101     0x280b,0x280b,0x280b,0x280b,0x280b,0x280b,0x280b,0x280b};
    102 
    103 /* VLC lengths up to 16 bits, 0 <= nC < 2 */
    104 static const u16 coeffToken0_3[32] = {
    105     0x0000,0x0000,0x682f,0x682f,0x8010,0x8050,0x8030,0x7810,
    106     0x8070,0x7850,0x7830,0x7010,0x7870,0x7050,0x7030,0x6810,
    107     0x706f,0x706f,0x684f,0x684f,0x602f,0x602f,0x600f,0x600f,
    108     0x686f,0x686f,0x604f,0x604f,0x582f,0x582f,0x580f,0x580f};
    109 
    110 /* VLC lengths up to 6 bits, 2 <= nC < 4 */
    111 static const u16 coeffToken2_0[32] = {
    112     0x0000,0x0000,0x0000,0x0000,0x3866,0x2046,0x2026,0x1006,
    113     0x3066,0x1846,0x1826,0x0806,0x2865,0x2865,0x1025,0x1025,
    114     0x2064,0x2064,0x2064,0x2064,0x1864,0x1864,0x1864,0x1864,
    115     0x1043,0x1043,0x1043,0x1043,0x1043,0x1043,0x1043,0x1043};
    116 
    117 /* VLC lengths up to 9 bits, 2 <= nC < 4 */
    118 static const u16 coeffToken2_1[32] = {
    119     0x0000,0x0000,0x0000,0x0000,0x4869,0x3849,0x3829,0x3009,
    120     0x2808,0x2808,0x3048,0x3048,0x3028,0x3028,0x2008,0x2008,
    121     0x4067,0x4067,0x4067,0x4067,0x2847,0x2847,0x2847,0x2847,
    122     0x2827,0x2827,0x2827,0x2827,0x1807,0x1807,0x1807,0x1807};
    123 
    124 /* VLC lengths up to 14 bits, 2 <= nC < 4 */
    125 static const u16 coeffToken2_2[128] = {
    126     0x0000,0x0000,0x786d,0x786d,0x806e,0x804e,0x802e,0x800e,
    127     0x782e,0x780e,0x784e,0x702e,0x704d,0x704d,0x700d,0x700d,
    128     0x706d,0x706d,0x684d,0x684d,0x682d,0x682d,0x680d,0x680d,
    129     0x686d,0x686d,0x604d,0x604d,0x602d,0x602d,0x600d,0x600d,
    130     0x580c,0x580c,0x580c,0x580c,0x584c,0x584c,0x584c,0x584c,
    131     0x582c,0x582c,0x582c,0x582c,0x500c,0x500c,0x500c,0x500c,
    132     0x606c,0x606c,0x606c,0x606c,0x504c,0x504c,0x504c,0x504c,
    133     0x502c,0x502c,0x502c,0x502c,0x480c,0x480c,0x480c,0x480c,
    134     0x586b,0x586b,0x586b,0x586b,0x586b,0x586b,0x586b,0x586b,
    135     0x484b,0x484b,0x484b,0x484b,0x484b,0x484b,0x484b,0x484b,
    136     0x482b,0x482b,0x482b,0x482b,0x482b,0x482b,0x482b,0x482b,
    137     0x400b,0x400b,0x400b,0x400b,0x400b,0x400b,0x400b,0x400b,
    138     0x506b,0x506b,0x506b,0x506b,0x506b,0x506b,0x506b,0x506b,
    139     0x404b,0x404b,0x404b,0x404b,0x404b,0x404b,0x404b,0x404b,
    140     0x402b,0x402b,0x402b,0x402b,0x402b,0x402b,0x402b,0x402b,
    141     0x380b,0x380b,0x380b,0x380b,0x380b,0x380b,0x380b,0x380b};
    142 
    143 /* VLC lengths up to 6 bits, 4 <= nC < 8 */
    144 static const u16 coeffToken4_0[64] = {
    145     0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
    146     0x1806,0x3846,0x3826,0x1006,0x4866,0x3046,0x3026,0x0806,
    147     0x2825,0x2825,0x2845,0x2845,0x2025,0x2025,0x2045,0x2045,
    148     0x1825,0x1825,0x4065,0x4065,0x1845,0x1845,0x1025,0x1025,
    149     0x3864,0x3864,0x3864,0x3864,0x3064,0x3064,0x3064,0x3064,
    150     0x2864,0x2864,0x2864,0x2864,0x2064,0x2064,0x2064,0x2064,
    151     0x1864,0x1864,0x1864,0x1864,0x1044,0x1044,0x1044,0x1044,
    152     0x0824,0x0824,0x0824,0x0824,0x0004,0x0004,0x0004,0x0004};
    153 
    154 /* VLC lengths up to 10 bits, 4 <= nC < 8 */
    155 static const u16 coeffToken4_1[128] = {
    156     0x0000,0x800a,0x806a,0x804a,0x802a,0x780a,0x786a,0x784a,
    157     0x782a,0x700a,0x706a,0x704a,0x702a,0x680a,0x6829,0x6829,
    158     0x6009,0x6009,0x6849,0x6849,0x6029,0x6029,0x5809,0x5809,
    159     0x6869,0x6869,0x6049,0x6049,0x5829,0x5829,0x5009,0x5009,
    160     0x6068,0x6068,0x6068,0x6068,0x5848,0x5848,0x5848,0x5848,
    161     0x5028,0x5028,0x5028,0x5028,0x4808,0x4808,0x4808,0x4808,
    162     0x5868,0x5868,0x5868,0x5868,0x5048,0x5048,0x5048,0x5048,
    163     0x4828,0x4828,0x4828,0x4828,0x4008,0x4008,0x4008,0x4008,
    164     0x3807,0x3807,0x3807,0x3807,0x3807,0x3807,0x3807,0x3807,
    165     0x3007,0x3007,0x3007,0x3007,0x3007,0x3007,0x3007,0x3007,
    166     0x4847,0x4847,0x4847,0x4847,0x4847,0x4847,0x4847,0x4847,
    167     0x2807,0x2807,0x2807,0x2807,0x2807,0x2807,0x2807,0x2807,
    168     0x5067,0x5067,0x5067,0x5067,0x5067,0x5067,0x5067,0x5067,
    169     0x4047,0x4047,0x4047,0x4047,0x4047,0x4047,0x4047,0x4047,
    170     0x4027,0x4027,0x4027,0x4027,0x4027,0x4027,0x4027,0x4027,
    171     0x2007,0x2007,0x2007,0x2007,0x2007,0x2007,0x2007,0x2007};
    172 
    173 /* fixed 6 bit length VLC, nC <= 8 */
    174 static const u16 coeffToken8[64] = {
    175     0x0806,0x0826,0x0000,0x0006,0x1006,0x1026,0x1046,0x0000,
    176     0x1806,0x1826,0x1846,0x1866,0x2006,0x2026,0x2046,0x2066,
    177     0x2806,0x2826,0x2846,0x2866,0x3006,0x3026,0x3046,0x3066,
    178     0x3806,0x3826,0x3846,0x3866,0x4006,0x4026,0x4046,0x4066,
    179     0x4806,0x4826,0x4846,0x4866,0x5006,0x5026,0x5046,0x5066,
    180     0x5806,0x5826,0x5846,0x5866,0x6006,0x6026,0x6046,0x6066,
    181     0x6806,0x6826,0x6846,0x6866,0x7006,0x7026,0x7046,0x7066,
    182     0x7806,0x7826,0x7846,0x7866,0x8006,0x8026,0x8046,0x8066};
    183 
    184 /* VLC lengths up to 3 bits, nC == -1 */
    185 static const u16 coeffTokenMinus1_0[8] = {
    186     0x0000,0x1043,0x0002,0x0002,0x0821,0x0821,0x0821,0x0821};
    187 
    188 /* VLC lengths up to 8 bits, nC == -1 */
    189 static const u16 coeffTokenMinus1_1[32] = {
    190     0x2067,0x2067,0x2048,0x2028,0x1847,0x1847,0x1827,0x1827,
    191     0x2006,0x2006,0x2006,0x2006,0x1806,0x1806,0x1806,0x1806,
    192     0x1006,0x1006,0x1006,0x1006,0x1866,0x1866,0x1866,0x1866,
    193     0x1026,0x1026,0x1026,0x1026,0x0806,0x0806,0x0806,0x0806};
    194 
    195 /* VLC tables for total_zeros. One table containing longer code, totalZeros_1,
    196  * has been broken into two separate tables. Table elements have the
    197  * following structure:
    198  * [4 bits for info] [4 bits for VLC length] */
    199 
    200 /* VLC lengths up to 5 bits */
    201 static const u8 totalZeros_1_0[32] = {
    202     0x00,0x00,0x65,0x55,0x44,0x44,0x34,0x34,
    203     0x23,0x23,0x23,0x23,0x13,0x13,0x13,0x13,
    204     0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
    205     0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01};
    206 
    207 /* VLC lengths up to 9 bits */
    208 static const u8 totalZeros_1_1[32] = {
    209     0x00,0xf9,0xe9,0xd9,0xc8,0xc8,0xb8,0xb8,
    210     0xa7,0xa7,0xa7,0xa7,0x97,0x97,0x97,0x97,
    211     0x86,0x86,0x86,0x86,0x86,0x86,0x86,0x86,
    212     0x76,0x76,0x76,0x76,0x76,0x76,0x76,0x76};
    213 
    214 static const u8 totalZeros_2[64] = {
    215     0xe6,0xd6,0xc6,0xb6,0xa5,0xa5,0x95,0x95,
    216     0x84,0x84,0x84,0x84,0x74,0x74,0x74,0x74,
    217     0x64,0x64,0x64,0x64,0x54,0x54,0x54,0x54,
    218     0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43,
    219     0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,
    220     0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,
    221     0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,
    222     0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03};
    223 
    224 static const u8 totalZeros_3[64] = {
    225     0xd6,0xb6,0xc5,0xc5,0xa5,0xa5,0x95,0x95,
    226     0x84,0x84,0x84,0x84,0x54,0x54,0x54,0x54,
    227     0x44,0x44,0x44,0x44,0x04,0x04,0x04,0x04,
    228     0x73,0x73,0x73,0x73,0x73,0x73,0x73,0x73,
    229     0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,
    230     0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,
    231     0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,
    232     0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13};
    233 
    234 static const u8 totalZeros_4[32] = {
    235     0xc5,0xb5,0xa5,0x05,0x94,0x94,0x74,0x74,
    236     0x34,0x34,0x24,0x24,0x83,0x83,0x83,0x83,
    237     0x63,0x63,0x63,0x63,0x53,0x53,0x53,0x53,
    238     0x43,0x43,0x43,0x43,0x13,0x13,0x13,0x13};
    239 
    240 static const u8 totalZeros_5[32] = {
    241     0xb5,0x95,0xa4,0xa4,0x84,0x84,0x24,0x24,
    242     0x14,0x14,0x04,0x04,0x73,0x73,0x73,0x73,
    243     0x63,0x63,0x63,0x63,0x53,0x53,0x53,0x53,
    244     0x43,0x43,0x43,0x43,0x33,0x33,0x33,0x33};
    245 
    246 static const u8 totalZeros_6[64] = {
    247     0xa6,0x06,0x15,0x15,0x84,0x84,0x84,0x84,
    248     0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,
    249     0x73,0x73,0x73,0x73,0x73,0x73,0x73,0x73,
    250     0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,
    251     0x53,0x53,0x53,0x53,0x53,0x53,0x53,0x53,
    252     0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43,
    253     0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,
    254     0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23};
    255 
    256 static const u8 totalZeros_7[64] = {
    257     0x96,0x06,0x15,0x15,0x74,0x74,0x74,0x74,
    258     0x83,0x83,0x83,0x83,0x83,0x83,0x83,0x83,
    259     0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,
    260     0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43,
    261     0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,
    262     0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,
    263     0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,
    264     0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52};
    265 
    266 static const u8 totalZeros_8[64] = {
    267     0x86,0x06,0x25,0x25,0x14,0x14,0x14,0x14,
    268     0x73,0x73,0x73,0x73,0x73,0x73,0x73,0x73,
    269     0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,
    270     0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,
    271     0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,
    272     0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,
    273     0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,
    274     0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42};
    275 
    276 static const u8 totalZeros_9[64] = {
    277     0x16,0x06,0x75,0x75,0x24,0x24,0x24,0x24,
    278     0x53,0x53,0x53,0x53,0x53,0x53,0x53,0x53,
    279     0x62,0x62,0x62,0x62,0x62,0x62,0x62,0x62,
    280     0x62,0x62,0x62,0x62,0x62,0x62,0x62,0x62,
    281     0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,
    282     0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,
    283     0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x32,
    284     0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x32};
    285 
    286 static const u8 totalZeros_10[32] = {
    287     0x15,0x05,0x64,0x64,0x23,0x23,0x23,0x23,
    288     0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,
    289     0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,
    290     0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x32};
    291 
    292 static const u8 totalZeros_11[16] = {
    293     0x04,0x14,0x23,0x23,0x33,0x33,0x53,0x53,
    294     0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41};
    295 
    296 static const u8 totalZeros_12[16] = {
    297     0x04,0x14,0x43,0x43,0x22,0x22,0x22,0x22,
    298     0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31};
    299 
    300 static const u8 totalZeros_13[8] = {0x03,0x13,0x32,0x32,0x21,0x21,0x21,0x21};
    301 
    302 static const u8 totalZeros_14[4] = {0x02,0x12,0x21,0x21};
    303 
    304 /* VLC tables for run_before. Table elements have the following structure:
    305  * [4 bits for info] [4bits for VLC length]
    306  */
    307 
    308 static const u8 runBefore_6[8] = {0x13,0x23,0x43,0x33,0x63,0x53,0x02,0x02};
    309 
    310 static const u8 runBefore_5[8] = {0x53,0x43,0x33,0x23,0x12,0x12,0x02,0x02};
    311 
    312 static const u8 runBefore_4[8] = {0x43,0x33,0x22,0x22,0x12,0x12,0x02,0x02};
    313 
    314 static const u8 runBefore_3[4] = {0x32,0x22,0x12,0x02};
    315 
    316 static const u8 runBefore_2[4] = {0x22,0x12,0x01,0x01};
    317 
    318 static const u8 runBefore_1[2] = {0x11,0x01};
    319 
    320 /* following four macros are used to handle stream buffer "cache" in the CAVLC
    321  * decoding function */
    322 
    323 /* macro to initialize stream buffer cache, fills the buffer (32 bits) */
    324 #define BUFFER_INIT(value, bits) \
    325 { \
    326     bits = 32; \
    327     value = h264bsdShowBits32(pStrmData); \
    328 }
    329 
    330 /* macro to read numBits bits from the buffer, bits will be written to
    331  * outVal. Refills the buffer if not enough bits left */
    332 #define BUFFER_SHOW(value, bits, outVal, numBits) \
    333 { \
    334     if (bits < (numBits)) \
    335     { \
    336         if(h264bsdFlushBits(pStrmData,32-bits) == END_OF_STREAM) \
    337             return(HANTRO_NOK); \
    338         value = h264bsdShowBits32(pStrmData); \
    339         bits = 32; \
    340     } \
    341     (outVal) = value >> (32 - (numBits)); \
    342 }
    343 
    344 /* macro to flush numBits bits from the buffer */
    345 #define BUFFER_FLUSH(value, bits, numBits) \
    346 { \
    347     value <<= (numBits); \
    348     bits -= (numBits); \
    349 }
    350 
    351 /* macro to read and flush  numBits bits from the buffer, bits will be written
    352  * to outVal. Refills the buffer if not enough bits left */
    353 #define BUFFER_GET(value, bits, outVal, numBits) \
    354 { \
    355     if (bits < (numBits)) \
    356     { \
    357         if(h264bsdFlushBits(pStrmData,32-bits) == END_OF_STREAM) \
    358             return(HANTRO_NOK); \
    359         value = h264bsdShowBits32(pStrmData); \
    360         bits = 32; \
    361     } \
    362     (outVal) = value >> (32 - (numBits)); \
    363     value <<= (numBits); \
    364     bits -= (numBits); \
    365 }
    366 
    367 /*------------------------------------------------------------------------------
    368     4. Local function prototypes
    369 ------------------------------------------------------------------------------*/
    370 
    371 static u32 DecodeCoeffToken(u32 bits, u32 nc);
    372 
    373 static u32 DecodeLevelPrefix(u32 bits);
    374 
    375 static u32 DecodeTotalZeros(u32 bits, u32 totalCoeff, u32 isChromaDC);
    376 
    377 static u32 DecodeRunBefore(u32 bits,u32 zerosLeft);
    378 
    379 /*------------------------------------------------------------------------------
    380 
    381     Function: DecodeCoeffToken
    382 
    383         Functional description:
    384           Function to decode coeff_token information field from the stream.
    385 
    386         Inputs:
    387           u32 bits                  next 16 stream bits
    388           u32 nc                    nC, see standard for details
    389 
    390         Outputs:
    391           u32  information field (11 bits for value, 5 bits for length)
    392 
    393 ------------------------------------------------------------------------------*/
    394 
    395 u32 DecodeCoeffToken(u32 bits, u32 nc)
    396 {
    397 
    398 /* Variables */
    399 
    400     u32 value;
    401 
    402 /* Code */
    403 
    404     /* standard defines that nc for decoding of chroma dc coefficients is -1,
    405      * represented by u32 here -> -1 maps to 2^32 - 1 */
    406     ASSERT(nc <= 16 || nc == (u32)(-1));
    407 
    408     if (nc < 2)
    409     {
    410         if (bits >= 0x8000)
    411         {
    412             value = 0x0001;
    413         }
    414         else if (bits >= 0x0C00)
    415             value = coeffToken0_0[bits >> 10];
    416         else if (bits >= 0x0100)
    417             value = coeffToken0_1[bits >> 6];
    418         else if (bits >= 0x0020)
    419             value = coeffToken0_2[(bits>>2)-8];
    420         else
    421             value = coeffToken0_3[bits];
    422     }
    423     else if (nc < 4)
    424     {
    425         if (bits >= 0x8000)
    426         {
    427             value = bits & 0x4000 ? 0x0002 : 0x0822;
    428         }
    429         else if (bits >= 0x1000)
    430             value = coeffToken2_0[bits >> 10];
    431         else if (bits >= 0x0200)
    432             value = coeffToken2_1[bits >> 7];
    433         else
    434             value = coeffToken2_2[bits>>2];
    435     }
    436     else if (nc < 8)
    437     {
    438         value = coeffToken4_0[bits >> 10];
    439         if (!value)
    440             value = coeffToken4_1[bits>>6];
    441     }
    442     else if (nc <= 16)
    443     {
    444         value = coeffToken8[bits>>10];
    445     }
    446     else
    447     {
    448         value = coeffTokenMinus1_0[bits >> 13];
    449         if (!value)
    450             value = coeffTokenMinus1_1[bits>>8];
    451     }
    452 
    453     return(value);
    454 
    455 }
    456 
    457 /*------------------------------------------------------------------------------
    458 
    459     Function: DecodeLevelPrefix
    460 
    461         Functional description:
    462           Function to decode level_prefix information field from the stream
    463 
    464         Inputs:
    465           u32 bits      next 16 stream bits
    466 
    467         Outputs:
    468           u32  level_prefix information field or VLC_NOT_FOUND
    469 
    470 ------------------------------------------------------------------------------*/
    471 
    472 u32 DecodeLevelPrefix(u32 bits)
    473 {
    474 
    475 /* Variables */
    476 
    477     u32 numZeros;
    478 
    479 /* Code */
    480 
    481     if (bits >= 0x8000)
    482         numZeros = 0;
    483     else if (bits >= 0x4000)
    484         numZeros = 1;
    485     else if (bits >= 0x2000)
    486         numZeros = 2;
    487     else if (bits >= 0x1000)
    488         numZeros = 3;
    489     else if (bits >= 0x0800)
    490         numZeros = 4;
    491     else if (bits >= 0x0400)
    492         numZeros = 5;
    493     else if (bits >= 0x0200)
    494         numZeros = 6;
    495     else if (bits >= 0x0100)
    496         numZeros = 7;
    497     else if (bits >= 0x0080)
    498         numZeros = 8;
    499     else if (bits >= 0x0040)
    500         numZeros = 9;
    501     else if (bits >= 0x0020)
    502         numZeros = 10;
    503     else if (bits >= 0x0010)
    504         numZeros = 11;
    505     else if (bits >= 0x0008)
    506         numZeros = 12;
    507     else if (bits >= 0x0004)
    508         numZeros = 13;
    509     else if (bits >= 0x0002)
    510         numZeros = 14;
    511     else if (bits >= 0x0001)
    512         numZeros = 15;
    513     else /* more than 15 zeros encountered which is an error */
    514         return(VLC_NOT_FOUND);
    515 
    516     return(numZeros);
    517 
    518 }
    519 
    520 /*------------------------------------------------------------------------------
    521 
    522     Function: DecodeTotalZeros
    523 
    524         Functional description:
    525           Function to decode total_zeros information field from the stream
    526 
    527         Inputs:
    528           u32 bits                  next 9 stream bits
    529           u32 totalCoeff            total number of coefficients for the block
    530                                     being decoded
    531           u32 isChromaDC           flag to indicate chroma DC block
    532 
    533         Outputs:
    534           u32  information field (4 bits value, 4 bits length)
    535 
    536 ------------------------------------------------------------------------------*/
    537 
    538 u32 DecodeTotalZeros(u32 bits, u32 totalCoeff, u32 isChromaDC)
    539 {
    540 
    541 /* Variables */
    542 
    543     u32 value = 0x0;
    544 
    545 /* Code */
    546 
    547     ASSERT(totalCoeff);
    548 
    549     if (!isChromaDC)
    550     {
    551         ASSERT(totalCoeff < 16);
    552         switch (totalCoeff)
    553         {
    554             case 1:
    555                 value = totalZeros_1_0[bits >> 4];
    556                 if (!value)
    557                     value = totalZeros_1_1[bits];
    558                 break;
    559 
    560             case 2:
    561                 value = totalZeros_2[bits >> 3];
    562                 break;
    563 
    564             case 3:
    565                 value = totalZeros_3[bits >> 3];
    566                 break;
    567 
    568             case 4:
    569                 value = totalZeros_4[bits >> 4];
    570                 break;
    571 
    572             case 5:
    573                 value = totalZeros_5[bits >> 4];
    574                 break;
    575 
    576             case 6:
    577                 value = totalZeros_6[bits >> 3];
    578                 break;
    579 
    580             case 7:
    581                 value = totalZeros_7[bits >> 3];
    582                 break;
    583 
    584             case 8:
    585                 value = totalZeros_8[bits >> 3];
    586                 break;
    587 
    588             case 9:
    589                 value = totalZeros_9[bits >> 3];
    590                 break;
    591 
    592             case 10:
    593                 value = totalZeros_10[bits >> 4];
    594                 break;
    595 
    596             case 11:
    597                 value = totalZeros_11[bits >> 5];
    598                 break;
    599 
    600             case 12:
    601                 value = totalZeros_12[bits >> 5];
    602                 break;
    603 
    604             case 13:
    605                 value = totalZeros_13[bits >> 6];
    606                 break;
    607 
    608             case 14:
    609                 value = totalZeros_14[bits >> 7];
    610                 break;
    611 
    612             default: /* case 15 */
    613                 value = (bits >> 8) ? 0x11 : 0x01;
    614                 break;
    615         }
    616     }
    617     else
    618     {
    619         ASSERT(totalCoeff < 4);
    620         bits >>= 6;
    621         if (bits > 3)
    622             value = 0x01;
    623         else
    624         {
    625             if (totalCoeff == 3)
    626                 value = 0x11;
    627             else if (bits > 1)
    628             {
    629                 value = 0x12;
    630             }
    631             else if (totalCoeff == 2)
    632                 value = 0x22;
    633             else if (bits)
    634                 value = 0x23;
    635             else
    636                 value = 0x33;
    637         }
    638     }
    639 
    640     return(value);
    641 
    642 }
    643 
    644 /*------------------------------------------------------------------------------
    645 
    646     Function: DecodeRunBefore
    647 
    648         Functional description:
    649           Function to decode run_before information field from the stream
    650 
    651         Inputs:
    652           u32 bits                  next 11 stream bits
    653           u32 zerosLeft             number of zeros left for the current block
    654 
    655         Outputs:
    656           u32  information field (4 bits value, 4 bits length)
    657 
    658 ------------------------------------------------------------------------------*/
    659 
    660 u32 DecodeRunBefore(u32 bits, u32 zerosLeft)
    661 {
    662 
    663 /* Variables */
    664 
    665     u32 value = 0x0;
    666 
    667 /* Code */
    668 
    669     switch (zerosLeft)
    670     {
    671         case 1:
    672             value = runBefore_1[bits>>10];
    673             break;
    674 
    675         case 2:
    676             value = runBefore_2[bits>>9];
    677             break;
    678 
    679         case 3:
    680             value = runBefore_3[bits>>9];
    681             break;
    682 
    683         case 4:
    684             value = runBefore_4[bits>>8];
    685             break;
    686 
    687         case 5:
    688             value = runBefore_5[bits>>8];
    689             break;
    690 
    691         case 6:
    692             value = runBefore_6[bits>>8];
    693             break;
    694 
    695         default:
    696             if (bits >= 0x100)
    697                 value = ((7-(bits>>8))<<4)+0x3;
    698             else if (bits >= 0x80)
    699                 value = 0x74;
    700             else if (bits >= 0x40)
    701                 value = 0x85;
    702             else if (bits >= 0x20)
    703                 value = 0x96;
    704             else if (bits >= 0x10)
    705                 value = 0xa7;
    706             else if (bits >= 0x8)
    707                 value = 0xb8;
    708             else if (bits >= 0x4)
    709                 value = 0xc9;
    710             else if (bits >= 0x2)
    711                 value = 0xdA;
    712             else if (bits)
    713                 value = 0xeB;
    714             if (INFO(value) > zerosLeft)
    715                 value = 0;
    716             break;
    717     }
    718 
    719     return(value);
    720 
    721 }
    722 
    723 /*------------------------------------------------------------------------------
    724 
    725     Function: DecodeResidualBlockCavlc
    726 
    727         Functional description:
    728           Function to decode one CAVLC coded block. This corresponds to
    729           syntax elements residual_block_cavlc() in the standard.
    730 
    731         Inputs:
    732           pStrmData             pointer to stream data structure
    733           nc                    nC value
    734           maxNumCoeff           maximum number of residual coefficients
    735 
    736         Outputs:
    737           coeffLevel            stores decoded coefficient levels
    738 
    739         Returns:
    740           numCoeffs             on bits [4,11] if successful
    741           coeffMap              on bits [16,31] if successful, this is bit map
    742                                 where each bit indicates if the corresponding
    743                                 coefficient was zero (0) or non-zero (1)
    744           HANTRO_NOK            end of stream or error in stream
    745 
    746 ------------------------------------------------------------------------------*/
    747 
    748 u32 h264bsdDecodeResidualBlockCavlc(
    749   strmData_t *pStrmData,
    750   i32 *coeffLevel,
    751   i32 nc,
    752   u32 maxNumCoeff)
    753 {
    754 
    755 /* Variables */
    756 
    757     u32 i, tmp, totalCoeff, trailingOnes, suffixLength, levelPrefix;
    758     u32 levelSuffix, zerosLeft, bit;
    759     i32 level[16];
    760     u32 run[16];
    761     /* stream "cache" */
    762     u32 bufferValue;
    763     u32 bufferBits;
    764 
    765 /* Code */
    766 
    767     ASSERT(pStrmData);
    768     ASSERT(coeffLevel);
    769     ASSERT(nc > -2);
    770     ASSERT(maxNumCoeff == 4 || maxNumCoeff == 15 || maxNumCoeff == 16);
    771     ASSERT(VLC_NOT_FOUND != END_OF_STREAM);
    772 
    773     /* assume that coeffLevel array has been "cleaned" by caller */
    774 
    775     BUFFER_INIT(bufferValue, bufferBits);
    776 
    777     /*lint -e774 disable lint warning on always false comparison */
    778     BUFFER_SHOW(bufferValue, bufferBits, bit, 16);
    779     /*lint +e774 */
    780     tmp = DecodeCoeffToken(bit, (u32)nc);
    781     if (!tmp)
    782         return(HANTRO_NOK);
    783     BUFFER_FLUSH(bufferValue, bufferBits, LENGTH_TC(tmp));
    784 
    785     totalCoeff = TOTAL_COEFF(tmp);
    786     if (totalCoeff > maxNumCoeff)
    787         return(HANTRO_NOK);
    788     trailingOnes = TRAILING_ONES(tmp);
    789 
    790     if (totalCoeff != 0)
    791     {
    792         i = 0;
    793         /* nonzero coefficients: +/- 1 */
    794         if (trailingOnes)
    795         {
    796             BUFFER_GET(bufferValue, bufferBits, bit, trailingOnes);
    797             tmp = 1 << (trailingOnes - 1);
    798             for (; tmp; i++)
    799             {
    800                 level[i] = bit & tmp ? -1 : 1;
    801                 tmp >>= 1;
    802             }
    803         }
    804 
    805         /* other levels */
    806         if (totalCoeff > 10 && trailingOnes < 3)
    807             suffixLength = 1;
    808         else
    809             suffixLength = 0;
    810 
    811         for (; i < totalCoeff; i++)
    812         {
    813             BUFFER_SHOW(bufferValue, bufferBits, bit, 16);
    814             levelPrefix = DecodeLevelPrefix(bit);
    815             if (levelPrefix == VLC_NOT_FOUND)
    816                 return(HANTRO_NOK);
    817             BUFFER_FLUSH(bufferValue, bufferBits, levelPrefix+1);
    818 
    819             if (levelPrefix < 14)
    820                 tmp = suffixLength;
    821             else if (levelPrefix == 14)
    822             {
    823                 tmp = suffixLength ? suffixLength : 4;
    824             }
    825             else
    826             {
    827                 /* setting suffixLength to 1 here corresponds to adding 15
    828                  * to levelCode value if levelPrefix == 15 and
    829                  * suffixLength == 0 */
    830                 if (!suffixLength)
    831                     suffixLength = 1;
    832                 tmp = 12;
    833             }
    834 
    835             if (suffixLength)
    836                 levelPrefix <<= suffixLength;
    837 
    838             if (tmp)
    839             {
    840                 BUFFER_GET(bufferValue, bufferBits, levelSuffix, tmp);
    841                 levelPrefix += levelSuffix;
    842             }
    843 
    844             tmp = levelPrefix;
    845 
    846             if (i == trailingOnes && trailingOnes < 3)
    847                 tmp += 2;
    848 
    849             level[i] = (tmp+2)>>1;
    850 
    851             if (suffixLength == 0)
    852                 suffixLength = 1;
    853 
    854             if ((level[i] > (3 << (suffixLength - 1))) && suffixLength < 6)
    855                 suffixLength++;
    856 
    857             if (tmp & 0x1)
    858                 level[i] = -level[i];
    859         }
    860 
    861         /* zero runs */
    862         if (totalCoeff < maxNumCoeff)
    863         {
    864             BUFFER_SHOW(bufferValue, bufferBits, bit,9);
    865             zerosLeft = DecodeTotalZeros(bit, totalCoeff,
    866                                         (u32)(maxNumCoeff == 4));
    867             if (!zerosLeft)
    868                 return(HANTRO_NOK);
    869             BUFFER_FLUSH(bufferValue, bufferBits, LENGTH(zerosLeft));
    870             zerosLeft = INFO(zerosLeft);
    871         }
    872         else
    873             zerosLeft = 0;
    874 
    875         for (i = 0; i < totalCoeff - 1; i++)
    876         {
    877             if (zerosLeft > 0)
    878             {
    879                 BUFFER_SHOW(bufferValue, bufferBits, bit,11);
    880                 tmp = DecodeRunBefore(bit, zerosLeft);
    881                 if (!tmp)
    882                     return(HANTRO_NOK);
    883                 BUFFER_FLUSH(bufferValue, bufferBits, LENGTH(tmp));
    884                 run[i] = INFO(tmp);
    885                 zerosLeft -= run[i]++;
    886             }
    887             else
    888             {
    889                 run[i] = 1;
    890             }
    891         }
    892 
    893         /* combining level and run, levelSuffix variable used to hold coeffMap,
    894          * i.e. bit map indicating which coefficients had non-zero value. */
    895 
    896         /*lint -esym(771,level,run) level and run are always initialized */
    897         tmp = zerosLeft;
    898         coeffLevel[tmp] = level[totalCoeff-1];
    899         levelSuffix = 1 << tmp;
    900         for (i = totalCoeff-1; i--;)
    901         {
    902             tmp += run[i];
    903             levelSuffix |= 1 << tmp;
    904             coeffLevel[tmp] = level[i];
    905         }
    906 
    907     }
    908     else
    909         levelSuffix = 0;
    910 
    911     if (h264bsdFlushBits(pStrmData, 32-bufferBits) != HANTRO_OK)
    912         return(HANTRO_NOK);
    913 
    914     return((totalCoeff << 4) | (levelSuffix << 16));
    915 }
    916 
    917