📄 umc_vc1_dec_blk_adv.cpp
字号:
#endif
DC = CurrBlk->DC + DCA;
PredictACTop(pBlock, CurrQuant, DCPred.ACTOP[VC1_PredDCIndex[0][blk_num]],
DCPred.DoubleQuant[VC1_QuantIndex[0][blk_num]]);
blkType = VC1_BLK_INTRA_TOP;
}
}
break;
case 4:
case 6:
{
//A is available, C - not
#ifdef VC1_DEBUG_ON
VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_COEFFS,
"DC top prediction\n");
#endif
DCA = DCPred.DC[VC1_PredDCIndex[0][blk_num]];
DC = CurrBlk->DC + DCA;
PredictACTop(pBlock, CurrQuant, DCPred.ACTOP[VC1_PredDCIndex[0][blk_num]],
DCPred.DoubleQuant[VC1_QuantIndex[0][blk_num]]);
blkType = VC1_BLK_INTRA_TOP;
}
break;
case 1:
case 3:
{
//C is available, A - not
#ifdef VC1_DEBUG_ON
VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_COEFFS,
"DC left prediction\n");
#endif
DCC = DCPred.DC[VC1_PredDCIndex[2][blk_num]];
DC = CurrBlk->DC + DCC;
PredictACLeft(pBlock, CurrQuant, DCPred.ACLEFT[VC1_PredDCIndex[2][blk_num]],
DCPred.DoubleQuant[VC1_QuantIndex[1][blk_num]], step);
blkType = VC1_BLK_INTRA_LEFT;
}
break;
case 5:
{
DCA = DCPred.DC[VC1_PredDCIndex[0][blk_num]];
DCC = DCPred.DC[VC1_PredDCIndex[2][blk_num]];
if (vc1_abs_16s(DCA) <= vc1_abs_16s(DCC))
{
#ifdef VC1_DEBUG_ON
VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_COEFFS,
"DC left prediction\n");
#endif
DC= CurrBlk->DC + DCC;
PredictACLeft(pBlock, CurrQuant, DCPred.ACLEFT[VC1_PredDCIndex[2][blk_num]],
DCPred.DoubleQuant[VC1_QuantIndex[1][blk_num]], step);
blkType = VC1_BLK_INTRA_LEFT;
}
else
{
#ifdef VC1_DEBUG_ON
VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_COEFFS,
"DC top prediction\n");
#endif
DC = CurrBlk->DC + DCA;
PredictACTop(pBlock, CurrQuant, DCPred.ACTOP[VC1_PredDCIndex[0][blk_num]],
DCPred.DoubleQuant[VC1_QuantIndex[0][blk_num]]);
blkType = VC1_BLK_INTRA_TOP;
}
}
break;
case 0:
case 2:
{
// A, C unavailable
#ifdef VC1_DEBUG_ON
VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_COEFFS,
"DC left prediction\n");
#endif
DC = CurrBlk->DC;
blkType = VC1_BLK_INTRA_LEFT;
if(FCM)
blkType = VC1_BLK_INTRA;
}
break;
}
pBlock[0] = DC;
PredData->DC[blk_num] = DC;
CurrBlk->DC = DC;
return blkType;
}
static Ipp8u GetDCPrediction(VC1DCBlkParam* CurrBlk,VC1DCPredictors* PredData,
Ipp32s blk_num, Ipp16s* pBlock, Ipp32u FCM)
{
Ipp8u blkType = VC1_BLK_INTRA;
VC1DCPredictors DCPred;
Ipp8u PredPattern;
Ipp16s DCA, DCB, DCC = 0;
memcpy(&DCPred, PredData, sizeof(VC1DCPredictors));
PredPattern = DCPred.BlkPattern[blk_num];
switch(PredPattern)
{
case 7:
{
DCA = DCPred.DC[VC1_PredDCIndex[0][blk_num]];
DCB = DCPred.DC[VC1_PredDCIndex[1][blk_num]];
DCC = DCPred.DC[VC1_PredDCIndex[2][blk_num]];
if (vc1_abs_16s(DCB - DCA) <= vc1_abs_16s(DCB - DCC))
{
#ifdef VC1_DEBUG_ON
VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_COEFFS,
"DC left prediction\n");
#endif
CurrBlk->DC = CurrBlk->DC + DCC;
blkType = VC1_BLK_INTRA_LEFT;
}
else
{
#ifdef VC1_DEBUG_ON
VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_COEFFS,
"DC top prediction\n");
#endif
CurrBlk->DC = CurrBlk->DC + DCA;
blkType = VC1_BLK_INTRA_TOP;
}
}
break;
case 4:
case 6:
{
//A is available, C - not
#ifdef VC1_DEBUG_ON
VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_COEFFS,
"DC top prediction\n");
#endif
DCA = DCPred.DC[VC1_PredDCIndex[0][blk_num]];
CurrBlk->DC = CurrBlk->DC + DCA;
blkType = VC1_BLK_INTRA_TOP;
}
break;
case 1:
case 3:
{
//C is available, A - not
#ifdef VC1_DEBUG_ON
VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_COEFFS,
"DC left prediction\n");
#endif
DCC = DCPred.DC[VC1_PredDCIndex[2][blk_num]];
CurrBlk->DC = CurrBlk->DC + DCC;
blkType = VC1_BLK_INTRA_LEFT;
}
break;
case 5:
{
DCA = DCPred.DC[VC1_PredDCIndex[0][blk_num]];
DCC = DCPred.DC[VC1_PredDCIndex[2][blk_num]];
if (vc1_abs_16s(DCA) <= vc1_abs_16s(DCC))
{
#ifdef VC1_DEBUG_ON
VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_COEFFS,
"DC left prediction\n");
#endif
CurrBlk->DC = CurrBlk->DC + DCC;
blkType = VC1_BLK_INTRA_LEFT;
}
else
{
#ifdef VC1_DEBUG_ON
VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_COEFFS,
"DC top prediction\n");
#endif
CurrBlk->DC = CurrBlk->DC + DCA;
blkType = VC1_BLK_INTRA_TOP;
}
}
break;
case 0:
case 2:
{
// A, C unavailable
#ifdef VC1_DEBUG_ON
VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_COEFFS,
"DC left prediction\n");
#endif
blkType = VC1_BLK_INTRA_LEFT;
if(FCM)
blkType = VC1_BLK_INTRA;
}
break;
}
pBlock[0] = CurrBlk->DC;
PredData->DC[blk_num] = CurrBlk->DC;
return blkType;
}
static const DCPrediction DCPredictionTable[] =
{
(DCPrediction)(GetDCPrediction),
(DCPrediction)(GetDCACPrediction)
};
VC1Status BLKLayer_Intra_Luma_Adv(VC1Context* pContext, Ipp32s blk_num, Ipp32u ACPRED)
{
Ipp16s* m_pBlock = pContext->m_pBlock + VC1_BlkStart[blk_num];
VC1Block* pBlock = &pContext->m_pCurrMB->m_pBlocks[blk_num];
VC1DCMBParam* CurrDC = pContext->CurrDC;
VC1DCBlkParam* CurrBlk = &CurrDC->DCBlkPred[blk_num];
VC1DCPredictors* DCPred = &pContext->DCPred;
IppStatus ret;
Ipp32s DCCOEF;
Ipp32s DCSIGN;
Ipp32u i = 0;
STATISTICS_START_TIME(m_timeStatistics->decoding_Intra_StartTime);
// need to calculate bits for residual data
#ifdef UMC_STREAM_ANALYZER
IppiBitstream Bitsream;
Bitsream.pBitstream = pContext->m_bitstream.pBitstream;
Bitsream.bitOffset = pContext->m_bitstream.bitOffset;
#endif
ret = ippiDecodeHuffmanOne_1u32s(&pContext->m_bitstream.pBitstream,
&pContext->m_bitstream.bitOffset,
&DCCOEF,
pContext->m_picLayerHeader->m_pCurrLumaDCDiff);
//VM_ASSERT(ret == ippStsNoErr);
if (ret != ippStsNoErr)
throw vc1_exception(vld);
if(DCCOEF != 0)
{
Ipp32u quant = (CurrDC->DoubleQuant >> 1);
if(DCCOEF == IPPVC_ESCAPE)
{
if(quant == 1)
{
VC1_GET_BITS(10, DCCOEF);
}
else if(quant == 2)
{
VC1_GET_BITS(9, DCCOEF);
}
else // pContext->m_pCurrMB->MQUANT is > 2
{
VC1_GET_BITS(8, DCCOEF);
}
}
else
{ // DCCOEF is not IPPVC_ESCAPE
Ipp32s tmp;
if(quant == 1)
{
VC1_GET_BITS(2, tmp);
DCCOEF = DCCOEF*4 + tmp - 3;
}
else if(quant == 2)
{
VC1_GET_BITS(1, tmp);
DCCOEF = DCCOEF*2 + tmp - 1;
}
}
VC1_GET_BITS(1, DCSIGN);
DCCOEF = (1 - (DCSIGN<<1))* DCCOEF;
}
CurrBlk->DC = (Ipp16s)DCCOEF;
pBlock->blkType = DCPredictionTable[ACPRED](CurrBlk, DCPred, blk_num, m_pBlock, pContext->m_picLayerHeader->FCM);
#ifdef VC1_DEBUG_ON
VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_COEFFS,
VM_STRING("DC diff = %d\n"),DCCOEF);
#endif
if(pContext->m_pCurrMB->m_cbpBits & (1<<(5-blk_num)))
{
const Ipp8u* curr_scan = pContext->m_pSingleMB->ZigzagTable[VC1_BlockTable[pBlock->blkType]];
if(curr_scan==NULL)
return VC1_FAIL;
DecodeBlockACIntra_VC1(&pContext->m_bitstream,
m_pBlock,
curr_scan, pContext->m_picLayerHeader->m_pCurrIntraACDecSet,
&pContext->m_pSingleMB->EscInfo);
}
for(i = 1; i < 8; i++)
{
CurrBlk->ACLEFT[i] = m_pBlock[i*16];
CurrBlk->ACTOP[i] = m_pBlock[i];
}
STATISTICS_END_TIME(m_timeStatistics->decoding_Intra_StartTime,
m_timeStatistics->decoding_Intra_EndTime,
m_timeStatistics->decoding_Intra_TotalTime);
#ifdef VC1_DEBUG_ON
VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_COEFFS,
VM_STRING("DC = %d\n"),
pContext->CurrDC->DCBlkPred[blk_num].DC);
//NEED!
VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_COEFFS,
"Block %d\n", blk_num);
for(Ipp32u k = 0; k<8; k++)
{
for (Ipp32u t = 0; t<8; t++)
{
VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_COEFFS,
"%d ", m_pBlock[k*16 + t]);
}
VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_COEFFS, "\n");
}
#endif
#ifdef UMC_STREAM_ANALYZER
pContext->m_pCurrMB->pMbAnalyzInfo->dwNumBitsRes += CalculateUsedBits(Bitsream,pContext->m_bitstream);
#endif
return VC1_OK;
}
VC1Status BLKLayer_Intra_Chroma_Adv(VC1Context* pContext, Ipp32s blk_num,Ipp32u ACPRED)
{
Ipp16s* m_pBlock = pContext->m_pBlock + VC1_BlkStart[blk_num];
VC1Block* pBlock = &pContext->m_pCurrMB->m_pBlocks[blk_num];
VC1DCMBParam* CurrDC = pContext->CurrDC;
VC1DCBlkParam* CurrBlk = &CurrDC->DCBlkPred[blk_num];
VC1DCPredictors* DCPred = &pContext->DCPred;
IppStatus ret;
Ipp32s DCCOEF;
Ipp32s DCSIGN;
Ipp32u i = 0;
STATISTICS_START_TIME(m_timeStatistics->decoding_Intra_StartTime);
// need to calculate bits for residual data
#ifdef UMC_STREAM_ANALYZER
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -