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

📄 umc_vc1_dec_frame_descr.cpp

📁 audio-video-codecs.rar语音编解码器
💻 CPP
📖 第 1 页 / 共 2 页
字号:


            if (temp_value == 1)                //PIC_HEADER_FLAG
            {
                ++m_pContext->m_picLayerHeader;
                //m_pContext->m_picLayerHeader->is_slice = 1;
                if (isSecondField)
                    m_pContext->m_picLayerHeader->CurrField = 1;
                else
                    m_pContext->m_picLayerHeader->CurrField = 0;
                DecodePictureHeader_Adv(m_pContext);
                DecodePicHeader(m_pContext);
            }
            m_pContext->m_picLayerHeader->is_slice = 1;

            if (*(pOffsets+1) && *(pValues+1) == 0x0B010000)
            {
                bitstream = reinterpret_cast<Ipp32u*>(m_pContext->m_pBufferStart + *(pOffsets+1));
                VC1BitstreamParser::GetNBits(bitstream,bitoffset,32, temp_value);
                bitoffset = 31;
                VC1BitstreamParser::GetNBits(bitstream,bitoffset,9, slparams.MBEndRow);

            }
            else if(*(pValues+1) == 0x0C010000)
                slparams.MBEndRow = m_pContext->m_seqLayerHeader->heightMB/2;
            else
                slparams.MBEndRow = m_pContext->m_seqLayerHeader->heightMB;

            slparams.m_picLayerHeader = m_pContext->m_picLayerHeader;
            slparams.m_vlcTbl = m_pContext->m_vlcTbl;
            slparams.m_pstart = m_pContext->m_bitstream.pBitstream;
            slparams.m_bitOffset = m_pContext->m_bitstream.bitOffset;
            slparams.MBRowsToDecode = slparams.MBEndRow-slparams.MBStartRow;
            task.m_pSlice = &slparams;
            task.setSliceParams(m_pContext);
            if (isSecondField)
                task.m_isFieldReady = false;
            else
                task.m_isFieldReady = true;
            m_pStore->AddSampleTask(&task,m_iSelfID);
#ifdef SLICE_INFO
            printf("Slice number %d\n", slice_counter);
            printf("Number MB rows to decode  =%d\n", slparams.MBRowsToDecode);
            ++slice_counter;
#endif
            slparams.MBStartRow = slparams.MBEndRow;

            ++pOffsets;
            ++pValues;
        }
        else
        {
            pOffsets++;
            pValues++;
        }
    }
    task.m_pSlice = NULL;
STATISTICS_START_TIME(m_timeStatistics->alg_StartTime);
    m_pStore->DistributeTasks(m_iSelfID);
STATISTICS_END_TIME(m_timeStatistics->alg_StartTime,
                    m_timeStatistics->alg_EndTime,
                    m_timeStatistics->alg_TotalTime);

}

