📄 umc_vc1_enc_mb.h
字号:
dx= dx>>1;
dy= dy>>1;
}
index= 35 + 37*NotSkip - 1;
ret = pCodedMB->PutBits(table[2*index], table[2*index+1]);
if (ret != UMC::UMC_OK) return ret;
if (m_bMVHalf)
{
sizeX -= sizeX>>3;
sizeY -= sizeY>>3;
}
ret = pCodedMB->PutBits(dx, sizeX);
if (ret != UMC::UMC_OK) return ret;
ret = pCodedMB->PutBits(dy, sizeY);
if (ret != UMC::UMC_OK) return ret;
#ifdef VC1_ENC_DEBUG_ON
pDebug->SetMVDiff(dx, dy,(!bForward),-1);
#endif
}
return ret;
}
template <class T> UMC::Status WriteBlockAC( T* pCodedBlock,
const sACTablesSet* pACTablesSet,
sACEscInfo* pACEscInfo,
Ipp8u blk)
{
UMC::Status err = UMC::UMC_OK;
Ipp32s i = 0;
static const Ipp32s nSubblk [4] = {1,2,2,4};
const Ipp32u *pEncTable = pACTablesSet->pEncTable;
Ipp8u nPairsBlock = 0;
for (Ipp32s nSubblock=0; nSubblock<nSubblk[m_tsType[blk]]; nSubblock++)
{
const Ipp8u *pTableDR = pACTablesSet->pTableDR;
const Ipp8u *pTableDL = pACTablesSet->pTableDL;
const Ipp8u *pTableInd = pACTablesSet->pTableInd;
Ipp8u nPairs = m_nPairs[blk][nSubblock];
if (nPairs == 0)
continue;
// put codes into bitstream
i = 0;
for (Ipp32s not_last = 1; not_last>=0; not_last--)
{
for (; i < nPairs - not_last; i++)
{
bool sign = false;
Ipp8u run = m_uRun [blk] [i+nPairsBlock];
Ipp16s lev = m_iLevel[blk][i+nPairsBlock];
Ipp8u mode = GetMode( run, lev, pTableDR, pTableDL, sign);
#ifdef VC1_ENC_DEBUG_ON
pDebug->SetRLMode(mode, blk, i+nPairsBlock);
#endif
switch (mode)
{
case 3:
err = pCodedBlock->PutBits(pEncTable[0], pEncTable[1]); //ESCAPE
VC1_ENC_CHECK (err)
err = pCodedBlock->PutBits(0,2); //mode
VC1_ENC_CHECK (err)
err = pCodedBlock->PutBits(!not_last,1); //last
VC1_ENC_CHECK (err)
if ((!pACEscInfo->levelSize) && (!pACEscInfo->runSize))
{
pACEscInfo->runSize = 6;
pACEscInfo->levelSize = (pACEscInfo->pLSizeTable[2*11 +1]==0)? 8:11;
pACEscInfo->levelSize = (pACEscInfo->pLSizeTable[2*pACEscInfo->levelSize + 1]<=0) ?
2 : pACEscInfo->levelSize;
err = pCodedBlock->PutBits(pACEscInfo->pLSizeTable[2*pACEscInfo->levelSize],
pACEscInfo->pLSizeTable[2*pACEscInfo->levelSize +1]);
VC1_ENC_CHECK (err)
err = pCodedBlock->PutBits(pACEscInfo->runSize - 3, 2);
VC1_ENC_CHECK (err)
}
err = pCodedBlock->PutBits(run,pACEscInfo->runSize);
VC1_ENC_CHECK (err)
err = pCodedBlock->PutBits(sign, 1);
VC1_ENC_CHECK (err)
if (lev>((1<<pACEscInfo->levelSize)-1))
{
lev =(1<<pACEscInfo->levelSize)-1;
m_iLevel[blk][i+nPairsBlock] = lev;
}
err = pCodedBlock->PutBits(lev,pACEscInfo->levelSize);
VC1_ENC_CHECK (err)
break;
case 2:
case 1:
err = pCodedBlock->PutBits(pEncTable[0], pEncTable[1]); //ESCAPE
VC1_ENC_CHECK (err)
err = pCodedBlock->PutBits(1,mode); //mode
VC1_ENC_CHECK (err)
case 0:
Ipp16s index = pTableInd[run] + lev;
err = pCodedBlock->PutBits(pEncTable[2*index], pEncTable[2*index + 1]);
VC1_ENC_CHECK (err)
err = pCodedBlock->PutBits(sign, 1);
VC1_ENC_CHECK (err)
break;
}
}
pTableDR = pACTablesSet->pTableDRLast;
pTableDL = pACTablesSet->pTableDLLast;
pTableInd = pACTablesSet->pTableIndLast;
}
nPairsBlock += m_nPairs[blk][nSubblock];
}
return UMC::UMC_OK;
}
template <class T>
UMC::Status WriteVSTSMB ( T* pCodedBlock,
const Ipp16s (*pTTMBVLC)[4][6])
{
UMC::Status err = UMC::UMC_OK;
Ipp32s blk;
for(blk=0;blk<6;blk++)
{
if (m_nPairs[blk][0] + m_nPairs[blk][1] + m_nPairs[blk][2]+ m_nPairs[blk][3])
break;
}
m_uiFirsrCodedBlock = blk;
eTransformType MBtype = m_tsType[blk];
Ipp8u subPat = ((m_nPairs[blk][0]>0)<<1) + (m_nPairs[blk][1]>0);
subPat = (subPat>0)?subPat-1:subPat;
err = pCodedBlock->PutBits(pTTMBVLC[m_bMBTSType][MBtype][2*subPat],pTTMBVLC[m_bMBTSType][MBtype][2*subPat+1] );
return err;
}
template <class T>
UMC::Status WriteVSTSBlk ( T* pCodedBlock,
const Ipp8u (*pTTBLKVLC)[6],
const Ipp8u* pSBP4x4Table,
bool bVTS,
Ipp8u blk)
{
UMC::Status err = UMC::UMC_OK;
eTransformType type = m_tsType[blk];
if (m_nPairs[blk][0] + m_nPairs[blk][1] + m_nPairs[blk][2]+ m_nPairs[blk][3]==0)
return err;
if (bVTS && !m_bMBTSType && blk!= m_uiFirsrCodedBlock)
{
Ipp8u subPat = ((m_nPairs[blk][0]>0)<<1) + (m_nPairs[blk][1]>0);
subPat = (subPat>0)?subPat-1:subPat;
assert(subPat < 4);
//block level transform type
err = pCodedBlock->PutBits(pTTBLKVLC[type][2*subPat],pTTBLKVLC[type][2*subPat+1] );
VC1_ENC_CHECK (err)
}
if (type == VC1_ENC_4x4_TRANSFORM)
{
Ipp8u subPat = ((m_nPairs[blk][0]>0)<<3) + ((m_nPairs[blk][1]>0)<<2)+
((m_nPairs[blk][2]>0)<<1) + (m_nPairs[blk][3]>0);
//VC1_ENC_4x4_TRANSFORM
err = pCodedBlock->PutBits(pSBP4x4Table[2*subPat],pSBP4x4Table[2*subPat+1] );
VC1_ENC_CHECK (err)
}
else if (type != VC1_ENC_8x8_TRANSFORM &&
(m_bMBTSType && blk!= m_uiFirsrCodedBlock || !bVTS))
{
Ipp8u subPat = ((m_nPairs[blk][0]>0)<<1) + (m_nPairs[blk][1]>0) - 1;
//if MB level or frame level
err = pCodedBlock->PutBits(SubPattern8x4_4x8VLC[2*subPat],SubPattern8x4_4x8VLC[2*subPat+1] );
VC1_ENC_CHECK (err)
}
return err;
}
template <class T>
UMC::Status WriteMBHeaderP_INTRA ( T* pCodedMB,
bool bBitplanesRaw,
const Ipp16u* pMVDiffTable,
const Ipp16u* pCBPCYTable)
{
UMC::Status err = UMC::UMC_OK;
if (!pCodedMB)
return UMC::UMC_ERR_NULL_PTR;
bool coded = ((m_nPairs[0][0] + m_nPairs[1][0]+
m_nPairs[2][0] + m_nPairs[3][0] +
m_nPairs[4][0] + m_nPairs[5][0])>0); //only 8x8 transform
if (bBitplanesRaw)
{
err = pCodedMB->PutBits(0,1); //if intra, then non-skip
VC1_ENC_CHECK (err)
}
err = WriteMVDataPIntra(pCodedMB,pMVDiffTable);
VC1_ENC_CHECK (err)
if (coded ==0)
{
//err = WriteMBQuantParameter(pCodedMB, doubleQuant>>1);
//VC1_ENC_CHECK (err)
err = pCodedMB->PutBits(m_bACPrediction,1);
VC1_ENC_CHECK (err)
}
else
{
err = pCodedMB->PutBits(m_bACPrediction,1);
VC1_ENC_CHECK (err)
err = pCodedMB->PutBits(pCBPCYTable[2*(m_uiMBCBPCY&0x3F)], pCBPCYTable[2*(m_uiMBCBPCY&0x3F)+1]);
VC1_ENC_CHECK (err)
//err = WriteMBQuantParameter(pCodedPicture, doubleQuant>>1);
//VC1_ENC_CHECK (err)
}
return err;
}
template <class T>
UMC::Status WriteMBHeaderB_INTRA ( T* pCodedMB,
bool bBitplanesRaw,
const Ipp16u* pMVDiffTable,
const Ipp16u* pCBPCYTable)
{
UMC::Status err = UMC::UMC_OK;
if (!pCodedMB)
return UMC::UMC_ERR_NULL_PTR;
if (bBitplanesRaw)
{
err = pCodedMB->PutBits(0,1); //non directMB
VC1_ENC_CHECK (err)
}
return WriteMBHeaderP_INTRA (pCodedMB,bBitplanesRaw,pMVDiffTable,pCBPCYTable);
}
template <class T> UMC::Status WritePMB1MV (T* pCodedBlock,
bool bRawBitplanes,
Ipp8u MVTab,
Ipp8u MVRangeIndex,
const Ipp16u* pCBPCYTable,
bool bVTS,
const Ipp16s (*pTTMBVLC)[4][6],
const Ipp8u (*pTTBLKVLC)[6],
const Ipp8u* pSBP4x4Table,
const sACTablesSet* pACTablesSet,
sACEscInfo* pACEscInfo)
{
UMC::Status err=UMC::UMC_OK;
Ipp32s blk;
if (bRawBitplanes)
{
err = pCodedBlock->PutBits(0,1);//skip
VC1_ENC_CHECK (err)
}
err = WriteMVDataInter(pCodedBlock, MVDiffTablesVLC[MVTab],MVRangeIndex, m_uiMBCBPCY!=0);
VC1_ENC_CHECK (err)
if (m_bHybrid)
{
err = pCodedBlock->PutBits(m_bHybrid-1,1); // Hybrid
VC1_ENC_CHECK (err)
}
if (m_uiMBCBPCY!=0)
{
err = pCodedBlock->PutBits(pCBPCYTable[2*(m_uiMBCBPCY&0x3F)], pCBPCYTable[2*(m_uiMBCBPCY&0x3F)+1]);
VC1_ENC_CHECK (err)
//err = WriteMBQuantParameter(pCodedPicture, doubleQuant>>1);
//VC1_ENC_CHECK (err)
if (bVTS)
{
err = WriteVSTSMB (pCodedBlock, pTTMBVLC);
VC1_ENC_CHECK (err)
}
for (blk = 0; blk<6; blk++)
{
err = WriteVSTSBlk ( pCodedBlock,
pTTBLKVLC,
pSBP4x4Table,
bVTS,
blk);
VC1_ENC_CHECK (err)
err = WriteBlockAC(pCodedBlock,
pACTablesSet,
pACEscInfo,
blk);
VC1_ENC_CHECK (err)
}//for
}//MBPattern!=0
return err;
}
template <class T> UMC::Status WriteBMB_DIRECT (T* pCodedBlock,
bool bRawBitplanes,
const Ipp16u* pCBPCYTable,
bool bVTS,
const Ipp16s (*pTTMBVLC)[4][6],
const Ipp8u (*pTTBLKVLC)[6],
const Ipp8u* pSBP4x4Table,
const sACTablesSet* pACTablesSet,
sACEscInfo* pACEscInfo)
{
UMC::Status err=UMC::UMC_OK;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -