📄 slice.c
字号:
#include "common.h"#include "input.h"#include "cavlc.h"#include "params.h"#include "mbmodes.h"#include "residual.h"#include "mode_pred.h"#include "intra_pred.h"#include "mocomp.h"#include "block.h"#include "slicehdr.h"#include "slice.h"extern int frame_no;// needed from mbmodes.cextern int CodedBlockPatternMapping_Intra4x4[];extern int CodedBlockPatternMapping_Inter[];int Intra4x4ScanOrder[16][2]={ { 0, 0}, { 4, 0}, { 0, 4}, { 4, 4}, { 8, 0}, {12, 0}, { 8, 4}, {12, 4}, { 0, 8}, { 4, 8}, { 0,12}, { 4,12}, { 8, 8}, {12, 8}, { 8,12}, {12,12}};int QPcTable[22]= {29,30,31,32,32,33,34,34,35,35,36,36,37,37,37,38,38,38,39,39,39,39};// some macros for easier access to the various ModePredInfo structures#define LumaDC_nC get_luma_nC(mpi,mb_pos_x,mb_pos_y)#define LumaAC_nC get_luma_nC(mpi,mb_pos_x+Intra4x4ScanOrder[i8x8*4+i4x4][0],mb_pos_y+Intra4x4ScanOrder[i8x8*4+i4x4][1])#define ChromaDC_nC -1#define ChromaAC_nC get_chroma_nC(mpi,mb_pos_x+(i4x4&1)*8,mb_pos_y+(i4x4>>1)*8,iCbCr)#define LumaAdjust ModePredInfo_TotalCoeffL(mpi,(mb_pos_x+Intra4x4ScanOrder[i8x8*4+i4x4][0])>>2,(mb_pos_y+Intra4x4ScanOrder[i8x8*4+i4x4][1])>>2) =#define ChromaAdjust ModePredInfo_TotalCoeffC(mpi,(mb_pos_x+(i4x4&1)*8)>>3,(mb_pos_y+(i4x4>>1)*8)>>3,iCbCr) =#define Intra4x4PredMode(i) ModePredInfo_Intra4x4PredMode(mpi,(mb_pos_x+Intra4x4ScanOrder[i][0])>>2,(mb_pos_y+Intra4x4ScanOrder[i][1])>>2)///////////////////////////////////////////////////////////////////////////////void decode_slice_data(slice_header *sh, seq_parameter_set *sps, pic_parameter_set *pps, nal_unit *nalu, frame *this, frame *ref, mode_pred_info *mpi) { int CurrMbAddr=sh->first_mb_in_slice*(1+sh->MbaffFrameFlag); int moreDataFlag=1; int prevMbSkipped=0; int MbCount=mpi->MbWidth*mpi->MbHeight; int mb_skip_run; int mb_qp_delta; int QPy,QPc; int intra_chroma_pred_mode=0; int mb_pos_x,mb_pos_y; mb_mode mb; sub_mb_mode sub[4]; // transform coefficient levels int LumaDCLevel[16]; // === Intra16x16DCLevel int LumaACLevel[16][16]; // === Intra16x16ACLevel int ChromaDCLevel[2][4]; int ChromaACLevel[2][4][16];#if 0 // clear the frame -- this is only useful for debugging purposes, it may // safely be disabled later memset(this->L,0,this->Lheight*this->Lpitch); memset(this->C[0],128,this->Cheight*this->Cpitch); memset(this->C[1],128,this->Cheight*this->Cpitch);#endif // initialize some values clear_mode_pred_info(mpi); QPy=sh->SliceQPy; QPc=QPy; // only to prevent a warning moreDataFlag=more_rbsp_data(nalu); while(moreDataFlag && CurrMbAddr<MbCount) { // mb_skip_run //////////////////////////////////////////////////////////// if(sh->slice_type!=I_SLICE && sh->slice_type!=SI_SLICE) { mb_skip_run=get_unsigned_exp_golomb(); prevMbSkipped=(mb_skip_run>0); for(; mb_skip_run; --mb_skip_run, ++CurrMbAddr) { if(CurrMbAddr>=MbCount) return; mb_pos_x=CurrMbAddr%sps->PicWidthInMbs; mb_pos_y=CurrMbAddr/sps->PicWidthInMbs; ModePredInfo_MbMode(mpi,mb_pos_x,mb_pos_y)=P_Skip; mb_pos_x<<=4; mb_pos_y<<=4;//printf("\n[%d:%d] %d,%d MB: P_Skip\n",frame_no,CurrMbAddr,mb_pos_x,mb_pos_y); Derive_P_Skip_MVs(mpi,mb_pos_x,mb_pos_y); MotionCompensateMB(this,ref,mpi,mb_pos_x,mb_pos_y);//L_pixel(this,mb_pos_x+8,mb_pos_y+8)=255; } moreDataFlag=more_rbsp_data(nalu); } if(CurrMbAddr>=MbCount) return; if(moreDataFlag) { // macroblock_layer() ///////////////////////////////// decode_mb_mode(&mb,sh->slice_type,get_unsigned_exp_golomb()); mb_pos_x=CurrMbAddr%sps->PicWidthInMbs; mb_pos_y=CurrMbAddr/sps->PicWidthInMbs; ModePredInfo_MbMode(mpi,mb_pos_x,mb_pos_y)=mb.mb_type; mb_pos_x<<=4; mb_pos_y<<=4;//printf("\n[%d:%d] %d,%d ",frame_no,CurrMbAddr,mb_pos_x,mb_pos_y);_dump_mb_mode(&mb); if(mb.mb_type==I_PCM) { // I_PCM macroblock //////////////////////////// int x,y,iCbCr; unsigned char *pos; input_align_to_next_byte(); pos=&L_pixel(this,mb_pos_x,mb_pos_y); for(y=16; y; --y) { for(x=16; x; --x) *pos++=input_get_byte(); pos+=this->Lpitch-16; } for(iCbCr=0; iCbCr<2; ++iCbCr) { pos=&C_pixel(this,iCbCr,mb_pos_x>>1,mb_pos_y>>1); for(y=8; y; --y) { for(x=8; x; --x) *pos++=input_get_byte(); pos+=this->Cpitch-8; } } // fix mode_pred_info->TotalCoeff data for(y=0; y<4; ++y) for(x=0; x<4; ++x) ModePredInfo_TotalCoeffL(mpi,(mb_pos_x>>2)+x,(mb_pos_y>>2)+y)=16; for(y=0; y<2; ++y) for(x=0; x<2; ++x) { ModePredInfo_TotalCoeffC(mpi,(mb_pos_x>>3)+x,(mb_pos_y>>3)+y,0)=16; ModePredInfo_TotalCoeffC(mpi,(mb_pos_x>>3)+x,(mb_pos_y>>3)+y,1)=16; } } else { // "normal" macroblock //////////////////////////////////////// if(mb.MbPartPredMode[0]!=Intra_4x4 && mb.MbPartPredMode[0]!=Intra_16x16 && mb.NumMbPart==4) { // sub_mb_pred() //////////////////////////////////////////////////// int mbPartIdx,subMbPartIdx; for(mbPartIdx=0; mbPartIdx<4; ++mbPartIdx) decode_sub_mb_mode(&sub[mbPartIdx],sh->slice_type, get_unsigned_exp_golomb());//{int i;printf("sub_mb_pred():");for(i=0;i<4;++i)printf(" %s(%d)",_str_sub_mb_type(sub[i].sub_mb_type),sub[i].NumSubMbPart);printf("\n");} // ignoring ref_idx_* and *_l1 stuff for now -- I do not support // long-term prediction or B-frames anyway ... for(mbPartIdx=0; mbPartIdx<4; ++mbPartIdx) if(sub[mbPartIdx].sub_mb_type!=B_Direct_8x8 && sub[mbPartIdx].SubMbPredMode!=Pred_L1) { // SOF = "scan order factor" int SOF=(sub[mbPartIdx].sub_mb_type==P_L0_8x4)?2:1; for(subMbPartIdx=0; subMbPartIdx<sub[mbPartIdx].NumSubMbPart; ++subMbPartIdx) { int mvdx=get_signed_exp_golomb(); int mvdy=get_signed_exp_golomb(); DeriveMVs(mpi, mb_pos_x+Intra4x4ScanOrder[mbPartIdx*4+subMbPartIdx*SOF][0], mb_pos_y+Intra4x4ScanOrder[mbPartIdx*4+subMbPartIdx*SOF][1], sub[mbPartIdx].SubMbPartWidth, sub[mbPartIdx].SubMbPartHeight, mvdx, mvdy); } } } else { // mb_pred() //////////////////////////////////////////////// if(mb.MbPartPredMode[0]==Intra_4x4 || mb.MbPartPredMode[0]==Intra_16x16) { // mb_pred() for intra macroblocks /////////////////////////////// if(mb.MbPartPredMode[0]==Intra_4x4) { int luma4x4BlkIdx;//printf("intra_4x4:"); for(luma4x4BlkIdx=0; luma4x4BlkIdx<16; ++luma4x4BlkIdx) { int predIntra4x4PredMode=get_predIntra4x4PredMode(mpi, mb_pos_x+Intra4x4ScanOrder[luma4x4BlkIdx][0], mb_pos_y+Intra4x4ScanOrder[luma4x4BlkIdx][1]);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -