- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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!
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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!
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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!
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page