📄 shpdec.cpp
字号:
upSampleShape(ppxlcMBBYFrm,m_rgpxlcCaeSymbol,m_ppxlcReconCurrBAB);
copyReconShapeToMbAndRef (ppxlcMBBY, ppxlcMBBYFrm, m_ppxlcReconCurrBAB, TOTAL_BAB_SIZE, BAB_BORDER); //copy rounded data
}
else {
copyReconShapeToMbAndRef (ppxlcMBBY, ppxlcMBBYFrm, m_puciPredBAB->pixels (), MC_BAB_SIZE, MC_BAB_BORDER);
}
decideTransparencyStatus (pmbmd, ppxlcMBBY);
assert (pmbmd->m_rgTranspStatus [0] != ALL);
}//putchar('\n');
}
Int CVideoObjectDecoder::shpMdTableIndex (const CMBMode* pmbmd, Int iMBX, Int iMBY)
{
//get previous shape codes;
// Added for error resilient mode by Toshiba(1997-11-14)
Bool bLeftBndry, bRightTopBndry, bTopBndry, bLeftTopBndry;
Int iMBnum = VPMBnum(iMBX, iMBY);
bLeftBndry = bVPNoLeft(iMBnum, iMBX);
bTopBndry = bVPNoTop(iMBnum);
bRightTopBndry = bVPNoRightTop(iMBnum, iMBX);
bLeftTopBndry = bVPNoLeftTop(iMBnum, iMBX);
ShapeMode shpmdTop = !bTopBndry ? (pmbmd - m_iNumMBX)->m_shpmd : ALL_TRANSP;
ShapeMode shpmdTopR = !bRightTopBndry ? (pmbmd - m_iNumMBX + 1)->m_shpmd : ALL_TRANSP;
ShapeMode shpmdTopL = !bLeftTopBndry ? (pmbmd - m_iNumMBX - 1)->m_shpmd : ALL_TRANSP;
ShapeMode shpmdLeft = !bLeftBndry ? (pmbmd - 1)->m_shpmd : ALL_TRANSP;
return (shpmdTopL * 81 + shpmdTop * 27 + shpmdTopR * 9 + shpmdLeft * 3);
//const CMBMode* pmbmdTop = pmbmd - m_iNumMBX;
//ShapeMode shpmdTop = (iMBY > 0) ? pmbmdTop->m_shpmd : ALL_TRANSP;
//ShapeMode shpmdTopR = (iMBY > 0 && iMBX < m_iNumMBX - 1) ? (pmbmdTop + 1)->m_shpmd : ALL_TRANSP;
//ShapeMode shpmdTopL = (iMBY > 0 && iMBX > 0) ? (pmbmdTop - 1)->m_shpmd : ALL_TRANSP;
//ShapeMode shpmdLeft = (iMBX > 0) ? (pmbmd - 1)->m_shpmd : ALL_TRANSP;
//return (shpmdTopL * 81 + shpmdTop * 27 + shpmdTopR * 9 + shpmdLeft * 3);
// End Toshiba(1997-11-14)
}
Void CVideoObjectDecoder::decodeIntraCaeBAB (PixelC* ppxlcBYMB, PixelC* ppxlcBYFrm)
{
if (m_volmd.bNoCrChange == TRUE || m_pbitstrmIn->getBits (1) == 0) {
m_iInverseCR = 1;
m_iWidthCurrBAB = BAB_SIZE;
copyLeftTopBorderFromVOP (ppxlcBYFrm, m_ppxlcReconCurrBAB); //used for upsample and CAE
m_rgpxlcCaeSymbol = m_ppxlcReconCurrBAB; //assign encoding buffer
if (m_pbitstrmIn->getBits (1) == 1)
decodeIntraCAEH (); //right bottom border made on the fly
else
decodeIntraCAEV ();
}
else {
if (m_pbitstrmIn->getBits (1) == 0) {
m_iInverseCR = 2;
m_iWidthCurrBAB = 12;
subsampleLeftTopBorderFromVOP (ppxlcBYFrm, m_ppxlcCurrMBBYDown2);
m_rgpxlcCaeSymbol = m_ppxlcCurrMBBYDown2; //assign encoding buffer
}
else {
m_iInverseCR = 4;
m_iWidthCurrBAB = 8;
subsampleLeftTopBorderFromVOP (ppxlcBYFrm, m_ppxlcCurrMBBYDown4);
m_rgpxlcCaeSymbol = m_ppxlcCurrMBBYDown4; //assign encoding buffer
}
if (m_pbitstrmIn->getBits (1) == 1)
decodeIntraCAEH (); //right bottom border made on the fly
else
decodeIntraCAEV ();
upSampleShape(ppxlcBYFrm,m_rgpxlcCaeSymbol,m_ppxlcReconCurrBAB);
}
copyReconShapeToMbAndRef (ppxlcBYMB, ppxlcBYFrm, m_ppxlcReconCurrBAB, TOTAL_BAB_SIZE, BAB_BORDER);
}
Void CVideoObjectDecoder::decodeIntraCAEH ()
{
StartArDecoder (m_parcodec, m_pbitstrmIn);
PixelC* ppxlcDstRow = m_rgpxlcCaeSymbol + m_iWidthCurrBAB * BAB_BORDER + BAB_BORDER;
for (Int iRow = BAB_BORDER; iRow < m_iWidthCurrBAB - BAB_BORDER; iRow++) {
PixelC* ppxlcDst = ppxlcDstRow;
for (Int iCol = BAB_BORDER; iCol < m_iWidthCurrBAB - BAB_BORDER; iCol++) {
Int iContext = contextIntra (ppxlcDst);//printf("%d ",iContext);
*ppxlcDst++ = (ArDecodeSymbol (gCAEintraProb [iContext], m_parcodec, m_pbitstrmIn)) ? MPEG4_OPAQUE : MPEG4_TRANSPARENT;
}
*ppxlcDst = *(ppxlcDst - 1);
*(ppxlcDst + 1) = *ppxlcDst; //make right border on the fly
ppxlcDstRow += m_iWidthCurrBAB;
}//printf("\n\n");
StopArDecoder (m_parcodec, m_pbitstrmIn);
PixelC* ppxlcDst = m_rgpxlcCaeSymbol +
m_iWidthCurrBAB * (m_iWidthCurrBAB - BAB_BORDER) + BAB_BORDER;
for (Int iCol = BAB_BORDER; iCol < m_iWidthCurrBAB; iCol++) {
//make bottom border
*ppxlcDst = *(ppxlcDst - m_iWidthCurrBAB);
*(ppxlcDst + m_iWidthCurrBAB) = *ppxlcDst;
ppxlcDst++;
}
}
Void CVideoObjectDecoder::decodeIntraCAEV ()
{
StartArDecoder (m_parcodec, m_pbitstrmIn);
PixelC* ppxlcDstCol = m_rgpxlcCaeSymbol + m_iWidthCurrBAB * BAB_BORDER + BAB_BORDER;
for (Int iCol = BAB_BORDER; iCol < m_iWidthCurrBAB - BAB_BORDER; iCol++) {
PixelC* ppxlcDst = ppxlcDstCol;
for (Int iRow = BAB_BORDER; iRow < m_iWidthCurrBAB - BAB_BORDER; iRow++) {
Int iContext = contextIntraTranspose (ppxlcDst);
*ppxlcDst = (ArDecodeSymbol (gCAEintraProb [iContext], m_parcodec, m_pbitstrmIn)) ? MPEG4_OPAQUE : MPEG4_TRANSPARENT;
ppxlcDst += m_iWidthCurrBAB;
}
*ppxlcDst = *(ppxlcDst - m_iWidthCurrBAB);
*(ppxlcDst + m_iWidthCurrBAB) = *ppxlcDst; //make bottom border on the fly
ppxlcDstCol++;
}
StopArDecoder (m_parcodec, m_pbitstrmIn);
PixelC* ppxlcDst = m_rgpxlcCaeSymbol + (m_iWidthCurrBAB - BAB_BORDER) + m_iWidthCurrBAB * BAB_BORDER;
for (Int iRow = BAB_BORDER; iRow < m_iWidthCurrBAB; iRow++) {
//make right border
*ppxlcDst = *(ppxlcDst - 1);
*(ppxlcDst + 1) = *ppxlcDst;
ppxlcDst += m_iWidthCurrBAB;
}
}
Void CVideoObjectDecoder::decodeInterCAEH (const PixelC *ppxlcPredBAB)
{
StartArDecoder (m_parcodec, m_pbitstrmIn);
Int iSizePredBAB = m_iWidthCurrBAB - 2*BAB_BORDER + 2*MC_BAB_BORDER;
Int iSizeMB = m_iWidthCurrBAB - 2*BAB_BORDER;
PixelC* ppxlcDstRow = m_rgpxlcCaeSymbol + m_iWidthCurrBAB * BAB_BORDER + BAB_BORDER;
const PixelC* ppxlcPredRow = ppxlcPredBAB + iSizePredBAB * MC_BAB_BORDER + MC_BAB_BORDER;
for (Int iRow = 0; iRow < iSizeMB; iRow++) {
PixelC* ppxlcDst = ppxlcDstRow;
const PixelC* ppxlcPred = ppxlcPredRow;
for (Int iCol = 0; iCol < iSizeMB; iCol++) {
Int iContext = contextInter (ppxlcDst, ppxlcPred);
*ppxlcDst++ = (ArDecodeSymbol (gCAEinterProb [iContext], m_parcodec, m_pbitstrmIn)) ? MPEG4_OPAQUE : MPEG4_TRANSPARENT;
ppxlcPred++;
}
*ppxlcDst = *(ppxlcDst - 1);
*(ppxlcDst + 1) = *ppxlcDst; //make right border on the fly
ppxlcDstRow += m_iWidthCurrBAB;
ppxlcPredRow += iSizePredBAB;
}
StopArDecoder (m_parcodec, m_pbitstrmIn);
PixelC* ppxlcDst = m_rgpxlcCaeSymbol +
m_iWidthCurrBAB * (m_iWidthCurrBAB - BAB_BORDER) + BAB_BORDER;
for (Int iCol = BAB_BORDER; iCol < m_iWidthCurrBAB; iCol++) {
//make bottom border
*ppxlcDst = *(ppxlcDst - m_iWidthCurrBAB);
*(ppxlcDst + m_iWidthCurrBAB) = *ppxlcDst;
ppxlcDst++;
}
}
Void CVideoObjectDecoder::decodeInterCAEV (const PixelC *ppxlcPredBAB)
{
StartArDecoder (m_parcodec, m_pbitstrmIn);
Int iSizePredBAB = m_iWidthCurrBAB - 2*BAB_BORDER + 2*MC_BAB_BORDER;
Int iSizeMB = m_iWidthCurrBAB - 2*BAB_BORDER;
PixelC* ppxlcDstCol = m_rgpxlcCaeSymbol + m_iWidthCurrBAB * BAB_BORDER + BAB_BORDER;
const PixelC* ppxlcPredCol = ppxlcPredBAB + iSizePredBAB * MC_BAB_BORDER + MC_BAB_BORDER;
for (Int iCol = 0; iCol < iSizeMB;iCol++) {
PixelC* ppxlcDst = ppxlcDstCol;
const PixelC* ppxlcPred = ppxlcPredCol;
for (Int iRow = 0; iRow < iSizeMB; iRow++) {
Int iContext = contextInterTranspose (ppxlcDst, ppxlcPred);
*ppxlcDst = (ArDecodeSymbol (gCAEinterProb [iContext], m_parcodec, m_pbitstrmIn)) ? MPEG4_OPAQUE : MPEG4_TRANSPARENT;
ppxlcDst += m_iWidthCurrBAB;
ppxlcPred += iSizePredBAB;
}
*ppxlcDst = *(ppxlcDst - m_iWidthCurrBAB);
*(ppxlcDst + m_iWidthCurrBAB) = *ppxlcDst; //make bottom border on the fly
ppxlcDstCol++;
ppxlcPredCol++;
}
StopArDecoder (m_parcodec, m_pbitstrmIn);
PixelC* ppxlcDst = m_rgpxlcCaeSymbol + (m_iWidthCurrBAB - BAB_BORDER) + m_iWidthCurrBAB * BAB_BORDER;
for (Int iRow = BAB_BORDER; iRow < m_iWidthCurrBAB; iRow++) {
//make right border
*ppxlcDst = *(ppxlcDst - 1);
*(ppxlcDst + 1) = *ppxlcDst;
ppxlcDst += m_iWidthCurrBAB;
}
}
Void CVideoObjectDecoder::decodeMVDS (CMotionVector& mvDiff)
{
mvDiff.iMVX = m_pentrdecSet->m_pentrdecShapeMV1->decodeSymbol ();
if (mvDiff.iMVX != 0)
if (m_pbitstrmIn->getBits (1) == 0)
mvDiff.iMVX *= -1;
if (mvDiff.iMVX == 0)
mvDiff.iMVY = m_pentrdecSet->m_pentrdecShapeMV2->decodeSymbol () + 1;
else
mvDiff.iMVY = m_pentrdecSet->m_pentrdecShapeMV1->decodeSymbol ();
if (mvDiff.iMVY != 0)
if (m_pbitstrmIn->getBits (1) == 0)
mvDiff.iMVY *= -1;
mvDiff.computeTrueMV ();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -