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 //! \file encode_pipeline.h 24 //! \brief Defines the common interface for encode pipeline 25 //! \details The encode pipeline interface is further sub-divided by codec standard, 26 //! this file is for the base interface which is shared by all codecs. 27 //! 28 #ifndef __ENCODE_PIPELINE_H__ 29 #define __ENCODE_PIPELINE_H__ 30 31 #include "media_pipeline.h" 32 33 #include "codec_hw_next.h" 34 #include "codec_def_encode.h" 35 #include "media_scalability.h" 36 #include "encode_allocator.h" 37 #include "encode_basic_feature.h" 38 #include "encode_tracked_buffer.h" 39 #include "encode_recycle_resource.h" 40 #include "encode_mem_compression.h" 41 #include "encodecp.h" 42 #include "encode_packet_utilities.h" 43 #include "encode_scalability_defs.h" 44 45 #define CONSTRUCTPACKETID(_componentId, _subComponentId, _packetId) \ 46 (_componentId << 24 | _subComponentId << 16 | _packetId) 47 48 namespace encode 49 { 50 class EncodePipeline : public MediaPipeline 51 { 52 public: 53 //! 54 //! \brief EncodePipeline constructor 55 //! \param [in] hwInterface 56 //! Pointer to CodechalHwInterface 57 //! \param [in] debugInterface 58 //! Pointer to CodechalDebugInterface 59 //! 60 EncodePipeline( 61 CodechalHwInterfaceNext *hwInterface, 62 CodechalDebugInterface *debugInterface); 63 ~EncodePipeline()64 virtual ~EncodePipeline() {} 65 66 virtual MOS_STATUS Prepare(void *params) override; 67 68 MOS_STATUS ContextSwitchBack(); 69 GetEncodeAllocator()70 EncodeAllocator * GetEncodeAllocator() { return m_allocator; }; GetHWInterface()71 CodechalHwInterfaceNext *GetHWInterface() { return m_hwInterface; }; GetPacketUtilities()72 PacketUtilities * GetPacketUtilities() { return m_packetUtilities; }; 73 74 //! 75 //! \brief Get if SingleTaskPhaseSupported 76 //! \return bool 77 //! value of SingleTaskPhaseSupported 78 //! IsSingleTaskPhaseSupported()79 bool IsSingleTaskPhaseSupported() { return m_singleTaskPhaseSupported; }; 80 81 //! 82 //! \brief Get if m_singleTaskPhaseSupportedInPak 83 //! \return bool 84 //! value of m_singleTaskPhaseSupportedInPak 85 //! IsSingleTaskPhaseSupportedInPak()86 bool IsSingleTaskPhaseSupportedInPak() { return m_singleTaskPhaseSupportedInPak; }; 87 88 //! 89 //! \brief Get the Debug interface 90 //! \return CodechalDebugInterface * 91 //! pointer of m_debugInterface 92 //! GetDebugInterface()93 CodechalDebugInterface *GetDebugInterface() const { return m_debugInterface; } 94 95 //! 96 //! \brief Get the Debug interface for status report 97 //! \return CodechalDebugInterface * 98 //! pointer of m_statusReportDebugInterface 99 //! GetStatusReportDebugInterface()100 CodechalDebugInterface *GetStatusReportDebugInterface() const { return m_statusReportDebugInterface; } GetEncodeCp()101 EncodeCp * GetEncodeCp() { return m_encodecp; } 102 103 //! 104 //! \brief Update frame tracking flag 105 //! \return void 106 //! 107 void SetFrameTrackingForMultiTaskPhase(); 108 109 enum ComponentPacketIds 110 { 111 PACKET_COMPONENT_COMMON = 0, 112 PACKET_COMPONENT_ENCODE, 113 PACKET_COMPONENT_DECODE, 114 PACKET_COMPONENT_VP, 115 }; 116 117 enum SubComponentPacketIds 118 { 119 PACKET_SUBCOMPONENT_COMMON = 0, 120 PACKET_SUBCOMPONENT_HEVC, 121 PACKET_SUBCOMPONENT_VP9, 122 PACKET_SUBCOMPONENT_AVC, 123 PACKET_SUBCOMPONENT_AV1, 124 PACKET_SUBCOMPONENT_JPEG 125 }; 126 127 enum CommonPacketIds 128 { 129 basicPacket = CONSTRUCTPACKETID(PACKET_COMPONENT_ENCODE, PACKET_SUBCOMPONENT_COMMON, 0), 130 encodePreEncPacket, 131 #if _MEDIA_RESERVED 132 #define ENCODE_PACKET_IDS_EXT 133 #include "encode_pipeline_ext.h" 134 #undef ENCODE_PACKET_IDS_EXT 135 #endif 136 }; 137 138 protected: 139 //! 140 //! \brief Initialize the encode pipeline 141 //! \param [in] settings 142 //! Pointer to the initialize settings 143 //! \return MOS_STATUS 144 //! MOS_STATUS_SUCCESS if success, else fail reason 145 //! 146 virtual MOS_STATUS Initialize(void *settings); 147 148 //! 149 //! \brief Uninitialize the encode pipeline 150 //! \return MOS_STATUS 151 //! MOS_STATUS_SUCCESS if success, else fail reason 152 //! 153 virtual MOS_STATUS Uninitialize(); 154 155 //! 156 //! \brief User Feature Key Report 157 //! \return MOS_STATUS 158 //! MOS_STATUS_SUCCESS if success, else fail reason 159 //! 160 virtual MOS_STATUS UserFeatureReport() override; 161 162 //! 163 //! \brief Create buffer tracker, the derived class can overload it if 164 //! requires different buffer count 165 //! \return MOS_STATUS 166 //! MOS_STATUS_SUCCESS if success, else fail reason 167 //! 168 virtual MOS_STATUS CreateBufferTracker() = 0; 169 170 //! 171 //! \brief Create status report 172 //! \return MOS_STATUS 173 //! MOS_STATUS_SUCCESS if success, else fail reason 174 //! 175 virtual MOS_STATUS CreateStatusReport() = 0; 176 177 virtual MOS_STATUS GetSystemVdboxNumber(); 178 179 MOS_STATUS WaitForBatchBufferComplete(); 180 181 //! 182 //! \brief Finish the active packets execution 183 //! \return MOS_STATUS 184 //! MOS_STATUS_SUCCESS if success, else fail reason 185 //! 186 MOS_STATUS ExecuteActivePackets() override; 187 188 //! \brief Calculate Command Size for all packets in active packets list 189 //! 190 //! \param [in, out] commandBufferSize 191 //! cmd buffer size to calculate 192 //! \param [in, out] requestedPatchListSize 193 //! patch list size to calculate 194 //! \return uint32_t 195 //! Command size calculated 196 //! 197 MOS_STATUS CalculateCmdBufferSizeFromActivePackets( 198 uint32_t &commandBufferSize, 199 uint32_t &requestedPatchListSize); 200 201 //! 202 //! \brief Declare Regkeys in the scope of encode 203 //! \return MOS_STATUS 204 //! MOS_STATUS_SUCCESS if success, else fail reason 205 virtual MOS_STATUS InitUserSetting(MediaUserSettingSharedPtr userSettingPtr) override; 206 207 public: 208 //! 209 //! \brief Help function to get current pipe 210 //! 211 //! \return Current pipe value 212 //! GetCurrentPipe()213 virtual uint8_t GetCurrentPipe() 214 { 215 return m_scalability->GetCurrentPipe(); 216 } 217 218 //! 219 //! \brief Help function to get current PAK pass 220 //! 221 //! \return Current PAK pass 222 //! GetCurrentPass()223 virtual uint16_t GetCurrentPass() 224 { 225 return m_scalability->GetCurrentPass(); 226 } 227 228 //! 229 //! \brief Create encode parameter 230 //! \param [in] params 231 //! Pointer to EncoderParams 232 //! \return MOS_STATUS 233 //! MOS_STATUS_SUCCESS if success, else fail reason 234 //! 235 //virtual MOS_STATUS CreateEncodeBasicFeature() { return MOS_STATUS_SUCCESS; } 236 237 //! 238 //! \brief Help function to check if current pipe is first pipe 239 //! 240 //! \return True if current pipe is first pipe, otherwise return false 241 //! IsFirstPipe()242 virtual bool IsFirstPipe() 243 { 244 return GetCurrentPipe() == 0 ? true : false; 245 } 246 247 //! 248 //! \brief Help function to check if current pipe is last pipe 249 //! 250 //! \return True if current pipe is last pipe, otherwise return false 251 //! IsLastPipe()252 virtual bool IsLastPipe() 253 { 254 return GetCurrentPipe() == GetPipeNum() - 1 ? true : false; 255 } 256 257 //! 258 //! \brief Help function to check if current PAK pass is first pass 259 //! 260 //! \return True if current PAK pass is first pass, otherwise return false 261 //! IsFirstPass()262 virtual bool IsFirstPass() 263 { 264 return GetCurrentPass() == 0 ? true : false; 265 } 266 267 //! 268 //! \brief Help function to check if current PAK pass is last pass 269 //! 270 //! \return True if current PAK pass is last pass, otherwise return false 271 //! IsLastPass()272 virtual bool IsLastPass() 273 { 274 return GetCurrentPass() == GetPassNum() - 1 ? true : false; 275 } 276 277 //! 278 //! \brief Help function to get pipe number 279 //! 280 //! \return Pipe number 281 //! GetPipeNum()282 virtual uint8_t GetPipeNum() 283 { 284 return m_scalability->GetPipeNumber(); 285 } 286 287 //! 288 //! \brief Help function to get ddi target usage 289 //! 290 //! \return DDI Target Usage 291 //! GetDDITU()292 virtual uint8_t GetDDITU() 293 { 294 return m_featureManager->GetDDITargetUsage(); 295 } 296 297 //! 298 //! \brief Help function to get pass number 299 //! 300 //! \return Pass number 301 //! GetPassNum()302 virtual uint16_t GetPassNum() 303 { 304 return m_scalability->GetPassNumber(); 305 } 306 GetCurrentRow()307 virtual uint8_t GetCurrentRow() 308 { 309 return m_scalability->GetCurrentRow(); 310 } 311 GetCurrentSubPass()312 virtual uint8_t GetCurrentSubPass() 313 { 314 return m_scalability->GetCurrentSubPass(); 315 } 316 GetMmcState()317 EncodeMemComp *GetMmcState() { return m_mmcState; } 318 319 MOS_STATUS ExecuteResolveMetaData(PMOS_RESOURCE pInput, PMOS_RESOURCE pOutput); 320 321 MOS_STATUS ReportErrorFlag(PMOS_RESOURCE pMetadataBuffer, 322 uint32_t size, uint32_t offset, uint32_t flag); 323 324 #define CODECHAL_ENCODE_RECYCLED_BUFFER_NUM 6 325 #define VDENC_BRC_NUM_OF_PASSES 2 326 327 uint8_t m_currRecycledBufIdx = 0; //!< Current recycled buffer index 328 protected: 329 uint32_t m_standard = 0; //!< The encode state's standard 330 uint32_t m_mode = 0; //!< The encode mode 331 CODECHAL_FUNCTION m_codecFunction = CODECHAL_FUNCTION_INVALID; //!< The encode state's codec function used 332 333 CodechalHwInterfaceNext *m_hwInterface = nullptr; //!< CodechalHwInterface 334 MOS_INTERFACE * m_osInterface = nullptr; 335 EncodeAllocator * m_allocator = nullptr; 336 TrackedBuffer * m_trackedBuf = nullptr; 337 RecycleResource * m_recycleBuf = nullptr; 338 EncodeMemComp * m_mmcState = nullptr; 339 EncodeCp * m_encodecp = nullptr; 340 PacketUtilities * m_packetUtilities = nullptr; 341 342 CodechalDebugInterface *m_statusReportDebugInterface = nullptr; //!< Interface used for debug dumps in status report callback function 343 344 uint8_t m_numVdbox = 0; 345 346 bool m_singleTaskPhaseSupported = true; 347 bool m_singleTaskPhaseSupportedInPak = false; 348 349 uint32_t m_recycledBufStatusNum[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM] = {0}; //!< Recycled buffer status num list 350 351 std::shared_ptr<EncodeScalabilityPars> m_scalPars = nullptr; 352 353 MEDIA_CLASS_DEFINE_END(encode__EncodePipeline) 354 }; 355 356 } // namespace encode 357 358 #endif // !__ENCODE_PIPELINE_H__ 359