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