📄 slice.c
字号:
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 + -