b8b15aeed4cec02a0be6fb4cb43a938239b7b190
[mesa.git] / src / gallium / state_trackers / vdpau / vdpau_private.h
1 /**************************************************************************
2 *
3 * Copyright 2010 Younes Manton & Thomas Balling Sørensen.
4 * All Rights Reserved.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sub license, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
13 *
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
16 * of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21 * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 *
26 **************************************************************************/
27
28 #ifndef VDPAU_PRIVATE_H
29 #define VDPAU_PRIVATE_H
30
31 #include <assert.h>
32
33 #include <vdpau/vdpau.h>
34 #include <vdpau/vdpau_x11.h>
35
36 #include "pipe/p_compiler.h"
37 #include "pipe/p_video_decoder.h"
38
39 #include "util/u_debug.h"
40 #include "vl/vl_compositor.h"
41
42 #include "vl_winsys.h"
43
44 /* Full VDPAU API documentation available at :
45 * ftp://download.nvidia.com/XFree86/vdpau/doxygen/html/index.html */
46
47 #define INFORMATION G3DVL VDPAU Driver Shared Library version VER_MAJOR.VER_MINOR
48 #define QUOTEME(x) #x
49 #define TOSTRING(x) QUOTEME(x)
50 #define INFORMATION_STRING TOSTRING(INFORMATION)
51 #define VL_HANDLES
52
53 static inline enum pipe_video_chroma_format
54 ChromaToPipe(VdpChromaType vdpau_type)
55 {
56 switch (vdpau_type) {
57 case VDP_CHROMA_TYPE_420:
58 return PIPE_VIDEO_CHROMA_FORMAT_420;
59 case VDP_CHROMA_TYPE_422:
60 return PIPE_VIDEO_CHROMA_FORMAT_422;
61 case VDP_CHROMA_TYPE_444:
62 return PIPE_VIDEO_CHROMA_FORMAT_444;
63 default:
64 assert(0);
65 }
66
67 return -1;
68 }
69
70 static inline VdpChromaType
71 PipeToChroma(enum pipe_video_chroma_format pipe_type)
72 {
73 switch (pipe_type) {
74 case PIPE_VIDEO_CHROMA_FORMAT_420:
75 return VDP_CHROMA_TYPE_420;
76 case PIPE_VIDEO_CHROMA_FORMAT_422:
77 return VDP_CHROMA_TYPE_422;
78 case PIPE_VIDEO_CHROMA_FORMAT_444:
79 return VDP_CHROMA_TYPE_444;
80 default:
81 assert(0);
82 }
83
84 return -1;
85 }
86
87 static inline enum pipe_format
88 FormatYCBCRToPipe(VdpYCbCrFormat vdpau_format)
89 {
90 switch (vdpau_format) {
91 case VDP_YCBCR_FORMAT_NV12:
92 return PIPE_FORMAT_NV12;
93 case VDP_YCBCR_FORMAT_YV12:
94 return PIPE_FORMAT_YV12;
95 case VDP_YCBCR_FORMAT_UYVY:
96 return PIPE_FORMAT_UYVY;
97 case VDP_YCBCR_FORMAT_YUYV:
98 return PIPE_FORMAT_YUYV;
99 case VDP_YCBCR_FORMAT_Y8U8V8A8: /* Not defined in p_format.h */
100 return PIPE_FORMAT_NONE;
101 case VDP_YCBCR_FORMAT_V8U8Y8A8:
102 return PIPE_FORMAT_VUYA;
103 default:
104 assert(0);
105 }
106
107 return PIPE_FORMAT_NONE;
108 }
109
110 static inline VdpYCbCrFormat
111 PipeToFormatYCBCR(enum pipe_format p_format)
112 {
113 switch (p_format) {
114 case PIPE_FORMAT_NV12:
115 return VDP_YCBCR_FORMAT_NV12;
116 case PIPE_FORMAT_YV12:
117 return VDP_YCBCR_FORMAT_YV12;
118 case PIPE_FORMAT_UYVY:
119 return VDP_YCBCR_FORMAT_UYVY;
120 case PIPE_FORMAT_YUYV:
121 return VDP_YCBCR_FORMAT_YUYV;
122 //case PIPE_FORMAT_YUVA:
123 // return VDP_YCBCR_FORMAT_Y8U8V8A8;
124 case PIPE_FORMAT_VUYA:
125 return VDP_YCBCR_FORMAT_V8U8Y8A8;
126 default:
127 assert(0);
128 }
129
130 return -1;
131 }
132
133 static inline enum pipe_format
134 FormatRGBAToPipe(VdpRGBAFormat vdpau_format)
135 {
136 switch (vdpau_format) {
137 case VDP_RGBA_FORMAT_A8:
138 return PIPE_FORMAT_A8_UNORM;
139 case VDP_RGBA_FORMAT_B10G10R10A2:
140 return PIPE_FORMAT_B10G10R10A2_UNORM;
141 case VDP_RGBA_FORMAT_B8G8R8A8:
142 return PIPE_FORMAT_B8G8R8A8_UNORM;
143 case VDP_RGBA_FORMAT_R10G10B10A2:
144 return PIPE_FORMAT_R10G10B10A2_UNORM;
145 case VDP_RGBA_FORMAT_R8G8B8A8:
146 return PIPE_FORMAT_R8G8B8A8_UNORM;
147 default:
148 assert(0);
149 }
150
151 return PIPE_FORMAT_NONE;
152 }
153
154 static inline VdpRGBAFormat
155 PipeToFormatRGBA(enum pipe_format p_format)
156 {
157 switch (p_format) {
158 case PIPE_FORMAT_A8_UNORM:
159 return VDP_RGBA_FORMAT_A8;
160 case PIPE_FORMAT_B10G10R10A2_UNORM:
161 return VDP_RGBA_FORMAT_B10G10R10A2;
162 case PIPE_FORMAT_B8G8R8A8_UNORM:
163 return VDP_RGBA_FORMAT_B8G8R8A8;
164 case PIPE_FORMAT_R10G10B10A2_UNORM:
165 return VDP_RGBA_FORMAT_R10G10B10A2;
166 case PIPE_FORMAT_R8G8B8A8_UNORM:
167 return VDP_RGBA_FORMAT_R8G8B8A8;
168 default:
169 assert(0);
170 }
171
172 return -1;
173 }
174
175 static inline enum pipe_format
176 FormatIndexedToPipe(VdpRGBAFormat vdpau_format)
177 {
178 switch (vdpau_format) {
179 case VDP_INDEXED_FORMAT_A4I4:
180 return PIPE_FORMAT_A4R4_UNORM;
181 case VDP_INDEXED_FORMAT_I4A4:
182 return PIPE_FORMAT_R4A4_UNORM;
183 case VDP_INDEXED_FORMAT_A8I8:
184 return PIPE_FORMAT_A8R8_UNORM;
185 case VDP_INDEXED_FORMAT_I8A8:
186 return PIPE_FORMAT_R8A8_UNORM;
187 default:
188 assert(0);
189 }
190
191 return PIPE_FORMAT_NONE;
192 }
193
194 static inline enum pipe_format
195 FormatColorTableToPipe(VdpColorTableFormat vdpau_format)
196 {
197 switch(vdpau_format) {
198 case VDP_COLOR_TABLE_FORMAT_B8G8R8X8:
199 return PIPE_FORMAT_B8G8R8X8_UNORM;
200 default:
201 assert(0);
202 }
203
204 return PIPE_FORMAT_NONE;
205 }
206
207 static inline enum pipe_video_profile
208 ProfileToPipe(VdpDecoderProfile vdpau_profile)
209 {
210 switch (vdpau_profile) {
211 case VDP_DECODER_PROFILE_MPEG1:
212 return PIPE_VIDEO_PROFILE_MPEG1;
213 case VDP_DECODER_PROFILE_MPEG2_SIMPLE:
214 return PIPE_VIDEO_PROFILE_MPEG2_SIMPLE;
215 case VDP_DECODER_PROFILE_MPEG2_MAIN:
216 return PIPE_VIDEO_PROFILE_MPEG2_MAIN;
217 case VDP_DECODER_PROFILE_H264_BASELINE:
218 return PIPE_VIDEO_PROFILE_MPEG4_AVC_BASELINE;
219 case VDP_DECODER_PROFILE_H264_MAIN:
220 return PIPE_VIDEO_PROFILE_MPEG4_AVC_MAIN;
221 case VDP_DECODER_PROFILE_H264_HIGH:
222 return PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH;
223 default:
224 return PIPE_VIDEO_PROFILE_UNKNOWN;
225 }
226 }
227
228 static inline VdpDecoderProfile
229 PipeToProfile(enum pipe_video_profile p_profile)
230 {
231 switch (p_profile) {
232 case PIPE_VIDEO_PROFILE_MPEG1:
233 return VDP_DECODER_PROFILE_MPEG1;
234 case PIPE_VIDEO_PROFILE_MPEG2_SIMPLE:
235 return VDP_DECODER_PROFILE_MPEG2_SIMPLE;
236 case PIPE_VIDEO_PROFILE_MPEG2_MAIN:
237 return VDP_DECODER_PROFILE_MPEG2_MAIN;
238 case PIPE_VIDEO_PROFILE_MPEG4_AVC_BASELINE:
239 return VDP_DECODER_PROFILE_H264_BASELINE;
240 case PIPE_VIDEO_PROFILE_MPEG4_AVC_MAIN:
241 return VDP_DECODER_PROFILE_H264_MAIN;
242 case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH:
243 return VDP_DECODER_PROFILE_H264_HIGH;
244 default:
245 assert(0);
246 return -1;
247 }
248 }
249
250 static inline struct pipe_video_rect *
251 RectToPipe(const VdpRect *src, struct pipe_video_rect *dst)
252 {
253 if (src) {
254 dst->x = MIN2(src->x1, src->x0);
255 dst->y = MIN2(src->y1, src->y0);
256 dst->w = abs(src->x1 - src->x0);
257 dst->h = abs(src->y1 - src->y0);
258 return dst;
259 }
260 return NULL;
261 }
262
263 typedef struct
264 {
265 struct vl_screen *vscreen;
266 struct vl_context *context;
267 struct vl_compositor compositor;
268 } vlVdpDevice;
269
270 typedef struct
271 {
272 vlVdpDevice *device;
273 Drawable drawable;
274 } vlVdpPresentationQueueTarget;
275
276 typedef struct
277 {
278 vlVdpDevice *device;
279 Drawable drawable;
280 struct vl_compositor compositor;
281 } vlVdpPresentationQueue;
282
283 typedef struct
284 {
285 vlVdpDevice *device;
286 struct vl_compositor compositor;
287 } vlVdpVideoMixer;
288
289 typedef struct
290 {
291 vlVdpDevice *device;
292 struct pipe_video_buffer *video_buffer;
293 } vlVdpSurface;
294
295 typedef uint64_t vlVdpTime;
296
297 typedef struct
298 {
299 vlVdpTime timestamp;
300 vlVdpDevice *device;
301 struct pipe_surface *surface;
302 struct pipe_sampler_view *sampler_view;
303 struct pipe_fence_handle *fence;
304 } vlVdpOutputSurface;
305
306 typedef struct
307 {
308 vlVdpDevice *device;
309 struct pipe_video_decoder *decoder;
310 unsigned num_buffers;
311 void **buffers;
312 unsigned cur_buffer;
313 } vlVdpDecoder;
314
315 typedef uint32_t vlHandle;
316
317 boolean vlCreateHTAB(void);
318 void vlDestroyHTAB(void);
319 vlHandle vlAddDataHTAB(void *data);
320 void* vlGetDataHTAB(vlHandle handle);
321 void vlRemoveDataHTAB(vlHandle handle);
322
323 boolean vlGetFuncFTAB(VdpFuncId function_id, void **func);
324
325 /* Public functions */
326 VdpDeviceCreateX11 vdp_imp_device_create_x11;
327 VdpPresentationQueueTargetCreateX11 vlVdpPresentationQueueTargetCreateX11;
328
329 /* Internal function pointers */
330 VdpGetErrorString vlVdpGetErrorString;
331 VdpDeviceDestroy vlVdpDeviceDestroy;
332 VdpGetProcAddress vlVdpGetProcAddress;
333 VdpGetApiVersion vlVdpGetApiVersion;
334 VdpGetInformationString vlVdpGetInformationString;
335 VdpVideoSurfaceQueryCapabilities vlVdpVideoSurfaceQueryCapabilities;
336 VdpVideoSurfaceQueryGetPutBitsYCbCrCapabilities vlVdpVideoSurfaceQueryGetPutBitsYCbCrCapabilities;
337 VdpDecoderQueryCapabilities vlVdpDecoderQueryCapabilities;
338 VdpOutputSurfaceQueryCapabilities vlVdpOutputSurfaceQueryCapabilities;
339 VdpOutputSurfaceQueryGetPutBitsNativeCapabilities vlVdpOutputSurfaceQueryGetPutBitsNativeCapabilities;
340 VdpOutputSurfaceQueryPutBitsIndexedCapabilities vlVdpOutputSurfaceQueryPutBitsIndexedCapabilities;
341 VdpOutputSurfaceQueryPutBitsYCbCrCapabilities vlVdpOutputSurfaceQueryPutBitsYCbCrCapabilities;
342 VdpBitmapSurfaceQueryCapabilities vlVdpBitmapSurfaceQueryCapabilities;
343 VdpVideoMixerQueryFeatureSupport vlVdpVideoMixerQueryFeatureSupport;
344 VdpVideoMixerQueryParameterSupport vlVdpVideoMixerQueryParameterSupport;
345 VdpVideoMixerQueryParameterValueRange vlVdpVideoMixerQueryParameterValueRange;
346 VdpVideoMixerQueryAttributeSupport vlVdpVideoMixerQueryAttributeSupport;
347 VdpVideoMixerQueryAttributeValueRange vlVdpVideoMixerQueryAttributeValueRange;
348 VdpVideoSurfaceCreate vlVdpVideoSurfaceCreate;
349 VdpVideoSurfaceDestroy vlVdpVideoSurfaceDestroy;
350 VdpVideoSurfaceGetParameters vlVdpVideoSurfaceGetParameters;
351 VdpVideoSurfaceGetBitsYCbCr vlVdpVideoSurfaceGetBitsYCbCr;
352 VdpVideoSurfacePutBitsYCbCr vlVdpVideoSurfacePutBitsYCbCr;
353 VdpDecoderCreate vlVdpDecoderCreate;
354 VdpDecoderDestroy vlVdpDecoderDestroy;
355 VdpDecoderGetParameters vlVdpDecoderGetParameters;
356 VdpDecoderRender vlVdpDecoderRender;
357 VdpOutputSurfaceCreate vlVdpOutputSurfaceCreate;
358 VdpOutputSurfaceDestroy vlVdpOutputSurfaceDestroy;
359 VdpOutputSurfaceGetParameters vlVdpOutputSurfaceGetParameters;
360 VdpOutputSurfaceGetBitsNative vlVdpOutputSurfaceGetBitsNative;
361 VdpOutputSurfacePutBitsNative vlVdpOutputSurfacePutBitsNative;
362 VdpOutputSurfacePutBitsIndexed vlVdpOutputSurfacePutBitsIndexed;
363 VdpOutputSurfacePutBitsYCbCr vlVdpOutputSurfacePutBitsYCbCr;
364 VdpOutputSurfaceRenderOutputSurface vlVdpOutputSurfaceRenderOutputSurface;
365 VdpOutputSurfaceRenderBitmapSurface vlVdpOutputSurfaceRenderBitmapSurface;
366 VdpBitmapSurfaceCreate vlVdpBitmapSurfaceCreate;
367 VdpBitmapSurfaceDestroy vlVdpBitmapSurfaceDestroy;
368 VdpBitmapSurfaceGetParameters vlVdpBitmapSurfaceGetParameters;
369 VdpBitmapSurfacePutBitsNative vlVdpBitmapSurfacePutBitsNative;
370 VdpPresentationQueueTargetDestroy vlVdpPresentationQueueTargetDestroy;
371 VdpPresentationQueueCreate vlVdpPresentationQueueCreate;
372 VdpPresentationQueueDestroy vlVdpPresentationQueueDestroy;
373 VdpPresentationQueueSetBackgroundColor vlVdpPresentationQueueSetBackgroundColor;
374 VdpPresentationQueueGetBackgroundColor vlVdpPresentationQueueGetBackgroundColor;
375 VdpPresentationQueueGetTime vlVdpPresentationQueueGetTime;
376 VdpPresentationQueueDisplay vlVdpPresentationQueueDisplay;
377 VdpPresentationQueueBlockUntilSurfaceIdle vlVdpPresentationQueueBlockUntilSurfaceIdle;
378 VdpPresentationQueueQuerySurfaceStatus vlVdpPresentationQueueQuerySurfaceStatus;
379 VdpPreemptionCallback vlVdpPreemptionCallback;
380 VdpPreemptionCallbackRegister vlVdpPreemptionCallbackRegister;
381 VdpVideoMixerSetFeatureEnables vlVdpVideoMixerSetFeatureEnables;
382 VdpVideoMixerCreate vlVdpVideoMixerCreate;
383 VdpVideoMixerRender vlVdpVideoMixerRender;
384 VdpVideoMixerSetAttributeValues vlVdpVideoMixerSetAttributeValues;
385 VdpVideoMixerGetFeatureSupport vlVdpVideoMixerGetFeatureSupport;
386 VdpVideoMixerGetFeatureEnables vlVdpVideoMixerGetFeatureEnables;
387 VdpVideoMixerGetParameterValues vlVdpVideoMixerGetParameterValues;
388 VdpVideoMixerGetAttributeValues vlVdpVideoMixerGetAttributeValues;
389 VdpVideoMixerDestroy vlVdpVideoMixerDestroy;
390 VdpGenerateCSCMatrix vlVdpGenerateCSCMatrix;
391
392 #define VDPAU_OUT 0
393 #define VDPAU_ERR 1
394 #define VDPAU_WARN 2
395 #define VDPAU_TRACE 3
396
397 static inline void VDPAU_MSG(unsigned int level, const char *fmt, ...)
398 {
399 static int debug_level = -1;
400
401 if (debug_level == -1) {
402 debug_level = MAX2(debug_get_num_option("VDPAU_DEBUG", 0), 0);
403 }
404
405 if (level <= debug_level) {
406 va_list ap;
407 va_start(ap, fmt);
408 _debug_vprintf(fmt, ap);
409 va_end(ap);
410 }
411 }
412
413 #endif /* VDPAU_PRIVATE_H */