xref: /aosp_15_r20/external/intel-media-driver/media_driver/linux/common/codec/ddi/media_ddi_decode_jpeg.h (revision ba62d9d3abf0e404f2022b4cd7a85e107f48596f)
1 /*
2 * Copyright (c) 2009-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      media_ddi_decode_jpeg.h
24 //! \brief     libva(and its extension) decoder implementation
25 //!
26 
27 #ifndef __MEDIA_DDI_JPEG_DECODER_H__
28 #define __MEDIA_DDI_JPEG_DECODER_H__
29 
30 #include <va/va.h>
31 #include "media_ddi_decode_base.h"
32 
33 //forward declaration of DDI_MEDIA_BUFFER
34 struct _DDI_MEDIA_BUFFER;
35 
36 //!
37 //! \class DdiDecodeJPEG
38 //! \brief This class defines the member fields, functions etc used by JPEG decoder.
39 //!
40 class DdiDecodeJPEG : public DdiMediaDecode
41 {
42 public:
43     //!
44     //! \brief Constructor
45     //!
DdiDecodeJPEG(DDI_DECODE_CONFIG_ATTR * ddiDecodeAttr)46     DdiDecodeJPEG(DDI_DECODE_CONFIG_ATTR *ddiDecodeAttr) : DdiMediaDecode(ddiDecodeAttr){};
47 
48     //!
49     //! \brief Destructor
50     //!
~DdiDecodeJPEG()51     virtual ~DdiDecodeJPEG(){};
52 
53     // inherited virtual functions
54     virtual VAStatus BeginPicture(
55         VADriverContextP ctx,
56         VAContextID      context,
57         VASurfaceID      renderTarget) override;
58 
59     virtual void DestroyContext(
60         VADriverContextP ctx) override;
61 
62     virtual VAStatus RenderPicture(
63         VADriverContextP ctx,
64         VAContextID      context,
65         VABufferID       *buffers,
66         int32_t          numBuffers) override;
67 
68     virtual VAStatus InitDecodeParams(
69         VADriverContextP ctx,
70         VAContextID      context) override;
71 
72     virtual VAStatus SetDecodeParams() override;
73 
74     virtual void ContextInit(
75         int32_t picWidth,
76         int32_t picHeight) override;
77 
78     virtual VAStatus CodecHalInit(
79         DDI_MEDIA_CONTEXT *mediaCtx,
80         void              *ptr) override;
81 
82     virtual VAStatus AllocSliceControlBuffer(
83         DDI_MEDIA_BUFFER       *buf) override;
84 
85     virtual VAStatus AllocBsBuffer(
86         DDI_CODEC_COM_BUFFER_MGR    *bufMgr,
87         DDI_MEDIA_BUFFER            *buf) override;
88 
89     virtual uint8_t* GetPicParamBuf(
90         DDI_CODEC_COM_BUFFER_MGR     *bufMgr) override;
91 
92 private:
93     //!
94     //! \brief   ParaSliceParam for Jpeg
95     //! \details parse the sliceParam info required by JPEG decoding for
96     //!          each slice
97     //!
98     //! \param   [in] *mediaCtx
99     //!          DDI_MEDIA_CONTEXT
100     //! \param   [in] *slcParam
101     //!          VASliceParameterBufferJPEGBaseline
102     //! \param   [in] numSlices
103     //!             uint32_t
104     //!
105     //! \return  VA_STATUS_SUCCESS is returned if it is parsed successfully.
106     //!          else fail reason
107     VAStatus ParseSliceParams(
108         DDI_MEDIA_CONTEXT                   *mediaCtx,
109         VASliceParameterBufferJPEGBaseline  *slcParam,
110         uint32_t                             numSlices);
111 
112     //!
113     //! \brief   ParaQMatrixParam for JPEG
114     //! \details parse the IQMatrix info required by JPEG decoding
115     //!
116     //! \param   [in] *mediaCtx
117     //!          DDI_MEDIA_CONTEXT
118     //! \param   [in] *matrix
119     //!          VAIQMatrixBufferJPEGBaseline
120     //!
121     //! \param   [in] numSlices
122     //!          int32_t
123     //!
124     //! \return  VA_STATUS_SUCCESS is returned if it is parsed successfully.
125     //!          else fail reason
126     VAStatus ParseIQMatrix(
127         DDI_MEDIA_CONTEXT            *mediaCtx,
128         VAIQMatrixBufferJPEGBaseline *matrix);
129 
130     //! \brief   ParsePicParam for JPEG
131     //! \details parse the PicParam info required by JPEG decoding
132     //!
133     //! \param   [in] *mediaCtx
134     //!          DDI_MEDIA_CONTEXT
135     //! \param   [in] picParam
136     //!          VAPictureParameterBufferJPEGBaseline
137     //!
138     //! \param   [in] numSlices
139     //!          int32_t
140     //! \return  VA_STATUS_SUCCESS is returned if it is parsed successfully.
141     //!          else fail reason
142     VAStatus ParsePicParams(
143         DDI_MEDIA_CONTEXT                    *mediaCtx,
144         VAPictureParameterBufferJPEGBaseline *picParam);
145 
146     //! \brief   Alloc SliceParam content for JPEG
147     //! \details Alloc/resize SlicePram content for JPEG decoding
148     //!
149     //! \param   [in] numSlices
150     //!          uint32_t the required number of slices
151     //!
152     //! \return  VA_STATUS_SUCCESS is returned if it is parsed successfully.
153     //!          else fail reason
154     VAStatus AllocSliceParamContext(
155         uint32_t numSlices);
156 
157     //! \brief   Init resource buffer for JPEG
158     //! \details Initialize and allocate the resource buffer for JPEG
159     //!
160     //! \return  VA_STATUS_SUCCESS is returned if it is parsed successfully.
161     //!          else fail reason
162     VAStatus InitResourceBuffer();
163 
164     //! \brief   Free Resource buffer for JPEG
165     //!
166     void FreeResourceBuffer();
167 
168     //! \brief   ParseHuffmanTbl for JPEG
169     //! \details parse the Huffman table info required by JPEG decoding
170     //!
171     //! \param   [in] *mediaCtx
172     //!          DDI_MEDIA_CONTEXT
173     //! \param   [in] huffmanTbl
174     //!          VAHuffmanTableBufferJPEGBaseline
175     //!
176     //! \return  VA_STATUS_SUCCESS is returned if it is parsed successfully.
177     //!          else fail reason
178     VAStatus ParseHuffmanTbl(
179         DDI_MEDIA_CONTEXT                *mediaCtx,
180         VAHuffmanTableBufferJPEGBaseline *huffmanTbl);
181 
182     //! \brief   Set input buffer as rendered for JPEG decoding
183     //! \details Mark the input data buffer as rendered. This will be used in later decoding.
184     //!
185     //! \param   [in] bufferID
186     //!          VABufferID
187     //!
188     //! \return  VA_STATUS_SUCCESS is returned if it is parsed successfully.
189     //!          else fail reason
190     VAStatus SetBufferRendered(VABufferID bufferID);
191 
192     //! \brief   Check the output format for JPEG decoding
193     //! \details Check whether the output format matches the chromat format.
194     //!
195     //! \param   [in] format
196     //!          MOS_FORMAT
197     //!
198     //! \return  return true if pass the format check.
199     //!          else false
200     bool CheckFormat(MOS_FORMAT format);
201 
202     //! \brief  the internal JPEG bit-stream buffer
203     struct _DDI_MEDIA_BUFFER *m_jpegBitstreamBuf = nullptr;
204 
205     //! \brief the total num of JPEG scans
206     int32_t m_numScans = 0;
207 };
208 
209 #endif
210