📄 umc_vc1_enc_picture_sm.cpp
字号:
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 + -