1 /*
2 * Copyright (c) 2018-2020, Intel Corporation
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included
12 * in all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 */
22 
23 //!
24 //! \file     media_pipeline.h
25 //! \brief    Defines the common interface for media pipeline
26 //! \details  The media pipeline interface is further sub-divided by component,
27 //!           this file is for the base interface which is shared by all components.
28 //!
29 
30 #ifndef __MEDIA_PIPELINE_H__
31 #define __MEDIA_PIPELINE_H__
32 #include <map>
33 #include <functional>
34 #include "mos_defs.h"
35 #include "mos_os.h"
36 #include "media_task.h"
37 #include "media_context.h"
38 #include "media_status_report.h"
39 #include "media_feature_manager.h"
40 #include "media_perf_profiler.h"
41 #include "media_copy_wrapper.h"
42 #include "media_user_setting.h"
43 class MediaPacket;
44 class CodechalDebugInterface;
45 class MediaPipeline
46 {
47 public:
48     //!
49     //! \brief  Media pipeline constructor
50     //! \param  [in] osInterface
51     //!         Pointer to MOS_INTERFACE
52     //!
53     MediaPipeline(PMOS_INTERFACE osInterface);
54 
55     //!
56     //! \brief  Media pipeline destructor
57     //!
58     virtual ~MediaPipeline();
59 
60     //!
61     //! \brief  Initialize the media pipeline
62     //! \return MOS_STATUS
63     //!         MOS_STATUS_SUCCESS if success, else fail reason
64     //!
65     virtual MOS_STATUS Init(void *settings) = 0;
66 
67     //!
68     //! \brief  Prepare interal parameters, should be invoked for each frame
69     //! \param  [in] params
70     //!         Pointer to the input parameters
71     //! \return MOS_STATUS
72     //!         MOS_STATUS_SUCCESS if success, else fail reason
73     //!
74     virtual MOS_STATUS Prepare(void *params) = 0;
75 
76     //!
77     //! \brief  Finish the execution for each frame
78     //! \return MOS_STATUS
79     //!         MOS_STATUS_SUCCESS if success, else fail reason
80     //!
81     virtual MOS_STATUS Execute() = 0;
82 
83     //!
84     //! \brief  Get media pipeline execution status
85     //! \param  [out] status
86     //!         The point to encode status
87     //! \param  [in] numStatus
88     //!         The requested number of status reports
89     //! \return MOS_STATUS
90     //!         MOS_STATUS_SUCCESS if success, else fail reason
91     //!
92     virtual MOS_STATUS GetStatusReport(void *status, uint16_t numStatus) = 0;
93 
94     //!
95     //! \brief  Destory the media pipeline and release internal resources
96     //! \return MOS_STATUS
97     //!         MOS_STATUS_SUCCESS if success, else fail reason
98     //!
99     virtual MOS_STATUS Destroy() = 0;
100 
101     //!
102     //! \brief  Delete the packet
103     //! \return MOS_STATUS
104     //!         MOS_STATUS_SUCCESS if success, else fail reason
105     //!
106     virtual MOS_STATUS DeletePackets();
107 
108     //!
109     //! \brief  Delete the tasks
110     //! \return MOS_STATUS
111     //!         MOS_STATUS_SUCCESS if success, else fail reason
112     //!
113     virtual MOS_STATUS DeleteTasks();
114 
GetStatusReportInstance()115     MediaStatusReport* GetStatusReportInstance() { return m_statusReport; }
116 
GetMediaContext()117     MediaContext *GetMediaContext() { return m_mediaContext; }
GetFeatureManager()118     virtual MediaFeatureManager *GetFeatureManager() { return m_featureManager; };
119 
GetPacketLevelFeatureManager(int packetId)120     std::shared_ptr<MediaFeatureManager::ManagerLite> GetPacketLevelFeatureManager(int packetId) { return m_featureManager->GetPacketLevelFeatureManager(packetId); }
121 
GetMediaScalability()122     MediaScalability* &GetMediaScalability() { return m_scalability; }
123 
GetUserSetting()124     MediaUserSettingSharedPtr GetUserSetting() { return m_userSettingPtr; }
125 
126     //!
127     //! \brief  Get if frame tracking is enabled from scalability
128     //! \return bool
129     //!         true if enabled, else false
130     //!
131     bool IsFrameTrackingEnabled();
132 
133 protected:
134     //!
135     //! \brief  User Feature Key Report
136     //! \return MOS_STATUS
137     //!         MOS_STATUS_SUCCESS if success, else fail reason
138     //!
139     virtual MOS_STATUS UserFeatureReport();
140 
141     //!
142     //! \brief  Initialize the platform infos
143     //! \return MOS_STATUS
144     //!         MOS_STATUS_SUCCESS if success, else fail reason
145     //!
146     virtual MOS_STATUS InitPlatform();
147 
148     //!
149     //! \brief  Get or create packet based on packet ID
150     //! \param  [in] packetId
151     //!         Packet Id
152     //! \return MediaPacket *
153     //!         Pointer to packet
154     //!
155     MediaPacket *GetOrCreate(uint32_t packetId);
156 
157     //!
158     //! \brief  Register packets into packet pool
159     //! \param  [in] packetId
160     //!         Packet Id
161     //! \param  [in] packet
162     //!         Pointer to created packet
163     //! \return MOS_STATUS
164     //!         MOS_STATUS_SUCCESS if success, else fail reason
165     //!
166     MOS_STATUS RegisterPacket(uint32_t packetId, MediaPacket* packet);
167 
168     //!
169     //! \brief  Register packets into packet pool
170     //! \param  [in] packetId
171     //!         Packet Id
172     //! \param  [in] creator
173     //!         Packet creator
174     //! \return void
175     //!         No return value
176     //!
RegisterPacket(uint32_t packetId,std::function<MediaPacket * ()> && creator)177     void RegisterPacket(uint32_t packetId, std::function<MediaPacket *()> &&creator)
178     {
179         m_packetCreators[packetId] = creator;  // insert if key does not exist
180     }
181 
182     //!
183     //! \brief  Retrieve the task with given Id
184     //! \param  [in] taskId
185     //!         Task Id
186     //! \return MediaTask*
187     //!         Pointer to media task if success, else nullptr
188     //!
189     MediaTask* GetTask(MediaTask::TaskType type);
190 
191     //!
192     //! \brief  Activate packet and add it to active packet list
193     //! \param  [in] packetId
194     //!         Packet Id
195     //! \param  [in] immediateSubmit
196     //!         Indicate if this packet to activate is needed to submit immediately after been added to task
197     //! \param  [in] pass
198     //!         pass belongs to the Packet
199     //! \param  [in] pipe
200     //!         pipe belongs to the Packet
201     //! \param  [in] pipe numbers
202     //!         pipe numbers the Packet needs to use
203     //! \return MOS_STATUS
204     //!         MOS_STATUS_SUCCESS if success, else fail reason
205     //!
206     MOS_STATUS ActivatePacket(uint32_t packetId, bool immediateSubmit, uint16_t pass, uint8_t pipe, uint8_t pipeNum = 1, uint8_t subPass = 0, uint8_t rowNum = 0);
207 
208     //!
209     //! \brief  Activate packet and add it to active packet list
210     //! \param  [in] packetId
211     //!         Packet Id
212     //! \param  [in] immediateSubmit
213     //!         Indicate if this packet to activate is needed to submit immediately after been added to task
214     //! \param  [in] stateProperty
215     //!         State property of packet
216     //! \return MOS_STATUS
217     //!         MOS_STATUS_SUCCESS if success, else fail reason
218     //!
219     MOS_STATUS ActivatePacket(uint32_t packetId, bool immediateSubmit, StateParams &stateProperty);
220 
221     //!
222     //! \brief  Finish the active packets execution
223     //! \return MOS_STATUS
224     //!         MOS_STATUS_SUCCESS if success, else fail reason
225     //!
226     virtual MOS_STATUS ExecuteActivePackets();
227 
228     //!
229     //! \brief  Create task and add into packet pool
230     //! \param  [in] type
231     //!         Task type
232     //! \return MediaTask*
233     //!         pointer to MediaTask
234     //!
235     MediaTask* CreateTask(MediaTask::TaskType type);
236 
237     //!
238     //! \brief  create media feature manager
239     //! \return MOS_STATUS
240     //!         MOS_STATUS_SUCCESS if success, else fail reason
241     //!
242     virtual MOS_STATUS CreateFeatureManager();
243 
244     //!
245     //! \brief  Create media copy wrapper
246     //! \return MOS_STATUS
247     //!         MOS_STATUS_SUCCESS if success, else fail reason
248     //!
249     virtual MOS_STATUS CreateMediaCopyWrapper();
250 
251     //!
252     //! \brief  media user setting
253     //! \return MOS_STATUS
254     //!         MOS_STATUS_SUCCESS if success, else fail reason
255     //!
256     virtual MOS_STATUS InitUserSetting(MediaUserSettingSharedPtr userSettingPtr);
257 
258 protected:
259     PMOS_INTERFACE                   m_osInterface = nullptr;      //!< OS interface
260     CodechalDebugInterface           *m_debugInterface = nullptr;  //!< Interface used for debug dumps
261     PLATFORM                         m_platform = {};              //!< The platorm info
262     MEDIA_FEATURE_TABLE              *m_skuTable     = nullptr;    //!< SKU table
263     MEDIA_WA_TABLE                   *m_waTable      = nullptr;    //!< WA table
264     MEDIA_SYSTEM_INFO                *m_gtSystemInfo = nullptr;    //!< GT system infomation
265 
266     MediaScalability    *m_scalability      = nullptr;
267     MediaContext        *m_mediaContext     = nullptr;
268     MediaStatusReport   *m_statusReport     = nullptr;
269     MediaFeatureManager *m_featureManager   = nullptr;
270     MediaCopyWrapper    *m_mediaCopyWrapper = nullptr;
271 
272     std::map<uint32_t, MediaPacket *>                  m_packetList;        //!< Packets list
273     std::map<uint32_t, std::function<MediaPacket *()>> m_packetCreators;    //!< Packets creators
274     std::vector<PacketProperty>                        m_activePacketList;  //!< Active packets property list
275     std::map<MediaTask::TaskType, MediaTask *>         m_taskList;          //!< Task list
276     MediaUserSettingSharedPtr                          m_userSettingPtr = nullptr;     //!< usersettingInstance
277 MEDIA_CLASS_DEFINE_END(MediaPipeline)
278 };
279 #endif // !__MEDIA_PIPELINE_H__
280