📄 umc_vc1_dec_blk_adv.cpp
字号:
}
break;
case VC1_BLK_INTER8X4:
{
curr_scan = sMB->ZigzagTable[VC1_BlockTable[pBlock->blkType]];
if(curr_scan==NULL)
return VC1_FAIL;
if (sMB->m_ubNumFirstCodedBlk < blk_num || picHeader->TTFRM == pBlock->blkType)
numCoef = GetSubBlockPattern_8x4_4x8(pContext, blk_num);
else
numCoef = sMB->m_pSingleBlock[blk_num].numCoef;
DecodeBlockInter8x4_VC1(&pContext->m_bitstream, m_pBlock,
curr_scan, picHeader->m_pCurrInterACDecSet,
&pContext->m_pSingleMB->EscInfo, numCoef);
#ifdef VC1_DEBUG_ON
VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_COEFFS,
"Inter 8x4\n");
#endif
}
break;
case VC1_BLK_INTER4X8:
{
curr_scan = sMB->ZigzagTable[VC1_BlockTable[pBlock->blkType]];
if(curr_scan==NULL)
return VC1_FAIL;
if (sMB->m_ubNumFirstCodedBlk < blk_num || picHeader->TTFRM == pBlock->blkType)
numCoef = GetSubBlockPattern_8x4_4x8(pContext, blk_num);
else
numCoef = sMB->m_pSingleBlock[blk_num].numCoef;
DecodeBlockInter4x8_VC1(&pContext->m_bitstream, m_pBlock,
curr_scan, picHeader->m_pCurrInterACDecSet,
&pContext->m_pSingleMB->EscInfo, numCoef);
#ifdef VC1_DEBUG_ON
VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_COEFFS,
"Inter 4x8\n");
#endif
}
break;
case VC1_BLK_INTER4X4:
{
curr_scan = sMB->ZigzagTable[VC1_BlockTable[pBlock->blkType]];
if(curr_scan==NULL)
return VC1_FAIL;
numCoef = GetSubBlockPattern_4x4(pContext, blk_num);
DecodeBlockInter4x4_VC1(&pContext->m_bitstream, m_pBlock,
curr_scan,picHeader->m_pCurrInterACDecSet,
&pContext->m_pSingleMB->EscInfo, numCoef);
#ifdef VC1_DEBUG_ON
VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_COEFFS,
"Inter 4x4\n");
#endif
}
break;
case VC1_BLK_INTER:
{
numCoef = GetTTBLK(pContext, blk_num);
curr_scan = sMB->ZigzagTable[VC1_BlockTable[pBlock->blkType]];
if(curr_scan==NULL)
return VC1_FAIL;
switch (pBlock->blkType)
{
case VC1_BLK_INTER8X8:
DecodeBlockInter8x8_VC1(&pContext->m_bitstream, m_pBlock,
curr_scan, picHeader->m_pCurrInterACDecSet,
&pContext->m_pSingleMB->EscInfo, VC1_SBP_0);
#ifdef VC1_DEBUG_ON
VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_COEFFS,
"Inter 8x8\n");
#endif
break;
case VC1_BLK_INTER8X4:
DecodeBlockInter8x4_VC1(&pContext->m_bitstream, m_pBlock,
curr_scan, picHeader->m_pCurrInterACDecSet,
&pContext->m_pSingleMB->EscInfo, numCoef);
#ifdef VC1_DEBUG_ON
VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_COEFFS,
"Inter 8x4\n");
#endif
break;
case VC1_BLK_INTER4X8:
DecodeBlockInter4x8_VC1(&pContext->m_bitstream, m_pBlock,
curr_scan, picHeader->m_pCurrInterACDecSet,
&pContext->m_pSingleMB->EscInfo, numCoef);
#ifdef VC1_DEBUG_ON
VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_COEFFS,
"Inter 4x8\n");
#endif
break;
case VC1_BLK_INTER4X4:
numCoef = GetSubBlockPattern_4x4(pContext, blk_num);
DecodeBlockInter4x4_VC1(&pContext->m_bitstream, m_pBlock,
curr_scan, picHeader->m_pCurrInterACDecSet,
&pContext->m_pSingleMB->EscInfo, numCoef);
#ifdef VC1_DEBUG_ON
VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_COEFFS,
"Inter 4x4\n");
#endif
break;
}
}
break;
default:
VM_ASSERT(0);
}
STATISTICS_END_TIME(m_timeStatistics->decoding_Inter_StartTime,
m_timeStatistics->decoding_Inter_EndTime,
m_timeStatistics->decoding_Inter_TotalTime);
}
#ifdef VC1_DEBUG_ON
//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*8 + t]);
}
VM_Debug::GetInstance(VC1DebugRoutine).vm_debug_frame(-1,VC1_COEFFS, "\n");
}
#endif
#ifdef UMC_STREAM_ANALYZER
Ipp32u bit_shift = CalculateUsedBits(Bitsream,pContext->m_bitstream);
pContext->m_pCurrMB->pMbAnalyzInfo->dwNumBitsRes += bit_shift;
#endif
return VC1_OK;
}
VC1Status VC1ProcessDiffInter(VC1Context* pContext,Ipp32s blk_num)
{
Ipp16s* m_pBlock = pContext->m_pBlock + VC1_BlkStart[blk_num]; //memory for 16s diffs
IppiSize roiSize;
roiSize.height = VC1_PIXEL_IN_BLOCK;
roiSize.width = VC1_PIXEL_IN_BLOCK;
VC1Block* pBlock = &pContext->m_pCurrMB->m_pBlocks[blk_num];
if(pContext->m_pCurrMB->m_cbpBits & (1<<(5-blk_num)))
{
//quantization and transformation
STATISTICS_START_TIME(m_timeStatistics->reconstruction_StartTime);
Reconstruct_table[pContext->m_picLayerHeader->QuantizationType](m_pBlock,
VC1_pixel_table[blk_num]*2,
pContext->CurrDC->DoubleQuant,
pBlock->blkType);
STATISTICS_END_TIME(m_timeStatistics->reconstruction_StartTime,
m_timeStatistics->reconstruction_EndTime,
m_timeStatistics->reconstruction_TotalTime);
}
return VC1_OK;
}
VC1Status VC1ProcessDiffSpeedUpIntra(VC1Context* pContext,Ipp32s blk_num)
{
Ipp16s* m_pBlock = pContext->m_pBlock + VC1_BlkStart[0]; //memory for 16s diffs
IppiSize roiSize;
roiSize.height = VC1_PIXEL_IN_BLOCK;
roiSize.width = VC1_PIXEL_IN_BLOCK;
IppiSize DstSizeNZ;
Ipp16s bias = 128;
m_pBlock = pContext->m_pBlock + VC1_BlkStart[blk_num];
//DC
*(pContext->m_pBlock+VC1_BlkStart[blk_num]) = *(pContext->m_pBlock+VC1_BlkStart[blk_num])
* (Ipp16s)pContext->CurrDC->DCStepSize;
if ((pContext->m_seqLayerHeader->PROFILE != VC1_PROFILE_ADVANCED)&&
((pContext->m_picLayerHeader->PTYPE == VC1_I_FRAME)||
(pContext->m_picLayerHeader->PTYPE == VC1_BI_FRAME)))
bias = pContext->m_pCurrMB->bias;
if (pContext->m_picLayerHeader->QuantizationType == VC1_QUANTIZER_UNIFORM)
{
_own_ippiQuantInvIntraUniform_VC1_16s_C1IR(m_pBlock,
VC1_pixel_table[blk_num]*2,
pContext->CurrDC->DoubleQuant,
&DstSizeNZ);
}
else
{
_own_ippiQuantInvIntraNonuniform_VC1_16s_C1IR(m_pBlock,
VC1_pixel_table[blk_num]*2,
pContext->CurrDC->DoubleQuant,
&DstSizeNZ);
}
ippiTransform8x8Inv_VC1_16s_C1IR(m_pBlock,
VC1_pixel_table[blk_num]*2,
DstSizeNZ);
ippiAddC_16s_C1IRSfs(bias, m_pBlock, 2*VC1_pixel_table[blk_num], roiSize, 0);
return VC1_OK;
}
VC1Status VC1ProcessDiffSpeedUpInter(VC1Context* pContext,Ipp32s blk_num)
{
Ipp16s* m_pBlock = pContext->m_pBlock + VC1_BlkStart[blk_num]; //memory for 16s diffs
IppiSize roiSize;
roiSize.height = VC1_PIXEL_IN_BLOCK;
roiSize.width = VC1_PIXEL_IN_BLOCK;
IppiSize DstSizeNZ;
IppiSize QuantSize = {4,4};
m_pBlock = pContext->m_pBlock + VC1_BlkStart[blk_num];
VC1Block* pBlock = &pContext->m_pCurrMB->m_pBlocks[blk_num];
if(pContext->m_pCurrMB->m_cbpBits & (1<<(5-blk_num)))
{
if (pContext->m_picLayerHeader->QuantizationType == VC1_QUANTIZER_UNIFORM)
{
_own_ippiQuantInvInterUniform_VC1_16s_C1IR(m_pBlock,
VC1_pixel_table[blk_num]*2,
pContext->CurrDC->DoubleQuant,
QuantSize,
&DstSizeNZ);
}
else
{
_own_ippiQuantInvInterNonuniform_VC1_16s_C1IR(m_pBlock,
VC1_pixel_table[blk_num]*2,
pContext->CurrDC->DoubleQuant,
QuantSize,
&DstSizeNZ);
}
if (VC1_BLK_INTER8X8 == pBlock->blkType)
{
ippiTransform8x8Inv_VC1_16s_C1IR(m_pBlock,
VC1_pixel_table[blk_num]*2,
DstSizeNZ);
}
else if(VC1_BLK_INTER4X8 == pBlock->blkType)
{
ippiTransform4x8Inv_VC1_16s_C1IR(m_pBlock,
VC1_pixel_table[blk_num]*2,
DstSizeNZ);
}
else if(VC1_BLK_INTER8X4 == pBlock->blkType)
{
ippiTransform8x4Inv_VC1_16s_C1IR(m_pBlock,
VC1_pixel_table[blk_num]*2,
DstSizeNZ);
}
else if(VC1_BLK_INTER4X4 == pBlock->blkType)
{
ippiTransform4x4Inv_VC1_16s_C1IR(m_pBlock,
VC1_pixel_table[blk_num]*2,
DstSizeNZ);
}
}
return VC1_OK;
}
void write_Intraluma_to_interlace_frame_Adv(VC1MB * pCurrMB, Ipp16s* pBlock)
{
IppiSize roiSize;
Ipp32u planeStep[2] = {pCurrMB->currYPitch,
pCurrMB->currYPitch*2};
Ipp32u planeOffset[2] = {8*pCurrMB->currYPitch,
pCurrMB->currYPitch};
roiSize.height = VC1_PIXEL_IN_BLOCK;
roiSize.width = VC1_PIXEL_IN_LUMA;
ippiConvert_16s8u_C1R(pBlock,
VC1_PIXEL_IN_LUMA*2,
pCurrMB->currYPlane,
planeStep[pCurrMB->FIELDTX],
roiSize);
ippiConvert_16s8u_C1R(pBlock + 2*64,
VC1_PIXEL_IN_LUMA*2,
pCurrMB->currYPlane + planeOffset[pCurrMB->FIELDTX],
planeStep[pCurrMB->FIELDTX],
roiSize);
}
void write_Interluma_to_interlace_frame_MC_Adv(VC1MB * pCurrMB,
const Ipp8u* pDst, Ipp32u dstStep,
Ipp16s* pBlock)
{
Ipp8u fieldFlag = (Ipp8u)(pCurrMB->FIELDTX*2 + VC1_IS_MVFIELD(pCurrMB->mbType));
Ipp32u predOffset[4] = {8*dstStep, 8*dstStep, dstStep, 8*dstStep};
Ipp32s predStep[4] = {dstStep, dstStep,
2*dstStep, dstStep};
Ipp16u blockOffset[4] = {64*2, VC1_PIXEL_IN_LUMA, 64*2, 64*2};
Ipp16u blockStep[4] = {2*VC1_PIXEL_IN_LUMA, 2*2*VC1_PIXEL_IN_LUMA,
2*VC1_PIXEL_IN_LUMA, 2*VC1_PIXEL_IN_LUMA};
Ipp32u planeOffset[4] = {8*pCurrMB->currYPitch, pCurrMB->currYPitch,
pCurrMB->currYPitch, pCurrMB->currYPitch};
Ipp32u planeStep[4] = {pCurrMB->currYPitch, pCurrMB->currYPitch*2,
pCurrMB->currYPitch*2, pCurrMB->currYPitch*2};
ippiMC16x8_8u_C1(pDst, predStep[fieldFlag],
pBlock, blockStep[fieldFlag],
pCurrMB->currYPlane,
planeStep[fieldFlag], 0, 0);
ippiMC16x8_8u_C1(pDst + predOffset[fieldFlag],
predStep[fieldFlag],
pBlock + blockOffset[fieldFlag],
blockStep[fieldFlag],
pCurrMB->currYPlane + planeOffset[fieldFlag],
planeStep[fieldFlag], 0, 0);
}
void write_Interluma_to_interlace_B_frame_MC_Adv(VC1MB * pCurrMB,
const Ipp8u* pDst1, Ipp32u dstStep1,
const Ipp8u* pDst2, Ipp32u dstStep2,
Ipp16s* pBlock)
{
Ipp8u pPred[64*4]={0};
Ipp8u fieldFlag = (Ipp8u)(pCurrMB->FIELDTX*2 + VC1_IS_MVFIELD(pCurrMB->mbType));
Ipp16u predOffset[4] = {8*VC1_PIXEL_IN_LUMA, 8*VC1_PIXEL_IN_LUMA, VC1_PIXEL_IN_LUMA, 8*VC1_PIXEL_IN_LUMA};
Ipp16u predStep[4] = {VC1_PIXEL_IN_LUMA, VC1_PIXEL_IN_LUMA, 2*VC1_PIXEL_IN_LUMA, VC1_PIXEL_IN_LUMA};
Ipp16u blockOffset[4] = {64*2, VC1_PIXEL_IN_LUMA, 64*2, 64*2};
Ipp16u blockStep[4] = {2*VC1_PIXEL_IN_LUMA, 2*2*VC1_PIXEL_IN_LUMA,
2*VC1_PIXEL_IN_LUMA, 2*VC1_PIXEL_IN_LUMA};
Ipp32u planeOffset[4] = {8*pCurrMB->currYPitch, pCurrMB->currYPitch,
pCurrMB->currYPitch, pCurrMB->currYPitch};
Ipp32u planeStep[4] = {pCurrMB->currYPitch, pCurrMB->currYPitch*2,
pCurrMB->currYPitch*2, pCurrMB->currYPitch*2};
ippiAverage16x16_8u_C1R(pDst1, dstStep1, pDst2, dstStep2,
pPred, VC1_PIXEL_IN_LUMA);
ippiMC16x8_8u_C1(pPred, predStep[fieldFlag],
pBlock, blockStep[fieldFlag],
pCurrMB->currYPlane,
planeStep[fieldFlag], 0, 0);
ippiMC16x8_8u_C1(pPred + predOffset[fieldFlag],
predStep[fieldFlag],
pBlock + blockOffset[fieldFlag],
blockStep[fieldFlag],
pCurrMB->currYPlane + planeOffset[fieldFlag],
planeStep[fieldFlag], 0, 0);
}
#endif //UMC_ENABLE_VC1_VIDEO_DECODER
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -