- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- 不適切なコンテンツを報告
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!
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- 不適切なコンテンツを報告
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!
コピーされたリンク
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- 不適切なコンテンツを報告
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!