1 // Copyright (c) 2017 Intel Corporation 2 // 3 // Permission is hereby granted, free of charge, to any person obtaining a copy 4 // of this software and associated documentation files (the "Software"), to deal 5 // in the Software without restriction, including without limitation the rights 6 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 // copies of the Software, and to permit persons to whom the Software is 8 // furnished to do so, subject to the following conditions: 9 // 10 // The above copyright notice and this permission notice shall be included in all 11 // copies or substantial portions of the Software. 12 // 13 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 // SOFTWARE. 20 21 #if !defined(__MFX_USER_PLUGIN_H) 22 #define __MFX_USER_PLUGIN_H 23 24 #include <mfxvideo++int.h> 25 26 #include <mfxplugin.h> 27 #include <mfx_task.h> 28 #include "mfx_enc_ext.h" 29 30 class VideoUSERPlugin : public VideoCodecUSER 31 { 32 public: 33 // Default constructor, codec id != for decoder, and encoder plugins 34 VideoUSERPlugin(); 35 // Destructor 36 ~VideoUSERPlugin(void); 37 38 // Initialize the user's plugin 39 mfxStatus PluginInit(const mfxPlugin *pParam, 40 mfxSession session, 41 mfxU32 type = MFX_PLUGINTYPE_VIDEO_GENERAL); 42 // Release the user's plugin 43 mfxStatus PluginClose(void); 44 // Get the plugin's threading policy 45 mfxTaskThreadingPolicy GetThreadingPolicy(void); 46 47 // Check the parameters to start a new tasl 48 mfxStatus Check(const mfxHDL *in, mfxU32 in_num, 49 const mfxHDL *out, mfxU32 out_num, 50 MFX_ENTRY_POINT *pEntryPoint); 51 52 mfxStatus QueryIOSurf(VideoCORE *core, mfxVideoParam *par, mfxFrameAllocRequest *in, mfxFrameAllocRequest *out); 53 mfxStatus Query(VideoCORE *core, mfxVideoParam *in, mfxVideoParam *out); 54 mfxStatus DecodeHeader(VideoCORE *core, mfxBitstream *bs, mfxVideoParam *par); 55 56 mfxStatus Init(mfxVideoParam *par) ; 57 mfxStatus Close(void); 58 mfxStatus Reset(mfxVideoParam *par) ; 59 mfxStatus GetFrameParam(mfxFrameParam *par) ; 60 mfxStatus GetVideoParam(mfxVideoParam *par) ; 61 mfxStatus GetEncodeStat(mfxEncodeStat *stat) ; 62 mfxStatus GetDecodeStat(mfxDecodeStat *stat) ; 63 mfxStatus GetVPPStat(mfxVPPStat *stat) ; 64 mfxStatus DecodeFrameCheck(mfxBitstream *bs, mfxFrameSurface1 *surface_work, mfxFrameSurface1 **surface_out, MFX_ENTRY_POINT * ep) ; 65 mfxStatus SetSkipMode(mfxSkipMode mode) ; 66 mfxStatus GetPayload(mfxU64 *ts, mfxPayload *payload) ; 67 68 mfxStatus EncodeFrameCheck(mfxEncodeCtrl *ctrl, 69 mfxFrameSurface1 *surface, 70 mfxBitstream *bs, 71 /*mfxFrameSurface1 **reordered_surface, 72 mfxEncodeInternalParams *pInternalParams,*/ 73 MFX_ENTRY_POINT *pEntryPoint) ; 74 75 mfxStatus VPPFrameCheck(mfxFrameSurface1 *in, mfxFrameSurface1 *out, mfxExtVppAuxData *aux, MFX_ENTRY_POINT *ep) ; 76 mfxStatus VPPFrameCheckEx(mfxFrameSurface1 *in, mfxFrameSurface1 *work, mfxFrameSurface1 **out, MFX_ENTRY_POINT *ep) ; 77 mfxStatus EncFrameCheck(mfxENCInput *in, mfxENCOutput *out, MFX_ENTRY_POINT *pEntryPoint); 78 79 mfxStatus EncodeFrame(mfxEncodeCtrl *ctrl, mfxEncodeInternalParams *pInternalParams, mfxFrameSurface1 *surface, mfxBitstream *bs) ; 80 mfxStatus CancelFrame(mfxEncodeCtrl *ctrl, mfxEncodeInternalParams *pInternalParams, mfxFrameSurface1 *surface, mfxBitstream *bs) ; 81 mfxStatus EncFrame(mfxENCInput *in, mfxENCOutput *out); 82 83 //expose new encoder/decoder view 84 VideoENCODE* GetEncodePtr(); 85 VideoDECODE* GetDecodePtr(); 86 VideoVPP* GetVPPPtr(); 87 VideoENC* GetEncPtr(); 88 89 void GetPlugin(mfxPlugin& plugin); 90 91 protected: 92 class VideoENCDECImpl : public VideoENCODE, public VideoDECODE, public VideoVPP, public VideoENC_Ext 93 { 94 VideoUSERPlugin *m_plg; 95 public: VideoENCDECImpl(VideoUSERPlugin * plg)96 VideoENCDECImpl(VideoUSERPlugin * plg) 97 : m_plg (plg) { 98 } Init(mfxVideoParam * par)99 mfxStatus Init(mfxVideoParam *par) {return m_plg->Init(par);} Reset(mfxVideoParam * par)100 mfxStatus Reset(mfxVideoParam *par) {return m_plg->Reset(par);} Close()101 mfxStatus Close() { return m_plg->Close(); } GetThreadingPolicy(void)102 mfxTaskThreadingPolicy GetThreadingPolicy(void) { 103 return m_plg->GetThreadingPolicy(); 104 } GetVideoParam(mfxVideoParam * par)105 mfxStatus GetVideoParam(mfxVideoParam *par) { 106 return m_plg->GetVideoParam(par); 107 } 108 //encode GetFrameParam(mfxFrameParam * par)109 mfxStatus GetFrameParam(mfxFrameParam *par) { 110 return m_plg->GetFrameParam(par); 111 } GetEncodeStat(mfxEncodeStat * stat)112 mfxStatus GetEncodeStat(mfxEncodeStat *stat) { 113 return m_plg->GetEncodeStat(stat); 114 } 115 virtual EncodeFrameCheck(mfxEncodeCtrl * ctrl,mfxFrameSurface1 * surface,mfxBitstream * bs,mfxFrameSurface1 **,mfxEncodeInternalParams *,MFX_ENTRY_POINT * pEntryPoint)116 mfxStatus EncodeFrameCheck(mfxEncodeCtrl *ctrl, 117 mfxFrameSurface1 *surface, 118 mfxBitstream *bs, 119 mfxFrameSurface1 ** /*reordered_surface*/, 120 mfxEncodeInternalParams * /*pInternalParams*/, 121 MFX_ENTRY_POINT *pEntryPoint) 122 { 123 return m_plg->EncodeFrameCheck(ctrl, surface, bs, pEntryPoint); 124 } EncodeFrameCheck(mfxEncodeCtrl *,mfxFrameSurface1 *,mfxBitstream *,mfxFrameSurface1 **,mfxEncodeInternalParams *)125 virtual mfxStatus EncodeFrameCheck(mfxEncodeCtrl * /*ctrl*/ 126 , mfxFrameSurface1 * /*surface*/ 127 , mfxBitstream * /*bs*/ 128 , mfxFrameSurface1 ** /*reordered_surface*/ 129 , mfxEncodeInternalParams * /*pInternalParams*/) { 130 return MFX_ERR_NONE; 131 } 132 133 virtual RunFrameVmeENCCheck(mfxENCInput * in,mfxENCOutput * out,MFX_ENTRY_POINT * pEntryPoint)134 mfxStatus RunFrameVmeENCCheck( mfxENCInput *in, 135 mfxENCOutput *out, 136 MFX_ENTRY_POINT* pEntryPoint) 137 { 138 return m_plg->EncFrameCheck(in,out,pEntryPoint); 139 } 140 141 EncodeFrame(mfxEncodeCtrl * ctrl,mfxEncodeInternalParams * pInternalParams,mfxFrameSurface1 * surface,mfxBitstream * bs)142 mfxStatus EncodeFrame(mfxEncodeCtrl *ctrl, mfxEncodeInternalParams *pInternalParams, mfxFrameSurface1 *surface, mfxBitstream *bs) { 143 return m_plg->EncodeFrame(ctrl, pInternalParams, surface, bs); 144 } 145 CancelFrame(mfxEncodeCtrl * ctrl,mfxEncodeInternalParams * pInternalParams,mfxFrameSurface1 * surface,mfxBitstream * bs)146 mfxStatus CancelFrame(mfxEncodeCtrl *ctrl, mfxEncodeInternalParams *pInternalParams, mfxFrameSurface1 *surface, mfxBitstream *bs) { 147 return m_plg->CancelFrame(ctrl, pInternalParams, surface, bs); 148 } 149 //decode GetDecodeStat(mfxDecodeStat * stat)150 mfxStatus GetDecodeStat(mfxDecodeStat *stat) {return m_plg->GetDecodeStat(stat);} DecodeFrameCheck(mfxBitstream * bs,mfxFrameSurface1 * surface_work,mfxFrameSurface1 ** surface_out,MFX_ENTRY_POINT * pEntryPoint)151 mfxStatus DecodeFrameCheck(mfxBitstream *bs, 152 mfxFrameSurface1 *surface_work, 153 mfxFrameSurface1 **surface_out, 154 MFX_ENTRY_POINT *pEntryPoint) { 155 return m_plg->DecodeFrameCheck(bs, surface_work, surface_out, pEntryPoint); 156 } 157 SetSkipMode(mfxSkipMode mode)158 mfxStatus SetSkipMode(mfxSkipMode mode) {return m_plg->SetSkipMode(mode);} GetPayload(mfxU64 * ts,mfxPayload * payload)159 mfxStatus GetPayload(mfxU64 *ts, mfxPayload *payload) {return m_plg->GetPayload(ts, payload);} 160 //vpp GetVPPStat(mfxVPPStat * stat)161 mfxStatus GetVPPStat(mfxVPPStat *stat) { 162 return m_plg->GetVPPStat(stat); 163 } 164 virtual VPPFrameCheck(mfxFrameSurface1 * in,mfxFrameSurface1 * out,mfxExtVppAuxData * aux,MFX_ENTRY_POINT * ep)165 mfxStatus VPPFrameCheck(mfxFrameSurface1 *in, 166 mfxFrameSurface1 *out, 167 mfxExtVppAuxData *aux, 168 MFX_ENTRY_POINT *ep) 169 { 170 return m_plg->VPPFrameCheck(in, out, aux, ep); 171 } 172 virtual VPPFrameCheckEx(mfxFrameSurface1 * in,mfxFrameSurface1 * work,mfxFrameSurface1 ** out,MFX_ENTRY_POINT * ep)173 mfxStatus VPPFrameCheckEx(mfxFrameSurface1 *in, 174 mfxFrameSurface1 *work, 175 mfxFrameSurface1 **out, 176 MFX_ENTRY_POINT *ep) 177 { 178 return m_plg->VPPFrameCheckEx(in, work, out, ep); 179 } 180 virtual VppFrameCheck(mfxFrameSurface1 *,mfxFrameSurface1 *)181 mfxStatus VppFrameCheck( 182 mfxFrameSurface1 *, 183 mfxFrameSurface1 *) 184 { 185 return MFX_ERR_UNSUPPORTED; 186 } 187 virtual RunFrameVPP(mfxFrameSurface1 *,mfxFrameSurface1 *,mfxExtVppAuxData *)188 mfxStatus RunFrameVPP( 189 mfxFrameSurface1 *, 190 mfxFrameSurface1 *, 191 mfxExtVppAuxData *) 192 { 193 return MFX_ERR_UNSUPPORTED; 194 } 195 }; 196 197 void Release(void); 198 199 // User's plugin parameters 200 mfxPluginParam m_param; 201 mfxPlugin m_plugin; 202 203 // Default entry point structure 204 MFX_ENTRY_POINT m_entryPoint; 205 }; 206 207 #endif // __MFX_USER_PLUGIN_H 208