Media (Intel® Video Processing Library, Intel Media SDK)
Access community support with transcoding, decoding, and encoding in applications using media tools like Intel® oneAPI Video Processing Library and Intel® Media SDK
Announcements
The Intel Media SDK project is no longer active. For continued support and access to new features, Intel Media SDK users are encouraged to read the transition guide on upgrading from Intel® Media SDK to Intel® Video Processing Library (VPL), and to move to VPL as soon as possible.
For more information, see the VPL website.
3075 Discussions

How to use h.264 High Profile but disable CABAC and B slices

IDZ_A_Intel
Employee
1,573 Views
How to use h.264 High Profile but disable CABAC and B slices

Thanks
0 Kudos
1 Solution
IDZ_A_Intel
Employee
1,573 Views
You can write something like this
[bash]mfxVideoParam mvp;
mfxExtCodingOption meco, *pmeco = &meco;

memset(0, &mvp, sizeof(mvp));
memset(0, &meco, sizeof(meco));

// Specify AVC high profile
mvp.mfx.CodecId = MFX_CODEC_AVC;
mvp.mfx.CodecProfile = MFX_PROFILE_AVC_HIGH;
// Disable B slices
mvp.mfx.GopRefDist = 1;

// To disable CABAC it is necessary to attach one extended buffer mfxExtCodingOption to video params
meco.CAVLC = 1;
meco.Header.BufferId = MFX_EXTBUFF_CODING_OPTION;
meco.Header.BufferSz = sizeof(meco);
mvp.NumExtParam = 1;
mvp.ExtParam = (mfxExtBuffer **)&pmeco;

// Other parameters have to specified in video params for correct encoder initialization

...

MFXVideoEncode_Init(session, &mvp);[/bash]

View solution in original post

0 Kudos
7 Replies
IDZ_A_Intel
Employee
1,574 Views
You can write something like this
[bash]mfxVideoParam mvp;
mfxExtCodingOption meco, *pmeco = &meco;

memset(0, &mvp, sizeof(mvp));
memset(0, &meco, sizeof(meco));

// Specify AVC high profile
mvp.mfx.CodecId = MFX_CODEC_AVC;
mvp.mfx.CodecProfile = MFX_PROFILE_AVC_HIGH;
// Disable B slices
mvp.mfx.GopRefDist = 1;

// To disable CABAC it is necessary to attach one extended buffer mfxExtCodingOption to video params
meco.CAVLC = 1;
meco.Header.BufferId = MFX_EXTBUFF_CODING_OPTION;
meco.Header.BufferSz = sizeof(meco);
mvp.NumExtParam = 1;
mvp.ExtParam = (mfxExtBuffer **)&pmeco;

// Other parameters have to specified in video params for correct encoder initialization

...

MFXVideoEncode_Init(session, &mvp);[/bash]
0 Kudos
IDZ_A_Intel
Employee
1,572 Views
Hi Gregory,
I got it.
But should I use meco.CAVLC = MFX_CODINGOPTION_ON instead of meco.CAVLC = 1 ?

Thanks.
0 Kudos
IDZ_A_Intel
Employee
1,573 Views
Yes, you should use preferably useMFX_CODINGOPTION_ON enum instead.
Thanks,
Petter
0 Kudos
IDZ_A_Intel
Employee
1,573 Views
Hi,
I modify the smaple to disable B-slice and CABAC.
But sts = m_pmfxENC->QueryIOSurf(&m_mfxEncParams, &EncRequest); inmfxStatus CEncodingPipeline::AllocFrames() return MFX_ERR_NULL_PTR.
Is there aynthing wrong?
Thanks.
mfxStatus CEncodingPipeline::InitMfxEncParams(sInputParams *pInParams)
{
m_mfxEncParams.mfx.GopRefDist = 1;// Disable B slices
// To disable CABAC it is necessary to attach one extended buffer mfxExtCodingOption to video params
mfxExtCodingOption meco;
//mfxExtCodingOption *pmeco = &meco;
memset( &meco,0, sizeof(meco));
meco.CAVLC = MFX_CODINGOPTION_ON;
meco.Header.BufferId = MFX_EXTBUFF_CODING_OPTION;
meco.Header.BufferSz = sizeof(meco);
m_mfxEncParams.NumExtParam=1;
m_mfxEncParams.ExtParam = (mfxExtBuffer **)&meco;
m_mfxEncParams.mfx.CodecId = pInParams->CodecId;
m_mfxEncParams.mfx.TargetUsage = pInParams->nTargetUsage; // trade-off between quality and speed
m_mfxEncParams.mfx.TargetKbps = pInParams->nBitRate; // in Kbps
m_mfxEncParams.mfx.RateControlMethod = MFX_RATECONTROL_CBR;
ConvertFrameRate(pInParams->dFrameRate, &m_mfxEncParams.mfx.FrameInfo.FrameRateExtN, &m_mfxEncParams.mfx.FrameInfo.FrameRateExtD);
m_mfxEncParams.mfx.EncodedOrder = 0; // binary flag, 0 signals encoder to take frames in display order
// specify memory type
if (pInParams->bd3dAlloc)
{
m_mfxEncParams.IOPattern = MFX_IOPATTERN_IN_VIDEO_MEMORY;
}
else
{
m_mfxEncParams.IOPattern = MFX_IOPATTERN_IN_SYSTEM_MEMORY;
}
// frame info parameters
m_mfxEncParams.mfx.FrameInfo.FourCC = MFX_FOURCC_NV12;
m_mfxEncParams.mfx.FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420;
m_mfxEncParams.mfx.FrameInfo.PicStruct = pInParams->nPicStruct;
// set frame size and crops
// width must be a multiple of 16
// height must be a multiple of 16 in case of frame picture and a multiple of 32 in case of field picture
m_mfxEncParams.mfx.FrameInfo.Width = MSDK_ALIGN16(pInParams->nDstWidth);
m_mfxEncParams.mfx.FrameInfo.Height = (MFX_PICSTRUCT_PROGRESSIVE == m_mfxEncParams.mfx.FrameInfo.PicStruct)?
MSDK_ALIGN16(pInParams->nDstHeight) : MSDK_ALIGN32(pInParams->nDstHeight);
m_mfxEncParams.mfx.FrameInfo.CropX = 0;
m_mfxEncParams.mfx.FrameInfo.CropY = 0;
m_mfxEncParams.mfx.FrameInfo.CropW = pInParams->nDstWidth;
m_mfxEncParams.mfx.FrameInfo.CropH = pInParams->nDstHeight;
// we don't specify profile and level and let the encoder choose those basing on parameters
// we must specify profile only for MVC codec
if (m_bIsMVC)
{
m_mfxEncParams.mfx.CodecProfile = MFX_PROFILE_AVC_STEREO_HIGH;
}
// configure and attach external parameters
if (pInParams->bIsMVC)
m_EncExtParams.push_back((mfxExtBuffer *)&m_MVCSeqDesc);
if (!m_EncExtParams.empty())
{
m_mfxEncParams.ExtParam = &m_EncExtParams[0]; // vector is stored linearly in memory
m_mfxEncParams.NumExtParam = (mfxU16)m_EncExtParams.size();
}
return MFX_ERR_NONE;
}
0 Kudos
IDZ_A_Intel
Employee
1,573 Views
Hi kkbee,

I'm pretty sure the issue you are facing is due to "EncRequest" structure not having the extended buffer pointer set. Can you please check?

"QueryIOSurf" function will validate the input parameters and write the selected output parameters to the"EncRequest" structure. If the extended buffer pointer has not been set you will get the error you have seen. You can initialize the"EncRequest" structure to point to the same extended buffer as "m_mfxEncParams".

Regards,
Petter
0 Kudos
IDZ_A_Intel
Employee
1,573 Views
Hi again,

I read your message too fast. I realize now that you get an error when calling"QueryIOSurf", and not"Query". :(

Looking at this again it seems the issue may have to do with the way you initialize "m_mfxEncParams.ExtParam". It needs to be a pointer to pointer as Gregory explained in his code snippet. Also, to make sure you do not loose local data on the stack when you go out of the function scope, please move "mfxExtCodingOptionmeco" storage to the class intead.

Regards,
Petter
0 Kudos
IDZ_A_Intel
Employee
1,573 Views
I got it.
Because I use local meco variable.
After running CEncodingPipeline::InitMfxEncParams, meco is invalid.
Thank for your help.
0 Kudos
Reply