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