📄 mbenc.cpp
字号:
codeMBTextureHeadOfBVOP (pmbmd); if (!pmbmd -> m_bSkip) { m_statsMB.nBitsMV += encodeMVofBVOP (pmv, pmvBackward, pmbmd, iMBX, iMBY, pmvRef, pmbmdRef); // need to see the MB type to decide what MV to be sent sendDCTCoefOfInterMBTexture (pmbmd); //addErrorAndPredToCurrQ (ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV); // delete by Hyundai, ok swinder } else assignPredToCurrQ (ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV); if (m_volmd.fAUsage == EIGHT_BIT) { codeMBAlphaHeadOfBVOP (pmbmd); if (pmbmd -> m_CODAlpha == ALPHA_CODED) { sendDCTCoefOfInterMBAlpha (pmbmd); //addAlphaErrorAndPredToCurrQ (ppxlcCurrQMBA); // delete by Hyundai, ok swinder } else if(pmbmd -> m_CODAlpha == ALPHA_SKIPPED) assignAlphaPredToCurrQ (ppxlcCurrQMBA); } /*BBM// Added for Boundary by Hyundai(1998-5-9) if (m_vopmd.bInterlace && pmbmd -> m_bMerged[0]) mergedMacroBlockSplit (pmbmd); // End of Hyundai(1998-5-9)*/ if (!pmbmd -> m_bSkip) addErrorAndPredToCurrQ (ppxlcCurrQMBY, ppxlcCurrQMBU, ppxlcCurrQMBV); if (m_volmd.fAUsage == EIGHT_BIT && pmbmd -> m_CODAlpha == ALPHA_CODED) addAlphaErrorAndPredToCurrQ (ppxlcCurrQMBA); }}Void CVideoObjectEncoder::codeMBTextureHeadOfIVOP (const CMBMode* pmbmd){ UInt CBPC = (pmbmd->getCodedBlockPattern (U_BLOCK) << 1) | pmbmd->getCodedBlockPattern (V_BLOCK); //per defintion of H.263's CBPC assert (CBPC >= 0 && CBPC <= 3); Int CBPY = 0; UInt cNonTrnspBlk = 0, iBlk; for (iBlk = (UInt) Y_BLOCK1; iBlk <= (UInt) Y_BLOCK4; iBlk++) { if (pmbmd->m_rgTranspStatus [iBlk] != ALL) cNonTrnspBlk++; } UInt iBitPos = 1; for (iBlk = (UInt) Y_BLOCK1; iBlk <= (UInt) Y_BLOCK4; iBlk++) { if (pmbmd->m_rgTranspStatus [iBlk] != ALL) { CBPY |= pmbmd->getCodedBlockPattern ((BlockNum) iBlk) << (cNonTrnspBlk - iBitPos); iBitPos++; } } assert (CBPY >= 0 && CBPY <= 15); //per defintion of H.263's CBPY Int iSymbol = 4 * pmbmd->m_dctMd + CBPC; assert (iSymbol >= 0 && iSymbol <= 7); //send MCBPC#ifdef __TRACE_AND_STATS_ m_pbitstrmOut->trace (iSymbol, "MB_MCBPC");#endif // __TRACE_AND_STATS_ m_statsMB.nBitsMCBPC += m_pentrencSet->m_pentrencMCBPCintra->encodeSymbol (iSymbol, "MB_MCBPC"); //fprintf(stderr,"MCBPC = %d\n",iSymbol); m_pbitstrmOut->putBits (pmbmd->m_bACPrediction, 1, "MB_ACPRED"); m_statsMB.nBitsIntraPred++; //fprintf(stderr,"ACPred = %d\n",pmbmd->m_bACPrediction);#ifdef __TRACE_AND_STATS_ m_pbitstrmOut->trace (cNonTrnspBlk, "MB_NumNonTranspBlks"); m_pbitstrmOut->trace (CBPY, "MB_CBPY (I-style)");#endif // __TRACE_AND_STATS_ switch (cNonTrnspBlk) { case 1: m_statsMB.nBitsCBPY += m_pentrencSet->m_pentrencCBPY1->encodeSymbol (CBPY, "MB_CBPY"); break; case 2: m_statsMB.nBitsCBPY += m_pentrencSet->m_pentrencCBPY2->encodeSymbol (CBPY, "MB_CBPY"); break; case 3: m_statsMB.nBitsCBPY += m_pentrencSet->m_pentrencCBPY3->encodeSymbol (CBPY, "MB_CBPY"); break; case 4: m_statsMB.nBitsCBPY += m_pentrencSet->m_pentrencCBPY->encodeSymbol (CBPY, "MB_CBPY"); break; default: assert (FALSE); } //fprintf(stderr,"CBPY = %d\n",CBPY); m_statsMB.nIntraMB++; if (pmbmd->m_dctMd == INTRAQ) { Int DQUANT = pmbmd->m_intStepDelta; //send DQUANT assert (DQUANT >= -2 && DQUANT <= 2); if (DQUANT != 0) { if (sign (DQUANT) == 1) m_pbitstrmOut->putBits (DQUANT + 1, 2, "MB_DQUANT"); else m_pbitstrmOut->putBits (-1 - DQUANT, 2, "MB_DQUANT"); m_statsMB.nBitsDQUANT += 2; } }// INTERLACE if(m_vopmd.bInterlace==TRUE) { m_pbitstrmOut->putBits (pmbmd->m_bFieldDCT, 1, "DCT_TYPE"); // send dct_type m_statsMB.nBitsInterlace += 1; }// ~INTERLACE}Void CVideoObjectEncoder::codeMBTextureHeadOfPVOP (const CMBMode* pmbmd){ UInt CBPC = (pmbmd->getCodedBlockPattern (U_BLOCK) << 1) | pmbmd->getCodedBlockPattern (V_BLOCK); //per defintion of H.263's CBPC assert (CBPC >= 0 && CBPC <= 3); Int CBPY = 0; UInt cNonTrnspBlk = 0, iBlk; for (iBlk = (UInt) Y_BLOCK1; iBlk <= (UInt) Y_BLOCK4; iBlk++) { if (pmbmd->m_rgTranspStatus [iBlk] != ALL) cNonTrnspBlk++; } UInt iBitPos = 1; for (iBlk = (UInt) Y_BLOCK1; iBlk <= (UInt) Y_BLOCK4; iBlk++) { if (pmbmd->m_rgTranspStatus [iBlk] != ALL) { CBPY |= pmbmd->getCodedBlockPattern ((BlockNum) iBlk) << (cNonTrnspBlk - iBitPos); iBitPos++; } } assert (CBPY >= 0 && CBPY <= 15); //per defintion of H.263's CBPY m_pbitstrmOut->putBits (pmbmd->m_bSkip, 1, "MB_Skip"); m_statsMB.nBitsCOD++; if (pmbmd->m_bSkip) m_statsMB.nSkipMB++; else { Int iMBtype; //per H.263's MBtype if (pmbmd->m_dctMd == INTRA || pmbmd->m_dctMd == INTRAQ) iMBtype = pmbmd->m_dctMd + 3; else iMBtype = (pmbmd -> m_dctMd - 2) | pmbmd -> m_bhas4MVForward << 1; assert (iMBtype >= 0 && iMBtype <= 4);#ifdef __TRACE_AND_STATS_ m_pbitstrmOut->trace (iMBtype, "MB_MBtype"); m_pbitstrmOut->trace (CBPC, "MB_CBPC");#endif // __TRACE_AND_STATS_ m_statsMB.nBitsMCBPC += m_pentrencSet->m_pentrencMCBPCinter->encodeSymbol (iMBtype * 4 + CBPC, "MCBPC"); if (pmbmd->m_dctMd == INTRA || pmbmd->m_dctMd == INTRAQ) { m_pbitstrmOut->putBits (pmbmd->m_bACPrediction, 1, "MB_ACPRED"); m_statsMB.nBitsIntraPred++;#ifdef __TRACE_AND_STATS_ m_pbitstrmOut->trace (cNonTrnspBlk, "MB_NumNonTranspBlks"); m_pbitstrmOut->trace (CBPY, "MB_CBPY (I-style)");#endif // __TRACE_AND_STATS_ switch (cNonTrnspBlk) { case 1: m_statsMB.nBitsCBPY += m_pentrencSet->m_pentrencCBPY1->encodeSymbol (CBPY, "MB_CBPY"); break; case 2: m_statsMB.nBitsCBPY += m_pentrencSet->m_pentrencCBPY2->encodeSymbol (CBPY, "MB_CBPY"); break; case 3: m_statsMB.nBitsCBPY += m_pentrencSet->m_pentrencCBPY3->encodeSymbol (CBPY, "MB_CBPY"); break; case 4: m_statsMB.nBitsCBPY += m_pentrencSet->m_pentrencCBPY->encodeSymbol (CBPY, "MB_CBPY"); break; default: assert (FALSE); } m_statsMB.nIntraMB++; } else {#ifdef __TRACE_AND_STATS_ m_pbitstrmOut->trace (cNonTrnspBlk, "MB_NumNonTranspBlks"); m_pbitstrmOut->trace (CBPY, "MB_CBPY (P-style)");#endif // __TRACE_AND_STATS_ switch (cNonTrnspBlk) { case 1: m_statsMB.nBitsCBPY += m_pentrencSet->m_pentrencCBPY1->encodeSymbol (1 - CBPY, "MB_CBPY"); break; case 2: m_statsMB.nBitsCBPY += m_pentrencSet->m_pentrencCBPY2->encodeSymbol (3 - CBPY, "MB_CBPY"); break; case 3: m_statsMB.nBitsCBPY += m_pentrencSet->m_pentrencCBPY3->encodeSymbol (7 - CBPY, "MB_CBPY"); break; case 4: m_statsMB.nBitsCBPY += m_pentrencSet->m_pentrencCBPY->encodeSymbol (15 - CBPY, "MB_CBPY"); break; default: assert (FALSE); } if(pmbmd ->m_bhas4MVForward) m_statsMB.nInter4VMB++;// INTERLACE else if (pmbmd-> m_bFieldMV) m_statsMB.nFieldForwardMB++;// ~INTERLACE else m_statsMB.nInterMB++; } if (pmbmd->m_dctMd == INTERQ || pmbmd->m_dctMd == INTRAQ) { Int DQUANT = pmbmd->m_intStepDelta; //send DQUANT assert (DQUANT >= -2 && DQUANT <= 2); if (DQUANT != 0) { if (sign (DQUANT) == 1) m_pbitstrmOut->putBits (DQUANT + 1, 2, "MB_DQUANT"); else m_pbitstrmOut->putBits (-1 - DQUANT, 2, "MB_DQUANT"); m_statsMB.nBitsDQUANT += 2; } }// INTERLACE if (m_vopmd.bInterlace == TRUE) { if((pmbmd->m_dctMd == INTRA) || (pmbmd->m_dctMd == INTRAQ) || (CBPC || CBPY)) { m_pbitstrmOut->putBits (pmbmd->m_bFieldDCT, 1, "DCT_Type"); m_statsMB.nBitsInterlace += 1; } if((pmbmd->m_dctMd == INTER || pmbmd->m_dctMd == INTERQ )&&(pmbmd -> m_bhas4MVForward == FALSE)) { m_pbitstrmOut->putBits (pmbmd->m_bFieldMV, 1, "Field_Prediction"); m_statsMB.nBitsInterlace += 1; if(pmbmd->m_bFieldMV) { m_pbitstrmOut->putBits (pmbmd->m_bForwardTop, 1, "Forward_Top_Field_Ref"); m_pbitstrmOut->putBits (pmbmd->m_bForwardBottom, 1, "Forward_Bot_Field_Ref"); m_statsMB.nBitsInterlace += 2; } } }// ~INTERLACE }}Void CVideoObjectEncoder::codeMBTextureHeadOfBVOP (const CMBMode* pmbmd){ U8 uchCBPB = 0; if (pmbmd->m_bSkip) { if (m_volmd.volType == BASE_LAYER) { assert (pmbmd -> m_rgTranspStatus [0] != ALL); if (pmbmd->m_bColocatedMBSkip) return; } m_pbitstrmOut->putBits (1, 1, "MB_MODB"); m_statsMB.nBitsMODB++; m_statsMB.nSkipMB++; if(m_volmd.volType == ENHN_LAYER && m_vopmd.iRefSelectCode == 0) return; } else { Int iCBPC = (pmbmd->getCodedBlockPattern (U_BLOCK) << 1) | pmbmd->getCodedBlockPattern (V_BLOCK); //per defintion of H.263's CBPC assert (iCBPC >= 0 && iCBPC <= 3); Int iCBPY = 0; Int iNumNonTrnspBlk = 0, iBlk; for (iBlk = Y_BLOCK1; iBlk <= Y_BLOCK4; iBlk++) iNumNonTrnspBlk += (pmbmd->m_rgTranspStatus [iBlk] != ALL); Int iBitPos = 1; for (iBlk = Y_BLOCK1; iBlk <= Y_BLOCK4; iBlk++) { if (pmbmd->m_rgTranspStatus [iBlk] != ALL) { iCBPY |= pmbmd->getCodedBlockPattern ((BlockNum) iBlk) << (iNumNonTrnspBlk - iBitPos); iBitPos++; } } assert (iCBPY >= 0 && iCBPY <= 15); //per defintion of H.263's CBPY uchCBPB = (iCBPY << 2 | iCBPC) & 0x3F; if (uchCBPB == 0) { m_pbitstrmOut->putBits (1, 2, "MB_MODB"); m_statsMB.nBitsMODB += 2; if (m_volmd.volType == BASE_LAYER || (m_volmd.volType == ENHN_LAYER && m_vopmd.iRefSelectCode != 0)) m_statsMB.nBitsMBTYPE += m_pentrencSet->m_pentrencMbTypeBVOP->encodeSymbol (pmbmd->m_mbType, "MB_TYPE"); else { Int iMbtypeBits =0; if(pmbmd->m_mbType == FORWARD) iMbtypeBits = 1; else if(pmbmd->m_mbType == INTERPOLATE) iMbtypeBits = 2; else if(pmbmd->m_mbType == BACKWARD) iMbtypeBits = 3; Int iMbtypeValue = 1; m_statsMB.nBitsMBTYPE += iMbtypeBits; m_pbitstrmOut->putBits (iMbtypeValue, iMbtypeBits, "MB_TYPE"); } } else { m_pbitstrmOut->putBits (0, 2,"MB_MODB"); m_statsMB.nBitsMODB += 2; //m_stat.nBitsMBTYPE += m_pentrencMbTypeBVOP->encodeSymbol (pmbmd->m_mbType, "MB_TYPE"); if (m_volmd.volType == BASE_LAYER || (m_volmd.volType == ENHN_LAYER && m_vopmd.iRefSelectCode != 0)) m_statsMB.nBitsMBTYPE += m_pentrencSet->m_pentrencMbTypeBVOP->encodeSymbol (pmbmd->m_mbType, "MB_TYPE"); else { Int iMbtypeBits =0; if(pmbmd->m_mbType == FORWARD) iMbtypeBits = 1; else if(pmbmd->m_mbType == INTERPOLATE) iMbtypeBits = 2; else if(pmbmd->m_mbType == BACKWARD) iMbtypeBits = 3; Int iMbtypeValue = 1; m_statsMB.nBitsMBTYPE += iMbtypeBits; m_pbitstrmOut->putBits (iMbtypeValue, iMbtypeBits, "MB_TYPE"); } m_pbitstrmOut -> putBits (uchCBPB, iNumNonTrnspBlk + 2, "MB_CBPB"); m_statsMB.nBitsCBPB += iNumNonTrnspBlk + 2; } switch (pmbmd->m_mbType) { case FORWARD: m_statsMB.nForwardMB++; break; case BACKWARD: m_statsMB.nBackwardMB++; break; case DIRECT: m_statsMB.nDirectMB++; break; case INTERPOLATE: m_statsMB.nInterpolateMB++; break; default: assert (FALSE); } } if (pmbmd->m_mbType != DIRECT) { if (uchCBPB != 0) { //no need to send when MODB = 10 Int DQUANT = pmbmd->m_intStepDelta; //send DQUANT assert (DQUANT == -2 || DQUANT == 2 || DQUANT == 0); if (DQUANT == 0) { m_pbitstrmOut->putBits ((Int) 0, (UInt) 1, "MB_DQUANT"); m_statsMB.nBitsDQUANT += 1; } else { if (DQUANT == 2) m_pbitstrmOut->putBits (3, 2, "MB_DQUANT"); else m_pbitstrmOut->putBits (2, 2, "MB_DQUANT"); m_statsMB.nBitsDQUANT += 2; } } }// INTERLACE if (pmbmd->m_bSkip) { if (m_vopmd.bInterlace && (pmbmd->m_mbType == DIRECT) && pmbmd->m_bFieldMV) m_statsMB.nFieldDirectMB++; } else if (m_vopmd.bInterlace) { if (uchCBPB) { m_pbitstrmOut->putBits((Int) pmbmd->m_bFieldDCT, 1, "DCT_TYPE"); m_statsMB.nBitsInterlace++; } if (pmbmd->m_bFieldMV) { switch (pmbmd->m_mbType) { case FORWARD: m_pbitstrmOut->putBits(1, 1, "FIELD_PREDICTION"); m_pbitstrmOut->putBits((Int)pmbmd->m_bForwardTop, 1, "FORWARD_TOP_FIELD_REFERENCE"); m_pbitstrmOut->putBits((Int)pmbmd->m_bForwardBottom, 1, "FORWARD_BOTTOM_FIELD_REFERENCE"); m_statsMB.nFieldForwardMB++; m_statsMB.nBitsInterlace += 3; break; case BACKWARD: m_pbitstrmOut->putBits(1, 1, "FIELD_PREDICTION"); m_pbitstrmOut->putBits((Int)pmbmd->m_bBackwardTop, 1, "BACKWARD_TOP_FIELD_REFERENCE"); m_pbitstrmOut->putBits((Int)pmbmd->m_bBackwardBottom, 1, "BACKWARD_BOTTOM_FIELD_REFERENCE"); m_statsMB.nFieldBackwardMB++; m_statsMB.nBitsInterlace += 3; break; case INTERPOLATE: m_pbitstrmOut->putBits(1, 1, "FIELD_PREDICTION"); m_pbitstrmOut->putBits((Int)pmbmd->m_bForwardTop, 1, "FORWARD_TOP_FIELD_REFERENCE"); m_pbitstrmOut->putBits((Int)pmbmd->m_bForwardBottom, 1, "FORWARD_BOTTOM_FIELD_REFERENCE"); m_pbitstrmOut->putBits((Int)pmbmd->m_bBackwardTop, 1, "BACKWARD_TOP_FIELD_REFERENCE"); m_pbitstrmOut->putBits((Int)pmbmd->m_bBackwardBottom, 1, "BACKWARD_BOTTOM_FIELD_REFERENCE"); m_statsMB.nFieldInterpolateMB++; m_statsMB.nBitsInterlace += 5; break; case DIRECT: m_statsMB.nFieldDirectMB++; break; } } else if (pmbmd->m_mbType != DIRECT) { m_pbitstrmOut->putBits(0, 1, "FIELD_PREDICTION"); m_statsMB.nBitsInterlace++; } }// ~INTERLACE}Void CVideoObjectEncoder::copyToCurrBuffWithShape ( const PixelC* ppxlcCurrY, const PixelC* ppxlcCurrU, const PixelC* ppxlcCurrV, const PixelC* ppxlcCurrBY, const PixelC* ppxlcCurrA, Int iWidthY, Int iWidthUV){ PixelC* ppxlcCurrMBY = m_ppxlcCurrMBY; PixelC* ppxlcCurrMBU = m_ppxlcCurrMBU; PixelC* ppxlcCurrMBV = m_ppxlcCurrMBV; PixelC* ppxlcCurrMBBY = m_ppxlcCurrMBBY; Int ic; for (ic = 0; ic < BLOCK_SIZE; ic++) { memcpy (ppxlcCurrMBY, ppxlcCurrY, MB_SIZE*sizeof(PixelC)); memcpy (ppxlcCurrMBU, ppxlcCurrU, BLOCK_SIZE*sizeof(PixelC)); memcpy (ppxlcCurrMBV, ppxlcCurrV, BLOCK_SIZE*sizeof(PixelC)); memcpy (ppxlcCurrMBBY, ppxlcCurrBY, MB_SIZE*sizeof(PixelC)); ppxlcCurrMBY += MB_SIZE; ppxlcCurrY += iWidthY; ppxlcCurrMBU += BLOCK_SIZE; ppxlcCurrU += iWidthUV; ppxlcCurrMBV += BLOCK_SIZE; ppxlcCurrV += iWidthUV; ppxlcCurrMBBY += MB_SIZE; ppxlcCurrBY += iWidthY; memcpy (ppxlcCurrMBY, ppxlcCurrY, MB_SIZE*sizeof(PixelC)); // two rows for Y memcpy (ppxlcCurrMBBY, ppxlcCurrBY, MB_SIZE*sizeof(PixelC)); ppxlcCurrMBY += MB_SIZE; ppxlcCurrY += iWidthY; ppxlcCurrMBBY += MB_SIZE; ppxlcCurrBY += iWidthY; } if (m_volmd.fAUsage == EIGHT_BIT) { PixelC* ppxlcCurrMBA = m_ppxlcCurrMBA; for (ic = 0; ic < MB_SIZE; ic++) { memcpy (ppxlcCurrMBA, ppxlcCurrA, MB_SIZE*sizeof(PixelC)); ppxlcCurrMBA += MB_SIZE; ppxlcCurrA += iWidthY; } }}Void CVideoObjectEncoder::copyToCurrBuffJustShape(const PixelC* ppxlcCurrBY, Int iWidthY){ PixelC* ppxlcCurrMBBY = m_ppxlcCurrMBBY; Int ic; for (ic = 0; ic < BLOCK_SIZE; ic++) { memcpy (ppxlcCurrMBBY, ppxlcCurrBY, MB_SIZE*sizeof(PixelC)); ppxlcCurrMBBY += MB_SIZE; ppxlcCurrBY += iWidthY; memcpy (ppxlcCurrMBBY, ppxlcCurrBY, MB_SIZE*sizeof(PixelC)); ppxlcCurrMBBY += MB_SIZE; ppxlcCurrBY += iWidthY; }}Void CVideoObjectEncoder::copyToCurrBuff ( const PixelC* ppxlcCurrY, const PixelC* ppxlcCurrU, const PixelC* ppxlcCurrV, Int iWidthY, Int iWidthUV)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -