1 /*
2 * Copyright (c) 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     decode_mpeg2_picture_packet_xe_m_base.h
24 //! \brief    Defines the implementation of mpeg2 decode picture packet for Xe_M_base
25 //!
26 
27 #ifndef __DECODE_MPEG2_PICTURE_PACKET_XE_M_BASE_H__
28 #define __DECODE_MPEG2_PICTURE_PACKET_XE_M_BASE_H__
29 
30 #include "media_cmd_packet.h"
31 #include "decode_mpeg2_pipeline.h"
32 #include "decode_utils.h"
33 #include "decode_mpeg2_basic_feature.h"
34 #include "mhw_vdbox_g12_X.h"
35 #include "codechal_hw_g12_X.h"
36 
37 namespace decode {
38 
39     class Mpeg2DecodePicPktXe_M_Base : public DecodeSubPacket
40     {
41     public:
42         //!
43         //! \brief  Mpeg2DecodePicPktXe_M_Base constructor
44         //!
Mpeg2DecodePicPktXe_M_Base(Mpeg2Pipeline * pipeline,CodechalHwInterface * hwInterface)45         Mpeg2DecodePicPktXe_M_Base(Mpeg2Pipeline *pipeline, CodechalHwInterface *hwInterface)
46             : DecodeSubPacket(pipeline, *hwInterface), m_mpeg2Pipeline(pipeline)
47         {
48             m_hwInterface = hwInterface;
49             if (m_hwInterface != nullptr)
50             {
51                 m_miInterface  = m_hwInterface->GetMiInterface();
52                 m_osInterface  = m_hwInterface->GetOsInterface();
53                 m_mfxInterface = static_cast<CodechalHwInterfaceG12*>(hwInterface)->GetMfxInterface();
54             }
55         }
56 
57         //!
58         //! \brief  Mpeg2DecodePicPktXe_M_Base deconstructor
59         //!
60         virtual ~Mpeg2DecodePicPktXe_M_Base();
61 
62         //!
63         //! \brief  Initialize the media packet, allocate required resources
64         //! \return MOS_STATUS
65         //!         MOS_STATUS_SUCCESS if success, else fail reason
66         //!
67         virtual MOS_STATUS Init() override;
68 
69         //!
70         //! \brief  Prepare interal parameters, should be invoked for each frame
71         //! \return MOS_STATUS
72         //!         MOS_STATUS_SUCCESS if success, else fail reason
73         //!
74         virtual MOS_STATUS Prepare() override;
75 
76         //!
77         //! \brief  Execute av1 picture packet
78         //! \return MOS_STATUS
79         //!         MOS_STATUS_SUCCESS if success, else fail reason
80         //!
81         virtual MOS_STATUS Execute(MOS_COMMAND_BUFFER& cmdBuffer) = 0;
82 
83         //!
84         //! \brief  Calculate Command Size
85         //!
86         //! \param  [in, out] commandBufferSize
87         //!         requested size
88         //! \param  [in, out] requestedPatchListSize
89         //!         requested size
90         //! \return MOS_STATUS
91         //!         status
92         //!
93         MOS_STATUS CalculateCommandSize(
94             uint32_t& commandBufferSize,
95             uint32_t& requestedPatchListSize) override;
96 
97     protected:
98 
99         virtual MOS_STATUS AllocateFixedResources();
100 
101         virtual MOS_STATUS SetMfxSurfaceParams(MHW_VDBOX_SURFACE_PARAMS& dstSurfaceParams);
102         virtual MOS_STATUS SetMfxPipeBufAddrParams(MHW_VDBOX_PIPE_BUF_ADDR_PARAMS& pipeBufAddrParams);
103         virtual void       SetMfxPipeModeSelectParams(MHW_VDBOX_PIPE_MODE_SELECT_PARAMS_G12& vdboxPipeModeSelectParams);
104         virtual void       SetMfxIndObjBaseAddrParams(MHW_VDBOX_IND_OBJ_BASE_ADDR_PARAMS& indObjBaseAddrParams);
105         virtual void       SetMfxBspBufBaseAddrParams(MHW_VDBOX_BSP_BUF_BASE_ADDR_PARAMS& bspBufBaseAddrParams);
106         virtual void       SetMfxMpeg2PicStateParams(MHW_VDBOX_MPEG2_PIC_STATE& mpeg2PicState);
107         virtual void       SetMfxQmParams(MHW_VDBOX_QM_PARAMS& qmParams);
108 
109         MOS_STATUS         FixMfxPipeBufAddrParams(MHW_VDBOX_PIPE_BUF_ADDR_PARAMS& pipeBufAddrParams);
110 
111         virtual MOS_STATUS AddMfxSurfacesCmd(MOS_COMMAND_BUFFER& cmdBuffer);
112         virtual MOS_STATUS AddMfxIndObjBaseAddrCmd(MOS_COMMAND_BUFFER& cmdBuffer);
113         virtual MOS_STATUS AddMfxBspBufBaseAddrCmd(MOS_COMMAND_BUFFER& cmdBuffer);
114         virtual MOS_STATUS AddMfxMpeg2PicCmd(MOS_COMMAND_BUFFER& cmdBuffer);
115         virtual MOS_STATUS AddMfxQmCmd(MOS_COMMAND_BUFFER& cmdBuffer);
116 
117         virtual MOS_STATUS AddMfxPipeBufAddrCmd(MOS_COMMAND_BUFFER& cmdBuffer) = 0;
118         virtual MOS_STATUS AddMfxPipeModeSelectCmd(MOS_COMMAND_BUFFER& cmdBuffer) = 0;
119 
120         //!
121         //! \brief  Free resources
122         //! \return MOS_STATUS
123         //!         MOS_STATUS_SUCCESS if success, else fail reason
124         //!
125         MOS_STATUS FreeResources();
126 
127         //!
128         //! \brief  Dump resources
129         //! \return MOS_STATUS
130         //!         MOS_STATUS_SUCCESS if success, else fail reason
131         //!
132         MOS_STATUS DumpResources(MHW_VDBOX_PIPE_BUF_ADDR_PARAMS& pipeBufAddrParams);
133 
134         //Interfaces
135         Mpeg2Pipeline* m_mpeg2Pipeline = nullptr;
136         MhwVdboxMfxInterface* m_mfxInterface = nullptr;
137         Mpeg2BasicFeature* m_mpeg2BasicFeature = nullptr;
138         DecodeAllocator* m_allocator = nullptr;
139         DecodeMemComp* m_mmcState = nullptr;
140 
141         CodecDecodeMpeg2PicParams* m_mpeg2PicParams = nullptr; //!< Pointer to picture parameter
142 
143         PMOS_BUFFER                 m_resMfdDeblockingFilterRowStoreScratchBuffer = nullptr; //!< Handle of MFD Deblocking Filter Row Store Scratch data surface
144         PMOS_BUFFER                 m_resBsdMpcRowStoreScratchBuffer = nullptr;              //!< Handle of MPR Row Store Scratch data surface
145 
146         uint32_t m_pictureStatesSize = 0;    //!< Picture states size
147         uint32_t m_picturePatchListSize = 0;    //!< Picture patch list size
148 
149         CodechalHwInterface *m_hwInterface = nullptr;
150         MhwMiInterface      *m_miInterface = nullptr;
151 
152     private:
153         //!
154         //! \enum  DecodeRefAddrIndex
155         //! \brief Reference address indexes
156         //!
157         enum DecodeRefAddrIndex
158         {
159             // MPEG2 reference address indexes
160             CodechalDecodeFwdRefTop = 0,    //!< forward reference top field
161             CodechalDecodeBwdRefTop = 1,    //!< backward reference top field
162             CodechalDecodeFwdRefBottom = 2,    //!< forward reference bottom field
163             CodechalDecodeBwdRefBottom = 3,    //!< backward reference bottom field
164         };
165         //!
166         //! \enum     Mpeg2Vc1PictureStructure
167         //! \brief    MPEG2 VC1 picture structure
168         //!
169         enum Mpeg2Vc1PictureStructure
170         {
171             mpeg2Vc1TopField = 1,
172             mpeg2Vc1BottomField,
173             mpeg2Vc1Frame
174         };
175     MEDIA_CLASS_DEFINE_END(decode__Mpeg2DecodePicPktXe_M_Base)
176     };
177 
178 }  // namespace decode
179 #endif
180