mfxStatus MFX::MFXPluginFactory::Create(const PluginDescriptionRecord & rec) { PluginModule plgModule(rec.sPath); mfxPlugin plg = {}; mfxPluginParam plgParams; if (!plgModule.Create(rec.PluginUID, plg)) { return MFX_ERR_UNKNOWN; } if (!RunVerification(plg, rec, plgParams)) { //will do not call plugin close since it is not safe to do that until structure is corrected return MFX_ERR_UNKNOWN; } mfxStatus sts = MFXVideoUSER_Register(mSession, plgParams.Type, &plg); if (MFX_ERR_NONE != sts) { TRACE_PLUGIN_ERROR(" MFXVideoUSER_Register returned %d\n", sts); return sts; } mPlugins.push_back(FactoryRecord(plgParams, plgModule, plg)); return MFX_ERR_NONE; }
static int filter_pre_init( av_qsv_context* qsv, hb_filter_private_t * pv ){ mfxStatus sts = MFX_ERR_NONE; int i=0; if(!qsv) return 3; av_qsv_space *prev_vpp = 0; if(!qsv->vpp_space){ qsv->vpp_space = av_qsv_list_init(HAVE_THREADS); // note some change as : when no size changes -> no VPP used // impact on : prev_vpp } if(!pv->vpp_space){ for(i=0; i<av_qsv_list_count(qsv->vpp_space);i++){ av_qsv_space *qsv_vpp = av_qsv_list_item( qsv->vpp_space, i ); if(qsv_vpp->type == AV_QSV_VPP_USER){ pv->vpp_space = qsv_vpp; break; } else if(qsv_vpp->type == AV_QSV_VPP_DEFAULT){ prev_vpp = qsv_vpp; } } } if(!pv->vpp_space){ pv->vpp_space = calloc( 1, sizeof( av_qsv_space )); pv->vpp_space->type = AV_QSV_VPP_USER; av_qsv_list_add( qsv->vpp_space, pv->vpp_space ); av_qsv_add_context_usage(qsv,HAVE_THREADS); } else if(pv->vpp_space->is_init_done ) return 1; if(!qsv->dec_space || !qsv->dec_space->is_init_done) return 2; av_qsv_space *qsv_vpp = pv->vpp_space; AV_QSV_ZERO_MEMORY(qsv_vpp->m_mfxVideoParam); if (prev_vpp) { memcpy( &qsv_vpp->m_mfxVideoParam.vpp, &prev_vpp->m_mfxVideoParam.vpp, sizeof(prev_vpp->m_mfxVideoParam.vpp)); } else { AV_QSV_ZERO_MEMORY(qsv_vpp->m_mfxVideoParam); // FrameRate is important for VPP to start with if( qsv->dec_space->m_mfxVideoParam.mfx.FrameInfo.FrameRateExtN == 0 && qsv->dec_space->m_mfxVideoParam.mfx.FrameInfo.FrameRateExtD == 0 ){ qsv->dec_space->m_mfxVideoParam.mfx.FrameInfo.FrameRateExtN = pv->job->title->rate; qsv->dec_space->m_mfxVideoParam.mfx.FrameInfo.FrameRateExtD = pv->job->title->rate_base; } qsv_vpp->m_mfxVideoParam.vpp.In.FourCC = qsv->dec_space->m_mfxVideoParam.mfx.FrameInfo.FourCC; qsv_vpp->m_mfxVideoParam.vpp.In.ChromaFormat = qsv->dec_space->m_mfxVideoParam.mfx.FrameInfo.ChromaFormat; qsv_vpp->m_mfxVideoParam.vpp.In.CropX = qsv->dec_space->m_mfxVideoParam.mfx.FrameInfo.CropX; qsv_vpp->m_mfxVideoParam.vpp.In.CropY = qsv->dec_space->m_mfxVideoParam.mfx.FrameInfo.CropY; qsv_vpp->m_mfxVideoParam.vpp.In.CropW = pv->job->title->width; qsv_vpp->m_mfxVideoParam.vpp.In.CropH = pv->job->title->height; qsv_vpp->m_mfxVideoParam.vpp.In.PicStruct = qsv->dec_space->m_mfxVideoParam.mfx.FrameInfo.PicStruct; qsv_vpp->m_mfxVideoParam.vpp.In.FrameRateExtN = qsv->dec_space->m_mfxVideoParam.mfx.FrameInfo.FrameRateExtN; qsv_vpp->m_mfxVideoParam.vpp.In.FrameRateExtD = qsv->dec_space->m_mfxVideoParam.mfx.FrameInfo.FrameRateExtD; qsv_vpp->m_mfxVideoParam.vpp.In.AspectRatioW = qsv->dec_space->m_mfxVideoParam.mfx.FrameInfo.AspectRatioW; qsv_vpp->m_mfxVideoParam.vpp.In.AspectRatioH = qsv->dec_space->m_mfxVideoParam.mfx.FrameInfo.AspectRatioH; qsv_vpp->m_mfxVideoParam.vpp.In.Width = AV_QSV_ALIGN16(pv->job->title->width); qsv_vpp->m_mfxVideoParam.vpp.In.Height = (MFX_PICSTRUCT_PROGRESSIVE == qsv_vpp->m_mfxVideoParam.vpp.In.PicStruct)? AV_QSV_ALIGN16(pv->job->title->height) : AV_QSV_ALIGN32(pv->job->title->height); qsv_vpp->m_mfxVideoParam.vpp.Out.FourCC = qsv->dec_space->m_mfxVideoParam.mfx.FrameInfo.FourCC; qsv_vpp->m_mfxVideoParam.vpp.Out.ChromaFormat = qsv->dec_space->m_mfxVideoParam.mfx.FrameInfo.ChromaFormat; qsv_vpp->m_mfxVideoParam.vpp.Out.CropX = qsv->dec_space->m_mfxVideoParam.mfx.FrameInfo.CropX; qsv_vpp->m_mfxVideoParam.vpp.Out.CropY = qsv->dec_space->m_mfxVideoParam.mfx.FrameInfo.CropY; qsv_vpp->m_mfxVideoParam.vpp.Out.CropW = pv->job->title->width; qsv_vpp->m_mfxVideoParam.vpp.Out.CropH = pv->job->title->height; qsv_vpp->m_mfxVideoParam.vpp.Out.PicStruct = qsv->dec_space->m_mfxVideoParam.mfx.FrameInfo.PicStruct; qsv_vpp->m_mfxVideoParam.vpp.Out.FrameRateExtN = qsv->dec_space->m_mfxVideoParam.mfx.FrameInfo.FrameRateExtN; qsv_vpp->m_mfxVideoParam.vpp.Out.FrameRateExtD = qsv->dec_space->m_mfxVideoParam.mfx.FrameInfo.FrameRateExtD; qsv_vpp->m_mfxVideoParam.vpp.Out.AspectRatioW = qsv->dec_space->m_mfxVideoParam.mfx.FrameInfo.AspectRatioW; qsv_vpp->m_mfxVideoParam.vpp.Out.AspectRatioH = qsv->dec_space->m_mfxVideoParam.mfx.FrameInfo.AspectRatioH; qsv_vpp->m_mfxVideoParam.vpp.Out.Width = AV_QSV_ALIGN16(pv->job->title->width); qsv_vpp->m_mfxVideoParam.vpp.Out.Height = (MFX_PICSTRUCT_PROGRESSIVE == qsv_vpp->m_mfxVideoParam.vpp.In.PicStruct)? AV_QSV_ALIGN16(pv->job->title->height) : AV_QSV_ALIGN32(pv->job->title->height); memset(&qsv_vpp->request, 0, sizeof(mfxFrameAllocRequest)*2); } qsv_vpp->m_mfxVideoParam.IOPattern = MFX_IOPATTERN_IN_OPAQUE_MEMORY | MFX_IOPATTERN_OUT_OPAQUE_MEMORY; qsv_vpp->surface_num = FFMIN(prev_vpp ? prev_vpp->surface_num : qsv->dec_space->surface_num/2, AV_QSV_SURFACE_NUM); for(i = 0; i < qsv_vpp->surface_num; i++){ qsv_vpp->p_surfaces[i] = av_mallocz( sizeof(mfxFrameSurface1) ); AV_QSV_CHECK_POINTER(qsv_vpp->p_surfaces[i], MFX_ERR_MEMORY_ALLOC); memcpy(&(qsv_vpp->p_surfaces[i]->Info), &(qsv_vpp->m_mfxVideoParam.vpp.Out), sizeof(mfxFrameInfo)); } qsv_vpp->sync_num = FFMIN(prev_vpp ? prev_vpp->sync_num : qsv->dec_space->sync_num, AV_QSV_SYNC_NUM); for (i = 0; i < qsv_vpp->sync_num; i++){ qsv_vpp->p_syncp[i] = av_mallocz(sizeof(av_qsv_sync)); AV_QSV_CHECK_POINTER(qsv_vpp->p_syncp[i], MFX_ERR_MEMORY_ALLOC); qsv_vpp->p_syncp[i]->p_sync = av_mallocz(sizeof(mfxSyncPoint)); AV_QSV_CHECK_POINTER(qsv_vpp->p_syncp[i]->p_sync, MFX_ERR_MEMORY_ALLOC); } memset(&qsv_vpp->ext_opaque_alloc, 0, sizeof(mfxExtOpaqueSurfaceAlloc)); qsv_vpp->m_mfxVideoParam.NumExtParam = qsv_vpp->p_ext_param_num = 1; qsv_vpp->p_ext_params = av_mallocz(sizeof(mfxExtBuffer *)*qsv_vpp->p_ext_param_num); AV_QSV_CHECK_POINTER(qsv_vpp->p_ext_params, MFX_ERR_MEMORY_ALLOC); qsv_vpp->m_mfxVideoParam.ExtParam = qsv_vpp->p_ext_params; qsv_vpp->ext_opaque_alloc.Header.BufferId = MFX_EXTBUFF_OPAQUE_SURFACE_ALLOCATION; qsv_vpp->ext_opaque_alloc.Header.BufferSz = sizeof(mfxExtOpaqueSurfaceAlloc); qsv_vpp->p_ext_params[0] = (mfxExtBuffer*)&qsv_vpp->ext_opaque_alloc; if(prev_vpp){ qsv_vpp->ext_opaque_alloc.In.Surfaces = prev_vpp->p_surfaces; qsv_vpp->ext_opaque_alloc.In.NumSurface = prev_vpp->surface_num; } else{ qsv_vpp->ext_opaque_alloc.In.Surfaces = qsv->dec_space->p_surfaces; qsv_vpp->ext_opaque_alloc.In.NumSurface = qsv->dec_space->surface_num; } qsv_vpp->ext_opaque_alloc.In.Type = qsv->dec_space->request[0].Type; qsv_vpp->ext_opaque_alloc.Out.Surfaces = qsv_vpp->p_surfaces; qsv_vpp->ext_opaque_alloc.Out.NumSurface = qsv_vpp->surface_num; qsv_vpp->ext_opaque_alloc.Out.Type = qsv->dec_space->request[0].Type; pv->qsv_user = hb_list_init(); qsv_filter_t *plugin = av_mallocz( sizeof(qsv_filter_t) ); plugin->pv = pv; plugin->plug.pthis = plugin; plugin->plug.PluginInit = qsv_PluginInit; plugin->plug.PluginClose = qsv_PluginClose; plugin->plug.GetPluginParam = qsv_GetPluginParam; plugin->plug.Submit = qsv_Submit; plugin->plug.Execute = qsv_Execute; plugin->plug.FreeResources = qsv_FreeResources; hb_list_add(pv->qsv_user,plugin); sts=MFXVideoUSER_Register(qsv->mfx_session,0,&plugin->plug); AV_QSV_CHECK_RESULT(sts, MFX_ERR_NONE, sts); plugin_init(plugin,&qsv_vpp->m_mfxVideoParam); qsv_vpp->is_init_done = 1; return 0; }