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