1*61046927SAndroid Build Coastguard Worker /**************************************************************************
2*61046927SAndroid Build Coastguard Worker *
3*61046927SAndroid Build Coastguard Worker * Copyright 2010 Younes Manton.
4*61046927SAndroid Build Coastguard Worker * All Rights Reserved.
5*61046927SAndroid Build Coastguard Worker *
6*61046927SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
7*61046927SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the
8*61046927SAndroid Build Coastguard Worker * "Software"), to deal in the Software without restriction, including
9*61046927SAndroid Build Coastguard Worker * without limitation the rights to use, copy, modify, merge, publish,
10*61046927SAndroid Build Coastguard Worker * distribute, sub license, and/or sell copies of the Software, and to
11*61046927SAndroid Build Coastguard Worker * permit persons to whom the Software is furnished to do so, subject to
12*61046927SAndroid Build Coastguard Worker * the following conditions:
13*61046927SAndroid Build Coastguard Worker *
14*61046927SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the
15*61046927SAndroid Build Coastguard Worker * next paragraph) shall be included in all copies or substantial portions
16*61046927SAndroid Build Coastguard Worker * of the Software.
17*61046927SAndroid Build Coastguard Worker *
18*61046927SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19*61046927SAndroid Build Coastguard Worker * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20*61046927SAndroid Build Coastguard Worker * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21*61046927SAndroid Build Coastguard Worker * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22*61046927SAndroid Build Coastguard Worker * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23*61046927SAndroid Build Coastguard Worker * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24*61046927SAndroid Build Coastguard Worker * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25*61046927SAndroid Build Coastguard Worker *
26*61046927SAndroid Build Coastguard Worker **************************************************************************/
27*61046927SAndroid Build Coastguard Worker
28*61046927SAndroid Build Coastguard Worker #include <assert.h>
29*61046927SAndroid Build Coastguard Worker #include <math.h>
30*61046927SAndroid Build Coastguard Worker
31*61046927SAndroid Build Coastguard Worker #include "vdpau_private.h"
32*61046927SAndroid Build Coastguard Worker #include "pipe/p_screen.h"
33*61046927SAndroid Build Coastguard Worker #include "pipe/p_defines.h"
34*61046927SAndroid Build Coastguard Worker #include "util/u_debug.h"
35*61046927SAndroid Build Coastguard Worker
36*61046927SAndroid Build Coastguard Worker #include "vl/vl_codec.h"
37*61046927SAndroid Build Coastguard Worker
38*61046927SAndroid Build Coastguard Worker /**
39*61046927SAndroid Build Coastguard Worker * Retrieve the VDPAU version implemented by the backend.
40*61046927SAndroid Build Coastguard Worker */
41*61046927SAndroid Build Coastguard Worker VdpStatus
vlVdpGetApiVersion(uint32_t * api_version)42*61046927SAndroid Build Coastguard Worker vlVdpGetApiVersion(uint32_t *api_version)
43*61046927SAndroid Build Coastguard Worker {
44*61046927SAndroid Build Coastguard Worker if (!api_version)
45*61046927SAndroid Build Coastguard Worker return VDP_STATUS_INVALID_POINTER;
46*61046927SAndroid Build Coastguard Worker
47*61046927SAndroid Build Coastguard Worker *api_version = 1;
48*61046927SAndroid Build Coastguard Worker return VDP_STATUS_OK;
49*61046927SAndroid Build Coastguard Worker }
50*61046927SAndroid Build Coastguard Worker
51*61046927SAndroid Build Coastguard Worker /**
52*61046927SAndroid Build Coastguard Worker * Retrieve an implementation-specific string description of the implementation.
53*61046927SAndroid Build Coastguard Worker * This typically includes detailed version information.
54*61046927SAndroid Build Coastguard Worker */
55*61046927SAndroid Build Coastguard Worker VdpStatus
vlVdpGetInformationString(char const ** information_string)56*61046927SAndroid Build Coastguard Worker vlVdpGetInformationString(char const **information_string)
57*61046927SAndroid Build Coastguard Worker {
58*61046927SAndroid Build Coastguard Worker if (!information_string)
59*61046927SAndroid Build Coastguard Worker return VDP_STATUS_INVALID_POINTER;
60*61046927SAndroid Build Coastguard Worker
61*61046927SAndroid Build Coastguard Worker *information_string = INFORMATION_STRING;
62*61046927SAndroid Build Coastguard Worker return VDP_STATUS_OK;
63*61046927SAndroid Build Coastguard Worker }
64*61046927SAndroid Build Coastguard Worker
65*61046927SAndroid Build Coastguard Worker /**
66*61046927SAndroid Build Coastguard Worker * Query the implementation's VdpVideoSurface capabilities.
67*61046927SAndroid Build Coastguard Worker */
68*61046927SAndroid Build Coastguard Worker VdpStatus
vlVdpVideoSurfaceQueryCapabilities(VdpDevice device,VdpChromaType surface_chroma_type,VdpBool * is_supported,uint32_t * max_width,uint32_t * max_height)69*61046927SAndroid Build Coastguard Worker vlVdpVideoSurfaceQueryCapabilities(VdpDevice device, VdpChromaType surface_chroma_type,
70*61046927SAndroid Build Coastguard Worker VdpBool *is_supported, uint32_t *max_width, uint32_t *max_height)
71*61046927SAndroid Build Coastguard Worker {
72*61046927SAndroid Build Coastguard Worker vlVdpDevice *dev;
73*61046927SAndroid Build Coastguard Worker struct pipe_screen *pscreen;
74*61046927SAndroid Build Coastguard Worker uint32_t max_2d_texture_size;
75*61046927SAndroid Build Coastguard Worker
76*61046927SAndroid Build Coastguard Worker if (!(is_supported && max_width && max_height))
77*61046927SAndroid Build Coastguard Worker return VDP_STATUS_INVALID_POINTER;
78*61046927SAndroid Build Coastguard Worker
79*61046927SAndroid Build Coastguard Worker dev = vlGetDataHTAB(device);
80*61046927SAndroid Build Coastguard Worker if (!dev)
81*61046927SAndroid Build Coastguard Worker return VDP_STATUS_INVALID_HANDLE;
82*61046927SAndroid Build Coastguard Worker
83*61046927SAndroid Build Coastguard Worker pscreen = dev->vscreen->pscreen;
84*61046927SAndroid Build Coastguard Worker if (!pscreen)
85*61046927SAndroid Build Coastguard Worker return VDP_STATUS_RESOURCES;
86*61046927SAndroid Build Coastguard Worker
87*61046927SAndroid Build Coastguard Worker mtx_lock(&dev->mutex);
88*61046927SAndroid Build Coastguard Worker
89*61046927SAndroid Build Coastguard Worker /* XXX: Current limits */
90*61046927SAndroid Build Coastguard Worker *is_supported = true;
91*61046927SAndroid Build Coastguard Worker max_2d_texture_size = pscreen->get_param(pscreen, PIPE_CAP_MAX_TEXTURE_2D_SIZE);
92*61046927SAndroid Build Coastguard Worker mtx_unlock(&dev->mutex);
93*61046927SAndroid Build Coastguard Worker if (!max_2d_texture_size)
94*61046927SAndroid Build Coastguard Worker return VDP_STATUS_RESOURCES;
95*61046927SAndroid Build Coastguard Worker
96*61046927SAndroid Build Coastguard Worker *max_width = *max_height = max_2d_texture_size;
97*61046927SAndroid Build Coastguard Worker
98*61046927SAndroid Build Coastguard Worker return VDP_STATUS_OK;
99*61046927SAndroid Build Coastguard Worker }
100*61046927SAndroid Build Coastguard Worker
101*61046927SAndroid Build Coastguard Worker /**
102*61046927SAndroid Build Coastguard Worker * Query the implementation's VdpVideoSurface GetBits/PutBits capabilities.
103*61046927SAndroid Build Coastguard Worker */
104*61046927SAndroid Build Coastguard Worker VdpStatus
vlVdpVideoSurfaceQueryGetPutBitsYCbCrCapabilities(VdpDevice device,VdpChromaType surface_chroma_type,VdpYCbCrFormat bits_ycbcr_format,VdpBool * is_supported)105*61046927SAndroid Build Coastguard Worker vlVdpVideoSurfaceQueryGetPutBitsYCbCrCapabilities(VdpDevice device, VdpChromaType surface_chroma_type,
106*61046927SAndroid Build Coastguard Worker VdpYCbCrFormat bits_ycbcr_format,
107*61046927SAndroid Build Coastguard Worker VdpBool *is_supported)
108*61046927SAndroid Build Coastguard Worker {
109*61046927SAndroid Build Coastguard Worker vlVdpDevice *dev;
110*61046927SAndroid Build Coastguard Worker struct pipe_screen *pscreen;
111*61046927SAndroid Build Coastguard Worker VdpYCbCrFormat ycbcrFormat;
112*61046927SAndroid Build Coastguard Worker bool supported;
113*61046927SAndroid Build Coastguard Worker
114*61046927SAndroid Build Coastguard Worker if (!is_supported)
115*61046927SAndroid Build Coastguard Worker return VDP_STATUS_INVALID_POINTER;
116*61046927SAndroid Build Coastguard Worker
117*61046927SAndroid Build Coastguard Worker dev = vlGetDataHTAB(device);
118*61046927SAndroid Build Coastguard Worker if (!dev)
119*61046927SAndroid Build Coastguard Worker return VDP_STATUS_INVALID_HANDLE;
120*61046927SAndroid Build Coastguard Worker
121*61046927SAndroid Build Coastguard Worker pscreen = dev->vscreen->pscreen;
122*61046927SAndroid Build Coastguard Worker if (!pscreen)
123*61046927SAndroid Build Coastguard Worker return VDP_STATUS_RESOURCES;
124*61046927SAndroid Build Coastguard Worker
125*61046927SAndroid Build Coastguard Worker mtx_lock(&dev->mutex);
126*61046927SAndroid Build Coastguard Worker
127*61046927SAndroid Build Coastguard Worker ycbcrFormat = bits_ycbcr_format;
128*61046927SAndroid Build Coastguard Worker switch(bits_ycbcr_format) {
129*61046927SAndroid Build Coastguard Worker case VDP_YCBCR_FORMAT_NV12:
130*61046927SAndroid Build Coastguard Worker supported = surface_chroma_type == VDP_CHROMA_TYPE_420;
131*61046927SAndroid Build Coastguard Worker break;
132*61046927SAndroid Build Coastguard Worker
133*61046927SAndroid Build Coastguard Worker case VDP_YCBCR_FORMAT_YV12:
134*61046927SAndroid Build Coastguard Worker supported = surface_chroma_type == VDP_CHROMA_TYPE_420;
135*61046927SAndroid Build Coastguard Worker
136*61046927SAndroid Build Coastguard Worker /* We can convert YV12 to NV12 on the fly! */
137*61046927SAndroid Build Coastguard Worker ycbcrFormat = VDP_YCBCR_FORMAT_NV12;
138*61046927SAndroid Build Coastguard Worker break;
139*61046927SAndroid Build Coastguard Worker
140*61046927SAndroid Build Coastguard Worker case VDP_YCBCR_FORMAT_UYVY:
141*61046927SAndroid Build Coastguard Worker case VDP_YCBCR_FORMAT_YUYV:
142*61046927SAndroid Build Coastguard Worker supported = surface_chroma_type == VDP_CHROMA_TYPE_422;
143*61046927SAndroid Build Coastguard Worker break;
144*61046927SAndroid Build Coastguard Worker
145*61046927SAndroid Build Coastguard Worker case VDP_YCBCR_FORMAT_Y8U8V8A8:
146*61046927SAndroid Build Coastguard Worker case VDP_YCBCR_FORMAT_V8U8Y8A8:
147*61046927SAndroid Build Coastguard Worker supported = surface_chroma_type == VDP_CHROMA_TYPE_444;
148*61046927SAndroid Build Coastguard Worker break;
149*61046927SAndroid Build Coastguard Worker
150*61046927SAndroid Build Coastguard Worker case VDP_YCBCR_FORMAT_P010:
151*61046927SAndroid Build Coastguard Worker case VDP_YCBCR_FORMAT_P016:
152*61046927SAndroid Build Coastguard Worker /* Do any other profiles imply support for this chroma type? */
153*61046927SAndroid Build Coastguard Worker supported = (surface_chroma_type == VDP_CHROMA_TYPE_420_16)
154*61046927SAndroid Build Coastguard Worker && vl_codec_supported(pscreen, PIPE_VIDEO_PROFILE_HEVC_MAIN_10, false);
155*61046927SAndroid Build Coastguard Worker break;
156*61046927SAndroid Build Coastguard Worker
157*61046927SAndroid Build Coastguard Worker default:
158*61046927SAndroid Build Coastguard Worker supported = false;
159*61046927SAndroid Build Coastguard Worker break;
160*61046927SAndroid Build Coastguard Worker }
161*61046927SAndroid Build Coastguard Worker
162*61046927SAndroid Build Coastguard Worker if (supported &&
163*61046927SAndroid Build Coastguard Worker !pscreen->is_video_format_supported(pscreen,
164*61046927SAndroid Build Coastguard Worker FormatYCBCRToPipe(ycbcrFormat),
165*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_PROFILE_UNKNOWN,
166*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_ENTRYPOINT_BITSTREAM)) {
167*61046927SAndroid Build Coastguard Worker supported = false;
168*61046927SAndroid Build Coastguard Worker }
169*61046927SAndroid Build Coastguard Worker *is_supported = supported;
170*61046927SAndroid Build Coastguard Worker
171*61046927SAndroid Build Coastguard Worker mtx_unlock(&dev->mutex);
172*61046927SAndroid Build Coastguard Worker
173*61046927SAndroid Build Coastguard Worker return VDP_STATUS_OK;
174*61046927SAndroid Build Coastguard Worker }
175*61046927SAndroid Build Coastguard Worker
176*61046927SAndroid Build Coastguard Worker /**
177*61046927SAndroid Build Coastguard Worker * Query the implementation's VdpDecoder capabilities.
178*61046927SAndroid Build Coastguard Worker */
179*61046927SAndroid Build Coastguard Worker VdpStatus
vlVdpDecoderQueryCapabilities(VdpDevice device,VdpDecoderProfile profile,VdpBool * is_supported,uint32_t * max_level,uint32_t * max_macroblocks,uint32_t * max_width,uint32_t * max_height)180*61046927SAndroid Build Coastguard Worker vlVdpDecoderQueryCapabilities(VdpDevice device, VdpDecoderProfile profile,
181*61046927SAndroid Build Coastguard Worker VdpBool *is_supported, uint32_t *max_level, uint32_t *max_macroblocks,
182*61046927SAndroid Build Coastguard Worker uint32_t *max_width, uint32_t *max_height)
183*61046927SAndroid Build Coastguard Worker {
184*61046927SAndroid Build Coastguard Worker vlVdpDevice *dev;
185*61046927SAndroid Build Coastguard Worker struct pipe_screen *pscreen;
186*61046927SAndroid Build Coastguard Worker enum pipe_video_profile p_profile;
187*61046927SAndroid Build Coastguard Worker
188*61046927SAndroid Build Coastguard Worker if (!(is_supported && max_level && max_macroblocks && max_width && max_height))
189*61046927SAndroid Build Coastguard Worker return VDP_STATUS_INVALID_POINTER;
190*61046927SAndroid Build Coastguard Worker
191*61046927SAndroid Build Coastguard Worker dev = vlGetDataHTAB(device);
192*61046927SAndroid Build Coastguard Worker if (!dev)
193*61046927SAndroid Build Coastguard Worker return VDP_STATUS_INVALID_HANDLE;
194*61046927SAndroid Build Coastguard Worker
195*61046927SAndroid Build Coastguard Worker pscreen = dev->vscreen->pscreen;
196*61046927SAndroid Build Coastguard Worker if (!pscreen)
197*61046927SAndroid Build Coastguard Worker return VDP_STATUS_RESOURCES;
198*61046927SAndroid Build Coastguard Worker
199*61046927SAndroid Build Coastguard Worker p_profile = ProfileToPipe(profile);
200*61046927SAndroid Build Coastguard Worker if (p_profile == PIPE_VIDEO_PROFILE_UNKNOWN) {
201*61046927SAndroid Build Coastguard Worker *is_supported = false;
202*61046927SAndroid Build Coastguard Worker return VDP_STATUS_OK;
203*61046927SAndroid Build Coastguard Worker }
204*61046927SAndroid Build Coastguard Worker
205*61046927SAndroid Build Coastguard Worker mtx_lock(&dev->mutex);
206*61046927SAndroid Build Coastguard Worker *is_supported = vl_codec_supported(pscreen, p_profile, false);
207*61046927SAndroid Build Coastguard Worker if (*is_supported) {
208*61046927SAndroid Build Coastguard Worker *max_width = pscreen->get_video_param(pscreen, p_profile, PIPE_VIDEO_ENTRYPOINT_BITSTREAM,
209*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_CAP_MAX_WIDTH);
210*61046927SAndroid Build Coastguard Worker *max_height = pscreen->get_video_param(pscreen, p_profile, PIPE_VIDEO_ENTRYPOINT_BITSTREAM,
211*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_CAP_MAX_HEIGHT);
212*61046927SAndroid Build Coastguard Worker *max_level = pscreen->get_video_param(pscreen, p_profile, PIPE_VIDEO_ENTRYPOINT_BITSTREAM,
213*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_CAP_MAX_LEVEL);
214*61046927SAndroid Build Coastguard Worker *max_macroblocks = pscreen->get_video_param(pscreen, p_profile, PIPE_VIDEO_ENTRYPOINT_BITSTREAM,
215*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_CAP_MAX_MACROBLOCKS);
216*61046927SAndroid Build Coastguard Worker if (*max_macroblocks == 0) {
217*61046927SAndroid Build Coastguard Worker *max_macroblocks = (*max_width/16)*(*max_height/16);
218*61046927SAndroid Build Coastguard Worker }
219*61046927SAndroid Build Coastguard Worker } else {
220*61046927SAndroid Build Coastguard Worker *max_width = 0;
221*61046927SAndroid Build Coastguard Worker *max_height = 0;
222*61046927SAndroid Build Coastguard Worker *max_level = 0;
223*61046927SAndroid Build Coastguard Worker *max_macroblocks = 0;
224*61046927SAndroid Build Coastguard Worker }
225*61046927SAndroid Build Coastguard Worker mtx_unlock(&dev->mutex);
226*61046927SAndroid Build Coastguard Worker
227*61046927SAndroid Build Coastguard Worker return VDP_STATUS_OK;
228*61046927SAndroid Build Coastguard Worker }
229*61046927SAndroid Build Coastguard Worker
230*61046927SAndroid Build Coastguard Worker /**
231*61046927SAndroid Build Coastguard Worker * Query the implementation's VdpOutputSurface capabilities.
232*61046927SAndroid Build Coastguard Worker */
233*61046927SAndroid Build Coastguard Worker VdpStatus
vlVdpOutputSurfaceQueryCapabilities(VdpDevice device,VdpRGBAFormat surface_rgba_format,VdpBool * is_supported,uint32_t * max_width,uint32_t * max_height)234*61046927SAndroid Build Coastguard Worker vlVdpOutputSurfaceQueryCapabilities(VdpDevice device, VdpRGBAFormat surface_rgba_format,
235*61046927SAndroid Build Coastguard Worker VdpBool *is_supported, uint32_t *max_width, uint32_t *max_height)
236*61046927SAndroid Build Coastguard Worker {
237*61046927SAndroid Build Coastguard Worker vlVdpDevice *dev;
238*61046927SAndroid Build Coastguard Worker struct pipe_screen *pscreen;
239*61046927SAndroid Build Coastguard Worker enum pipe_format format;
240*61046927SAndroid Build Coastguard Worker
241*61046927SAndroid Build Coastguard Worker dev = vlGetDataHTAB(device);
242*61046927SAndroid Build Coastguard Worker if (!dev)
243*61046927SAndroid Build Coastguard Worker return VDP_STATUS_INVALID_HANDLE;
244*61046927SAndroid Build Coastguard Worker
245*61046927SAndroid Build Coastguard Worker pscreen = dev->vscreen->pscreen;
246*61046927SAndroid Build Coastguard Worker if (!pscreen)
247*61046927SAndroid Build Coastguard Worker return VDP_STATUS_RESOURCES;
248*61046927SAndroid Build Coastguard Worker
249*61046927SAndroid Build Coastguard Worker format = VdpFormatRGBAToPipe(surface_rgba_format);
250*61046927SAndroid Build Coastguard Worker if (format == PIPE_FORMAT_NONE || format == PIPE_FORMAT_A8_UNORM)
251*61046927SAndroid Build Coastguard Worker return VDP_STATUS_INVALID_RGBA_FORMAT;
252*61046927SAndroid Build Coastguard Worker
253*61046927SAndroid Build Coastguard Worker if (!(is_supported && max_width && max_height))
254*61046927SAndroid Build Coastguard Worker return VDP_STATUS_INVALID_POINTER;
255*61046927SAndroid Build Coastguard Worker
256*61046927SAndroid Build Coastguard Worker mtx_lock(&dev->mutex);
257*61046927SAndroid Build Coastguard Worker *is_supported = pscreen->is_format_supported
258*61046927SAndroid Build Coastguard Worker (
259*61046927SAndroid Build Coastguard Worker pscreen, format, PIPE_TEXTURE_2D, 1, 1,
260*61046927SAndroid Build Coastguard Worker PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET
261*61046927SAndroid Build Coastguard Worker );
262*61046927SAndroid Build Coastguard Worker if (*is_supported) {
263*61046927SAndroid Build Coastguard Worker uint32_t max_2d_texture_size = pscreen->get_param(
264*61046927SAndroid Build Coastguard Worker pscreen, PIPE_CAP_MAX_TEXTURE_2D_SIZE);
265*61046927SAndroid Build Coastguard Worker
266*61046927SAndroid Build Coastguard Worker if (!max_2d_texture_size) {
267*61046927SAndroid Build Coastguard Worker mtx_unlock(&dev->mutex);
268*61046927SAndroid Build Coastguard Worker return VDP_STATUS_ERROR;
269*61046927SAndroid Build Coastguard Worker }
270*61046927SAndroid Build Coastguard Worker
271*61046927SAndroid Build Coastguard Worker *max_width = *max_height = max_2d_texture_size;
272*61046927SAndroid Build Coastguard Worker } else {
273*61046927SAndroid Build Coastguard Worker *max_width = 0;
274*61046927SAndroid Build Coastguard Worker *max_height = 0;
275*61046927SAndroid Build Coastguard Worker }
276*61046927SAndroid Build Coastguard Worker mtx_unlock(&dev->mutex);
277*61046927SAndroid Build Coastguard Worker
278*61046927SAndroid Build Coastguard Worker return VDP_STATUS_OK;
279*61046927SAndroid Build Coastguard Worker }
280*61046927SAndroid Build Coastguard Worker
281*61046927SAndroid Build Coastguard Worker /**
282*61046927SAndroid Build Coastguard Worker * Query the implementation's capability to perform a PutBits operation using
283*61046927SAndroid Build Coastguard Worker * application data matching the surface's format.
284*61046927SAndroid Build Coastguard Worker */
285*61046927SAndroid Build Coastguard Worker VdpStatus
vlVdpOutputSurfaceQueryGetPutBitsNativeCapabilities(VdpDevice device,VdpRGBAFormat surface_rgba_format,VdpBool * is_supported)286*61046927SAndroid Build Coastguard Worker vlVdpOutputSurfaceQueryGetPutBitsNativeCapabilities(VdpDevice device, VdpRGBAFormat surface_rgba_format,
287*61046927SAndroid Build Coastguard Worker VdpBool *is_supported)
288*61046927SAndroid Build Coastguard Worker {
289*61046927SAndroid Build Coastguard Worker vlVdpDevice *dev;
290*61046927SAndroid Build Coastguard Worker struct pipe_screen *pscreen;
291*61046927SAndroid Build Coastguard Worker enum pipe_format format;
292*61046927SAndroid Build Coastguard Worker
293*61046927SAndroid Build Coastguard Worker dev = vlGetDataHTAB(device);
294*61046927SAndroid Build Coastguard Worker if (!dev)
295*61046927SAndroid Build Coastguard Worker return VDP_STATUS_INVALID_HANDLE;
296*61046927SAndroid Build Coastguard Worker
297*61046927SAndroid Build Coastguard Worker pscreen = dev->vscreen->pscreen;
298*61046927SAndroid Build Coastguard Worker if (!pscreen)
299*61046927SAndroid Build Coastguard Worker return VDP_STATUS_ERROR;
300*61046927SAndroid Build Coastguard Worker
301*61046927SAndroid Build Coastguard Worker format = VdpFormatRGBAToPipe(surface_rgba_format);
302*61046927SAndroid Build Coastguard Worker if (format == PIPE_FORMAT_NONE || format == PIPE_FORMAT_A8_UNORM)
303*61046927SAndroid Build Coastguard Worker return VDP_STATUS_INVALID_RGBA_FORMAT;
304*61046927SAndroid Build Coastguard Worker
305*61046927SAndroid Build Coastguard Worker if (!is_supported)
306*61046927SAndroid Build Coastguard Worker return VDP_STATUS_INVALID_POINTER;
307*61046927SAndroid Build Coastguard Worker
308*61046927SAndroid Build Coastguard Worker mtx_lock(&dev->mutex);
309*61046927SAndroid Build Coastguard Worker *is_supported = pscreen->is_format_supported
310*61046927SAndroid Build Coastguard Worker (
311*61046927SAndroid Build Coastguard Worker pscreen, format, PIPE_TEXTURE_2D, 1, 1,
312*61046927SAndroid Build Coastguard Worker PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET
313*61046927SAndroid Build Coastguard Worker );
314*61046927SAndroid Build Coastguard Worker mtx_unlock(&dev->mutex);
315*61046927SAndroid Build Coastguard Worker
316*61046927SAndroid Build Coastguard Worker return VDP_STATUS_OK;
317*61046927SAndroid Build Coastguard Worker }
318*61046927SAndroid Build Coastguard Worker
319*61046927SAndroid Build Coastguard Worker /**
320*61046927SAndroid Build Coastguard Worker * Query the implementation's capability to perform a PutBits operation using
321*61046927SAndroid Build Coastguard Worker * application data in a specific indexed format.
322*61046927SAndroid Build Coastguard Worker */
323*61046927SAndroid Build Coastguard Worker VdpStatus
vlVdpOutputSurfaceQueryPutBitsIndexedCapabilities(VdpDevice device,VdpRGBAFormat surface_rgba_format,VdpIndexedFormat bits_indexed_format,VdpColorTableFormat color_table_format,VdpBool * is_supported)324*61046927SAndroid Build Coastguard Worker vlVdpOutputSurfaceQueryPutBitsIndexedCapabilities(VdpDevice device,
325*61046927SAndroid Build Coastguard Worker VdpRGBAFormat surface_rgba_format,
326*61046927SAndroid Build Coastguard Worker VdpIndexedFormat bits_indexed_format,
327*61046927SAndroid Build Coastguard Worker VdpColorTableFormat color_table_format,
328*61046927SAndroid Build Coastguard Worker VdpBool *is_supported)
329*61046927SAndroid Build Coastguard Worker {
330*61046927SAndroid Build Coastguard Worker vlVdpDevice *dev;
331*61046927SAndroid Build Coastguard Worker struct pipe_screen *pscreen;
332*61046927SAndroid Build Coastguard Worker enum pipe_format rgba_format, index_format, colortbl_format;
333*61046927SAndroid Build Coastguard Worker
334*61046927SAndroid Build Coastguard Worker dev = vlGetDataHTAB(device);
335*61046927SAndroid Build Coastguard Worker if (!dev)
336*61046927SAndroid Build Coastguard Worker return VDP_STATUS_INVALID_HANDLE;
337*61046927SAndroid Build Coastguard Worker
338*61046927SAndroid Build Coastguard Worker pscreen = dev->vscreen->pscreen;
339*61046927SAndroid Build Coastguard Worker if (!pscreen)
340*61046927SAndroid Build Coastguard Worker return VDP_STATUS_ERROR;
341*61046927SAndroid Build Coastguard Worker
342*61046927SAndroid Build Coastguard Worker rgba_format = VdpFormatRGBAToPipe(surface_rgba_format);
343*61046927SAndroid Build Coastguard Worker if (rgba_format == PIPE_FORMAT_NONE || rgba_format == PIPE_FORMAT_A8_UNORM)
344*61046927SAndroid Build Coastguard Worker return VDP_STATUS_INVALID_RGBA_FORMAT;
345*61046927SAndroid Build Coastguard Worker
346*61046927SAndroid Build Coastguard Worker index_format = FormatIndexedToPipe(bits_indexed_format);
347*61046927SAndroid Build Coastguard Worker if (index_format == PIPE_FORMAT_NONE)
348*61046927SAndroid Build Coastguard Worker return VDP_STATUS_INVALID_INDEXED_FORMAT;
349*61046927SAndroid Build Coastguard Worker
350*61046927SAndroid Build Coastguard Worker colortbl_format = FormatColorTableToPipe(color_table_format);
351*61046927SAndroid Build Coastguard Worker if (colortbl_format == PIPE_FORMAT_NONE)
352*61046927SAndroid Build Coastguard Worker return VDP_STATUS_INVALID_COLOR_TABLE_FORMAT;
353*61046927SAndroid Build Coastguard Worker
354*61046927SAndroid Build Coastguard Worker if (!is_supported)
355*61046927SAndroid Build Coastguard Worker return VDP_STATUS_INVALID_POINTER;
356*61046927SAndroid Build Coastguard Worker
357*61046927SAndroid Build Coastguard Worker mtx_lock(&dev->mutex);
358*61046927SAndroid Build Coastguard Worker *is_supported = pscreen->is_format_supported
359*61046927SAndroid Build Coastguard Worker (
360*61046927SAndroid Build Coastguard Worker pscreen, rgba_format, PIPE_TEXTURE_2D, 1, 1,
361*61046927SAndroid Build Coastguard Worker PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET
362*61046927SAndroid Build Coastguard Worker );
363*61046927SAndroid Build Coastguard Worker
364*61046927SAndroid Build Coastguard Worker *is_supported &= pscreen->is_format_supported
365*61046927SAndroid Build Coastguard Worker (
366*61046927SAndroid Build Coastguard Worker pscreen, index_format, PIPE_TEXTURE_2D, 1, 1,
367*61046927SAndroid Build Coastguard Worker PIPE_BIND_SAMPLER_VIEW
368*61046927SAndroid Build Coastguard Worker );
369*61046927SAndroid Build Coastguard Worker
370*61046927SAndroid Build Coastguard Worker *is_supported &= pscreen->is_format_supported
371*61046927SAndroid Build Coastguard Worker (
372*61046927SAndroid Build Coastguard Worker pscreen, colortbl_format, PIPE_TEXTURE_1D, 1, 1,
373*61046927SAndroid Build Coastguard Worker PIPE_BIND_SAMPLER_VIEW
374*61046927SAndroid Build Coastguard Worker );
375*61046927SAndroid Build Coastguard Worker mtx_unlock(&dev->mutex);
376*61046927SAndroid Build Coastguard Worker
377*61046927SAndroid Build Coastguard Worker return VDP_STATUS_OK;
378*61046927SAndroid Build Coastguard Worker }
379*61046927SAndroid Build Coastguard Worker
380*61046927SAndroid Build Coastguard Worker /**
381*61046927SAndroid Build Coastguard Worker * Query the implementation's capability to perform a PutBits operation using
382*61046927SAndroid Build Coastguard Worker * application data in a specific YCbCr/YUB format.
383*61046927SAndroid Build Coastguard Worker */
384*61046927SAndroid Build Coastguard Worker VdpStatus
vlVdpOutputSurfaceQueryPutBitsYCbCrCapabilities(VdpDevice device,VdpRGBAFormat surface_rgba_format,VdpYCbCrFormat bits_ycbcr_format,VdpBool * is_supported)385*61046927SAndroid Build Coastguard Worker vlVdpOutputSurfaceQueryPutBitsYCbCrCapabilities(VdpDevice device, VdpRGBAFormat surface_rgba_format,
386*61046927SAndroid Build Coastguard Worker VdpYCbCrFormat bits_ycbcr_format,
387*61046927SAndroid Build Coastguard Worker VdpBool *is_supported)
388*61046927SAndroid Build Coastguard Worker {
389*61046927SAndroid Build Coastguard Worker vlVdpDevice *dev;
390*61046927SAndroid Build Coastguard Worker struct pipe_screen *pscreen;
391*61046927SAndroid Build Coastguard Worker enum pipe_format rgba_format, ycbcr_format;
392*61046927SAndroid Build Coastguard Worker
393*61046927SAndroid Build Coastguard Worker dev = vlGetDataHTAB(device);
394*61046927SAndroid Build Coastguard Worker if (!dev)
395*61046927SAndroid Build Coastguard Worker return VDP_STATUS_INVALID_HANDLE;
396*61046927SAndroid Build Coastguard Worker
397*61046927SAndroid Build Coastguard Worker pscreen = dev->vscreen->pscreen;
398*61046927SAndroid Build Coastguard Worker if (!pscreen)
399*61046927SAndroid Build Coastguard Worker return VDP_STATUS_ERROR;
400*61046927SAndroid Build Coastguard Worker
401*61046927SAndroid Build Coastguard Worker rgba_format = VdpFormatRGBAToPipe(surface_rgba_format);
402*61046927SAndroid Build Coastguard Worker if (rgba_format == PIPE_FORMAT_NONE || rgba_format == PIPE_FORMAT_A8_UNORM)
403*61046927SAndroid Build Coastguard Worker return VDP_STATUS_INVALID_RGBA_FORMAT;
404*61046927SAndroid Build Coastguard Worker
405*61046927SAndroid Build Coastguard Worker ycbcr_format = FormatYCBCRToPipe(bits_ycbcr_format);
406*61046927SAndroid Build Coastguard Worker if (ycbcr_format == PIPE_FORMAT_NONE)
407*61046927SAndroid Build Coastguard Worker return VDP_STATUS_INVALID_INDEXED_FORMAT;
408*61046927SAndroid Build Coastguard Worker
409*61046927SAndroid Build Coastguard Worker if (!is_supported)
410*61046927SAndroid Build Coastguard Worker return VDP_STATUS_INVALID_POINTER;
411*61046927SAndroid Build Coastguard Worker
412*61046927SAndroid Build Coastguard Worker mtx_lock(&dev->mutex);
413*61046927SAndroid Build Coastguard Worker *is_supported = pscreen->is_format_supported
414*61046927SAndroid Build Coastguard Worker (
415*61046927SAndroid Build Coastguard Worker pscreen, rgba_format, PIPE_TEXTURE_2D, 1, 1,
416*61046927SAndroid Build Coastguard Worker PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET
417*61046927SAndroid Build Coastguard Worker );
418*61046927SAndroid Build Coastguard Worker
419*61046927SAndroid Build Coastguard Worker *is_supported &= pscreen->is_video_format_supported
420*61046927SAndroid Build Coastguard Worker (
421*61046927SAndroid Build Coastguard Worker pscreen, ycbcr_format,
422*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_PROFILE_UNKNOWN,
423*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_ENTRYPOINT_BITSTREAM
424*61046927SAndroid Build Coastguard Worker );
425*61046927SAndroid Build Coastguard Worker mtx_unlock(&dev->mutex);
426*61046927SAndroid Build Coastguard Worker
427*61046927SAndroid Build Coastguard Worker return VDP_STATUS_OK;
428*61046927SAndroid Build Coastguard Worker }
429*61046927SAndroid Build Coastguard Worker
430*61046927SAndroid Build Coastguard Worker /**
431*61046927SAndroid Build Coastguard Worker * Query the implementation's VdpBitmapSurface capabilities.
432*61046927SAndroid Build Coastguard Worker */
433*61046927SAndroid Build Coastguard Worker VdpStatus
vlVdpBitmapSurfaceQueryCapabilities(VdpDevice device,VdpRGBAFormat surface_rgba_format,VdpBool * is_supported,uint32_t * max_width,uint32_t * max_height)434*61046927SAndroid Build Coastguard Worker vlVdpBitmapSurfaceQueryCapabilities(VdpDevice device, VdpRGBAFormat surface_rgba_format,
435*61046927SAndroid Build Coastguard Worker VdpBool *is_supported, uint32_t *max_width, uint32_t *max_height)
436*61046927SAndroid Build Coastguard Worker {
437*61046927SAndroid Build Coastguard Worker vlVdpDevice *dev;
438*61046927SAndroid Build Coastguard Worker struct pipe_screen *pscreen;
439*61046927SAndroid Build Coastguard Worker enum pipe_format format;
440*61046927SAndroid Build Coastguard Worker
441*61046927SAndroid Build Coastguard Worker dev = vlGetDataHTAB(device);
442*61046927SAndroid Build Coastguard Worker if (!dev)
443*61046927SAndroid Build Coastguard Worker return VDP_STATUS_INVALID_HANDLE;
444*61046927SAndroid Build Coastguard Worker
445*61046927SAndroid Build Coastguard Worker pscreen = dev->vscreen->pscreen;
446*61046927SAndroid Build Coastguard Worker if (!pscreen)
447*61046927SAndroid Build Coastguard Worker return VDP_STATUS_RESOURCES;
448*61046927SAndroid Build Coastguard Worker
449*61046927SAndroid Build Coastguard Worker format = VdpFormatRGBAToPipe(surface_rgba_format);
450*61046927SAndroid Build Coastguard Worker if (format == PIPE_FORMAT_NONE)
451*61046927SAndroid Build Coastguard Worker return VDP_STATUS_INVALID_RGBA_FORMAT;
452*61046927SAndroid Build Coastguard Worker
453*61046927SAndroid Build Coastguard Worker if (!(is_supported && max_width && max_height))
454*61046927SAndroid Build Coastguard Worker return VDP_STATUS_INVALID_POINTER;
455*61046927SAndroid Build Coastguard Worker
456*61046927SAndroid Build Coastguard Worker mtx_lock(&dev->mutex);
457*61046927SAndroid Build Coastguard Worker *is_supported = pscreen->is_format_supported
458*61046927SAndroid Build Coastguard Worker (
459*61046927SAndroid Build Coastguard Worker pscreen, format, PIPE_TEXTURE_2D, 1, 1,
460*61046927SAndroid Build Coastguard Worker PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET
461*61046927SAndroid Build Coastguard Worker );
462*61046927SAndroid Build Coastguard Worker if (*is_supported) {
463*61046927SAndroid Build Coastguard Worker uint32_t max_2d_texture_size = pscreen->get_param(
464*61046927SAndroid Build Coastguard Worker pscreen, PIPE_CAP_MAX_TEXTURE_2D_SIZE);
465*61046927SAndroid Build Coastguard Worker
466*61046927SAndroid Build Coastguard Worker if (!max_2d_texture_size) {
467*61046927SAndroid Build Coastguard Worker mtx_unlock(&dev->mutex);
468*61046927SAndroid Build Coastguard Worker return VDP_STATUS_ERROR;
469*61046927SAndroid Build Coastguard Worker }
470*61046927SAndroid Build Coastguard Worker
471*61046927SAndroid Build Coastguard Worker *max_width = *max_height = max_2d_texture_size;
472*61046927SAndroid Build Coastguard Worker } else {
473*61046927SAndroid Build Coastguard Worker *max_width = 0;
474*61046927SAndroid Build Coastguard Worker *max_height = 0;
475*61046927SAndroid Build Coastguard Worker }
476*61046927SAndroid Build Coastguard Worker mtx_unlock(&dev->mutex);
477*61046927SAndroid Build Coastguard Worker
478*61046927SAndroid Build Coastguard Worker return VDP_STATUS_OK;
479*61046927SAndroid Build Coastguard Worker }
480*61046927SAndroid Build Coastguard Worker
481*61046927SAndroid Build Coastguard Worker /**
482*61046927SAndroid Build Coastguard Worker * Query the implementation's support for a specific feature.
483*61046927SAndroid Build Coastguard Worker */
484*61046927SAndroid Build Coastguard Worker VdpStatus
vlVdpVideoMixerQueryFeatureSupport(VdpDevice device,VdpVideoMixerFeature feature,VdpBool * is_supported)485*61046927SAndroid Build Coastguard Worker vlVdpVideoMixerQueryFeatureSupport(VdpDevice device, VdpVideoMixerFeature feature,
486*61046927SAndroid Build Coastguard Worker VdpBool *is_supported)
487*61046927SAndroid Build Coastguard Worker {
488*61046927SAndroid Build Coastguard Worker if (!is_supported)
489*61046927SAndroid Build Coastguard Worker return VDP_STATUS_INVALID_POINTER;
490*61046927SAndroid Build Coastguard Worker
491*61046927SAndroid Build Coastguard Worker switch (feature) {
492*61046927SAndroid Build Coastguard Worker case VDP_VIDEO_MIXER_FEATURE_SHARPNESS:
493*61046927SAndroid Build Coastguard Worker case VDP_VIDEO_MIXER_FEATURE_NOISE_REDUCTION:
494*61046927SAndroid Build Coastguard Worker case VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL:
495*61046927SAndroid Build Coastguard Worker case VDP_VIDEO_MIXER_FEATURE_LUMA_KEY:
496*61046927SAndroid Build Coastguard Worker case VDP_VIDEO_MIXER_FEATURE_HIGH_QUALITY_SCALING_L1:
497*61046927SAndroid Build Coastguard Worker *is_supported = VDP_TRUE;
498*61046927SAndroid Build Coastguard Worker break;
499*61046927SAndroid Build Coastguard Worker default:
500*61046927SAndroid Build Coastguard Worker *is_supported = VDP_FALSE;
501*61046927SAndroid Build Coastguard Worker break;
502*61046927SAndroid Build Coastguard Worker }
503*61046927SAndroid Build Coastguard Worker return VDP_STATUS_OK;
504*61046927SAndroid Build Coastguard Worker }
505*61046927SAndroid Build Coastguard Worker
506*61046927SAndroid Build Coastguard Worker /**
507*61046927SAndroid Build Coastguard Worker * Query the implementation's support for a specific parameter.
508*61046927SAndroid Build Coastguard Worker */
509*61046927SAndroid Build Coastguard Worker VdpStatus
vlVdpVideoMixerQueryParameterSupport(VdpDevice device,VdpVideoMixerParameter parameter,VdpBool * is_supported)510*61046927SAndroid Build Coastguard Worker vlVdpVideoMixerQueryParameterSupport(VdpDevice device, VdpVideoMixerParameter parameter,
511*61046927SAndroid Build Coastguard Worker VdpBool *is_supported)
512*61046927SAndroid Build Coastguard Worker {
513*61046927SAndroid Build Coastguard Worker if (!is_supported)
514*61046927SAndroid Build Coastguard Worker return VDP_STATUS_INVALID_POINTER;
515*61046927SAndroid Build Coastguard Worker
516*61046927SAndroid Build Coastguard Worker switch (parameter) {
517*61046927SAndroid Build Coastguard Worker case VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_WIDTH:
518*61046927SAndroid Build Coastguard Worker case VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_HEIGHT:
519*61046927SAndroid Build Coastguard Worker case VDP_VIDEO_MIXER_PARAMETER_CHROMA_TYPE:
520*61046927SAndroid Build Coastguard Worker case VDP_VIDEO_MIXER_PARAMETER_LAYERS:
521*61046927SAndroid Build Coastguard Worker *is_supported = VDP_TRUE;
522*61046927SAndroid Build Coastguard Worker break;
523*61046927SAndroid Build Coastguard Worker default:
524*61046927SAndroid Build Coastguard Worker *is_supported = VDP_FALSE;
525*61046927SAndroid Build Coastguard Worker break;
526*61046927SAndroid Build Coastguard Worker }
527*61046927SAndroid Build Coastguard Worker return VDP_STATUS_OK;
528*61046927SAndroid Build Coastguard Worker }
529*61046927SAndroid Build Coastguard Worker
530*61046927SAndroid Build Coastguard Worker /**
531*61046927SAndroid Build Coastguard Worker * Query the implementation's supported for a specific parameter.
532*61046927SAndroid Build Coastguard Worker */
533*61046927SAndroid Build Coastguard Worker VdpStatus
vlVdpVideoMixerQueryParameterValueRange(VdpDevice device,VdpVideoMixerParameter parameter,void * min_value,void * max_value)534*61046927SAndroid Build Coastguard Worker vlVdpVideoMixerQueryParameterValueRange(VdpDevice device, VdpVideoMixerParameter parameter,
535*61046927SAndroid Build Coastguard Worker void *min_value, void *max_value)
536*61046927SAndroid Build Coastguard Worker {
537*61046927SAndroid Build Coastguard Worker vlVdpDevice *dev = vlGetDataHTAB(device);
538*61046927SAndroid Build Coastguard Worker struct pipe_screen *screen;
539*61046927SAndroid Build Coastguard Worker
540*61046927SAndroid Build Coastguard Worker if (!dev)
541*61046927SAndroid Build Coastguard Worker return VDP_STATUS_INVALID_HANDLE;
542*61046927SAndroid Build Coastguard Worker if (!(min_value && max_value))
543*61046927SAndroid Build Coastguard Worker return VDP_STATUS_INVALID_POINTER;
544*61046927SAndroid Build Coastguard Worker
545*61046927SAndroid Build Coastguard Worker mtx_lock(&dev->mutex);
546*61046927SAndroid Build Coastguard Worker screen = dev->vscreen->pscreen;
547*61046927SAndroid Build Coastguard Worker switch (parameter) {
548*61046927SAndroid Build Coastguard Worker case VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_WIDTH:
549*61046927SAndroid Build Coastguard Worker *(uint32_t*)min_value = 48;
550*61046927SAndroid Build Coastguard Worker *(uint32_t*)max_value = screen->get_video_param(screen, PIPE_VIDEO_PROFILE_UNKNOWN,
551*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_ENTRYPOINT_BITSTREAM,
552*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_CAP_MAX_WIDTH);
553*61046927SAndroid Build Coastguard Worker break;
554*61046927SAndroid Build Coastguard Worker case VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_HEIGHT:
555*61046927SAndroid Build Coastguard Worker *(uint32_t*)min_value = 48;
556*61046927SAndroid Build Coastguard Worker *(uint32_t*)max_value = screen->get_video_param(screen, PIPE_VIDEO_PROFILE_UNKNOWN,
557*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_ENTRYPOINT_BITSTREAM,
558*61046927SAndroid Build Coastguard Worker PIPE_VIDEO_CAP_MAX_HEIGHT);
559*61046927SAndroid Build Coastguard Worker break;
560*61046927SAndroid Build Coastguard Worker
561*61046927SAndroid Build Coastguard Worker case VDP_VIDEO_MIXER_PARAMETER_LAYERS:
562*61046927SAndroid Build Coastguard Worker *(uint32_t*)min_value = 0;
563*61046927SAndroid Build Coastguard Worker *(uint32_t*)max_value = 4;
564*61046927SAndroid Build Coastguard Worker break;
565*61046927SAndroid Build Coastguard Worker
566*61046927SAndroid Build Coastguard Worker case VDP_VIDEO_MIXER_PARAMETER_CHROMA_TYPE:
567*61046927SAndroid Build Coastguard Worker default:
568*61046927SAndroid Build Coastguard Worker mtx_unlock(&dev->mutex);
569*61046927SAndroid Build Coastguard Worker return VDP_STATUS_INVALID_VIDEO_MIXER_PARAMETER;
570*61046927SAndroid Build Coastguard Worker }
571*61046927SAndroid Build Coastguard Worker mtx_unlock(&dev->mutex);
572*61046927SAndroid Build Coastguard Worker return VDP_STATUS_OK;
573*61046927SAndroid Build Coastguard Worker }
574*61046927SAndroid Build Coastguard Worker
575*61046927SAndroid Build Coastguard Worker /**
576*61046927SAndroid Build Coastguard Worker * Query the implementation's support for a specific attribute.
577*61046927SAndroid Build Coastguard Worker */
578*61046927SAndroid Build Coastguard Worker VdpStatus
vlVdpVideoMixerQueryAttributeSupport(VdpDevice device,VdpVideoMixerAttribute attribute,VdpBool * is_supported)579*61046927SAndroid Build Coastguard Worker vlVdpVideoMixerQueryAttributeSupport(VdpDevice device, VdpVideoMixerAttribute attribute,
580*61046927SAndroid Build Coastguard Worker VdpBool *is_supported)
581*61046927SAndroid Build Coastguard Worker {
582*61046927SAndroid Build Coastguard Worker if (!is_supported)
583*61046927SAndroid Build Coastguard Worker return VDP_STATUS_INVALID_POINTER;
584*61046927SAndroid Build Coastguard Worker
585*61046927SAndroid Build Coastguard Worker switch (attribute) {
586*61046927SAndroid Build Coastguard Worker case VDP_VIDEO_MIXER_ATTRIBUTE_BACKGROUND_COLOR:
587*61046927SAndroid Build Coastguard Worker case VDP_VIDEO_MIXER_ATTRIBUTE_CSC_MATRIX:
588*61046927SAndroid Build Coastguard Worker case VDP_VIDEO_MIXER_ATTRIBUTE_NOISE_REDUCTION_LEVEL:
589*61046927SAndroid Build Coastguard Worker case VDP_VIDEO_MIXER_ATTRIBUTE_SHARPNESS_LEVEL:
590*61046927SAndroid Build Coastguard Worker case VDP_VIDEO_MIXER_ATTRIBUTE_LUMA_KEY_MIN_LUMA:
591*61046927SAndroid Build Coastguard Worker case VDP_VIDEO_MIXER_ATTRIBUTE_LUMA_KEY_MAX_LUMA:
592*61046927SAndroid Build Coastguard Worker case VDP_VIDEO_MIXER_ATTRIBUTE_SKIP_CHROMA_DEINTERLACE:
593*61046927SAndroid Build Coastguard Worker *is_supported = VDP_TRUE;
594*61046927SAndroid Build Coastguard Worker break;
595*61046927SAndroid Build Coastguard Worker default:
596*61046927SAndroid Build Coastguard Worker *is_supported = VDP_FALSE;
597*61046927SAndroid Build Coastguard Worker }
598*61046927SAndroid Build Coastguard Worker return VDP_STATUS_OK;
599*61046927SAndroid Build Coastguard Worker }
600*61046927SAndroid Build Coastguard Worker
601*61046927SAndroid Build Coastguard Worker /**
602*61046927SAndroid Build Coastguard Worker * Query the implementation's supported for a specific attribute.
603*61046927SAndroid Build Coastguard Worker */
604*61046927SAndroid Build Coastguard Worker VdpStatus
vlVdpVideoMixerQueryAttributeValueRange(VdpDevice device,VdpVideoMixerAttribute attribute,void * min_value,void * max_value)605*61046927SAndroid Build Coastguard Worker vlVdpVideoMixerQueryAttributeValueRange(VdpDevice device, VdpVideoMixerAttribute attribute,
606*61046927SAndroid Build Coastguard Worker void *min_value, void *max_value)
607*61046927SAndroid Build Coastguard Worker {
608*61046927SAndroid Build Coastguard Worker if (!(min_value && max_value))
609*61046927SAndroid Build Coastguard Worker return VDP_STATUS_INVALID_POINTER;
610*61046927SAndroid Build Coastguard Worker
611*61046927SAndroid Build Coastguard Worker switch (attribute) {
612*61046927SAndroid Build Coastguard Worker case VDP_VIDEO_MIXER_ATTRIBUTE_NOISE_REDUCTION_LEVEL:
613*61046927SAndroid Build Coastguard Worker case VDP_VIDEO_MIXER_ATTRIBUTE_LUMA_KEY_MIN_LUMA:
614*61046927SAndroid Build Coastguard Worker case VDP_VIDEO_MIXER_ATTRIBUTE_LUMA_KEY_MAX_LUMA:
615*61046927SAndroid Build Coastguard Worker *(float*)min_value = 0.0f;
616*61046927SAndroid Build Coastguard Worker *(float*)max_value = 1.0f;
617*61046927SAndroid Build Coastguard Worker break;
618*61046927SAndroid Build Coastguard Worker case VDP_VIDEO_MIXER_ATTRIBUTE_SHARPNESS_LEVEL:
619*61046927SAndroid Build Coastguard Worker *(float*)min_value = -1.0f;
620*61046927SAndroid Build Coastguard Worker *(float*)max_value = 1.0f;
621*61046927SAndroid Build Coastguard Worker break;
622*61046927SAndroid Build Coastguard Worker case VDP_VIDEO_MIXER_ATTRIBUTE_SKIP_CHROMA_DEINTERLACE:
623*61046927SAndroid Build Coastguard Worker *(uint8_t*)min_value = 0;
624*61046927SAndroid Build Coastguard Worker *(uint8_t*)max_value = 1;
625*61046927SAndroid Build Coastguard Worker break;
626*61046927SAndroid Build Coastguard Worker case VDP_VIDEO_MIXER_ATTRIBUTE_BACKGROUND_COLOR:
627*61046927SAndroid Build Coastguard Worker case VDP_VIDEO_MIXER_ATTRIBUTE_CSC_MATRIX:
628*61046927SAndroid Build Coastguard Worker default:
629*61046927SAndroid Build Coastguard Worker return VDP_STATUS_INVALID_VIDEO_MIXER_ATTRIBUTE;
630*61046927SAndroid Build Coastguard Worker }
631*61046927SAndroid Build Coastguard Worker return VDP_STATUS_OK;
632*61046927SAndroid Build Coastguard Worker }
633