1 /*
2 * Copyright (c) 2011-2017, 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     codechal_decode_avc.h
24 //! \brief    Defines the decode interface extension for AVC.
25 //! \details  Defines all types, macros, and functions required by CodecHal for AVC decoding.
26 //!           Definitions are not externally facing.
27 //!
28 
29 #ifndef __CODECHAL_DECODER_AVC_H__
30 #define __CODECHAL_DECODER_AVC_H__
31 
32 #include "codechal.h"
33 #include "codechal_decoder.h"
34 #include "codechal_decode_sfc_avc.h"
35 
36 //!
37 //! \def CODECHAL_DECODE_AVC_MONOPIC_CHROMA_DEFAULT
38 //! default chroma value for mono picture
39 //!
40 #define CODECHAL_DECODE_AVC_MONOPIC_CHROMA_DEFAULT        0x80
41 
42 //!
43 //! \def CODECHAL_DECODE_AVC_INVALID_FRAME_IDX
44 //! invalid value for invalid frame index
45 //!
46 #define CODECHAL_DECODE_AVC_INVALID_FRAME_IDX             0xFF
47 
48 //!
49 //! \def CODECHAL_DECODE_AVC_INVALID_REFPIC_VALUE
50 //! invalid value for invalid ref frame index
51 //!
52 #define CODECHAL_DECODE_AVC_INVALID_REFPIC_VALUE          0x80
53 
54 //!
55 //! \def CODECHAL_DECODE_AVC_MAX_NUM_MVC_VIEWS
56 //! max mvc views
57 //!
58 #define CODECHAL_DECODE_AVC_MAX_NUM_MVC_VIEWS              16
59 
60 typedef class CodechalDecodeAvc *PCODECHAL_DECODE_AVC_STATE;
61 
62 //!
63 //! \class CodechalDecodeAvc
64 //! \brief This class defines the member fields, functions etc used by AVC decoder.
65 //!
66 class CodechalDecodeAvc : public CodechalDecode
67 {
68 public:
69 
70     //!
71     //! \brief    Define params for AVC picture decoding
72     //!
73     struct PIC_MHW_PARAMS
74     {
75         MHW_VDBOX_PIPE_MODE_SELECT_PARAMS  PipeModeSelectParams;
76         MHW_VDBOX_SURFACE_PARAMS           SurfaceParams;
77         MHW_VDBOX_PIPE_BUF_ADDR_PARAMS     PipeBufAddrParams;
78         MHW_VDBOX_IND_OBJ_BASE_ADDR_PARAMS IndObjBaseAddrParams;
79         MHW_VDBOX_BSP_BUF_BASE_ADDR_PARAMS BspBufBaseAddrParams;
80         MHW_VDBOX_QM_PARAMS                QmParams;
81         MHW_VDBOX_PIC_ID_PARAMS            PicIdParams;
82         MHW_VDBOX_AVC_IMG_PARAMS           ImgParams;
83         MHW_VDBOX_AVC_DIRECTMODE_PARAMS    AvcDirectmodeParams;
84     };
85 
86     //!
87     //! \brief    Constructor
88     //! \param    [in] hwInterface
89     //!           Hardware interface
90     //! \param    [in] debugInterface
91     //!           Debug interface
92     //! \param    [in] standardInfo
93     //!           The information of decode standard for this instance
94     //!
95     CodechalDecodeAvc(
96         CodechalHwInterface *hwInterface,
97         CodechalDebugInterface* debugInterface,
98         PCODECHAL_STANDARD_INFO standardInfo);
99 
100     //!
101     //! \brief    Copy constructor
102     //!
103     CodechalDecodeAvc(const CodechalDecodeAvc&) = delete;
104 
105     //!
106     //! \brief    Copy assignment operator
107     //!
108     CodechalDecodeAvc& operator=(const CodechalDecodeAvc&) = delete;
109 
110     //!
111     //! \brief    Destructor
112     //!
113     ~CodechalDecodeAvc();
114 
115     //!
116     //! \brief    Allocate and initialize AVC decoder standard
117     //! \param    [in] settings
118     //!           Pointer to CodechalSetting
119     //! \return   MOS_STATUS
120     //!           MOS_STATUS_SUCCESS if success, else fail reason
121     //!
122     MOS_STATUS  AllocateStandard(
123         CodechalSetting *          settings) override;
124 
125     //!
126     //! \brief  Set states for each frame to prepare for AVC decode
127     //! \return MOS_STATUS
128     //!         MOS_STATUS_SUCCESS if success, else fail reason
129     //!
130     MOS_STATUS  SetFrameStates() override;
131 
132     //!
133     //! \brief    AVC decoder state level function
134     //! \details  State level function for AVC decoder
135     //!
136     //! \return   MOS_STATUS
137     //!           MOS_STATUS_SUCCESS if success, else fail reason
138     //!
139     MOS_STATUS  DecodeStateLevel() override;
140 
141     //!
142     //! \brief    AVC decoder primitive level function
143     //! \details  Primitive level function for GEN specific AVC decoder
144     //!
145     //! \return   MOS_STATUS
146     //!           MOS_STATUS_SUCCESS if success, else fail reason
147     //!
148     MOS_STATUS  DecodePrimitiveLevel() override;
149 
150     //!
151     //! \brief    AVC decoder downsampling calc function
152     //! \details  calc downsample param for GEN specific AVC decoder
153     //!
154     //! \return   MOS_STATUS
155     //!           MOS_STATUS_SUCCESS if success, else fail reason
156     //!
157     MOS_STATUS  CalcDownsamplingParams(
158         void                        *picParams,
159         uint32_t                    *refSurfWidth,
160         uint32_t                    *refSurfHeight,
161         MOS_FORMAT                  *format,
162         uint8_t                     *frameIdx) override;
163 
164     //!
165     //! \brief    Allocate fixed sized resources
166     //! \details  Allocate fixed sized resources AVC decode driver
167     //! \return   MOS_STATUS
168     //!           MOS_STATUS_SUCCESS if success, else fail reason
169     //!
170     MOS_STATUS          AllocateResourcesFixedSizes();
171 
172     //!
173     //! \brief    Allocate variable sized resources
174     //! \details  Allocate variable sized resources in AVC decode driver
175     //! \return   MOS_STATUS
176     //!           MOS_STATUS_SUCCESS if success, else fail reason
177     //!
178     MOS_STATUS          AllocateResourcesVariableSizes();
179 
180     //!
181     //! \brief    Allocate invalid ref buffer
182     //! \details  Allocate invalid ref buffer in AVC decode driver
183     //! \return   MOS_STATUS
184     //!           MOS_STATUS_SUCCESS if success, else fail reason
185     //!
186     MOS_STATUS          AllocateInvalidRefBuffer();
187 
188     //!
189     //! \brief    Set Picture Struct
190     //! \details  Set Picture Struct in AVC decode driver
191     //! \return   MOS_STATUS
192     //!           MOS_STATUS_SUCCESS if success, else fail reason
193     //!
194     MOS_STATUS          SetPictureStructs();
195 
196     //!
197     //! \brief    Set and Alloc Dmv Buffer
198     //! \details  Set and Alloc Dmv Buffer in AVC decode driver
199     //!
200     //! \param    [in] avcMVBufList
201     //!           Pointer to MV Buf List
202     //! \param    [in] usedForRef
203     //!           indicate it is used for ref
204     //! \param    [in] frameIdx
205     //!           frame idx
206     //! \param    [in] avcDmvBufferSize
207     //!           Dmv Bufer Size
208     //! \param    [out] dmvIdx
209     //!           Dmv Index
210     //! \param    [out] avcDmvBuffers
211     //!           Dmv Buffers
212     //!
213     //! \return   MOS_STATUS
214     //!           MOS_STATUS_SUCCESS if success, else fail reason
215     //!
216     MOS_STATUS          SetAndAllocateDmvBufferIndex(
217         PCODEC_AVC_DMV_LIST         avcMVBufList,
218         bool                        usedForRef,
219         uint8_t                     frameIdx,
220         uint32_t                    avcDmvBufferSize,
221         uint8_t                     *dmvIdx,
222         MOS_RESOURCE                *avcDmvBuffers);
223 
224     //!
225     //! \brief    Init Mvc Dummy Dmv Buffer
226     //! \details  Init Mvc Dummy Dmv Buffer in AVC decode driver
227     //!
228     //! \param    [in] mvcWaDummyDmvBuf
229     //!           Pointer to Mvc Wa Dummy Dmv Buf
230     //! \param    [in] size
231     //!           Dmv Bufer Size
232     //! \param    [out] mvcDummyDmvBuffer
233     //!           Pointer to Mvc Dummy Dmv Buffer Resource
234     //!
235     //! \return   MOS_STATUS
236     //!           MOS_STATUS_SUCCESS if success, else fail reason
237     //!
238     MOS_STATUS          InitMvcDummyDmvBuffer(
239         uint32_t                    *mvcWaDummyDmvBuf,
240         uint32_t                    size,
241         PMOS_RESOURCE               mvcDummyDmvBuffer);
242 
243     //!
244     //! \brief    Initialize AVC picture HW parameters
245     //! \details  Initialize picture parameters for GEN specific AVC decoder
246     //!
247     //! \param    [in] picMhwParams
248     //!           Pointer to PIC_MHW_PARAMS
249     //!
250     //! \return   MOS_STATUS
251     //!           MOS_STATUS_SUCCESS if success, else fail reason
252     //!
253     virtual MOS_STATUS          InitPicMhwParams(
254         PIC_MHW_PARAMS              *picMhwParams);
255 
256     //!
257     //! \brief    Add picture commands
258     //! \details  Add picture commands for GEN specific AVC decoder
259     //!
260     //! \param    [in] cmdBuf
261     //!           Pointer to PMOS_COMMAND_BUFFER
262     //! \param    [in] picMhwParams
263     //!           Pointer to PIC_MHW_PARAMS
264     //!
265     //! \return   MOS_STATUS
266     //!           MOS_STATUS_SUCCESS if success, else fail reason
267     //!
268     virtual MOS_STATUS  AddPictureCmds(
269         PMOS_COMMAND_BUFFER         cmdBuf,
270         PIC_MHW_PARAMS              *picMhwParams);
271 
272     //!
273     //! \brief    Parse AVC slice parameters
274     //! \details  Parse slice parameters for GEN specific AVC decoder
275     //!
276     //! \param    [in] cmdBuf
277     //!           Pointer to PMOS_COMMAND_BUFFER
278     //!
279     //! \return   MOS_STATUS
280     //!           MOS_STATUS_SUCCESS if success, else fail reason
281     //!
282     MOS_STATUS          ParseSlice(
283         PMOS_COMMAND_BUFFER         cmdBuf);
284 
285     //!
286     //! \brief    Send Slice Command
287     //! \details  Send Slice Command in AVC decode driver
288     //!
289     //! \param    [in] avcSliceState
290     //!           Pointer to AVC Slice State
291     //! \param    [out] cmdBuffer
292     //!           Pointer to Command buffer
293     //!
294     //! \return   MOS_STATUS
295     //!           MOS_STATUS_SUCCESS if success, else fail reason
296     //!
297     MOS_STATUS          SendSlice(
298         PMHW_VDBOX_AVC_SLICE_STATE      avcSliceState,
299         PMOS_COMMAND_BUFFER             cmdBuffer);
300 
301     //!
302     //! \brief    Constrcut Mono Picture
303     //! \details  Constrcut Mono Picture in AVC decode driver, Write 0x80 in the chroma plane for Monochrome clips
304     //! \param    [in] surface
305     //!           Pointer to the decode output surface
306     //! \return   MOS_STATUS
307     //!           MOS_STATUS_SUCCESS if success, else fail reason
308     //!
309     virtual MOS_STATUS FormatAvcMonoPicture(PMOS_SURFACE surface);
310 
311     //!
312     //! \brief    Set frame store Id for avc codec.
313     //! \details
314     //! \param    [in] frameIdx
315     //!           frame index
316     //! \return   MOS_STATUS
317     //!           MOS_STATUS_SUCCESS if success, else fail reason
318     //!
319     MOS_STATUS SetFrameStoreIds(uint8_t frameIdx);
320 
321     MOS_STATUS InitMmcState() override;
322 
323     //!
324     //! \brief  Initialize Sfc state for AVC decode
325     //!
326     //! \return MOS_STATUS
327     //!         MOS_STATUS_SUCCESS if success, else fail reason
328     //!
329     virtual MOS_STATUS InitSfcState();
330 
331 #if USE_CODECHAL_DEBUG_TOOL
332     MOS_STATUS DumpMvcExtPicParams(
333         PCODEC_MVC_EXT_PIC_PARAMS mvcExtPicParams);
334 
335     MOS_STATUS DumpPicParams(
336         PCODEC_AVC_PIC_PARAMS picParams);
337 
338     MOS_STATUS DumpSliceParams(
339         PCODEC_AVC_SLICE_PARAMS sliceParams,
340         uint32_t                numSlices);
341 
342     MOS_STATUS DumpIQParams(
343         PCODEC_AVC_IQ_MATRIX_PARAMS matrixData);
344 #endif
345 
346 protected:
347     //!
348     //! \brief  Indicates whether or not the SFC is inuse
349     //! \return If SFC is inuse
350     //!
IsSfcInUse(CodechalSetting * codecHalSettings)351     bool IsSfcInUse(CodechalSetting * codecHalSettings) override
352     {
353         return (codecHalSettings->downsamplingHinted && (MEDIA_IS_SKU(m_skuTable, FtrSFCPipe) && !MEDIA_IS_SKU(m_skuTable, FtrDisableVDBox2SFC)));
354     }
355 
356 public:
357                                                                                         // Parameters passed by application
358     uint16_t m_picWidthInMb;                                              //!< Picture Width in MB
359     uint16_t m_picHeightInMb;                                             //!< Picture Height in MB
360     uint16_t m_picWidthInMbLastMaxAlloced;                                //!< Max Picture Width in MB  used for buffer allocation in past frames
361     uint16_t m_picHeightInMbLastMaxAlloced;                               //!< Max Picture Height in MB used for buffer allocation in past frames
362     uint32_t m_dataSize;                                                  //!< Data size
363     uint32_t m_dataOffset;                                                //!< Date offset
364     uint32_t m_numSlices;                                                 //!< Num of slices
365     uint32_t m_avcDmvBufferSize;                                          //!< DMV Buffer Size
366     uint8_t  m_avcMvBufferIndex;                                          //!< MV Buffer Index
367     uint16_t m_bsdMpcRowStoreScratchBufferPicWidthInMb;                   //!< Bsd Mpc RowStore Scratch Buffer Pic Width in MB
368     uint16_t m_mfdIntraRowStoreScratchBufferPicWidthInMb;                 //!< Mfd Intra RowStore Scratch Buffer Pic Width in MB
369     uint16_t m_mprRowStoreScratchBufferPicWidthInMb;                      //!< Mpr RowStore Scratch Buffer Pic Width in MB
370     uint8_t  m_firstFieldIdxList[CODECHAL_DECODE_AVC_MAX_NUM_MVC_VIEWS];  //!< First Field Index List
371     uint32_t m_refSurfaceNum;                                             //!< Number of reference frame surface
372 
373     bool                            m_isSecondField;                                    //!< Indicate it is second field
374     bool                            m_intelEntrypointInUse;                             //!< Indicate it is Intel-specific Format
375     bool                            m_shortFormatInUse;                                 //!< Indicate it is Short Format
376     bool                            m_picIdRemappingInUse;                              //!< Indicate PicId Remapping are in use
377     bool                            m_deblockingEnabled;                                //!< Indicate Deblocking is enabled
378     bool                            m_fullFrameData;                                    //!< Indicate it is a full frame
379 
380 #ifdef _DECODE_PROCESSING_SUPPORTED
381     CodechalAvcSfcState *m_sfcState = nullptr;  //!< Avc Sfc State
382 #endif
383 
384     CODEC_PICTURE            m_currPic;                                       //!< Current Picture Struct
385     CODEC_AVC_FRAME_STORE_ID m_avcFrameStoreId[CODEC_AVC_MAX_NUM_REF_FRAME];  //!< Avc Frame Store ID
386     CODEC_AVC_DMV_LIST       m_avcDmvList[CODEC_AVC_NUM_DMV_BUFFERS];         //!< Avc Dmv List
387     CODEC_PIC_ID             m_avcPicIdx[CODEC_AVC_MAX_NUM_REF_FRAME];        //!< Avc Pic Index
388 
389     PCODEC_REF_LIST             m_avcRefList[CODEC_AVC_NUM_UNCOMPRESSED_SURFACE];  //!< Pointer to AVC Ref List
390     PCODEC_AVC_PIC_PARAMS       m_avcPicParams;                                    //!< Pointer to AVC picture parameter
391     PCODEC_MVC_EXT_PIC_PARAMS   m_mvcExtPicParams;                                 //!< Pointer to MVC ext picture parameter
392     PCODEC_AVC_SLICE_PARAMS     m_avcSliceParams;                                  //!< Pointer to AVC slice parameter
393     PCODEC_AVC_IQ_MATRIX_PARAMS m_avcIqMatrixParams;                               //!< Pointer to AVC IQ matrix parameter
394     PCODECHAL_VLD_SLICE_RECORD  m_vldSliceRecord;
395 
396     MOS_RESOURCE  m_resDataBuffer;                                //!< Handle of Data Buffer
397     MOS_RESOURCE  m_resMonoPictureChromaBuffer;                   //!< Handle of MonoPicture's default Chroma data surface
398     MOS_RESOURCE  m_resMfdIntraRowStoreScratchBuffer;             //!< Handle of MFD Intra Row Store Scratch data surface
399     MOS_RESOURCE  m_resMfdDeblockingFilterRowStoreScratchBuffer;  //!< Handle of MFD Deblocking Filter Row Store Scratch data surface
400     MOS_RESOURCE  m_resBsdMpcRowStoreScratchBuffer;               //!< Handle of BSD/MPC Row Store Scratch data surface
401     MOS_RESOURCE  m_resMprRowStoreScratchBuffer;                  //!< Handle of MPR Row Store Scratch data surface
402     MOS_RESOURCE  m_resAvcDmvBuffers[CODEC_AVC_NUM_DMV_BUFFERS];  //!< Handle of Dmv Buffers
403     MOS_RESOURCE  m_resInvalidRefBuffer;                          //!< Handle of Invalid Ref Buffer
404     MOS_RESOURCE  m_resMvcDummyDmvBuffer[2];                      //!< Handle of Mvc Dummy Dmv Buffer
405     MOS_SURFACE   m_destSurface;                                  //!< Handle of Dest data surface
406     PMOS_SURFACE  m_refFrameSurface;                              //!< Handle of reference frame surface
407     PMOS_RESOURCE m_presReferences[CODEC_AVC_MAX_NUM_REF_FRAME];  //!< Pointer to Handle of Reference Frames
408     MOS_RESOURCE  m_resSyncObjectWaContextInUse;                  //!< signals on the video WA context
409     MOS_RESOURCE  m_resSyncObjectVideoContextInUse;               //!< signals on the video context
410 };
411 #endif  // __CODECHAL_DECODER_AVC_H__
412