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