Status VC1FrameDescriptor::preProcData(Ipp8u*                 pbufferStart,
                                       Ipp32u                 bufferSize,
                                       Ipp64u                 frameCount,
                                       bool                   isWMV)
{
    Status vc1Sts = UMC_OK;

    Ipp32u Ptype;
    m_iFrameCounter = frameCount;
    m_pContext->m_FrameSize = bufferSize;
    if (isWMV)
        bufferSize += 8;

    ippsCopy_8u(pbufferStart,m_pContext->m_pBufferStart,(bufferSize & 0xFFFFFFF8) + 8); // (bufferSize & 0xFFFFFFF8) + 8 - skip frames
    m_pContext->m_bitstream.pBitstream = (Ipp32u*)m_pContext->m_pBufferStart + 1;

    m_pContext->m_bitstream.bitOffset = 31;

    m_pContext->m_picLayerHeader = m_pContext->m_InitPicLayer;
    m_bIsSpecialBSkipFrame = false;
    if (m_pContext->m_seqLayerHeader->PROFILE == VC1_PROFILE_ADVANCED)
    {
        m_pContext->m_bNeedToUseCompBuffer = 0;
        GetNextPicHeader_Adv(m_pContext);
        Ptype = m_pContext->m_picLayerHeader->PTYPE|m_pContext->m_picLayerHeader->PTypeField1;
        vc1Sts = SetDisplayIndex_Adv(Ptype);
        // skipping tools
        if (m_pStore->IsNeedSkipFrame(Ptype))
        {
            if ((Ptype == VC1_B_FRAME) || (Ptype == VC1_BI_FRAME))
                m_bIsSpecialBSkipFrame = true;
            m_pContext->m_picLayerHeader->PTYPE = Ptype = VC1_SKIPPED_FRAME;
        }
    }
    else
    {
        if (!isWMV)
            m_pContext->m_bitstream.pBitstream = (Ipp32u*)m_pContext->m_pBufferStart + 2;
        GetNextPicHeader(m_pContext);
        // skipping tools
        vc1Sts = SetDisplayIndex(m_pContext->m_picLayerHeader->PTYPE);
        if (m_pStore->IsNeedSkipFrame(m_pContext->m_picLayerHeader->PTYPE))
        {
            if ((m_pContext->m_picLayerHeader->PTYPE == VC1_B_FRAME) || (m_pContext->m_picLayerHeader->PTYPE == VC1_BI_FRAME))
                m_bIsSpecialBSkipFrame = true;
            m_pContext->m_picLayerHeader->PTYPE = VC1_SKIPPED_FRAME;
        }
    }
    m_pContext->m_bIntensityCompensation = 0;


    m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iCurrIndex].m_bIsExpanded = 0;
    return vc1Sts;
}
Status VC1FrameDescriptor::SetDisplayIndex_Adv(Ipp32u                 PTYPE)
{
    Status vc1Sts = VC1_OK;

    switch(PTYPE)
    {
    case VC1_I_FRAME:
        {
            m_bIsWarningStream = false;
            m_pContext->m_frmBuff.m_iPrevIndex = m_pStore->GetPrevIndex();
            m_pContext->m_frmBuff.m_iDisplayIndex = m_pStore->GetDisplayIndex();
            m_pContext->m_frmBuff.m_iCurrIndex = m_pStore->GetRefInternalIndex();
        }
        break;
    case VC1_P_FRAME:
        {
            m_pContext->m_frmBuff.m_iPrevIndex = m_pStore->GetPrevIndex();
            if (m_pContext->m_frmBuff.m_iPrevIndex == -1)
            {
                m_bIsWarningStream = true;

                m_pContext->m_frmBuff.m_iPrevIndex = 0;
                m_pContext->m_frmBuff.m_iDisplayIndex = 0;
                memset(m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iPrevIndex].m_pAllocatedMemory,
                    128,
                    m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iPrevIndex].m_AllocatedMemorySize);

                //vc1Sts = UMC_WRN_INVALID_STREAM;
                throw vc1_exception(invalid_stream);
            }
            else
            {
                m_bIsWarningStream = false;
                m_pContext->m_frmBuff.m_iDisplayIndex = m_pStore->GetDisplayIndex();
                m_pContext->m_frmBuff.m_iCurrIndex = m_pStore->GetRefInternalIndex();
                *m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iCurrIndex].pRANGE_MAPY =
                                                 m_pContext->m_picLayerHeader->RANGEREDFRM - 1;
            }
        }
        break;
    case VC1_B_FRAME:
        {
            if (!m_bIsSpecialBSkipFrame)
            {
                m_pContext->m_frmBuff.m_iPrevIndex = m_pStore->GetNextIndex();
                m_pContext->m_frmBuff.m_iNextIndex = m_pStore->GetPrevIndex();
            }
            else
            {
                m_pContext->m_frmBuff.m_iPrevIndex = m_pStore->GetPrevIndex();
                m_pContext->m_frmBuff.m_iNextIndex = m_pStore->GetNextIndex();
            }

            if ((m_pContext->m_frmBuff.m_iNextIndex == -1)||(m_pContext->m_frmBuff.m_iPrevIndex == -1))
            {
                m_bIsWarningStream = true;

                if(m_pContext->m_frmBuff.m_iNextIndex == -1)
                {
                    m_pContext->m_frmBuff.m_iNextIndex = 0;
                    m_pContext->m_frmBuff.m_iPrevIndex = 1;
                    m_pContext->m_frmBuff.m_iCurrIndex = 2;
                    m_pContext->m_frmBuff.m_iDisplayIndex = 2;

                    memset(m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iNextIndex].m_pAllocatedMemory,
                        128,
                        m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iNextIndex].m_AllocatedMemorySize);

                    memset(m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iPrevIndex].m_pAllocatedMemory,
                        128,
                        m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iPrevIndex].m_AllocatedMemorySize);


                }
                else
                {
                    m_pContext->m_frmBuff.m_iPrevIndex = 0;
                    m_pContext->m_frmBuff.m_iCurrIndex = 2;
                    m_pContext->m_frmBuff.m_iDisplayIndex = 2;
                    memset(m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iPrevIndex].m_pAllocatedMemory,
                        128,
                        m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iPrevIndex].m_AllocatedMemorySize);
                }
                //vc1Sts = UMC_WRN_INVALID_STREAM;
                throw vc1_exception(invalid_stream);
            }
            else
            {
                m_bIsWarningStream = false;
                m_pContext->m_frmBuff.m_iCurrIndex = m_pStore->GetInternalIndex();
                m_pContext->m_frmBuff.m_iDisplayIndex = m_pContext->m_frmBuff.m_iCurrIndex;

                //vc1Sts = VC1_NOT_ENOUGH_DATA;
            }
        }
        break;
    case VC1_BI_FRAME:
        {
            m_bIsWarningStream = false;
            if (!m_bIsSpecialBSkipFrame)
            {
                m_pContext->m_frmBuff.m_iPrevIndex = m_pStore->GetNextIndex();
                m_pContext->m_frmBuff.m_iNextIndex = m_pStore->GetPrevIndex();
            }
            else
            {
                m_pContext->m_frmBuff.m_iPrevIndex = m_pStore->GetPrevIndex();
                m_pContext->m_frmBuff.m_iNextIndex = m_pStore->GetNextIndex();
            }
            //m_pContext->m_frmBuff.m_iPrevIndex = m_pStore->GetNextIndex();
            //m_pContext->m_frmBuff.m_iNextIndex = m_pStore->GetPrevIndex();
            m_pContext->m_frmBuff.m_iCurrIndex = m_pStore->GetInternalIndex();
            m_pContext->m_frmBuff.m_iDisplayIndex = m_pContext->m_frmBuff.m_iCurrIndex;
           // vc1Sts = VC1_NOT_ENOUGH_DATA ;
        }
        break;
    case VC1_SKIPPED_FRAME:
        {
            m_bIsWarningStream = false;
            m_pContext->m_frmBuff.m_iPrevIndex = m_pStore->GetPrevIndex();
            m_pContext->m_frmBuff.m_iDisplayIndex = m_pStore->GetDisplayIndex();
            m_pContext->m_frmBuff.m_iCurrIndex = m_pStore->GetRefInternalIndex();
        }
        break;
    default:
        break;
    }
    if (m_pContext->m_frmBuff.m_iDisplayIndex == -1)
        m_pContext->m_frmBuff.m_iDisplayIndex = m_pContext->m_frmBuff.m_iCurrIndex;

    return vc1Sts;
}


