/*
 * Copyright (C) 2007-2008 ARM Limited
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 */
/* ----------------------------------------------------------------
 *
 * 
 * File Name:  armVCM4P10_CAVLCTables.c
 * OpenMAX DL: v1.0.2
 * Revision:   9641
 * Date:       Thursday, February 7, 2008
 * 
 * 
 * 
 * 
 * Optimized CAVLC tables for H.264
 * 
 */
 
#include "omxtypes.h"
#include "armOMX.h"

#include "armVCM4P10_CAVLCTables.h"

/* 4x4 DeZigZag table */

const OMX_U8 armVCM4P10_ZigZag_4x4[16] =
{
    0, 1, 4, 8, 5, 2, 3, 6, 9, 12, 13, 10, 7, 11, 14, 15
};

/* 2x2 DeZigZag table */

const OMX_U8 armVCM4P10_ZigZag_2x2[4] =
{
    0, 1, 2, 3
};


/*
 * Suffix To Level table
 * We increment the suffix length if 
 * ((LevelCode>>1)+1)>(3<<(SuffixLength-1)) && SuffixLength<6
 * (LevelCode>>1)>=(3<<(SuffixLength-1))    && SuffixLength<6
 *  LevelCode    >= 3<<SuffixLength         && SuffixLength<6
 * (LevelCode+2) >= (3<<SuffixLength)+2     && SuffixLength<6
 */
const OMX_S8 armVCM4P10_SuffixToLevel[7] =
{
    (3<<1)+2,       /* SuffixLength=1 */
    (3<<1)+2,       /* SuffixLength=1 */
    (3<<2)+2,       /* SuffixLength=2 */
    (3<<3)+2,       /* SuffixLength=3 */
    (3<<4)+2,       /* SuffixLength=4 */
    (3<<5)+2,       /* SuffixLength=5 */
    -1              /* SuffixLength=6 - never increment */
};

static const OMX_U16 armVCM4P10_CAVLCCoeffTokenTables_0[132] = {
    0x0020, 0x0100, 0x2015, 0x2015, 0x400b, 0x400b, 0x400b, 0x400b,
    0x6001, 0x6001, 0x6001, 0x6001, 0x6001, 0x6001, 0x6001, 0x6001,
    0x0028, 0x00f0, 0x00f8, 0x0027, 0x0030, 0x00d8, 0x00e0, 0x00e8,
    0x0038, 0x00a0, 0x00c8, 0x00d0, 0x0040, 0x0068, 0x0090, 0x0098,
    0x0048, 0x0050, 0x0058, 0x0060, 0x27ff, 0x27ff, 0x206b, 0x206b,
    0x0081, 0x0085, 0x0083, 0x0079, 0x0087, 0x007d, 0x007b, 0x0071,
    0x007f, 0x0075, 0x0073, 0x0069, 0x0070, 0x0078, 0x0080, 0x0088,
    0x2077, 0x2077, 0x206d, 0x206d, 0x2063, 0x2063, 0x2061, 0x2061,
    0x206f, 0x206f, 0x2065, 0x2065, 0x205b, 0x205b, 0x2059, 0x2059,
    0x0067, 0x005d, 0x0053, 0x0051, 0x005f, 0x0055, 0x004b, 0x0049,
    0x00a8, 0x00b0, 0x00b8, 0x00c0, 0x2041, 0x2041, 0x204d, 0x204d,
    0x2043, 0x2043, 0x2039, 0x2039, 0x2057, 0x2057, 0x2045, 0x2045,
    0x203b, 0x203b, 0x2031, 0x2031, 0x204f, 0x204f, 0x203d, 0x203d,
    0x2033, 0x2033, 0x2029, 0x2029, 0x0047, 0x0035, 0x002b, 0x0021,
    0x203f, 0x203f, 0x202d, 0x202d, 0x2023, 0x2023, 0x2019, 0x2019,
    0x0037, 0x0025, 0x001b, 0x0011, 0x202f, 0x202f, 0x201d, 0x201d,
    0x0013, 0x0009, 0x201f, 0x201f
};

static const OMX_U16 armVCM4P10_CAVLCCoeffTokenTables_1[128] = {
    0x0020, 0x00e8, 0x00f0, 0x00f8, 0x0027, 0x001f, 0x2015, 0x2015,
    0x400b, 0x400b, 0x400b, 0x400b, 0x4001, 0x4001, 0x4001, 0x4001,
    0x0028, 0x00d0, 0x00d8, 0x00e0, 0x0030, 0x0098, 0x00c0, 0x00c8,
    0x0038, 0x0060, 0x0088, 0x0090, 0x0040, 0x0048, 0x0050, 0x0058,
    0x27ff, 0x27ff, 0x207f, 0x207f, 0x0087, 0x0085, 0x0083, 0x0081,
    0x007b, 0x0079, 0x007d, 0x0073, 0x2075, 0x2075, 0x2071, 0x2071,
    0x0068, 0x0070, 0x0078, 0x0080, 0x2077, 0x2077, 0x206d, 0x206d,
    0x206b, 0x206b, 0x2069, 0x2069, 0x206f, 0x206f, 0x2065, 0x2065,
    0x2063, 0x2063, 0x2061, 0x2061, 0x0059, 0x005d, 0x005b, 0x0051,
    0x0067, 0x0055, 0x0053, 0x0049, 0x00a0, 0x00a8, 0x00b0, 0x00b8,
    0x205f, 0x205f, 0x204d, 0x204d, 0x204b, 0x204b, 0x2041, 0x2041,
    0x2057, 0x2057, 0x2045, 0x2045, 0x2043, 0x2043, 0x2039, 0x2039,
    0x204f, 0x204f, 0x203d, 0x203d, 0x203b, 0x203b, 0x2031, 0x2031,
    0x0029, 0x0035, 0x0033, 0x0021, 0x2047, 0x2047, 0x202d, 0x202d,
    0x202b, 0x202b, 0x2019, 0x2019, 0x003f, 0x0025, 0x0023, 0x0011,
    0x0037, 0x001d, 0x001b, 0x0009, 0x202f, 0x202f, 0x2013, 0x2013
};

static const OMX_U16 armVCM4P10_CAVLCCoeffTokenTables_2[112] = {
    0x0020, 0x0088, 0x00b0, 0x00b8, 0x00c0, 0x00c8, 0x00d0, 0x00d8,
    0x003f, 0x0037, 0x002f, 0x0027, 0x001f, 0x0015, 0x000b, 0x0001,
    0x0028, 0x0050, 0x0078, 0x0080, 0x0030, 0x0038, 0x0040, 0x0048,
    0x07ff, 0x0081, 0x0087, 0x0085, 0x0083, 0x0079, 0x007f, 0x007d,
    0x007b, 0x0071, 0x0077, 0x0075, 0x0073, 0x0069, 0x206b, 0x206b,
    0x0058, 0x0060, 0x0068, 0x0070, 0x2061, 0x2061, 0x206d, 0x206d,
    0x2063, 0x2063, 0x2059, 0x2059, 0x206f, 0x206f, 0x2065, 0x2065,
    0x205b, 0x205b, 0x2051, 0x2051, 0x0067, 0x005d, 0x0053, 0x0049,
    0x005f, 0x0055, 0x004b, 0x0041, 0x0090, 0x0098, 0x00a0, 0x00a8,
    0x2039, 0x2039, 0x2031, 0x2031, 0x204d, 0x204d, 0x2029, 0x2029,
    0x2057, 0x2057, 0x2045, 0x2045, 0x2043, 0x2043, 0x2021, 0x2021,
    0x0019, 0x003d, 0x003b, 0x0011, 0x004f, 0x0035, 0x0033, 0x0009,
    0x202b, 0x202b, 0x202d, 0x202d, 0x2023, 0x2023, 0x2025, 0x2025,
    0x201b, 0x201b, 0x2047, 0x2047, 0x201d, 0x201d, 0x2013, 0x2013
};

static const OMX_U16 armVCM4P10_CAVLCCoeffTokenTables_3[80] = {
    0x0020, 0x0028, 0x0030, 0x0038, 0x0040, 0x0048, 0x0050, 0x0058,
    0x0060, 0x0068, 0x0070, 0x0078, 0x0080, 0x0088, 0x0090, 0x0098,
    0x0009, 0x000b, 0x07ff, 0x0001, 0x0011, 0x0013, 0x0015, 0x07ff,
    0x0019, 0x001b, 0x001d, 0x001f, 0x0021, 0x0023, 0x0025, 0x0027,
    0x0029, 0x002b, 0x002d, 0x002f, 0x0031, 0x0033, 0x0035, 0x0037,
    0x0039, 0x003b, 0x003d, 0x003f, 0x0041, 0x0043, 0x0045, 0x0047,
    0x0049, 0x004b, 0x004d, 0x004f, 0x0051, 0x0053, 0x0055, 0x0057,
    0x0059, 0x005b, 0x005d, 0x005f, 0x0061, 0x0063, 0x0065, 0x0067,
    0x0069, 0x006b, 0x006d, 0x006f, 0x0071, 0x0073, 0x0075, 0x0077,
    0x0079, 0x007b, 0x007d, 0x007f, 0x0081, 0x0083, 0x0085, 0x0087
};

static const OMX_U16 armVCM4P10_CAVLCCoeffTokenTables_4[32] = {
    0x0020, 0x0038, 0x2015, 0x2015, 0x4001, 0x4001, 0x4001, 0x4001,
    0x600b, 0x600b, 0x600b, 0x600b, 0x600b, 0x600b, 0x600b, 0x600b,
    0x0028, 0x0030, 0x0021, 0x0019, 0x2027, 0x2027, 0x0025, 0x0023,
    0x201d, 0x201d, 0x201b, 0x201b, 0x0011, 0x001f, 0x0013, 0x0009
};

const OMX_U16 * armVCM4P10_CAVLCCoeffTokenTables[18] = {
    armVCM4P10_CAVLCCoeffTokenTables_0, /* nC=0 */
    armVCM4P10_CAVLCCoeffTokenTables_0, /* nC=1 */
    armVCM4P10_CAVLCCoeffTokenTables_1, /* nC=2 */
    armVCM4P10_CAVLCCoeffTokenTables_1, /* nC=3 */
    armVCM4P10_CAVLCCoeffTokenTables_2, /* nC=4 */
    armVCM4P10_CAVLCCoeffTokenTables_2, /* nC=5 */
    armVCM4P10_CAVLCCoeffTokenTables_2, /* nC=6 */
    armVCM4P10_CAVLCCoeffTokenTables_2, /* nC=7 */
    armVCM4P10_CAVLCCoeffTokenTables_3, /* nC=8 */
    armVCM4P10_CAVLCCoeffTokenTables_3, /* nC=9 */
    armVCM4P10_CAVLCCoeffTokenTables_3, /* nC=10 */
    armVCM4P10_CAVLCCoeffTokenTables_3, /* nC=11 */
    armVCM4P10_CAVLCCoeffTokenTables_3, /* nC=12 */
    armVCM4P10_CAVLCCoeffTokenTables_3, /* nC=13 */
    armVCM4P10_CAVLCCoeffTokenTables_3, /* nC=14 */
    armVCM4P10_CAVLCCoeffTokenTables_3, /* nC=15 */
    armVCM4P10_CAVLCCoeffTokenTables_3, /* nC=16 */
    armVCM4P10_CAVLCCoeffTokenTables_4  /* nC=-1 */
};

