📄 swdec_vlc.c
字号:
/*------------------------------------------------------------------------------
-- --
-- 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 + -