📄 dec_cavlc.c
字号:
/*****************************************************************************
*
* T264 AVC CODEC
*
* Copyright(C) 2004-2005 llcc <lcgate1@yahoo.com.cn>
* 2004-2005 visionany <visionany@yahoo.com.cn>
* 2005.3.2 CloudWu<sywu@sohu.com> added support for B-frame MB16x8 and MB8x16,MB8x8 support
*
* This program is free software ; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
****************************************************************************/
#include "stdio.h"
#include "T264.h"
#include "bitstream.h"
#include "utility.h"
#ifndef CHIP_DM642
#include "memory.h"
#endif
#include "assert.h"
#include "cavlc.h"
#include "inter.h"
#define BLOCK_INDEX_CHROMA_DC (-1)
#define BLOCK_INDEX_LUMA_DC (-2)
#define INITINVALIDVEC(vec) vec.refno = -1; vec.x = vec.y = 0;
typedef struct
{
uint8_t len;
uint8_t trailing_ones;
uint8_t total_coeff;
} vlc_coeff_token_t;
#define VLC(a, b, c) {a, b, c}
#define VLC2(a, b, c) VLC(a, b, c), VLC(a, b, c)
#define VLC4(a, b, c) VLC2(a, b, c), VLC2(a, b, c)
static const uint8_t i16x16_eg_to_cbp[26][3] =
{
0, 0, 0, 0, 0, 0, 1, 0, 0, 2, 0, 0, 3, 0, 0,
0, 1, 0, 1, 1, 0, 2, 1, 0, 3, 1, 0, 0, 2, 0,
1, 2, 0, 2, 2, 0, 3, 2, 0, 0, 0, 15, 1, 0, 15,
2, 0, 15, 3, 0, 15, 0, 1, 15, 1, 1, 15, 2, 1, 15,
3, 1, 15, 0, 2, 15, 1, 2, 15, 2, 2, 15, 3, 2, 15
};
static const uint8_t i4x4_eg_to_cbp[48] =
{
47, 31, 15, 0, 23, 27, 29, 30, 7, 11, 13, 14, 39, 43, 45,
46, 16, 3, 5, 10, 12, 19, 21, 26, 28, 35, 37, 42, 44, 1,
2, 4, 8, 17, 18, 20, 24, 6, 9, 22, 25, 32, 33, 34, 36, 40,
38, 41
};
static const uint8_t inter_eg_to_cbp[48] =
{
0, 16, 1, 2, 4, 8, 32, 3, 5, 10, 12, 15, 47, 7, 11, 13, 14,
6, 9, 31, 35, 37, 42, 44, 33, 34, 36, 40, 39, 43, 45, 46, 17,
18, 20, 24, 19, 21, 26, 28, 23, 27, 29, 30, 22, 25, 38, 41
};
/* ++ cavlc tables ++ */
static const vlc_coeff_token_t coeff4_0[] =
{
VLC(6, 0, 2), /* 0001 00 */
VLC(6, 3, 3), /* 0001 01 */
VLC(6, 1, 2), /* 0001 10 */
VLC(6, 0, 1), /* 0001 11 */
};
static const vlc_coeff_token_t coeff4_1[] =
{
VLC2(7, 3, 4), /* 0000 000(0) */
VLC(8, 2, 4), /* 0000 0010 */
VLC(8, 1, 4), /* 0000 0011 */
VLC2(7, 2, 3), /* 0000 010(0) */
VLC2(7, 1, 3), /* 0000 011(0) */
VLC4(6, 0, 4), /* 0000 10(00) */
VLC4(6, 0, 3), /* 0000 11(00) */
};
static const vlc_coeff_token_t coeff3_0[] =
{
VLC(6, 0, 1), /* 0000 00 */
VLC(6, 1, 1), /* 0000 01 */
VLC(-1, -1, -1), /* 0000 10 */
VLC(6, 0, 0), /* 0000 11 */
VLC(6, 0, 2), /* 0001 00 */
VLC(6, 1, 2), /* 0001 01 */
VLC(6, 2, 2), /* 0001 10 */
VLC(-1, -1, -1), /* 0001 11 */
VLC(6, 0, 3), /* 0010 00 */
VLC(6, 1, 3), /* 0010 01 */
VLC(6, 2, 3), /* 0010 10 */
VLC(6, 3, 3), /* 0010 11 */
VLC(6, 0, 4), /* 0011 00 */
VLC(6, 1, 4), /* 0011 01 */
VLC(6, 2, 4), /* 0011 10 */
VLC(6, 3, 4), /* 0011 11 */
VLC(6, 0, 5), /* 0100 00 */
VLC(6, 1, 5), /* 0100 01 */
VLC(6, 2, 5), /* 0100 10 */
VLC(6, 3, 5), /* 0100 11 */
VLC(6, 0, 6), /* 0101 00 */
VLC(6, 1, 6), /* 0101 01 */
VLC(6, 2, 6), /* 0101 10 */
VLC(6, 3, 6), /* 0101 11 */
VLC(6, 0, 7), /* 0110 00 */
VLC(6, 1, 7), /* 0110 01 */
VLC(6, 2, 7), /* 0110 10 */
VLC(6, 3, 7), /* 0110 11 */
VLC(6, 0, 8),
VLC(6, 1, 8),
VLC(6, 2, 8),
VLC(6, 3, 8),
VLC(6, 0, 9),
VLC(6, 1, 9),
VLC(6, 2, 9),
VLC(6, 3, 9),
VLC(6, 0, 10),
VLC(6, 1, 10),
VLC(6, 2, 10),
VLC(6, 3, 10),
VLC(6, 0, 11),
VLC(6, 1, 11),
VLC(6, 2, 11),
VLC(6, 3, 11),
VLC(6, 0, 12),
VLC(6, 1, 12),
VLC(6, 2, 12),
VLC(6, 3, 12),
VLC(6, 0, 13),
VLC(6, 1, 13),
VLC(6, 2, 13),
VLC(6, 3, 13),
VLC(6, 0, 14),
VLC(6, 1, 14),
VLC(6, 2, 14),
VLC(6, 3, 14),
VLC(6, 0, 15),
VLC(6, 1, 15),
VLC(6, 2, 15),
VLC(6, 3, 15),
VLC(6, 0, 16),
VLC(6, 1, 16),
VLC(6, 2, 16),
VLC(6, 3, 16)
};
static const vlc_coeff_token_t coeff2_0[] =
{
VLC(4, 3, 7), /* 1000 */
VLC(4, 3, 6), /* 1001 */
VLC(4, 3, 5), /* 1010 */
VLC(4, 3, 4), /* 1011 */
VLC(4, 3, 3), /* 1100 */
VLC(4, 2, 2), /* 1101 */
VLC(4, 1, 1), /* 1110 */
VLC(4, 0, 0), /* 1111 */
};
static const vlc_coeff_token_t coeff2_1[] =
{
VLC(5, 1, 5), /* 0100 0 */
VLC(5, 2, 5),
VLC(5, 1, 4),
VLC(5, 2, 4),
VLC(5, 1, 3),
VLC(5, 3, 8),
VLC(5, 2, 3),
VLC(5, 1, 2),
};
static const vlc_coeff_token_t coeff2_2[] =
{
VLC(6, 0, 3), /* 0010 00 */
VLC(6, 2, 7),
VLC(6, 1, 7),
VLC(6, 0, 2),
VLC(6, 3, 9),
VLC(6, 2, 6),
VLC(6, 1, 6),
VLC(6, 0, 1),
};
static const vlc_coeff_token_t coeff2_3[] =
{
VLC(7, 0, 7), /* 0001 000 */
VLC(7, 0, 6),
VLC(7, 2, 9),
VLC(7, 0, 5),
VLC(7, 3, 10),
VLC(7, 2, 8),
VLC(7, 1, 8),
VLC(7, 0, 4),
};
static const vlc_coeff_token_t coeff2_4[] =
{
VLC(8, 3, 12), /* 0000 1000 */
VLC(8, 2, 11),
VLC(8, 1, 10),
VLC(8, 0, 9),
VLC(8, 3, 11),
VLC(8, 2, 10),
VLC(8, 1, 9),
VLC(8, 0, 8),
};
static const vlc_coeff_token_t coeff2_5[] =
{
VLC(9, 0, 12), /* 0000 0100 0 */
VLC(9, 2, 13),
VLC(9, 1, 12),
VLC(9, 0, 11),
VLC(9, 3, 13),
VLC(9, 2, 12),
VLC(9, 1, 11),
VLC(9, 0, 10),
};
static const vlc_coeff_token_t coeff2_6[] =
{
VLC(-1, -1, -1), /* 0000 0000 00 */
VLC(10, 0, 16), /* 0000 0000 01 */
VLC(10, 3, 16), /* 0000 0000 10 */
VLC(10, 2, 16), /* 0000 0000 11 */
VLC(10, 1, 16), /* 0000 0001 00 */
VLC(10, 0, 15), /* 0000 0001 01 */
VLC(10, 3, 15), /* 0000 0001 10 */
VLC(10, 2, 15), /* 0000 0001 11 */
VLC(10, 1, 15), /* 0000 0010 00 */
VLC(10, 0, 14),
VLC(10, 3, 14),
VLC(10, 2, 14),
VLC(10, 1, 14),
VLC(10, 0, 13),
VLC2(9, 1, 13), /* 0000 0011 1(0) */
};
static const vlc_coeff_token_t coeff1_0[] =
{
VLC(4, 3, 4), /* 0100 */
VLC(4, 3, 3), /* 0101 */
VLC2(3, 2, 2), /* 011(0) */
VLC4(2, 1, 1), /* 10 */
VLC4(2, 0, 0), /* 11 */
};
static const vlc_coeff_token_t coeff1_1[] =
{
VLC(6, 3, 7), /* 0001 00 */
VLC(6, 2, 4), /* 0001 01 */
VLC(6, 1, 4), /* 0001 10 */
VLC(6, 0, 2), /* 0001 11 */
VLC(6, 3, 6), /* 0010 00 */
VLC(6, 2, 3), /* 0010 01 */
VLC(6, 1, 3), /* 0010 10 */
VLC(6, 0, 1), /* 0010 11*/
VLC2(5, 3, 5), /* 0011 0(0)*/
VLC2(5, 1, 2), /* 0011 1(0)*/
};
static const vlc_coeff_token_t coeff1_2[] =
{
VLC(9, 3, 9), /* 0000 0010 0 */
VLC(9, 2, 7), /* 0000 0010 1 */
VLC(9, 1, 7), /* 0000 0011 0 */
VLC(9, 0, 6), /* 0000 0011 1 */
VLC2(8, 0, 5), /* 0000 0100 */
VLC2(8, 2, 6), /* 0000 0101 */
VLC2(8, 1, 6), /* 0000 0110 */
VLC2(8, 0, 4), /* 0000 0111 */
VLC4(7, 3, 8), /* 0000 100 */
VLC4(7, 2, 5), /* 0000 101 */
VLC4(7, 1, 5), /* 0000 110 */
VLC4(7, 0, 3), /* 0000 111 */
};
static const vlc_coeff_token_t coeff1_3[] =
{
VLC(11, 3, 11), /* 0000 0001 000 */
VLC(11, 2, 9), /* 0000 0001 001 */
VLC(11, 1, 9), /* 0000 0001 010 */
VLC(11, 0, 8), /* 0000 0001 011 */
VLC(11, 3, 10), /* 0000 0001 100 */
VLC(11, 2, 8), /* 0000 0001 101 */
VLC(11, 1, 8), /* 0000 0001 110 */
VLC(11, 0, 7), /* 0000 0001 111 */
};
static const vlc_coeff_token_t coeff1_4[] =
{
VLC(12, 0, 11), /* 0000 0000 1000 */
VLC(12, 2, 11), /* 0000 0000 1001 */
VLC(12, 1, 11), /* 0000 0000 1010 */
VLC(12, 0, 10), /* 0000 0000 1011 */
VLC(12, 3, 12), /* 0000 0000 1100 */
VLC(12, 2, 10), /* 0000 0000 1101 */
VLC(12, 1, 10), /* 0000 0000 1110 */
VLC(12, 0, 9), /* 0000 0000 1111 */
};
static const vlc_coeff_token_t coeff1_5[] =
{
VLC(13, 3, 14), /* 0000 0000 0100 0 */
VLC(13, 2, 13), /* 0000 0000 0100 1 */
VLC(13, 1, 13), /* 0000 0000 0101 0 */
VLC(13, 0, 13), /* 0000 0000 0101 1 */
VLC(13, 3, 13), /* 0000 0000 0110 0 */
VLC(13, 2, 12), /* 0000 0000 0110 1 */
VLC(13, 1, 12), /* 0000 0000 0111 0 */
VLC(13, 0, 12), /* 0000 0000 0111 1 */
};
static const vlc_coeff_token_t coeff1_6[] =
{
VLC2(-1, -1, -1), /* 0000 0000 0000 00 */
VLC2(13, 3, 15), /* 0000 0000 0000 1(0) */
VLC(14, 3, 16), /* 0000 0000 0001 00 */
VLC(14, 2, 16), /* 0000 0000 0001 01 */
VLC(14, 1, 16), /* 0000 0000 0001 10 */
VLC(14, 0, 16), /* 0000 0000 0001 11 */
VLC(14, 1, 15), /* 0000 0000 0010 00 */
VLC(14, 0, 15), /* 0000 0000 0010 01 */
VLC(14, 2, 15), /* 0000 0000 0010 10 */
VLC(14, 1, 14), /* 0000 0000 0010 11 */
VLC2(13, 2, 14), /* 0000 0000 0011 0(0) */
VLC2(13, 0, 14), /* 0000 0000 0011 1(0) */
};
static const vlc_coeff_token_t coeff0_0[] =
{
VLC2(-1, -1, -1), /* 0000 0000 0000 000(0) */
VLC2(15, 1, 13), /* 0000 0000 0000 001(0) */
VLC(16, 0, 16), /* 0000 0000 0000 0100 */
VLC(16, 2, 16),
VLC(16, 1, 16),
VLC(16, 0, 15),
VLC(16, 3, 16),
VLC(16, 2, 15),
VLC(16, 1, 15),
VLC(16, 0, 14),
VLC(16, 3, 15),
VLC(16, 2, 14),
VLC(16, 1, 14),
VLC(16, 0, 13), /* 0000 0000 0000 1111 */
VLC2(15, 3, 14), /* 0000 0000 0001 000(0) */
VLC2(15, 2, 13),
VLC2(15, 1, 12),
VLC2(15, 0, 12),
VLC2(15, 3, 13),
VLC2(15, 2, 12),
VLC2(15, 1, 11),
VLC2(15, 0, 11), /* 0000 0000 0001 111(0) */
VLC4(14, 3, 12), /* 0000 0000 0010 00(00) */
VLC4(14, 2, 11),
VLC4(14, 1, 10),
VLC4(14, 0, 10),
VLC4(14, 3, 11),
VLC4(14, 2, 10),
VLC4(14, 1, 9),
VLC4(14, 0, 9), /* 0000 0000 0011 11(00) */
};
static const vlc_coeff_token_t coeff0_1[] =
{
VLC(13, 0, 8), /* 0000 0000 0100 0 */
VLC(13, 2, 9),
VLC(13, 1, 8),
VLC(13, 0, 7),
VLC(13, 3, 10),
VLC(13, 2, 8),
VLC(13, 1, 7),
VLC(13, 0, 6), /* 0000 0000 0111 1 */
};
static const vlc_coeff_token_t coeff0_2[] =
{
VLC(11, 3, 9), /* 0000 0000 100 */
VLC(11, 2, 7),
VLC(11, 1, 6),
VLC(11, 0, 5), /* 0000 0000 111 */
VLC2(10, 3, 8), /* 0000 0001 00(0) */
VLC2(10, 2, 6),
VLC2(10, 1, 5),
VLC2(10, 0, 4), /* 0000 0001 11(0) */
VLC4(9, 3, 7), /* 0000 0010 0(0) */
VLC4(9, 2, 5),
VLC4(9, 1, 4),
VLC4(9, 0, 3), /* 0000 0011 1(0) */
};
static const vlc_coeff_token_t coeff0_3[] =
{
VLC(8, 3, 6), /* 0000 0100 */
VLC(8, 2, 4),
VLC(8, 1, 3),
VLC(8, 0, 2),
VLC2(7, 3, 5), /* 0000 100 */
VLC2(7, 2, 3),
VLC4(6, 3, 4), /* 0000 11 */
};
static const vlc_coeff_token_t coeff0_4[] =
{
VLC(6, 1, 2), /* 0001 00 */
VLC(6, 0, 1), /* 0001 01 */
VLC2(5, 3, 3) /* 0001 1 */
};
static const vlc_coeff_token_t coeff0_5[] =
{
VLC(-1, -1, -1), /* 000 */
VLC(3, 2, 2), /* 001 */
VLC2(2, 1, 1), /* 01 */
VLC4(1, 0, 0) /* 1 */
};
static const uint8_t prefix_table0[] =
{
-1,
3,
2, 2,
1, 1, 1, 1,
0, 0, 0, 0, 0, 0, 0, 0
};
static const uint8_t prefix_table1[] =
{
-1,
7,
6, 6,
5, 5, 5, 5,
4, 4, 4, 4, 4, 4, 4, 4
};
static const uint8_t prefix_table2[] =
{
-1,
11,
10, 10,
9, 9, 9, 9,
8, 8, 8, 8, 8, 8, 8, 8
};
static const uint8_t prefix_table3[] =
{
-1,
15,
14, 14,
13, 13, 13, 13,
12, 12, 12, 12, 12, 12, 12, 12
};
#undef VLC
#undef VLC2
#undef VLC4
#define VLC(a, b) {a, b}
#define VLC2(a, b) VLC(a, b), VLC(a, b)
#define VLC4(a, b) VLC2(a, b), VLC2(a, b)
#define VLC8(a, b) VLC4(a, b), VLC4(a, b)
typedef struct
{
uint8_t num;
uint8_t len;
} zero_count_t;
static const zero_count_t total_zero_table1_0[] =
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -