vdpau_private.h revision e8e0756bd35e5e3b70a0eee323f5aaa3707fe11d
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 "util/u_rect.h"
41#include "vl/vl_compositor.h"
42
43#include "vl_winsys.h"
44
45/* Full VDPAU API documentation available at :
46 * ftp://download.nvidia.com/XFree86/vdpau/doxygen/html/index.html */
47
48#define INFORMATION G3DVL VDPAU Driver Shared Library version VER_MAJOR.VER_MINOR
49#define QUOTEME(x) #x
50#define TOSTRING(x) QUOTEME(x)
51#define INFORMATION_STRING TOSTRING(INFORMATION)
52#define VL_HANDLES
53
54static inline enum pipe_video_chroma_format
55ChromaToPipe(VdpChromaType vdpau_type)
56{
57   switch (vdpau_type) {
58      case VDP_CHROMA_TYPE_420:
59         return PIPE_VIDEO_CHROMA_FORMAT_420;
60      case VDP_CHROMA_TYPE_422:
61         return PIPE_VIDEO_CHROMA_FORMAT_422;
62      case VDP_CHROMA_TYPE_444:
63         return PIPE_VIDEO_CHROMA_FORMAT_444;
64      default:
65         assert(0);
66   }
67
68   return -1;
69}
70
71static inline VdpChromaType
72PipeToChroma(enum pipe_video_chroma_format pipe_type)
73{
74   switch (pipe_type) {
75      case PIPE_VIDEO_CHROMA_FORMAT_420:
76         return VDP_CHROMA_TYPE_420;
77      case PIPE_VIDEO_CHROMA_FORMAT_422:
78         return VDP_CHROMA_TYPE_422;
79      case PIPE_VIDEO_CHROMA_FORMAT_444:
80         return VDP_CHROMA_TYPE_444;
81      default:
82         assert(0);
83   }
84
85   return -1;
86}
87
88static inline enum pipe_format
89FormatYCBCRToPipe(VdpYCbCrFormat vdpau_format)
90{
91   switch (vdpau_format) {
92      case VDP_YCBCR_FORMAT_NV12:
93         return PIPE_FORMAT_NV12;
94      case VDP_YCBCR_FORMAT_YV12:
95         return PIPE_FORMAT_YV12;
96      case VDP_YCBCR_FORMAT_UYVY:
97         return PIPE_FORMAT_UYVY;
98      case VDP_YCBCR_FORMAT_YUYV:
99         return PIPE_FORMAT_YUYV;
100      case VDP_YCBCR_FORMAT_Y8U8V8A8: /* Not defined in p_format.h */
101         return PIPE_FORMAT_NONE;
102      case VDP_YCBCR_FORMAT_V8U8Y8A8:
103	     return PIPE_FORMAT_VUYA;
104      default:
105         assert(0);
106   }
107
108   return PIPE_FORMAT_NONE;
109}
110
111static inline VdpYCbCrFormat
112PipeToFormatYCBCR(enum pipe_format p_format)
113{
114   switch (p_format) {
115      case PIPE_FORMAT_NV12:
116         return VDP_YCBCR_FORMAT_NV12;
117      case PIPE_FORMAT_YV12:
118         return VDP_YCBCR_FORMAT_YV12;
119      case PIPE_FORMAT_UYVY:
120         return VDP_YCBCR_FORMAT_UYVY;
121      case PIPE_FORMAT_YUYV:
122         return VDP_YCBCR_FORMAT_YUYV;
123      //case PIPE_FORMAT_YUVA:
124        // return VDP_YCBCR_FORMAT_Y8U8V8A8;
125      case PIPE_FORMAT_VUYA:
126         return VDP_YCBCR_FORMAT_V8U8Y8A8;
127      default:
128         assert(0);
129   }
130
131   return -1;
132}
133
134static inline enum pipe_format
135FormatRGBAToPipe(VdpRGBAFormat vdpau_format)
136{
137   switch (vdpau_format) {
138      case VDP_RGBA_FORMAT_A8:
139         return PIPE_FORMAT_A8_UNORM;
140      case VDP_RGBA_FORMAT_B10G10R10A2:
141         return PIPE_FORMAT_B10G10R10A2_UNORM;
142      case VDP_RGBA_FORMAT_B8G8R8A8:
143         return PIPE_FORMAT_B8G8R8A8_UNORM;
144      case VDP_RGBA_FORMAT_R10G10B10A2:
145         return PIPE_FORMAT_R10G10B10A2_UNORM;
146      case VDP_RGBA_FORMAT_R8G8B8A8:
147         return PIPE_FORMAT_R8G8B8A8_UNORM;
148      default:
149         assert(0);
150   }
151
152   return PIPE_FORMAT_NONE;
153}
154
155static inline VdpRGBAFormat
156PipeToFormatRGBA(enum pipe_format p_format)
157{
158   switch (p_format) {
159      case PIPE_FORMAT_A8_UNORM:
160         return VDP_RGBA_FORMAT_A8;
161      case PIPE_FORMAT_B10G10R10A2_UNORM:
162         return VDP_RGBA_FORMAT_B10G10R10A2;
163      case PIPE_FORMAT_B8G8R8A8_UNORM:
164         return VDP_RGBA_FORMAT_B8G8R8A8;
165      case PIPE_FORMAT_R10G10B10A2_UNORM:
166         return VDP_RGBA_FORMAT_R10G10B10A2;
167      case PIPE_FORMAT_R8G8B8A8_UNORM:
168         return VDP_RGBA_FORMAT_R8G8B8A8;
169      default:
170         assert(0);
171   }
172
173   return -1;
174}
175
176static inline enum pipe_format
177FormatIndexedToPipe(VdpRGBAFormat vdpau_format)
178{
179   switch (vdpau_format) {
180      case VDP_INDEXED_FORMAT_A4I4:
181         return PIPE_FORMAT_A4R4_UNORM;
182      case VDP_INDEXED_FORMAT_I4A4:
183         return PIPE_FORMAT_R4A4_UNORM;
184      case VDP_INDEXED_FORMAT_A8I8:
185         return PIPE_FORMAT_A8R8_UNORM;
186      case VDP_INDEXED_FORMAT_I8A8:
187         return PIPE_FORMAT_R8A8_UNORM;
188      default:
189         assert(0);
190   }
191
192   return PIPE_FORMAT_NONE;
193}
194
195static inline enum pipe_format
196FormatColorTableToPipe(VdpColorTableFormat vdpau_format)
197{
198   switch(vdpau_format) {
199      case VDP_COLOR_TABLE_FORMAT_B8G8R8X8:
200         return PIPE_FORMAT_B8G8R8X8_UNORM;
201      default:
202         assert(0);
203   }
204
205   return PIPE_FORMAT_NONE;
206}
207
208static inline enum pipe_video_profile
209ProfileToPipe(VdpDecoderProfile vdpau_profile)
210{
211   switch (vdpau_profile) {
212      case VDP_DECODER_PROFILE_MPEG1:
213         return PIPE_VIDEO_PROFILE_MPEG1;
214      case VDP_DECODER_PROFILE_MPEG2_SIMPLE:
215         return PIPE_VIDEO_PROFILE_MPEG2_SIMPLE;
216      case VDP_DECODER_PROFILE_MPEG2_MAIN:
217         return PIPE_VIDEO_PROFILE_MPEG2_MAIN;
218      case VDP_DECODER_PROFILE_H264_BASELINE:
219         return PIPE_VIDEO_PROFILE_MPEG4_AVC_BASELINE;
220      case VDP_DECODER_PROFILE_H264_MAIN:
221         return PIPE_VIDEO_PROFILE_MPEG4_AVC_MAIN;
222      case VDP_DECODER_PROFILE_H264_HIGH:
223         return PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH;
224      case VDP_DECODER_PROFILE_MPEG4_PART2_SP:
225         return PIPE_VIDEO_PROFILE_MPEG4_SIMPLE;
226      case VDP_DECODER_PROFILE_MPEG4_PART2_ASP:
227         return PIPE_VIDEO_PROFILE_MPEG4_ADVANCED_SIMPLE;
228      case VDP_DECODER_PROFILE_VC1_SIMPLE:
229         return PIPE_VIDEO_PROFILE_VC1_SIMPLE;
230      case VDP_DECODER_PROFILE_VC1_MAIN:
231         return PIPE_VIDEO_PROFILE_VC1_MAIN;
232      case VDP_DECODER_PROFILE_VC1_ADVANCED:
233         return PIPE_VIDEO_PROFILE_VC1_ADVANCED;
234      default:
235         return PIPE_VIDEO_PROFILE_UNKNOWN;
236   }
237}
238
239static inline VdpDecoderProfile
240PipeToProfile(enum pipe_video_profile p_profile)
241{
242   switch (p_profile) {
243      case PIPE_VIDEO_PROFILE_MPEG1:
244         return VDP_DECODER_PROFILE_MPEG1;
245      case PIPE_VIDEO_PROFILE_MPEG2_SIMPLE:
246         return VDP_DECODER_PROFILE_MPEG2_SIMPLE;
247      case PIPE_VIDEO_PROFILE_MPEG2_MAIN:
248         return VDP_DECODER_PROFILE_MPEG2_MAIN;
249      case PIPE_VIDEO_PROFILE_MPEG4_AVC_BASELINE:
250         return VDP_DECODER_PROFILE_H264_BASELINE;
251      case PIPE_VIDEO_PROFILE_MPEG4_AVC_MAIN:
252         return VDP_DECODER_PROFILE_H264_MAIN;
253      case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH:
254         return VDP_DECODER_PROFILE_H264_HIGH;
255      case PIPE_VIDEO_PROFILE_MPEG4_SIMPLE:
256         return VDP_DECODER_PROFILE_MPEG4_PART2_SP;
257      case PIPE_VIDEO_PROFILE_MPEG4_ADVANCED_SIMPLE:
258         return VDP_DECODER_PROFILE_MPEG4_PART2_ASP;
259      case PIPE_VIDEO_PROFILE_VC1_SIMPLE:
260         return VDP_DECODER_PROFILE_VC1_SIMPLE;
261      case PIPE_VIDEO_PROFILE_VC1_MAIN:
262         return VDP_DECODER_PROFILE_VC1_MAIN;
263      case PIPE_VIDEO_PROFILE_VC1_ADVANCED:
264         return VDP_DECODER_PROFILE_VC1_ADVANCED;
265      default:
266         assert(0);
267         return -1;
268   }
269}
270
271static inline struct pipe_video_rect *
272RectToPipe(const VdpRect *src, struct pipe_video_rect *dst)
273{
274   if (src) {
275      dst->x = MIN2(src->x1, src->x0);
276      dst->y = MIN2(src->y1, src->y0);
277      dst->w = abs(src->x1 - src->x0);
278      dst->h = abs(src->y1 - src->y0);
279      return dst;
280   }
281   return NULL;
282}
283
284typedef struct
285{
286   struct vl_screen *vscreen;
287   struct vl_context *context;
288   struct vl_compositor compositor;
289} vlVdpDevice;
290
291typedef struct
292{
293   vlVdpDevice *device;
294   Drawable drawable;
295} vlVdpPresentationQueueTarget;
296
297typedef struct
298{
299   vlVdpDevice *device;
300   Drawable drawable;
301   struct vl_compositor compositor;
302   struct u_rect dirty_area;
303} vlVdpPresentationQueue;
304
305typedef struct
306{
307   vlVdpDevice *device;
308   struct vl_compositor compositor;
309   unsigned video_width, video_height;
310   enum pipe_video_chroma_format chroma_format;
311   unsigned max_layers, skip_chroma_deint, custom_csc;
312   float luma_key_min, luma_key_max, sharpness, noise_reduction_level;
313   float csc[16];
314} vlVdpVideoMixer;
315
316typedef struct
317{
318   vlVdpDevice *device;
319   struct pipe_video_buffer *video_buffer;
320} vlVdpSurface;
321
322typedef uint64_t vlVdpTime;
323
324typedef struct
325{
326   vlVdpTime timestamp;
327   vlVdpDevice *device;
328   struct pipe_surface *surface;
329   struct pipe_sampler_view *sampler_view;
330   struct pipe_fence_handle *fence;
331   struct u_rect dirty_area;
332} vlVdpOutputSurface;
333
334typedef struct
335{
336   vlVdpDevice *device;
337   struct pipe_video_decoder *decoder;
338   unsigned num_buffers;
339   void **buffers;
340   unsigned cur_buffer;
341} vlVdpDecoder;
342
343typedef uint32_t vlHandle;
344
345boolean vlCreateHTAB(void);
346void vlDestroyHTAB(void);
347vlHandle vlAddDataHTAB(void *data);
348void* vlGetDataHTAB(vlHandle handle);
349void vlRemoveDataHTAB(vlHandle handle);
350
351boolean vlGetFuncFTAB(VdpFuncId function_id, void **func);
352
353/* Public functions */
354VdpDeviceCreateX11 vdp_imp_device_create_x11;
355VdpPresentationQueueTargetCreateX11 vlVdpPresentationQueueTargetCreateX11;
356
357/* Internal function pointers */
358VdpGetErrorString vlVdpGetErrorString;
359VdpDeviceDestroy vlVdpDeviceDestroy;
360VdpGetProcAddress vlVdpGetProcAddress;
361VdpGetApiVersion vlVdpGetApiVersion;
362VdpGetInformationString vlVdpGetInformationString;
363VdpVideoSurfaceQueryCapabilities vlVdpVideoSurfaceQueryCapabilities;
364VdpVideoSurfaceQueryGetPutBitsYCbCrCapabilities vlVdpVideoSurfaceQueryGetPutBitsYCbCrCapabilities;
365VdpDecoderQueryCapabilities vlVdpDecoderQueryCapabilities;
366VdpOutputSurfaceQueryCapabilities vlVdpOutputSurfaceQueryCapabilities;
367VdpOutputSurfaceQueryGetPutBitsNativeCapabilities vlVdpOutputSurfaceQueryGetPutBitsNativeCapabilities;
368VdpOutputSurfaceQueryPutBitsIndexedCapabilities vlVdpOutputSurfaceQueryPutBitsIndexedCapabilities;
369VdpOutputSurfaceQueryPutBitsYCbCrCapabilities vlVdpOutputSurfaceQueryPutBitsYCbCrCapabilities;
370VdpBitmapSurfaceQueryCapabilities vlVdpBitmapSurfaceQueryCapabilities;
371VdpVideoMixerQueryFeatureSupport vlVdpVideoMixerQueryFeatureSupport;
372VdpVideoMixerQueryParameterSupport vlVdpVideoMixerQueryParameterSupport;
373VdpVideoMixerQueryParameterValueRange vlVdpVideoMixerQueryParameterValueRange;
374VdpVideoMixerQueryAttributeSupport vlVdpVideoMixerQueryAttributeSupport;
375VdpVideoMixerQueryAttributeValueRange vlVdpVideoMixerQueryAttributeValueRange;
376VdpVideoSurfaceCreate vlVdpVideoSurfaceCreate;
377VdpVideoSurfaceDestroy vlVdpVideoSurfaceDestroy;
378VdpVideoSurfaceGetParameters vlVdpVideoSurfaceGetParameters;
379VdpVideoSurfaceGetBitsYCbCr vlVdpVideoSurfaceGetBitsYCbCr;
380VdpVideoSurfacePutBitsYCbCr vlVdpVideoSurfacePutBitsYCbCr;
381VdpDecoderCreate vlVdpDecoderCreate;
382VdpDecoderDestroy vlVdpDecoderDestroy;
383VdpDecoderGetParameters vlVdpDecoderGetParameters;
384VdpDecoderRender vlVdpDecoderRender;
385VdpOutputSurfaceCreate vlVdpOutputSurfaceCreate;
386VdpOutputSurfaceDestroy vlVdpOutputSurfaceDestroy;
387VdpOutputSurfaceGetParameters vlVdpOutputSurfaceGetParameters;
388VdpOutputSurfaceGetBitsNative vlVdpOutputSurfaceGetBitsNative;
389VdpOutputSurfacePutBitsNative vlVdpOutputSurfacePutBitsNative;
390VdpOutputSurfacePutBitsIndexed vlVdpOutputSurfacePutBitsIndexed;
391VdpOutputSurfacePutBitsYCbCr vlVdpOutputSurfacePutBitsYCbCr;
392VdpOutputSurfaceRenderOutputSurface vlVdpOutputSurfaceRenderOutputSurface;
393VdpOutputSurfaceRenderBitmapSurface vlVdpOutputSurfaceRenderBitmapSurface;
394VdpBitmapSurfaceCreate vlVdpBitmapSurfaceCreate;
395VdpBitmapSurfaceDestroy vlVdpBitmapSurfaceDestroy;
396VdpBitmapSurfaceGetParameters vlVdpBitmapSurfaceGetParameters;
397VdpBitmapSurfacePutBitsNative vlVdpBitmapSurfacePutBitsNative;
398VdpPresentationQueueTargetDestroy vlVdpPresentationQueueTargetDestroy;
399VdpPresentationQueueCreate vlVdpPresentationQueueCreate;
400VdpPresentationQueueDestroy vlVdpPresentationQueueDestroy;
401VdpPresentationQueueSetBackgroundColor vlVdpPresentationQueueSetBackgroundColor;
402VdpPresentationQueueGetBackgroundColor vlVdpPresentationQueueGetBackgroundColor;
403VdpPresentationQueueGetTime vlVdpPresentationQueueGetTime;
404VdpPresentationQueueDisplay vlVdpPresentationQueueDisplay;
405VdpPresentationQueueBlockUntilSurfaceIdle vlVdpPresentationQueueBlockUntilSurfaceIdle;
406VdpPresentationQueueQuerySurfaceStatus vlVdpPresentationQueueQuerySurfaceStatus;
407VdpPreemptionCallback vlVdpPreemptionCallback;
408VdpPreemptionCallbackRegister vlVdpPreemptionCallbackRegister;
409VdpVideoMixerSetFeatureEnables vlVdpVideoMixerSetFeatureEnables;
410VdpVideoMixerCreate vlVdpVideoMixerCreate;
411VdpVideoMixerRender vlVdpVideoMixerRender;
412VdpVideoMixerSetAttributeValues vlVdpVideoMixerSetAttributeValues;
413VdpVideoMixerGetFeatureSupport vlVdpVideoMixerGetFeatureSupport;
414VdpVideoMixerGetFeatureEnables vlVdpVideoMixerGetFeatureEnables;
415VdpVideoMixerGetParameterValues vlVdpVideoMixerGetParameterValues;
416VdpVideoMixerGetAttributeValues vlVdpVideoMixerGetAttributeValues;
417VdpVideoMixerDestroy vlVdpVideoMixerDestroy;
418VdpGenerateCSCMatrix vlVdpGenerateCSCMatrix;
419
420#define VDPAU_OUT   0
421#define VDPAU_ERR   1
422#define VDPAU_WARN  2
423#define VDPAU_TRACE 3
424
425static inline void VDPAU_MSG(unsigned int level, const char *fmt, ...)
426{
427   static int debug_level = -1;
428
429   if (debug_level == -1) {
430      debug_level = MAX2(debug_get_num_option("VDPAU_DEBUG", 0), 0);
431   }
432
433   if (level <= debug_level) {
434      va_list ap;
435      va_start(ap, fmt);
436      _debug_vprintf(fmt, ap);
437      va_end(ap);
438   }
439}
440
441#endif /* VDPAU_PRIVATE_H */
442