static const OMX_U16 armVCM4P10_CAVLCTotalZeroTables_0[40] = {
    0x0020, 0x0048, 0x0009, 0x0007, 0x2005, 0x2005, 0x2003, 0x2003,
    0x6001, 0x6001, 0x6001, 0x6001, 0x6001, 0x6001, 0x6001, 0x6001,
    0x0028, 0x0040, 0x0011, 0x000f, 0x0030, 0x0038, 0x0019, 0x0017,
    0x27ff, 0x27ff, 0x201f, 0x201f, 0x201d, 0x201d, 0x201b, 0x201b,
    0x2015, 0x2015, 0x2013, 0x2013, 0x200d, 0x200d, 0x200b, 0x200b
};

static const OMX_U16 armVCM4P10_CAVLCTotalZeroTables_1[24] = {
    0x0020, 0x0028, 0x0011, 0x000f, 0x000d, 0x000b, 0x2009, 0x2009,
    0x2007, 0x2007, 0x2005, 0x2005, 0x2003, 0x2003, 0x2001, 0x2001,
    0x001d, 0x001b, 0x0019, 0x0017, 0x2015, 0x2015, 0x2013, 0x2013
};

static const OMX_U16 armVCM4P10_CAVLCTotalZeroTables_2[24] = {
    0x0020, 0x0028, 0x0011, 0x000b, 0x0009, 0x0001, 0x200f, 0x200f,
    0x200d, 0x200d, 0x2007, 0x2007, 0x2005, 0x2005, 0x2003, 0x2003,
    0x001b, 0x0017, 0x2019, 0x2019, 0x2015, 0x2015, 0x2013, 0x2013
};

static const OMX_U16 armVCM4P10_CAVLCTotalZeroTables_3[24] = {
    0x0020, 0x0028, 0x0013, 0x000f, 0x0007, 0x0005, 0x2011, 0x2011,
    0x200d, 0x200d, 0x200b, 0x200b, 0x2009, 0x2009, 0x2003, 0x2003,
    0x2019, 0x2019, 0x2017, 0x2017, 0x2015, 0x2015, 0x2001, 0x2001
};

static const OMX_U16 armVCM4P10_CAVLCTotalZeroTables_4[20] = {
    0x0020, 0x0015, 0x0011, 0x0005, 0x0003, 0x0001, 0x200f, 0x200f,
    0x200d, 0x200d, 0x200b, 0x200b, 0x2009, 0x2009, 0x2007, 0x2007,
    0x2017, 0x2017, 0x2013, 0x2013
};

static const OMX_U16 armVCM4P10_CAVLCTotalZeroTables_5[20] = {
    0x0020, 0x0011, 0x2013, 0x2013, 0x200f, 0x200f, 0x200d, 0x200d,
    0x200b, 0x200b, 0x2009, 0x2009, 0x2007, 0x2007, 0x2005, 0x2005,
    0x0015, 0x0001, 0x2003, 0x2003
};

static const OMX_U16 armVCM4P10_CAVLCTotalZeroTables_6[20] = {
    0x0020, 0x000f, 0x2011, 0x2011, 0x200d, 0x200d, 0x2009, 0x2009,
    0x2007, 0x2007, 0x2005, 0x2005, 0x400b, 0x400b, 0x400b, 0x400b,
    0x0013, 0x0001, 0x2003, 0x2003
};

static const OMX_U16 armVCM4P10_CAVLCTotalZeroTables_7[20] = {
    0x0020, 0x0003, 0x200f, 0x200f, 0x200d, 0x200d, 0x2007, 0x2007,
    0x400b, 0x400b, 0x400b, 0x400b, 0x4009, 0x4009, 0x4009, 0x4009,
    0x0011, 0x0001, 0x2005, 0x2005
};

static const OMX_U16 armVCM4P10_CAVLCTotalZeroTables_8[20] = {
    0x0020, 0x0005, 0x200b, 0x200b, 0x400d, 0x400d, 0x400d, 0x400d,
    0x4009, 0x4009, 0x4009, 0x4009, 0x4007, 0x4007, 0x4007, 0x4007,
    0x0003, 0x0001, 0x200f, 0x200f
};

static const OMX_U16 armVCM4P10_CAVLCTotalZeroTables_9[20] = {
    0x0020, 0x000d, 0x2005, 0x2005, 0x400b, 0x400b, 0x400b, 0x400b,
    0x4009, 0x4009, 0x4009, 0x4009, 0x4007, 0x4007, 0x4007, 0x4007,
    0x2003, 0x2003, 0x2001, 0x2001
};

static const OMX_U16 armVCM4P10_CAVLCTotalZeroTables_10[16] = {
    0x0001, 0x0003, 0x2005, 0x2005, 0x2007, 0x2007, 0x200b, 0x200b,
    0x6009, 0x6009, 0x6009, 0x6009, 0x6009, 0x6009, 0x6009, 0x6009
};

static const OMX_U16 armVCM4P10_CAVLCTotalZeroTables_11[16] = {
    0x0001, 0x0003, 0x2009, 0x2009, 0x4005, 0x4005, 0x4005, 0x4005,
    0x6007, 0x6007, 0x6007, 0x6007, 0x6007, 0x6007, 0x6007, 0x6007
};

static const OMX_U16 armVCM4P10_CAVLCTotalZeroTables_12[16] = {
    0x2001, 0x2001, 0x2003, 0x2003, 0x4007, 0x4007, 0x4007, 0x4007,
    0x6005, 0x6005, 0x6005, 0x6005, 0x6005, 0x6005, 0x6005, 0x6005
};

static const OMX_U16 armVCM4P10_CAVLCTotalZeroTables_13[16] = {
    0x4001, 0x4001, 0x4001, 0x4001, 0x4003, 0x4003, 0x4003, 0x4003,
    0x6005, 0x6005, 0x6005, 0x6005, 0x6005, 0x6005, 0x6005, 0x6005
};

static const OMX_U16 armVCM4P10_CAVLCTotalZeroTables_14[16] = {
    0x6001, 0x6001, 0x6001, 0x6001, 0x6001, 0x6001, 0x6001, 0x6001,
    0x6003, 0x6003, 0x6003, 0x6003, 0x6003, 0x6003, 0x6003, 0x6003
};

const OMX_U16 * armVCM4P10_CAVLCTotalZeroTables[15] = {
    armVCM4P10_CAVLCTotalZeroTables_0,
    armVCM4P10_CAVLCTotalZeroTables_1,
    armVCM4P10_CAVLCTotalZeroTables_2,
    armVCM4P10_CAVLCTotalZeroTables_3,
    armVCM4P10_CAVLCTotalZeroTables_4,
    armVCM4P10_CAVLCTotalZeroTables_5,
    armVCM4P10_CAVLCTotalZeroTables_6,
    armVCM4P10_CAVLCTotalZeroTables_7,
    armVCM4P10_CAVLCTotalZeroTables_8,
    armVCM4P10_CAVLCTotalZeroTables_9,
    armVCM4P10_CAVLCTotalZeroTables_10,
    armVCM4P10_CAVLCTotalZeroTables_11,
    armVCM4P10_CAVLCTotalZeroTables_12,
    armVCM4P10_CAVLCTotalZeroTables_13,
    armVCM4P10_CAVLCTotalZeroTables_14
};

static const OMX_U16 armVCM4P10_CAVLCTotalZeros2x2Tables_0[16] = {
    0x2007, 0x2007, 0x2005, 0x2005, 0x4003, 0x4003, 0x4003, 0x4003,
    0x6001, 0x6001, 0x6001, 0x6001, 0x6001, 0x6001, 0x6001, 0x6001
};

static const OMX_U16 armVCM4P10_CAVLCTotalZeros2x2Tables_1[16] = {
    0x4005, 0x4005, 0x4005, 0x4005, 0x4003, 0x4003, 0x4003, 0x4003,
    0x6001, 0x6001, 0x6001, 0x6001, 0x6001, 0x6001, 0x6001, 0x6001
};

static const OMX_U16 armVCM4P10_CAVLCTotalZeros2x2Tables_2[16] = {
    0x6003, 0x6003, 0x6003, 0x6003, 0x6003, 0x6003, 0x6003, 0x6003,
    0x6001, 0x6001, 0x6001, 0x6001, 0x6001, 0x6001, 0x6001, 0x6001
};

const OMX_U16 * armVCM4P10_CAVLCTotalZeros2x2Tables[3] = {
    armVCM4P10_CAVLCTotalZeros2x2Tables_0,
    armVCM4P10_CAVLCTotalZeros2x2Tables_1,
    armVCM4P10_CAVLCTotalZeros2x2Tables_2
};

static const OMX_U16 armVCM4P10_CAVLCRunBeforeTables_0[8] = {
    0x4003, 0x4003, 0x4003, 0x4003, 0x4001, 0x4001, 0x4001, 0x4001
};

static const OMX_U16 armVCM4P10_CAVLCRunBeforeTables_1[8] = {
    0x2005, 0x2005, 0x2003, 0x2003, 0x4001, 0x4001, 0x4001, 0x4001
};

static const OMX_U16 armVCM4P10_CAVLCRunBeforeTables_2[8] = {
    0x2007, 0x2007, 0x2005, 0x2005, 0x2003, 0x2003, 0x2001, 0x2001
};

static const OMX_U16 armVCM4P10_CAVLCRunBeforeTables_3[8] = {
    0x0009, 0x0007, 0x2005, 0x2005, 0x2003, 0x2003, 0x2001, 0x2001
};

static const OMX_U16 armVCM4P10_CAVLCRunBeforeTables_4[8] = {
    0x000b, 0x0009, 0x0007, 0x0005, 0x2003, 0x2003, 0x2001, 0x2001
};

static const OMX_U16 armVCM4P10_CAVLCRunBeforeTables_5[8] = {
    0x0003, 0x0005, 0x0009, 0x0007, 0x000d, 0x000b, 0x2001, 0x2001
};

static const OMX_U16 armVCM4P10_CAVLCRunBeforeTables_6[24] = {
    0x0010, 0x000d, 0x000b, 0x0009, 0x0007, 0x0005, 0x0003, 0x0001,
    0x0018, 0x0011, 0x200f, 0x200f, 0x0020, 0x0015, 0x2013, 0x2013,
    0x0028, 0x0019, 0x2017, 0x2017, 0x07ff, 0x001d, 0x201b, 0x201b
};

/* Tables 7 to 14 are duplicates of table 6 */

const OMX_U16 * armVCM4P10_CAVLCRunBeforeTables[15] = {
    armVCM4P10_CAVLCRunBeforeTables_0,  /* ZerosLeft=1 */
    armVCM4P10_CAVLCRunBeforeTables_1,
    armVCM4P10_CAVLCRunBeforeTables_2,
    armVCM4P10_CAVLCRunBeforeTables_3,
    armVCM4P10_CAVLCRunBeforeTables_4,
    armVCM4P10_CAVLCRunBeforeTables_5,  /* ZerosLeft=6 */
    armVCM4P10_CAVLCRunBeforeTables_6,  /* ZerosLeft=7 */
    armVCM4P10_CAVLCRunBeforeTables_6,  /* ZerosLeft=8 */
    armVCM4P10_CAVLCRunBeforeTables_6,  /* ZerosLeft=9 */
    armVCM4P10_CAVLCRunBeforeTables_6,  /* ZerosLeft=10 */
    armVCM4P10_CAVLCRunBeforeTables_6,  /* ZerosLeft=11 */
    armVCM4P10_CAVLCRunBeforeTables_6,  /* ZerosLeft=12 */
    armVCM4P10_CAVLCRunBeforeTables_6,  /* ZerosLeft=13 */
    armVCM4P10_CAVLCRunBeforeTables_6,  /* ZerosLeft=14 */
    armVCM4P10_CAVLCRunBeforeTables_6   /* ZerosLeft=15 */
};
