📄 mbenc.cpp
字号:
// HHI: for sadct
rgchBlkShape = (ppxlcCurrMBBUV && pmbmd -> m_rgTranspStatus[iBlk] == PARTIAL) ? ppxlcCurrMBBUV : NULL;
iDcScaler = iDcScalerC; //m_rgiDcScalerC [iQP];
}
if (m_volmd.nBits<=8) { // NBIT: not always valid when nBits>8
assert(iDcScaler > 0 && iDcScaler < 128);
}
rgiCoefQ = m_rgpiCoefQ [iBlk - 1];
iSumErr += quantizeIntraBlockTexture (
rgchBlkSrc,
iWidthSrc,
rgchBlkDst,
iWidthDst,
rgiCoefQ,
(iBlk<=V_BLOCK ? iQP : iQPA),
iDcScaler,
iBlk, //from here til last
pmbmLeft,
pmbmTop,
pmbmLeftTop,
m_rgpmbmCurr [imbX],
pmbmdLeft,
pmbmdTop,
pmbmdLeftTop,
pmbmd,
rgchBlkShape, ((iBlk<U_BLOCK) || (iBlk > V_BLOCK)) ? MB_SIZE : BLOCK_SIZE, // HHI
iAuxComp
); //all for intra-pred
if(iBlk>=A_BLOCK1)
pmbmd->m_pbACPredictionAlpha[iAuxComp] = (pmbmd->m_pCODAlpha[iAuxComp] == ALPHA_CODED && iSumErr >= 0);
else
pmbmd->m_bACPrediction =(iSumErr >= 0);
}
// INTERLACE
if ((pmbmd->m_rgTranspStatus [0] == NONE) && (m_vopmd.bInterlace == TRUE) && (pmbmd->m_bFieldDCT == TRUE))
fieldDCTtoFrameC(ppxlcCurrQMBY);
// ~INTERLACE
for (iBlk = (UInt) Y_BLOCK1; iBlk <= (Int)pmbmd->blkEnd(); iBlk++) { // + 1 is because of the indexing
Int iBlkMap;
if (iBlk>=A_BLOCK1) // alpha blocks
iBlkMap = ((iBlk-7)&0x3)+1;
else
iBlkMap = iBlk;
if (pmbmd->m_rgTranspStatus [iBlkMap % 6] == ALL) { // hack %6 ok if [6]==[0]
pmbmd->setCodedBlockPattern (iBlk, FALSE);
continue;
}
rgiCoefQ = m_rgpiCoefQ [iBlk - 1];
if (iBlk < (Int) U_BLOCK)
iDcScaler = iDcScalerY; //m_rgiDcScalerY [iQP];
else if(iBlk < (Int) A_BLOCK1)
iDcScaler = iDcScalerC; //m_rgiDcScalerC [iQP];
else
iDcScaler = iDcScalerA;
intraPred ( iBlk, pmbmd, rgiCoefQ,
(iBlk<=V_BLOCK ? iQP : iQPA), iDcScaler, m_rgblkmCurrMB [iBlk - 1],
m_rgiQPpred [iBlk - 1]);
Bool bCoded = FALSE;
UInt i;
if(iBlk >=(Int) A_BLOCK1)
iCoefToStart = pmbmd->m_bCodeDcAsAcAlpha==TRUE ? 0 : 1;
for (i = iCoefToStart; i < BLOCK_SQUARE_SIZE; i++) {
if (rgiCoefQ [i] != 0) {
bCoded = TRUE;
break;
}
}
pmbmd->setCodedBlockPattern ( iBlk, bCoded);
}
}
// HHI Schueuer: added const PixelC *ppxlcCurrMBBY, const PixelC *ppxlcCurrMBBUV
Void CVideoObjectEncoder::quantizeTextureInterMB (CMBMode* pmbmd,
const CMotionVector* pmv,
PixelC **pppxlcCurrQMBA,
Bool bSkip,
const PixelC *ppxlcCurrMBBY,
const PixelC *ppxlcCurrMBBUV) //bSkip: tested mv is zero
{
assert (pmbmd != NULL);
assert (pmbmd -> m_dctMd == INTER || pmbmd -> m_dctMd == INTERQ);
assert (pmbmd->m_rgTranspStatus [0] != ALL);
Int iQuantMax = (1<<m_volmd.uiQuantPrecision) - 1;
if (pmbmd -> m_stepSize < 1)
pmbmd -> m_stepSize = 1;
else if (pmbmd -> m_stepSize > iQuantMax)
pmbmd -> m_stepSize = iQuantMax;
Int iQP = pmbmd->m_stepSize;
#ifdef __TRACE_AND_STATS_
m_statsMB.nQMB++;
m_statsMB.nQp += iQP;
#endif // __TRACE_AND_STATS_
// INTERLACE
if ((pmbmd->m_rgTranspStatus [0] == NONE) && (m_vopmd.bInterlace == TRUE)) {
pmbmd->m_bFieldDCT = FrameFieldDCTDecideI(m_ppxliErrorMBY);
m_statsMB.nFieldDCTMB += (Int) pmbmd->m_bFieldDCT;
}
else
pmbmd->m_bFieldDCT = 0;
Bool bMBCoded = FALSE;
// ~INTERLACE
Int iQPA;
for(Int iAuxComp=0;iAuxComp<m_volmd.iAuxCompCount;iAuxComp++) // MAC (SB) 29-Nov-99
pmbmd->m_pCODAlpha[iAuxComp] = ALPHA_CODED;
//Int iBlkEnd = V_BLOCK;
if(m_volmd.fAUsage == EIGHT_BIT)
{
//iBlkEnd = A_BLOCK4;
if (pmbmd -> m_stepSizeAlpha < 1)
pmbmd -> m_stepSizeAlpha = 1;
iQPA = pmbmd->m_stepSizeAlpha;
Int i, iThresh = 256 - iQPA;
for(Int iAuxComp=0;iAuxComp<m_volmd.iAuxCompCount;iAuxComp++) { // MAC (SB) 29-Nov-99
pmbmd->m_pCODAlpha[iAuxComp] = ALPHA_ALL255;
for(i = 0; i<MB_SQUARE_SIZE; i++) {
if(m_ppxlcCurrMBA[iAuxComp][i] <= iThresh)
{
pmbmd->m_pCODAlpha[iAuxComp] = ALPHA_CODED;
break;
}
}
}
}
// Bool bSkip = pmbmd->m_bhas4MVForward ? (bSkipAllowed && pmv [1].isZero () && pmv [2].isZero () && pmv [3].isZero () && pmv [4].isZero ())
// : bSkipAllowed && pmv->isZero ();
Int* rgiBlkCurrQ = m_ppxliErrorMBY;
Int* rgiCoefQ;
Int iWidthCurrQ;
Bool* pbSkipAlpha = new Bool [m_volmd.iAuxCompCount];
for(iAuxComp; iAuxComp<m_volmd.iAuxCompCount; iAuxComp++ )
pbSkipAlpha[iAuxComp] = TRUE;
// HHI Schueuer: sadct
const PixelC* rgchBlkShape = NULL;
// end HHI
for (UInt iBlk = (UInt) Y_BLOCK1; iBlk <= (UInt) pmbmd->blkEnd(); iBlk++) {
if (iBlk < (UInt) U_BLOCK || iBlk> (UInt) V_BLOCK) {
if (iBlk>=A_BLOCK1 && pmbmd->m_rgTranspStatus [((iBlk-7)%4)+1] == ALL) // MAC patch
continue;
else if (iBlk<A_BLOCK1 && pmbmd -> m_rgTranspStatus [iBlk % 6] == ALL) // %6 hack!!
continue;
switch (iBlk)
{
case (Y_BLOCK1):
rgiBlkCurrQ = m_ppxliErrorMBY;
rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[iBlk] == PARTIAL) ? ppxlcCurrMBBY : NULL;
break;
case (Y_BLOCK2):
rgiBlkCurrQ = m_ppxliErrorMBY + BLOCK_SIZE;
rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[iBlk] == PARTIAL) ? ppxlcCurrMBBY + BLOCK_SIZE: NULL;
break;
case (Y_BLOCK3):
rgiBlkCurrQ = m_ppxliErrorMBY + MB_SIZE * BLOCK_SIZE;
rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[iBlk] == PARTIAL) ? ppxlcCurrMBBY + BLOCK_SIZE*MB_SIZE : NULL;
break;
case (Y_BLOCK4):
rgiBlkCurrQ = m_ppxliErrorMBY + MB_SIZE * BLOCK_SIZE + BLOCK_SIZE;
rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[iBlk] == PARTIAL) ? ppxlcCurrMBBY + BLOCK_SIZE*MB_SIZE + BLOCK_SIZE : NULL;
break;
}
// MAC (SB) 29-Nov-99
if (iBlk>=A_BLOCK1) {
Int iBlkA = (iBlk-7)&0x3;
iAuxComp = iBlkA/4;
rgiBlkCurrQ = m_ppxliErrorMBA[iAuxComp];
switch (iBlkA) {
case 0: rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[1] == PARTIAL) ? ppxlcCurrMBBY : NULL;
break;
case 1: rgiBlkCurrQ += BLOCK_SIZE;
rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[2] == PARTIAL) ? ppxlcCurrMBBY + BLOCK_SIZE: NULL;
break;
case 2: rgiBlkCurrQ += MB_SIZE * BLOCK_SIZE;
rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[3] == PARTIAL) ? ppxlcCurrMBBY + BLOCK_SIZE*MB_SIZE : NULL;
break;
case 3: rgiBlkCurrQ += MB_SIZE * BLOCK_SIZE + BLOCK_SIZE;
rgchBlkShape = (ppxlcCurrMBBY && pmbmd -> m_rgTranspStatus[4] == PARTIAL) ? ppxlcCurrMBBY + BLOCK_SIZE*MB_SIZE + BLOCK_SIZE : NULL;
break;
}
}
//~MAC
iWidthCurrQ = MB_SIZE;
}
else {
iWidthCurrQ = BLOCK_SIZE;
rgiBlkCurrQ = (iBlk == U_BLOCK) ? m_ppxliErrorMBU: m_ppxliErrorMBV;
rgchBlkShape = (ppxlcCurrMBBUV && pmbmd -> m_rgTranspStatus[iBlk] == PARTIAL) ? ppxlcCurrMBBUV : NULL;
}
rgiCoefQ = m_rgpiCoefQ [iBlk - 1];
if(iBlk>=A_BLOCK1)
quantizeTextureInterBlock (rgiBlkCurrQ, iWidthCurrQ, rgiCoefQ, iQPA, TRUE, rgchBlkShape, ((iBlk<U_BLOCK) || (iBlk >V_BLOCK)) ? MB_SIZE : BLOCK_SIZE, iBlk); // HHI Schueuer
else
quantizeTextureInterBlock (rgiBlkCurrQ, iWidthCurrQ, rgiCoefQ, iQP, FALSE, rgchBlkShape, (iBlk<U_BLOCK) ? MB_SIZE : BLOCK_SIZE, iBlk);
// end
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
pbSkipAlpha[(iBlk-7)/4] = pbSkipAlpha[(iBlk-7)/4] & !bCoded;
pmbmd->setCodedBlockPattern (iBlk, bCoded);
}
pmbmd->m_bSkip = bSkip;
if(m_volmd.fAUsage == EIGHT_BIT)
{
for(Int iAuxComp=0;iAuxComp<m_volmd.iAuxCompCount;iAuxComp++) { // MAC (SB) 30-Nov-99
if(pbSkipAlpha[iAuxComp] == TRUE)
pmbmd->m_pCODAlpha[iAuxComp] = ALPHA_SKIPPED;
else if(pmbmd->m_pCODAlpha[iAuxComp] == ALPHA_ALL255)
{
PixelC *ppxlc = pppxlcCurrQMBA[iAuxComp];
Int i;
for(i = 0; i<MB_SIZE; i++, ppxlc += m_iFrameWidthY)
pxlcmemset(ppxlc, 255, MB_SIZE);
}
}
}
delete [] pbSkipAlpha;
// INTERLACE
if ((pmbmd->m_rgTranspStatus [0] == NONE)
&&(m_vopmd.bInterlace == TRUE) && (pmbmd->m_bFieldDCT == TRUE)
&& (bMBCoded == TRUE))
fieldDCTtoFrameI(m_ppxliErrorMBY);
// ~INTERLACE
}
//OBSS_SAIT_991015
Bool CVideoObjectEncoder::quantizeTextureMBBackwardCheck (CMBMode* pmbmd,
PixelC *ppxlcCurrMBY,
PixelC *ppxlcCurrMBBY,
const PixelC *ppxlcRef1MBY)
{
Int bSkip = TRUE;
Int *ppxliErrorMBY;
ppxliErrorMBY = new Int [MB_SIZE*MB_SIZE];
pmbmd->m_stepSize = m_vopmd.intStepB;
Int iQuantMax = (1<<m_volmd.uiQuantPrecision) - 1;
if (pmbmd -> m_stepSize < 1)
pmbmd -> m_stepSize = 1;
else if (pmbmd -> m_stepSize > iQuantMax)
pmbmd -> m_stepSize = iQuantMax;
Int iQP = pmbmd->m_stepSize;
Int iBlkEnd = Y_BLOCK4;
for(int i=0;i<MB_SIZE;i++){
for(int j=0;j<MB_SIZE;j++){
if(*(ppxlcCurrMBBY+i*MB_SIZE+j) == transpValue)
*(ppxliErrorMBY+i*MB_SIZE+j) = 0;
else
*(ppxliErrorMBY+i*MB_SIZE+j) = *(ppxlcCurrMBY +i*MB_SIZE+j) - *(ppxlcRef1MBY +i*448+j);
}
}
Int* rgiBlkCurrQ = ppxliErrorMBY;
Int* rgiCoefQ;
Int iWidthCurrQ;
for (UInt iBlk = (UInt) Y_BLOCK1; iBlk <= (UInt)iBlkEnd; iBlk++) {
if (pmbmd -> m_rgTranspStatus [iBlk % 6] == ALL)
continue;
switch (iBlk)
{
case (Y_BLOCK1):
rgiBlkCurrQ = ppxliErrorMBY;
break;
case (Y_BLOCK2):
rgiBlkCurrQ = ppxliErrorMBY + BLOCK_SIZE;
break;
case (Y_BLOCK3):
rgiBlkCurrQ = ppxliErrorMBY + MB_SIZE * BLOCK_SIZE;
break;
case (Y_BLOCK4):
rgiBlkCurrQ = ppxliErrorMBY + MB_SIZE * BLOCK_SIZE + BLOCK_SIZE;
break;
}
iWidthCurrQ = MB_SIZE;
rgiCoefQ = m_rgpiCoefQ [iBlk - 1];
quantizeTextureInterBlock (rgiBlkCurrQ, iWidthCurrQ, rgiCoefQ, iQP, FALSE, NULL, (iBlk<U_BLOCK) ? MB_SIZE : BLOCK_SIZE, iBlk);
Bool bCoded = FALSE;
UInt i;
for (i = 0; i < BLOCK_SQUARE_SIZE; i++) {
if (rgiCoefQ [i] != 0) {
bCoded = TRUE;
break;
}
}
bSkip = bSkip & !bCoded;
}
return (bSkip);
}
//~OBSS_SAIT_991015
Void CVideoObjectEncoder::sendDCTCoefOfInterMBTexture (const CMBMode* pmbmd)
{
assert (pmbmd != NULL);
assert (pmbmd -> m_dctMd == INTER || pmbmd -> m_dctMd == INTERQ);
assert (pmbmd -> m_rgTranspStatus [0] != ALL);
Int* scan = grgiStandardZigzag; // HHI Schueuer
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 (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) {
// HHI Schueuer: modified scan for sadcdt
if (!m_volmd.bSadctDisable)
scan = m_pscanSelector->select(scan, (pmbmd->m_rgTranspStatus[0] == PARTIAL), iBlk);
// nBits = sendTCOEFInterRVLC (rgiCoefQ, 0, grgiStandardZigzag, TRUE);
nBits = sendTCOEFInterRVLC (rgiCoefQ, 0, scan, TRUE);
// end HHI
}
else {
// HHI Schueuer: modified scan for sadct
// nBits = sendTCOEFInter (rgiCoefQ, 0,
// m_vopmd.bAlternateScan ? grgiVerticalZigzag : grgiStandardZigzag);
scan = (m_vopmd.bAlternateScan) ? grgiVerticalZigzag : grgiStandardZigzag;
if (!m_volmd.bSadctDisable)
scan = m_pscanSelector->select(scan, (pmbmd->m_rgTranspStatus[0] == PARTIAL), iBlk);
nBits = sendTCOEFInter (rgiCoefQ, 0, scan );
// end HHI
}
// End Toshiba(1998-1-16)
switch (iBlk) {
case U_BLOCK:
m_statsMB.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -