1 /* 2 * Copyright (c) 2020-2021, 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 media_sfc_interface.h 24 //! \brief Common interface and structure used in sfc interface 25 //! \details Common interface and structure used in sfc interface which are platform independent 26 //! 27 #ifndef __MEDIA_SFC_INTERFACE_H__ 28 #define __MEDIA_SFC_INTERFACE_H__ 29 30 #include <stdint.h> 31 #include "mos_os_specific.h" 32 #include "media_defs.h" 33 #include "media_common_defs.h" 34 #include "mos_defs.h" 35 #include "mos_defs_specific.h" 36 #include "mos_os.h" 37 #include "mos_resource_defs.h" 38 39 class MediaSfcRender; 40 class MediaMemComp; 41 42 struct VEBOX_SFC_PARAMS 43 { 44 // Input 45 struct 46 { 47 PMOS_SURFACE surface; 48 MEDIA_CSPACE colorSpace; //!< Color Space 49 uint32_t chromaSiting; //!< ChromaSiting 50 RECT rcSrc; //!< rectangle on input surface before scaling. 51 MEDIA_ROTATION rotation; //!< rotation setting 52 } input; 53 54 // Output 55 struct 56 { 57 PMOS_SURFACE surface; 58 MEDIA_CSPACE colorSpace; //!< Color Space 59 uint32_t chromaSiting; //!< ChromaSiting 60 RECT rcDst; //!< rectangle on output surface after scaling. 61 } output; 62 }; 63 64 struct SCALABILITY_PARAMS 65 { 66 int32_t numPipe = 1; //!< Number of pipes for scalability 67 int32_t curPipe = 0; //!< Current pipe index 68 // Scalability parameters for HCP-to-SFC mode 69 uint32_t engineMode = 0; //!< 0 - single, 1 - left most column, 2 - right most column, 3 - middle column 70 uint32_t tileType = 0; //!< Real tile = 0, virtual tile = 1 71 uint32_t srcStartX = 0; //!< Source surface column horizontal start position in pixel 72 uint32_t srcEndX = 0; //!< Source surface column horizontal end position in pixel 73 uint32_t dstStartX = 0; //!< Output surface column horizontal start position in pixel 74 uint32_t dstEndX = 0; //!< Output surface column horizontal end position in pixel 75 }; 76 77 struct FIELD_PARAMS 78 { 79 bool isFieldToInterleaved = false; //!< true if input being field frame and output being interlaved frame. 80 bool isBottomField = false; //!< true if input frame being bottom field. Valid only when true == isFieldToInterleaved. 81 bool isBottomFirst = false; //!< true if output frame being interlaved frame with bottom first. 82 //!< Valid only when true == isFieldToInterleaved. 83 }; 84 85 struct VIDEO_PARAMS 86 { 87 CODECHAL_STANDARD codecStandard; 88 union 89 { 90 struct 91 { 92 CodecDecodeJpegChromaType jpegChromaType; 93 } jpeg; 94 struct 95 { 96 bool deblockingEnabled; 97 } avc, vp8; 98 struct 99 { 100 uint32_t lcuSize; 101 } hevc; 102 struct 103 { 104 uint32_t lcuSize; 105 bool lossless; 106 bool superResInuse; 107 bool intraBC; 108 uint32_t tileCols; 109 uint32_t tileRows; 110 } av1; 111 }; 112 113 FIELD_PARAMS fieldParams = {}; 114 115 // scalability parameters 116 SCALABILITY_PARAMS scalabilityParams = {}; 117 }; 118 119 struct VDBOX_SFC_PARAMS 120 { 121 // Input 122 struct 123 { 124 uint32_t width; //!< Effective width of SFC input, which may 125 //!< be smaller than frame width. 126 uint32_t height; //!< Effective height of SFC input, which may 127 //!< be smaller than frame height. 128 uint32_t effectiveWidth; //!< exclude right padding area on input surface, 129 //!< which may be smaller than Effective width. 130 uint32_t effectiveHeight; //!< exclude bottom padding area on input surface, 131 //!< which may be smaller than Effective height. 132 MOS_FORMAT format; //!< Format of SFC input 133 MEDIA_CSPACE colorSpace; //!< Color Space 134 uint32_t chromaSiting; //!< ChromaSiting 135 bool mirrorEnabled; //!< Is mirror needed. 136 } input; 137 138 // Output 139 struct 140 { 141 PMOS_SURFACE surface; 142 PMOS_BUFFER histogramBuf; //!< Histogram output buffer 143 MEDIA_CSPACE colorSpace; //!< Color Space 144 uint32_t chromaSiting; //!< ChromaSiting 145 RECT rcDst; //!< rectangle on output surface after scaling. 146 } output; 147 148 VIDEO_PARAMS videoParams = {}; //!< standard related params. 149 CODECHAL_SCALING_MODE scalingMode = CODECHAL_SCALING_BILINEAR; 150 }; 151 152 union MEDIA_SFC_INTERFACE_MODE 153 { 154 struct 155 { 156 uint32_t veboxSfcEnabled : 1; 157 uint32_t vdboxSfcEnabled : 1; 158 }; 159 uint32_t value = 3; 160 }; 161 162 class MediaSfcInterface 163 { 164 public: 165 //! 166 //! \brief MediaSfcInterface constructor 167 //! \details Initialize the MediaSfcInterface members. 168 //! \param osInterface 169 //! [in] Pointer to MOS_INTERFACE. 170 //! \param mmc 171 //! [in] Pointer to MediaMemComp. 172 //! 173 MediaSfcInterface(PMOS_INTERFACE osInterface, MediaMemComp *mmc = nullptr); 174 175 virtual ~MediaSfcInterface(); 176 177 virtual void Destroy(); 178 179 //! 180 //! \brief Check whether the Parameter for VDBOX-SFC supported 181 //! \details Only valid when MEDIA_SFC_INTERFACE_MODE::vdboxSfcEnabled being 1. 182 //! \param param 183 //! [in] Pointer to VDBOX_SFC_PARAMS. 184 //! \return MOS_STATUS 185 //! Return MOS_STATUS_SUCCESS if supported, otherwise failed 186 //! 187 MOS_STATUS IsParameterSupported(VDBOX_SFC_PARAMS ¶m); 188 189 //! 190 //! \brief Check whether the Parameter for VEBOX-SFC supported 191 //! \details Only valid when MEDIA_SFC_INTERFACE_MODE::veboxSfcEnabled being 1. 192 //! \param param 193 //! [in] Pointer to VEBOX_SFC_PARAMS. 194 //! \return MOS_STATUS 195 //! Return MOS_STATUS_SUCCESS if supported, otherwise failed 196 //! 197 MOS_STATUS IsParameterSupported(VEBOX_SFC_PARAMS ¶m); 198 199 //! 200 //! \brief Render Vdbox-SFC States 201 //! \details Only valid when MEDIA_SFC_INTERFACE_MODE::vdboxSfcEnabled being 1. 202 //! \param cmdBuffer 203 //! [in/out] Command Buffer to be Filled. 204 //! \param param 205 //! [in] Pointer to VDBOX_SFC_PARAMS. 206 //! \return MOS_STATUS 207 //! Return MOS_STATUS_SUCCESS if supported, otherwise failed 208 //! 209 MOS_STATUS Render(MOS_COMMAND_BUFFER *cmdBuffer, VDBOX_SFC_PARAMS ¶m); 210 211 //! 212 //! \brief Render Vebox-SFC States 213 //! \details Only valid when MEDIA_SFC_INTERFACE_MODE::veboxSfcEnabled being 1. 214 //! \param param 215 //! [in] Pointer to VEBOX_SFC_PARAMS. 216 //! \return MOS_STATUS 217 //! Return MOS_STATUS_SUCCESS if supported, otherwise failed 218 //! 219 MOS_STATUS Render(VEBOX_SFC_PARAMS ¶m); 220 221 //! 222 //! \brief MediaSfcInterface initialize 223 //! \details Initialize the MediaSfcInterface. 224 //! \param mode 225 //! [in] 1: VEBOX-SFC only, 2: VDBOX-SFC only, 3: Both VEBOX-SFC and VDBOX-SFC. 226 //! \return MOS_STATUS 227 //! Return MOS_STATUS_SUCCESS if successful, otherwise failed 228 //! 229 virtual MOS_STATUS Initialize(MEDIA_SFC_INTERFACE_MODE mode); 230 231 bool IsRenderInitialized(); 232 233 protected: 234 PMOS_INTERFACE m_osInterface = nullptr; 235 MediaSfcRender *m_sfcRender = nullptr; 236 MediaMemComp *m_mmc = nullptr; 237 MEDIA_CLASS_DEFINE_END(MediaSfcInterface) 238 }; 239 240 #endif // __MEDIA_SFC_INTERFACE_H__ 241