xref: /aosp_15_r20/external/mesa3d/src/gallium/include/pipe/p_video_enums.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1 /**************************************************************************
2  *
3  * Copyright 2009 Younes Manton.
4  * All Rights Reserved.
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a
7  * copy of this software and associated documentation files (the
8  * "Software"), to deal in the Software without restriction, including
9  * without limitation the rights to use, copy, modify, merge, publish,
10  * distribute, sub license, and/or sell copies of the Software, and to
11  * permit persons to whom the Software is furnished to do so, subject to
12  * the following conditions:
13  *
14  * The above copyright notice and this permission notice (including the
15  * next paragraph) shall be included in all copies or substantial portions
16  * of the Software.
17  *
18  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21  * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25  *
26  **************************************************************************/
27 
28 #ifndef PIPE_VIDEO_ENUMS_H
29 #define PIPE_VIDEO_ENUMS_H
30 
31 #ifdef __cplusplus
32 extern "C" {
33 #endif
34 
35 enum pipe_video_format
36 {
37    PIPE_VIDEO_FORMAT_UNKNOWN = 0,
38    PIPE_VIDEO_FORMAT_MPEG12,   /**< MPEG1, MPEG2 */
39    PIPE_VIDEO_FORMAT_MPEG4,    /**< DIVX, XVID */
40    PIPE_VIDEO_FORMAT_VC1,      /**< WMV */
41    PIPE_VIDEO_FORMAT_MPEG4_AVC,/**< H.264 */
42    PIPE_VIDEO_FORMAT_HEVC,     /**< H.265 */
43    PIPE_VIDEO_FORMAT_JPEG,     /**< JPEG */
44    PIPE_VIDEO_FORMAT_VP9,      /**< VP9 */
45    PIPE_VIDEO_FORMAT_AV1       /**< AV1 */
46 };
47 
48 enum pipe_video_profile
49 {
50    PIPE_VIDEO_PROFILE_UNKNOWN,
51    PIPE_VIDEO_PROFILE_MPEG1,
52    PIPE_VIDEO_PROFILE_MPEG2_SIMPLE,
53    PIPE_VIDEO_PROFILE_MPEG2_MAIN,
54    PIPE_VIDEO_PROFILE_MPEG4_SIMPLE,
55    PIPE_VIDEO_PROFILE_MPEG4_ADVANCED_SIMPLE,
56    PIPE_VIDEO_PROFILE_VC1_SIMPLE,
57    PIPE_VIDEO_PROFILE_VC1_MAIN,
58    PIPE_VIDEO_PROFILE_VC1_ADVANCED,
59    PIPE_VIDEO_PROFILE_MPEG4_AVC_BASELINE,
60    PIPE_VIDEO_PROFILE_MPEG4_AVC_CONSTRAINED_BASELINE,
61    PIPE_VIDEO_PROFILE_MPEG4_AVC_MAIN,
62    PIPE_VIDEO_PROFILE_MPEG4_AVC_EXTENDED,
63    PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH,
64    PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH10,
65    PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH422,
66    PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH444,
67    PIPE_VIDEO_PROFILE_HEVC_MAIN,
68    PIPE_VIDEO_PROFILE_HEVC_MAIN_10,
69    PIPE_VIDEO_PROFILE_HEVC_MAIN_STILL,
70    PIPE_VIDEO_PROFILE_HEVC_MAIN_12,
71    PIPE_VIDEO_PROFILE_HEVC_MAIN_444,
72    PIPE_VIDEO_PROFILE_JPEG_BASELINE,
73    PIPE_VIDEO_PROFILE_VP9_PROFILE0,
74    PIPE_VIDEO_PROFILE_VP9_PROFILE2,
75    PIPE_VIDEO_PROFILE_AV1_MAIN,
76    PIPE_VIDEO_PROFILE_MAX
77 };
78 
79 /* Video caps, can be different for each codec/profile */
80 enum pipe_video_cap
81 {
82    PIPE_VIDEO_CAP_SUPPORTED = 0,
83    PIPE_VIDEO_CAP_NPOT_TEXTURES = 1,
84    PIPE_VIDEO_CAP_MAX_WIDTH = 2,
85    PIPE_VIDEO_CAP_MAX_HEIGHT = 3,
86    PIPE_VIDEO_CAP_PREFERED_FORMAT = 4,
87    PIPE_VIDEO_CAP_PREFERS_INTERLACED = 5,
88    PIPE_VIDEO_CAP_SUPPORTS_PROGRESSIVE = 6,
89    PIPE_VIDEO_CAP_SUPPORTS_INTERLACED = 7,
90    PIPE_VIDEO_CAP_MAX_LEVEL = 8,
91    PIPE_VIDEO_CAP_STACKED_FRAMES = 9,
92    PIPE_VIDEO_CAP_MAX_MACROBLOCKS = 10,
93    PIPE_VIDEO_CAP_MAX_TEMPORAL_LAYERS = 11,
94    PIPE_VIDEO_CAP_ENC_MAX_SLICES_PER_FRAME = 13,
95    PIPE_VIDEO_CAP_ENC_SLICES_STRUCTURE = 14,
96    PIPE_VIDEO_CAP_ENC_MAX_REFERENCES_PER_FRAME = 15,
97    PIPE_VIDEO_CAP_VPP_ORIENTATION_MODES = 16,
98    PIPE_VIDEO_CAP_VPP_BLEND_MODES = 17,
99    PIPE_VIDEO_CAP_VPP_MAX_INPUT_WIDTH = 18,
100    PIPE_VIDEO_CAP_VPP_MAX_INPUT_HEIGHT = 19,
101    PIPE_VIDEO_CAP_VPP_MIN_INPUT_WIDTH = 20,
102    PIPE_VIDEO_CAP_VPP_MIN_INPUT_HEIGHT = 21,
103    PIPE_VIDEO_CAP_VPP_MAX_OUTPUT_WIDTH = 22,
104    PIPE_VIDEO_CAP_VPP_MAX_OUTPUT_HEIGHT = 23,
105    PIPE_VIDEO_CAP_VPP_MIN_OUTPUT_WIDTH = 24,
106    PIPE_VIDEO_CAP_VPP_MIN_OUTPUT_HEIGHT = 25,
107    PIPE_VIDEO_CAP_ENC_QUALITY_LEVEL = 26,
108    /* If true, when mapping planar textures like NV12 or P016 the mapped buffer contains
109    all the planes contiguously. This allows for use with some frontends functions that
110    require this like vaDeriveImage */
111    PIPE_VIDEO_CAP_SUPPORTS_CONTIGUOUS_PLANES_MAP = 27,
112    PIPE_VIDEO_CAP_ENC_SUPPORTS_MAX_FRAME_SIZE = 28,
113    PIPE_VIDEO_CAP_ENC_HEVC_BLOCK_SIZES = 29,
114    PIPE_VIDEO_CAP_ENC_HEVC_FEATURE_FLAGS = 30,
115    PIPE_VIDEO_CAP_ENC_HEVC_PREDICTION_DIRECTION = 31,
116    /*
117       If reported by the driver, then pipe_video_codec.flush(...)
118       needs to be called after pipe_video_codec.end_frame(...)
119       to kick off the work in the device
120    */
121    PIPE_VIDEO_CAP_REQUIRES_FLUSH_ON_END_FRAME = 32,
122 
123    /*
124       If reported by the driver, then multiple p_video_codec encode
125       operations can be asynchronously enqueued (and also flushed)
126       with different feedback values in the device before get_feedback
127       is called on them to synchronize. The device can block on begin_frame
128       when it has reached its maximum async depth capacity
129    */
130    PIPE_VIDEO_CAP_ENC_SUPPORTS_ASYNC_OPERATION = 33,
131    PIPE_VIDEO_CAP_MIN_WIDTH = 34,
132    PIPE_VIDEO_CAP_MIN_HEIGHT = 35,
133    PIPE_VIDEO_CAP_ENC_RATE_CONTROL_QVBR = 36,
134    /*
135       AV1 encoding features list
136    */
137    PIPE_VIDEO_CAP_ENC_AV1_FEATURE = 37,
138    PIPE_VIDEO_CAP_ENC_AV1_FEATURE_EXT1 = 38,
139    PIPE_VIDEO_CAP_ENC_AV1_FEATURE_EXT2 = 39,
140    PIPE_VIDEO_CAP_ENC_SUPPORTS_TILE = 40,
141    PIPE_VIDEO_CAP_ENC_MAX_TILE_ROWS = 41,
142    PIPE_VIDEO_CAP_ENC_MAX_TILE_COLS = 42,
143    PIPE_VIDEO_CAP_ENC_INTRA_REFRESH = 43,
144    PIPE_VIDEO_CAP_ENC_SUPPORTS_FEEDBACK_METADATA = 44,
145    /*
146     * uses pipe_video_h264_enc_dbk_filter_mode_flags and sets the
147     * supported modes to set in disable_deblocking_filter_idc
148    */
149    PIPE_VIDEO_CAP_ENC_H264_DISABLE_DBK_FILTER_MODES_SUPPORTED = 45,
150    /* max number of intra refresh cycles before the beginning of a new
151     * intra-refresh wave (e.g pipe_enc_intra_refresh.offset is 0 again)
152    */
153    PIPE_VIDEO_CAP_ENC_INTRA_REFRESH_MAX_DURATION = 46,
154    PIPE_VIDEO_CAP_ENC_H264_SUPPORTS_CABAC_ENCODE = 47,
155    /*
156       crop and partial decode support
157    */
158    PIPE_VIDEO_CAP_ROI_CROP_DEC = 48,
159    /*
160     * Encoding Region Of Interest feature
161     */
162    PIPE_VIDEO_CAP_ENC_ROI = 49,
163    /*
164     * Encoding surface width/height alignment
165     */
166    PIPE_VIDEO_CAP_ENC_SURFACE_ALIGNMENT = 50,
167    /*
168     * HEVC range extension support pipe_h265_enc_cap_range_extension
169     */
170    PIPE_VIDEO_CAP_ENC_HEVC_RANGE_EXTENSION_SUPPORT = 51,
171    /*
172     * HEVC range extension support pipe_h265_enc_cap_range_extension_flags
173     */
174    PIPE_VIDEO_CAP_ENC_HEVC_RANGE_EXTENSION_FLAGS_SUPPORT = 52,
175 };
176 
177 enum pipe_video_h264_enc_dbk_filter_mode_flags
178 {
179    PIPE_VIDEO_H264_ENC_DBK_MODE_NONE	= 0,
180    PIPE_VIDEO_H264_ENC_DBK_MODE_ALL_LUMA_CHROMA_SLICE_BLOCK_EDGES_ALWAYS_FILTERED	= 0x1,
181    PIPE_VIDEO_H264_ENC_DBK_MODE_DISABLE_ALL_SLICE_BLOCK_EDGES	= 0x2,
182    PIPE_VIDEO_H264_ENC_DBK_MODE_DISABLE_SLICE_BOUNDARIES_BLOCKS = 0x4,
183    PIPE_VIDEO_H264_ENC_DBK_MODE_USE_TWO_STAGE_DEBLOCKING = 0x8,
184    PIPE_VIDEO_H264_ENC_DBK_MODE_DISABLE_CHROMA_BLOCK_EDGES	= 0x10,
185    PIPE_VIDEO_H264_ENC_DBK_MODE_DISABLE_CHROMA_BLOCK_EDGES_AND_LUMA_BOUNDARIES = 0x20,
186    PIPE_VIDEO_H264_ENC_DBK_MODE_DISABLE_CHROMA_BLOCK_EDGES_AND_USE_LUMA_TWO_STAGE_DEBLOCKING = 0x40,
187 };
188 
189 enum pipe_video_feedback_encode_result_flags
190 {
191    /* Requires PIPE_VIDEO_FEEDBACK_METADATA_TYPE_ENCODE_RESULT */
192    PIPE_VIDEO_FEEDBACK_METADATA_ENCODE_FLAG_OK = 0x0,
193    PIPE_VIDEO_FEEDBACK_METADATA_ENCODE_FLAG_FAILED = 0x1,
194    /* Requires PIPE_VIDEO_FEEDBACK_METADATA_TYPE_MAX_FRAME_SIZE_OVERFLOW */
195    PIPE_VIDEO_FEEDBACK_METADATA_ENCODE_FLAG_MAX_FRAME_SIZE_OVERFLOW = 0x2,
196 };
197 
198 enum codec_unit_location_flags
199 {
200    PIPE_VIDEO_CODEC_UNIT_LOCATION_FLAG_NONE = 0x0,
201    /* Requires PIPE_VIDEO_FEEDBACK_METADATA_TYPE_MAX_SLICE_SIZE_OVERFLOW */
202    PIPE_VIDEO_CODEC_UNIT_LOCATION_FLAG_MAX_SLICE_SIZE_OVERFLOW = 0x1,
203    PIPE_VIDEO_CODEC_UNIT_LOCATION_FLAG_SINGLE_NALU = 0x2,
204 };
205 
206 /* To be used with PIPE_VIDEO_CAP_ENC_SUPPORTS_FEEDBACK_METADATA
207  * for checking gallium driver support and to indicate the
208  * different metadata types in an encode operation
209 */
210 enum pipe_video_feedback_metadata_type
211 {
212    PIPE_VIDEO_FEEDBACK_METADATA_TYPE_BITSTREAM_SIZE           = 0x0,
213    PIPE_VIDEO_FEEDBACK_METADATA_TYPE_ENCODE_RESULT            = 0x1,
214    PIPE_VIDEO_FEEDBACK_METADATA_TYPE_CODEC_UNIT_LOCATION      = 0x2,
215    PIPE_VIDEO_FEEDBACK_METADATA_TYPE_MAX_FRAME_SIZE_OVERFLOW  = 0x4,
216    PIPE_VIDEO_FEEDBACK_METADATA_TYPE_MAX_SLICE_SIZE_OVERFLOW  = 0x8,
217    PIPE_VIDEO_FEEDBACK_METADATA_TYPE_AVERAGE_FRAME_QP         = 0x10,
218 };
219 
220 enum pipe_video_av1_enc_filter_mode
221 {
222    PIPE_VIDEO_CAP_ENC_AV1_INTERPOLATION_FILTER_EIGHT_TAP = (1 << 0),
223    PIPE_VIDEO_CAP_ENC_AV1_INTERPOLATION_FILTER_EIGHT_TAP_SMOOTH = (1 << 1),
224    PIPE_VIDEO_CAP_ENC_AV1_INTERPOLATION_FILTER_EIGHT_TAP_SHARP = (1 << 2),
225    PIPE_VIDEO_CAP_ENC_AV1_INTERPOLATION_FILTER_BILINEAR = (1 << 3),
226    PIPE_VIDEO_CAP_ENC_AV1_INTERPOLATION_FILTER_SWITCHABLE = (1 << 4),
227 
228 };
229 
230 enum pipe_video_av1_enc_tx_mode
231 {
232    PIPE_VIDEO_CAP_ENC_AV1_TX_MODE_ONLY_4X4 = (1 << 0),
233    PIPE_VIDEO_CAP_ENC_AV1_TX_MODE_LARGEST = (1 << 1),
234    PIPE_VIDEO_CAP_ENC_AV1_TX_MODE_SELECT = (1 << 2),
235 };
236 
237 /* To be used with PIPE_VIDEO_CAP_VPP_ORIENTATION_MODES and for VPP state*/
238 enum pipe_video_vpp_orientation
239 {
240    PIPE_VIDEO_VPP_ORIENTATION_DEFAULT = 0x0,
241    PIPE_VIDEO_VPP_ROTATION_90 = 0x01,
242    PIPE_VIDEO_VPP_ROTATION_180 = 0x02,
243    PIPE_VIDEO_VPP_ROTATION_270 = 0x04,
244    PIPE_VIDEO_VPP_FLIP_HORIZONTAL = 0x08,
245    PIPE_VIDEO_VPP_FLIP_VERTICAL = 0x10,
246 };
247 
248 /* To be used with PIPE_VIDEO_CAP_VPP_BLEND_MODES and for VPP state*/
249 enum pipe_video_vpp_blend_mode
250 {
251    PIPE_VIDEO_VPP_BLEND_MODE_NONE = 0x0,
252    PIPE_VIDEO_VPP_BLEND_MODE_GLOBAL_ALPHA = 0x1,
253 };
254 
255 /* To be used for VPP state*/
256 enum pipe_video_vpp_color_standard_type
257 {
258    PIPE_VIDEO_VPP_COLOR_STANDARD_TYPE_NONE = 0x0,
259    PIPE_VIDEO_VPP_COLOR_STANDARD_TYPE_BT601 = 0x1,
260    PIPE_VIDEO_VPP_COLOR_STANDARD_TYPE_BT709 = 0x2,
261    PIPE_VIDEO_VPP_COLOR_STANDARD_TYPE_BT2020 = 0xC,
262    PIPE_VIDEO_VPP_COLOR_STANDARD_TYPE_COUNT,
263 };
264 
265 /* To be used for VPP state*/
266 enum pipe_video_vpp_color_range
267 {
268    PIPE_VIDEO_VPP_CHROMA_COLOR_RANGE_NONE     = 0x00,
269    PIPE_VIDEO_VPP_CHROMA_COLOR_RANGE_REDUCED  = 0x01,
270    PIPE_VIDEO_VPP_CHROMA_COLOR_RANGE_FULL     = 0x02,
271 };
272 
273 /* To be used for VPP state*/
274 enum pipe_video_vpp_chroma_siting
275 {
276    PIPE_VIDEO_VPP_CHROMA_SITING_NONE              = 0x00,
277    PIPE_VIDEO_VPP_CHROMA_SITING_VERTICAL_TOP      = 0x01,
278    PIPE_VIDEO_VPP_CHROMA_SITING_VERTICAL_CENTER   = 0x02,
279    PIPE_VIDEO_VPP_CHROMA_SITING_VERTICAL_BOTTOM   = 0x04,
280    PIPE_VIDEO_VPP_CHROMA_SITING_HORIZONTAL_LEFT   = 0x10,
281    PIPE_VIDEO_VPP_CHROMA_SITING_HORIZONTAL_CENTER = 0x20,
282 };
283 
284 
285 /* To be used with cap PIPE_VIDEO_CAP_ENC_SLICES_STRUCTURE*/
286 /**
287  * pipe_video_cap_slice_structure
288  *
289  * This attribute determines slice structures supported by the
290  * driver for encoding. This attribute is a hint to the user so
291  * that he can choose a suitable surface size and how to arrange
292  * the encoding process of multiple slices per frame.
293  *
294  * More specifically, for H.264 encoding, this attribute
295  * determines the range of accepted values to
296  * h264_slice_descriptor::macroblock_address and
297  * h264_slice_descriptor::num_macroblocks.
298  */
299 enum pipe_video_cap_slice_structure
300 {
301    /* Driver does not supports multiple slice per frame.*/
302    PIPE_VIDEO_CAP_SLICE_STRUCTURE_NONE = 0x00000000,
303    /* Driver supports a power-of-two number of rows per slice.*/
304    PIPE_VIDEO_CAP_SLICE_STRUCTURE_POWER_OF_TWO_ROWS = 0x00000001,
305    /* Driver supports an arbitrary number of macroblocks per slice.*/
306    PIPE_VIDEO_CAP_SLICE_STRUCTURE_ARBITRARY_MACROBLOCKS = 0x00000002,
307    /* Driver support 1 row per slice*/
308    PIPE_VIDEO_CAP_SLICE_STRUCTURE_EQUAL_ROWS = 0x00000004,
309    /* Driver support max encoded slice size per slice */
310    PIPE_VIDEO_CAP_SLICE_STRUCTURE_MAX_SLICE_SIZE = 0x00000008,
311    /* Driver supports an arbitrary number of rows per slice. */
312    PIPE_VIDEO_CAP_SLICE_STRUCTURE_ARBITRARY_ROWS = 0x00000010,
313    /* Driver supports any number of rows per slice but they must be the same
314    *  for all slices except for the last one, which must be equal or smaller
315    *  to the previous slices. */
316    PIPE_VIDEO_CAP_SLICE_STRUCTURE_EQUAL_MULTI_ROWS = 0x00000020,
317 };
318 
319 enum pipe_video_enc_intra_refresh_mode
320 {
321    /* no intra-refresh is supported */
322    PIPE_VIDEO_ENC_INTRA_REFRESH_NONE      = 0x00000,
323    /* intra-refresh is column based */
324    PIPE_VIDEO_ENC_INTRA_REFRESH_COLUMN    = 0x00001,
325    /* intra-refresh is row based */
326    PIPE_VIDEO_ENC_INTRA_REFRESH_ROW       = 0x00002,
327    /* intra-refresh could be adaptive, and decided by application */
328    PIPE_VIDEO_ENC_INTRA_REFRESH_ADAPTIVE  = 0x00010,
329    /* intra-refresh could be cyclic, decided by application */
330    PIPE_VIDEO_ENC_INTRA_REFRESH_CYCLIC    = 0x00020,
331    /* intra-refresh can be on P frame */
332    PIPE_VIDEO_ENC_INTRA_REFRESH_P_FRAME   = 0x10000,
333    /* intra-refresh can be on B frame */
334    PIPE_VIDEO_ENC_INTRA_REFRESH_B_FRAME   = 0x20000,
335    /* intra-refresh support multiple reference encoder */
336    PIPE_VIDEO_ENC_INTRA_REFRESH_MULTI_REF = 0x40000,
337 };
338 
339 enum pipe_video_slice_mode
340 {
341    /*
342     * Partitions the frame using block offsets and block numbers
343    */
344    PIPE_VIDEO_SLICE_MODE_BLOCKS = 0,
345    /*
346     * Partitions the frame using max slice size per coded slice
347    */
348    PIPE_VIDEO_SLICE_MODE_MAX_SLICE_SIZE = 1,
349 };
350 
351 enum pipe_video_entrypoint
352 {
353    PIPE_VIDEO_ENTRYPOINT_UNKNOWN,
354    PIPE_VIDEO_ENTRYPOINT_BITSTREAM,
355    PIPE_VIDEO_ENTRYPOINT_IDCT,
356    PIPE_VIDEO_ENTRYPOINT_MC,
357    PIPE_VIDEO_ENTRYPOINT_ENCODE,
358    PIPE_VIDEO_ENTRYPOINT_PROCESSING,
359 };
360 
361 #if defined(__cplusplus)
362 }
363 #endif
364 
365 #endif /* PIPE_VIDEO_ENUMS_H */
366