Status VC1FrameDescriptor::SetDisplayIndex(Ipp32u  PTYPE)

{
    Status vc1Sts = VC1_OK;

    switch(PTYPE)
    {
    case VC1_I_FRAME:
        {
            m_bIsWarningStream = false;
            m_pContext->m_frmBuff.m_iPrevIndex = m_pStore->GetPrevIndex();
            m_pContext->m_frmBuff.m_iDisplayIndex = m_pStore->GetDisplayIndex();
            m_pContext->m_frmBuff.m_iCurrIndex = m_pStore->GetRefInternalIndex();

            *m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iCurrIndex].pRANGE_MAPY =
                m_pContext->m_picLayerHeader->RANGEREDFRM - 1;

        }
        break;
    case VC1_BI_FRAME:
        {
            m_bIsWarningStream = false;
            m_pContext->m_frmBuff.m_iPrevIndex = m_pStore->GetNextIndex();
            m_pContext->m_frmBuff.m_iNextIndex = m_pStore->GetPrevIndex();
            m_pContext->m_frmBuff.m_iCurrIndex = m_pStore->GetInternalIndex();
            m_pContext->m_frmBuff.m_iDisplayIndex = m_pContext->m_frmBuff.m_iCurrIndex;

            *m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iCurrIndex].pRANGE_MAPY =
                m_pContext->m_picLayerHeader->RANGEREDFRM - 1;
        }
        break;
    case VC1_P_FRAME:
        {
            m_pContext->m_frmBuff.m_iPrevIndex = m_pStore->GetPrevIndex();

            if (m_pContext->m_frmBuff.m_iPrevIndex == -1)
            {
                m_pContext->m_frmBuff.m_iPrevIndex = 0;
                m_pContext->m_frmBuff.m_iDisplayIndex = 0;
                memset(m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iPrevIndex].m_pAllocatedMemory,
                    128,
                    m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iPrevIndex].m_AllocatedMemorySize);

                m_bIsWarningStream = true;
                throw vc1_exception(invalid_stream);
                //vc1Sts = UMC_WRN_INVALID_STREAM;
            }
            else
            {
                m_pContext->m_frmBuff.m_iDisplayIndex = m_pStore->GetDisplayIndex();
                m_pContext->m_frmBuff.m_iCurrIndex = m_pStore->GetRefInternalIndex();
                *m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iCurrIndex].pRANGE_MAPY =
                                                 m_pContext->m_picLayerHeader->RANGEREDFRM - 1;
                m_bIsWarningStream = false;
            }
        }
        break;
    case VC1_B_FRAME:
        {
            m_pContext->m_frmBuff.m_iPrevIndex = m_pStore->GetNextIndex();
            m_pContext->m_frmBuff.m_iNextIndex = m_pStore->GetPrevIndex();

            if ((m_pContext->m_frmBuff.m_iNextIndex == -1)||(m_pContext->m_frmBuff.m_iPrevIndex == -1))
            {
                m_bIsWarningStream = true;
                if(m_pContext->m_frmBuff.m_iNextIndex == -1)
                {
                    m_pContext->m_frmBuff.m_iNextIndex = 0;
                    m_pContext->m_frmBuff.m_iPrevIndex = 1;
                    memset(m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iNextIndex].m_pAllocatedMemory,
                        128,
                        m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iNextIndex].m_AllocatedMemorySize);

                    memset(m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iPrevIndex].m_pAllocatedMemory,
                        128,
                        m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iPrevIndex].m_AllocatedMemorySize);

                }
                else
                {
                    m_pContext->m_frmBuff.m_iPrevIndex = 1 - m_pContext->m_frmBuff.m_iNextIndex;
                    memset(m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iPrevIndex].m_pAllocatedMemory,
                        128,
                        m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iPrevIndex].m_AllocatedMemorySize);
                }
                throw vc1_exception(invalid_stream);
                //vc1Sts = UMC_WRN_INVALID_STREAM;
            }
            else
            {
                m_bIsWarningStream = false;
                m_pContext->m_frmBuff.m_iCurrIndex = m_pStore->GetInternalIndex();
                m_pContext->m_frmBuff.m_iDisplayIndex = m_pContext->m_frmBuff.m_iCurrIndex;
                if (*m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iNextIndex].pRANGE_MAPY ==
                    (m_pContext->m_picLayerHeader->RANGEREDFRM - 1))
                    *m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iCurrIndex].pRANGE_MAPY =
                    m_pContext->m_picLayerHeader->RANGEREDFRM - 1;
                else
                    *m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iCurrIndex].pRANGE_MAPY =
                    *m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iNextIndex].pRANGE_MAPY;

               // vc1Sts = VC1_NOT_ENOUGH_DATA;
            }
        }
        break;
    case VC1_SKIPPED_FRAME:
        {
            m_bIsWarningStream = false;
            m_pContext->m_frmBuff.m_iPrevIndex = m_pStore->GetPrevIndex();
            m_pContext->m_frmBuff.m_iDisplayIndex = m_pStore->GetDisplayIndex();
            m_pContext->m_frmBuff.m_iCurrIndex = m_pStore->GetRefInternalIndex();
            *m_pContext->m_frmBuff.m_pFrames[m_pContext->m_frmBuff.m_iCurrIndex].pRANGE_MAPY =
                m_pContext->m_picLayerHeader->RANGEREDFRM - 1;
        }
        break;
    }
    if (m_pContext->m_frmBuff.m_iDisplayIndex == -1)
        m_pContext->m_frmBuff.m_iDisplayIndex = m_pContext->m_frmBuff.m_iCurrIndex;
    return vc1Sts;
}
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -