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

📄 umc_vc1_enc_picture_sm.cpp

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


    if (m_pSequenceHeader->IsRangeRedution())
        m_bRangeRedution      = false;
    else
        m_bRangeRedution      = false;                  // Should be equal to 0 in simple profile

    if (m_pSequenceHeader->IsExtendedMV())
        m_uiMVRangeIndex = 1;                            // [0,3]
    else
        m_uiMVRangeIndex = 0;

    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 VC1EncoderPictureSM::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

    if (m_pSequenceHeader->IsMultiRes())
        m_uiResolution = VC1_ENC_RES_FULL_HOR | VC1_ENC_RES_FULL_VER;
                                                        /*..HALF_HOR|..HALF_VER, ..FULL_HOR |
                                                         ..HALF_VER, ..HALF_HOR | ..FULL_VER*/
    else
        m_uiResolution = VC1_ENC_RES_FULL_HOR | VC1_ENC_RES_FULL_VER;

    return UMC::UMC_OK;
}
UMC::Status VC1EncoderPictureSM::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
    if (m_pSequenceHeader->IsMultiRes())
        m_uiResolution = VC1_ENC_RES_FULL_HOR | VC1_ENC_RES_FULL_VER;
                                                        /*..HALF_HOR|..HALF_VER, ..FULL_HOR |
                                                         ..HALF_VER, ..HALF_HOR | ..FULL_VER*/
    else
        m_uiResolution = VC1_ENC_RES_FULL_HOR | VC1_ENC_RES_FULL_VER;

    if (m_pSequenceHeader->GetProfile() == VC1_ENC_PROFILE_S)
        m_bIntensity  = false;
    else
         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

    }
    return UMC::UMC_OK;


}
UMC::Status VC1EncoderPictureSM::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 VC1EncoderPictureSM::WriteIPictureHeader(VC1EncoderBitStreamSM* pCodedPicture)
{
    UMC::Status err      =   UMC::UMC_OK;
    bool   bBframes =   m_pSequenceHeader->IsBFrames();

    err = pCodedPicture->MakeBlankSegment(2);
    if (err!= UMC::UMC_OK)
        return err;
    if (err != UMC::UMC_OK)
        return err;
    if (m_pSequenceHeader->IsFrameInterpolation())
    {
        err =pCodedPicture->PutBits(m_bFrameInterpolation,1);
        if (err != UMC::UMC_OK)
            return err;
    }
    err = pCodedPicture->PutBits(m_uiFrameCount,2);
    if (err != UMC::UMC_OK)
        return err;
    if (m_pSequenceHeader->IsRangeRedution())
    {
        err = pCodedPicture->PutBits(m_bRangeRedution,1);
        if (err != UMC::UMC_OK)
            return err;
    }
    err = pCodedPicture->PutBits(frameTypeCodesVLC[bBframes][2*m_uiPictureType],frameTypeCodesVLC[bBframes][2*m_uiPictureType+1]);
    if (err!= UMC::UMC_OK)
        return err;

    err = pCodedPicture->PutBits(0,7);    /*buffer fullness - 7 bits*/
    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->IsExtendedMV())
    {
        err = pCodedPicture->PutBits(MVRangeCodesVLC[m_uiMVRangeIndex*2],MVRangeCodesVLC[m_uiMVRangeIndex*2+1]);
        if (err != UMC::UMC_OK)
            return err;
    }
    if (m_pSequenceHeader->IsMultiRes())
    {
        err = pCodedPicture->PutBits(this->m_uiResolution,2);
        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;
}

UMC::Status VC1EncoderPictureSM::CompletePicture(VC1EncoderBitStreamSM* pCodedPicture, double dPTS, size_t  len)
{
    UMC::Status   err       = UMC::UMC_OK;
    Ipp32u   temp           = 0;
    Ipp32u   dataLen        = 0;
    Ipp32u   uTime          = (Ipp32u)(dPTS*1000000.0);


    err = pCodedPicture->AddLastBits();
    VC1_ENC_CHECK (err)

    dataLen = pCodedPicture->GetDataLen() - len - 8;
    assert(dataLen>0);


    temp = ((m_uiPictureType == VC1_ENC_I_FRAME)<< 31) | (dataLen & 0x00FFFFFF);

    err = pCodedPicture->FillBlankSegment(temp);
    VC1_ENC_CHECK (err)

    err = pCodedPicture->FillBlankSegment(uTime);
    VC1_ENC_CHECK (err)

    pCodedPicture->DeleteBlankSegment();
    return err;
}




static bool DCACPredictionIFrameSM(VC1EncoderMBData* pCurrMB,
                                   VC1EncoderMBData* pLeftMB,
                                   VC1EncoderMBData* pTopMB,
                                   VC1EncoderMBData* pTopLeftMB,
                                   VC1EncoderMBData* pPredBlock,
                                   Ipp16s defPredictor,
                                   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};

⌨️ 快捷键说明

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