1*61046927SAndroid Build Coastguard Worker /**************************************************************************
2*61046927SAndroid Build Coastguard Worker *
3*61046927SAndroid Build Coastguard Worker * Copyright 2010 Thomas Balling Sørensen & Orasanu Lucian.
4*61046927SAndroid Build Coastguard Worker * Copyright 2014 Advanced Micro Devices, Inc.
5*61046927SAndroid Build Coastguard Worker * All Rights Reserved.
6*61046927SAndroid Build Coastguard Worker *
7*61046927SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
8*61046927SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the
9*61046927SAndroid Build Coastguard Worker * "Software"), to deal in the Software without restriction, including
10*61046927SAndroid Build Coastguard Worker * without limitation the rights to use, copy, modify, merge, publish,
11*61046927SAndroid Build Coastguard Worker * distribute, sub license, and/or sell copies of the Software, and to
12*61046927SAndroid Build Coastguard Worker * permit persons to whom the Software is furnished to do so, subject to
13*61046927SAndroid Build Coastguard Worker * the following conditions:
14*61046927SAndroid Build Coastguard Worker *
15*61046927SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the
16*61046927SAndroid Build Coastguard Worker * next paragraph) shall be included in all copies or substantial portions
17*61046927SAndroid Build Coastguard Worker * of the Software.
18*61046927SAndroid Build Coastguard Worker *
19*61046927SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20*61046927SAndroid Build Coastguard Worker * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21*61046927SAndroid Build Coastguard Worker * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
22*61046927SAndroid Build Coastguard Worker * IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR
23*61046927SAndroid Build Coastguard Worker * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
24*61046927SAndroid Build Coastguard Worker * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
25*61046927SAndroid Build Coastguard Worker * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26*61046927SAndroid Build Coastguard Worker *
27*61046927SAndroid Build Coastguard Worker **************************************************************************/
28*61046927SAndroid Build Coastguard Worker
29*61046927SAndroid Build Coastguard Worker #include "pipe/p_screen.h"
30*61046927SAndroid Build Coastguard Worker
31*61046927SAndroid Build Coastguard Worker #include "util/u_video.h"
32*61046927SAndroid Build Coastguard Worker #include "util/u_memory.h"
33*61046927SAndroid Build Coastguard Worker
34*61046927SAndroid Build Coastguard Worker #include "vl/vl_winsys.h"
35*61046927SAndroid Build Coastguard Worker #include "vl/vl_codec.h"
36*61046927SAndroid Build Coastguard Worker
37*61046927SAndroid Build Coastguard Worker #include "va_private.h"
38*61046927SAndroid Build Coastguard Worker
39*61046927SAndroid Build Coastguard Worker #include "util/u_handle_table.h"
40*61046927SAndroid Build Coastguard Worker
41*61046927SAndroid Build Coastguard Worker DEBUG_GET_ONCE_BOOL_OPTION(mpeg4, "VAAPI_MPEG4_ENABLED", false)
42*61046927SAndroid Build Coastguard Worker
43*61046927SAndroid Build Coastguard Worker VAStatus
vlVaQueryConfigProfiles(VADriverContextP ctx,VAProfile * profile_list,int * num_profiles)44*61046927SAndroid Build Coastguard Worker vlVaQueryConfigProfiles(VADriverContextP ctx, VAProfile *profile_list, int *num_profiles)
45*61046927SAndroid Build Coastguard Worker {
46*61046927SAndroid Build Coastguard Worker struct pipe_screen *pscreen;
47*61046927SAndroid Build Coastguard Worker enum pipe_video_profile p;
48*61046927SAndroid Build Coastguard Worker VAProfile vap;
49*61046927SAndroid Build Coastguard Worker
50*61046927SAndroid Build Coastguard Worker if (!ctx)
51*61046927SAndroid Build Coastguard Worker return VA_STATUS_ERROR_INVALID_CONTEXT;
52*61046927SAndroid Build Coastguard Worker
53*61046927SAndroid Build Coastguard Worker *num_profiles = 0;
54*61046927SAndroid Build Coastguard Worker
55*61046927SAndroid Build Coastguard Worker pscreen = VL_VA_PSCREEN(ctx);
56*61046927SAndroid Build Coastguard Worker for (p = PIPE_VIDEO_PROFILE_MPEG2_SIMPLE; p <= PIPE_VIDEO_PROFILE_AV1_MAIN; ++p) {
57*61046927SAndroid Build Coastguard Worker if (u_reduce_video_profile(p) == PIPE_VIDEO_FORMAT_MPEG4 && !debug_get_option_mpeg4())
58*61046927SAndroid Build Coastguard Worker continue;
59*61046927SAndroid Build Coastguard Worker
60*61046927SAndroid Build Coastguard Worker if (vl_codec_supported(pscreen, p, false) ||
61*61046927SAndroid Build Coastguard Worker vl_codec_supported(pscreen, p, true)) {
62*61046927SAndroid Build Coastguard Worker vap = PipeToProfile(p);
63*61046927SAndroid Build Coastguard Worker if (vap != VAProfileNone)
64*61046927SAndroid Build Coastguard Worker profile_list[(*num_profiles)++] = vap;
65*61046927SAndroid Build Coastguard Worker }
66*61046927SAndroid Build Coastguard Worker }
67*61046927SAndroid Build Coastguard Worker
68*61046927SAndroid Build Coastguard Worker /* Support postprocessing through vl_compositor */
69*61046927SAndroid Build Coastguard Worker profile_list[(*num_profiles)++] = VAProfileNone;
70*61046927SAndroid Build Coastguard Worker
71*61046927SAndroid Build Coastguard Worker return VA_STATUS_SUCCESS;
72*61046927SAndroid Build Coastguard Worker }
73*61046927SAndroid Build Coastguard Worker
74*61046927SAndroid Build Coastguard Worker VAStatus
vlVaQueryConfigEntrypoints(VADriverContextP ctx,VAProfile profile,VAEntrypoint * entrypoint_list,int * num_entrypoints)75*61046927SAndroid Build Coastguard Worker vlVaQueryConfigEntrypoints(VADriverContextP ctx, VAProfile profile,
76*61046927SAndroid Build Coastguard Worker VAEntrypoint *entrypoint_list, int *num_entrypoints)
77*61046927SAndroid Build Coastguard Worker {
78*61046927SAndroid Build Coastguard Worker struct pipe_screen *pscreen;
79*61046927SAndroid Build Coastguard Worker enum pipe_video_profile p;
80*61046927SAndroid Build Coastguard Worker bool check_av1enc_support = false;
81*61046927SAndroid Build Coastguard Worker
82*61046927SAndroid Build Coastguard Worker if (!ctx)
83*61046927SAndroid Build Coastguard Worker return VA_STATUS_ERROR_INVALID_CONTEXT;
84*61046927SAndroid Build Coastguard Worker
85*61046927SAndroid Build Coastguard Worker *num_entrypoints = 0;
86*61046927SAndroid Build Coastguard Worker
87*61046927SAndroid Build Coastguard Worker if (profile == VAProfileNone) {
88*61046927SAndroid Build Coastguard Worker entrypoint_list[(*num_entrypoints)++] = VAEntrypointVideoProc;
89*61046927SAndroid Build Coastguard Worker return VA_STATUS_SUCCESS;
90*61046927SAndroid Build Coastguard Worker }
91*61046927SAndroid Build Coastguard Worker
92*61046927SAndroid Build Coastguard Worker p = ProfileToPipe(profile);
93*61046927SAndroid Build Coastguard Worker if (p == PIPE_VIDEO_PROFILE_UNKNOWN ||
94*61046927SAndroid Build Coastguard Worker (u_reduce_video_profile(p) == PIPE_VIDEO_FORMAT_MPEG4 &&
95*61046927SAndroid Build Coastguard Worker !debug_get_option_mpeg4()))
96*61046927SAndroid Build Coastguard Worker return VA_STATUS_ERROR_UNSUPPORTED_PROFILE;
97*61046927SAndroid Build Coastguard Worker
98*61046927SAndroid Build Coastguard Worker pscreen = VL_VA_PSCREEN(ctx);
99*61046927SAndroid Build Coastguard Worker if (vl_codec_supported(pscreen, p, false))
100*61046927SAndroid Build Coastguard Worker entrypoint_list[(*num_entrypoints)++] = VAEntrypointVLD;
101*61046927SAndroid Build Coastguard Worker
102*61046927SAndroid Build Coastguard Worker #if VA_CHECK_VERSION(1, 16, 0)
103*61046927SAndroid Build Coastguard Worker if (p == PIPE_VIDEO_PROFILE_AV1_MAIN)
104*61046927SAndroid Build Coastguard Worker check_av1enc_support = true;
105*61046927SAndroid Build Coastguard Worker #endif
106*61046927SAndroid Build Coastguard Worker
107*61046927SAndroid Build Coastguard Worker if (p != PIPE_VIDEO_PROFILE_AV1_MAIN || check_av1enc_support == true)
108*61046927SAndroid Build Coastguard Worker if (vl_codec_supported(pscreen, p, true))
109*61046927SAndroid Build Coastguard Worker entrypoint_list[(*num_entrypoints)++] = VAEntrypointEncSlice;
110*61046927SAndroid Build Coastguard Worker
111*61046927SAndroid Build Coastguard Worker if (*num_entrypoints == 0)
112*61046927SAndroid Build Coastguard Worker return VA_STATUS_ERROR_UNSUPPORTED_PROFILE;
113*61046927SAndroid Build Coastguard Worker
114*61046927SAndroid Build Coastguard Worker assert(*num_entrypoints <= ctx->max_entrypoints);
115*61046927SAndroid Build Coastguard Worker
116*61046927SAndroid Build Coastguard Worker return VA_STATUS_SUCCESS;
117*61046927SAndroid Build Coastguard Worker }
118*61046927SAndroid Build Coastguard Worker
get_screen_supported_va_rt_formats(struct pipe_screen * pscreen,enum pipe_video_profile profile,enum pipe_video_entrypoint entrypoint)119*61046927SAndroid Build Coastguard Worker static unsigned int get_screen_supported_va_rt_formats(struct pipe_screen *pscreen,
120*61046927SAndroid Build Coastguard Worker enum pipe_video_profile profile,
121*61046927SAndroid Build Coastguard Worker enum pipe_video_entrypoint entrypoint)
122*61046927SAndroid Build Coastguard Worker {
123*61046927SAndroid Build Coastguard Worker unsigned int supported_rt_formats = 0;
124*61046927SAndroid Build Coastguard Worker
125*61046927SAndroid Build Coastguard Worker if (pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_NV12,
126*61046927SAndroid Build Coastguard Worker profile,
127*61046927SAndroid Build Coastguard Worker entrypoint) ||
128*61046927SAndroid Build Coastguard Worker pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_YV12,
129*61046927SAndroid Build Coastguard Worker profile,
130*61046927SAndroid Build Coastguard Worker entrypoint) ||
131*61046927SAndroid Build Coastguard Worker pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_IYUV,
132*61046927SAndroid Build Coastguard Worker profile,
133*61046927SAndroid Build Coastguard Worker entrypoint))
134*61046927SAndroid Build Coastguard Worker supported_rt_formats |= VA_RT_FORMAT_YUV420;
135*61046927SAndroid Build Coastguard Worker
136*61046927SAndroid Build Coastguard Worker if (pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_P010,
137*61046927SAndroid Build Coastguard Worker profile,
138*61046927SAndroid Build Coastguard Worker entrypoint) ||
139*61046927SAndroid Build Coastguard Worker pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_P016,
140*61046927SAndroid Build Coastguard Worker profile,
141*61046927SAndroid Build Coastguard Worker entrypoint))
142*61046927SAndroid Build Coastguard Worker supported_rt_formats |= VA_RT_FORMAT_YUV420_10BPP;
143*61046927SAndroid Build Coastguard Worker
144*61046927SAndroid Build Coastguard Worker if (pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_Y8_400_UNORM,
145*61046927SAndroid Build Coastguard Worker profile,
146*61046927SAndroid Build Coastguard Worker entrypoint))
147*61046927SAndroid Build Coastguard Worker supported_rt_formats |= VA_RT_FORMAT_YUV400;
148*61046927SAndroid Build Coastguard Worker
149*61046927SAndroid Build Coastguard Worker if (pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_Y8_U8_V8_444_UNORM,
150*61046927SAndroid Build Coastguard Worker profile,
151*61046927SAndroid Build Coastguard Worker entrypoint))
152*61046927SAndroid Build Coastguard Worker supported_rt_formats |= VA_RT_FORMAT_YUV444;
153*61046927SAndroid Build Coastguard Worker
154*61046927SAndroid Build Coastguard Worker if (pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_UYVY,
155*61046927SAndroid Build Coastguard Worker profile,
156*61046927SAndroid Build Coastguard Worker entrypoint) ||
157*61046927SAndroid Build Coastguard Worker pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_YUYV,
158*61046927SAndroid Build Coastguard Worker profile,
159*61046927SAndroid Build Coastguard Worker entrypoint))
160*61046927SAndroid Build Coastguard Worker supported_rt_formats |= VA_RT_FORMAT_YUV422;
161*61046927SAndroid Build Coastguard Worker
162*61046927SAndroid Build Coastguard Worker if (pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_R8G8B8A8_UNORM,
163*61046927SAndroid Build Coastguard Worker profile,
164*61046927SAndroid Build Coastguard Worker entrypoint) ||
165*61046927SAndroid Build Coastguard Worker pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_R8G8B8A8_UINT,
166*61046927SAndroid Build Coastguard Worker profile,
167*61046927SAndroid Build Coastguard Worker entrypoint) ||
168*61046927SAndroid Build Coastguard Worker pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_R8G8B8X8_UNORM,
169*61046927SAndroid Build Coastguard Worker profile,
170*61046927SAndroid Build Coastguard Worker entrypoint) ||
171*61046927SAndroid Build Coastguard Worker pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_R8G8B8X8_UINT,
172*61046927SAndroid Build Coastguard Worker profile,
173*61046927SAndroid Build Coastguard Worker entrypoint))
174*61046927SAndroid Build Coastguard Worker supported_rt_formats |= VA_RT_FORMAT_RGB32;
175*61046927SAndroid Build Coastguard Worker
176*61046927SAndroid Build Coastguard Worker if (pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_R10G10B10A2_UNORM,
177*61046927SAndroid Build Coastguard Worker profile,
178*61046927SAndroid Build Coastguard Worker entrypoint) ||
179*61046927SAndroid Build Coastguard Worker pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_B10G10R10A2_UNORM,
180*61046927SAndroid Build Coastguard Worker profile,
181*61046927SAndroid Build Coastguard Worker entrypoint) ||
182*61046927SAndroid Build Coastguard Worker pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_R10G10B10X2_UNORM,
183*61046927SAndroid Build Coastguard Worker profile,
184*61046927SAndroid Build Coastguard Worker entrypoint) ||
185*61046927SAndroid Build Coastguard Worker pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_B10G10R10X2_UNORM,
186*61046927SAndroid Build Coastguard Worker profile,
187*61046927SAndroid Build Coastguard Worker entrypoint))
188*61046927SAndroid Build Coastguard Worker supported_rt_formats |= VA_RT_FORMAT_RGB32_10;
189*61046927SAndroid Build Coastguard Worker
190*61046927SAndroid Build Coastguard Worker if (pscreen->is_video_format_supported(pscreen, PIPE_FORMAT_R8_G8_B8_UNORM,
191*61046927SAndroid Build Coastguard Worker profile,
192*61046927SAndroid Build Coastguard Worker entrypoint))
193*61046927SAndroid Build Coastguard Worker supported_rt_formats |= VA_RT_FORMAT_RGBP;
194*61046927SAndroid Build Coastguard Worker
195*61046927SAndroid Build Coastguard Worker
196*61046927SAndroid Build Coastguard Worker return supported_rt_formats;
197*61046927SAndroid Build Coastguard Worker }
198*61046927SAndroid Build Coastguard Worker
199*61046927SAndroid Build Coastguard Worker VAStatus
vlVaGetConfigAttributes(VADriverContextP ctx,VAProfile profile,VAEntrypoint entrypoint,VAConfigAttrib * attrib_list,int num_attribs)200*61046927SAndroid Build Coastguard Worker vlVaGetConfigAttributes(VADriverContextP ctx, VAProfile profile, VAEntrypoint entrypoint,
201*61046927SAndroid Build Coastguard Worker VAConfigAttrib *attrib_list, int num_attribs)
202*61046927SAndroid Build Coastguard Worker {
203*61046927SAndroid Build Coastguard Worker struct pipe_screen *pscreen;
204*61046927SAndroid Build Coastguard Worker int i;
205*61046927SAndroid Build Coastguard Worker
206*61046927SAndroid Build Coastguard Worker if (!ctx)
207*61046927SAndroid Build Coastguard Worker return VA_STATUS_ERROR_INVALID_CONTEXT;
208*61046927SAndroid Build Coastguard Worker
209*61046927SAndroid Build Coastguard Worker pscreen = VL_VA_PSCREEN(ctx);
210*61046927SAndroid Build Coastguard Worker
211*61046927SAndroid Build Coastguard Worker for (i = 0; i < num_attribs; ++i) {
212*61046927SAndroid Build Coastguard Worker unsigned int value;
213*61046927SAndroid Build Coastguard Worker if ((entrypoint == VAEntrypointVLD) &&
214*61046927SAndroid Build Coastguard Worker (vl_codec_supported(pscreen, ProfileToPipe(profile), false))) {
215*61046927SAndroid Build Coastguard Worker switch (attrib_list[i].type) {
216*61046927SAndroid Build Coastguard Worker case VAConfigAttribRTFormat:
217*61046927SAndroid Build Coastguard Worker /*
218*61046927SAndroid Build Coastguard Worker * Different gallium drivers will have different supported formats
219*61046927SAndroid Build Coastguard Worker * If modifying this, please query the driver like below
220*61046927SAndroid Build Coastguard Worker */
221*61046927SAndroid Build Coastguard Worker value = get_screen_supported_va_rt_formats(pscreen,
222*61046927SAndroid Build Coastguard Worker ProfileToPipe(profile),
223*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_ENTRYPOINT_BITSTREAM);
224*61046927SAndroid Build Coastguard Worker break;
225*61046927SAndroid Build Coastguard Worker case VAConfigAttribMaxPictureWidth:
226*61046927SAndroid Build Coastguard Worker {
227*61046927SAndroid Build Coastguard Worker value = pscreen->get_video_param(pscreen, ProfileToPipe(profile),
228*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_ENTRYPOINT_BITSTREAM,
229*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_CAP_MAX_WIDTH);
230*61046927SAndroid Build Coastguard Worker value = value ? value : VA_ATTRIB_NOT_SUPPORTED;
231*61046927SAndroid Build Coastguard Worker } break;
232*61046927SAndroid Build Coastguard Worker case VAConfigAttribMaxPictureHeight:
233*61046927SAndroid Build Coastguard Worker {
234*61046927SAndroid Build Coastguard Worker value = pscreen->get_video_param(pscreen, ProfileToPipe(profile),
235*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_ENTRYPOINT_BITSTREAM,
236*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_CAP_MAX_HEIGHT);
237*61046927SAndroid Build Coastguard Worker value = value ? value : VA_ATTRIB_NOT_SUPPORTED;
238*61046927SAndroid Build Coastguard Worker } break;
239*61046927SAndroid Build Coastguard Worker #if VA_CHECK_VERSION(1, 21, 0)
240*61046927SAndroid Build Coastguard Worker case VAConfigAttribDecJPEG:
241*61046927SAndroid Build Coastguard Worker {
242*61046927SAndroid Build Coastguard Worker VAConfigAttribValDecJPEG attr_jpeg = { .value = 0 };
243*61046927SAndroid Build Coastguard Worker /* Check if ROI Decode is supported */
244*61046927SAndroid Build Coastguard Worker int supportsCropDec =
245*61046927SAndroid Build Coastguard Worker pscreen->get_video_param(pscreen, ProfileToPipe(profile),
246*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_ENTRYPOINT_BITSTREAM,
247*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_CAP_ROI_CROP_DEC);
248*61046927SAndroid Build Coastguard Worker if (supportsCropDec <= 0)
249*61046927SAndroid Build Coastguard Worker value = VA_ATTRIB_NOT_SUPPORTED;
250*61046927SAndroid Build Coastguard Worker else {
251*61046927SAndroid Build Coastguard Worker attr_jpeg.bits.crop = 1;
252*61046927SAndroid Build Coastguard Worker value = attr_jpeg.value;
253*61046927SAndroid Build Coastguard Worker }
254*61046927SAndroid Build Coastguard Worker } break;
255*61046927SAndroid Build Coastguard Worker #endif
256*61046927SAndroid Build Coastguard Worker default:
257*61046927SAndroid Build Coastguard Worker value = VA_ATTRIB_NOT_SUPPORTED;
258*61046927SAndroid Build Coastguard Worker break;
259*61046927SAndroid Build Coastguard Worker }
260*61046927SAndroid Build Coastguard Worker } else if ((entrypoint == VAEntrypointEncSlice) &&
261*61046927SAndroid Build Coastguard Worker (vl_codec_supported(pscreen, ProfileToPipe(profile), true))) {
262*61046927SAndroid Build Coastguard Worker switch (attrib_list[i].type) {
263*61046927SAndroid Build Coastguard Worker case VAConfigAttribRTFormat:
264*61046927SAndroid Build Coastguard Worker value = get_screen_supported_va_rt_formats(pscreen,
265*61046927SAndroid Build Coastguard Worker ProfileToPipe(profile),
266*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_ENTRYPOINT_ENCODE);
267*61046927SAndroid Build Coastguard Worker break;
268*61046927SAndroid Build Coastguard Worker case VAConfigAttribRateControl:
269*61046927SAndroid Build Coastguard Worker {
270*61046927SAndroid Build Coastguard Worker /* Legacy behavior reports these three modes for all drivers */
271*61046927SAndroid Build Coastguard Worker value = VA_RC_CQP | VA_RC_CBR | VA_RC_VBR;
272*61046927SAndroid Build Coastguard Worker
273*61046927SAndroid Build Coastguard Worker /* Check for optional mode QVBR */
274*61046927SAndroid Build Coastguard Worker int supports_qvbr = pscreen->get_video_param(pscreen, ProfileToPipe(profile),
275*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_ENTRYPOINT_ENCODE,
276*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_CAP_ENC_RATE_CONTROL_QVBR);
277*61046927SAndroid Build Coastguard Worker if (supports_qvbr > 0)
278*61046927SAndroid Build Coastguard Worker value |= VA_RC_QVBR;
279*61046927SAndroid Build Coastguard Worker } break;
280*61046927SAndroid Build Coastguard Worker case VAConfigAttribEncRateControlExt:
281*61046927SAndroid Build Coastguard Worker value = pscreen->get_video_param(pscreen, ProfileToPipe(profile),
282*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_ENTRYPOINT_ENCODE,
283*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_CAP_MAX_TEMPORAL_LAYERS);
284*61046927SAndroid Build Coastguard Worker assert(value <= 4);
285*61046927SAndroid Build Coastguard Worker if (value > 0) {
286*61046927SAndroid Build Coastguard Worker value -= 1;
287*61046927SAndroid Build Coastguard Worker value |= (1 << 8); /* temporal_layer_bitrate_control_flag */
288*61046927SAndroid Build Coastguard Worker }
289*61046927SAndroid Build Coastguard Worker break;
290*61046927SAndroid Build Coastguard Worker case VAConfigAttribEncPackedHeaders:
291*61046927SAndroid Build Coastguard Worker value = VA_ENC_PACKED_HEADER_NONE;
292*61046927SAndroid Build Coastguard Worker if ((u_reduce_video_profile(ProfileToPipe(profile)) == PIPE_VIDEO_FORMAT_MPEG4_AVC))
293*61046927SAndroid Build Coastguard Worker value |= ENC_PACKED_HEADERS_H264;
294*61046927SAndroid Build Coastguard Worker else if ((u_reduce_video_profile(ProfileToPipe(profile)) == PIPE_VIDEO_FORMAT_HEVC))
295*61046927SAndroid Build Coastguard Worker value |= ENC_PACKED_HEADERS_HEVC;
296*61046927SAndroid Build Coastguard Worker else if (u_reduce_video_profile(ProfileToPipe(profile)) == PIPE_VIDEO_FORMAT_AV1)
297*61046927SAndroid Build Coastguard Worker value |= ENC_PACKED_HEADERS_AV1;
298*61046927SAndroid Build Coastguard Worker
299*61046927SAndroid Build Coastguard Worker break;
300*61046927SAndroid Build Coastguard Worker case VAConfigAttribEncMaxSlices:
301*61046927SAndroid Build Coastguard Worker {
302*61046927SAndroid Build Coastguard Worker /**
303*61046927SAndroid Build Coastguard Worker * \brief Maximum number of slices per frame. Read-only.
304*61046927SAndroid Build Coastguard Worker *
305*61046927SAndroid Build Coastguard Worker * This attribute determines the maximum number of slices the
306*61046927SAndroid Build Coastguard Worker * driver can support to encode a single frame.
307*61046927SAndroid Build Coastguard Worker */
308*61046927SAndroid Build Coastguard Worker int maxSlicesPerEncodedPic = pscreen->get_video_param(pscreen, ProfileToPipe(profile),
309*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_ENTRYPOINT_ENCODE,
310*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_CAP_ENC_MAX_SLICES_PER_FRAME);
311*61046927SAndroid Build Coastguard Worker if (maxSlicesPerEncodedPic <= 0)
312*61046927SAndroid Build Coastguard Worker value = VA_ATTRIB_NOT_SUPPORTED;
313*61046927SAndroid Build Coastguard Worker else
314*61046927SAndroid Build Coastguard Worker value = maxSlicesPerEncodedPic;
315*61046927SAndroid Build Coastguard Worker } break;
316*61046927SAndroid Build Coastguard Worker case VAConfigAttribEncMaxRefFrames:
317*61046927SAndroid Build Coastguard Worker {
318*61046927SAndroid Build Coastguard Worker int maxL0L1ReferencesPerFrame = pscreen->get_video_param(pscreen, ProfileToPipe(profile),
319*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_ENTRYPOINT_ENCODE,
320*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_CAP_ENC_MAX_REFERENCES_PER_FRAME);
321*61046927SAndroid Build Coastguard Worker if (maxL0L1ReferencesPerFrame <= 0)
322*61046927SAndroid Build Coastguard Worker value = 1;
323*61046927SAndroid Build Coastguard Worker else
324*61046927SAndroid Build Coastguard Worker value = maxL0L1ReferencesPerFrame;
325*61046927SAndroid Build Coastguard Worker } break;
326*61046927SAndroid Build Coastguard Worker case VAConfigAttribEncSliceStructure:
327*61046927SAndroid Build Coastguard Worker {
328*61046927SAndroid Build Coastguard Worker /* The VA enum values match the pipe_video_cap_slice_structure definitions*/
329*61046927SAndroid Build Coastguard Worker int supportedSliceStructuresFlagSet = pscreen->get_video_param(pscreen, ProfileToPipe(profile),
330*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_ENTRYPOINT_ENCODE,
331*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_CAP_ENC_SLICES_STRUCTURE);
332*61046927SAndroid Build Coastguard Worker if (supportedSliceStructuresFlagSet <= 0)
333*61046927SAndroid Build Coastguard Worker value = VA_ATTRIB_NOT_SUPPORTED;
334*61046927SAndroid Build Coastguard Worker else
335*61046927SAndroid Build Coastguard Worker value = supportedSliceStructuresFlagSet;
336*61046927SAndroid Build Coastguard Worker } break;
337*61046927SAndroid Build Coastguard Worker case VAConfigAttribEncQualityRange:
338*61046927SAndroid Build Coastguard Worker {
339*61046927SAndroid Build Coastguard Worker /*
340*61046927SAndroid Build Coastguard Worker * this quality range provides different options within the range; and it isn't strictly
341*61046927SAndroid Build Coastguard Worker * faster when higher value used.
342*61046927SAndroid Build Coastguard Worker * 0, not used; 1, default value; others are using vlVaQualityBits for different modes.
343*61046927SAndroid Build Coastguard Worker */
344*61046927SAndroid Build Coastguard Worker int quality_range = pscreen->get_video_param(pscreen, ProfileToPipe(profile),
345*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_ENTRYPOINT_ENCODE,
346*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_CAP_ENC_QUALITY_LEVEL);
347*61046927SAndroid Build Coastguard Worker value = quality_range ? quality_range : VA_ATTRIB_NOT_SUPPORTED;
348*61046927SAndroid Build Coastguard Worker } break;
349*61046927SAndroid Build Coastguard Worker case VAConfigAttribMaxFrameSize:
350*61046927SAndroid Build Coastguard Worker {
351*61046927SAndroid Build Coastguard Worker /* Max Frame Size can be used to control picture level frame size.
352*61046927SAndroid Build Coastguard Worker * This frame size is in bits.
353*61046927SAndroid Build Coastguard Worker */
354*61046927SAndroid Build Coastguard Worker value = pscreen->get_video_param(pscreen, ProfileToPipe(profile),
355*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_ENTRYPOINT_ENCODE,
356*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_CAP_ENC_SUPPORTS_MAX_FRAME_SIZE);
357*61046927SAndroid Build Coastguard Worker value = value ? value : VA_ATTRIB_NOT_SUPPORTED;
358*61046927SAndroid Build Coastguard Worker } break;
359*61046927SAndroid Build Coastguard Worker case VAConfigAttribMaxPictureWidth:
360*61046927SAndroid Build Coastguard Worker {
361*61046927SAndroid Build Coastguard Worker value = pscreen->get_video_param(pscreen, ProfileToPipe(profile),
362*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_ENTRYPOINT_ENCODE,
363*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_CAP_MAX_WIDTH);
364*61046927SAndroid Build Coastguard Worker value = value ? value : VA_ATTRIB_NOT_SUPPORTED;
365*61046927SAndroid Build Coastguard Worker } break;
366*61046927SAndroid Build Coastguard Worker case VAConfigAttribMaxPictureHeight:
367*61046927SAndroid Build Coastguard Worker {
368*61046927SAndroid Build Coastguard Worker value = pscreen->get_video_param(pscreen, ProfileToPipe(profile),
369*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_ENTRYPOINT_ENCODE,
370*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_CAP_MAX_HEIGHT);
371*61046927SAndroid Build Coastguard Worker value = value ? value : VA_ATTRIB_NOT_SUPPORTED;
372*61046927SAndroid Build Coastguard Worker } break;
373*61046927SAndroid Build Coastguard Worker #if VA_CHECK_VERSION(1, 12, 0)
374*61046927SAndroid Build Coastguard Worker case VAConfigAttribEncHEVCFeatures:
375*61046927SAndroid Build Coastguard Worker {
376*61046927SAndroid Build Coastguard Worker union pipe_h265_enc_cap_features pipe_features;
377*61046927SAndroid Build Coastguard Worker pipe_features.value = 0u;
378*61046927SAndroid Build Coastguard Worker /* get_video_param sets pipe_features.bits.config_supported = 1
379*61046927SAndroid Build Coastguard Worker to distinguish between supported cap with all bits off and unsupported by driver
380*61046927SAndroid Build Coastguard Worker with value = 0
381*61046927SAndroid Build Coastguard Worker */
382*61046927SAndroid Build Coastguard Worker int supportedHEVCEncFeaturesFlagSet = pscreen->get_video_param(pscreen, ProfileToPipe(profile),
383*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_ENTRYPOINT_ENCODE,
384*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_CAP_ENC_HEVC_FEATURE_FLAGS);
385*61046927SAndroid Build Coastguard Worker if (supportedHEVCEncFeaturesFlagSet <= 0)
386*61046927SAndroid Build Coastguard Worker value = VA_ATTRIB_NOT_SUPPORTED;
387*61046927SAndroid Build Coastguard Worker else {
388*61046927SAndroid Build Coastguard Worker /* Assign unsigned typed variable "value" after checking supportedHEVCEncFeaturesFlagSet > 0 */
389*61046927SAndroid Build Coastguard Worker pipe_features.value = supportedHEVCEncFeaturesFlagSet;
390*61046927SAndroid Build Coastguard Worker VAConfigAttribValEncHEVCFeatures va_features;
391*61046927SAndroid Build Coastguard Worker va_features.value = 0;
392*61046927SAndroid Build Coastguard Worker va_features.bits.separate_colour_planes = pipe_features.bits.separate_colour_planes;
393*61046927SAndroid Build Coastguard Worker va_features.bits.scaling_lists = pipe_features.bits.scaling_lists;
394*61046927SAndroid Build Coastguard Worker va_features.bits.amp = pipe_features.bits.amp;
395*61046927SAndroid Build Coastguard Worker va_features.bits.sao = pipe_features.bits.sao;
396*61046927SAndroid Build Coastguard Worker va_features.bits.pcm = pipe_features.bits.pcm;
397*61046927SAndroid Build Coastguard Worker va_features.bits.temporal_mvp = pipe_features.bits.temporal_mvp;
398*61046927SAndroid Build Coastguard Worker va_features.bits.strong_intra_smoothing = pipe_features.bits.strong_intra_smoothing;
399*61046927SAndroid Build Coastguard Worker va_features.bits.dependent_slices = pipe_features.bits.dependent_slices;
400*61046927SAndroid Build Coastguard Worker va_features.bits.sign_data_hiding = pipe_features.bits.sign_data_hiding;
401*61046927SAndroid Build Coastguard Worker va_features.bits.constrained_intra_pred = pipe_features.bits.constrained_intra_pred;
402*61046927SAndroid Build Coastguard Worker va_features.bits.transform_skip = pipe_features.bits.transform_skip;
403*61046927SAndroid Build Coastguard Worker va_features.bits.cu_qp_delta = pipe_features.bits.cu_qp_delta;
404*61046927SAndroid Build Coastguard Worker va_features.bits.weighted_prediction = pipe_features.bits.weighted_prediction;
405*61046927SAndroid Build Coastguard Worker va_features.bits.transquant_bypass = pipe_features.bits.transquant_bypass;
406*61046927SAndroid Build Coastguard Worker va_features.bits.deblocking_filter_disable = pipe_features.bits.deblocking_filter_disable;
407*61046927SAndroid Build Coastguard Worker value = va_features.value;
408*61046927SAndroid Build Coastguard Worker }
409*61046927SAndroid Build Coastguard Worker } break;
410*61046927SAndroid Build Coastguard Worker case VAConfigAttribEncHEVCBlockSizes:
411*61046927SAndroid Build Coastguard Worker {
412*61046927SAndroid Build Coastguard Worker union pipe_h265_enc_cap_block_sizes pipe_block_sizes;
413*61046927SAndroid Build Coastguard Worker pipe_block_sizes.value = 0;
414*61046927SAndroid Build Coastguard Worker /* get_video_param sets pipe_block_sizes.bits.config_supported = 1
415*61046927SAndroid Build Coastguard Worker to distinguish between supported cap with all bits off and unsupported by driver
416*61046927SAndroid Build Coastguard Worker with value = 0
417*61046927SAndroid Build Coastguard Worker */
418*61046927SAndroid Build Coastguard Worker int supportedHEVCEncBlockSizes = pscreen->get_video_param(pscreen, ProfileToPipe(profile),
419*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_ENTRYPOINT_ENCODE,
420*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_CAP_ENC_HEVC_BLOCK_SIZES);
421*61046927SAndroid Build Coastguard Worker if (supportedHEVCEncBlockSizes <= 0)
422*61046927SAndroid Build Coastguard Worker value = VA_ATTRIB_NOT_SUPPORTED;
423*61046927SAndroid Build Coastguard Worker else {
424*61046927SAndroid Build Coastguard Worker /* Assign unsigned typed variable "value" after checking supportedHEVCEncBlockSizes > 0 */
425*61046927SAndroid Build Coastguard Worker pipe_block_sizes.value = supportedHEVCEncBlockSizes;
426*61046927SAndroid Build Coastguard Worker VAConfigAttribValEncHEVCBlockSizes va_block_sizes;
427*61046927SAndroid Build Coastguard Worker va_block_sizes.value = 0;
428*61046927SAndroid Build Coastguard Worker va_block_sizes.bits.log2_max_coding_tree_block_size_minus3 =
429*61046927SAndroid Build Coastguard Worker pipe_block_sizes.bits.log2_max_coding_tree_block_size_minus3;
430*61046927SAndroid Build Coastguard Worker va_block_sizes.bits.log2_min_coding_tree_block_size_minus3 =
431*61046927SAndroid Build Coastguard Worker pipe_block_sizes.bits.log2_min_coding_tree_block_size_minus3;
432*61046927SAndroid Build Coastguard Worker va_block_sizes.bits.log2_min_luma_coding_block_size_minus3 =
433*61046927SAndroid Build Coastguard Worker pipe_block_sizes.bits.log2_min_luma_coding_block_size_minus3;
434*61046927SAndroid Build Coastguard Worker va_block_sizes.bits.log2_max_luma_transform_block_size_minus2 =
435*61046927SAndroid Build Coastguard Worker pipe_block_sizes.bits.log2_max_luma_transform_block_size_minus2;
436*61046927SAndroid Build Coastguard Worker va_block_sizes.bits.log2_min_luma_transform_block_size_minus2 =
437*61046927SAndroid Build Coastguard Worker pipe_block_sizes.bits.log2_min_luma_transform_block_size_minus2;
438*61046927SAndroid Build Coastguard Worker va_block_sizes.bits.max_max_transform_hierarchy_depth_inter =
439*61046927SAndroid Build Coastguard Worker pipe_block_sizes.bits.max_max_transform_hierarchy_depth_inter;
440*61046927SAndroid Build Coastguard Worker va_block_sizes.bits.min_max_transform_hierarchy_depth_inter =
441*61046927SAndroid Build Coastguard Worker pipe_block_sizes.bits.min_max_transform_hierarchy_depth_inter;
442*61046927SAndroid Build Coastguard Worker va_block_sizes.bits.max_max_transform_hierarchy_depth_intra =
443*61046927SAndroid Build Coastguard Worker pipe_block_sizes.bits.max_max_transform_hierarchy_depth_intra;
444*61046927SAndroid Build Coastguard Worker va_block_sizes.bits.min_max_transform_hierarchy_depth_intra =
445*61046927SAndroid Build Coastguard Worker pipe_block_sizes.bits.min_max_transform_hierarchy_depth_intra;
446*61046927SAndroid Build Coastguard Worker va_block_sizes.bits.log2_max_pcm_coding_block_size_minus3 =
447*61046927SAndroid Build Coastguard Worker pipe_block_sizes.bits.log2_max_pcm_coding_block_size_minus3;
448*61046927SAndroid Build Coastguard Worker va_block_sizes.bits.log2_min_pcm_coding_block_size_minus3 =
449*61046927SAndroid Build Coastguard Worker pipe_block_sizes.bits.log2_min_pcm_coding_block_size_minus3;
450*61046927SAndroid Build Coastguard Worker value = va_block_sizes.value;
451*61046927SAndroid Build Coastguard Worker }
452*61046927SAndroid Build Coastguard Worker } break;
453*61046927SAndroid Build Coastguard Worker #endif
454*61046927SAndroid Build Coastguard Worker #if VA_CHECK_VERSION(1, 6, 0)
455*61046927SAndroid Build Coastguard Worker case VAConfigAttribPredictionDirection:
456*61046927SAndroid Build Coastguard Worker {
457*61046927SAndroid Build Coastguard Worker /* The VA enum values match the pipe_h265_enc_pred_direction definitions*/
458*61046927SAndroid Build Coastguard Worker int h265_enc_pred_direction = pscreen->get_video_param(pscreen, ProfileToPipe(profile),
459*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_ENTRYPOINT_ENCODE,
460*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_CAP_ENC_HEVC_PREDICTION_DIRECTION);
461*61046927SAndroid Build Coastguard Worker if (h265_enc_pred_direction <= 0)
462*61046927SAndroid Build Coastguard Worker value = VA_ATTRIB_NOT_SUPPORTED;
463*61046927SAndroid Build Coastguard Worker else
464*61046927SAndroid Build Coastguard Worker value = h265_enc_pred_direction;
465*61046927SAndroid Build Coastguard Worker } break;
466*61046927SAndroid Build Coastguard Worker #endif
467*61046927SAndroid Build Coastguard Worker #if VA_CHECK_VERSION(1, 16, 0)
468*61046927SAndroid Build Coastguard Worker case VAConfigAttribEncAV1:
469*61046927SAndroid Build Coastguard Worker {
470*61046927SAndroid Build Coastguard Worker union pipe_av1_enc_cap_features features;
471*61046927SAndroid Build Coastguard Worker features.value = 0;
472*61046927SAndroid Build Coastguard Worker
473*61046927SAndroid Build Coastguard Worker int support = pscreen->get_video_param(pscreen, ProfileToPipe(profile),
474*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_ENTRYPOINT_ENCODE,
475*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_CAP_ENC_AV1_FEATURE);
476*61046927SAndroid Build Coastguard Worker if (support <= 0)
477*61046927SAndroid Build Coastguard Worker value = VA_ATTRIB_NOT_SUPPORTED;
478*61046927SAndroid Build Coastguard Worker else {
479*61046927SAndroid Build Coastguard Worker VAConfigAttribValEncAV1 attrib;
480*61046927SAndroid Build Coastguard Worker features.value = support;
481*61046927SAndroid Build Coastguard Worker attrib.value = features.value;
482*61046927SAndroid Build Coastguard Worker value = attrib.value;
483*61046927SAndroid Build Coastguard Worker }
484*61046927SAndroid Build Coastguard Worker } break;
485*61046927SAndroid Build Coastguard Worker case VAConfigAttribEncAV1Ext1:
486*61046927SAndroid Build Coastguard Worker {
487*61046927SAndroid Build Coastguard Worker union pipe_av1_enc_cap_features_ext1 features_ext1;
488*61046927SAndroid Build Coastguard Worker features_ext1.value = 0;
489*61046927SAndroid Build Coastguard Worker int support = pscreen->get_video_param(pscreen, ProfileToPipe(profile),
490*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_ENTRYPOINT_ENCODE,
491*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_CAP_ENC_AV1_FEATURE_EXT1);
492*61046927SAndroid Build Coastguard Worker if (support <= 0)
493*61046927SAndroid Build Coastguard Worker value = VA_ATTRIB_NOT_SUPPORTED;
494*61046927SAndroid Build Coastguard Worker else {
495*61046927SAndroid Build Coastguard Worker VAConfigAttribValEncAV1Ext1 attrib;
496*61046927SAndroid Build Coastguard Worker features_ext1.value = support;
497*61046927SAndroid Build Coastguard Worker attrib.value = features_ext1.value;
498*61046927SAndroid Build Coastguard Worker value = attrib.value;
499*61046927SAndroid Build Coastguard Worker }
500*61046927SAndroid Build Coastguard Worker
501*61046927SAndroid Build Coastguard Worker } break;
502*61046927SAndroid Build Coastguard Worker case VAConfigAttribEncAV1Ext2:
503*61046927SAndroid Build Coastguard Worker {
504*61046927SAndroid Build Coastguard Worker union pipe_av1_enc_cap_features_ext2 features_ext2;
505*61046927SAndroid Build Coastguard Worker features_ext2.value = 0;
506*61046927SAndroid Build Coastguard Worker
507*61046927SAndroid Build Coastguard Worker int support = pscreen->get_video_param(pscreen, ProfileToPipe(profile),
508*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_ENTRYPOINT_ENCODE,
509*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_CAP_ENC_AV1_FEATURE_EXT2);
510*61046927SAndroid Build Coastguard Worker if (support <= 0)
511*61046927SAndroid Build Coastguard Worker value = VA_ATTRIB_NOT_SUPPORTED;
512*61046927SAndroid Build Coastguard Worker else {
513*61046927SAndroid Build Coastguard Worker VAConfigAttribValEncAV1Ext2 attrib;
514*61046927SAndroid Build Coastguard Worker features_ext2.value = support;
515*61046927SAndroid Build Coastguard Worker attrib.value = features_ext2.value;
516*61046927SAndroid Build Coastguard Worker value = attrib.value;
517*61046927SAndroid Build Coastguard Worker }
518*61046927SAndroid Build Coastguard Worker
519*61046927SAndroid Build Coastguard Worker } break;
520*61046927SAndroid Build Coastguard Worker case VAConfigAttribEncTileSupport:
521*61046927SAndroid Build Coastguard Worker {
522*61046927SAndroid Build Coastguard Worker int encode_tile_support = pscreen->get_video_param(pscreen, ProfileToPipe(profile),
523*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_ENTRYPOINT_ENCODE,
524*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_CAP_ENC_SUPPORTS_TILE);
525*61046927SAndroid Build Coastguard Worker if (encode_tile_support <= 0)
526*61046927SAndroid Build Coastguard Worker value = VA_ATTRIB_NOT_SUPPORTED;
527*61046927SAndroid Build Coastguard Worker else
528*61046927SAndroid Build Coastguard Worker value = encode_tile_support;
529*61046927SAndroid Build Coastguard Worker } break;
530*61046927SAndroid Build Coastguard Worker #endif
531*61046927SAndroid Build Coastguard Worker #if VA_CHECK_VERSION(1, 21, 0)
532*61046927SAndroid Build Coastguard Worker case VAConfigAttribEncMaxTileRows:
533*61046927SAndroid Build Coastguard Worker {
534*61046927SAndroid Build Coastguard Worker int max_tile_rows = pscreen->get_video_param(pscreen, ProfileToPipe(profile),
535*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_ENTRYPOINT_ENCODE,
536*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_CAP_ENC_MAX_TILE_ROWS);
537*61046927SAndroid Build Coastguard Worker if (max_tile_rows <= 0)
538*61046927SAndroid Build Coastguard Worker value = VA_ATTRIB_NOT_SUPPORTED;
539*61046927SAndroid Build Coastguard Worker else
540*61046927SAndroid Build Coastguard Worker value = max_tile_rows;
541*61046927SAndroid Build Coastguard Worker } break;
542*61046927SAndroid Build Coastguard Worker case VAConfigAttribEncMaxTileCols:
543*61046927SAndroid Build Coastguard Worker {
544*61046927SAndroid Build Coastguard Worker int max_tile_cols = pscreen->get_video_param(pscreen, ProfileToPipe(profile),
545*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_ENTRYPOINT_ENCODE,
546*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_CAP_ENC_MAX_TILE_COLS);
547*61046927SAndroid Build Coastguard Worker if (max_tile_cols <= 0)
548*61046927SAndroid Build Coastguard Worker value = VA_ATTRIB_NOT_SUPPORTED;
549*61046927SAndroid Build Coastguard Worker else
550*61046927SAndroid Build Coastguard Worker value = max_tile_cols;
551*61046927SAndroid Build Coastguard Worker } break;
552*61046927SAndroid Build Coastguard Worker #endif
553*61046927SAndroid Build Coastguard Worker case VAConfigAttribEncIntraRefresh:
554*61046927SAndroid Build Coastguard Worker {
555*61046927SAndroid Build Coastguard Worker int ir_support = pscreen->get_video_param(pscreen, ProfileToPipe(profile),
556*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_ENTRYPOINT_ENCODE,
557*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_CAP_ENC_INTRA_REFRESH);
558*61046927SAndroid Build Coastguard Worker if (ir_support <= 0)
559*61046927SAndroid Build Coastguard Worker value = VA_ATTRIB_NOT_SUPPORTED;
560*61046927SAndroid Build Coastguard Worker else
561*61046927SAndroid Build Coastguard Worker value = ir_support;
562*61046927SAndroid Build Coastguard Worker } break;
563*61046927SAndroid Build Coastguard Worker
564*61046927SAndroid Build Coastguard Worker case VAConfigAttribEncROI:
565*61046927SAndroid Build Coastguard Worker {
566*61046927SAndroid Build Coastguard Worker int roi_support = pscreen->get_video_param(pscreen, ProfileToPipe(profile),
567*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_ENTRYPOINT_ENCODE,
568*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_CAP_ENC_ROI);
569*61046927SAndroid Build Coastguard Worker if (roi_support <= 0)
570*61046927SAndroid Build Coastguard Worker value = VA_ATTRIB_NOT_SUPPORTED;
571*61046927SAndroid Build Coastguard Worker else
572*61046927SAndroid Build Coastguard Worker value = roi_support;
573*61046927SAndroid Build Coastguard Worker } break;
574*61046927SAndroid Build Coastguard Worker
575*61046927SAndroid Build Coastguard Worker default:
576*61046927SAndroid Build Coastguard Worker value = VA_ATTRIB_NOT_SUPPORTED;
577*61046927SAndroid Build Coastguard Worker break;
578*61046927SAndroid Build Coastguard Worker }
579*61046927SAndroid Build Coastguard Worker } else if (entrypoint == VAEntrypointVideoProc) {
580*61046927SAndroid Build Coastguard Worker switch (attrib_list[i].type) {
581*61046927SAndroid Build Coastguard Worker case VAConfigAttribRTFormat:
582*61046927SAndroid Build Coastguard Worker value = get_screen_supported_va_rt_formats(pscreen,
583*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_PROFILE_UNKNOWN,
584*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_ENTRYPOINT_PROCESSING);
585*61046927SAndroid Build Coastguard Worker break;
586*61046927SAndroid Build Coastguard Worker default:
587*61046927SAndroid Build Coastguard Worker value = VA_ATTRIB_NOT_SUPPORTED;
588*61046927SAndroid Build Coastguard Worker break;
589*61046927SAndroid Build Coastguard Worker }
590*61046927SAndroid Build Coastguard Worker } else {
591*61046927SAndroid Build Coastguard Worker value = VA_ATTRIB_NOT_SUPPORTED;
592*61046927SAndroid Build Coastguard Worker }
593*61046927SAndroid Build Coastguard Worker attrib_list[i].value = value;
594*61046927SAndroid Build Coastguard Worker }
595*61046927SAndroid Build Coastguard Worker
596*61046927SAndroid Build Coastguard Worker return VA_STATUS_SUCCESS;
597*61046927SAndroid Build Coastguard Worker }
598*61046927SAndroid Build Coastguard Worker
599*61046927SAndroid Build Coastguard Worker VAStatus
vlVaCreateConfig(VADriverContextP ctx,VAProfile profile,VAEntrypoint entrypoint,VAConfigAttrib * attrib_list,int num_attribs,VAConfigID * config_id)600*61046927SAndroid Build Coastguard Worker vlVaCreateConfig(VADriverContextP ctx, VAProfile profile, VAEntrypoint entrypoint,
601*61046927SAndroid Build Coastguard Worker VAConfigAttrib *attrib_list, int num_attribs, VAConfigID *config_id)
602*61046927SAndroid Build Coastguard Worker {
603*61046927SAndroid Build Coastguard Worker vlVaDriver *drv;
604*61046927SAndroid Build Coastguard Worker vlVaConfig *config;
605*61046927SAndroid Build Coastguard Worker struct pipe_screen *pscreen;
606*61046927SAndroid Build Coastguard Worker enum pipe_video_profile p;
607*61046927SAndroid Build Coastguard Worker unsigned int supported_rt_formats;
608*61046927SAndroid Build Coastguard Worker
609*61046927SAndroid Build Coastguard Worker if (!ctx)
610*61046927SAndroid Build Coastguard Worker return VA_STATUS_ERROR_INVALID_CONTEXT;
611*61046927SAndroid Build Coastguard Worker
612*61046927SAndroid Build Coastguard Worker drv = VL_VA_DRIVER(ctx);
613*61046927SAndroid Build Coastguard Worker pscreen = VL_VA_PSCREEN(ctx);
614*61046927SAndroid Build Coastguard Worker
615*61046927SAndroid Build Coastguard Worker if (!drv)
616*61046927SAndroid Build Coastguard Worker return VA_STATUS_ERROR_INVALID_CONTEXT;
617*61046927SAndroid Build Coastguard Worker
618*61046927SAndroid Build Coastguard Worker config = CALLOC(1, sizeof(vlVaConfig));
619*61046927SAndroid Build Coastguard Worker if (!config)
620*61046927SAndroid Build Coastguard Worker return VA_STATUS_ERROR_ALLOCATION_FAILED;
621*61046927SAndroid Build Coastguard Worker
622*61046927SAndroid Build Coastguard Worker if (profile == VAProfileNone) {
623*61046927SAndroid Build Coastguard Worker if (entrypoint != VAEntrypointVideoProc) {
624*61046927SAndroid Build Coastguard Worker FREE(config);
625*61046927SAndroid Build Coastguard Worker return VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT;
626*61046927SAndroid Build Coastguard Worker }
627*61046927SAndroid Build Coastguard Worker
628*61046927SAndroid Build Coastguard Worker config->entrypoint = PIPE_VIDEO_ENTRYPOINT_PROCESSING;
629*61046927SAndroid Build Coastguard Worker config->profile = PIPE_VIDEO_PROFILE_UNKNOWN;
630*61046927SAndroid Build Coastguard Worker supported_rt_formats = get_screen_supported_va_rt_formats(pscreen,
631*61046927SAndroid Build Coastguard Worker config->profile,
632*61046927SAndroid Build Coastguard Worker config->entrypoint);
633*61046927SAndroid Build Coastguard Worker for (int i = 0; i < num_attribs; i++) {
634*61046927SAndroid Build Coastguard Worker if (attrib_list[i].type == VAConfigAttribRTFormat) {
635*61046927SAndroid Build Coastguard Worker if (attrib_list[i].value & supported_rt_formats) {
636*61046927SAndroid Build Coastguard Worker config->rt_format = attrib_list[i].value;
637*61046927SAndroid Build Coastguard Worker } else {
638*61046927SAndroid Build Coastguard Worker FREE(config);
639*61046927SAndroid Build Coastguard Worker return VA_STATUS_ERROR_UNSUPPORTED_RT_FORMAT;
640*61046927SAndroid Build Coastguard Worker }
641*61046927SAndroid Build Coastguard Worker } else {
642*61046927SAndroid Build Coastguard Worker /*other attrib_types are not supported.*/
643*61046927SAndroid Build Coastguard Worker FREE(config);
644*61046927SAndroid Build Coastguard Worker return VA_STATUS_ERROR_INVALID_VALUE;
645*61046927SAndroid Build Coastguard Worker }
646*61046927SAndroid Build Coastguard Worker }
647*61046927SAndroid Build Coastguard Worker
648*61046927SAndroid Build Coastguard Worker /* Default value if not specified in the input attributes. */
649*61046927SAndroid Build Coastguard Worker if (!config->rt_format)
650*61046927SAndroid Build Coastguard Worker config->rt_format = supported_rt_formats;
651*61046927SAndroid Build Coastguard Worker
652*61046927SAndroid Build Coastguard Worker mtx_lock(&drv->mutex);
653*61046927SAndroid Build Coastguard Worker *config_id = handle_table_add(drv->htab, config);
654*61046927SAndroid Build Coastguard Worker mtx_unlock(&drv->mutex);
655*61046927SAndroid Build Coastguard Worker return VA_STATUS_SUCCESS;
656*61046927SAndroid Build Coastguard Worker }
657*61046927SAndroid Build Coastguard Worker
658*61046927SAndroid Build Coastguard Worker p = ProfileToPipe(profile);
659*61046927SAndroid Build Coastguard Worker if (p == PIPE_VIDEO_PROFILE_UNKNOWN ||
660*61046927SAndroid Build Coastguard Worker (u_reduce_video_profile(p) == PIPE_VIDEO_FORMAT_MPEG4 &&
661*61046927SAndroid Build Coastguard Worker !debug_get_option_mpeg4())) {
662*61046927SAndroid Build Coastguard Worker FREE(config);
663*61046927SAndroid Build Coastguard Worker return VA_STATUS_ERROR_UNSUPPORTED_PROFILE;
664*61046927SAndroid Build Coastguard Worker }
665*61046927SAndroid Build Coastguard Worker
666*61046927SAndroid Build Coastguard Worker switch (entrypoint) {
667*61046927SAndroid Build Coastguard Worker case VAEntrypointVLD:
668*61046927SAndroid Build Coastguard Worker if (!vl_codec_supported(pscreen, p, false)) {
669*61046927SAndroid Build Coastguard Worker FREE(config);
670*61046927SAndroid Build Coastguard Worker if (!vl_codec_supported(pscreen, p, true))
671*61046927SAndroid Build Coastguard Worker return VA_STATUS_ERROR_UNSUPPORTED_PROFILE;
672*61046927SAndroid Build Coastguard Worker else
673*61046927SAndroid Build Coastguard Worker return VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT;
674*61046927SAndroid Build Coastguard Worker }
675*61046927SAndroid Build Coastguard Worker
676*61046927SAndroid Build Coastguard Worker config->entrypoint = PIPE_VIDEO_ENTRYPOINT_BITSTREAM;
677*61046927SAndroid Build Coastguard Worker break;
678*61046927SAndroid Build Coastguard Worker
679*61046927SAndroid Build Coastguard Worker case VAEntrypointEncSlice:
680*61046927SAndroid Build Coastguard Worker if (!vl_codec_supported(pscreen, p, true)) {
681*61046927SAndroid Build Coastguard Worker FREE(config);
682*61046927SAndroid Build Coastguard Worker if (!vl_codec_supported(pscreen, p, false))
683*61046927SAndroid Build Coastguard Worker return VA_STATUS_ERROR_UNSUPPORTED_PROFILE;
684*61046927SAndroid Build Coastguard Worker else
685*61046927SAndroid Build Coastguard Worker return VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT;
686*61046927SAndroid Build Coastguard Worker }
687*61046927SAndroid Build Coastguard Worker
688*61046927SAndroid Build Coastguard Worker config->entrypoint = PIPE_VIDEO_ENTRYPOINT_ENCODE;
689*61046927SAndroid Build Coastguard Worker break;
690*61046927SAndroid Build Coastguard Worker
691*61046927SAndroid Build Coastguard Worker default:
692*61046927SAndroid Build Coastguard Worker FREE(config);
693*61046927SAndroid Build Coastguard Worker if (!vl_codec_supported(pscreen, p, false) &&
694*61046927SAndroid Build Coastguard Worker !vl_codec_supported(pscreen, p, true))
695*61046927SAndroid Build Coastguard Worker return VA_STATUS_ERROR_UNSUPPORTED_PROFILE;
696*61046927SAndroid Build Coastguard Worker else
697*61046927SAndroid Build Coastguard Worker return VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT;
698*61046927SAndroid Build Coastguard Worker }
699*61046927SAndroid Build Coastguard Worker
700*61046927SAndroid Build Coastguard Worker config->profile = p;
701*61046927SAndroid Build Coastguard Worker supported_rt_formats = get_screen_supported_va_rt_formats(pscreen,
702*61046927SAndroid Build Coastguard Worker config->profile,
703*61046927SAndroid Build Coastguard Worker config->entrypoint);
704*61046927SAndroid Build Coastguard Worker for (int i = 0; i <num_attribs ; i++) {
705*61046927SAndroid Build Coastguard Worker if (attrib_list[i].type != VAConfigAttribRTFormat &&
706*61046927SAndroid Build Coastguard Worker entrypoint == VAEntrypointVLD ) {
707*61046927SAndroid Build Coastguard Worker FREE(config);
708*61046927SAndroid Build Coastguard Worker return VA_STATUS_ERROR_INVALID_VALUE;
709*61046927SAndroid Build Coastguard Worker }
710*61046927SAndroid Build Coastguard Worker if (attrib_list[i].type == VAConfigAttribRateControl) {
711*61046927SAndroid Build Coastguard Worker if (attrib_list[i].value == VA_RC_CBR)
712*61046927SAndroid Build Coastguard Worker config->rc = PIPE_H2645_ENC_RATE_CONTROL_METHOD_CONSTANT;
713*61046927SAndroid Build Coastguard Worker else if (attrib_list[i].value == VA_RC_VBR)
714*61046927SAndroid Build Coastguard Worker config->rc = PIPE_H2645_ENC_RATE_CONTROL_METHOD_VARIABLE;
715*61046927SAndroid Build Coastguard Worker else if (attrib_list[i].value == VA_RC_CQP)
716*61046927SAndroid Build Coastguard Worker config->rc = PIPE_H2645_ENC_RATE_CONTROL_METHOD_DISABLE;
717*61046927SAndroid Build Coastguard Worker else if (attrib_list[i].value == VA_RC_QVBR &&
718*61046927SAndroid Build Coastguard Worker (pscreen->get_video_param(pscreen, ProfileToPipe(profile),
719*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_ENTRYPOINT_ENCODE,
720*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_CAP_ENC_RATE_CONTROL_QVBR) > 0))
721*61046927SAndroid Build Coastguard Worker config->rc = PIPE_H2645_ENC_RATE_CONTROL_METHOD_QUALITY_VARIABLE;
722*61046927SAndroid Build Coastguard Worker else {
723*61046927SAndroid Build Coastguard Worker FREE(config);
724*61046927SAndroid Build Coastguard Worker return VA_STATUS_ERROR_INVALID_VALUE;
725*61046927SAndroid Build Coastguard Worker }
726*61046927SAndroid Build Coastguard Worker }
727*61046927SAndroid Build Coastguard Worker if (attrib_list[i].type == VAConfigAttribRTFormat) {
728*61046927SAndroid Build Coastguard Worker if (attrib_list[i].value & supported_rt_formats) {
729*61046927SAndroid Build Coastguard Worker config->rt_format = attrib_list[i].value;
730*61046927SAndroid Build Coastguard Worker } else {
731*61046927SAndroid Build Coastguard Worker FREE(config);
732*61046927SAndroid Build Coastguard Worker return VA_STATUS_ERROR_UNSUPPORTED_RT_FORMAT;
733*61046927SAndroid Build Coastguard Worker }
734*61046927SAndroid Build Coastguard Worker }
735*61046927SAndroid Build Coastguard Worker if (attrib_list[i].type == VAConfigAttribEncPackedHeaders) {
736*61046927SAndroid Build Coastguard Worker uint32_t attrib_value = attrib_list[i].value;
737*61046927SAndroid Build Coastguard Worker if (config->entrypoint != PIPE_VIDEO_ENTRYPOINT_ENCODE ||
738*61046927SAndroid Build Coastguard Worker (((attrib_value != 0)) &&
739*61046927SAndroid Build Coastguard Worker ((attrib_value & ENC_PACKED_HEADERS_H264) != attrib_value ||
740*61046927SAndroid Build Coastguard Worker u_reduce_video_profile(ProfileToPipe(profile)) != PIPE_VIDEO_FORMAT_MPEG4_AVC) &&
741*61046927SAndroid Build Coastguard Worker ((attrib_value & ENC_PACKED_HEADERS_HEVC) != attrib_value ||
742*61046927SAndroid Build Coastguard Worker u_reduce_video_profile(ProfileToPipe(profile)) != PIPE_VIDEO_FORMAT_HEVC) &&
743*61046927SAndroid Build Coastguard Worker ((attrib_value & ENC_PACKED_HEADERS_AV1) != attrib_value ||
744*61046927SAndroid Build Coastguard Worker u_reduce_video_profile(ProfileToPipe(profile)) != PIPE_VIDEO_FORMAT_AV1))) {
745*61046927SAndroid Build Coastguard Worker FREE(config);
746*61046927SAndroid Build Coastguard Worker return VA_STATUS_ERROR_INVALID_VALUE;
747*61046927SAndroid Build Coastguard Worker }
748*61046927SAndroid Build Coastguard Worker }
749*61046927SAndroid Build Coastguard Worker }
750*61046927SAndroid Build Coastguard Worker
751*61046927SAndroid Build Coastguard Worker /* Default value if not specified in the input attributes. */
752*61046927SAndroid Build Coastguard Worker if (!config->rt_format)
753*61046927SAndroid Build Coastguard Worker config->rt_format = supported_rt_formats;
754*61046927SAndroid Build Coastguard Worker
755*61046927SAndroid Build Coastguard Worker mtx_lock(&drv->mutex);
756*61046927SAndroid Build Coastguard Worker *config_id = handle_table_add(drv->htab, config);
757*61046927SAndroid Build Coastguard Worker mtx_unlock(&drv->mutex);
758*61046927SAndroid Build Coastguard Worker
759*61046927SAndroid Build Coastguard Worker return VA_STATUS_SUCCESS;
760*61046927SAndroid Build Coastguard Worker }
761*61046927SAndroid Build Coastguard Worker
762*61046927SAndroid Build Coastguard Worker VAStatus
vlVaDestroyConfig(VADriverContextP ctx,VAConfigID config_id)763*61046927SAndroid Build Coastguard Worker vlVaDestroyConfig(VADriverContextP ctx, VAConfigID config_id)
764*61046927SAndroid Build Coastguard Worker {
765*61046927SAndroid Build Coastguard Worker vlVaDriver *drv;
766*61046927SAndroid Build Coastguard Worker vlVaConfig *config;
767*61046927SAndroid Build Coastguard Worker
768*61046927SAndroid Build Coastguard Worker if (!ctx)
769*61046927SAndroid Build Coastguard Worker return VA_STATUS_ERROR_INVALID_CONTEXT;
770*61046927SAndroid Build Coastguard Worker
771*61046927SAndroid Build Coastguard Worker drv = VL_VA_DRIVER(ctx);
772*61046927SAndroid Build Coastguard Worker
773*61046927SAndroid Build Coastguard Worker if (!drv)
774*61046927SAndroid Build Coastguard Worker return VA_STATUS_ERROR_INVALID_CONTEXT;
775*61046927SAndroid Build Coastguard Worker
776*61046927SAndroid Build Coastguard Worker mtx_lock(&drv->mutex);
777*61046927SAndroid Build Coastguard Worker config = handle_table_get(drv->htab, config_id);
778*61046927SAndroid Build Coastguard Worker
779*61046927SAndroid Build Coastguard Worker if (!config) {
780*61046927SAndroid Build Coastguard Worker mtx_unlock(&drv->mutex);
781*61046927SAndroid Build Coastguard Worker return VA_STATUS_ERROR_INVALID_CONFIG;
782*61046927SAndroid Build Coastguard Worker }
783*61046927SAndroid Build Coastguard Worker
784*61046927SAndroid Build Coastguard Worker FREE(config);
785*61046927SAndroid Build Coastguard Worker handle_table_remove(drv->htab, config_id);
786*61046927SAndroid Build Coastguard Worker mtx_unlock(&drv->mutex);
787*61046927SAndroid Build Coastguard Worker
788*61046927SAndroid Build Coastguard Worker return VA_STATUS_SUCCESS;
789*61046927SAndroid Build Coastguard Worker }
790*61046927SAndroid Build Coastguard Worker
791*61046927SAndroid Build Coastguard Worker VAStatus
vlVaQueryConfigAttributes(VADriverContextP ctx,VAConfigID config_id,VAProfile * profile,VAEntrypoint * entrypoint,VAConfigAttrib * attrib_list,int * num_attribs)792*61046927SAndroid Build Coastguard Worker vlVaQueryConfigAttributes(VADriverContextP ctx, VAConfigID config_id, VAProfile *profile,
793*61046927SAndroid Build Coastguard Worker VAEntrypoint *entrypoint, VAConfigAttrib *attrib_list, int *num_attribs)
794*61046927SAndroid Build Coastguard Worker {
795*61046927SAndroid Build Coastguard Worker vlVaDriver *drv;
796*61046927SAndroid Build Coastguard Worker vlVaConfig *config;
797*61046927SAndroid Build Coastguard Worker
798*61046927SAndroid Build Coastguard Worker if (!ctx)
799*61046927SAndroid Build Coastguard Worker return VA_STATUS_ERROR_INVALID_CONTEXT;
800*61046927SAndroid Build Coastguard Worker
801*61046927SAndroid Build Coastguard Worker drv = VL_VA_DRIVER(ctx);
802*61046927SAndroid Build Coastguard Worker
803*61046927SAndroid Build Coastguard Worker if (!drv)
804*61046927SAndroid Build Coastguard Worker return VA_STATUS_ERROR_INVALID_CONTEXT;
805*61046927SAndroid Build Coastguard Worker
806*61046927SAndroid Build Coastguard Worker mtx_lock(&drv->mutex);
807*61046927SAndroid Build Coastguard Worker config = handle_table_get(drv->htab, config_id);
808*61046927SAndroid Build Coastguard Worker mtx_unlock(&drv->mutex);
809*61046927SAndroid Build Coastguard Worker
810*61046927SAndroid Build Coastguard Worker if (!config)
811*61046927SAndroid Build Coastguard Worker return VA_STATUS_ERROR_INVALID_CONFIG;
812*61046927SAndroid Build Coastguard Worker
813*61046927SAndroid Build Coastguard Worker *profile = PipeToProfile(config->profile);
814*61046927SAndroid Build Coastguard Worker
815*61046927SAndroid Build Coastguard Worker switch (config->entrypoint) {
816*61046927SAndroid Build Coastguard Worker case PIPE_VIDEO_ENTRYPOINT_BITSTREAM:
817*61046927SAndroid Build Coastguard Worker *entrypoint = VAEntrypointVLD;
818*61046927SAndroid Build Coastguard Worker break;
819*61046927SAndroid Build Coastguard Worker case PIPE_VIDEO_ENTRYPOINT_ENCODE:
820*61046927SAndroid Build Coastguard Worker *entrypoint = VAEntrypointEncSlice;
821*61046927SAndroid Build Coastguard Worker break;
822*61046927SAndroid Build Coastguard Worker case PIPE_VIDEO_ENTRYPOINT_PROCESSING:
823*61046927SAndroid Build Coastguard Worker *entrypoint = VAEntrypointVideoProc;
824*61046927SAndroid Build Coastguard Worker break;
825*61046927SAndroid Build Coastguard Worker default:
826*61046927SAndroid Build Coastguard Worker return VA_STATUS_ERROR_INVALID_CONFIG;
827*61046927SAndroid Build Coastguard Worker }
828*61046927SAndroid Build Coastguard Worker
829*61046927SAndroid Build Coastguard Worker *num_attribs = 1;
830*61046927SAndroid Build Coastguard Worker attrib_list[0].type = VAConfigAttribRTFormat;
831*61046927SAndroid Build Coastguard Worker attrib_list[0].value = config->rt_format;
832*61046927SAndroid Build Coastguard Worker
833*61046927SAndroid Build Coastguard Worker return VA_STATUS_SUCCESS;
834*61046927SAndroid Build Coastguard Worker }
835