📄 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 + -