📄 mbheaddec.c
字号:
{ case 0: pmbmd->m_intStepDelta = -1; break; case 1: pmbmd->m_intStepDelta = -2; break; case 2: pmbmd->m_intStepDelta = 1; break; case 3: pmbmd->m_intStepDelta = 2; break;#ifndef NO_ASSERTS default: assert (FALSE);#endif } (*iCurrentQP) += pmbmd->m_intStepDelta; iQuantMax = (1<<g_pVOL->uiQuantPrecision) - 1; CHECKRANGE ((*iCurrentQP), 1, iQuantMax); } pmbmd->m_stepSize = (*iCurrentQP);#ifdef ENABLE_INTERLACING if (m_vopmd.bInterlace && !pmbmd->m_bSkip) { if ((pmbmd->m_dctMd == INTRA) || (pmbmd->m_dctMd == INTRAQ) || (iCBPY || iCBPC)) pmbmd->m_bFieldDCT = getSingleBit (); // get dct_type else pmbmd->m_bFieldDCT = FALSE;// GMC pmbmd->m_bFieldMV = FALSE;// ~GMC if (((pmbmd->m_dctMd == INTERQ) || (pmbmd->m_dctMd == INTER)) && (pmbmd -> m_bhas4MVForward == FALSE) && (pmbmd -> m_bMCSEL == FALSE)) { // GMC pmbmd->m_bFieldMV = getSingleBit (); // get field_prediction if (pmbmd->m_bFieldMV == TRUE) { pmbmd->m_bForwardTop = getSingleBit (); // get top field reference pmbmd->m_bForwardBottom = getSingleBit (); // get bottom field reference } } }#endif#ifdef USE_BSFAST _BSFAST_DONE();#endif setDCVLCMode(pmbmd, pbRestart);}// B-VOP#ifndef USE_BSFASTINLINE Void decodeMBTextureHeadOfBVOP (CMBMode* pmbmd, Int *iCurrQP){ Int iBlk = 0, iMODB = 0, iMCBPC = 0, iCBPC = 0, iCBPY = 0, iMbType, uiCBPB = 0; Int nNextBit; pmbmd->m_bhas4MVForward = pmbmd->m_bhas4MVBackward = FALSE; pmbmd->m_bMCSEL = FALSE; pmbmd->m_bSkip = FALSE; pmbmd->m_dctMd = INTER; pmbmd->m_intStepDelta = 0; pmbmd->m_bFieldDCT = FALSE; pmbmd->m_bFieldMV = FALSE; MP4V_RETSINGLEBIT(&nNextBit); if (MP4V_EOF()) return; if (nNextBit == 1) //MODB=1 colocated non-skip but curr skip { pmbmd->m_bSkip = TRUE; iMODB = 0; pmbmd->m_mbType = (!(g_pVOL->volType == ENHN_LAYER && g_pVOP->iRefSelectCode == 0))? DIRECT : FORWARD;#ifdef DUAL_MODE if(g_pVOL->volType == ENHN_LAYER && m_vopmd.iRefSelectCode == 0) return;#endif } else { MP4V_RETSINGLEBIT(&nNextBit); if (nNextBit == 1) //MODB="01" {#ifdef DUAL_MODE if (g_pVOL->volType == BASE_LAYER || (g_pVOL->volType == ENHN_LAYER && g_pVOP->iRefSelectCode != 0))#endif iMbType = decodeSymbol (m_pentrdecMbTypeBVOP);#ifdef DUAL_MODE else { if (getSingleBit () == 1) iMbType = FORWARD; else if (getSingleBit () == 1) iMbType = INTERPOLATE; else if (getSingleBit () == 1) iMbType = BACKWARD; else { fprintf(stderr,"MB Type 0000 does not exsit.\n"); exit(2); } }#endif#ifndef NO_ASSERTS assert (iMbType >= 0 && iMbType <= 3);#endif pmbmd->m_mbType = (MBType) iMbType; iMODB = 1; } else //MODB="00" {#ifdef DUAL_MODE if (g_pVOL->volType == BASE_LAYER || (g_pVOL->volType == ENHN_LAYER && g_pVOP->iRefSelectCode != 0))#endif iMbType = decodeSymbol (m_pentrdecMbTypeBVOP);#ifdef DUAL_MODE else { if (getSingleBit () == 1) iMbType = FORWARD; else if (getSingleBit () == 1) iMbType = INTERPOLATE; else if (getSingleBit () == 1) iMbType = BACKWARD; else { fprintf(stderr,"MB Type 0000 is not exsit.\n"); exit(2); } }#endif#ifndef NO_ASSERTS assert (iMbType >= 0 && iMbType <= 3);#endif pmbmd->m_mbType = (MBType) iMbType; iMODB = 2; uiCBPB = getBits (6); pmbmd->m_bhas4MVForward = pmbmd->m_bhas4MVBackward = FALSE; //this is okay; will be reset later //Only one mv for B-VOP except direct mode (will be reset in mvdec.cpp) iCBPC = uiCBPB & 0x0003; iCBPY = (uiCBPB >> 2) & 0x000F; if (pmbmd->m_mbType != DIRECT) { Int DQUANT = 0, iQuantMax; MP4V_RETSINGLEBIT(&nNextBit); if (nNextBit) { DQUANT = -2; MP4V_RETSINGLEBIT(&nNextBit); if (nNextBit) DQUANT = 2; } pmbmd->m_intStepDelta = DQUANT; (*iCurrQP) += pmbmd->m_intStepDelta; iQuantMax = (1<<g_pVOL->uiQuantPrecision) - 1; CHECKRANGE ((*iCurrQP), 1, iQuantMax); } } } pmbmd->m_stepSize = (*iCurrQP); SETCBPYANDC (pmbmd, iCBPC, iCBPY); if (pmbmd->m_mbType == DIRECT) pmbmd->m_dctMd = INTER; //direct mode doesn't have dquant else pmbmd->m_dctMd = INTERQ; //meaningless in B_VOP 'cause DQUANT is always sent#ifdef ENABLE_INTERLACING if (m_vopmd.bInterlace) { if (uiCBPB != 0) pmbmd->m_bFieldDCT = getSingleBit (); // get dct_type if (pmbmd->m_mbType != DIRECT) { pmbmd->m_bFieldMV = getSingleBit (); if (pmbmd->m_bFieldMV) { if (pmbmd->m_mbType != BACKWARD) { pmbmd->m_bForwardTop = getSingleBit (); pmbmd->m_bForwardBottom = getSingleBit (); } if (pmbmd->m_mbType != FORWARD) { pmbmd->m_bBackwardTop = getSingleBit (); pmbmd->m_bBackwardBottom = getSingleBit (); } } } }#endif}#else // USE_BSFASTINLINE Void decodeMBTextureHeadOfBVOP (CMBMode* pmbmd, Int *iCurrQP){ Int iBlk = 0, iMODB = 0, iMCBPC = 0, iCBPC = 0, iCBPY = 0, iMbType, uiCBPB = 0; Int nNextBit, nPeakNextBit = 0; _BSFAST_DECL; UInt bitsread; _BSFAST_INIT(); pmbmd->m_bhas4MVForward = pmbmd->m_bhas4MVBackward = FALSE; pmbmd->m_bMCSEL = FALSE; pmbmd->m_bSkip = FALSE; pmbmd->m_dctMd = INTER; pmbmd->m_intStepDelta = 0; pmbmd->m_bFieldDCT = FALSE; pmbmd->m_bFieldMV = FALSE; nNextBit = _BSFastGetBits(1); nPeakNextBit = _BSFastPeekBits(1); if (MP4V_EOF()) return; if (nNextBit == 1) //MODB=1 colocated non-skip but curr skip { pmbmd->m_bSkip = TRUE; iMODB = 0; pmbmd->m_mbType = (!(g_pVOL->volType == ENHN_LAYER && g_pVOP->iRefSelectCode == 0))? DIRECT : FORWARD;#ifdef DUAL_MODE if(g_pVOL->volType == ENHN_LAYER && m_vopmd.iRefSelectCode == 0) return;#endif } else if (nPeakNextBit == 1) //MODB="01" { _BSFastGetBits(1); // now read the actual bit we just peaked#ifdef DUAL_MODE if (g_pVOL->volType == BASE_LAYER || (g_pVOL->volType == ENHN_LAYER && g_pVOP->iRefSelectCode != 0))#endif { iMbType = decodeSymbol_WithFastBS (m_pentrdecMbTypeBVOP,_BSFastCurrentBits(), &bitsread); _BSFastSkipBits(bitsread); _BSFastCheckedPreload(); }#ifdef DUAL_MODE else { if (getSingleBit () == 1) iMbType = FORWARD; else if (getSingleBit () == 1) iMbType = INTERPOLATE; else if (getSingleBit () == 1) iMbType = BACKWARD; else { fprintf(stderr,"MB Type 0000 does not exsit.\n"); exit(2); } }#endif#ifndef NO_ASSERTS assert (iMbType >= 0 && iMbType <= 3);#endif pmbmd->m_mbType = (MBType) iMbType; iMODB = 1; } else //MODB="00" { _BSFastGetBits(1); // now read the actual bit we just peaked#ifdef DUAL_MODE if (g_pVOL->volType == BASE_LAYER || (g_pVOL->volType == ENHN_LAYER && g_pVOP->iRefSelectCode != 0))#endif { iMbType = decodeSymbol_WithFastBS (m_pentrdecMbTypeBVOP,_BSFastCurrentBits(), &bitsread); _BSFastSkipBits(bitsread); _BSFastCheckedPreload(); }#ifdef DUAL_MODE else { if (getSingleBit () == 1) iMbType = FORWARD; else if (getSingleBit () == 1) iMbType = INTERPOLATE; else if (getSingleBit () == 1) iMbType = BACKWARD; else { fprintf(stderr,"MB Type 0000 is not exsit.\n"); exit(2); } }#endif#ifndef NO_ASSERTS assert (iMbType >= 0 && iMbType <= 3);#endif pmbmd->m_mbType = (MBType) iMbType; iMODB = 2; uiCBPB =_BSFastGetBits(6); pmbmd->m_bhas4MVForward = pmbmd->m_bhas4MVBackward = FALSE; //this is okay; will be reset later //Only one mv for B-VOP except direct mode (will be reset in mvdec.cpp) iCBPC = uiCBPB & 0x0003; iCBPY = (uiCBPB >> 2) & 0x000F; if (pmbmd->m_mbType != DIRECT) { Int DQUANT; Int iQuantMax; nNextBit = _BSFastGetBits(1); if (!nNextBit) DQUANT = 0; else { nNextBit = _BSFastGetBits(1); if (!nNextBit) DQUANT = -2; else DQUANT = 2; } pmbmd->m_intStepDelta = DQUANT; (*iCurrQP) += pmbmd->m_intStepDelta; iQuantMax = (1<<g_pVOL->uiQuantPrecision) - 1; CHECKRANGE ((*iCurrQP), 1, iQuantMax); } } pmbmd->m_stepSize = (*iCurrQP); SETCBPYANDC (pmbmd, iCBPC, iCBPY); if (pmbmd->m_mbType == DIRECT) pmbmd->m_dctMd = INTER; //direct mode doesn't have dquant else pmbmd->m_dctMd = INTERQ; //meaningless in B_VOP 'cause DQUANT is always sent#ifdef ENABLE_INTERLACING if (m_vopmd.bInterlace) { if (uiCBPB != 0) pmbmd->m_bFieldDCT = getSingleBit (); // get dct_type if (pmbmd->m_mbType != DIRECT) { pmbmd->m_bFieldMV = getSingleBit (); if (pmbmd->m_bFieldMV) { if (pmbmd->m_mbType != BACKWARD) { pmbmd->m_bForwardTop = getSingleBit (); pmbmd->m_bForwardBottom = getSingleBit (); } if (pmbmd->m_mbType != FORWARD) { pmbmd->m_bBackwardTop = getSingleBit (); pmbmd->m_bBackwardBottom = getSingleBit (); } } } }#endif _BSFAST_DONE();}#endif // USE_BSFAST
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -