⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 swdec_vlc.c

📁 freescale i.mx31 BSP CE5.0全部源码
💻 C
📖 第 1 页 / 共 3 页
字号:
/*------------------------------------------------------------------------------
--                                                                            --
--       This software is confidential and proprietary and may be used        --
--        only as expressly authorized by a licensing agreement from          --
--                                                                            --
--                            Hantro Products Oy.                             --
--                                                                            --
--      In the event of publication, the following notice is applicable:      --
--                                                                            --
--                   (C) COPYRIGHT 2004 HANTRO PRODUCTS OY                    --
--                            ALL RIGHTS RESERVED                             --
--                                                                            --
--         The entire notice above must be reproduced on all copies.          --
--                                                                            --
--------------------------------------------------------------------------------
--
--  Abstract : Vlc and rvlc decoding
--
-------------------------------------------------------------------------------*/



/*------------------------------------------------------------------------------

    Table of contents
   
     1. Include headers
     2. External identifiers
     3. Module defines
     4. Module identifiers
     5. Fuctions
        5.1     SwDec_DecodeIntraVlcBlock
        5.2     SwDec_DecodeInterVlcBlock
        5.5     SwDec_DecodeRvlcBlock

------------------------------------------------------------------------------*/



/*------------------------------------------------------------------------------
    1. Include headers
------------------------------------------------------------------------------*/

#include "SwDec_Vlc.h"
#include "SwDec_Utils.h"

/*------------------------------------------------------------------------------
    2. External identifiers 
------------------------------------------------------------------------------*/


/*------------------------------------------------------------------------------
    3. Module defines 
------------------------------------------------------------------------------*/

/* structure for vlc code tables */
typedef struct {
    u16 len;
    u16 lrl;
} vlcTable_t;

#ifndef MP4DEC_H263_ONLY
enum {ERROR = 0x7EEEFFFF, EMPTY = 0x00000000, ESCAPE = 0x0000FFFF };
#endif
/*------------------------------------------------------------------------------
    4. Module indentifiers 
------------------------------------------------------------------------------*/

STATIC const u8 zigZagScan[64] =
{
    0,1,8,16,9,2,3,10,17,24,32,25,18,11,4,5,
    12,19,26,33,40,48,41,34,27,20,13,6,7,14,21,28,
    35,42,49,56,57,50,43,36,29,22,15,23,30,37,44,51,
    58,59,52,45,38,31,39,46,53,60,61,54,47,55,62,63
};

#ifndef MP4DEC_H263_ONLY
STATIC const u8 horScan[64] =
{
    0,1,2,3,8,9,16,17,10,11,4,5,6,7,15,14,
    13,12,19,18,24,25,32,33,26,27,20,21,22,23,28,29,
    30,31,34,35,40,41,48,49,42,43,36,37,38,39,44,45,
    46,47,50,51,56,57,58,59,52,53,54,55,60,61,62,63
};

STATIC const u8 verScan[64] =
{
    0,8,16,24,1,9,2,10,17,25,32,40,48,56,57,49,
    41,33, 26,18,3,11,4,12,19,27,34,42,50,58,35,43,
    51,59, 20,28,5,13,6,14,21,29,36,44,52,60,37,45,
    53,61, 22,30,7,15,23,31,38,46,54,62,39,47,55,63
};

STATIC const vlcTable_t vlcIntraTable1[112] =
{
    {7,34817}, {7,34305}, {7,3073}, {7,35329}, {7,3585}, {7,1026},
    {7,515}, {7,9}, {6,32770}, {6,32770}, {6,2561}, {6,2561},
    {6,33793}, {6,33793}, {6,33281}, {6,33281}, {6,2049}, {6,2049},
    {6,1537}, {6,1537}, {6,8}, {6,8}, {6,7}, {6,7},
    {6,514}, {6,514}, {6,6}, {6,6}, {5,1025}, {5,1025},
    {5,1025}, {5,1025}, {5,5}, {5,5}, {5,5}, {5,5},
    {5,4}, {5,4}, {5,4}, {5,4}, {4,32769}, {4,32769},
    {4,32769}, {4,32769}, {4,32769}, {4,32769}, {4,32769}, {4,32769},
    {2,1}, {2,1}, {2,1}, {2,1}, {2,1}, {2,1},
    {2,1}, {2,1}, {2,1}, {2,1}, {2,1}, {2,1},
    {2,1}, {2,1}, {2,1}, {2,1}, {2,1}, {2,1},
    {2,1}, {2,1}, {2,1}, {2,1}, {2,1}, {2,1},
    {2,1}, {2,1}, {2,1}, {2,1}, {2,1}, {2,1},
    {2,1}, {2,1}, {3,2}, {3,2}, {3,2}, {3,2},
    {3,2}, {3,2}, {3,2}, {3,2}, {3,2}, {3,2},
    {3,2}, {3,2}, {3,2}, {3,2}, {3,2}, {3,2},
    {4,513}, {4,513}, {4,513}, {4,513}, {4,513}, {4,513},
    {4,513}, {4,513}, {4,3}, {4,3}, {4,3}, {4,3},
    {4,3}, {4,3}, {4,3}, {4,3}
};

STATIC const vlcTable_t vlcIntraTable2[96] =
{
    {10,18}, {10,17}, {9,39937}, {9,39937}, {9,39425}, {9,39425},
    {9,38913}, {9,38913}, {9,38401}, {9,38401}, {9,37889}, {9,37889},
    {9,33282}, {9,33282}, {9,32772}, {9,32772}, {9,6145}, {9,6145},
    {9,5633}, {9,5633}, {9,3586}, {9,3586}, {9,3074}, {9,3074},
    {9,2562}, {9,2562}, {9,1539}, {9,1539}, {9,1027}, {9,1027},
    {9,518}, {9,518}, {9,517}, {9,517}, {9,16}, {9,16},
    {9,2050}, {9,2050}, {9,15}, {9,15}, {9,14}, {9,14},
    {9,13}, {9,13}, {8,36865}, {8,36865}, {8,36865}, {8,36865},
    {8,36353}, {8,36353}, {8,36353}, {8,36353}, {8,35841}, {8,35841},
    {8,35841}, {8,35841}, {8,32771}, {8,32771}, {8,32771}, {8,32771},
    {8,5121}, {8,5121}, {8,5121}, {8,5121}, {8,4609}, {8,4609},
    {8,4609}, {8,4609}, {8,4097}, {8,4097}, {8,4097}, {8,4097},
    {8,37377}, {8,37377}, {8,37377}, {8,37377}, {8,1538}, {8,1538},
    {8,1538}, {8,1538}, {8,516}, {8,516}, {8,516}, {8,516},
    {8,12}, {8,12}, {8,12}, {8,12}, {8,11}, {8,11},
    {8,11}, {8,11}, {8,10}, {8,10}, {8,10}, {8,10}
};

STATIC const vlcTable_t vlcIntraTable3[121] =
{
    {11,32775}, {11,32775}, {11,32774}, {11,32774}, {11,22}, {11,22},
    {11,21}, {11,21}, {10,33794}, {10,33794}, {10,33794}, {10,33794},
    {10,33283}, {10,33283}, {10,33283}, {10,33283}, {10,32773}, {10,32773},
    {10,32773}, {10,32773}, {10,6657}, {10,6657}, {10,6657}, {10,6657},
    {10,2563}, {10,2563}, {10,2563}, {10,2563}, {10,4098}, {10,4098},
    {10,4098}, {10,4098}, {10,2051}, {10,2051}, {10,2051}, {10,2051},
    {10,1540}, {10,1540}, {10,1540}, {10,1540}, {10,1028}, {10,1028},
    {10,1028}, {10,1028}, {10,519}, {10,519}, {10,519}, {10,519},
    {10,20}, {10,20}, {10,20}, {10,20}, {10,19}, {10,19},
    {10,19}, {10,19}, {11,23}, {11,23}, {11,24}, {11,24},
    {11,520}, {11,520}, {11,4610}, {11,4610}, {11,34306}, {11,34306},
    {11,34818}, {11,34818}, {11,40449}, {11,40449}, {11,40961}, {11,40961},
    {12,25}, {12,26}, {12,27}, {12,521}, {12,3075}, {12,522},
    {12,1029}, {12,3587}, {12,7169}, {12,32776}, {12,35330}, {12,35842},
    {12,41473}, {12,41985}, {12,42497}, {12,43009}, {6,65535}, {6,65535},
    {6,65535}, {6,65535}, {6,65535}, {6,65535}, {6,65535}, {6,65535},
    {6,65535}, {6,65535}, {6,65535}, {6,65535}, {6,65535}, {6,65535},
    {6,65535}, {6,65535}, {6,65535}, {6,65535}, {6,65535}, {6,65535},
    {6,65535}, {6,65535}, {6,65535}, {6,65535}, {6,65535}, {6,65535},
    {6,65535}, {6,65535}, {6,65535}, {6,65535}, {6,65535}, {6,65535},
    {6,65535}
};
#endif

STATIC const vlcTable_t vlcInterTable1[112] =
{
    {7,36865}, {7,36353}, {7,35841}, {7,35329}, {7,6145}, {7,5633},
    {7,5121}, {7,4}, {6,34817}, {6,34817}, {6,34305}, {6,34305},
    {6,33793}, {6,33793}, {6,33281}, {6,33281}, {6,4609}, {6,4609},
    {6,4097}, {6,4097}, {6,3585}, {6,3585}, {6,3073}, {6,3073},
    {6,514}, {6,514}, {6,3}, {6,3}, {5,2561}, {5,2561},
    {5,2561}, {5,2561}, {5,2049}, {5,2049}, {5,2049}, {5,2049},
    {5,1537}, {5,1537}, {5,1537}, {5,1537}, {4,32769}, {4,32769},
    {4,32769}, {4,32769}, {4,32769}, {4,32769}, {4,32769}, {4,32769},
    {2,1}, {2,1}, {2,1}, {2,1}, {2,1}, {2,1},
    {2,1}, {2,1}, {2,1}, {2,1}, {2,1}, {2,1},
    {2,1}, {2,1}, {2,1}, {2,1}, {2,1}, {2,1},
    {2,1}, {2,1}, {2,1}, {2,1}, {2,1}, {2,1},
    {2,1}, {2,1}, {2,1}, {2,1}, {2,1}, {2,1},
    {2,1}, {2,1}, {3,513}, {3,513}, {3,513}, {3,513},
    {3,513}, {3,513}, {3,513}, {3,513}, {3,513}, {3,513},
    {3,513}, {3,513}, {3,513}, {3,513}, {3,513}, {3,513},
    {4,1025}, {4,1025}, {4,1025}, {4,1025}, {4,1025}, {4,1025},
    {4,1025}, {4,1025}, {4,2}, {4,2}, {4,2}, {4,2},
    {4,2}, {4,2}, {4,2}, {4,2}
};

STATIC const vlcTable_t vlcInterTable2[96] =
{
    {10,9}, {10,8}, {9,45057}, {9,45057}, {9,44545}, {9,44545}, 
    {9,44033}, {9,44033}, {9,43521}, {9,43521}, {9,43009}, {9,43009},
    {9,42497}, {9,42497}, {9,41985}, {9,41985}, {9,41473}, {9,41473},
    {9,32770}, {9,32770}, {9,11265}, {9,11265}, {9,10753}, {9,10753},
    {9,10241}, {9,10241}, {9,9729}, {9,9729}, {9,9217}, {9,9217},
    {9,8705}, {9,8705}, {9,8193}, {9,8193}, {9,7681}, {9,7681},
    {9,2050}, {9,2050}, {9,1538}, {9,1538}, {9,7}, {9,7},
    {9,6}, {9,6}, {8,40961}, {8,40961}, {8,40961}, {8,40961},
    {8,40449}, {8,40449}, {8,40449}, {8,40449}, {8,39937}, {8,39937},
    {8,39937}, {8,39937}, {8,39425}, {8,39425}, {8,39425}, {8,39425},
    {8,38913}, {8,38913}, {8,38913}, {8,38913}, {8,38401}, {8,38401},
    {8,38401}, {8,38401}, {8,37889}, {8,37889}, {8,37889}, {8,37889},
    {8,37377}, {8,37377}, {8,37377}, {8,37377}, {8,7169}, {8,7169},
    {8,7169}, {8,7169}, {8,6657}, {8,6657}, {8,6657}, {8,6657},
    {8,1026}, {8,1026}, {8,1026}, {8,1026}, {8,515}, {8,515},
    {8,515}, {8,515}, {8,5}, {8,5}, {8,5}, {8,5}
};

STATIC const vlcTable_t vlcInterTable3[121] =
{
    {11,33282}, {11,33282}, {11,32771}, {11,32771}, {11,11}, {11,11},
    {11,10}, {11,10}, {10,47105}, {10,47105}, {10,47105}, {10,47105},
    {10,46593}, {10,46593}, {10,46593}, {10,46593}, {10,46081}, {10,46081},
    {10,46081}, {10,46081}, {10,45569}, {10,45569}, {10,45569}, {10,45569},
    {10,4610}, {10,4610}, {10,4610}, {10,4610}, {10,4098}, {10,4098},
    {10,4098}, {10,4098}, {10,3586}, {10,3586}, {10,3586}, {10,3586},
    {10,3074}, {10,3074}, {10,3074}, {10,3074}, {10,2562}, {10,2562},
    {10,2562}, {10,2562}, {10,1539}, {10,1539}, {10,1539}, {10,1539},
    {10,1027}, {10,1027}, {10,1027}, {10,1027}, {10,516}, {10,516},
    {10,516}, {10,516}, {11,12}, {11,12}, {11,517}, {11,517},
    {11,11777}, {11,11777}, {11,12289}, {11,12289}, {11,47617}, {11,47617},
    {11,48129}, {11,48129}, {11,48641}, {11,48641}, {11,49153}, {11,49153},
    {12,518}, {12,1028}, {12,2051}, {12,2563}, {12,3075}, {12,5122},
    {12,12801}, {12,13313}, {12,49665}, {12,50177}, {12,50689}, {12,51201},
    {12,51713}, {12,52225}, {12,52737}, {12,53249}, {6,65535}, {6,65535},
    {6,65535}, {6,65535}, {6,65535}, {6,65535}, {6,65535}, {6,65535},
    {6,65535}, {6,65535}, {6,65535}, {6,65535}, {6,65535}, {6,65535},
    {6,65535}, {6,65535}, {6,65535}, {6,65535}, {6,65535}, {6,65535},
    {6,65535}, {6,65535}, {6,65535}, {6,65535}, {6,65535}, {6,65535},
    {6,65535}, {6,65535}, {6,65535}, {6,65535}, {6,65535}, {6,65535},
    {6,65535}
};

#ifndef MP4DEC_H263_ONLY
static const u32 lmaxIntraTable[15] =
{
    27, 10, 5, 4, 3, 3, 3, 3, 2, 2, 1, 1, 1, 1, 1
};

static const u32 lmaxInterTable[27] =
{
    12, 6, 4, 3, 3, 3, 3, 2, 2, 2, 2, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
};

static const u32 rmaxIntraTableLast[9] =
{
    20, 6, 1, 0, 0, 0, 0, 0, 0
};

static const u32 rmaxIntraTable[28] =
{
    14, 9, 7, 3, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};

static const u32 rmaxInterTable[13] =
{
    26, 10, 6, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0
};

static const u16 rvlcTable1Intra[234] =
{
    1025, 1537, 514, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 2049, 2561, 5, 6, 34305, 34817, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3073, 3585, 1026, 515,
    7, 36353, 36865, 37377, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 4097, 4609, 1538, 2050, 516, 517, 8, 9, 32770, 38913, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 5121, 2562, 1027, 1539, 518, 10, 11, 33282,
    40449, 40961, 41473, 41985, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5633, 6145,
    3074, 3586, 4098, 2051, 1028, 519, 12, 13, 
    14, 43521, 44033, 44545, 0, 0, 0, 0,
    0, 0, 0, 0, 6657, 4610, 2563, 3075, 
    3587, 1540, 1029, 1030, 520, 521, 15, 16,
    17, 32771, 33794, 46081, 0, 0, 0, 0, 
    0, 0, 5122, 2052, 2564, 3076, 1541, 2053,
    522, 18, 19, 22, 33283, 34306, 34818, 47617,
    48129, 48641, 49153, 49665, 0, 0, 0, 0,
    7169, 7681, 5634, 4099, 4611, 3588, 1542, 1031,
    1032, 1033, 523, 20, 21, 23, 32772, 35330,
    35842, 36354, 36866, 37378, 0, 0, 8193, 8705,
    9217, 4100, 2565, 2054, 2566, 1543, 1544, 1034,
    1035, 524, 525, 24, 25, 26, 32773, 33284,
    37890, 38402, 38914, 52225, 27, 1545, 3077, 3589,
    4612, 6146, 9729, 33285, 33795, 39426, 53761, 54273,
    54785, 55297
};

static const u16 rvlcTable1Inter[234] =
{
    3, 1537, 2049, 2561, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 514, 3073, 3585, 4097, 34305, 34817, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1026, 4609, 5121,
    5633, 36353, 36865, 37377, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 5, 6, 515, 1538, 2050, 6145, 6657, 7169, 32770, 38913, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 7, 516, 1027, 2562, 7681, 8193, 8705, 33282,
    40449, 40961, 41473, 41985, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 9,
    517, 1539, 3074, 3586, 4098, 4610, 9217, 9729, 
    10241, 43521, 44033, 44545, 0, 0, 0, 0,
    0, 0, 0, 0, 10, 11, 518, 1028,
    2051, 2563, 5122, 10753, 11265, 11777, 12289, 12801,
    13313, 32771, 33794, 46081, 0, 0, 0, 0,
    0, 0, 12, 519, 1029, 1540, 3075, 3587,
    5634, 13825, 14337, 14849, 33283, 34306, 34818, 47617,
    48129, 48641, 49153, 49665, 0, 0, 0, 0,
    13, 14, 15, 16, 520, 1541, 2052, 2564,
    4099, 6146, 15361, 15873, 16385, 16897, 32772, 35330,
    35842, 36354, 36866, 37378, 0, 0, 17, 18,
    521, 522, 1030, 1031, 1542, 3076, 4611, 6658,
    7170, 7682, 8194, 17409, 17921, 18433, 32773, 33284,
    37890, 38402, 38914, 52225, 19, 1543, 2053, 3588,
    8706, 18945, 19457, 33285, 33795, 39426, 53761, 54273,
    54785, 55297
};

static const u16 rvlcTable2Intra[20] =
{
    33281, 33793, 35329, 35841, 37889, 38401, 39425, 39937, 42497, 43009,
    45057, 45569, 46593, 47105, 50177, 50689, 51201, 51713, 52737, 53249
};

static const u16 rvlcTable2Inter[20] =
{
    33281, 33793, 35329, 35841, 37889, 38401, 39425, 39937, 42497, 43009,
    45057, 45569, 46593, 47105, 50177, 50689, 51201, 51713, 52737, 53249
};

static const u32 rvlcShortIntra[32] =
{
    ERROR,ESCAPE,0x10200,0xFFFF0200,EMPTY,EMPTY,EMPTY,EMPTY,
    EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,
    EMPTY,EMPTY,EMPTY,EMPTY,0x30000,0xFFFD0000,0x18000,0xFFFF8000,
    0x10000,0x10000,0xFFFF0000,0xFFFF0000,0x20000,0x20000,
    0xFFFE0000,0xFFFE0000
};

static const u32 rvlcShortInter[32] =
{
    ERROR,ESCAPE,0x20000,0xFFFE0000,EMPTY,EMPTY,EMPTY,EMPTY,
    EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,EMPTY,
    EMPTY,EMPTY,EMPTY,EMPTY,0x10400,0xFFFF0400,0x18000,0xFFFF8000,
    0x10000,0x10000,0xFFFF0000,0xFFFF0000,0x10200,0x10200,
    0xFFFF0200,0xFFFF0200
};

/*------------------------------------------------------------------------------

   5.1  Function name: SwDec_DecodeIntraVlcBlock

        Purpose: The decode vlc encoded rlc words
                 This function is called for each block

        Input:
            pointer to decContainer_t
            pointer to output data block

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -