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

📄 slice.c

📁 decode the h264 video
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -