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