Hello,
I integrated the sample_vpp program into our encoder and tried to perform one overlay stream on the primary stream. However, when the program runs into frame number 65527 (NOT_INIT_VALUE = 0xFFF7), reset routine will be triggered. The problem is the code will return error to me. I used the code in sample.vpp and here is the main code I mentioned:
do { if (bNeedReset) { paramID++; bNeedReset = false; nextResetFrmNum = (Params.resetFrmNums.size() > paramID) ? Params.resetFrmNums[paramID] : NOT_INIT_VALUE; //prepare mfxParams sts = InitParamsVPP(&mfxParamsVideo, &Params, paramID); MSDK_CHECK_STATUS_SAFE(sts, "InitParamsVPP failed", {WipeResources(&Resources); WipeParams(&Params);}); sts = ConfigVideoEnhancementFilters(&Params, &Resources, paramID); MSDK_CHECK_STATUS_SAFE(sts, "ConfigVideoEnchancementFilters failed", {WipeResources(&Resources); WipeParams(&Params);}); sts = Resources.pProcessor->pmfxVPP->Reset(Resources.pVppParams); MSDK_CHECK_STATUS_SAFE(sts, "Resources.pProcessor->pmfxVPP->Reset failed", {WipeResources(&Resources); WipeParams(&Params);}); ownToMfxFrameInfo( &(Params.frameInfoIn[paramID]), &realFrameInfoIn[0]); ownToMfxFrameInfo( &(Params.frameInfoOut[paramID]), &realFrameInfoOut); UpdateSurfacePool(mfxParamsVideo.vpp.Out, allocator.responseOut.NumFrameActual, allocator.pSurfacesOut); if(Params.numStreams==1) { UpdateSurfacePool(mfxParamsVideo.vpp.In, allocator.responseIn[0].NumFrameActual, allocator.pSurfacesIn[0]); } else { for(int i=0;i<Params.numStreams;i++) { ownToMfxFrameInfo(&(Params.inFrameInfo[i]), &realFrameInfoIn[i]); UpdateSurfacePool(mfxParamsVideo.vpp.In, allocator.responseIn[i].NumFrameActual, allocator.pSurfacesIn[i]); } } msdk_printf(MSDK_STRING("VPP reseted at frame number %d\n"), numGetFrames); } //... ... } while (bNeedReset);
I try to debug on it and find that when the program gets frame number 65527, the reset routine will enter the above code. The first time, InitParamsVPP return error to me and sts=MFX_ERR_UNSUPPORTED(-3). I followed the code InitParamsVPP and find that the problem is neither frameInfoOut and frameInfoIn set correctly.
if (pInParams->frameInfoIn[paramID].nWidth == 0 || pInParams->frameInfoIn[paramID].nHeight == 0 ){ return MFX_ERR_UNSUPPORTED; } if (pInParams->frameInfoOut[paramID].nWidth == 0 || pInParams->frameInfoOut[paramID].nHeight == 0 ){ return MFX_ERR_UNSUPPORTED; }
m_Params->frameInfoIn[paramID].nWidth 0
m_Params.frameInfoIn[m_paramID].nHeight 0
m_Params.frameInfoIn[m_paramID].dFrameRate 1
m_Params->frameInfoIn[paramID].CropH 1080
m_Params.frameInfoIn[m_paramID].CropW 1920
m_Params->frameInfoIn[paramID].CropX 0
m_Params.frameInfoIn[m_paramID].CropY 0
m_Params->frameInfoOut[paramID].CropH 0
m_Params.frameInfoOut[m_paramID].CropW 0
m_Params->frameInfoOut[paramID].CropX 0
m_Params.frameInfoOut[m_paramID].CropY 0
m_Params->frameInfoOut[paramID].nWidth 0
m_Params.frameInfoOut[m_paramID].nHeight 0
m_Params.frameInfoOut[m_paramID].dFrameRate 1
Then, I make a function MakingFrameInfo() to make the values of the above correct before passing InitParamsVPP
mfxStatus MakingFrameInfo(CEncoder *encoder, sInputParams* pParams){ mfxStatus sts = MFX_ERR_NONE; vector<COverlay>::const_iterator ciiprimary2 = encoder->GetEncoderProfile()->m_overlay_primary.begin(); pParams->frameInfoIn[m_paramID].nWidth = (mfxU16)ciiprimary2->width; pParams->frameInfoIn[m_paramID].nHeight = (mfxU16)ciiprimary2->height; pParams->frameInfoIn[m_paramID].dFrameRate = (mfxF64) ciiprimary2->framerate; pParams->frameInfoIn[m_paramID].CropH = (mfxU16)ciiprimary2->croph; pParams->frameInfoIn[m_paramID].CropW = (mfxU16)ciiprimary2->cropw; pParams->frameInfoIn[m_paramID].CropX = (mfxU16) ciiprimary2->cropx; pParams->frameInfoIn[m_paramID].CropY = (mfxU16)ciiprimary2->cropy; char * temp2 = (char *)ciiprimary2->infourcc.c_str(); pParams->frameInfoIn[m_paramID].FourCC = Str2FourCC(temp2); pParams->frameInfoIn[m_paramID].PicStruct = (mfxU16)ciiprimary2->PicStruct; pParams->frameInfoIn[m_paramID].BitDepthChroma = 0; pParams->frameInfoIn[m_paramID].BitDepthLuma = 0; vector<COverlay>::const_iterator ciiprimary = encoder->GetEncoderProfile()->m_overlay_primary.begin(); pParams->frameInfoOut[m_paramID].nWidth= (mfxU16)ciiprimary->width; pParams->frameInfoOut[m_paramID].nHeight = (mfxU16)ciiprimary->height; pParams->frameInfoOut[m_paramID].dFrameRate = (mfxF64)ciiprimary->framerate; pParams->frameInfoOut[m_paramID].CropH = (mfxU16)ciiprimary->croph; pParams->frameInfoOut[m_paramID].CropW = (mfxU16)ciiprimary->cropw; pParams->frameInfoOut[m_paramID].CropX = (mfxU16)ciiprimary->cropx; pParams->frameInfoOut[m_paramID].CropY = (mfxU16)ciiprimary->cropy; char * temp3 = (char *)ciiprimary->infourcc.c_str(); pParams->frameInfoOut[m_paramID].FourCC = Str2FourCC(temp3); pParams->frameInfoOut[m_paramID].PicStruct = (mfxU16)ciiprimary->PicStruct; pParams->frameInfoOut[m_paramID].BitDepthChroma = 0; pParams->frameInfoOut[m_paramID].BitDepthLuma = 0; return sts; }
After that, I can pass through the checking and run the program and reset successfully. However, when the program runs into the reset routine the second time, it returns error MFX_ERR_INVALID_VIDEO_PARAM(-15) on Reset function. Below is the video parameter of the Reset function. I am not sure what is going on and would like to ask for help on it.
m_Resources.pVppParams->vpp.In.Height 1088 m_Resources.pVppParams->vpp.In.Width 1920 m_Resources.pVppParams->vpp.In.CropH 1088 m_Resources.pVppParams->vpp.In.CropW 1920 m_Resources.pVppParams->vpp.In.CropX 0 m_Resources.pVppParams->vpp.In.CropY 0 m_Resources.pVppParams->vpp.In.FrameRateExtN 30 m_Resources.pVppParams->vpp.In.FrameRateExtD 1 m_Resources.pVppParams->vpp.Out.Height 1088 m_Resources.pVppParams->vpp.Out.Width 1920 m_Resources.pVppParams->vpp.Out.CropH 1080 m_Resources.pVppParams->vpp.Out.CropW 1920 m_Resources.pVppParams->vpp.Out.CropX 0 m_Resources.pVppParams->vpp.Out.CropY 0 m_Resources.pVppParams->vpp.Out.FrameRateExtN 30 m_Resources.pVppParams->vpp.Out.FrameRateExtD 1
Many Thanks,
Michael Hui