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          DecodeCoeffToken
270c1bc742181ded4930842b46e9507372f0b1b963James Dong          DecodeLevelPrefix
280c1bc742181ded4930842b46e9507372f0b1b963James Dong          DecodeTotalZeros
290c1bc742181ded4930842b46e9507372f0b1b963James Dong          DecodeRunBefore
300c1bc742181ded4930842b46e9507372f0b1b963James Dong          DecodeResidualBlockCavlc
310c1bc742181ded4930842b46e9507372f0b1b963James Dong
320c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/
330c1bc742181ded4930842b46e9507372f0b1b963James Dong
340c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------
350c1bc742181ded4930842b46e9507372f0b1b963James Dong    1. Include headers
360c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/
370c1bc742181ded4930842b46e9507372f0b1b963James Dong
380c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "h264bsd_cavlc.h"
390c1bc742181ded4930842b46e9507372f0b1b963James Dong#include "h264bsd_util.h"
400c1bc742181ded4930842b46e9507372f0b1b963James Dong
410c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------
420c1bc742181ded4930842b46e9507372f0b1b963James Dong    2. External compiler flags
430c1bc742181ded4930842b46e9507372f0b1b963James Dong--------------------------------------------------------------------------------
440c1bc742181ded4930842b46e9507372f0b1b963James Dong
450c1bc742181ded4930842b46e9507372f0b1b963James Dong--------------------------------------------------------------------------------
460c1bc742181ded4930842b46e9507372f0b1b963James Dong    3. Module defines
470c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/
480c1bc742181ded4930842b46e9507372f0b1b963James Dong
490c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Following descriptions use term "information field" to represent combination
500c1bc742181ded4930842b46e9507372f0b1b963James Dong * of certain decoded symbol value and the length of the corresponding variable
510c1bc742181ded4930842b46e9507372f0b1b963James Dong * length code word. For example, total_zeros information field consists of
520c1bc742181ded4930842b46e9507372f0b1b963James Dong * 4 bits symbol value (bits [4,7]) along with four bits to represent length
530c1bc742181ded4930842b46e9507372f0b1b963James Dong * of the VLC code word (bits [0,3]) */
540c1bc742181ded4930842b46e9507372f0b1b963James Dong
550c1bc742181ded4930842b46e9507372f0b1b963James Dong/* macro to obtain length of the coeff token information field, bits [0,4]  */
560c1bc742181ded4930842b46e9507372f0b1b963James Dong#define LENGTH_TC(vlc) ((vlc) & 0x1F)
570c1bc742181ded4930842b46e9507372f0b1b963James Dong/* macro to obtain length of the other information fields, bits [0,3] */
580c1bc742181ded4930842b46e9507372f0b1b963James Dong#define LENGTH(vlc) ((vlc) & 0xF)
590c1bc742181ded4930842b46e9507372f0b1b963James Dong/* macro to obtain code word from the information fields, bits [4,7] */
600c1bc742181ded4930842b46e9507372f0b1b963James Dong#define INFO(vlc) (((vlc) >> 4) & 0xF)  /* 4 MSB bits contain information */
610c1bc742181ded4930842b46e9507372f0b1b963James Dong/* macro to obtain trailing ones from the coeff token information word,
620c1bc742181ded4930842b46e9507372f0b1b963James Dong * bits [5,10] */
63183d387706417863076873ec566ca5966d8f5560Chih-Hung Hsieh#define TRAILING_ONES(coeffToken) (((coeffToken)>>5) & 0x3F)
640c1bc742181ded4930842b46e9507372f0b1b963James Dong/* macro to obtain total coeff from the coeff token information word,
650c1bc742181ded4930842b46e9507372f0b1b963James Dong * bits [11,15] */
660c1bc742181ded4930842b46e9507372f0b1b963James Dong#define TOTAL_COEFF(coeffToken) (((coeffToken) >> 11) & 0x1F)
670c1bc742181ded4930842b46e9507372f0b1b963James Dong
680c1bc742181ded4930842b46e9507372f0b1b963James Dong#define VLC_NOT_FOUND 0xFFFFFFFEU
690c1bc742181ded4930842b46e9507372f0b1b963James Dong
700c1bc742181ded4930842b46e9507372f0b1b963James Dong/* VLC tables for coeff_token. Because of long codes (max. 16 bits) some of the
710c1bc742181ded4930842b46e9507372f0b1b963James Dong * tables have been splitted into multiple separate tables. Each array/table
720c1bc742181ded4930842b46e9507372f0b1b963James Dong * element has the following structure:
730c1bc742181ded4930842b46e9507372f0b1b963James Dong * [5 bits for tot.coeff.] [6 bits for tr.ones] [5 bits for VLC length]
740c1bc742181ded4930842b46e9507372f0b1b963James Dong * If there is a 0x0000 value, it means that there is not corresponding VLC
750c1bc742181ded4930842b46e9507372f0b1b963James Dong * codeword for that index. */
760c1bc742181ded4930842b46e9507372f0b1b963James Dong
770c1bc742181ded4930842b46e9507372f0b1b963James Dong/* VLC lengths up to 6 bits, 0 <= nC < 2 */
780c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic const u16 coeffToken0_0[32] = {
790c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x0000,0x0000,0x0000,0x2066,0x1026,0x0806,0x1865,0x1865,
800c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x1043,0x1043,0x1043,0x1043,0x1043,0x1043,0x1043,0x1043,
810c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x0822,0x0822,0x0822,0x0822,0x0822,0x0822,0x0822,0x0822,
820c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x0822,0x0822,0x0822,0x0822,0x0822,0x0822,0x0822,0x0822};
830c1bc742181ded4930842b46e9507372f0b1b963James Dong
840c1bc742181ded4930842b46e9507372f0b1b963James Dong/* VLC lengths up to 10 bits, 0 <= nC < 2 */
850c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic const u16 coeffToken0_1[48] = {
860c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x0000,0x0000,0x0000,0x0000,0x406a,0x304a,0x282a,0x200a,
870c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x3869,0x3869,0x2849,0x2849,0x2029,0x2029,0x1809,0x1809,
880c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x3068,0x3068,0x3068,0x3068,0x2048,0x2048,0x2048,0x2048,
890c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x1828,0x1828,0x1828,0x1828,0x1008,0x1008,0x1008,0x1008,
900c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,0x2867,
910c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x1847,0x1847,0x1847,0x1847,0x1847,0x1847,0x1847,0x1847};
920c1bc742181ded4930842b46e9507372f0b1b963James Dong
930c1bc742181ded4930842b46e9507372f0b1b963James Dong/* VLC lengths up to 14 bits, 0 <= nC < 2 */
940c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic const u16 coeffToken0_2[56] = {
950c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x606e,0x584e,0x502e,0x500e,0x586e,0x504e,0x482e,0x480e,
960c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x400d,0x400d,0x484d,0x484d,0x402d,0x402d,0x380d,0x380d,
970c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x506d,0x506d,0x404d,0x404d,0x382d,0x382d,0x300d,0x300d,
980c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x486b,0x486b,0x486b,0x486b,0x486b,0x486b,0x486b,0x486b,
990c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x384b,0x384b,0x384b,0x384b,0x384b,0x384b,0x384b,0x384b,
1000c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x302b,0x302b,0x302b,0x302b,0x302b,0x302b,0x302b,0x302b,
1010c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x280b,0x280b,0x280b,0x280b,0x280b,0x280b,0x280b,0x280b};
1020c1bc742181ded4930842b46e9507372f0b1b963James Dong
1030c1bc742181ded4930842b46e9507372f0b1b963James Dong/* VLC lengths up to 16 bits, 0 <= nC < 2 */
1040c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic const u16 coeffToken0_3[32] = {
1050c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x0000,0x0000,0x682f,0x682f,0x8010,0x8050,0x8030,0x7810,
1060c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x8070,0x7850,0x7830,0x7010,0x7870,0x7050,0x7030,0x6810,
1070c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x706f,0x706f,0x684f,0x684f,0x602f,0x602f,0x600f,0x600f,
1080c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x686f,0x686f,0x604f,0x604f,0x582f,0x582f,0x580f,0x580f};
1090c1bc742181ded4930842b46e9507372f0b1b963James Dong
1100c1bc742181ded4930842b46e9507372f0b1b963James Dong/* VLC lengths up to 6 bits, 2 <= nC < 4 */
1110c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic const u16 coeffToken2_0[32] = {
1120c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x0000,0x0000,0x0000,0x0000,0x3866,0x2046,0x2026,0x1006,
1130c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x3066,0x1846,0x1826,0x0806,0x2865,0x2865,0x1025,0x1025,
1140c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x2064,0x2064,0x2064,0x2064,0x1864,0x1864,0x1864,0x1864,
1150c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x1043,0x1043,0x1043,0x1043,0x1043,0x1043,0x1043,0x1043};
1160c1bc742181ded4930842b46e9507372f0b1b963James Dong
1170c1bc742181ded4930842b46e9507372f0b1b963James Dong/* VLC lengths up to 9 bits, 2 <= nC < 4 */
1180c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic const u16 coeffToken2_1[32] = {
1190c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x0000,0x0000,0x0000,0x0000,0x4869,0x3849,0x3829,0x3009,
1200c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x2808,0x2808,0x3048,0x3048,0x3028,0x3028,0x2008,0x2008,
1210c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x4067,0x4067,0x4067,0x4067,0x2847,0x2847,0x2847,0x2847,
1220c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x2827,0x2827,0x2827,0x2827,0x1807,0x1807,0x1807,0x1807};
1230c1bc742181ded4930842b46e9507372f0b1b963James Dong
1240c1bc742181ded4930842b46e9507372f0b1b963James Dong/* VLC lengths up to 14 bits, 2 <= nC < 4 */
1250c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic const u16 coeffToken2_2[128] = {
1260c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x0000,0x0000,0x786d,0x786d,0x806e,0x804e,0x802e,0x800e,
1270c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x782e,0x780e,0x784e,0x702e,0x704d,0x704d,0x700d,0x700d,
1280c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x706d,0x706d,0x684d,0x684d,0x682d,0x682d,0x680d,0x680d,
1290c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x686d,0x686d,0x604d,0x604d,0x602d,0x602d,0x600d,0x600d,
1300c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x580c,0x580c,0x580c,0x580c,0x584c,0x584c,0x584c,0x584c,
1310c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x582c,0x582c,0x582c,0x582c,0x500c,0x500c,0x500c,0x500c,
1320c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x606c,0x606c,0x606c,0x606c,0x504c,0x504c,0x504c,0x504c,
1330c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x502c,0x502c,0x502c,0x502c,0x480c,0x480c,0x480c,0x480c,
1340c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x586b,0x586b,0x586b,0x586b,0x586b,0x586b,0x586b,0x586b,
1350c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x484b,0x484b,0x484b,0x484b,0x484b,0x484b,0x484b,0x484b,
1360c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x482b,0x482b,0x482b,0x482b,0x482b,0x482b,0x482b,0x482b,
1370c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x400b,0x400b,0x400b,0x400b,0x400b,0x400b,0x400b,0x400b,
1380c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x506b,0x506b,0x506b,0x506b,0x506b,0x506b,0x506b,0x506b,
1390c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x404b,0x404b,0x404b,0x404b,0x404b,0x404b,0x404b,0x404b,
1400c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x402b,0x402b,0x402b,0x402b,0x402b,0x402b,0x402b,0x402b,
1410c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x380b,0x380b,0x380b,0x380b,0x380b,0x380b,0x380b,0x380b};
1420c1bc742181ded4930842b46e9507372f0b1b963James Dong
1430c1bc742181ded4930842b46e9507372f0b1b963James Dong/* VLC lengths up to 6 bits, 4 <= nC < 8 */
1440c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic const u16 coeffToken4_0[64] = {
1450c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
1460c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x1806,0x3846,0x3826,0x1006,0x4866,0x3046,0x3026,0x0806,
1470c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x2825,0x2825,0x2845,0x2845,0x2025,0x2025,0x2045,0x2045,
1480c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x1825,0x1825,0x4065,0x4065,0x1845,0x1845,0x1025,0x1025,
1490c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x3864,0x3864,0x3864,0x3864,0x3064,0x3064,0x3064,0x3064,
1500c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x2864,0x2864,0x2864,0x2864,0x2064,0x2064,0x2064,0x2064,
1510c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x1864,0x1864,0x1864,0x1864,0x1044,0x1044,0x1044,0x1044,
1520c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x0824,0x0824,0x0824,0x0824,0x0004,0x0004,0x0004,0x0004};
1530c1bc742181ded4930842b46e9507372f0b1b963James Dong
1540c1bc742181ded4930842b46e9507372f0b1b963James Dong/* VLC lengths up to 10 bits, 4 <= nC < 8 */
1550c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic const u16 coeffToken4_1[128] = {
1560c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x0000,0x800a,0x806a,0x804a,0x802a,0x780a,0x786a,0x784a,
1570c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x782a,0x700a,0x706a,0x704a,0x702a,0x680a,0x6829,0x6829,
1580c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x6009,0x6009,0x6849,0x6849,0x6029,0x6029,0x5809,0x5809,
1590c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x6869,0x6869,0x6049,0x6049,0x5829,0x5829,0x5009,0x5009,
1600c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x6068,0x6068,0x6068,0x6068,0x5848,0x5848,0x5848,0x5848,
1610c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x5028,0x5028,0x5028,0x5028,0x4808,0x4808,0x4808,0x4808,
1620c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x5868,0x5868,0x5868,0x5868,0x5048,0x5048,0x5048,0x5048,
1630c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x4828,0x4828,0x4828,0x4828,0x4008,0x4008,0x4008,0x4008,
1640c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x3807,0x3807,0x3807,0x3807,0x3807,0x3807,0x3807,0x3807,
1650c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x3007,0x3007,0x3007,0x3007,0x3007,0x3007,0x3007,0x3007,
1660c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x4847,0x4847,0x4847,0x4847,0x4847,0x4847,0x4847,0x4847,
1670c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x2807,0x2807,0x2807,0x2807,0x2807,0x2807,0x2807,0x2807,
1680c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x5067,0x5067,0x5067,0x5067,0x5067,0x5067,0x5067,0x5067,
1690c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x4047,0x4047,0x4047,0x4047,0x4047,0x4047,0x4047,0x4047,
1700c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x4027,0x4027,0x4027,0x4027,0x4027,0x4027,0x4027,0x4027,
1710c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x2007,0x2007,0x2007,0x2007,0x2007,0x2007,0x2007,0x2007};
1720c1bc742181ded4930842b46e9507372f0b1b963James Dong
1730c1bc742181ded4930842b46e9507372f0b1b963James Dong/* fixed 6 bit length VLC, nC <= 8 */
1740c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic const u16 coeffToken8[64] = {
1750c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x0806,0x0826,0x0000,0x0006,0x1006,0x1026,0x1046,0x0000,
1760c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x1806,0x1826,0x1846,0x1866,0x2006,0x2026,0x2046,0x2066,
1770c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x2806,0x2826,0x2846,0x2866,0x3006,0x3026,0x3046,0x3066,
1780c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x3806,0x3826,0x3846,0x3866,0x4006,0x4026,0x4046,0x4066,
1790c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x4806,0x4826,0x4846,0x4866,0x5006,0x5026,0x5046,0x5066,
1800c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x5806,0x5826,0x5846,0x5866,0x6006,0x6026,0x6046,0x6066,
1810c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x6806,0x6826,0x6846,0x6866,0x7006,0x7026,0x7046,0x7066,
1820c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x7806,0x7826,0x7846,0x7866,0x8006,0x8026,0x8046,0x8066};
1830c1bc742181ded4930842b46e9507372f0b1b963James Dong
1840c1bc742181ded4930842b46e9507372f0b1b963James Dong/* VLC lengths up to 3 bits, nC == -1 */
1850c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic const u16 coeffTokenMinus1_0[8] = {
1860c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x0000,0x1043,0x0002,0x0002,0x0821,0x0821,0x0821,0x0821};
1870c1bc742181ded4930842b46e9507372f0b1b963James Dong
1880c1bc742181ded4930842b46e9507372f0b1b963James Dong/* VLC lengths up to 8 bits, nC == -1 */
1890c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic const u16 coeffTokenMinus1_1[32] = {
1900c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x2067,0x2067,0x2048,0x2028,0x1847,0x1847,0x1827,0x1827,
1910c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x2006,0x2006,0x2006,0x2006,0x1806,0x1806,0x1806,0x1806,
1920c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x1006,0x1006,0x1006,0x1006,0x1866,0x1866,0x1866,0x1866,
1930c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x1026,0x1026,0x1026,0x1026,0x0806,0x0806,0x0806,0x0806};
1940c1bc742181ded4930842b46e9507372f0b1b963James Dong
1950c1bc742181ded4930842b46e9507372f0b1b963James Dong/* VLC tables for total_zeros. One table containing longer code, totalZeros_1,
1960c1bc742181ded4930842b46e9507372f0b1b963James Dong * has been broken into two separate tables. Table elements have the
1970c1bc742181ded4930842b46e9507372f0b1b963James Dong * following structure:
1980c1bc742181ded4930842b46e9507372f0b1b963James Dong * [4 bits for info] [4 bits for VLC length] */
1990c1bc742181ded4930842b46e9507372f0b1b963James Dong
2000c1bc742181ded4930842b46e9507372f0b1b963James Dong/* VLC lengths up to 5 bits */
2010c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic const u8 totalZeros_1_0[32] = {
2020c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x00,0x00,0x65,0x55,0x44,0x44,0x34,0x34,
2030c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x23,0x23,0x23,0x23,0x13,0x13,0x13,0x13,
2040c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
2050c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01};
2060c1bc742181ded4930842b46e9507372f0b1b963James Dong
2070c1bc742181ded4930842b46e9507372f0b1b963James Dong/* VLC lengths up to 9 bits */
2080c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic const u8 totalZeros_1_1[32] = {
2090c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x00,0xf9,0xe9,0xd9,0xc8,0xc8,0xb8,0xb8,
2100c1bc742181ded4930842b46e9507372f0b1b963James Dong    0xa7,0xa7,0xa7,0xa7,0x97,0x97,0x97,0x97,
2110c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x86,0x86,0x86,0x86,0x86,0x86,0x86,0x86,
2120c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x76,0x76,0x76,0x76,0x76,0x76,0x76,0x76};
2130c1bc742181ded4930842b46e9507372f0b1b963James Dong
2140c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic const u8 totalZeros_2[64] = {
2150c1bc742181ded4930842b46e9507372f0b1b963James Dong    0xe6,0xd6,0xc6,0xb6,0xa5,0xa5,0x95,0x95,
2160c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x84,0x84,0x84,0x84,0x74,0x74,0x74,0x74,
2170c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x64,0x64,0x64,0x64,0x54,0x54,0x54,0x54,
2180c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43,
2190c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,
2200c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,
2210c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,
2220c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03};
2230c1bc742181ded4930842b46e9507372f0b1b963James Dong
2240c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic const u8 totalZeros_3[64] = {
2250c1bc742181ded4930842b46e9507372f0b1b963James Dong    0xd6,0xb6,0xc5,0xc5,0xa5,0xa5,0x95,0x95,
2260c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x84,0x84,0x84,0x84,0x54,0x54,0x54,0x54,
2270c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x44,0x44,0x44,0x44,0x04,0x04,0x04,0x04,
2280c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x73,0x73,0x73,0x73,0x73,0x73,0x73,0x73,
2290c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,
2300c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,
2310c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,
2320c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13};
2330c1bc742181ded4930842b46e9507372f0b1b963James Dong
2340c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic const u8 totalZeros_4[32] = {
2350c1bc742181ded4930842b46e9507372f0b1b963James Dong    0xc5,0xb5,0xa5,0x05,0x94,0x94,0x74,0x74,
2360c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x34,0x34,0x24,0x24,0x83,0x83,0x83,0x83,
2370c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x63,0x63,0x63,0x63,0x53,0x53,0x53,0x53,
2380c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x43,0x43,0x43,0x43,0x13,0x13,0x13,0x13};
2390c1bc742181ded4930842b46e9507372f0b1b963James Dong
2400c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic const u8 totalZeros_5[32] = {
2410c1bc742181ded4930842b46e9507372f0b1b963James Dong    0xb5,0x95,0xa4,0xa4,0x84,0x84,0x24,0x24,
2420c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x14,0x14,0x04,0x04,0x73,0x73,0x73,0x73,
2430c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x63,0x63,0x63,0x63,0x53,0x53,0x53,0x53,
2440c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x43,0x43,0x43,0x43,0x33,0x33,0x33,0x33};
2450c1bc742181ded4930842b46e9507372f0b1b963James Dong
2460c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic const u8 totalZeros_6[64] = {
2470c1bc742181ded4930842b46e9507372f0b1b963James Dong    0xa6,0x06,0x15,0x15,0x84,0x84,0x84,0x84,
2480c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x93,0x93,0x93,0x93,0x93,0x93,0x93,0x93,
2490c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x73,0x73,0x73,0x73,0x73,0x73,0x73,0x73,
2500c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,
2510c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x53,0x53,0x53,0x53,0x53,0x53,0x53,0x53,
2520c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43,
2530c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,
2540c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23};
2550c1bc742181ded4930842b46e9507372f0b1b963James Dong
2560c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic const u8 totalZeros_7[64] = {
2570c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x96,0x06,0x15,0x15,0x74,0x74,0x74,0x74,
2580c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x83,0x83,0x83,0x83,0x83,0x83,0x83,0x83,
2590c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,
2600c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43,
2610c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,
2620c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,
2630c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,
2640c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52};
2650c1bc742181ded4930842b46e9507372f0b1b963James Dong
2660c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic const u8 totalZeros_8[64] = {
2670c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x86,0x06,0x25,0x25,0x14,0x14,0x14,0x14,
2680c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x73,0x73,0x73,0x73,0x73,0x73,0x73,0x73,
2690c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,
2700c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,
2710c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,
2720c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,
2730c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,
2740c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42};
2750c1bc742181ded4930842b46e9507372f0b1b963James Dong
2760c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic const u8 totalZeros_9[64] = {
2770c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x16,0x06,0x75,0x75,0x24,0x24,0x24,0x24,
2780c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x53,0x53,0x53,0x53,0x53,0x53,0x53,0x53,
2790c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x62,0x62,0x62,0x62,0x62,0x62,0x62,0x62,
2800c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x62,0x62,0x62,0x62,0x62,0x62,0x62,0x62,
2810c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,
2820c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,
2830c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x32,
2840c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x32};
2850c1bc742181ded4930842b46e9507372f0b1b963James Dong
2860c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic const u8 totalZeros_10[32] = {
2870c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x15,0x05,0x64,0x64,0x23,0x23,0x23,0x23,
2880c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x52,0x52,0x52,0x52,0x52,0x52,0x52,0x52,
2890c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,
2900c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x32};
2910c1bc742181ded4930842b46e9507372f0b1b963James Dong
2920c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic const u8 totalZeros_11[16] = {
2930c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x04,0x14,0x23,0x23,0x33,0x33,0x53,0x53,
2940c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41};
2950c1bc742181ded4930842b46e9507372f0b1b963James Dong
2960c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic const u8 totalZeros_12[16] = {
2970c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x04,0x14,0x43,0x43,0x22,0x22,0x22,0x22,
2980c1bc742181ded4930842b46e9507372f0b1b963James Dong    0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31};
2990c1bc742181ded4930842b46e9507372f0b1b963James Dong
3000c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic const u8 totalZeros_13[8] = {0x03,0x13,0x32,0x32,0x21,0x21,0x21,0x21};
3010c1bc742181ded4930842b46e9507372f0b1b963James Dong
3020c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic const u8 totalZeros_14[4] = {0x02,0x12,0x21,0x21};
3030c1bc742181ded4930842b46e9507372f0b1b963James Dong
3040c1bc742181ded4930842b46e9507372f0b1b963James Dong/* VLC tables for run_before. Table elements have the following structure:
3050c1bc742181ded4930842b46e9507372f0b1b963James Dong * [4 bits for info] [4bits for VLC length]
3060c1bc742181ded4930842b46e9507372f0b1b963James Dong */
3070c1bc742181ded4930842b46e9507372f0b1b963James Dong
3080c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic const u8 runBefore_6[8] = {0x13,0x23,0x43,0x33,0x63,0x53,0x02,0x02};
3090c1bc742181ded4930842b46e9507372f0b1b963James Dong
3100c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic const u8 runBefore_5[8] = {0x53,0x43,0x33,0x23,0x12,0x12,0x02,0x02};
3110c1bc742181ded4930842b46e9507372f0b1b963James Dong
3120c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic const u8 runBefore_4[8] = {0x43,0x33,0x22,0x22,0x12,0x12,0x02,0x02};
3130c1bc742181ded4930842b46e9507372f0b1b963James Dong
3140c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic const u8 runBefore_3[4] = {0x32,0x22,0x12,0x02};
3150c1bc742181ded4930842b46e9507372f0b1b963James Dong
3160c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic const u8 runBefore_2[4] = {0x22,0x12,0x01,0x01};
3170c1bc742181ded4930842b46e9507372f0b1b963James Dong
3180c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic const u8 runBefore_1[2] = {0x11,0x01};
3190c1bc742181ded4930842b46e9507372f0b1b963James Dong
3200c1bc742181ded4930842b46e9507372f0b1b963James Dong/* following four macros are used to handle stream buffer "cache" in the CAVLC
3210c1bc742181ded4930842b46e9507372f0b1b963James Dong * decoding function */
3220c1bc742181ded4930842b46e9507372f0b1b963James Dong
3230c1bc742181ded4930842b46e9507372f0b1b963James Dong/* macro to initialize stream buffer cache, fills the buffer (32 bits) */
3240c1bc742181ded4930842b46e9507372f0b1b963James Dong#define BUFFER_INIT(value, bits) \
3250c1bc742181ded4930842b46e9507372f0b1b963James Dong{ \
326183d387706417863076873ec566ca5966d8f5560Chih-Hung Hsieh    (bits) = 32; \
327183d387706417863076873ec566ca5966d8f5560Chih-Hung Hsieh    (value) = h264bsdShowBits32(pStrmData); \
3280c1bc742181ded4930842b46e9507372f0b1b963James Dong}
3290c1bc742181ded4930842b46e9507372f0b1b963James Dong
3300c1bc742181ded4930842b46e9507372f0b1b963James Dong/* macro to read numBits bits from the buffer, bits will be written to
3310c1bc742181ded4930842b46e9507372f0b1b963James Dong * outVal. Refills the buffer if not enough bits left */
3320c1bc742181ded4930842b46e9507372f0b1b963James Dong#define BUFFER_SHOW(value, bits, outVal, numBits) \
3330c1bc742181ded4930842b46e9507372f0b1b963James Dong{ \
334183d387706417863076873ec566ca5966d8f5560Chih-Hung Hsieh    if ((bits) < (numBits)) \
3350c1bc742181ded4930842b46e9507372f0b1b963James Dong    { \
336183d387706417863076873ec566ca5966d8f5560Chih-Hung Hsieh        if(h264bsdFlushBits(pStrmData,32-(bits)) == END_OF_STREAM) \
3370c1bc742181ded4930842b46e9507372f0b1b963James Dong            return(HANTRO_NOK); \
338183d387706417863076873ec566ca5966d8f5560Chih-Hung Hsieh        (value) = h264bsdShowBits32(pStrmData); \
339183d387706417863076873ec566ca5966d8f5560Chih-Hung Hsieh        (bits) = 32; \
3400c1bc742181ded4930842b46e9507372f0b1b963James Dong    } \
341183d387706417863076873ec566ca5966d8f5560Chih-Hung Hsieh    (outVal) = (value) >> (32 - (numBits)); \
3420c1bc742181ded4930842b46e9507372f0b1b963James Dong}
3430c1bc742181ded4930842b46e9507372f0b1b963James Dong
3440c1bc742181ded4930842b46e9507372f0b1b963James Dong/* macro to flush numBits bits from the buffer */
3450c1bc742181ded4930842b46e9507372f0b1b963James Dong#define BUFFER_FLUSH(value, bits, numBits) \
3460c1bc742181ded4930842b46e9507372f0b1b963James Dong{ \
347183d387706417863076873ec566ca5966d8f5560Chih-Hung Hsieh    (value) <<= (numBits); \
348183d387706417863076873ec566ca5966d8f5560Chih-Hung Hsieh    (bits) -= (numBits); \
3490c1bc742181ded4930842b46e9507372f0b1b963James Dong}
3500c1bc742181ded4930842b46e9507372f0b1b963James Dong
3510c1bc742181ded4930842b46e9507372f0b1b963James Dong/* macro to read and flush  numBits bits from the buffer, bits will be written
3520c1bc742181ded4930842b46e9507372f0b1b963James Dong * to outVal. Refills the buffer if not enough bits left */
3530c1bc742181ded4930842b46e9507372f0b1b963James Dong#define BUFFER_GET(value, bits, outVal, numBits) \
3540c1bc742181ded4930842b46e9507372f0b1b963James Dong{ \
355183d387706417863076873ec566ca5966d8f5560Chih-Hung Hsieh    if ((bits) < (numBits)) \
3560c1bc742181ded4930842b46e9507372f0b1b963James Dong    { \
357183d387706417863076873ec566ca5966d8f5560Chih-Hung Hsieh        if(h264bsdFlushBits(pStrmData,32-(bits)) == END_OF_STREAM) \
3580c1bc742181ded4930842b46e9507372f0b1b963James Dong            return(HANTRO_NOK); \
359183d387706417863076873ec566ca5966d8f5560Chih-Hung Hsieh        (value) = h264bsdShowBits32(pStrmData); \
360183d387706417863076873ec566ca5966d8f5560Chih-Hung Hsieh        (bits) = 32; \
3610c1bc742181ded4930842b46e9507372f0b1b963James Dong    } \
362183d387706417863076873ec566ca5966d8f5560Chih-Hung Hsieh    (outVal) = (value) >> (32 - (numBits)); \
363183d387706417863076873ec566ca5966d8f5560Chih-Hung Hsieh    (value) <<= (numBits); \
364183d387706417863076873ec566ca5966d8f5560Chih-Hung Hsieh    (bits) -= (numBits); \
3650c1bc742181ded4930842b46e9507372f0b1b963James Dong}
3660c1bc742181ded4930842b46e9507372f0b1b963James Dong
3670c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------
3680c1bc742181ded4930842b46e9507372f0b1b963James Dong    4. Local function prototypes
3690c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/
3700c1bc742181ded4930842b46e9507372f0b1b963James Dong
3710c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 DecodeCoeffToken(u32 bits, u32 nc);
3720c1bc742181ded4930842b46e9507372f0b1b963James Dong
3730c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 DecodeLevelPrefix(u32 bits);
3740c1bc742181ded4930842b46e9507372f0b1b963James Dong
3750c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 DecodeTotalZeros(u32 bits, u32 totalCoeff, u32 isChromaDC);
3760c1bc742181ded4930842b46e9507372f0b1b963James Dong
3770c1bc742181ded4930842b46e9507372f0b1b963James Dongstatic u32 DecodeRunBefore(u32 bits,u32 zerosLeft);
3780c1bc742181ded4930842b46e9507372f0b1b963James Dong
3790c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------
3800c1bc742181ded4930842b46e9507372f0b1b963James Dong
3810c1bc742181ded4930842b46e9507372f0b1b963James Dong    Function: DecodeCoeffToken
3820c1bc742181ded4930842b46e9507372f0b1b963James Dong
3830c1bc742181ded4930842b46e9507372f0b1b963James Dong        Functional description:
3840c1bc742181ded4930842b46e9507372f0b1b963James Dong          Function to decode coeff_token information field from the stream.
3850c1bc742181ded4930842b46e9507372f0b1b963James Dong
3860c1bc742181ded4930842b46e9507372f0b1b963James Dong        Inputs:
3870c1bc742181ded4930842b46e9507372f0b1b963James Dong          u32 bits                  next 16 stream bits
3880c1bc742181ded4930842b46e9507372f0b1b963James Dong          u32 nc                    nC, see standard for details
3890c1bc742181ded4930842b46e9507372f0b1b963James Dong
3900c1bc742181ded4930842b46e9507372f0b1b963James Dong        Outputs:
3910c1bc742181ded4930842b46e9507372f0b1b963James Dong          u32  information field (11 bits for value, 5 bits for length)
3920c1bc742181ded4930842b46e9507372f0b1b963James Dong
3930c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/
3940c1bc742181ded4930842b46e9507372f0b1b963James Dong
3950c1bc742181ded4930842b46e9507372f0b1b963James Dongu32 DecodeCoeffToken(u32 bits, u32 nc)
3960c1bc742181ded4930842b46e9507372f0b1b963James Dong{
3970c1bc742181ded4930842b46e9507372f0b1b963James Dong
3980c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Variables */
3990c1bc742181ded4930842b46e9507372f0b1b963James Dong
4000c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 value;
4010c1bc742181ded4930842b46e9507372f0b1b963James Dong
4020c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */
4030c1bc742181ded4930842b46e9507372f0b1b963James Dong
4040c1bc742181ded4930842b46e9507372f0b1b963James Dong    /* standard defines that nc for decoding of chroma dc coefficients is -1,
4050c1bc742181ded4930842b46e9507372f0b1b963James Dong     * represented by u32 here -> -1 maps to 2^32 - 1 */
4060c1bc742181ded4930842b46e9507372f0b1b963James Dong    ASSERT(nc <= 16 || nc == (u32)(-1));
4070c1bc742181ded4930842b46e9507372f0b1b963James Dong
4080c1bc742181ded4930842b46e9507372f0b1b963James Dong    if (nc < 2)
4090c1bc742181ded4930842b46e9507372f0b1b963James Dong    {
4100c1bc742181ded4930842b46e9507372f0b1b963James Dong        if (bits >= 0x8000)
4110c1bc742181ded4930842b46e9507372f0b1b963James Dong        {
4120c1bc742181ded4930842b46e9507372f0b1b963James Dong            value = 0x0001;
4130c1bc742181ded4930842b46e9507372f0b1b963James Dong        }
4140c1bc742181ded4930842b46e9507372f0b1b963James Dong        else if (bits >= 0x0C00)
4150c1bc742181ded4930842b46e9507372f0b1b963James Dong            value = coeffToken0_0[bits >> 10];
4160c1bc742181ded4930842b46e9507372f0b1b963James Dong        else if (bits >= 0x0100)
4170c1bc742181ded4930842b46e9507372f0b1b963James Dong            value = coeffToken0_1[bits >> 6];
4180c1bc742181ded4930842b46e9507372f0b1b963James Dong        else if (bits >= 0x0020)
4190c1bc742181ded4930842b46e9507372f0b1b963James Dong            value = coeffToken0_2[(bits>>2)-8];
4200c1bc742181ded4930842b46e9507372f0b1b963James Dong        else
4210c1bc742181ded4930842b46e9507372f0b1b963James Dong            value = coeffToken0_3[bits];
4220c1bc742181ded4930842b46e9507372f0b1b963James Dong    }
4230c1bc742181ded4930842b46e9507372f0b1b963James Dong    else if (nc < 4)
4240c1bc742181ded4930842b46e9507372f0b1b963James Dong    {
4250c1bc742181ded4930842b46e9507372f0b1b963James Dong        if (bits >= 0x8000)
4260c1bc742181ded4930842b46e9507372f0b1b963James Dong        {
4270c1bc742181ded4930842b46e9507372f0b1b963James Dong            value = bits & 0x4000 ? 0x0002 : 0x0822;
4280c1bc742181ded4930842b46e9507372f0b1b963James Dong        }
4290c1bc742181ded4930842b46e9507372f0b1b963James Dong        else if (bits >= 0x1000)
4300c1bc742181ded4930842b46e9507372f0b1b963James Dong            value = coeffToken2_0[bits >> 10];
4310c1bc742181ded4930842b46e9507372f0b1b963James Dong        else if (bits >= 0x0200)
4320c1bc742181ded4930842b46e9507372f0b1b963James Dong            value = coeffToken2_1[bits >> 7];
4330c1bc742181ded4930842b46e9507372f0b1b963James Dong        else
4340c1bc742181ded4930842b46e9507372f0b1b963James Dong            value = coeffToken2_2[bits>>2];
4350c1bc742181ded4930842b46e9507372f0b1b963James Dong    }
4360c1bc742181ded4930842b46e9507372f0b1b963James Dong    else if (nc < 8)
4370c1bc742181ded4930842b46e9507372f0b1b963James Dong    {
4380c1bc742181ded4930842b46e9507372f0b1b963James Dong        value = coeffToken4_0[bits >> 10];
4390c1bc742181ded4930842b46e9507372f0b1b963James Dong        if (!value)
4400c1bc742181ded4930842b46e9507372f0b1b963James Dong            value = coeffToken4_1[bits>>6];
4410c1bc742181ded4930842b46e9507372f0b1b963James Dong    }
4420c1bc742181ded4930842b46e9507372f0b1b963James Dong    else if (nc <= 16)
4430c1bc742181ded4930842b46e9507372f0b1b963James Dong    {
4440c1bc742181ded4930842b46e9507372f0b1b963James Dong        value = coeffToken8[bits>>10];
4450c1bc742181ded4930842b46e9507372f0b1b963James Dong    }
4460c1bc742181ded4930842b46e9507372f0b1b963James Dong    else
4470c1bc742181ded4930842b46e9507372f0b1b963James Dong    {
4480c1bc742181ded4930842b46e9507372f0b1b963James Dong        value = coeffTokenMinus1_0[bits >> 13];
4490c1bc742181ded4930842b46e9507372f0b1b963James Dong        if (!value)
4500c1bc742181ded4930842b46e9507372f0b1b963James Dong            value = coeffTokenMinus1_1[bits>>8];
4510c1bc742181ded4930842b46e9507372f0b1b963James Dong    }
4520c1bc742181ded4930842b46e9507372f0b1b963James Dong
4530c1bc742181ded4930842b46e9507372f0b1b963James Dong    return(value);
4540c1bc742181ded4930842b46e9507372f0b1b963James Dong
4550c1bc742181ded4930842b46e9507372f0b1b963James Dong}
4560c1bc742181ded4930842b46e9507372f0b1b963James Dong
4570c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------
4580c1bc742181ded4930842b46e9507372f0b1b963James Dong
4590c1bc742181ded4930842b46e9507372f0b1b963James Dong    Function: DecodeLevelPrefix
4600c1bc742181ded4930842b46e9507372f0b1b963James Dong
4610c1bc742181ded4930842b46e9507372f0b1b963James Dong        Functional description:
4620c1bc742181ded4930842b46e9507372f0b1b963James Dong          Function to decode level_prefix information field from the stream
4630c1bc742181ded4930842b46e9507372f0b1b963James Dong
4640c1bc742181ded4930842b46e9507372f0b1b963James Dong        Inputs:
4650c1bc742181ded4930842b46e9507372f0b1b963James Dong          u32 bits      next 16 stream bits
4660c1bc742181ded4930842b46e9507372f0b1b963James Dong
4670c1bc742181ded4930842b46e9507372f0b1b963James Dong        Outputs:
4680c1bc742181ded4930842b46e9507372f0b1b963James Dong          u32  level_prefix information field or VLC_NOT_FOUND
4690c1bc742181ded4930842b46e9507372f0b1b963James Dong
4700c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/
4710c1bc742181ded4930842b46e9507372f0b1b963James Dong
4720c1bc742181ded4930842b46e9507372f0b1b963James Dongu32 DecodeLevelPrefix(u32 bits)
4730c1bc742181ded4930842b46e9507372f0b1b963James Dong{
4740c1bc742181ded4930842b46e9507372f0b1b963James Dong
4750c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Variables */
4760c1bc742181ded4930842b46e9507372f0b1b963James Dong
4770c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 numZeros;
4780c1bc742181ded4930842b46e9507372f0b1b963James Dong
4790c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */
4800c1bc742181ded4930842b46e9507372f0b1b963James Dong
4810c1bc742181ded4930842b46e9507372f0b1b963James Dong    if (bits >= 0x8000)
4820c1bc742181ded4930842b46e9507372f0b1b963James Dong        numZeros = 0;
4830c1bc742181ded4930842b46e9507372f0b1b963James Dong    else if (bits >= 0x4000)
4840c1bc742181ded4930842b46e9507372f0b1b963James Dong        numZeros = 1;
4850c1bc742181ded4930842b46e9507372f0b1b963James Dong    else if (bits >= 0x2000)
4860c1bc742181ded4930842b46e9507372f0b1b963James Dong        numZeros = 2;
4870c1bc742181ded4930842b46e9507372f0b1b963James Dong    else if (bits >= 0x1000)
4880c1bc742181ded4930842b46e9507372f0b1b963James Dong        numZeros = 3;
4890c1bc742181ded4930842b46e9507372f0b1b963James Dong    else if (bits >= 0x0800)
4900c1bc742181ded4930842b46e9507372f0b1b963James Dong        numZeros = 4;
4910c1bc742181ded4930842b46e9507372f0b1b963James Dong    else if (bits >= 0x0400)
4920c1bc742181ded4930842b46e9507372f0b1b963James Dong        numZeros = 5;
4930c1bc742181ded4930842b46e9507372f0b1b963James Dong    else if (bits >= 0x0200)
4940c1bc742181ded4930842b46e9507372f0b1b963James Dong        numZeros = 6;
4950c1bc742181ded4930842b46e9507372f0b1b963James Dong    else if (bits >= 0x0100)
4960c1bc742181ded4930842b46e9507372f0b1b963James Dong        numZeros = 7;
4970c1bc742181ded4930842b46e9507372f0b1b963James Dong    else if (bits >= 0x0080)
4980c1bc742181ded4930842b46e9507372f0b1b963James Dong        numZeros = 8;
4990c1bc742181ded4930842b46e9507372f0b1b963James Dong    else if (bits >= 0x0040)
5000c1bc742181ded4930842b46e9507372f0b1b963James Dong        numZeros = 9;
5010c1bc742181ded4930842b46e9507372f0b1b963James Dong    else if (bits >= 0x0020)
5020c1bc742181ded4930842b46e9507372f0b1b963James Dong        numZeros = 10;
5030c1bc742181ded4930842b46e9507372f0b1b963James Dong    else if (bits >= 0x0010)
5040c1bc742181ded4930842b46e9507372f0b1b963James Dong        numZeros = 11;
5050c1bc742181ded4930842b46e9507372f0b1b963James Dong    else if (bits >= 0x0008)
5060c1bc742181ded4930842b46e9507372f0b1b963James Dong        numZeros = 12;
5070c1bc742181ded4930842b46e9507372f0b1b963James Dong    else if (bits >= 0x0004)
5080c1bc742181ded4930842b46e9507372f0b1b963James Dong        numZeros = 13;
5090c1bc742181ded4930842b46e9507372f0b1b963James Dong    else if (bits >= 0x0002)
5100c1bc742181ded4930842b46e9507372f0b1b963James Dong        numZeros = 14;
5110c1bc742181ded4930842b46e9507372f0b1b963James Dong    else if (bits >= 0x0001)
5120c1bc742181ded4930842b46e9507372f0b1b963James Dong        numZeros = 15;
5130c1bc742181ded4930842b46e9507372f0b1b963James Dong    else /* more than 15 zeros encountered which is an error */
5140c1bc742181ded4930842b46e9507372f0b1b963James Dong        return(VLC_NOT_FOUND);
5150c1bc742181ded4930842b46e9507372f0b1b963James Dong
5160c1bc742181ded4930842b46e9507372f0b1b963James Dong    return(numZeros);
5170c1bc742181ded4930842b46e9507372f0b1b963James Dong
5180c1bc742181ded4930842b46e9507372f0b1b963James Dong}
5190c1bc742181ded4930842b46e9507372f0b1b963James Dong
5200c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------
5210c1bc742181ded4930842b46e9507372f0b1b963James Dong
5220c1bc742181ded4930842b46e9507372f0b1b963James Dong    Function: DecodeTotalZeros
5230c1bc742181ded4930842b46e9507372f0b1b963James Dong
5240c1bc742181ded4930842b46e9507372f0b1b963James Dong        Functional description:
5250c1bc742181ded4930842b46e9507372f0b1b963James Dong          Function to decode total_zeros information field from the stream
5260c1bc742181ded4930842b46e9507372f0b1b963James Dong
5270c1bc742181ded4930842b46e9507372f0b1b963James Dong        Inputs:
5280c1bc742181ded4930842b46e9507372f0b1b963James Dong          u32 bits                  next 9 stream bits
5290c1bc742181ded4930842b46e9507372f0b1b963James Dong          u32 totalCoeff            total number of coefficients for the block
5300c1bc742181ded4930842b46e9507372f0b1b963James Dong                                    being decoded
5310c1bc742181ded4930842b46e9507372f0b1b963James Dong          u32 isChromaDC           flag to indicate chroma DC block
5320c1bc742181ded4930842b46e9507372f0b1b963James Dong
5330c1bc742181ded4930842b46e9507372f0b1b963James Dong        Outputs:
5340c1bc742181ded4930842b46e9507372f0b1b963James Dong          u32  information field (4 bits value, 4 bits length)
5350c1bc742181ded4930842b46e9507372f0b1b963James Dong
5360c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/
5370c1bc742181ded4930842b46e9507372f0b1b963James Dong
5380c1bc742181ded4930842b46e9507372f0b1b963James Dongu32 DecodeTotalZeros(u32 bits, u32 totalCoeff, u32 isChromaDC)
5390c1bc742181ded4930842b46e9507372f0b1b963James Dong{
5400c1bc742181ded4930842b46e9507372f0b1b963James Dong
5410c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Variables */
5420c1bc742181ded4930842b46e9507372f0b1b963James Dong
5430c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 value = 0x0;
5440c1bc742181ded4930842b46e9507372f0b1b963James Dong
5450c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */
5460c1bc742181ded4930842b46e9507372f0b1b963James Dong
5470c1bc742181ded4930842b46e9507372f0b1b963James Dong    ASSERT(totalCoeff);
5480c1bc742181ded4930842b46e9507372f0b1b963James Dong
5490c1bc742181ded4930842b46e9507372f0b1b963James Dong    if (!isChromaDC)
5500c1bc742181ded4930842b46e9507372f0b1b963James Dong    {
5510c1bc742181ded4930842b46e9507372f0b1b963James Dong        ASSERT(totalCoeff < 16);
5520c1bc742181ded4930842b46e9507372f0b1b963James Dong        switch (totalCoeff)
5530c1bc742181ded4930842b46e9507372f0b1b963James Dong        {
5540c1bc742181ded4930842b46e9507372f0b1b963James Dong            case 1:
5550c1bc742181ded4930842b46e9507372f0b1b963James Dong                value = totalZeros_1_0[bits >> 4];
5560c1bc742181ded4930842b46e9507372f0b1b963James Dong                if (!value)
5570c1bc742181ded4930842b46e9507372f0b1b963James Dong                    value = totalZeros_1_1[bits];
5580c1bc742181ded4930842b46e9507372f0b1b963James Dong                break;
5590c1bc742181ded4930842b46e9507372f0b1b963James Dong
5600c1bc742181ded4930842b46e9507372f0b1b963James Dong            case 2:
5610c1bc742181ded4930842b46e9507372f0b1b963James Dong                value = totalZeros_2[bits >> 3];
5620c1bc742181ded4930842b46e9507372f0b1b963James Dong                break;
5630c1bc742181ded4930842b46e9507372f0b1b963James Dong
5640c1bc742181ded4930842b46e9507372f0b1b963James Dong            case 3:
5650c1bc742181ded4930842b46e9507372f0b1b963James Dong                value = totalZeros_3[bits >> 3];
5660c1bc742181ded4930842b46e9507372f0b1b963James Dong                break;
5670c1bc742181ded4930842b46e9507372f0b1b963James Dong
5680c1bc742181ded4930842b46e9507372f0b1b963James Dong            case 4:
5690c1bc742181ded4930842b46e9507372f0b1b963James Dong                value = totalZeros_4[bits >> 4];
5700c1bc742181ded4930842b46e9507372f0b1b963James Dong                break;
5710c1bc742181ded4930842b46e9507372f0b1b963James Dong
5720c1bc742181ded4930842b46e9507372f0b1b963James Dong            case 5:
5730c1bc742181ded4930842b46e9507372f0b1b963James Dong                value = totalZeros_5[bits >> 4];
5740c1bc742181ded4930842b46e9507372f0b1b963James Dong                break;
5750c1bc742181ded4930842b46e9507372f0b1b963James Dong
5760c1bc742181ded4930842b46e9507372f0b1b963James Dong            case 6:
5770c1bc742181ded4930842b46e9507372f0b1b963James Dong                value = totalZeros_6[bits >> 3];
5780c1bc742181ded4930842b46e9507372f0b1b963James Dong                break;
5790c1bc742181ded4930842b46e9507372f0b1b963James Dong
5800c1bc742181ded4930842b46e9507372f0b1b963James Dong            case 7:
5810c1bc742181ded4930842b46e9507372f0b1b963James Dong                value = totalZeros_7[bits >> 3];
5820c1bc742181ded4930842b46e9507372f0b1b963James Dong                break;
5830c1bc742181ded4930842b46e9507372f0b1b963James Dong
5840c1bc742181ded4930842b46e9507372f0b1b963James Dong            case 8:
5850c1bc742181ded4930842b46e9507372f0b1b963James Dong                value = totalZeros_8[bits >> 3];
5860c1bc742181ded4930842b46e9507372f0b1b963James Dong                break;
5870c1bc742181ded4930842b46e9507372f0b1b963James Dong
5880c1bc742181ded4930842b46e9507372f0b1b963James Dong            case 9:
5890c1bc742181ded4930842b46e9507372f0b1b963James Dong                value = totalZeros_9[bits >> 3];
5900c1bc742181ded4930842b46e9507372f0b1b963James Dong                break;
5910c1bc742181ded4930842b46e9507372f0b1b963James Dong
5920c1bc742181ded4930842b46e9507372f0b1b963James Dong            case 10:
5930c1bc742181ded4930842b46e9507372f0b1b963James Dong                value = totalZeros_10[bits >> 4];
5940c1bc742181ded4930842b46e9507372f0b1b963James Dong                break;
5950c1bc742181ded4930842b46e9507372f0b1b963James Dong
5960c1bc742181ded4930842b46e9507372f0b1b963James Dong            case 11:
5970c1bc742181ded4930842b46e9507372f0b1b963James Dong                value = totalZeros_11[bits >> 5];
5980c1bc742181ded4930842b46e9507372f0b1b963James Dong                break;
5990c1bc742181ded4930842b46e9507372f0b1b963James Dong
6000c1bc742181ded4930842b46e9507372f0b1b963James Dong            case 12:
6010c1bc742181ded4930842b46e9507372f0b1b963James Dong                value = totalZeros_12[bits >> 5];
6020c1bc742181ded4930842b46e9507372f0b1b963James Dong                break;
6030c1bc742181ded4930842b46e9507372f0b1b963James Dong
6040c1bc742181ded4930842b46e9507372f0b1b963James Dong            case 13:
6050c1bc742181ded4930842b46e9507372f0b1b963James Dong                value = totalZeros_13[bits >> 6];
6060c1bc742181ded4930842b46e9507372f0b1b963James Dong                break;
6070c1bc742181ded4930842b46e9507372f0b1b963James Dong
6080c1bc742181ded4930842b46e9507372f0b1b963James Dong            case 14:
6090c1bc742181ded4930842b46e9507372f0b1b963James Dong                value = totalZeros_14[bits >> 7];
6100c1bc742181ded4930842b46e9507372f0b1b963James Dong                break;
6110c1bc742181ded4930842b46e9507372f0b1b963James Dong
6120c1bc742181ded4930842b46e9507372f0b1b963James Dong            default: /* case 15 */
6130c1bc742181ded4930842b46e9507372f0b1b963James Dong                value = (bits >> 8) ? 0x11 : 0x01;
6140c1bc742181ded4930842b46e9507372f0b1b963James Dong                break;
6150c1bc742181ded4930842b46e9507372f0b1b963James Dong        }
6160c1bc742181ded4930842b46e9507372f0b1b963James Dong    }
6170c1bc742181ded4930842b46e9507372f0b1b963James Dong    else
6180c1bc742181ded4930842b46e9507372f0b1b963James Dong    {
6190c1bc742181ded4930842b46e9507372f0b1b963James Dong        ASSERT(totalCoeff < 4);
6200c1bc742181ded4930842b46e9507372f0b1b963James Dong        bits >>= 6;
6210c1bc742181ded4930842b46e9507372f0b1b963James Dong        if (bits > 3)
6220c1bc742181ded4930842b46e9507372f0b1b963James Dong            value = 0x01;
6230c1bc742181ded4930842b46e9507372f0b1b963James Dong        else
6240c1bc742181ded4930842b46e9507372f0b1b963James Dong        {
6250c1bc742181ded4930842b46e9507372f0b1b963James Dong            if (totalCoeff == 3)
6260c1bc742181ded4930842b46e9507372f0b1b963James Dong                value = 0x11;
6270c1bc742181ded4930842b46e9507372f0b1b963James Dong            else if (bits > 1)
6280c1bc742181ded4930842b46e9507372f0b1b963James Dong            {
6290c1bc742181ded4930842b46e9507372f0b1b963James Dong                value = 0x12;
6300c1bc742181ded4930842b46e9507372f0b1b963James Dong            }
6310c1bc742181ded4930842b46e9507372f0b1b963James Dong            else if (totalCoeff == 2)
6320c1bc742181ded4930842b46e9507372f0b1b963James Dong                value = 0x22;
6330c1bc742181ded4930842b46e9507372f0b1b963James Dong            else if (bits)
6340c1bc742181ded4930842b46e9507372f0b1b963James Dong                value = 0x23;
6350c1bc742181ded4930842b46e9507372f0b1b963James Dong            else
6360c1bc742181ded4930842b46e9507372f0b1b963James Dong                value = 0x33;
6370c1bc742181ded4930842b46e9507372f0b1b963James Dong        }
6380c1bc742181ded4930842b46e9507372f0b1b963James Dong    }
6390c1bc742181ded4930842b46e9507372f0b1b963James Dong
6400c1bc742181ded4930842b46e9507372f0b1b963James Dong    return(value);
6410c1bc742181ded4930842b46e9507372f0b1b963James Dong
6420c1bc742181ded4930842b46e9507372f0b1b963James Dong}
6430c1bc742181ded4930842b46e9507372f0b1b963James Dong
6440c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------
6450c1bc742181ded4930842b46e9507372f0b1b963James Dong
6460c1bc742181ded4930842b46e9507372f0b1b963James Dong    Function: DecodeRunBefore
6470c1bc742181ded4930842b46e9507372f0b1b963James Dong
6480c1bc742181ded4930842b46e9507372f0b1b963James Dong        Functional description:
6490c1bc742181ded4930842b46e9507372f0b1b963James Dong          Function to decode run_before information field from the stream
6500c1bc742181ded4930842b46e9507372f0b1b963James Dong
6510c1bc742181ded4930842b46e9507372f0b1b963James Dong        Inputs:
6520c1bc742181ded4930842b46e9507372f0b1b963James Dong          u32 bits                  next 11 stream bits
6530c1bc742181ded4930842b46e9507372f0b1b963James Dong          u32 zerosLeft             number of zeros left for the current block
6540c1bc742181ded4930842b46e9507372f0b1b963James Dong
6550c1bc742181ded4930842b46e9507372f0b1b963James Dong        Outputs:
6560c1bc742181ded4930842b46e9507372f0b1b963James Dong          u32  information field (4 bits value, 4 bits length)
6570c1bc742181ded4930842b46e9507372f0b1b963James Dong
6580c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/
6590c1bc742181ded4930842b46e9507372f0b1b963James Dong
6600c1bc742181ded4930842b46e9507372f0b1b963James Dongu32 DecodeRunBefore(u32 bits, u32 zerosLeft)
6610c1bc742181ded4930842b46e9507372f0b1b963James Dong{
6620c1bc742181ded4930842b46e9507372f0b1b963James Dong
6630c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Variables */
6640c1bc742181ded4930842b46e9507372f0b1b963James Dong
6650c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 value = 0x0;
6660c1bc742181ded4930842b46e9507372f0b1b963James Dong
6670c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */
6680c1bc742181ded4930842b46e9507372f0b1b963James Dong
6690c1bc742181ded4930842b46e9507372f0b1b963James Dong    switch (zerosLeft)
6700c1bc742181ded4930842b46e9507372f0b1b963James Dong    {
6710c1bc742181ded4930842b46e9507372f0b1b963James Dong        case 1:
6720c1bc742181ded4930842b46e9507372f0b1b963James Dong            value = runBefore_1[bits>>10];
6730c1bc742181ded4930842b46e9507372f0b1b963James Dong            break;
6740c1bc742181ded4930842b46e9507372f0b1b963James Dong
6750c1bc742181ded4930842b46e9507372f0b1b963James Dong        case 2:
6760c1bc742181ded4930842b46e9507372f0b1b963James Dong            value = runBefore_2[bits>>9];
6770c1bc742181ded4930842b46e9507372f0b1b963James Dong            break;
6780c1bc742181ded4930842b46e9507372f0b1b963James Dong
6790c1bc742181ded4930842b46e9507372f0b1b963James Dong        case 3:
6800c1bc742181ded4930842b46e9507372f0b1b963James Dong            value = runBefore_3[bits>>9];
6810c1bc742181ded4930842b46e9507372f0b1b963James Dong            break;
6820c1bc742181ded4930842b46e9507372f0b1b963James Dong
6830c1bc742181ded4930842b46e9507372f0b1b963James Dong        case 4:
6840c1bc742181ded4930842b46e9507372f0b1b963James Dong            value = runBefore_4[bits>>8];
6850c1bc742181ded4930842b46e9507372f0b1b963James Dong            break;
6860c1bc742181ded4930842b46e9507372f0b1b963James Dong
6870c1bc742181ded4930842b46e9507372f0b1b963James Dong        case 5:
6880c1bc742181ded4930842b46e9507372f0b1b963James Dong            value = runBefore_5[bits>>8];
6890c1bc742181ded4930842b46e9507372f0b1b963James Dong            break;
6900c1bc742181ded4930842b46e9507372f0b1b963James Dong
6910c1bc742181ded4930842b46e9507372f0b1b963James Dong        case 6:
6920c1bc742181ded4930842b46e9507372f0b1b963James Dong            value = runBefore_6[bits>>8];
6930c1bc742181ded4930842b46e9507372f0b1b963James Dong            break;
6940c1bc742181ded4930842b46e9507372f0b1b963James Dong
6950c1bc742181ded4930842b46e9507372f0b1b963James Dong        default:
6960c1bc742181ded4930842b46e9507372f0b1b963James Dong            if (bits >= 0x100)
6970c1bc742181ded4930842b46e9507372f0b1b963James Dong                value = ((7-(bits>>8))<<4)+0x3;
6980c1bc742181ded4930842b46e9507372f0b1b963James Dong            else if (bits >= 0x80)
6990c1bc742181ded4930842b46e9507372f0b1b963James Dong                value = 0x74;
7000c1bc742181ded4930842b46e9507372f0b1b963James Dong            else if (bits >= 0x40)
7010c1bc742181ded4930842b46e9507372f0b1b963James Dong                value = 0x85;
7020c1bc742181ded4930842b46e9507372f0b1b963James Dong            else if (bits >= 0x20)
7030c1bc742181ded4930842b46e9507372f0b1b963James Dong                value = 0x96;
7040c1bc742181ded4930842b46e9507372f0b1b963James Dong            else if (bits >= 0x10)
7050c1bc742181ded4930842b46e9507372f0b1b963James Dong                value = 0xa7;
7060c1bc742181ded4930842b46e9507372f0b1b963James Dong            else if (bits >= 0x8)
7070c1bc742181ded4930842b46e9507372f0b1b963James Dong                value = 0xb8;
7080c1bc742181ded4930842b46e9507372f0b1b963James Dong            else if (bits >= 0x4)
7090c1bc742181ded4930842b46e9507372f0b1b963James Dong                value = 0xc9;
7100c1bc742181ded4930842b46e9507372f0b1b963James Dong            else if (bits >= 0x2)
7110c1bc742181ded4930842b46e9507372f0b1b963James Dong                value = 0xdA;
7120c1bc742181ded4930842b46e9507372f0b1b963James Dong            else if (bits)
7130c1bc742181ded4930842b46e9507372f0b1b963James Dong                value = 0xeB;
7140c1bc742181ded4930842b46e9507372f0b1b963James Dong            if (INFO(value) > zerosLeft)
7150c1bc742181ded4930842b46e9507372f0b1b963James Dong                value = 0;
7160c1bc742181ded4930842b46e9507372f0b1b963James Dong            break;
7170c1bc742181ded4930842b46e9507372f0b1b963James Dong    }
7180c1bc742181ded4930842b46e9507372f0b1b963James Dong
7190c1bc742181ded4930842b46e9507372f0b1b963James Dong    return(value);
7200c1bc742181ded4930842b46e9507372f0b1b963James Dong
7210c1bc742181ded4930842b46e9507372f0b1b963James Dong}
7220c1bc742181ded4930842b46e9507372f0b1b963James Dong
7230c1bc742181ded4930842b46e9507372f0b1b963James Dong/*------------------------------------------------------------------------------
7240c1bc742181ded4930842b46e9507372f0b1b963James Dong
7250c1bc742181ded4930842b46e9507372f0b1b963James Dong    Function: DecodeResidualBlockCavlc
7260c1bc742181ded4930842b46e9507372f0b1b963James Dong
7270c1bc742181ded4930842b46e9507372f0b1b963James Dong        Functional description:
7280c1bc742181ded4930842b46e9507372f0b1b963James Dong          Function to decode one CAVLC coded block. This corresponds to
7290c1bc742181ded4930842b46e9507372f0b1b963James Dong          syntax elements residual_block_cavlc() in the standard.
7300c1bc742181ded4930842b46e9507372f0b1b963James Dong
7310c1bc742181ded4930842b46e9507372f0b1b963James Dong        Inputs:
7320c1bc742181ded4930842b46e9507372f0b1b963James Dong          pStrmData             pointer to stream data structure
7330c1bc742181ded4930842b46e9507372f0b1b963James Dong          nc                    nC value
7340c1bc742181ded4930842b46e9507372f0b1b963James Dong          maxNumCoeff           maximum number of residual coefficients
7350c1bc742181ded4930842b46e9507372f0b1b963James Dong
7360c1bc742181ded4930842b46e9507372f0b1b963James Dong        Outputs:
7370c1bc742181ded4930842b46e9507372f0b1b963James Dong          coeffLevel            stores decoded coefficient levels
7380c1bc742181ded4930842b46e9507372f0b1b963James Dong
7390c1bc742181ded4930842b46e9507372f0b1b963James Dong        Returns:
7400c1bc742181ded4930842b46e9507372f0b1b963James Dong          numCoeffs             on bits [4,11] if successful
7410c1bc742181ded4930842b46e9507372f0b1b963James Dong          coeffMap              on bits [16,31] if successful, this is bit map
7420c1bc742181ded4930842b46e9507372f0b1b963James Dong                                where each bit indicates if the corresponding
7430c1bc742181ded4930842b46e9507372f0b1b963James Dong                                coefficient was zero (0) or non-zero (1)
7440c1bc742181ded4930842b46e9507372f0b1b963James Dong          HANTRO_NOK            end of stream or error in stream
7450c1bc742181ded4930842b46e9507372f0b1b963James Dong
7460c1bc742181ded4930842b46e9507372f0b1b963James Dong------------------------------------------------------------------------------*/
7470c1bc742181ded4930842b46e9507372f0b1b963James Dong
7480c1bc742181ded4930842b46e9507372f0b1b963James Dongu32 h264bsdDecodeResidualBlockCavlc(
7490c1bc742181ded4930842b46e9507372f0b1b963James Dong  strmData_t *pStrmData,
7500c1bc742181ded4930842b46e9507372f0b1b963James Dong  i32 *coeffLevel,
7510c1bc742181ded4930842b46e9507372f0b1b963James Dong  i32 nc,
7520c1bc742181ded4930842b46e9507372f0b1b963James Dong  u32 maxNumCoeff)
7530c1bc742181ded4930842b46e9507372f0b1b963James Dong{
7540c1bc742181ded4930842b46e9507372f0b1b963James Dong
7550c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Variables */
7560c1bc742181ded4930842b46e9507372f0b1b963James Dong
7570c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 i, tmp, totalCoeff, trailingOnes, suffixLength, levelPrefix;
7580c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 levelSuffix, zerosLeft, bit;
7590c1bc742181ded4930842b46e9507372f0b1b963James Dong    i32 level[16];
7600c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 run[16];
7610c1bc742181ded4930842b46e9507372f0b1b963James Dong    /* stream "cache" */
7620c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 bufferValue;
7630c1bc742181ded4930842b46e9507372f0b1b963James Dong    u32 bufferBits;
7640c1bc742181ded4930842b46e9507372f0b1b963James Dong
7650c1bc742181ded4930842b46e9507372f0b1b963James Dong/* Code */
7660c1bc742181ded4930842b46e9507372f0b1b963James Dong
7670c1bc742181ded4930842b46e9507372f0b1b963James Dong    ASSERT(pStrmData);
7680c1bc742181ded4930842b46e9507372f0b1b963James Dong    ASSERT(coeffLevel);
7690c1bc742181ded4930842b46e9507372f0b1b963James Dong    ASSERT(nc > -2);
7700c1bc742181ded4930842b46e9507372f0b1b963James Dong    ASSERT(maxNumCoeff == 4 || maxNumCoeff == 15 || maxNumCoeff == 16);
7710c1bc742181ded4930842b46e9507372f0b1b963James Dong    ASSERT(VLC_NOT_FOUND != END_OF_STREAM);
7720c1bc742181ded4930842b46e9507372f0b1b963James Dong
7730c1bc742181ded4930842b46e9507372f0b1b963James Dong    /* assume that coeffLevel array has been "cleaned" by caller */
7740c1bc742181ded4930842b46e9507372f0b1b963James Dong
7750c1bc742181ded4930842b46e9507372f0b1b963James Dong    BUFFER_INIT(bufferValue, bufferBits);
7760c1bc742181ded4930842b46e9507372f0b1b963James Dong
7770c1bc742181ded4930842b46e9507372f0b1b963James Dong    /*lint -e774 disable lint warning on always false comparison */
7780c1bc742181ded4930842b46e9507372f0b1b963James Dong    BUFFER_SHOW(bufferValue, bufferBits, bit, 16);
7790c1bc742181ded4930842b46e9507372f0b1b963James Dong    /*lint +e774 */
7800c1bc742181ded4930842b46e9507372f0b1b963James Dong    tmp = DecodeCoeffToken(bit, (u32)nc);
7810c1bc742181ded4930842b46e9507372f0b1b963James Dong    if (!tmp)
7820c1bc742181ded4930842b46e9507372f0b1b963James Dong        return(HANTRO_NOK);
7830c1bc742181ded4930842b46e9507372f0b1b963James Dong    BUFFER_FLUSH(bufferValue, bufferBits, LENGTH_TC(tmp));
7840c1bc742181ded4930842b46e9507372f0b1b963James Dong
7850c1bc742181ded4930842b46e9507372f0b1b963James Dong    totalCoeff = TOTAL_COEFF(tmp);
7860c1bc742181ded4930842b46e9507372f0b1b963James Dong    if (totalCoeff > maxNumCoeff)
7870c1bc742181ded4930842b46e9507372f0b1b963James Dong        return(HANTRO_NOK);
7880c1bc742181ded4930842b46e9507372f0b1b963James Dong    trailingOnes = TRAILING_ONES(tmp);
7890c1bc742181ded4930842b46e9507372f0b1b963James Dong
7900c1bc742181ded4930842b46e9507372f0b1b963James Dong    if (totalCoeff != 0)
7910c1bc742181ded4930842b46e9507372f0b1b963James Dong    {
7920c1bc742181ded4930842b46e9507372f0b1b963James Dong        i = 0;
7930c1bc742181ded4930842b46e9507372f0b1b963James Dong        /* nonzero coefficients: +/- 1 */
7940c1bc742181ded4930842b46e9507372f0b1b963James Dong        if (trailingOnes)
7950c1bc742181ded4930842b46e9507372f0b1b963James Dong        {
7960c1bc742181ded4930842b46e9507372f0b1b963James Dong            BUFFER_GET(bufferValue, bufferBits, bit, trailingOnes);
7970c1bc742181ded4930842b46e9507372f0b1b963James Dong            tmp = 1 << (trailingOnes - 1);
7980c1bc742181ded4930842b46e9507372f0b1b963James Dong            for (; tmp; i++)
7990c1bc742181ded4930842b46e9507372f0b1b963James Dong            {
8000c1bc742181ded4930842b46e9507372f0b1b963James Dong                level[i] = bit & tmp ? -1 : 1;
8010c1bc742181ded4930842b46e9507372f0b1b963James Dong                tmp >>= 1;
8020c1bc742181ded4930842b46e9507372f0b1b963James Dong            }
8030c1bc742181ded4930842b46e9507372f0b1b963James Dong        }
8040c1bc742181ded4930842b46e9507372f0b1b963James Dong
8050c1bc742181ded4930842b46e9507372f0b1b963James Dong        /* other levels */
8060c1bc742181ded4930842b46e9507372f0b1b963James Dong        if (totalCoeff > 10 && trailingOnes < 3)
8070c1bc742181ded4930842b46e9507372f0b1b963James Dong            suffixLength = 1;
8080c1bc742181ded4930842b46e9507372f0b1b963James Dong        else
8090c1bc742181ded4930842b46e9507372f0b1b963James Dong            suffixLength = 0;
8100c1bc742181ded4930842b46e9507372f0b1b963James Dong
8110c1bc742181ded4930842b46e9507372f0b1b963James Dong        for (; i < totalCoeff; i++)
8120c1bc742181ded4930842b46e9507372f0b1b963James Dong        {
8130c1bc742181ded4930842b46e9507372f0b1b963James Dong            BUFFER_SHOW(bufferValue, bufferBits, bit, 16);
8140c1bc742181ded4930842b46e9507372f0b1b963James Dong            levelPrefix = DecodeLevelPrefix(bit);
8150c1bc742181ded4930842b46e9507372f0b1b963James Dong            if (levelPrefix == VLC_NOT_FOUND)
8160c1bc742181ded4930842b46e9507372f0b1b963James Dong                return(HANTRO_NOK);
8170c1bc742181ded4930842b46e9507372f0b1b963James Dong            BUFFER_FLUSH(bufferValue, bufferBits, levelPrefix+1);
8180c1bc742181ded4930842b46e9507372f0b1b963James Dong
8190c1bc742181ded4930842b46e9507372f0b1b963James Dong            if (levelPrefix < 14)
8200c1bc742181ded4930842b46e9507372f0b1b963James Dong                tmp = suffixLength;
8210c1bc742181ded4930842b46e9507372f0b1b963James Dong            else if (levelPrefix == 14)
8220c1bc742181ded4930842b46e9507372f0b1b963James Dong            {
8230c1bc742181ded4930842b46e9507372f0b1b963James Dong                tmp = suffixLength ? suffixLength : 4;
8240c1bc742181ded4930842b46e9507372f0b1b963James Dong            }
8250c1bc742181ded4930842b46e9507372f0b1b963James Dong            else
8260c1bc742181ded4930842b46e9507372f0b1b963James Dong            {
8270c1bc742181ded4930842b46e9507372f0b1b963James Dong                /* setting suffixLength to 1 here corresponds to adding 15
8280c1bc742181ded4930842b46e9507372f0b1b963James Dong                 * to levelCode value if levelPrefix == 15 and
8290c1bc742181ded4930842b46e9507372f0b1b963James Dong                 * suffixLength == 0 */
8300c1bc742181ded4930842b46e9507372f0b1b963James Dong                if (!suffixLength)
8310c1bc742181ded4930842b46e9507372f0b1b963James Dong                    suffixLength = 1;
8320c1bc742181ded4930842b46e9507372f0b1b963James Dong                tmp = 12;
8330c1bc742181ded4930842b46e9507372f0b1b963James Dong            }
8340c1bc742181ded4930842b46e9507372f0b1b963James Dong
8350c1bc742181ded4930842b46e9507372f0b1b963James Dong            if (suffixLength)
8360c1bc742181ded4930842b46e9507372f0b1b963James Dong                levelPrefix <<= suffixLength;
8370c1bc742181ded4930842b46e9507372f0b1b963James Dong
8380c1bc742181ded4930842b46e9507372f0b1b963James Dong            if (tmp)
8390c1bc742181ded4930842b46e9507372f0b1b963James Dong            {
8400c1bc742181ded4930842b46e9507372f0b1b963James Dong                BUFFER_GET(bufferValue, bufferBits, levelSuffix, tmp);
8410c1bc742181ded4930842b46e9507372f0b1b963James Dong                levelPrefix += levelSuffix;
8420c1bc742181ded4930842b46e9507372f0b1b963James Dong            }
8430c1bc742181ded4930842b46e9507372f0b1b963James Dong
8440c1bc742181ded4930842b46e9507372f0b1b963James Dong            tmp = levelPrefix;
8450c1bc742181ded4930842b46e9507372f0b1b963James Dong
8460c1bc742181ded4930842b46e9507372f0b1b963James Dong            if (i == trailingOnes && trailingOnes < 3)
8470c1bc742181ded4930842b46e9507372f0b1b963James Dong                tmp += 2;
8480c1bc742181ded4930842b46e9507372f0b1b963James Dong
8490c1bc742181ded4930842b46e9507372f0b1b963James Dong            level[i] = (tmp+2)>>1;
8500c1bc742181ded4930842b46e9507372f0b1b963James Dong
8510c1bc742181ded4930842b46e9507372f0b1b963James Dong            if (suffixLength == 0)
8520c1bc742181ded4930842b46e9507372f0b1b963James Dong                suffixLength = 1;
8530c1bc742181ded4930842b46e9507372f0b1b963James Dong
8540c1bc742181ded4930842b46e9507372f0b1b963James Dong            if ((level[i] > (3 << (suffixLength - 1))) && suffixLength < 6)
8550c1bc742181ded4930842b46e9507372f0b1b963James Dong                suffixLength++;
8560c1bc742181ded4930842b46e9507372f0b1b963James Dong
8570c1bc742181ded4930842b46e9507372f0b1b963James Dong            if (tmp & 0x1)
8580c1bc742181ded4930842b46e9507372f0b1b963James Dong                level[i] = -level[i];
8590c1bc742181ded4930842b46e9507372f0b1b963James Dong        }
8600c1bc742181ded4930842b46e9507372f0b1b963James Dong
8610c1bc742181ded4930842b46e9507372f0b1b963James Dong        /* zero runs */
8620c1bc742181ded4930842b46e9507372f0b1b963James Dong        if (totalCoeff < maxNumCoeff)
8630c1bc742181ded4930842b46e9507372f0b1b963James Dong        {
8640c1bc742181ded4930842b46e9507372f0b1b963James Dong            BUFFER_SHOW(bufferValue, bufferBits, bit,9);
8650c1bc742181ded4930842b46e9507372f0b1b963James Dong            zerosLeft = DecodeTotalZeros(bit, totalCoeff,
8660c1bc742181ded4930842b46e9507372f0b1b963James Dong                                        (u32)(maxNumCoeff == 4));
8670c1bc742181ded4930842b46e9507372f0b1b963James Dong            if (!zerosLeft)
8680c1bc742181ded4930842b46e9507372f0b1b963James Dong                return(HANTRO_NOK);
8690c1bc742181ded4930842b46e9507372f0b1b963James Dong            BUFFER_FLUSH(bufferValue, bufferBits, LENGTH(zerosLeft));
8700c1bc742181ded4930842b46e9507372f0b1b963James Dong            zerosLeft = INFO(zerosLeft);
8710c1bc742181ded4930842b46e9507372f0b1b963James Dong        }
8720c1bc742181ded4930842b46e9507372f0b1b963James Dong        else
8730c1bc742181ded4930842b46e9507372f0b1b963James Dong            zerosLeft = 0;
8740c1bc742181ded4930842b46e9507372f0b1b963James Dong
8750c1bc742181ded4930842b46e9507372f0b1b963James Dong        for (i = 0; i < totalCoeff - 1; i++)
8760c1bc742181ded4930842b46e9507372f0b1b963James Dong        {
8770c1bc742181ded4930842b46e9507372f0b1b963James Dong            if (zerosLeft > 0)
8780c1bc742181ded4930842b46e9507372f0b1b963James Dong            {
8790c1bc742181ded4930842b46e9507372f0b1b963James Dong                BUFFER_SHOW(bufferValue, bufferBits, bit,11);
8800c1bc742181ded4930842b46e9507372f0b1b963James Dong                tmp = DecodeRunBefore(bit, zerosLeft);
8810c1bc742181ded4930842b46e9507372f0b1b963James Dong                if (!tmp)
8820c1bc742181ded4930842b46e9507372f0b1b963James Dong                    return(HANTRO_NOK);
8830c1bc742181ded4930842b46e9507372f0b1b963James Dong                BUFFER_FLUSH(bufferValue, bufferBits, LENGTH(tmp));
8840c1bc742181ded4930842b46e9507372f0b1b963James Dong                run[i] = INFO(tmp);
8850c1bc742181ded4930842b46e9507372f0b1b963James Dong                zerosLeft -= run[i]++;
8860c1bc742181ded4930842b46e9507372f0b1b963James Dong            }
8870c1bc742181ded4930842b46e9507372f0b1b963James Dong            else
8880c1bc742181ded4930842b46e9507372f0b1b963James Dong            {
8890c1bc742181ded4930842b46e9507372f0b1b963James Dong                run[i] = 1;
8900c1bc742181ded4930842b46e9507372f0b1b963James Dong            }
8910c1bc742181ded4930842b46e9507372f0b1b963James Dong        }
8920c1bc742181ded4930842b46e9507372f0b1b963James Dong
8930c1bc742181ded4930842b46e9507372f0b1b963James Dong        /* combining level and run, levelSuffix variable used to hold coeffMap,
8940c1bc742181ded4930842b46e9507372f0b1b963James Dong         * i.e. bit map indicating which coefficients had non-zero value. */
8950c1bc742181ded4930842b46e9507372f0b1b963James Dong
8960c1bc742181ded4930842b46e9507372f0b1b963James Dong        /*lint -esym(771,level,run) level and run are always initialized */
8970c1bc742181ded4930842b46e9507372f0b1b963James Dong        tmp = zerosLeft;
8980c1bc742181ded4930842b46e9507372f0b1b963James Dong        coeffLevel[tmp] = level[totalCoeff-1];
8990c1bc742181ded4930842b46e9507372f0b1b963James Dong        levelSuffix = 1 << tmp;
9000c1bc742181ded4930842b46e9507372f0b1b963James Dong        for (i = totalCoeff-1; i--;)
9010c1bc742181ded4930842b46e9507372f0b1b963James Dong        {
9020c1bc742181ded4930842b46e9507372f0b1b963James Dong            tmp += run[i];
9030c1bc742181ded4930842b46e9507372f0b1b963James Dong            levelSuffix |= 1 << tmp;
9040c1bc742181ded4930842b46e9507372f0b1b963James Dong            coeffLevel[tmp] = level[i];
9050c1bc742181ded4930842b46e9507372f0b1b963James Dong        }
9060c1bc742181ded4930842b46e9507372f0b1b963James Dong
9070c1bc742181ded4930842b46e9507372f0b1b963James Dong    }
9080c1bc742181ded4930842b46e9507372f0b1b963James Dong    else
9090c1bc742181ded4930842b46e9507372f0b1b963James Dong        levelSuffix = 0;
9100c1bc742181ded4930842b46e9507372f0b1b963James Dong
9110c1bc742181ded4930842b46e9507372f0b1b963James Dong    if (h264bsdFlushBits(pStrmData, 32-bufferBits) != HANTRO_OK)
9120c1bc742181ded4930842b46e9507372f0b1b963James Dong        return(HANTRO_NOK);
9130c1bc742181ded4930842b46e9507372f0b1b963James Dong
9140c1bc742181ded4930842b46e9507372f0b1b963James Dong    return((totalCoeff << 4) | (levelSuffix << 16));
9150c1bc742181ded4930842b46e9507372f0b1b963James Dong}
9160c1bc742181ded4930842b46e9507372f0b1b963James Dong
917