📄 getpic.c
字号:
/* copy or add block data into picture */
for (comp=0; comp<block_count; comp++)
{
/* SCALABILITY: SNR */
/* ISO/IEC 13818-2 section 7.8.3.4: Addition of coefficients from
the two a layers */
if (Two_Streams && enhan.scalable_mode==SC_SNR)
Sum_Block(comp); /* add SNR enhancement layer data to base layer */
/* MPEG-2 saturation and mismatch control */
/* base layer could be MPEG-1 stream, enhancement MPEG-2 SNR */
/* ISO/IEC 13818-2 section 7.4.3 and 7.4.4: Saturation and Mismatch control */
if ((Two_Streams && enhan.scalable_mode==SC_SNR) || ld->MPEG2_Flag)
Saturate(ld->block[comp]);
/* ISO/IEC 13818-2 section Annex A: inverse DCT */
if (Reference_IDCT_Flag)
Reference_IDCT(ld->block[comp]);
else
Fast_IDCT(ld->block[comp]);
/* ISO/IEC 13818-2 section 7.6.8: Adding prediction and coefficient data */
Add_Block(comp,bx,by,dct_type,(macroblock_type & MACROBLOCK_INTRA)==0);
}
}
/* ISO/IEC 13818-2 section 7.6.6 */
static void skipped_macroblock(dc_dct_pred, PMV, motion_type,
motion_vertical_field_select, stwtype, macroblock_type)
int dc_dct_pred[3];
int PMV[2][2][2];
int *motion_type;
int motion_vertical_field_select[2][2];
int *stwtype;
int *macroblock_type;
{
int comp;
/* SCALABILITY: Data Paritioning */
if (base.scalable_mode==SC_DP)
ld = &base;
for (comp=0; comp<block_count; comp++)
Clear_Block(comp);
/* reset intra_dc predictors */
/* ISO/IEC 13818-2 section 7.2.1: DC coefficients in intra blocks */
dc_dct_pred[0]=dc_dct_pred[1]=dc_dct_pred[2]=0;
/* reset motion vector predictors */
/* ISO/IEC 13818-2 section 7.6.3.4: Resetting motion vector predictors */
if (picture_coding_type==P_TYPE)
PMV[0][0][0]=PMV[0][0][1]=PMV[1][0][0]=PMV[1][0][1]=0;
/* derive motion_type */
if (picture_structure==FRAME_PICTURE)
*motion_type = MC_FRAME;
else
{
*motion_type = MC_FIELD;
/* predict from field of same parity */
/* ISO/IEC 13818-2 section 7.6.6.1 and 7.6.6.3: P field picture and B field
picture */
motion_vertical_field_select[0][0]=motion_vertical_field_select[0][1] =
(picture_structure==BOTTOM_FIELD);
}
/* skipped I are spatial-only predicted, */
/* skipped P and B are temporal-only predicted */
/* ISO/IEC 13818-2 section 7.7.6: Skipped macroblocks */
*stwtype = (picture_coding_type==I_TYPE) ? 8 : 0;
/* IMPLEMENTATION: clear MACROBLOCK_INTRA */
*macroblock_type&= ~MACROBLOCK_INTRA;
}
/* return==-1 means go to next picture */
/* the expression "start of slice" is used throughout the normative
body of the MPEG specification */
static int start_of_slice(MBAmax, MBA, MBAinc,
dc_dct_pred, PMV)
int MBAmax;
int *MBA;
int *MBAinc;
int dc_dct_pred[3];
int PMV[2][2][2];
{
unsigned int code;
int slice_vert_pos_ext;
ld = &base;
Fault_Flag = 0;
next_start_code();
code = Show_Bits(32);
if (code<SLICE_START_CODE_MIN || code>SLICE_START_CODE_MAX)
{
/* only slice headers are allowed in picture_data */
if (!Quiet_Flag)
printf("start_of_slice(): Premature end of picture\n");
return(-1); /* trigger: go to next picture */
}
Flush_Buffer32();
/* decode slice header (may change quantizer_scale) */
slice_vert_pos_ext = slice_header();
/* SCALABILITY: Data Partitioning */
if (base.scalable_mode==SC_DP)
{
ld = &enhan;
next_start_code();
code = Show_Bits(32);
if (code<SLICE_START_CODE_MIN || code>SLICE_START_CODE_MAX)
{
/* only slice headers are allowed in picture_data */
if (!Quiet_Flag)
printf("DP: Premature end of picture\n");
return(-1); /* trigger: go to next picture */
}
Flush_Buffer32();
/* decode slice header (may change quantizer_scale) */
slice_vert_pos_ext = slice_header();
if (base.priority_breakpoint!=1)
ld = &base;
}
/* decode macroblock address increment */
*MBAinc = Get_macroblock_address_increment();
if (Fault_Flag)
{
printf("start_of_slice(): MBAinc unsuccessful\n");
return(0); /* trigger: go to next slice */
}
/* set current location */
/* NOTE: the arithmetic used to derive macroblock_address below is
* equivalent to ISO/IEC 13818-2 section 6.3.17: Macroblock
*/
*MBA = ((slice_vert_pos_ext<<7) + (code&255) - 1)*mb_width + *MBAinc - 1;
*MBAinc = 1; /* first macroblock in slice: not skipped */
/* reset all DC coefficient and motion vector predictors */
/* reset all DC coefficient and motion vector predictors */
/* ISO/IEC 13818-2 section 7.2.1: DC coefficients in intra blocks */
dc_dct_pred[0]=dc_dct_pred[1]=dc_dct_pred[2]=0;
/* ISO/IEC 13818-2 section 7.6.3.4: Resetting motion vector predictors */
PMV[0][0][0]=PMV[0][0][1]=PMV[1][0][0]=PMV[1][0][1]=0;
PMV[0][1][0]=PMV[0][1][1]=PMV[1][1][0]=PMV[1][1][1]=0;
/* successfull: trigger decode macroblocks in slice */
return(1);
}
/* ISO/IEC 13818-2 sections 7.2 through 7.5 */
static int decode_macroblock(macroblock_type, stwtype, stwclass,
motion_type, dct_type, PMV, dc_dct_pred,
motion_vertical_field_select, dmvector)
int *macroblock_type;
int *stwtype;
int *stwclass;
int *motion_type;
int *dct_type;
int PMV[2][2][2];
int dc_dct_pred[3];
int motion_vertical_field_select[2][2];
int dmvector[2];
{
/* locals */
int quantizer_scale_code;
int comp;
int motion_vector_count;
int mv_format;
int dmv;
int mvscale;
int coded_block_pattern;
/* SCALABILITY: Data Patitioning */
if (base.scalable_mode==SC_DP)
{
if (base.priority_breakpoint<=2)
ld = &enhan;
else
ld = &base;
}
/* ISO/IEC 13818-2 section 6.3.17.1: Macroblock modes */
macroblock_modes(macroblock_type, stwtype, stwclass,
motion_type, &motion_vector_count, &mv_format, &dmv, &mvscale,
dct_type);
if (Fault_Flag) return(0); /* trigger: go to next slice */
if (*macroblock_type & MACROBLOCK_QUANT)
{
quantizer_scale_code = Get_Bits(5);
#ifdef TRACE
if (Trace_Flag)
{
printf("quantiser_scale_code (");
Print_Bits(quantizer_scale_code,5,5);
printf("): %d\n",quantizer_scale_code);
}
#endif /* TRACE */
/* ISO/IEC 13818-2 section 7.4.2.2: Quantizer scale factor */
if (ld->MPEG2_Flag)
ld->quantizer_scale =
ld->q_scale_type ? Non_Linear_quantizer_scale[quantizer_scale_code]
: (quantizer_scale_code << 1);
else
ld->quantizer_scale = quantizer_scale_code;
/* SCALABILITY: Data Partitioning */
if (base.scalable_mode==SC_DP)
/* make sure base.quantizer_scale is valid */
base.quantizer_scale = ld->quantizer_scale;
}
/* motion vectors */
/* ISO/IEC 13818-2 section 6.3.17.2: Motion vectors */
/* decode forward motion vectors */
if ((*macroblock_type & MACROBLOCK_MOTION_FORWARD)
|| ((*macroblock_type & MACROBLOCK_INTRA)
&& concealment_motion_vectors))
{
if (ld->MPEG2_Flag)
motion_vectors(PMV,dmvector,motion_vertical_field_select,
0,motion_vector_count,mv_format,f_code[0][0]-1,f_code[0][1]-1,
dmv,mvscale);
else
motion_vector(PMV[0][0],dmvector,
forward_f_code-1,forward_f_code-1,0,0,full_pel_forward_vector);
}
if (Fault_Flag) return(0); /* trigger: go to next slice */
/* decode backward motion vectors */
if (*macroblock_type & MACROBLOCK_MOTION_BACKWARD)
{
if (ld->MPEG2_Flag)
motion_vectors(PMV,dmvector,motion_vertical_field_select,
1,motion_vector_count,mv_format,f_code[1][0]-1,f_code[1][1]-1,0,
mvscale);
else
motion_vector(PMV[0][1],dmvector,
backward_f_code-1,backward_f_code-1,0,0,full_pel_backward_vector);
}
if (Fault_Flag) return(0); /* trigger: go to next slice */
if ((*macroblock_type & MACROBLOCK_INTRA) && concealment_motion_vectors)
Flush_Buffer(1); /* remove marker_bit */
if (base.scalable_mode==SC_DP && base.priority_breakpoint==3)
ld = &enhan;
/* macroblock_pattern */
/* ISO/IEC 13818-2 section 6.3.17.4: Coded block pattern */
if (*macroblock_type & MACROBLOCK_PATTERN)
{
coded_block_pattern = Get_coded_block_pattern();
if (chroma_format==CHROMA422)
{
/* coded_block_pattern_1 */
coded_block_pattern = (coded_block_pattern<<2) | Get_Bits(2);
#ifdef TRACE
if (Trace_Flag)
{
printf("coded_block_pattern_1: ");
Print_Bits(coded_block_pattern,2,2);
printf(" (%d)\n",coded_block_pattern&3);
}
#endif /* TRACE */
}
else if (chroma_format==CHROMA444)
{
/* coded_block_pattern_2 */
coded_block_pattern = (coded_block_pattern<<6) | Get_Bits(6);
#ifdef TRACE
if (Trace_Flag)
{
printf("coded_block_pattern_2: ");
Print_Bits(coded_block_pattern,6,6);
printf(" (%d)\n",coded_block_pattern&63);
}
#endif /* TRACE */
}
}
else
coded_block_pattern = (*macroblock_type & MACROBLOCK_INTRA) ?
(1<<block_count)-1 : 0;
if (Fault_Flag) return(0); /* trigger: go to next slice */
/* decode blocks */
for (comp=0; comp<block_count; comp++)
{
/* SCALABILITY: Data Partitioning */
if (base.scalable_mode==SC_DP)
ld = &base;
Clear_Block(comp);
if (coded_block_pattern & (1<<(block_count-1-comp)))
{
if (*macroblock_type & MACROBLOCK_INTRA)
{
if (ld->MPEG2_Flag)
Decode_MPEG2_Intra_Block(comp,dc_dct_pred);
else
Decode_MPEG1_Intra_Block(comp,dc_dct_pred);
}
else
{
if (ld->MPEG2_Flag)
Decode_MPEG2_Non_Intra_Block(comp);
else
Decode_MPEG1_Non_Intra_Block(comp);
}
if (Fault_Flag) return(0); /* trigger: go to next slice */
}
}
if(picture_coding_type==D_TYPE)
{
/* remove end_of_macroblock (always 1, prevents startcode emulation) */
/* ISO/IEC 11172-2 section 2.4.2.7 and 2.4.3.6 */
marker_bit("D picture end_of_macroblock bit");
}
/* reset intra_dc predictors */
/* ISO/IEC 13818-2 section 7.2.1: DC coefficients in intra blocks */
if (!(*macroblock_type & MACROBLOCK_INTRA))
dc_dct_pred[0]=dc_dct_pred[1]=dc_dct_pred[2]=0;
/* reset motion vector predictors */
if ((*macroblock_type & MACROBLOCK_INTRA) && !concealment_motion_vectors)
{
/* intra mb without concealment motion vectors */
/* ISO/IEC 13818-2 section 7.6.3.4: Resetting motion vector predictors */
PMV[0][0][0]=PMV[0][0][1]=PMV[1][0][0]=PMV[1][0][1]=0;
PMV[0][1][0]=PMV[0][1][1]=PMV[1][1][0]=PMV[1][1][1]=0;
}
/* special "No_MC" macroblock_type case */
/* ISO/IEC 13818-2 section 7.6.3.5: Prediction in P pictures */
if ((picture_coding_type==P_TYPE)
&& !(*macroblock_type & (MACROBLOCK_MOTION_FORWARD|MACROBLOCK_INTRA)))
{
/* non-intra mb without forward mv in a P picture */
/* ISO/IEC 13818-2 section 7.6.3.4: Resetting motion vector predictors */
PMV[0][0][0]=PMV[0][0][1]=PMV[1][0][0]=PMV[1][0][1]=0;
/* derive motion_type */
/* ISO/IEC 13818-2 section 6.3.17.1: Macroblock modes, frame_motion_type */
if (picture_structure==FRAME_PICTURE)
*motion_type = MC_FRAME;
else
{
*motion_type = MC_FIELD;
/* predict from field of same parity */
motion_vertical_field_select[0][0] = (picture_structure==BOTTOM_FIELD);
}
}
if (*stwclass==4)
{
/* purely spatially predicted macroblock */
/* ISO/IEC 13818-2 section 7.7.5.1: Resetting motion vector predictions */
PMV[0][0][0]=PMV[0][0][1]=PMV[1][0][0]=PMV[1][0][1]=0;
PMV[0][1][0]=PMV[0][1][1]=PMV[1][1][0]=PMV[1][1][1]=0;
}
/* successfully decoded macroblock */
return(1);
} /* decode_macroblock */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -