1 /**************************************************************************
3 * Copyright 2010 Younes Manton & Thomas Balling Sørensen.
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:
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
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 VMWARE 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.
26 **************************************************************************/
28 #ifndef VDPAU_PRIVATE_H
29 #define VDPAU_PRIVATE_H
33 #include <vdpau/vdpau.h>
34 #include <vdpau/vdpau_x11.h>
36 #include "pipe/p_compiler.h"
37 #include "pipe/p_video_codec.h"
39 #include "state_tracker/vdpau_interop.h"
41 #include "util/u_debug.h"
42 #include "util/u_rect.h"
43 #include "os/os_thread.h"
45 #include "vl/vl_compositor.h"
46 #include "vl/vl_csc.h"
47 #include "vl/vl_matrix_filter.h"
48 #include "vl/vl_median_filter.h"
49 #include "vl/vl_winsys.h"
51 /* Full VDPAU API documentation available at :
52 * ftp://download.nvidia.com/XFree86/vdpau/doxygen/html/index.html */
54 #define INFORMATION G3DVL VDPAU Driver Shared Library version VER_MAJOR.VER_MINOR
56 #define TOSTRING(x) QUOTEME(x)
57 #define INFORMATION_STRING TOSTRING(INFORMATION)
60 static inline enum pipe_video_chroma_format
61 ChromaToPipe(VdpChromaType vdpau_type
)
64 case VDP_CHROMA_TYPE_420
:
65 return PIPE_VIDEO_CHROMA_FORMAT_420
;
66 case VDP_CHROMA_TYPE_422
:
67 return PIPE_VIDEO_CHROMA_FORMAT_422
;
68 case VDP_CHROMA_TYPE_444
:
69 return PIPE_VIDEO_CHROMA_FORMAT_444
;
77 static inline VdpChromaType
78 PipeToChroma(enum pipe_video_chroma_format pipe_type
)
81 case PIPE_VIDEO_CHROMA_FORMAT_420
:
82 return VDP_CHROMA_TYPE_420
;
83 case PIPE_VIDEO_CHROMA_FORMAT_422
:
84 return VDP_CHROMA_TYPE_422
;
85 case PIPE_VIDEO_CHROMA_FORMAT_444
:
86 return VDP_CHROMA_TYPE_444
;
94 static inline enum pipe_video_chroma_format
95 FormatYCBCRToPipeChroma(VdpYCbCrFormat vdpau_format
)
97 switch (vdpau_format
) {
98 case VDP_YCBCR_FORMAT_NV12
:
99 return PIPE_VIDEO_CHROMA_FORMAT_420
;
100 case VDP_YCBCR_FORMAT_YV12
:
101 return PIPE_VIDEO_CHROMA_FORMAT_420
;
102 case VDP_YCBCR_FORMAT_UYVY
:
103 return PIPE_VIDEO_CHROMA_FORMAT_422
;
104 case VDP_YCBCR_FORMAT_YUYV
:
105 return PIPE_VIDEO_CHROMA_FORMAT_422
;
106 case VDP_YCBCR_FORMAT_Y8U8V8A8
:
107 return PIPE_VIDEO_CHROMA_FORMAT_444
;
108 case VDP_YCBCR_FORMAT_V8U8Y8A8
:
109 return PIPE_VIDEO_CHROMA_FORMAT_444
;
114 return PIPE_FORMAT_NONE
;
117 static inline enum pipe_format
118 FormatYCBCRToPipe(VdpYCbCrFormat vdpau_format
)
120 switch (vdpau_format
) {
121 case VDP_YCBCR_FORMAT_NV12
:
122 return PIPE_FORMAT_NV12
;
123 case VDP_YCBCR_FORMAT_YV12
:
124 return PIPE_FORMAT_YV12
;
125 case VDP_YCBCR_FORMAT_UYVY
:
126 return PIPE_FORMAT_UYVY
;
127 case VDP_YCBCR_FORMAT_YUYV
:
128 return PIPE_FORMAT_YUYV
;
129 case VDP_YCBCR_FORMAT_Y8U8V8A8
:
130 return PIPE_FORMAT_R8G8B8A8_UNORM
;
131 case VDP_YCBCR_FORMAT_V8U8Y8A8
:
132 return PIPE_FORMAT_B8G8R8A8_UNORM
;
137 return PIPE_FORMAT_NONE
;
140 static inline VdpYCbCrFormat
141 PipeToFormatYCBCR(enum pipe_format p_format
)
144 case PIPE_FORMAT_NV12
:
145 return VDP_YCBCR_FORMAT_NV12
;
146 case PIPE_FORMAT_YV12
:
147 return VDP_YCBCR_FORMAT_YV12
;
148 case PIPE_FORMAT_UYVY
:
149 return VDP_YCBCR_FORMAT_UYVY
;
150 case PIPE_FORMAT_YUYV
:
151 return VDP_YCBCR_FORMAT_YUYV
;
152 case PIPE_FORMAT_R8G8B8A8_UNORM
:
153 return VDP_YCBCR_FORMAT_Y8U8V8A8
;
154 case PIPE_FORMAT_B8G8R8A8_UNORM
:
155 return VDP_YCBCR_FORMAT_V8U8Y8A8
;
163 static inline enum pipe_format
164 FormatRGBAToPipe(VdpRGBAFormat vdpau_format
)
166 switch (vdpau_format
) {
167 case VDP_RGBA_FORMAT_A8
:
168 return PIPE_FORMAT_A8_UNORM
;
169 case VDP_RGBA_FORMAT_B10G10R10A2
:
170 return PIPE_FORMAT_B10G10R10A2_UNORM
;
171 case VDP_RGBA_FORMAT_B8G8R8A8
:
172 return PIPE_FORMAT_B8G8R8A8_UNORM
;
173 case VDP_RGBA_FORMAT_R10G10B10A2
:
174 return PIPE_FORMAT_R10G10B10A2_UNORM
;
175 case VDP_RGBA_FORMAT_R8G8B8A8
:
176 return PIPE_FORMAT_R8G8B8A8_UNORM
;
181 return PIPE_FORMAT_NONE
;
184 static inline VdpRGBAFormat
185 PipeToFormatRGBA(enum pipe_format p_format
)
188 case PIPE_FORMAT_A8_UNORM
:
189 return VDP_RGBA_FORMAT_A8
;
190 case PIPE_FORMAT_B10G10R10A2_UNORM
:
191 return VDP_RGBA_FORMAT_B10G10R10A2
;
192 case PIPE_FORMAT_B8G8R8A8_UNORM
:
193 return VDP_RGBA_FORMAT_B8G8R8A8
;
194 case PIPE_FORMAT_R10G10B10A2_UNORM
:
195 return VDP_RGBA_FORMAT_R10G10B10A2
;
196 case PIPE_FORMAT_R8G8B8A8_UNORM
:
197 return VDP_RGBA_FORMAT_R8G8B8A8
;
205 static inline enum pipe_format
206 FormatIndexedToPipe(VdpRGBAFormat vdpau_format
)
208 switch (vdpau_format
) {
209 case VDP_INDEXED_FORMAT_A4I4
:
210 return PIPE_FORMAT_A4R4_UNORM
;
211 case VDP_INDEXED_FORMAT_I4A4
:
212 return PIPE_FORMAT_R4A4_UNORM
;
213 case VDP_INDEXED_FORMAT_A8I8
:
214 return PIPE_FORMAT_A8R8_UNORM
;
215 case VDP_INDEXED_FORMAT_I8A8
:
216 return PIPE_FORMAT_R8A8_UNORM
;
221 return PIPE_FORMAT_NONE
;
224 static inline enum pipe_format
225 FormatColorTableToPipe(VdpColorTableFormat vdpau_format
)
227 switch(vdpau_format
) {
228 case VDP_COLOR_TABLE_FORMAT_B8G8R8X8
:
229 return PIPE_FORMAT_B8G8R8X8_UNORM
;
234 return PIPE_FORMAT_NONE
;
237 static inline enum pipe_video_profile
238 ProfileToPipe(VdpDecoderProfile vdpau_profile
)
240 switch (vdpau_profile
) {
241 case VDP_DECODER_PROFILE_MPEG1
:
242 return PIPE_VIDEO_PROFILE_MPEG1
;
243 case VDP_DECODER_PROFILE_MPEG2_SIMPLE
:
244 return PIPE_VIDEO_PROFILE_MPEG2_SIMPLE
;
245 case VDP_DECODER_PROFILE_MPEG2_MAIN
:
246 return PIPE_VIDEO_PROFILE_MPEG2_MAIN
;
247 case VDP_DECODER_PROFILE_H264_BASELINE
:
248 return PIPE_VIDEO_PROFILE_MPEG4_AVC_BASELINE
;
249 case VDP_DECODER_PROFILE_H264_MAIN
:
250 return PIPE_VIDEO_PROFILE_MPEG4_AVC_MAIN
;
251 case VDP_DECODER_PROFILE_H264_HIGH
:
252 return PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH
;
253 case VDP_DECODER_PROFILE_MPEG4_PART2_SP
:
254 return PIPE_VIDEO_PROFILE_MPEG4_SIMPLE
;
255 case VDP_DECODER_PROFILE_MPEG4_PART2_ASP
:
256 return PIPE_VIDEO_PROFILE_MPEG4_ADVANCED_SIMPLE
;
257 case VDP_DECODER_PROFILE_VC1_SIMPLE
:
258 return PIPE_VIDEO_PROFILE_VC1_SIMPLE
;
259 case VDP_DECODER_PROFILE_VC1_MAIN
:
260 return PIPE_VIDEO_PROFILE_VC1_MAIN
;
261 case VDP_DECODER_PROFILE_VC1_ADVANCED
:
262 return PIPE_VIDEO_PROFILE_VC1_ADVANCED
;
264 return PIPE_VIDEO_PROFILE_UNKNOWN
;
268 static inline VdpDecoderProfile
269 PipeToProfile(enum pipe_video_profile p_profile
)
272 case PIPE_VIDEO_PROFILE_MPEG1
:
273 return VDP_DECODER_PROFILE_MPEG1
;
274 case PIPE_VIDEO_PROFILE_MPEG2_SIMPLE
:
275 return VDP_DECODER_PROFILE_MPEG2_SIMPLE
;
276 case PIPE_VIDEO_PROFILE_MPEG2_MAIN
:
277 return VDP_DECODER_PROFILE_MPEG2_MAIN
;
278 case PIPE_VIDEO_PROFILE_MPEG4_AVC_BASELINE
:
279 return VDP_DECODER_PROFILE_H264_BASELINE
;
280 case PIPE_VIDEO_PROFILE_MPEG4_AVC_MAIN
:
281 return VDP_DECODER_PROFILE_H264_MAIN
;
282 case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH
:
283 return VDP_DECODER_PROFILE_H264_HIGH
;
284 case PIPE_VIDEO_PROFILE_MPEG4_SIMPLE
:
285 return VDP_DECODER_PROFILE_MPEG4_PART2_SP
;
286 case PIPE_VIDEO_PROFILE_MPEG4_ADVANCED_SIMPLE
:
287 return VDP_DECODER_PROFILE_MPEG4_PART2_ASP
;
288 case PIPE_VIDEO_PROFILE_VC1_SIMPLE
:
289 return VDP_DECODER_PROFILE_VC1_SIMPLE
;
290 case PIPE_VIDEO_PROFILE_VC1_MAIN
:
291 return VDP_DECODER_PROFILE_VC1_MAIN
;
292 case PIPE_VIDEO_PROFILE_VC1_ADVANCED
:
293 return VDP_DECODER_PROFILE_VC1_ADVANCED
;
300 static inline struct u_rect
*
301 RectToPipe(const VdpRect
*src
, struct u_rect
*dst
)
313 static inline struct pipe_box
314 RectToPipeBox(const VdpRect
*rect
, struct pipe_resource
*res
)
321 box
.width
= res
->width0
;
322 box
.height
= res
->height0
;
326 box
.x
= MIN2(rect
->x0
, rect
->x1
);
327 box
.y
= MIN2(rect
->y0
, rect
->y1
);
328 box
.width
= abs(rect
->x1
- rect
->x0
);
329 box
.height
= abs(rect
->y1
- rect
->y0
);
336 CheckSurfaceParams(struct pipe_screen
*screen
,
337 const struct pipe_resource
*templ
)
339 return screen
->is_format_supported(
340 screen
, templ
->format
, templ
->target
, templ
->nr_samples
, templ
->bind
);
345 struct vl_screen
*vscreen
;
346 struct pipe_context
*context
;
347 struct vl_compositor compositor
;
351 struct vl_compositor_state
*cstate
;
352 VdpOutputSurface surface
;
359 struct vl_compositor_state cstate
;
362 bool supported
, enabled
;
364 struct vl_median_filter
*filter
;
368 bool supported
, enabled
;
370 struct vl_matrix_filter
*filter
;
373 unsigned video_width
, video_height
;
374 enum pipe_video_chroma_format chroma_format
;
375 unsigned max_layers
, skip_chroma_deint
;
376 float luma_key_min
, luma_key_max
;
385 struct pipe_video_buffer templat
, *video_buffer
;
391 struct pipe_sampler_view
*sampler_view
;
392 } vlVdpBitmapSurface
;
394 typedef uint64_t vlVdpTime
;
399 struct pipe_surface
*surface
;
400 struct pipe_sampler_view
*sampler_view
;
401 struct pipe_fence_handle
*fence
;
402 struct vl_compositor_state cstate
;
403 struct u_rect dirty_area
;
404 } vlVdpOutputSurface
;
410 } vlVdpPresentationQueueTarget
;
416 struct vl_compositor_state cstate
;
417 vlVdpOutputSurface
*last_surf
;
418 } vlVdpPresentationQueue
;
424 struct pipe_video_codec
*decoder
;
427 typedef uint32_t vlHandle
;
429 boolean
vlCreateHTAB(void);
430 void vlDestroyHTAB(void);
431 vlHandle
vlAddDataHTAB(void *data
);
432 void* vlGetDataHTAB(vlHandle handle
);
433 void vlRemoveDataHTAB(vlHandle handle
);
435 boolean
vlGetFuncFTAB(VdpFuncId function_id
, void **func
);
437 /* Public functions */
438 VdpDeviceCreateX11 vdp_imp_device_create_x11
;
440 void vlVdpDefaultSamplerViewTemplate(struct pipe_sampler_view
*templ
, struct pipe_resource
*res
);
442 /* Delayed rendering funtionality */
443 void vlVdpResolveDelayedRendering(vlVdpDevice
*dev
, struct pipe_surface
*surface
, struct u_rect
*dirty_area
);
444 void vlVdpSave4DelayedRendering(vlVdpDevice
*dev
, VdpOutputSurface surface
, struct vl_compositor_state
*cstate
);
446 /* Internal function pointers */
447 VdpGetErrorString vlVdpGetErrorString
;
448 VdpDeviceDestroy vlVdpDeviceDestroy
;
449 VdpGetProcAddress vlVdpGetProcAddress
;
450 VdpGetApiVersion vlVdpGetApiVersion
;
451 VdpGetInformationString vlVdpGetInformationString
;
452 VdpVideoSurfaceQueryCapabilities vlVdpVideoSurfaceQueryCapabilities
;
453 VdpVideoSurfaceQueryGetPutBitsYCbCrCapabilities vlVdpVideoSurfaceQueryGetPutBitsYCbCrCapabilities
;
454 VdpDecoderQueryCapabilities vlVdpDecoderQueryCapabilities
;
455 VdpOutputSurfaceQueryCapabilities vlVdpOutputSurfaceQueryCapabilities
;
456 VdpOutputSurfaceQueryGetPutBitsNativeCapabilities vlVdpOutputSurfaceQueryGetPutBitsNativeCapabilities
;
457 VdpOutputSurfaceQueryPutBitsIndexedCapabilities vlVdpOutputSurfaceQueryPutBitsIndexedCapabilities
;
458 VdpOutputSurfaceQueryPutBitsYCbCrCapabilities vlVdpOutputSurfaceQueryPutBitsYCbCrCapabilities
;
459 VdpBitmapSurfaceQueryCapabilities vlVdpBitmapSurfaceQueryCapabilities
;
460 VdpVideoMixerQueryFeatureSupport vlVdpVideoMixerQueryFeatureSupport
;
461 VdpVideoMixerQueryParameterSupport vlVdpVideoMixerQueryParameterSupport
;
462 VdpVideoMixerQueryParameterValueRange vlVdpVideoMixerQueryParameterValueRange
;
463 VdpVideoMixerQueryAttributeSupport vlVdpVideoMixerQueryAttributeSupport
;
464 VdpVideoMixerQueryAttributeValueRange vlVdpVideoMixerQueryAttributeValueRange
;
465 VdpVideoSurfaceCreate vlVdpVideoSurfaceCreate
;
466 VdpVideoSurfaceDestroy vlVdpVideoSurfaceDestroy
;
467 VdpVideoSurfaceGetParameters vlVdpVideoSurfaceGetParameters
;
468 VdpVideoSurfaceGetBitsYCbCr vlVdpVideoSurfaceGetBitsYCbCr
;
469 VdpVideoSurfacePutBitsYCbCr vlVdpVideoSurfacePutBitsYCbCr
;
470 void vlVdpVideoSurfaceClear(vlVdpSurface
*vlsurf
);
471 VdpDecoderCreate vlVdpDecoderCreate
;
472 VdpDecoderDestroy vlVdpDecoderDestroy
;
473 VdpDecoderGetParameters vlVdpDecoderGetParameters
;
474 VdpDecoderRender vlVdpDecoderRender
;
475 VdpOutputSurfaceCreate vlVdpOutputSurfaceCreate
;
476 VdpOutputSurfaceDestroy vlVdpOutputSurfaceDestroy
;
477 VdpOutputSurfaceGetParameters vlVdpOutputSurfaceGetParameters
;
478 VdpOutputSurfaceGetBitsNative vlVdpOutputSurfaceGetBitsNative
;
479 VdpOutputSurfacePutBitsNative vlVdpOutputSurfacePutBitsNative
;
480 VdpOutputSurfacePutBitsIndexed vlVdpOutputSurfacePutBitsIndexed
;
481 VdpOutputSurfacePutBitsYCbCr vlVdpOutputSurfacePutBitsYCbCr
;
482 VdpOutputSurfaceRenderOutputSurface vlVdpOutputSurfaceRenderOutputSurface
;
483 VdpOutputSurfaceRenderBitmapSurface vlVdpOutputSurfaceRenderBitmapSurface
;
484 VdpBitmapSurfaceCreate vlVdpBitmapSurfaceCreate
;
485 VdpBitmapSurfaceDestroy vlVdpBitmapSurfaceDestroy
;
486 VdpBitmapSurfaceGetParameters vlVdpBitmapSurfaceGetParameters
;
487 VdpBitmapSurfacePutBitsNative vlVdpBitmapSurfacePutBitsNative
;
488 VdpPresentationQueueTargetDestroy vlVdpPresentationQueueTargetDestroy
;
489 VdpPresentationQueueCreate vlVdpPresentationQueueCreate
;
490 VdpPresentationQueueDestroy vlVdpPresentationQueueDestroy
;
491 VdpPresentationQueueSetBackgroundColor vlVdpPresentationQueueSetBackgroundColor
;
492 VdpPresentationQueueGetBackgroundColor vlVdpPresentationQueueGetBackgroundColor
;
493 VdpPresentationQueueGetTime vlVdpPresentationQueueGetTime
;
494 VdpPresentationQueueDisplay vlVdpPresentationQueueDisplay
;
495 VdpPresentationQueueBlockUntilSurfaceIdle vlVdpPresentationQueueBlockUntilSurfaceIdle
;
496 VdpPresentationQueueQuerySurfaceStatus vlVdpPresentationQueueQuerySurfaceStatus
;
497 VdpPreemptionCallback vlVdpPreemptionCallback
;
498 VdpPreemptionCallbackRegister vlVdpPreemptionCallbackRegister
;
499 VdpVideoMixerSetFeatureEnables vlVdpVideoMixerSetFeatureEnables
;
500 VdpVideoMixerCreate vlVdpVideoMixerCreate
;
501 VdpVideoMixerRender vlVdpVideoMixerRender
;
502 VdpVideoMixerSetAttributeValues vlVdpVideoMixerSetAttributeValues
;
503 VdpVideoMixerGetFeatureSupport vlVdpVideoMixerGetFeatureSupport
;
504 VdpVideoMixerGetFeatureEnables vlVdpVideoMixerGetFeatureEnables
;
505 VdpVideoMixerGetParameterValues vlVdpVideoMixerGetParameterValues
;
506 VdpVideoMixerGetAttributeValues vlVdpVideoMixerGetAttributeValues
;
507 VdpVideoMixerDestroy vlVdpVideoMixerDestroy
;
508 VdpGenerateCSCMatrix vlVdpGenerateCSCMatrix
;
509 /* Winsys specific internal function pointers */
510 VdpPresentationQueueTargetCreateX11 vlVdpPresentationQueueTargetCreateX11
;
513 /* interop to mesa state tracker */
514 VdpVideoSurfaceGallium vlVdpVideoSurfaceGallium
;
515 VdpOutputSurfaceGallium vlVdpOutputSurfaceGallium
;
520 #define VDPAU_TRACE 3
522 static inline void VDPAU_MSG(unsigned int level
, const char *fmt
, ...)
524 static int debug_level
= -1;
526 if (debug_level
== -1) {
527 debug_level
= MAX2(debug_get_num_option("VDPAU_DEBUG", 0), 0);
530 if (level
<= debug_level
) {
533 _debug_vprintf(fmt
, ap
);
538 #endif /* VDPAU_PRIVATE_H */