⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 getpic.c

📁 MPEG2编解码的源代码.zip
💻 C
📖 第 1 页 / 共 3 页
字号:
  /* 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 + -