📄 newmotiondlg.cpp
字号:
}
void CNewmotionDlg::decode_motion_vector(int *pred,int r_size,int motion_code,
int motion_residual,int full_pel_vector)
{
int lim, vec;
lim = 16<<r_size;
vec = full_pel_vector ? (*pred >> 1) : (*pred);
if (motion_code>0)
{
vec+= ((motion_code-1)<<r_size) + motion_residual + 1;
if (vec>=lim)
vec-= lim + lim;
}
else if (motion_code<0)
{
vec-= ((-motion_code-1)<<r_size) + motion_residual + 1;
if (vec<-lim)
vec+= lim + lim;
}
*pred = full_pel_vector ? (vec<<1) : vec;
}
/* ISO/IEC 13818-2 section 6.3.17.1: Macroblock modes */
void CNewmotionDlg::macroblock_modes(int *pmacroblock_type,int *pstwtype,int *pstwclass,
int *pmotion_type,int *pmotion_vector_count,int *pmv_format,int *pdmv,int *pmvscale,int *pdct_type)
{
int macroblock_type;
int stwtype, stwcode, stwclass;
int motion_type = 0;
int motion_vector_count, mv_format, dmv, mvscale;
int dct_type;
static unsigned char stwc_table[3][4]
= { {6,3,7,4}, {2,1,5,4}, {2,5,7,4} };
static unsigned char stwclass_table[9]
= {0, 1, 2, 1, 1, 2, 3, 3, 4};
/* get macroblock_type */
macroblock_type = Get_macroblock_type();
if (Fault_Flag) return;
/* get spatial_temporal_weight_code */
if (macroblock_type & MB_WEIGHT)
{
if (spatial_temporal_weight_code_table_index==0)
stwtype = 4;
else
{
stwcode = GetBits(2);/*
#ifdef TRACE
if (Trace_Flag)
{
printf("spatial_temporal_weight_code (");
Print_Bits(stwcode,2,2);
printf("): %d\n",stwcode);
}
#endif /* TRACE */
stwtype = stwc_table[spatial_temporal_weight_code_table_index-1][stwcode];
}
}
else
stwtype = (macroblock_type & MB_CLASS4) ? 8 : 0;
/* SCALABILITY: derive spatial_temporal_weight_class (Table 7-18) */
stwclass = stwclass_table[stwtype];
/* get frame/field motion type */
if (macroblock_type & (MACROBLOCK_MOTION_FORWARD|MACROBLOCK_MOTION_BACKWARD))
{
if (picture_structure==FRAME_PICTURE) /* frame_motion_type */
{
motion_type = frame_pred_frame_dct ? MC_FRAME : GetBits(2);/*
#ifdef TRACE
if (!frame_pred_frame_dct && Trace_Flag)
{
printf("frame_motion_type (");
Print_Bits(motion_type,2,2);
printf("): %s\n",motion_type==MC_FIELD?"Field":
motion_type==MC_FRAME?"Frame":
motion_type==MC_DMV?"Dual_Prime":"Invalid");
}
#endif /* TRACE */
}
else /* field_motion_type */
{
motion_type = GetBits(2);/*
#ifdef TRACE
if (Trace_Flag)
{
printf("field_motion_type (");
Print_Bits(motion_type,2,2);
printf("): %s\n",motion_type==MC_FIELD?"Field":
motion_type==MC_16X8?"16x8 MC":
motion_type==MC_DMV?"Dual_Prime":"Invalid");
}
#endif /* TRACE */
}
}
else if ((macroblock_type & MACROBLOCK_INTRA) && concealment_motion_vectors)
{
/* concealment motion vectors */
motion_type = (picture_structure==FRAME_PICTURE) ? MC_FRAME : MC_FIELD;
}
#if 0
else
{
printf("maroblock_modes(): unknown macroblock type\n");
motion_type = -1;
}
#endif
/* derive motion_vector_count, mv_format and dmv, (table 6-17, 6-18) */
if (picture_structure==FRAME_PICTURE)
{
motion_vector_count = (motion_type==MC_FIELD && stwclass<2) ? 2 : 1;
mv_format = (motion_type==MC_FRAME) ? MV_FRAME : MV_FIELD;
}
else
{
motion_vector_count = (motion_type==MC_16X8) ? 2 : 1;
mv_format = MV_FIELD;
}
dmv = (motion_type==MC_DMV); /* dual prime */
/* field mv predictions in frame pictures have to be scaled
* ISO/IEC 13818-2 section 7.6.3.1 Decoding the motion vectors
* IMPLEMENTATION: mvscale is derived for later use in motion_vectors()
* it displaces the stage:
*
* if((mv_format=="field")&&(t==1)&&(picture_structure=="Frame picture"))
* prediction = PMV[r][s][t] DIV 2;
*/
mvscale = ((mv_format==MV_FIELD) && (picture_structure==FRAME_PICTURE));
/* get dct_type (frame DCT / field DCT) */
dct_type = (picture_structure==FRAME_PICTURE)
&& (!frame_pred_frame_dct)
&& (macroblock_type & (MACROBLOCK_PATTERN|MACROBLOCK_INTRA))
? GetBits(1)
: 0;
#ifdef TRACE
if (Trace_Flag && (picture_structure==FRAME_PICTURE)
&& (!frame_pred_frame_dct)
&& (macroblock_type & (MACROBLOCK_PATTERN|MACROBLOCK_INTRA)))
printf("dct_type (%d): %s\n",dct_type,dct_type?"Field":"Frame");
#endif /* TRACE */
/* return values */
*pmacroblock_type = macroblock_type;
*pstwtype = stwtype;
*pstwclass = stwclass;
*pmotion_type = motion_type;
*pmotion_vector_count = motion_vector_count;
*pmv_format = mv_format;
*pdmv = dmv;
*pmvscale = mvscale;
*pdct_type = dct_type;
}
int CNewmotionDlg::Get_coded_block_pattern()
{
int code;
if ((code = LookAhead(9))>=128)
{
code >>= 4;
GetBits(CBPtab0[code].len);
return CBPtab0[code].val;
}
if (code>=8)
{
code >>= 1;
GetBits(CBPtab1[code].len);
return CBPtab1[code].val;
}
if (code<1)
{
if (!Quiet_Flag)
printf("Invalid coded_block_pattern code\n");
Fault_Flag = 1;
return 0;
}
GetBits(CBPtab2[code].len);
return CBPtab2[code].val;
}
/* get differential motion vector (for dual prime prediction) */
int CNewmotionDlg::Get_dmvector()
{
if (Get1Bit())
{
return Get1Bit() ? -1 : 1;
}
else
{
return 0;
}
}
int CNewmotionDlg::Get_motion_code()
{
int code;
if (Get1Bit())
{
return 0;
}
if ((code = LookAhead(9))>=64)
{
code >>= 6;
GetBits(MVtab0[code].len);
return Get1Bit()?-MVtab0[code].val:MVtab0[code].val;
}
if (code>=24)
{
code >>= 3;
GetBits(MVtab1[code].len);
return Get1Bit()?-MVtab1[code].val:MVtab1[code].val;
}
if ((code-=12)<0)
{
if (!Quiet_Flag)
/* HACK */
printf("Invalid motion_vector code (MBA %d, pic %d)\n", global_MBA, global_pic);
Fault_Flag=1;
return 0;
}
GetBits(MVtab2[code].len);
return Get1Bit() ? -MVtab2[code].val : MVtab2[code].val;
}
void CNewmotionDlg::Decode_MPEG1_Intra_Block(int comp,int dc_dct_pred[])
{
int val, i, j, sign;
unsigned int code;
DCTtab *tab;
short *bp;
bp = ld->block[comp];
/* ISO/IEC 11172-2 section 2.4.3.7: Block layer. */
/* decode DC coefficients */
if (comp<4)
bp[0] = (dc_dct_pred[0]+=Get_Luma_DC_dct_diff()) << 3;
else if (comp==4)
bp[0] = (dc_dct_pred[1]+=Get_Chroma_DC_dct_diff()) << 3;
else
bp[0] = (dc_dct_pred[2]+=Get_Chroma_DC_dct_diff()) << 3;
if (Fault_Flag) return;
/* D-pictures do not contain AC coefficients */
if(CodeType == D_TYPE)
return;
/* decode AC coefficients */
for (i=1; ; i++)
{
code = LookAhead(16);
if (code>=16384)
tab = &DCTtabnext[(code>>12)-4];
else if (code>=1024)
tab = &DCTtab0[(code>>8)-4];
else if (code>=512)
tab = &DCTtab1[(code>>6)-8];
else if (code>=256)
tab = &DCTtab2[(code>>4)-16];
else if (code>=128)
tab = &DCTtab3[(code>>3)-16];
else if (code>=64)
tab = &DCTtab4[(code>>2)-16];
else if (code>=32)
tab = &DCTtab5[(code>>1)-16];
else if (code>=16)
tab = &DCTtab6[code-16];
else
{
if (!Quiet_Flag)
printf("invalid Huffman code in Decode_MPEG1_Intra_Block()\n");
Fault_Flag = 1;
return;
}
GetBits(tab->len);
if (tab->run==64) /* end_of_block */
return;
if (tab->run==65) /* escape */
{
i+= GetBits(6);
val = GetBits(8);
if (val==0)
val = GetBits(8);
else if (val==128)
val = GetBits(8) - 256;
else if (val>128)
val -= 256;
if((sign = (val<0)))
val = -val;
}
else
{
i+= tab->run;
val = tab->level;
sign = GetBits(1);
}
if (i>=64)
{
if (!Quiet_Flag)
fprintf(stderr,"DCT coeff index (i) out of bounds (intra)\n");
Fault_Flag = 1;
return;
}
j = scan[ZIG_ZAG][i];
val = (val*ld->quantizer_scale*ld->intra_quantizer_matrix[j]) >> 3;
/* mismatch control ('oddification') */
if (val!=0) /* should always be true, but it's not guaranteed */
val = (val-1) | 1; /* equivalent to: if ((val&1)==0) val = val - 1; */
/* saturation */
if (!sign)
bp[j] = (val>2047) ? 2047 : val; /* positive */
else
bp[j] = (val>2048) ? -2048 : -val; /* negative */
}
}
/* decode one non-intra coded MPEG-1 block */
void CNewmotionDlg::Decode_MPEG1_Non_Intra_Block(int comp)
{
int val, i, j, sign;
unsigned int code;
DCTtab *tab;
short *bp;
bp = ld->block[comp];
/* decode AC coefficients */
for (i=0; ; i++)
{
code = LookAhead(16);
if (code>=16384)
{
if (i==0)
tab = &DCTtabfirst[(code>>12)-4];
else
tab = &DCTtabnext[(code>>12)-4];
}
else if (code>=1024)
tab = &DCTtab0[(code>>8)-4];
else if (code>=512)
tab = &DCTtab1[(code>>6)-8];
else if (code>=256)
tab = &DCTtab2[(code>>4)-16];
else if (code>=128)
tab = &DCTtab3[(code>>3)-16];
else if (code>=64)
tab = &DCTtab4[(code>>2)-16];
else if (code>=32)
tab = &DCTtab5[(code>>1)-16];
else if (code>=16)
tab = &DCTtab6[code-16];
else
{
if (!Quiet_Flag)
printf("invalid Huffman code in Decode_MPEG1_Non_Intra_Block()\n");
Fault_Flag = 1;
return;
}
GetBits(tab->len);
if (tab->run==64) /* end_of_block */
return;
if (tab->run==65) /* escape */
{
i+= GetBits(6);
val = GetBits(8);
if (val==0)
val = GetBits(8);
else if (val==128)
val = GetBits(8) - 256;
else if (val>128)
val -= 256;
if((sign = (val<0)))
val = -val;
}
else
{
i+= tab->run;
val = tab->level;
sign = GetBits(1);
}
if (i>=64)
{
if (!Quiet_Flag)
fprintf(stderr,"DCT coeff index (i) out of bounds (inter)\n");
Fault_Flag = 1;
return;
}
j = scan[ZIG_ZAG][i];
val = (((val<<1)+1)*ld->quantizer_scale*ld->non_intra_quantizer_matrix[j]) >> 4;
/* mismatch control ('oddification') */
if (val!=0) /* should always be true, but it's not guaranteed */
val = (val-1) | 1; /* equivalent to: if ((val&1)==0) val = val - 1; */
/* saturation */
if (!sign)
bp[j] = (val>2047) ? 2047 : val; /* positive */
else
bp[j] = (val>2048) ? -2048 : -val; /* negative */
}
}
int CNewmotionDlg::Get_Chroma_DC_dct_diff()
{
int code, size, dct_diff;
#ifdef TRACE
/*
if (Trace_Flag)
printf("dct_dc_size_chrominance: (");
*/
#endif /* TRACE */
/* decode length */
code = LookAhead(5);
if (code<31)
{
size = DCchromtab0[code].val;
GetBits(DCchromtab0[code].len);
#ifdef TRACE
/*
if (Trace_Flag)
{
Print_Bits(code,5,DCchromtab0[code].len);
printf("): %d",size);
}
*/
#endif /* TRACE */
}
else
{
code = LookAhead(10) - 0x3e0;
size = DCchromtab1[code].val;
GetBits(DCchromtab1[code].len);
#ifdef TRACE
#endif /* TRACE */
}
#ifdef TRACE
#endif /* TRACE */
if (size==0)
dct_diff = 0;
else
{
dct_diff = GetBits(size);
#ifdef TRACE
#endif /* TRACE */
if ((dct_diff & (1<<(size-1)))==0)
dct_diff-= (1<<size) - 1;
}
return dct_diff;
}
int CNewmotionDlg::Get_Luma_DC_dct_diff()
{
int code, size, dct_diff;
/* decode length */
code = LookAhead(5);
if (code<31)
{
size = DClumtab0[code].val;
GetBits(DClumtab0[code].len);
}
else
{
code = LookAhead(9) - 0x1f0;
size = DClumtab1[code].val;
GetBits(DClumtab1[code].len);
}
if (size==0)
dct_diff = 0;
else
{
dct_diff = GetBits(size);
if ((dct_diff & (1<<(size-1)))==0)
dct_diff-= (1<<size) - 1;
}
return dct_diff;
}
void CNewmotionDlg::Clear_Block(int comp)
{
short *Block_Ptr;
int i;
Block_Ptr = ld->block[comp];
for (i=0; i<64; i++)
*Block_Ptr++ = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -