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