📄 mbenc.cpp
字号:
// : bSkipAllowed && pmv->isZero ();
Int* rgiBlkCurrQ = m_ppxliErrorMBY;
Int* rgiCoefQ;
Int iWidthCurrQ;
Bool bSkipAlpha = TRUE;
for (UInt iBlk = (UInt) Y_BLOCK1; iBlk <= (UInt)iBlkEnd; iBlk++) {
if (iBlk < (UInt) U_BLOCK || iBlk> (UInt) V_BLOCK) {
if (pmbmd -> m_rgTranspStatus [iBlk % 6] == ALL)
continue;
switch (iBlk)
{
case (Y_BLOCK1):
rgiBlkCurrQ = m_ppxliErrorMBY;
break;
case (Y_BLOCK2):
rgiBlkCurrQ = m_ppxliErrorMBY + BLOCK_SIZE;
break;
case (Y_BLOCK3):
rgiBlkCurrQ = m_ppxliErrorMBY + MB_SIZE * BLOCK_SIZE;
break;
case (Y_BLOCK4):
rgiBlkCurrQ = m_ppxliErrorMBY + MB_SIZE * BLOCK_SIZE + BLOCK_SIZE;
break;
case (A_BLOCK1):
rgiBlkCurrQ = m_ppxliErrorMBA;
break;
case (A_BLOCK2):
rgiBlkCurrQ = m_ppxliErrorMBA + BLOCK_SIZE;
break;
case (A_BLOCK3):
rgiBlkCurrQ = m_ppxliErrorMBA + MB_SIZE * BLOCK_SIZE;
break;
case (A_BLOCK4):
rgiBlkCurrQ = m_ppxliErrorMBA + MB_SIZE * BLOCK_SIZE + BLOCK_SIZE;
break;
}
iWidthCurrQ = MB_SIZE;
}
else {
iWidthCurrQ = BLOCK_SIZE;
rgiBlkCurrQ = (iBlk == U_BLOCK) ? m_ppxliErrorMBU: m_ppxliErrorMBV;
}
rgiCoefQ = m_rgpiCoefQ [iBlk - 1];
if(iBlk>=A_BLOCK1)
quantizeTextureInterBlock (rgiBlkCurrQ, iWidthCurrQ, rgiCoefQ, iQPA, TRUE);
else
quantizeTextureInterBlock (rgiBlkCurrQ, iWidthCurrQ, rgiCoefQ, iQP, FALSE);
Bool bCoded = FALSE;
UInt i;
for (i = 0; i < BLOCK_SQUARE_SIZE; i++) {
if (rgiCoefQ [i] != 0) {
bCoded = TRUE;
bMBCoded = TRUE;
break;
}
}
if(iBlk<A_BLOCK1)
bSkip = bSkip & !bCoded;
else
bSkipAlpha = bSkipAlpha & !bCoded;
pmbmd->setCodedBlockPattern ((BlockNum) iBlk, bCoded);
}
pmbmd->m_bSkip = bSkip;
if(m_volmd.fAUsage == EIGHT_BIT)
{
if(bSkipAlpha == TRUE)
pmbmd->m_CODAlpha = ALPHA_SKIPPED;
else if(pmbmd->m_CODAlpha == ALPHA_ALL255)
{
PixelC *ppxlc = ppxlcCurrQMBA;
Int i;
for(i = 0; i<MB_SIZE; i++, ppxlc += m_iFrameWidthY)
pxlcmemset(ppxlc, 255, MB_SIZE);
}
}
// INTERLACE
if ((pmbmd->m_rgTranspStatus [0] == NONE)
&&(m_vopmd.bInterlace == TRUE) && (pmbmd->m_bFieldDCT == TRUE)
&& (bMBCoded == TRUE))
fieldDCTtoFrameI(m_ppxliErrorMBY);
// ~INTERLACE
}
Void CVideoObjectEncoder::sendDCTCoefOfInterMBTexture (const CMBMode* pmbmd)
{
assert (pmbmd != NULL);
assert (pmbmd -> m_dctMd == INTER || pmbmd -> m_dctMd == INTERQ);
assert (pmbmd -> m_rgTranspStatus [0] != ALL);
UInt nBits, iBlk = 0;
for (iBlk = Y_BLOCK1; iBlk <= V_BLOCK; iBlk++) {
#ifdef __TRACE_AND_STATS_
m_pbitstrmOut->trace (iBlk, "BLK_NO");
#endif // __TRACE_AND_STATS_
if (iBlk < U_BLOCK)
if (pmbmd -> m_rgTranspStatus [iBlk] == ALL) continue;
if (pmbmd->getCodedBlockPattern ((BlockNum) iBlk)) {
Int* rgiCoefQ = m_rgpiCoefQ [iBlk - 1];
#ifdef __TRACE_AND_STATS_
m_pbitstrmOut->trace (rgiCoefQ, BLOCK_SQUARE_SIZE, "BLK_QUANTIZED_COEF");
#endif // __TRACE_AND_STATS_
// Modified for data partitioning mode by Toshiba(1998-1-16)
if(m_volmd.bDataPartitioning && m_volmd.bReversibleVlc && m_vopmd.vopPredType != BVOP)
nBits = sendTCOEFInterRVLC (rgiCoefQ, 0, grgiStandardZigzag, TRUE);
else
nBits = sendTCOEFInter (rgiCoefQ, 0,
m_vopmd.bAlternateScan ? grgiVerticalZigzag : grgiStandardZigzag);
// End Toshiba(1998-1-16)
switch (iBlk) {
case U_BLOCK:
m_statsMB.nBitsCr += nBits;
break;
case V_BLOCK:
m_statsMB.nBitsCb += nBits;
break;
default:
m_statsMB.nBitsY += nBits;
}
}
}
}
Void CVideoObjectEncoder::sendDCTCoefOfIntraMBTexture (const CMBMode* pmbmd)
{
assert (pmbmd != NULL);
assert (pmbmd -> m_dctMd == INTRA || pmbmd -> m_dctMd == INTRAQ);
assert (pmbmd->m_rgTranspStatus [0] != ALL);
UInt iBlk = 0;
for (iBlk = Y_BLOCK1; iBlk <= V_BLOCK; iBlk++) {
UInt nBits = 0;
#ifdef __TRACE_AND_STATS_
m_pbitstrmOut->trace (iBlk, "BLK_NO");
#endif // __TRACE_AND_STATS_
if (iBlk < U_BLOCK)
if (pmbmd -> m_rgTranspStatus [iBlk] == ALL) continue;
Int* rgiCoefQ = m_rgpiCoefQ [iBlk - 1];
#ifdef __TRACE_AND_STATS_
m_pbitstrmOut->trace (rgiCoefQ, BLOCK_SQUARE_SIZE, "BLK_QUANTIZED_COEF");
#endif // __TRACE_AND_STATS_
Int iCoefStart = 0;
if (pmbmd->m_bCodeDcAsAc != TRUE) {
iCoefStart = 1;
nBits = sendIntraDC (rgiCoefQ, (BlockNum) iBlk);
}
if (pmbmd->getCodedBlockPattern ((BlockNum) iBlk)) {
Int* rgiZigzag = grgiStandardZigzag;
if (m_vopmd.bAlternateScan)
rgiZigzag = grgiVerticalZigzag;
else if (pmbmd->m_bACPrediction)
rgiZigzag = (pmbmd->m_preddir [iBlk - 1] == HORIZONTAL) ? grgiVerticalZigzag : grgiHorizontalZigzag;
// Modified for data partitioning mode by Toshiba(1998-1-16)
if(m_volmd.bDataPartitioning && m_volmd.bReversibleVlc && m_vopmd.vopPredType != BVOP)
nBits += sendTCOEFIntraRVLC (rgiCoefQ, iCoefStart, rgiZigzag, TRUE);
else
nBits += sendTCOEFIntra (rgiCoefQ, iCoefStart, rgiZigzag);
// End Toshiba(1998-1-16)
}
switch (iBlk) {
case U_BLOCK:
m_statsMB.nBitsCr += nBits;
break;
case V_BLOCK:
m_statsMB.nBitsCb += nBits;
break;
default:
m_statsMB.nBitsY += nBits;
}
}
}
UInt CVideoObjectEncoder::sumAbsCurrMB ()
{
PixelC* ppxlcCurrMBY = m_ppxlcCurrMBY;
UInt uisumAbs = 0;
Int ic;
for (ic = 0; ic < MB_SQUARE_SIZE; ic++) {
uisumAbs += ppxlcCurrMBY [ic];
}
return uisumAbs;
}
Void CVideoObjectEncoder::codeMBAlphaHeadOfIVOP (const CMBMode* pmbmd)
{
// get CBPA
Int CBPA = 0;
UInt cNonTrnspBlk = 0, iBlk;
for (iBlk = (UInt) A_BLOCK1; iBlk <= (UInt) A_BLOCK4; iBlk++) {
if (pmbmd->m_rgTranspStatus [iBlk - 6] != ALL)
cNonTrnspBlk++;
}
UInt iBitPos = 1;
for (iBlk = (UInt) A_BLOCK1; iBlk <= (UInt) A_BLOCK4; iBlk++) {
if (pmbmd->m_rgTranspStatus [iBlk - 6] != ALL) {
CBPA |= pmbmd->getCodedBlockPattern ((BlockNum) iBlk) << (cNonTrnspBlk - iBitPos);
iBitPos++;
}
}
assert (CBPA >= 0 && CBPA <= 15);
Int iCODA = 0;
if(pmbmd->m_CODAlpha==ALPHA_ALL255)
iCODA = 1;
m_pbitstrmOut->putBits(iCODA, 1, "MB_CODA");
m_statsMB.nBitsCODA++;
if(iCODA)
return;
m_pbitstrmOut->putBits (pmbmd->m_bACPredictionAlpha, 1, "MB_ACPRED_ALPHA");
m_statsMB.nBitsIntraPred++;
#ifdef __TRACE_AND_STATS_
m_pbitstrmOut->trace (CBPA, "MB_CBPA");
#endif // __TRACE_AND_STATS_
switch (cNonTrnspBlk) {
case 1:
m_statsMB.nBitsCBPA += m_pentrencSet->m_pentrencCBPY1->encodeSymbol (1 - CBPA, "MB_CBPA");
break;
case 2:
m_statsMB.nBitsCBPA += m_pentrencSet->m_pentrencCBPY2->encodeSymbol (3 - CBPA, "MB_CBPA");
break;
case 3:
m_statsMB.nBitsCBPA += m_pentrencSet->m_pentrencCBPY3->encodeSymbol (7 - CBPA, "MB_CBPA");
break;
case 4:
m_statsMB.nBitsCBPA += m_pentrencSet->m_pentrencCBPY->encodeSymbol (15 - CBPA, "MB_CBPA");
break;
default:
assert (FALSE);
}
}
Void CVideoObjectEncoder::codeMBAlphaHeadOfPVOP (const CMBMode* pmbmd)
{
if(pmbmd -> m_dctMd == INTRA || pmbmd -> m_dctMd == INTRAQ)
codeMBAlphaHeadOfIVOP(pmbmd);
else
{
// get CBPA
Int CBPA = 0;
UInt cNonTrnspBlk = 0, iBlk;
for (iBlk = (UInt) A_BLOCK1; iBlk <= (UInt) A_BLOCK4; iBlk++) {
if (pmbmd->m_rgTranspStatus [iBlk - 6] != ALL)
cNonTrnspBlk++;
}
UInt iBitPos = 1;
for (iBlk = (UInt) A_BLOCK1; iBlk <= (UInt) A_BLOCK4; iBlk++) {
if (pmbmd->m_rgTranspStatus [iBlk - 6] != ALL) {
CBPA |= pmbmd->getCodedBlockPattern ((BlockNum) iBlk) << (cNonTrnspBlk - iBitPos);
iBitPos++;
}
}
assert (CBPA >= 0 && CBPA <= 15);
if(pmbmd->m_CODAlpha==ALPHA_CODED)
{
m_pbitstrmOut->putBits(0, 2, "MB_CODA");
m_statsMB.nBitsCODA += 2;
}
else if(pmbmd->m_CODAlpha==ALPHA_ALL255)
{
m_pbitstrmOut->putBits(1, 2, "MB_CODA");
m_statsMB.nBitsCODA += 2;
return;
}
else // ALPHA_SKIPPED
{
m_pbitstrmOut->putBits(1, 1, "MB_CODA");
m_statsMB.nBitsCODA ++;
return;
}
#ifdef __TRACE_AND_STATS_
m_pbitstrmOut->trace (CBPA, "MB_CBPA");
#endif // __TRACE_AND_STATS_
switch (cNonTrnspBlk) {
case 1:
m_statsMB.nBitsCBPA += m_pentrencSet->m_pentrencCBPY1->encodeSymbol (1 - CBPA, "MB_CBPA");
break;
case 2:
m_statsMB.nBitsCBPA += m_pentrencSet->m_pentrencCBPY2->encodeSymbol (3 - CBPA, "MB_CBPA");
break;
case 3:
m_statsMB.nBitsCBPA += m_pentrencSet->m_pentrencCBPY3->encodeSymbol (7 - CBPA, "MB_CBPA");
break;
case 4:
m_statsMB.nBitsCBPA += m_pentrencSet->m_pentrencCBPY->encodeSymbol (15 - CBPA, "MB_CBPA");
break;
default:
assert (FALSE);
}
}
}
Void CVideoObjectEncoder::sendDCTCoefOfIntraMBAlpha (const CMBMode* pmbmd)
{
assert (pmbmd != NULL);
assert (pmbmd -> m_dctMd == INTRA || pmbmd -> m_dctMd == INTRAQ);
assert (pmbmd->m_rgTranspStatus [0] != ALL);
if(pmbmd->m_CODAlpha != ALPHA_CODED)
return;
UInt iBlk;
for (iBlk = A_BLOCK1; iBlk <= A_BLOCK4; iBlk++) {
UInt nBits = 0;
#ifdef __TRACE_AND_STATS_
m_pbitstrmOut->trace (iBlk, "ALPHA_BLK_NO");
#endif // __TRACE_AND_STATS_
if (pmbmd -> m_rgTranspStatus [iBlk - 6 ] == ALL)
continue;
Int* rgiCoefQ = m_rgpiCoefQ [iBlk - 1];
#ifdef __TRACE_AND_STATS_
m_pbitstrmOut->trace (rgiCoefQ, BLOCK_SQUARE_SIZE, "BLK_QUANTIZED_COEF");
#endif // __TRACE_AND_STATS_
Int iCoefStart = 0;
if (pmbmd->m_bCodeDcAsAcAlpha != TRUE) {
iCoefStart = 1;
nBits = sendIntraDC (rgiCoefQ, (BlockNum) iBlk);
}
if (pmbmd->getCodedBlockPattern ((BlockNum) iBlk)) {
Int* rgiZigzag = grgiStandardZigzag;
if (pmbmd->m_bACPredictionAlpha)
rgiZigzag = (pmbmd->m_preddir [iBlk - 1] == HORIZONTAL) ? grgiVerticalZigzag : grgiHorizontalZigzag;
nBits += sendTCOEFIntra (rgiCoefQ, iCoefStart, rgiZigzag);
}
m_statsMB.nBitsA += nBits;
}
}
Void CVideoObjectEncoder::sendDCTCoefOfInterMBAlpha (const CMBMode* pmbmd)
{
assert (pmbmd != NULL);
assert (pmbmd -> m_dctMd == INTER || pmbmd -> m_dctMd == INTERQ);
assert (pmbmd -> m_rgTranspStatus [0] != ALL);
assert (pmbmd -> m_CODAlpha == ALPHA_CODED);
UInt nBits, iBlk = 0;
for (iBlk = A_BLOCK1; iBlk <= A_BLOCK4; iBlk++) {
#ifdef __TRACE_AND_STATS_
m_pbitstrmOut->trace (iBlk, "BLK_NO");
#endif // __TRACE_AND_STATS_
if (pmbmd -> m_rgTranspStatus [iBlk - 6] == ALL) continue;
if (pmbmd->getCodedBlockPattern ((BlockNum) iBlk)) {
Int* rgiCoefQ = m_rgpiCoefQ [iBlk - 1];
#ifdef __TRACE_AND_STATS_
m_pbitstrmOut->trace (rgiCoefQ, BLOCK_SQUARE_SIZE, "BLK_QUANTIZED_COEF");
#endif // __TRACE_AND_STATS_
nBits = sendTCOEFInter (rgiCoefQ, 0, grgiStandardZigzag);
m_statsMB.nBitsA += nBits;
}
}
}
Void CVideoObjectEncoder::codeMBAlphaHeadOfBVOP (const CMBMode* pmbmd)
{
// get CBPA
Int CBPA = 0;
UInt cNonTrnspBlk = 0, iBlk;
for (iBlk = (UInt) A_BLOCK1; iBlk <= (UInt) A_BLOCK4; iBlk++) {
if (pmbmd->m_rgTranspStatus [iBlk - 6] != ALL)
cNonTrnspBlk++;
}
UInt iBitPos = 1;
for (iBlk = (UInt) A_BLOCK1; iBlk <= (UInt) A_BLOCK4; iBlk++) {
if (pmbmd->m_rgTranspStatus [iBlk - 6] != ALL) {
CBPA |= pmbmd->getCodedBlockPattern ((BlockNum) iBlk) << (cNonTrnspBlk - iBitPos);
iBitPos++;
}
}
assert (CBPA >= 0 && CBPA <= 15);
if(pmbmd->m_CODAlpha==ALPHA_CODED)
{
m_pbitstrmOut->putBits(0, 2, "MB_CODBA");
m_statsMB.nBitsCODA += 2;
}
else if(pmbmd->m_CODAlpha==ALPHA_ALL255)
{
m_pbitstrmOut->putBits(1, 2, "MB_CODBA");
m_statsMB.nBitsCODA += 2;
return;
}
else // ALPHA_SKIPPED
{
m_pbitstrmOut->putBits(1, 1, "MB_CODBA");
m_statsMB.nBitsCODA ++;
return;
}
#ifdef __TRACE_AND_STATS_
m_pbitstrmOut->trace (CBPA, "MB_CBPBA");
#endif // __TRACE_AND_STATS_
switch (cNonTrnspBlk) {
case 1:
m_statsMB.nBitsCBPA += m_pentrencSet->m_pentrencCBPY1->encodeSymbol (1 - CBPA, "MB_CBPA");
break;
case 2:
m_statsMB.nBitsCBPA += m_pentrencSet->m_pentrencCBPY2->encodeSymbol (3 - CBPA, "MB_CBPA");
break;
case 3:
m_statsMB.nBitsCBPA += m_pentrencSet->m_pentrencCBPY3->encodeSymbol (7 - CBPA, "MB_CBPA");
break;
case 4:
m_statsMB.nBitsCBPA += m_pentrencSet->m_pentrencCBPY->encodeSymbol (15 - CBPA, "MB_CBPA");
break;
default:
assert (FALSE);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -