📄 macroblock.c
字号:
out->spatial_temporal_weight_class = 0;
vs_erase_bits(in, 3);
}else if( (code >> 5) == 2 ){
out->macroblock_quant = 0;
out->macroblock_motion_forward = 1;
out->macroblock_motion_backward = 0;
out->macroblock_pattern = 0;
out->macroblock_intra = 0;
out->spatial_temporal_weight_code_flag = 0;
out->spatial_temporal_weight_class = 0;
vs_erase_bits(in, 4);
}else if( (code >> 5) == 3 ){
out->macroblock_quant = 0;
out->macroblock_motion_forward = 1;
out->macroblock_motion_backward = 0;
out->macroblock_pattern = 1;
out->macroblock_intra = 0;
out->spatial_temporal_weight_code_flag = 0;
out->spatial_temporal_weight_class = 0;
vs_erase_bits(in, 4);
}else if( (code >> 3) == 6 ){
out->macroblock_quant = 0;
out->macroblock_motion_forward = 0;
out->macroblock_motion_backward = 1;
out->macroblock_pattern = 0;
out->macroblock_intra = 0;
out->spatial_temporal_weight_code_flag = 1;
vs_erase_bits(in, 6);
}else if( (code >> 3) == 7 ){
out->macroblock_quant = 0;
out->macroblock_motion_forward = 0;
out->macroblock_motion_backward = 1;
out->macroblock_pattern = 1;
out->macroblock_intra = 0;
out->spatial_temporal_weight_code_flag = 1;
vs_erase_bits(in, 6);
}else if( (code >> 3) == 4 ){
out->macroblock_quant = 0;
out->macroblock_motion_forward = 1;
out->macroblock_motion_backward = 0;
out->macroblock_pattern = 0;
out->macroblock_intra = 0;
out->spatial_temporal_weight_code_flag = 1;
vs_erase_bits(in, 6);
}else if( (code >> 3) == 5 ){
out->macroblock_quant = 0;
out->macroblock_motion_forward = 1;
out->macroblock_motion_backward = 0;
out->macroblock_pattern = 1;
out->macroblock_intra = 0;
out->spatial_temporal_weight_code_flag = 1;
vs_erase_bits(in, 6);
}else if( (code >> 2) == 6 ){
out->macroblock_quant = 0;
out->macroblock_motion_forward = 0;
out->macroblock_motion_backward = 0;
out->macroblock_pattern = 0;
out->macroblock_intra = 1;
out->spatial_temporal_weight_code_flag = 0;
out->spatial_temporal_weight_class = 0;
vs_erase_bits(in, 7);
}else if( (code >> 2) == 7 ){
out->macroblock_quant = 1;
out->macroblock_motion_forward = 1;
out->macroblock_motion_backward = 1;
out->macroblock_pattern = 1;
out->macroblock_intra = 0;
out->spatial_temporal_weight_code_flag = 0;
out->spatial_temporal_weight_class = 0;
vs_erase_bits(in, 7);
}else if( (code >> 2) == 4 ){
out->macroblock_quant = 1;
out->macroblock_motion_forward = 1;
out->macroblock_motion_backward = 0;
out->macroblock_pattern = 1;
out->macroblock_intra = 0;
out->spatial_temporal_weight_code_flag = 0;
out->spatial_temporal_weight_class = 0;
vs_erase_bits(in, 7);
}else if( (code >> 2) == 5 ){
out->macroblock_quant = 1;
out->macroblock_motion_forward = 0;
out->macroblock_motion_backward = 1;
out->macroblock_pattern = 1;
out->macroblock_intra = 0;
out->spatial_temporal_weight_code_flag = 0;
out->spatial_temporal_weight_class = 0;
vs_erase_bits(in, 7);
}else if( (code >> 1) == 4 ){
out->macroblock_quant = 1;
out->macroblock_motion_forward = 0;
out->macroblock_motion_backward = 0;
out->macroblock_pattern = 0;
out->macroblock_intra = 1;
out->spatial_temporal_weight_code_flag = 0;
out->spatial_temporal_weight_class = 0;
vs_erase_bits(in, 8);
}else if( (code >> 1) == 5 ){
out->macroblock_quant = 1;
out->macroblock_motion_forward = 1;
out->macroblock_motion_backward = 0;
out->macroblock_pattern = 1;
out->macroblock_intra = 0;
out->spatial_temporal_weight_code_flag = 1;
vs_erase_bits(in, 8);
}else if(code == 12){
out->macroblock_quant = 1;
out->macroblock_motion_forward = 0;
out->macroblock_motion_backward = 1;
out->macroblock_pattern = 1;
out->macroblock_intra = 0;
out->spatial_temporal_weight_code_flag = 1;
vs_erase_bits(in, 9);
}else if(code == 14){
out->macroblock_quant = 0;
out->macroblock_motion_forward = 0;
out->macroblock_motion_backward = 0;
out->macroblock_pattern = 0;
out->macroblock_intra = 0;
out->spatial_temporal_weight_code_flag = 0;
out->spatial_temporal_weight_class = 4;
vs_erase_bits(in, 9);
}else if(code == 13){
out->macroblock_quant = 1;
out->macroblock_motion_forward = 0;
out->macroblock_motion_backward = 0;
out->macroblock_pattern = 1;
out->macroblock_intra = 0;
out->spatial_temporal_weight_code_flag = 0;
out->spatial_temporal_weight_class = 4;
vs_erase_bits(in, 9);
}else if(code == 15){
out->macroblock_quant = 0;
out->macroblock_motion_forward = 0;
out->macroblock_motion_backward = 0;
out->macroblock_pattern = 1;
out->macroblock_intra = 0;
out->spatial_temporal_weight_code_flag = 0;
out->spatial_temporal_weight_class = 4;
vs_erase_bits(in, 9);
}else{
return 0;
}
return 1;
}
int read_macroblock_type_p_spatial_scalability(VIDEO_STREAM *in, MACROBLOCK *out)
{
int code;
code = vs_read_bits(in, 7);
if( (code >> 5) == 2 ){
out->macroblock_quant = 0;
out->macroblock_motion_forward = 1;
out->macroblock_motion_backward = 0;
out->macroblock_pattern = 1;
out->macroblock_intra = 0;
out->spatial_temporal_weight_code_flag = 0;
out->spatial_temporal_weight_class = 0;
vs_erase_bits(in, 2);
}else if( (code >> 4) == 3 ){
out->macroblock_quant = 0;
out->macroblock_motion_forward = 1;
out->macroblock_motion_backward = 0;
out->macroblock_pattern = 1;
out->macroblock_intra = 0;
out->spatial_temporal_weight_code_flag = 0;
out->spatial_temporal_weight_class = 0;
vs_erase_bits(in, 3);
}else if(code == 4){
out->macroblock_quant = 0;
out->macroblock_motion_forward = 0;
out->macroblock_motion_backward = 0;
out->macroblock_pattern = 1;
out->macroblock_intra = 0;
out->spatial_temporal_weight_code_flag = 0;
out->spatial_temporal_weight_class = 0;
vs_erase_bits(in, 7);
}else if( (code >> 1) == 7 ){
out->macroblock_quant = 1;
out->macroblock_motion_forward = 1;
out->macroblock_motion_backward = 0;
out->macroblock_pattern = 1;
out->macroblock_intra = 0;
out->spatial_temporal_weight_code_flag = 0;
out->spatial_temporal_weight_class = 0;
vs_erase_bits(in, 6);
}else if( (code >> 3) == 2 ){
out->macroblock_quant = 0;
out->macroblock_motion_forward = 1;
out->macroblock_motion_backward = 0;
out->macroblock_pattern = 0;
out->macroblock_intra = 0;
out->spatial_temporal_weight_code_flag = 0;
out->spatial_temporal_weight_class = 0;
vs_erase_bits(in, 4);
}else if(code == 7){
out->macroblock_quant = 0;
out->macroblock_motion_forward = 0;
out->macroblock_motion_backward = 0;
out->macroblock_pattern = 0;
out->macroblock_intra = 1;
out->spatial_temporal_weight_code_flag = 0;
out->spatial_temporal_weight_class = 0;
vs_erase_bits(in, 7);
}else if( (code >> 3) == 3 ){
out->macroblock_quant = 0;
out->macroblock_motion_forward = 1;
out->macroblock_motion_backward = 0;
out->macroblock_pattern = 0;
out->macroblock_intra = 0;
out->spatial_temporal_weight_code_flag = 1;
vs_erase_bits(in, 4);
}else if( (code >> 4) == 2 ){
out->macroblock_quant = 1;
out->macroblock_motion_forward = 1;
out->macroblock_motion_backward = 0;
out->macroblock_pattern = 1;
out->macroblock_intra = 0;
out->spatial_temporal_weight_code_flag = 0;
out->spatial_temporal_weight_class = 0;
vs_erase_bits(in, 3);
}else if( (code >> 1) == 4 ){
out->macroblock_quant = 1;
out->macroblock_motion_forward = 0;
out->macroblock_motion_backward = 0;
out->macroblock_pattern = 1;
out->macroblock_intra = 0;
out->spatial_temporal_weight_code_flag = 0;
out->spatial_temporal_weight_class = 0;
vs_erase_bits(in, 6);
}else if(code == 6){
out->macroblock_quant = 1;
out->macroblock_motion_forward = 0;
out->macroblock_motion_backward = 0;
out->macroblock_pattern = 0;
out->macroblock_intra = 1;
out->spatial_temporal_weight_code_flag = 0;
out->spatial_temporal_weight_class = 0;
vs_erase_bits(in, 7);
}else if( (code >> 5) == 3 ){
out->macroblock_quant = 1;
out->macroblock_motion_forward = 1;
out->macroblock_motion_backward = 0;
out->macroblock_pattern = 1;
out->macroblock_intra = 0;
out->spatial_temporal_weight_code_flag = 1;
vs_erase_bits(in, 2);
}else if( (code >> 1) == 5 ){
out->macroblock_quant = 1;
out->macroblock_motion_forward = 0;
out->macroblock_motion_backward = 0;
out->macroblock_pattern = 1;
out->macroblock_intra = 0;
out->spatial_temporal_weight_code_flag = 1;
vs_erase_bits(in, 6);
}else if( (code >> 1) == 6){
out->macroblock_quant = 0;
out->macroblock_motion_forward = 0;
out->macroblock_motion_backward = 0;
out->macroblock_pattern = 0;
out->macroblock_intra = 0;
out->spatial_temporal_weight_code_flag = 1;
vs_erase_bits(in, 6);
}else if(code == 5){
out->macroblock_quant = 0;
out->macroblock_motion_forward = 0;
out->macroblock_motion_backward = 0;
out->macroblock_pattern = 1;
out->macroblock_intra = 0;
out->spatial_temporal_weight_code_flag = 0;
out->spatial_temporal_weight_class = 4;
vs_erase_bits(in, 7);
}else if(code == 2){
out->macroblock_quant = 1;
out->macroblock_motion_forward = 0;
out->macroblock_motion_backward = 0;
out->macroblock_pattern = 1;
out->macroblock_intra = 0;
out->spatial_temporal_weight_code_flag = 0;
out->spatial_temporal_weight_class = 4;
vs_erase_bits(in, 7);
}else if(code == 3){
out->macroblock_quant = 0;
out->macroblock_motion_forward = 0;
out->macroblock_motion_backward = 0;
out->macroblock_pattern = 0;
out->macroblock_intra = 0;
out->spatial_temporal_weight_code_flag = 0;
out->spatial_temporal_weight_class = 4;
vs_erase_bits(in, 7);
}else{
return 0;
}
return 1;
}
int read_macroblock_type_i_spatial_scalability(VIDEO_STREAM *in, MACROBLOCK *out)
{
int code;
code = vs_read_bits(in, 4);
if( (code >> 3) == 1){
out->macroblock_quant = 0;
out->macroblock_motion_forward = 0;
out->macroblock_motion_backward = 0;
out->macroblock_pattern = 1;
out->macroblock_intra = 0;
out->spatial_temporal_weight_code_flag = 0;
out->spatial_temporal_weight_class = 4;
vs_erase_bits(in, 1);
}else if( (code >> 2) == 1 ){
out->macroblock_quant = 1;
out->macroblock_motion_forward = 0;
out->macroblock_motion_backward = 0;
out->macroblock_pattern = 1;
out->macroblock_intra = 0;
out->spatial_temporal_weight_code_flag = 0;
out->spatial_temporal_weight_class = 4;
vs_erase_bits(in, 2);
}else if(code == 3){
out->macroblock_quant = 0;
out->macroblock_motion_forward = 0;
out->macroblock_motion_backward = 0;
out->macroblock_pattern = 0;
out->macroblock_intra = 1;
out->spatial_temporal_weight_code_flag = 0;
out->spatial_temporal_weight_class = 0;
vs_erase_bits(in, 4);
}else if(code == 2){
out->macroblock_quant = 1;
out->macroblock_motion_forward = 0;
out->macroblock_motion_backward = 0;
out->macroblock_pattern = 0;
out->macroblock_intra = 1;
out->spatial_temporal_weight_code_flag = 0;
out->spatial_temporal_weight_class = 0;
vs_erase_bits(in, 4);
}else if(code == 1){
out->macroblock_quant = 0;
out->macroblock_motion_forward = 0;
out->macroblock_motion_backward = 0;
out->macroblock_pattern = 0;
out->macroblock_intra = 0;
out->spatial_temporal_weight_code_flag = 0;
out->spatial_temporal_weight_class = 4;
vs_erase_bits(in, 4);
}else{
return 0;
}
return 1;
}
/*
QUANT 0010 0000 0000
MFWD 0001 0000 0000
MBWD 0000 1000 0000
PTTN 0000 0100 0000
INTR 0000 0010 0000
STCF 0000 0001 0000
CLSS
*/
int read_macroblock_type_b(VIDEO_STREAM *in, MACROBLOCK *out)
{
int code;
static const BASIC_VLC_ELEMENT table[] = {
{0x220,6},{0x2C0,6},{0x340,6},{0x3C0,5},{0x3C0,5},{0x020,5},{0x020,5},
{0x100,4},{0x100,4},{0x100,4},{0x100,4},{0x140,4},{0x140,4},{0x140,4},{0x140,4},
{0x080,3},{0x080,3},{0x080,3},{0x080,3},{0x080,3},{0x080,3},{0x080,3},{0x080,3},
{0x0C0,3},{0x0C0,3},{0x0C0,3},{0x0C0,3},{0x0C0,3},{0x0C0,3},{0x0C0,3},{0x0C0,3},
{0x180,2},{0x180,2},{0x180,2},{0x180,2},{0x180,2},{0x180,2},{0x180,2},{0x180,2},
{0x180,2},{0x180,2},{0x180,2},{0x180,2},{0x180,2},{0x180,2},{0x180,2},{0x180,2},
{0x1C0,2},{0x1C0,2},{0x1C0,2},{0x1C0,2},{0x1C0,2},{0x1C0,2},{0x1C0,2},{0x1C0,2},
{0x1C0,2},{0x1C0,2},{0x1C0,2},{0x1C0,2},{0x1C0,2},{0x1C0,2},{0x1C0,2},{0x1C0,2},
};
code = vs_read_bits(in, 6);
if(code == 0){
return 0;
}
code -= 1;
vs_erase_bits(in, table[code].length);
out->macroblock_quant = (table[code].value >> 9) & 1;
out->macroblock_motion_forward = (table[code].value >> 8) & 1;
out->macroblock_motion_backward = (table[code].value >> 7) & 1;
out->macroblock_pattern = (table[code].value >> 6) & 1;
out->macroblock_intra = (table[code].value >> 5) & 1;
out->spatial_temporal_weight_code_flag = 0;
out->spatial_temporal_weight_class = 0;
return 1;
}
int read_macroblock_type_p(VIDEO_STREAM *in, MACROBLOCK *out)
{
int code;
static const BASIC_VLC_ELEMENT table[] = {
{0x220,6},{0x240,5},{0x240,5},{0x340,5},{0x340,5},{0x020,5},{0x020,5},
{0x100,3},{0x100,3},{0x100,3},{0x100,3},{0x100,3},{0x100,3},{0x100,3},{0x100,3},
{0x040,2},{0x040,2},{0x040,2},{0x040,2},{0x040,2},{0x040,2},{0x040,2},{0x040,2},
{0x040,2},{0x040,2},{0x040,2},{0x040,2},{0x040,2},{0x040,2},{0x040,2},{0x040,2},
{0x140,1},{0x140,1},{0x140,1},{0x140,1},{0x140,1},{0x140,1},{0x140,1},{0x140,1},
{0x140,1},{0x140,1},{0x140,1},{0x140,1},{0x140,1},{0x140,1},{0x140,1},{0x140,1},
{0x140,1},{0x140,1},{0x140,1},{0x140,1},{0x140,1},{0x140,1},{0x140,1},{0x140,1},
{0x140,1},{0x140,1},{0x140,1},{0x140,1},{0x140,1},{0x140,1},{0x140,1},{0x140,1},
};
code = vs_read_bits(in, 6);
if(code == 0){
return 0;
}
code -= 1;
vs_erase_bits(in, table[code].length);
out->macroblock_quant = (table[code].value >> 9) & 1;
out->macroblock_motion_forward = (table[code].value >> 8) & 1;
out->macroblock_motion_backward = 0;
out->macroblock_pattern = (table[code].value >> 6) & 1;
out->macroblock_intra = (table[code].value >> 5) & 1;
out->spatial_temporal_weight_code_flag = 0;
out->spatial_temporal_weight_class = 0;
return 1;
}
int read_macroblock_type_i(VIDEO_STREAM *in, MACROBLOCK *out)
{
int code;
static const BASIC_VLC_ELEMENT table[] = {
{0x220,2},{0x020,1},{0x020,1},
};
code = vs_read_bits(in, 2);
if(code == 0){
return 0;
}
code -= 1;
vs_erase_bits(in, table[code].length);
out->macroblock_quant = (table[code].value >> 9) & 1;
out->macroblock_motion_forward = 0;
out->macroblock_motion_backward = 0;
out->macroblock_pattern = 0;
out->macroblock_intra = (table[code].value >> 5) & 1;
out->spatial_temporal_weight_code_flag = 0;
out->spatial_temporal_weight_class = 0;
return 1;
}
int read_macroblock_type_d(VIDEO_STREAM *in, MACROBLOCK *out)
{
int code;
code = vs_read_bits(in, 2);
if(code == 3){
out->macroblock_quant = 0;
out->macroblock_motion_forward = 0;
out->macroblock_motion_backward = 0;
out->macroblock_pattern = 0;
out->macroblock_intra = 1;
out->spatial_temporal_weight_code_flag = 0;
out->spatial_temporal_weight_class = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -