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