Community
cancel
Showing results for 
Search instead for 
Did you mean: 
Highlighted
Novice
20 Views

Encoder reset fails

Jump to solution

Hi.

I am trying to apply new encoder parameter setting but I keep getting a NULL_POINTER error, but the pointer is definitely not null.

I have written a test module that sets up a SDK session with a VPP and ENCODER pipeline.

I am loading a test video sequence of 300 frames and what I'm trying to do is to change the TargetBitrate after 100 frames. The first 100 frames are encoded without problem but when I'm trying to change the encoder parameters with Reset, I always get the same return code(-2)

These are the initial parameters of the encoder

//Initialization of encoder parameters
	memset(&internal_encode_qsv.ENCParams,0,sizeof(internal_encode_qsv.ENCParams));
	internal_encode_qsv.ENCParams.mfx.CodecId					= MFX_CODEC_AVC;
	internal_encode_qsv.ENCParams.mfx.CodecProfile				= MFX_PROFILE_AVC_HIGH;
	internal_encode_qsv.ENCParams.mfx.TargetUsage 				= MFX_TARGETUSAGE_BALANCED;
	internal_encode_qsv.ENCParams.mfx.TargetKbps 				= 18000;
	internal_encode_qsv.ENCParams.mfx.MaxKbps					= 20000;
	internal_encode_qsv.ENCParams.mfx.RateControlMethod 		= MFX_RATECONTROL_VBR;
	internal_encode_qsv.ENCParams.mfx.FrameInfo.FrameRateExtN	= 30;
	internal_encode_qsv.ENCParams.mfx.FrameInfo.FrameRateExtD	= 1;
	internal_encode_qsv.ENCParams.mfx.IdrInterval				= 5 * internal_encode_qsv.ENCParams.mfx.FrameInfo.FrameRateExtN;//0xFFFFU;
	internal_encode_qsv.ENCParams.mfx.GopRefDist				= 1;//B-frames disabled
	internal_encode_qsv.ENCParams.mfx.NumRefFrame				= 1;
	internal_encode_qsv.ENCParams.mfx.NumSlice					= 1;
	internal_encode_qsv.ENCParams.mfx.FrameInfo.FourCC			= MFX_FOURCC_NV12;
	internal_encode_qsv.ENCParams.mfx.FrameInfo.ChromaFormat	= MFX_CHROMAFORMAT_YUV420;
	internal_encode_qsv.ENCParams.mfx.FrameInfo.PicStruct		= MFX_PICSTRUCT_PROGRESSIVE;
	internal_encode_qsv.ENCParams.mfx.FrameInfo.CropX			= 0;
	internal_encode_qsv.ENCParams.mfx.FrameInfo.CropY			= 0;
	internal_encode_qsv.ENCParams.mfx.FrameInfo.CropW			= target_width;
	internal_encode_qsv.ENCParams.mfx.FrameInfo.CropH			= target_height;
	
	//Width is aligned as a multiple of 16
	internal_encode_qsv.ENCParams.mfx.FrameInfo.Width = MSDK_ALIGN16(target_width);
	
	//Same applies for height unless it's a field picture so it is a multiple of 32
	internal_encode_qsv.ENCParams.mfx.FrameInfo.Height = (MFX_PICSTRUCT_PROGRESSIVE == internal_encode_qsv.ENCParams.mfx.FrameInfo.PicStruct)?
        MSDK_ALIGN16(target_height) : MSDK_ALIGN32(target_height);
	
	internal_encode_qsv.ENCParams.IOPattern = MFX_IOPATTERN_IN_VIDEO_MEMORY;
	
	//Additional ENCODER configuration for low latency
	internal_encode_qsv.ENCParams.AsyncDepth = 1;
	
	//Setting up the extended buffers
	mfxExtCodingOption conf;
	memset(&conf, 0, sizeof(conf));
	conf.Header.BufferId = MFX_EXTBUFF_CODING_OPTION;
	conf.Header.BufferSz = sizeof(conf);
	conf.RecoveryPointSEI = MFX_CODINGOPTION_ON;
	conf.MaxDecFrameBuffering = 1;

	
	mfxExtCodingOption2 conf2;
	memset(&conf2, 0, sizeof(conf2));
	conf2.Header.BufferId = MFX_EXTBUFF_CODING_OPTION2;
	conf2.Header.BufferSz = sizeof(conf2);
	conf2.Trellis = MFX_TRELLIS_I | MFX_TRELLIS_P;
	conf2.RepeatPPS = MFX_CODINGOPTION_OFF;
	
	//Adding the extended buffers
	mfxExtBuffer *extrasBuf[2];
	extrasBuf[0] = (mfxExtBuffer*)&conf;
	extrasBuf[1] = (mfxExtBuffer*)&conf2;
	internal_encode_qsv.ENCParams.ExtParam = extrasBuf;
	internal_encode_qsv.ENCParams.NumExtParam = 2;

I'm trying to apply a new bitrate like this:

mfxVideoParam tmp;
	memcpy(&tmp, &internal_encode_qsv.ENCParams, sizeof(mfxVideoParam));
	printf("[%s] Copied %d bytes.\n", video_encode_qsv_name, sizeof(tmp));
        tmp.mfx.TargetKbps = 8000;
	tmp.mfx.MaxKbps    = 10000;
        internal_encode_qsv.mfxENC.Query(&tmp, &tmp);
	MSDK_CHECK_RESULT(internal_encode_qsv.sts, MFX_ERR_NONE, internal_encode_qsv.sts);
	memcpy(&internal_encode_qsv.ENCParams, &tmp, sizeof(mfxVideoParam));
	internal_encode_qsv.sts = internal_encode_qsv.mfxENC.Reset(&internal_encode_qsv.ENCParams);
	MSDK_CHECK_RESULT(internal_encode_qsv.sts, MFX_ERR_NONE, internal_encode_qsv.sts);

In the last check I'm always getting -2. Is there anything that I'm missing?

Any help is greatly appreciated!

0 Kudos

Accepted Solutions
Highlighted
Novice
20 Views

Hi again.

I solved the problem on my own.

Problem was that I was not adding the mfxExtEncoderResetOption to the parameters.

By doing so, the Reset works like a charm!

View solution in original post

0 Kudos
1 Reply
Highlighted
Novice
21 Views

Hi again.

I solved the problem on my own.

Problem was that I was not adding the mfxExtEncoderResetOption to the parameters.

By doing so, the Reset works like a charm!

View solution in original post

0 Kudos