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