📄 vlc.cpp
字号:
#include <math.h>
#include "global.h"
#include <malloc.h>
#include <assert.h>
/**************by guoxq********************/
unsigned char *outDataBuff;
int *ulen,*uinfo;
int *slen,*sinfo1,*sinfo2;
BIT2BYTE bb;
void InitInfoTable()
{
int i,j,k=0;
int value,len;
ulen = (int *)malloc(16384);
uinfo= (int *)malloc(16384);
for(i=0;i<12;i++)
{
len = 2*i+1;
value = (int)pow(2,i);
for(j=0;j<value;j++)
{
ulen[k]=len;
uinfo[k]=(1<<i)|(j&((1<<i)-1));
k++;
}
}
slen = (int *)malloc(16384);
sinfo1=(int *)malloc(16384);
sinfo2=(int *)malloc(16384);
k=0;
slen[k]=1;sinfo1[k]=1;
k++;
for(i=1;i<13;i++)
{
len = 2*i+1;
value = (int)pow(2,i-1);
for(j=0;j<value;j++)
{
slen[k] = len;
sinfo1[k]=(1<<i)|((2*j+1)&((1<<i)-1));
sinfo2[k]=(1<<i)|((2*j)&((1<<i)-1));
k++;
}
}
}
/*void InitCavlcTable()
{
int numcoeff_vlc,numcoeff,numtrailingones;
int totalzeros,run,level;
NumCoeffTable=(int *)malloc(1024*4);
for(numcoeff_vlc=0;numcoeff_vlc<4;numcoeff_vlc++)
for(numcoeff=0;numcoeff<17;numcoeff++)
for(numtrailingones=0;numtrailingones<4;numtrailingones++)
writeSyntaxElement_NumCoeffTrailingOnes(numcoeff_vlc, numcoeff, numtrailingones);
NumCoeffDCTable=(int *)malloc(64*4);
for(numcoeff=0;numcoeff<5;numcoeff++)
for(numtrailingones=0;numtrailingones<4;numtrailingones++)
writeSyntaxElement_NumCoeffTrailingOnesChromaDC(0, numcoeff, numtrailingones);
TotalZerosTable=(int *)malloc(512*4);
for(numcoeff_vlc=0;numcoeff_vlc<16;numcoeff_vlc++)
for(totalzeros=0;totalzeros<16;totalzeros++)
writeSyntaxElement_TotalZeros(totalzeros,numcoeff_vlc);
TotalZerosDCTable=(int *)malloc(32*4);
for(numcoeff_vlc=0;numcoeff_vlc<4;numcoeff_vlc++)
for(totalzeros=0;totalzeros<4;totalzeros++)
writeSyntaxElement_TotalZerosChromaDC(totalzeros,numcoeff_vlc);
RunTable=(int *)malloc(256*4);
for(numcoeff_vlc=0;numcoeff_vlc<7;numcoeff_vlc++)
for(run=0;run<16;run++)
writeSyntaxElement_Run(run,numcoeff_vlc);
LevelTable=(int *)malloc(1024*8*2*4);
for(numcoeff_vlc=0;numcoeff_vlc<7;numcoeff_vlc++)//maybe 7!!!!!!!!!!!!!!!!!!!!!!!!!!!
for(level=-512;level<512;level++)
{
if(level==0) continue;
if(numcoeff_vlc==0)
writeSyntaxElement_Level_VLC1(level);
else
writeSyntaxElement_Level_VLCN(level, numcoeff_vlc);
}
}*/
void freeInfo()
{
free(ulen);
free(uinfo);
free(slen);
free(sinfo1);
free(sinfo2);
}
void InitBits()
{
bb.bExist=0;
bb.cExist=0;
bb.data.ii=0;
}
void PutBits(int n, int val)
{
bb.bExist+=n;
val<<=(32-bb.bExist);
bb.data.ii|=val;
while(bb.bExist>7)
{
*(outDataBuff++)=bb.data.cc[3];
bb.data.ii<<=8;
bb.bExist-=8;
bb.cExist++;
}
}
void AlignBits()
{
PutBits(1,1);
while (bb.bExist!=0) PutBits (1,0);
}
int ue_v (int value)
{
int len,code;
len = ulen[value];
code= uinfo[value];
PutBits(len, code);
return len;
}
int se_v (int value)
{
int len,code;
int absval;
absval =abs(value);
len = slen[absval];
code=(value<=0)? sinfo1[absval]:sinfo2[absval];
PutBits(len, code);
return len;
}
int u_1 (int value)
{
PutBits(1, value);
return 1;
}
int u_v (int n, int value)
{
PutBits(n, value);
return n;
}
int GenerateSeq_parameter_set_rbsp (byte img_format)
{
int len = 0;
u_v(8,0);
u_v(8,0);
u_v(8,0);
u_v(8,1);
u_v(8,0x67);
len+=u_v (8, 88);//profile_idc
len+=u_1 (0); //constrained_set0_flag
len+=u_1 (0); //constrained_set1_flag
len+=u_1 (0); //constrained_set2_flag
len+=u_v (5, 0); //reserved_zero
len+=u_v (8, 21);//level_idc
len+=ue_v (0); //seq_parameter_set_id
len+=ue_v (4); //log2_max_frame_num_minus4
len+=ue_v (0); //pic_order_cnt_type
len+=ue_v (4); //log2_max_pic_order_cnt_lsb_minus4
len+=ue_v (1); //num_ref_frames
len+=u_1 (0); //gaps_in_frame_num_value_allowed_flag
len+=ue_v (10 + img_format*11); //pic_width_in_mbs_minus1,QCIF:10,CIF:21
len+=ue_v (8 + img_format*9); //pic_height_in_map_units_minus1,QCIF:8,CIF,17
len+=u_1 (1); //frame_mbs_only_flag
len+=u_1 (0); //direct_8x8_inference_flag
len+=u_1 (0); //frame_cropping_flag
len+=u_1 (0); //vui_parameters_present_flag
return len;
}
int GeneratePic_parameter_set_rbsp ()
{
int len = 0;
u_v(8,0);
u_v(8,0);
u_v(8,0);
u_v(8,1);
u_v(8,0x68);
len+=ue_v (0); //pic_parameter_set_id
len+=ue_v (0); //seq_parameter_set_id
len+=u_1 (0); //entropy_coding_mode_flag
len+=u_1 (0); //pic_order_present_flag
len+=ue_v (0); //num_slice_groups_minus1
len+=ue_v (0); //num_ref_idx_l0_active_minus1
len+=ue_v (0); //num_ref_idx_l1_active_minus1
len+=u_1 (0); //weighted_pred_flag
len+=u_v (2,0); //weighted_bipred_idc
len+=se_v (0); //pic_init_qp_minus26
len+=se_v (0); //pic_init_qs_minus26
len+=se_v (0); //chroma_qp_index_offset
len+=u_1 (0); //deblocking_filter_control_present_flag
len+=u_1 (0); //constrained_intra_pred_flag
len+=u_1 (0); //redundant_pic_cnt_present_flag
return len;
}
int SliceHeader(int num, int type, int qp)
{
int len = 0;
u_v(8,0);
u_v(8,0);
u_v(8,0);
u_v(8,1);
if(num==0) u_v(8,0x65);
else u_v(8,0x41);
len = ue_v(0); //first_mb_in_slice
len += ue_v(type+5); //slice_type
len += ue_v(0); //pic_parameter_set_id
len += u_v (8,num&0xff); //frame_num
if(num==0)
len += ue_v (0); //idr_pic_id
len += u_v (8,(num<<1)&0xff); //pic_order_cnt_lsb
if (type == P_SLICE)
{
len += u_1 (1); //num_ref_idx_active_override_flag
len += ue_v (0); //num_ref_idx_l0_active_minus1
}
//ref_pic_list_reordering();
if (type!=I_SLICE)
{
len += u_1 (0); //ref_pic_list_reordering_flag_l0
}
//dec_ref_pic_marking();
if (num==0)
{
len += u_1(0); //no_output_of_prior_pics_flag
len += u_1(0); //long_term_reference_flag
}
else
{
len += u_1(0); //adaptive_ref_pic_buffering_flag
}
len += se_v(qp - 26); //slice_qp_delta
return len;
}
int Write_Intra4x4PredictionMode(int mode)
{
int len,inf;
if (mode == -1)
{
len = 1;
inf = 1;
}
else
{
len = 4;
inf = mode;
}
PutBits(len, inf);
return (len);
}
int writeSyntaxElement_NumCoeffTrailingOnes(int numcoeff_vlc, int numcoeff, int numtrailingones)
{
int lentab[3][4][17] =
{
{ // 0702
{ 1, 6, 8, 9,10,11,13,13,13,14,14,15,15,16,16,16,16},
{ 0, 2, 6, 8, 9,10,11,13,13,14,14,15,15,15,16,16,16},
{ 0, 0, 3, 7, 8, 9,10,11,13,13,14,14,15,15,16,16,16},
{ 0, 0, 0, 5, 6, 7, 8, 9,10,11,13,14,14,15,15,16,16},
},
{
{ 2, 6, 6, 7, 8, 8, 9,11,11,12,12,12,13,13,13,14,14},
{ 0, 2, 5, 6, 6, 7, 8, 9,11,11,12,12,13,13,14,14,14},
{ 0, 0, 3, 6, 6, 7, 8, 9,11,11,12,12,13,13,13,14,14},
{ 0, 0, 0, 4, 4, 5, 6, 6, 7, 9,11,11,12,13,13,13,14},
},
{
{ 4, 6, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 9,10,10,10,10},
{ 0, 4, 5, 5, 5, 5, 6, 6, 7, 8, 8, 9, 9, 9,10,10,10},
{ 0, 0, 4, 5, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9,10,10,10},
{ 0, 0, 0, 4, 4, 4, 4, 4, 5, 6, 7, 8, 8, 9,10,10,10},
},
};
int codtab[3][4][17] =
{
{
{ 1, 5, 7, 7, 7, 7,15,11, 8,15,11,15,11,15,11, 7,4},
{ 0, 1, 4, 6, 6, 6, 6,14,10,14,10,14,10, 1,14,10,6},
{ 0, 0, 1, 5, 5, 5, 5, 5,13, 9,13, 9,13, 9,13, 9,5},
{ 0, 0, 0, 3, 3, 4, 4, 4, 4, 4,12,12, 8,12, 8,12,8},
},
{
{ 3,11, 7, 7, 7, 4, 7,15,11,15,11, 8,15,11, 7, 9,7},
{ 0, 2, 7,10, 6, 6, 6, 6,14,10,14,10,14,10,11, 8,6},
{ 0, 0, 3, 9, 5, 5, 5, 5,13, 9,13, 9,13, 9, 6,10,5},
{ 0, 0, 0, 5, 4, 6, 8, 4, 4, 4,12, 8,12,12, 8, 1,4},
},
{
{15,15,11, 8,15,11, 9, 8,15,11,15,11, 8,13, 9, 5,1},
{ 0,14,15,12,10, 8,14,10,14,14,10,14,10, 7,12, 8,4},
{ 0, 0,13,14,11, 9,13, 9,13,10,13, 9,13, 9,11, 7,3},
{ 0, 0, 0,12,11,10, 9, 8,13,12,12,12, 8,12,10, 6,2},
},
};
int vlcnum,len,inf;
vlcnum = numcoeff_vlc;
// se->value1 : numcoeff
// se->value2 : numtrailingones
if (vlcnum == 3)
{
len = 6; // 4 + 2 bit FLC
if (numcoeff > 0)
{
inf = ((numcoeff-1) << 2) | numtrailingones;
}
else
{
inf = 3;
}
}
else
{
len = lentab[vlcnum][numtrailingones][numcoeff];
inf = codtab[vlcnum][numtrailingones][numcoeff];
}
PutBits(len,inf);
return (len);
}
int writeSyntaxElement_NumCoeffTrailingOnesChromaDC(int numcoeff_vlc, int numcoeff, int numtrailingones)
{
int lentab[4][5] =
{
{ 2, 6, 6, 6, 6,},
{ 0, 1, 6, 7, 8,},
{ 0, 0, 3, 7, 8,},
{ 0, 0, 0, 6, 7,},
};
int codtab[4][5] =
{
{1,7,4,3,2},
{0,1,6,3,3},
{0,0,1,2,2},
{0,0,0,5,0},
};
int len,inf;
len = lentab[numtrailingones][numcoeff];
inf = codtab[numtrailingones][numcoeff];
PutBits(len,inf);
return (len);
}
int writeSyntaxElement_Level_VLC1(int value1)
{
int level, levabs, sign;
int len, inf;
level = value1;
levabs = abs(level);
sign = (level < 0 ? 1 : 0);
if (levabs < 8)
{
len = levabs * 2 + sign - 1;
inf = 1;
PutBits(len, inf);
}
else if (levabs < 8+8)
{
// escape code1
len = 14 + 1 + 4;
inf = (1 << 4) | ((levabs - 8) << 1) | sign;
PutBits(len, inf);
}
else
{
// escape code2
len = 14 + 2 + 12;
inf = (0x1 << 12) | ((levabs - 16)<< 1) | sign;
PutBits(16, inf>>12);
PutBits(12, inf&0xfff);
}
return (len);
}
int writeSyntaxElement_Level_VLCN(int value1, int vlc)
{
int iCodeword;
int iLength;
int len, inf;
int level = value1;
int levabs = abs(level);
int sign = (level < 0 ? 1 : 0);
int shift = vlc-1;
int escape = (15<<shift)+1;
int numPrefix = (levabs-1)>>shift;
int sufmask = ~((0xffffffff)<<shift);
int suffix = (levabs-1)&sufmask;
if (levabs < escape)
{
iLength = numPrefix + vlc + 1;
iCodeword = (1<<(shift+1))|(suffix<<1)|sign;
}
else
{
iLength = 28;
iCodeword = (1<<12)|((levabs-escape)<<1)|sign;
}
len = iLength;
inf = iCodeword;
if(len==28)
{
PutBits(16, inf>>12);
PutBits(12, inf&0xfff);
}
else
PutBits(len, inf);
return (len);
}
int writeSyntaxElement_TotalZeros(int value1, int length)
{
int lentab[TOTRUN_NUM][16] =
{
{ 1,3,3,4,4,5,5,6,6,7,7,8,8,9,9,9},
{ 3,3,3,3,3,4,4,4,4,5,5,6,6,6,6},
{ 4,3,3,3,4,4,3,3,4,5,5,6,5,6},
{ 5,3,4,4,3,3,3,4,3,4,5,5,5},
{ 4,4,4,3,3,3,3,3,4,5,4,5},
{ 6,5,3,3,3,3,3,3,4,3,6},
{ 6,5,3,3,3,2,3,4,3,6},
{ 6,4,5,3,2,2,3,3,6},
{ 6,6,4,2,2,3,2,5},
{ 5,5,3,2,2,2,4},
{ 4,4,3,3,1,3},
{ 4,4,2,1,3},
{ 3,3,1,2},
{ 2,2,1},
{ 1,1},
};
int codtab[TOTRUN_NUM][16] =
{
{1,3,2,3,2,3,2,3,2,3,2,3,2,3,2,1},
{7,6,5,4,3,5,4,3,2,3,2,3,2,1,0},
{5,7,6,5,4,3,4,3,2,3,2,1,1,0},
{3,7,5,4,6,5,4,3,3,2,2,1,0},
{5,4,3,7,6,5,4,3,2,1,1,0},
{1,1,7,6,5,4,3,2,1,1,0},
{1,1,5,4,3,3,2,1,1,0},
{1,1,1,3,3,2,2,1,0},
{1,0,1,3,2,1,1,1,},
{1,0,1,3,2,1,1,},
{0,1,1,2,1,3},
{0,1,1,1,1},
{0,1,1,1},
{0,1,1},
{0,1},
};
int vlcnum;
int len, inf;
vlcnum = length;
// se->value1 : TotalZeros
len = lentab[vlcnum][value1];
inf = codtab[vlcnum][value1];
assert(len != 0);
PutBits(len, inf);
return (len);
}
int writeSyntaxElement_TotalZerosChromaDC(int value1, int length)
{
int lentab[3][4] =
{
{ 1, 2, 3, 3,},
{ 1, 2, 2, 0,},
{ 1, 1, 0, 0,},
};
int codtab[3][4] =
{
{ 1, 1, 1, 0,},
{ 1, 1, 0, 0,},
{ 1, 0, 0, 0,},
};
int vlcnum;
int len, inf;
vlcnum = length;
// se->value1 : TotalZeros
len = lentab[vlcnum][value1];
inf = codtab[vlcnum][value1];
PutBits(len, inf);
return (len);
}
int writeSyntaxElement_Run(int value1, int length)
{
int lentab[TOTRUN_NUM][16] =
{
{1,1},
{1,2,2},
{2,2,2,2},
{2,2,2,3,3},
{2,2,3,3,3,3},
{2,3,3,3,3,3,3},
{3,3,3,3,3,3,3,4,5,6,7,8,9,10,11},
};
int codtab[TOTRUN_NUM][16] =
{
{1,0},
{1,1,0},
{3,2,1,0},
{3,2,1,1,0},
{3,2,3,2,1,0},
{3,0,1,3,2,5,4},
{7,6,5,4,3,2,1,1,1,1,1,1,1,1,1},
};
int vlcnum;
int len, inf;
vlcnum = length;
// se->value1 : run
len = lentab[vlcnum][value1];
inf = codtab[vlcnum][value1];
PutBits(len, inf);
return (len);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -