📄 countbit.c
字号:
else if (pmv0 > 32 && x_vec > 63) x_vec -= 64;
if (pmv1 < -31 && y_vec < -63) y_vec += 64;
else if (pmv1 > 32 && y_vec > 63) y_vec -= 64;
}
if (x_vec < 0) x_vec += 64;
if (y_vec < 0) y_vec += 64;
if (trace) {
fprintf(tf,"Vectors:\n");
}
bits->vec += AR_Encode(indexfn(x_vec,mvdtab,64),cumf_MVD);
bits->vec += AR_Encode(indexfn(y_vec,mvdtab,64),cumf_MVD);
if (trace) {
if (x_vec > 31) x_vec -= 64;
if (y_vec > 31) y_vec -= 64;
fprintf(tf,"(x,y) = (%d,%d) - ",
(2*MV[block][y][x]->x + MV[block][y][x]->x_half),
(2*MV[block][y][x]->y + MV[block][y][x]->y_half));
fprintf(tf,"(Px,Py) = (%d,%d)\n", pmv0,pmv1);
fprintf(tf,"(x_diff,y_diff) = (%d,%d)\n",x_vec,y_vec);
}
}
/* PB-frames delta vectors */
if (pic->PB)
if (pic->MODB == PBMODE_MVDB || pic->MODB == PBMODE_CBPB_MVDB) {
x_vec = MV[5][y][x]->x;
y_vec = MV[5][y][x]->y;
if (x_vec < -32)
x_vec += 64;
else if (x_vec > 31)
x_vec -= 64;
if (y_vec < -32)
y_vec += 64;
else if (y_vec > 31)
y_vec -= 64;
if (x_vec < 0) x_vec += 64;
if (y_vec < 0) y_vec += 64;
if (trace) {
fprintf(tf,"PB delta vectors:\n");
}
bits->vec += AR_Encode(indexfn(x_vec,mvdtab,64),cumf_MVD);
bits->vec += AR_Encode(indexfn(y_vec,mvdtab,64),cumf_MVD);
if (trace) {
if (x_vec > 31) x_vec -= 64;
if (y_vec > 31) y_vec -= 64;
fprintf(tf,"MVDB (x,y) = (%d,%d)\n",x_vec,y_vec);
}
}
return;
}
void FindPMV(MotionVector *MV[6][MBR+1][MBC+2], int x, int y,
int *pmv0, int *pmv1, int block, int newgob, int half_pel)
{
int p1,p2,p3;
int xin1,xin2,xin3;
int yin1,yin2,yin3;
int vec1,vec2,vec3;
int l8,o8,or8;
l8 = o8 = or8 = 0;
if (MV[0][y][x-1]->Mode == MODE_INTER4V)
l8 = 1;
if (MV[0][y-1][x]->Mode == MODE_INTER4V)
o8 = 1;
if (MV[0][y-1][x+1]->Mode == MODE_INTER4V)
or8 = 1;
switch (block) {
case 0:
vec1 = (l8 ? 2 : 0) ; yin1 = y ; xin1 = x-1;
vec2 = (o8 ? 3 : 0) ; yin2 = y-1; xin2 = x;
vec3 = (or8? 3 : 0) ; yin3 = y-1; xin3 = x+1;
break;
case 1:
vec1 = (l8 ? 2 : 0) ; yin1 = y ; xin1 = x-1;
vec2 = (o8 ? 3 : 0) ; yin2 = y-1; xin2 = x;
vec3 = (or8? 3 : 0) ; yin3 = y-1; xin3 = x+1;
break;
case 2:
vec1 = 1 ; yin1 = y ; xin1 = x;
vec2 = (o8 ? 4 : 0) ; yin2 = y-1; xin2 = x;
vec3 = (or8? 3 : 0) ; yin3 = y-1; xin3 = x+1;
break;
case 3:
vec1 = (l8 ? 4 : 0) ; yin1 = y ; xin1 = x-1;
vec2 = 1 ; yin2 = y ; xin2 = x;
vec3 = 2 ; yin3 = y ; xin3 = x;
break;
case 4:
vec1 = 3 ; yin1 = y ; xin1 = x;
vec2 = 1 ; yin2 = y ; xin2 = x;
vec3 = 2 ; yin3 = y ; xin3 = x;
break;
default:
fprintf(stderr,"Illegal block number in FindPMV (countbit.c)\n");
exit(-1);
break;
}
if (half_pel) {
p1 = 2*MV[vec1][yin1][xin1]->x + MV[vec1][yin1][xin1]->x_half;
p2 = 2*MV[vec2][yin2][xin2]->x + MV[vec2][yin2][xin2]->x_half;
p3 = 2*MV[vec3][yin3][xin3]->x + MV[vec3][yin3][xin3]->x_half;
}
else {
p1 = 2*MV[vec1][yin1][xin1]->x;
p2 = 2*MV[vec2][yin2][xin2]->x;
p3 = 2*MV[vec3][yin3][xin3]->x;
}
if (newgob && (block == 0 || block == 1 || block == 2))
p2 = 2*NO_VEC;
if (p2 == 2*NO_VEC) { p2 = p3 = p1; }
*pmv0 = p1+p2+p3 - mmax(p1,mmax(p2,p3)) - mmin(p1,mmin(p2,p3));
if (half_pel) {
p1 = 2*MV[vec1][yin1][xin1]->y + MV[vec1][yin1][xin1]->y_half;
p2 = 2*MV[vec2][yin2][xin2]->y + MV[vec2][yin2][xin2]->y_half;
p3 = 2*MV[vec3][yin3][xin3]->y + MV[vec3][yin3][xin3]->y_half;
}
else {
p1 = 2*MV[vec1][yin1][xin1]->y;
p2 = 2*MV[vec2][yin2][xin2]->y;
p3 = 2*MV[vec3][yin3][xin3]->y;
}
if (newgob && (block == 0 || block == 1 || block == 2))
p2 = 2*NO_VEC;
if (p2 == 2*NO_VEC) { p2 = p3 = p1; }
*pmv1 = p1+p2+p3 - mmax(p1,mmax(p2,p3)) - mmin(p1,mmin(p2,p3));
return;
}
void ZeroBits(Bits *bits)
{
bits->Y = 0;
bits->C = 0;
bits->vec = 0;
bits->CBPY = 0;
bits->CBPCM = 0;
bits->MODB = 0;
bits->CBPB = 0;
bits->COD = 0;
bits->DQUANT = 0;
bits->header = 0;
bits->total = 0;
bits->no_inter = 0;
bits->no_inter4v = 0;
bits->no_intra = 0;
return;
}
void ZeroRes(Results *res)
{
res->SNR_l = (float)0;
res->SNR_Cr = (float)0;
res->SNR_Cb = (float)0;
res->QP_mean = (float)0;
}
void AddBits(Bits *total, Bits *bits)
{
total->Y += bits->Y;
total->C += bits->C;
total->vec += bits->vec;
total->CBPY += bits->CBPY;
total->CBPCM += bits->CBPCM;
total->MODB += bits->MODB;
total->CBPB += bits->CBPB;
total->COD += bits->COD;
total->DQUANT += bits->DQUANT;
total->header += bits->header;
total->total += bits->total;
total->no_inter += bits->no_inter;
total->no_inter4v += bits->no_inter4v;
total->no_intra += bits->no_intra;
return;
}
void AddRes(Results *total, Results *res, Pict *pic)
{
total->SNR_l += res->SNR_l;
total->SNR_Cr += res->SNR_Cr;
total->SNR_Cb += res->SNR_Cb;
total->QP_mean += pic->QP_mean;
return;
}
void AddBitsPicture(Bits *bits)
{
bits->total =
bits->Y +
bits->C +
bits->vec +
bits->CBPY +
bits->CBPCM +
bits->MODB +
bits->CBPB +
bits->COD +
bits->DQUANT +
bits->header ;
}
void ZeroVec(MotionVector *MV)
{
MV->x = 0;
MV->y = 0;
MV->x_half = 0;
MV->y_half = 0;
return;
}
void MarkVec(MotionVector *MV)
{
MV->x = NO_VEC;
MV->y = NO_VEC;
MV->x_half = 0;
MV->y_half = 0;
return;
}
void CopyVec(MotionVector *MV2, MotionVector *MV1)
{
MV2->x = MV1->x;
MV2->x_half = MV1->x_half;
MV2->y = MV1->y;
MV2->y_half = MV1->y_half;
return;
}
int EqualVec(MotionVector *MV2, MotionVector *MV1)
{
if (MV1->x != MV2->x)
return 0;
if (MV1->y != MV2->y)
return 0;
if (MV1->x_half != MV2->x_half)
return 0;
if (MV1->y_half != MV2->y_half)
return 0;
return 1;
}
/**********************************************************************
*
* Name: CountBitsPicture(Pict *pic)
* Description: counts the number of bits needed for picture
* header
*
* Input: pointer to picture structure
* Returns: number of bits
* Side effects:
*
***********************************************************************/
int CountBitsPicture(Pict *pic)
{
int bits = 0;
/* in case of arithmetic coding, encoder_flush() has been called before
zeroflush() in main.c */
/* Picture start code */
if (trace) {
fprintf(tf,"picture_start_code: ");
}
putbits(PSC_LENGTH,PSC);
bits += PSC_LENGTH;
/* Group number */
if (trace) {
fprintf(tf,"Group number in picture header: ");
}
putbits(5,0);
bits += 5;
/* Time reference */
if (trace) {
fprintf(tf,"Time reference: ");
}
putbits(8,pic->TR);
bits += 8;
/* bit 1 */
if (trace) {
fprintf(tf,"spare: ");
}
pic->spare = 1; /* always 1 to avoid start code emulation */
putbits(1,pic->spare);
bits += 1;
/* bit 2 */
if (trace) {
fprintf(tf,"always zero for distinction with H.261\n");
}
putbits(1,0);
bits += 1;
/* bit 3 */
if (trace) {
fprintf(tf,"split_screen_indicator: ");
}
putbits(1,0); /* no support for split-screen in this software */
bits += 1;
/* bit 4 */
if (trace) {
fprintf(tf,"document_camera_indicator: ");
}
putbits(1,0);
bits += 1;
/* bit 5 */
if (trace) {
fprintf(tf,"freeze_picture_release: ");
}
putbits(1,0);
bits += 1;
/* bit 6-8 */
if (trace) {
fprintf(tf,"source_format: ");
}
putbits(3,pic->source_format);
bits += 3;
/* bit 9 */
if (trace) {
fprintf(tf,"picture_coding_type: ");
}
putbits(1,pic->picture_coding_type);
bits += 1;
/* bit 10 */
if (trace) {
fprintf(tf,"mv_outside_frame: ");
}
putbits(1,pic->unrestricted_mv_mode); /* Unrestricted Motion Vector mode */
bits += 1;
/* bit 11 */
if (trace) {
fprintf(tf,"sac_coding: ");
}
putbits(1,syntax_arith_coding); /* Syntax-based Arithmetic Coding mode */
bits += 1;
/* bit 12 */
if (trace) {
fprintf(tf,"adv_pred_mode: ");
}
putbits(1,advanced); /* Advanced Prediction mode */
bits += 1;
/* bit 13 */
if (trace) {
fprintf(tf,"PB-coded: "); /* PB-frames mode */
}
putbits(1,pic->PB);
bits += 1;
/* QUANT */
if (trace) {
fprintf(tf,"QUANT: ");
}
putbits(5,pic->QUANT);
bits += 5;
/* Continuous Presence Multipoint (CPM) */
putbits(1,0); /* CPM is not supported in this software */
bits += 1;
/* Picture Sub Bitstream Indicator (PSBI) */
/* if CPM == 1: 2 bits PSBI */
/* not supported */
/* extra information for PB-frames */
if (pic->PB) {
if (trace) {
fprintf(tf,"TRB: ");
}
putbits(3,pic->TRB);
bits += 3;
if (trace) {
fprintf(tf,"BQUANT: ");
}
putbits(2,pic->BQUANT);
bits += 2;
}
/* PEI (extra information) */
if (trace) {
fprintf(tf,"PEI: ");
}
/* "Encoders shall not insert PSPARE until specified by the ITU" */
putbits(1,0);
bits += 1;
/* PSPARE */
/* if PEI == 1: 8 bits PSPARE + another PEI bit */
/* not supported */
return bits;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -