/*
 * copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
 * copyright (c) 2004 Maarten Daniels
 *
 * This file is part of Libav.
 *
 * Libav is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * Libav is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with Libav; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

/**
 * @file
 * H.261 tables.
 */

#ifndef AVCODEC_H261DATA_H
#define AVCODEC_H261DATA_H

#include <stdint.h>
#include "h261.h"

// H.261 VLC table for macroblock addressing
static const uint8_t h261_mba_code[35] = {
     1,  3,  2,  3,
     2,  3,  2,  7,
     6, 11, 10,  9,
     8,  7,  6, 23,
    22, 21, 20, 19,
    18, 35, 34, 33,
    32, 31, 30, 29,
    28, 27, 26, 25,
    24,
    15,           //(MBA stuffing)
    1             //(start code)
};

static const uint8_t h261_mba_bits[35] = {
     1,  3,  3,  4,
     4,  5,  5,  7,
     7,  8,  8,  8,
     8,  8,  8, 10,
    10, 10, 10, 10,
    10, 11, 11, 11,
    11, 11, 11, 11,
    11, 11, 11, 11,
    11,
    11,           //(MBA stuffing)
    16            //(start code)
};

//H.261 VLC table for macroblock type
static const uint8_t h261_mtype_code[10] = {
    1,  1,  1,  1,
    1,  1,  1,  1,
    1,  1
};

static const uint8_t h261_mtype_bits[10] = {
    4,  7,  1,  5,
    9,  8, 10,  3,
    2,  6
};

static const int h261_mtype_map[10]= {
        MB_TYPE_INTRA4x4,
        MB_TYPE_INTRA4x4  |  MB_TYPE_QUANT,
                                               MB_TYPE_CBP,
                             MB_TYPE_QUANT  |  MB_TYPE_CBP,
                                                               MB_TYPE_16x16,
                                               MB_TYPE_CBP  |  MB_TYPE_16x16,
                             MB_TYPE_QUANT  |  MB_TYPE_CBP  |  MB_TYPE_16x16,
                                                               MB_TYPE_16x16  |  MB_TYPE_H261_FIL,
                                               MB_TYPE_CBP  |  MB_TYPE_16x16  |  MB_TYPE_H261_FIL,
                             MB_TYPE_QUANT  |  MB_TYPE_CBP  |  MB_TYPE_16x16  |  MB_TYPE_H261_FIL
};

//H.261 VLC table for motion vectors
static const uint8_t h261_mv_tab[17][2] = {
    {1,1}, {1,2}, {1,3}, {1,4}, {3,6}, {5,7}, {4,7}, {3,7},
    {11,9}, {10,9}, {9,9}, {17,10}, {16,10}, {15,10}, {14,10}, {13,10}, {12,10}
};

static const int mvmap[17] =
{
    0, -1, -2, -3, -4, -5, -6, -7, -8, -9, -10, -11, -12, -13, -14, -15, -16
};

//H.261 VLC table for coded block pattern
static const uint8_t h261_cbp_tab[63][2] =
{
    {11,5}, {9,5}, {13,6}, {13,4}, {23,7}, {19,7}, {31,8}, {12,4},
    {22,7}, {18,7}, {30,8}, {19,5}, {27,8}, {23,8}, {19,8}, {11,4},
    {21,7}, {17,7}, {29,8}, {17,5}, {25,8}, {21,8}, {17,8}, {15,6},
    {15,8}, {13,8}, {3,9}, {15,5}, {11,8}, {7,8}, {7,9}, {10,4},
    {20,7}, {16,7}, {28,8}, {14,6}, {14,8}, {12,8}, {2,9}, {16,5},
    {24,8}, {20,8}, {16,8}, {14,5}, {10,8}, {6,8}, {6,9}, {18,5},
    {26,8}, {22,8}, {18,8}, {13,5}, {9,8}, {5,8}, {5,9}, {12,5},
    {8,8}, {4,8}, {4,9}, {7,3}, {10,5}, {8,5}, {12,6}
};

//H.261 VLC table for transform coefficients
static const uint16_t h261_tcoeff_vlc[65][2] = {
{ 0x2, 2 }, { 0x3, 2 },{ 0x4, 4 },{ 0x5, 5 },
{ 0x6, 7 },{ 0x26, 8 },{ 0x21, 8 },{ 0xa, 10 },
{ 0x1d, 12 },{ 0x18, 12 },{ 0x13, 12 },{ 0x10 , 12 },
{ 0x1a, 13},{ 0x19, 13 }, { 0x18, 13 }, { 0x17, 13 },
{ 0x3, 3 }, { 0x6, 6 }, { 0x25 , 8 }, { 0xc, 10 },
{ 0x1b, 12 }, { 0x16, 13 }, { 0x15, 13 }, { 0x5, 4},
{ 0x4, 7}, { 0xb, 10 }, { 0x14, 12 }, { 0x14, 13 },
{ 0x7, 5 }, { 0x24, 8 }, { 0x1c, 12 }, { 0x13, 13 },
{ 0x6, 5 }, { 0xf, 10 }, { 0x12, 12}, { 0x7, 6},
{ 0x9 , 10 }, { 0x12, 13 }, { 0x5, 6 }, { 0x1e, 12 },
{ 0x4, 6 }, { 0x15, 12 }, { 0x7, 7 }, { 0x11, 12},
{ 0x5, 7 }, { 0x11, 13 }, { 0x27, 8 }, { 0x10, 13 },
{ 0x23, 8 }, { 0x22, 8 }, { 0x20, 8 }, { 0xe , 10 },
{ 0xd, 10 }, { 0x8, 10 },{ 0x1f, 12 }, { 0x1a, 12 },
{ 0x19, 12 }, { 0x17, 12 }, { 0x16, 12}, { 0x1f, 13},
{ 0x1e, 13 }, { 0x1d, 13 }, { 0x1c, 13}, { 0x1b, 13},
{ 0x1, 6 }                                             //escape
};

static const int8_t h261_tcoeff_level[64] = {
    0,  1,  2,  3,  4,  5,  6,  7,
    8,  9, 10, 11, 12, 13, 14, 15,
    1,  2,  3,  4,  5,  6,  7,  1,
    2,  3,  4,  5,  1,  2,  3,  4,
    1,  2,  3,  1,  2,  3,  1,  2,
    1,  2,  1,  2,  1,  2,  1,  2,
    1,  1,  1,  1,  1,  1,  1,  1,
    1,  1,  1,  1,  1,  1,  1,  1
};

static const int8_t h261_tcoeff_run[64] = {
    0,
    0,  0,  0,  0,  0,  0,  0,  0,
    0,  0,  0,  0,  0,  0,  0,  1,
    1,  1,  1,  1,  1,  1,  2,  2,
    2,  2,  2,  3,  3,  3,  3,  4,
    4,  4,  5,  5,  5,  6,  6,  7,
    7,  8,  8,  9,  9, 10, 10, 11,
   12, 13, 14, 15, 16, 17, 18, 19,
   20, 21, 22, 23, 24, 25, 26
};

static RLTable h261_rl_tcoeff = {
    64,
    64,
    h261_tcoeff_vlc,
    h261_tcoeff_run,
    h261_tcoeff_level,
};

#endif /* AVCODEC_H261DATA_H */
