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