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

📄 umc_vc1_enc_picture_adv.cpp

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




    switch (m_uiPictureType)
    {
    case VC1_ENC_I_FRAME:
        return SetPictureParamsI();
    case VC1_ENC_P_FRAME:
        return SetPictureParamsP();
    case VC1_ENC_B_FRAME:
        return SetPictureParamsB();
    }
    return UMC::UMC_ERR_NOT_IMPLEMENTED;

}


UMC::Status VC1EncoderPictureADV::SetPictureParamsI()
{
    //m_uiBFraction.denom     = 2;                              // [2,8]
    //m_uiBFraction.num       = 1;                              // [1, m_uiBFraction.denom - 1]
    m_uiDecTypeAC2          = 0;                                // [0,2] - it's used to choose decoding table

    m_uiRoundControl        = 0;
    m_uiCondOverlap         = VC1_ENC_COND_OVERLAP_NO;//VC1_ENC_COND_OVERLAP_NO, VC1_ENC_COND_OVERLAP_SOME, VC1_ENC_COND_OVERLAP_ALL


    return UMC::UMC_OK;
}

UMC::Status VC1EncoderPictureADV::SetPictureParamsP()
{
   m_uiMVMode = VC1_ENC_1MV_HALF_BILINEAR;                      //    VC1_ENC_1MV_HALF_BILINEAR
                                                                //    VC1_ENC_1MV_QUARTER_BICUBIC
                                                                //    VC1_ENC_1MV_HALF_BICUBIC
                                                                //    VC1_ENC_MIXED_QUARTER_BICUBIC
    m_bIntensity = false; //true or false

    if (m_bIntensity)
    {
        m_uiIntensityLumaScale=5;                               //[0,63]
        m_uiIntensityLumaShift=8;                               //[0,63]
    }
    else
    {
        m_uiIntensityLumaScale=0;
        m_uiIntensityLumaShift=0;
    }

    m_uiMVTab   =0;                                             //[0,4]
    m_uiCBPTab  =0;                                             //[0,4]

    if (m_pSequenceHeader->GetDQuant()==0)
    {
        m_uiAltPQuant=0;
    }
    else
    {
        m_uiAltPQuant = m_uiQuant;          // [1,31]
    }

    switch( m_pSequenceHeader->GetDQuant())
    {
    case 0:
        m_QuantMode = VC1_ENC_QUANT_SINGLE;
        break;
    case 1:
         m_QuantMode = VC1_ENC_QUANT_SINGLE;//        VC1_ENC_QUANT_SINGLE,
                                            //        VC1_ENC_QUANT_MB_ANY,
                                            //        VC1_ENC_QUANT_MB_PAIR,
                                            //        VC1_ENC_QUANT_EDGE_ALL,
                                            //        VC1_ENC_QUANT_EDGE_LEFT,
                                            //        VC1_ENC_QUANT_EDGE_TOP,
                                            //        VC1_ENC_QUANT_EDGE_RIGHT,
                                            //        VC1_ENC_QUANT_EDGE_BOTTOM,
                                            //        VC1_ENC_QUANT_EDGES_LEFT_TOP,
                                            //        VC1_ENC_QUANT_EDGES_TOP_RIGHT,
                                            //        VC1_ENC_QUANT_EDGES_RIGHT_BOTTOM,
                                            //        VC1_ENC_QUANT_EDGSE_BOTTOM_LEFT,
         break;
    case 2:
        m_QuantMode = VC1_ENC_QUANT_MB_PAIR;
        break;
    }
    if (!m_pSequenceHeader->IsVSTransform())
    {
       m_bVSTransform = false;
    }
    else
    {
        m_bVSTransform = false;                          // true & false

    }
    if (!m_bVSTransform)
    {
       m_uiTransformType = VC1_ENC_8x8_TRANSFORM;
    }
    else
    {
        m_uiTransformType = VC1_ENC_8x8_TRANSFORM;      //VC1_ENC_8x8_TRANSFORM
                                                        //VC1_ENC_8x4_TRANSFORM
                                                        //VC1_ENC_4x8_TRANSFORM
                                                        //VC1_ENC_4x4_TRANSFORM

    }
    m_uiMVRangeIndex = 0;                               // [0,4] if m_pSequenceHeader->IsExtendedMV(), else 0
    return UMC::UMC_OK;


}

UMC::Status VC1EncoderPictureADV::SetPictureParamsB()
{
   m_uiMVMode = VC1_ENC_1MV_HALF_BILINEAR;                      //    VC1_ENC_1MV_HALF_BILINEAR
                                                                //    VC1_ENC_1MV_QUARTER_BICUBIC


    m_uiMVTab   =0;                                             //[0,4]
    m_uiCBPTab  =0;                                             //[0,4]

    if (m_pSequenceHeader->GetDQuant()==0)
    {
        m_uiAltPQuant=0;
    }
    else
    {
        m_uiAltPQuant = m_uiQuant;          // [1,31]
    }

    switch( m_pSequenceHeader->GetDQuant())
    {
    case 0:
        m_QuantMode = VC1_ENC_QUANT_SINGLE;
        break;
    case 1:
         m_QuantMode = VC1_ENC_QUANT_SINGLE;//        VC1_ENC_QUANT_SINGLE,
                                            //        VC1_ENC_QUANT_MB_ANY,
                                            //        VC1_ENC_QUANT_MB_PAIR,
                                            //        VC1_ENC_QUANT_EDGE_ALL,
                                            //        VC1_ENC_QUANT_EDGE_LEFT,
                                            //        VC1_ENC_QUANT_EDGE_TOP,
                                            //        VC1_ENC_QUANT_EDGE_RIGHT,
                                            //        VC1_ENC_QUANT_EDGE_BOTTOM,
                                            //        VC1_ENC_QUANT_EDGES_LEFT_TOP,
                                            //        VC1_ENC_QUANT_EDGES_TOP_RIGHT,
                                            //        VC1_ENC_QUANT_EDGES_RIGHT_BOTTOM,
                                            //        VC1_ENC_QUANT_EDGSE_BOTTOM_LEFT,
         break;
    case 2:
        m_QuantMode = VC1_ENC_QUANT_MB_PAIR;
        break;
    }
    if (!m_pSequenceHeader->IsVSTransform())
    {
       m_bVSTransform = false;  // true & false
    }
    else
    {
        m_bVSTransform = false;

    }
    if (!m_bVSTransform)
    {
       m_uiTransformType = VC1_ENC_8x8_TRANSFORM;
    }
    else
    {
        m_uiTransformType = VC1_ENC_8x8_TRANSFORM;      //VC1_ENC_8x8_TRANSFORM
                                                        //VC1_ENC_8x4_TRANSFORM
                                                        //VC1_ENC_4x8_TRANSFORM
                                                        //VC1_ENC_4x4_TRANSFORM
    }
    return UMC::UMC_OK;


}

UMC::Status VC1EncoderPictureADV::WriteIPictureHeader(VC1EncoderBitStreamAdv* pCodedPicture)
{
    UMC::Status     err             =   UMC::UMC_OK;
    Ipp8u           condoverVLC[6]  =   {0,1,  3,2,    2,2};


    err = pCodedPicture->PutStartCode(0x0000010D);
    if (err != UMC::UMC_OK) return err;


    if (m_pSequenceHeader->IsInterlace())
    {
        assert(0);
    }

    //picture type - I frame
    err = pCodedPicture->PutBits(0x06,3);
    if (err != UMC::UMC_OK) return err;

    if (m_pSequenceHeader->IsFrameCounter())
    {
        assert(0);
    }
    if (m_pSequenceHeader->IsPullDown())
    {
        assert(0);
    }
    if (m_pSequenceHeader->IsPanScan())
    {
        assert(0);
    }
    err = pCodedPicture->PutBits(m_uiRoundControl,1);
    if (err != UMC::UMC_OK) return err;

    if (m_pSequenceHeader->IsInterlace())
    {
        assert(0);
    }

    if (m_pSequenceHeader->IsFrameInterpolation())
    {
        err =pCodedPicture->PutBits(m_bFrameInterpolation,1);
        if (err != UMC::UMC_OK)
            return err;
    }

    err = pCodedPicture->PutBits(m_uiQuantIndex, 5);
    if (err != UMC::UMC_OK)
        return err;

    if (m_uiQuantIndex <= 8)
    {
        err = pCodedPicture->PutBits(m_bHalfQuant, 1);
        if (err != UMC::UMC_OK)
            return err;
    }
    if (m_pSequenceHeader->GetQuantType()== VC1_ENC_QTYPE_EXPL)
    {
        err = pCodedPicture->PutBits(m_bUniformQuant,1);
        if (err != UMC::UMC_OK)
            return err;
    }
    if (m_pSequenceHeader->IsPostProc())
    {
        assert(0);
    }

   assert( m_bRawBitplanes == true);

   //raw bitplane for AC prediction
   err = pCodedPicture->PutBits(0,5);
   if (err != UMC::UMC_OK)   return err;

   if (m_pSequenceHeader->IsOverlap() && m_uiQuant<=8)
   {
       err = pCodedPicture->PutBits(2*m_uiCondOverlap,2*m_uiCondOverlap+1);
       if (err != UMC::UMC_OK)   return err;
       if (VC1_ENC_COND_OVERLAP_SOME == m_uiCondOverlap)
       {
           //bitplane
           assert( m_bRawBitplanes == true);
           //raw bitplane for AC prediction
           err = pCodedPicture->PutBits(0,5);
           if (err != UMC::UMC_OK)   return err;
       }
   }

    err = pCodedPicture->PutBits(ACTableCodesVLC[2*m_uiDecTypeAC1],ACTableCodesVLC[2*m_uiDecTypeAC1+1]);
    if (err != UMC::UMC_OK)
       return err;

    err = pCodedPicture->PutBits(ACTableCodesVLC[2*m_uiDecTypeAC2],ACTableCodesVLC[2*m_uiDecTypeAC2+1]);
    if (err != UMC::UMC_OK)
       return err;

    err = pCodedPicture->PutBits(m_uiDecTypeDCIntra,1);




    return err;
}




static bool DCACPredictionIFrameAdv(    VC1EncoderMBData* pCurrMB,
                                        VC1EncoderMBData* pLeftMB,
                                        VC1EncoderMBData* pTopMB,
                                        VC1EncoderMBData* pTopLeftMB,
                                        VC1EncoderMBData* pPredBlock,
                                        eDirection* direction)
{
    Ipp32s              z = 0;
    int                 i;
    const Ipp8u*        pTables[] = {NonPrediction, VerPrediction, HorPrediction};
    VC1EncoderMBData    TempBlock;
    Ipp16s              temp [VC1_ENC_BLOCK_SIZE*VC1_ENC_NUMBER_OF_BLOCKS]={0};

    TempBlock.InitBlocks(temp);

    pTopLeftMB  = (pTopLeftMB)  ? pTopLeftMB:&TempBlock;

    Ipp16s*             pBlocks[VC1_ENC_NUMBER_OF_BLOCKS*3]=
    {
        0,                      pTopLeftMB->m_pBlock[3], 0,                   //0..2
        0,                      0,                       pCurrMB->m_pBlock[0],//3..5
        pCurrMB->m_pBlock[0],   0,                       0,                   //6..8
        pCurrMB->m_pBlock[1],   pCurrMB->m_pBlock[0],    pCurrMB->m_pBlock[2],//9..11
        0,                      pTopLeftMB->m_pBlock[4], 0,                   //12..14
        0,                      pTopLeftMB->m_pBlock[5], 0                    //15..17
    };
    if (pTopMB)
    {
        pBlocks[0]  = pTopMB->m_pBlock[2];
        pBlocks[3]  = pTopMB->m_pBlock[3];

⌨️ 快捷键说明

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