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

📄 slice.c

📁 decode the h264 video
💻 C
📖 第 1 页 / 共 2 页
字号:
                if(input_get_one_bit())  // prev_intra4x4_pred_mode_flag                  Intra4x4PredMode(luma4x4BlkIdx)=predIntra4x4PredMode;                else {                  int rem_intra4x4_pred_mode=input_get_bits(3);                  if(rem_intra4x4_pred_mode<predIntra4x4PredMode)                    Intra4x4PredMode(luma4x4BlkIdx)=rem_intra4x4_pred_mode;                  else                    Intra4x4PredMode(luma4x4BlkIdx)=rem_intra4x4_pred_mode+1;                }//printf(" %d",Intra4x4PredMode(luma4x4BlkIdx));              }//printf("\n");            }            intra_chroma_pred_mode=get_unsigned_exp_golomb();//printf("intra_chroma_pred_mode: %d\n",intra_chroma_pred_mode);          } else { // mb_pred() for inter macroblocks /////////////////////////            int mbPartIdx;            // ignoring ref_idx_* and *_l1 stuff for now -- I do not support            // long-term prediction or B-frames anyway ...            int SOF=(mb.mb_type==P_L0_L0_16x8)?8:4;            for(mbPartIdx=0; mbPartIdx<mb.NumMbPart; ++mbPartIdx)              if(mb.MbPartPredMode[mbPartIdx]!=Pred_L1) {                int mvdx=get_signed_exp_golomb();                int mvdy=get_signed_exp_golomb();                DeriveMVs(mpi,                  mb_pos_x+Intra4x4ScanOrder[mbPartIdx*SOF][0],                  mb_pos_y+Intra4x4ScanOrder[mbPartIdx*SOF][1],                  mb.MbPartWidth, mb.MbPartHeight, mvdx, mvdy);              }            }        }        // coded_block_pattern ////////////////////////////////////////////////        if(mb.MbPartPredMode[0]!=Intra_16x16) {          int coded_block_pattern=get_unsigned_exp_golomb();          if(mb.MbPartPredMode[0]==Intra_4x4)            coded_block_pattern=CodedBlockPatternMapping_Intra4x4[coded_block_pattern];          else            coded_block_pattern=CodedBlockPatternMapping_Inter[coded_block_pattern];//printf("coded_block_pattern=%d\n",coded_block_pattern);          mb.CodedBlockPatternLuma=coded_block_pattern&15;          mb.CodedBlockPatternChroma=coded_block_pattern>>4;//_dump_mb_mode(&mb);        }        // Before parsing the residual data, set all coefficients to zero. In        // the original H.264 documentation, this is done either in        // residual_block() at the very beginning or by setting values to zero        // according to the CodedBlockPattern values. So, there's only little        // overhead if we do it right here.        memset(LumaDCLevel,0,sizeof(LumaDCLevel));        memset(LumaACLevel,0,sizeof(LumaACLevel));        memset(ChromaDCLevel,0,sizeof(ChromaDCLevel));        memset(ChromaACLevel,0,sizeof(ChromaACLevel));        // residual() /////////////////////////////////////////////////////////        if(mb.CodedBlockPatternLuma>0 || mb.CodedBlockPatternChroma>0 ||           mb.MbPartPredMode[0]==Intra_16x16)        {          int i8x8,i4x4,iCbCr,QPi;          mb_qp_delta=get_signed_exp_golomb();          QPy=(QPy+mb_qp_delta+52)%52;          QPi=QPy+pps->chroma_qp_index_offset;          QPi=CustomClip(QPi,0,51);          if(QPi<30) QPc=QPi;                else QPc=QPcTable[QPi-30];//printf("mb_qp_delta=%d QPy=%d QPi=%d QPc=%d\n",mb_qp_delta,QPy,QPi,QPc);          // OK, now let's parse the hell out of the stream ;)                  if(mb.MbPartPredMode[0]==Intra_16x16)            residual_block(&LumaDCLevel[0],16,LumaDC_nC);          for(i8x8=0; i8x8<4; ++i8x8)            for(i4x4=0; i4x4<4; ++i4x4)              if(mb.CodedBlockPatternLuma&(1<<i8x8)) {                if(mb.MbPartPredMode[0]==Intra_16x16)                  LumaAdjust residual_block(&LumaACLevel[i8x8*4+i4x4][1],15,LumaAC_nC);                else                  LumaAdjust residual_block(&LumaACLevel[i8x8*4+i4x4][0],16,LumaAC_nC);              };          for(iCbCr=0; iCbCr<2; iCbCr++)            if(mb.CodedBlockPatternChroma&3)              residual_block(&ChromaDCLevel[iCbCr][0],4,ChromaDC_nC);          for(iCbCr=0; iCbCr<2; iCbCr++)            for(i4x4=0; i4x4<4; ++i4x4)              if(mb.CodedBlockPatternChroma&2)                ChromaAdjust residual_block(&ChromaACLevel[iCbCr][i4x4][1],15,ChromaAC_nC);/*{ int i; printf("L:"); for(i=0; i<16; ++i) printf(" %d",LumaDCLevel[i]); printf("\n");for(i8x8=0; i8x8<16; ++i8x8) { printf("  [%2d]",i8x8);for(i=0; i<16; ++i) printf(" %d",LumaACLevel[i8x8][i]); printf("\n"); }printf("Cb:"); for(i=0; i<4; ++i) printf(" %d",ChromaDCLevel[0][i]); printf("\n");for(i8x8=0; i8x8<4; ++i8x8) { printf("  [%d]",i8x8);for(i=0; i<16; ++i) printf(" %d",ChromaACLevel[0][i8x8][i]); printf("\n"); }printf("Cr:"); for(i=0; i<4; ++i) printf(" %d",ChromaDCLevel[1][i]); printf("\n");for(i8x8=0; i8x8<4; ++i8x8) { printf("  [%d]",i8x8);for(i=0; i<16; ++i) printf(" %d",ChromaACLevel[1][i8x8][i]); printf("\n"); } }*/        }        //////////////////////////// RENDERING ////////////////////////////////        // Now that we have all the informations needed about this macroblock,        // we can go ahead and really render it.        if(mb.MbPartPredMode[0]==Intra_4x4) {  ///////////////// Intra_4x4_Pred          int i;          for(i=0; i<16; ++i) {            int x=mb_pos_x+Intra4x4ScanOrder[i][0];            int y=mb_pos_y+Intra4x4ScanOrder[i][1];            perf_enter("intra prediction");            Intra_4x4_Dispatch(this,mpi,x,y,i);            perf_enter("block entering");            enter_luma_block(&LumaACLevel[i][0],this,x,y,QPy,0);          }          Intra_Chroma_Dispatch(this,mpi,intra_chroma_pred_mode,mb_pos_x>>1,mb_pos_y>>1,pps->constrained_intra_pred_flag);        } else if(mb.MbPartPredMode[0]==Intra_16x16) {  ////// Intra_16x16_Pred          int i,j;          perf_enter("intra prediction");          Intra_16x16_Dispatch(this,mpi,mb.Intra16x16PredMode,mb_pos_x,mb_pos_y,pps->constrained_intra_pred_flag);          perf_enter("block entering");          transform_luma_dc(&LumaDCLevel[0],&LumaACLevel[0][0],QPy);          for(i=0; i<16; ++i) {            int x=mb_pos_x+Intra4x4ScanOrder[i][0];            int y=mb_pos_y+Intra4x4ScanOrder[i][1];            enter_luma_block(&LumaACLevel[i][0],this,x,y,QPy,1);          }          perf_enter("block entering");          Intra_Chroma_Dispatch(this,mpi,intra_chroma_pred_mode,mb_pos_x>>1,mb_pos_y>>1,pps->constrained_intra_pred_flag);          // act as if all transform blocks inside this macroblock were          // predicted using the Intra_4x4_DC prediction mode          // (without constrained_intra_pred, we'd have to do the same for          // inter MBs)          for(i=0; i<4; ++i) for(j=0; j<4; ++j)            ModePredInfo_Intra4x4PredMode(mpi,(mb_pos_x>>2)+j,(mb_pos_y>>2)+i)=2;        } else { ///////////////////////////////////////////////// Inter_*_Pred          int i;/*{int x,y;for(y=0;y<4;++y){for(x=0;x<4;++x){i=((mb_pos_y>>2)+y)*mpi->TbPitch+(mb_pos_x>>2)+x;printf("|%4d,%-4d",mpi->MVx[i],mpi->MVy[i]);}printf("\n");}}*/          perf_enter("inter prediction");          MotionCompensateMB(this,ref,mpi,mb_pos_x,mb_pos_y);          perf_enter("block entering");          for(i=0; i<16; ++i) {            int x=mb_pos_x+Intra4x4ScanOrder[i][0];            int y=mb_pos_y+Intra4x4ScanOrder[i][1];            enter_luma_block(&LumaACLevel[i][0],this,x,y,QPy,0);          }        } /*else          printf("unsupported prediction mode at %d,%d!\n",mb_pos_x,mb_pos_y);*/        if(mb.CodedBlockPatternChroma) { ////////////////////// Chroma Residual          int iCbCr,i;          perf_enter("block entering");          for(iCbCr=0; iCbCr<2; ++iCbCr) {            transform_chroma_dc(&ChromaDCLevel[iCbCr][0],QPc);            for(i=0; i<4; ++i)              ChromaACLevel[iCbCr][i][0]=ChromaDCLevel[iCbCr][i];            for(i=0; i<4; ++i)              enter_chroma_block(&ChromaACLevel[iCbCr][i][0],this,iCbCr,                (mb_pos_x>>1)+Intra4x4ScanOrder[i][0],                (mb_pos_y>>1)+Intra4x4ScanOrder[i][1],              QPc,1);          }        }      }//if(frame_no>=1 && CurrMbAddr>=0) { L_pixel(this,mb_pos_x+15,mb_pos_y+15)=255; return; }    } ///////////// end of macroblock_layer() /////////////////////////////////    moreDataFlag=more_rbsp_data(nalu);    ++CurrMbAddr;  } /* while(moreDataFlag && CurrMbAddr<=MbCount) */}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -