⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 umc_vc1_dec_blk_adv.cpp

📁 audio-video-codecs.rar语音编解码器
💻 CPP
📖 第 1 页 / 共 4 页
字号:
            }
            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 + -