vdpau_private.h revision 91d33b5c589a63f73212546825988cfa4f80b207
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 case VDP_DECODER_PROFILE_MPEG4_PART2_SP: 224 return PIPE_VIDEO_PROFILE_MPEG4_SIMPLE; 225 case VDP_DECODER_PROFILE_MPEG4_PART2_ASP: 226 return PIPE_VIDEO_PROFILE_MPEG4_ADVANCED_SIMPLE; 227 default: 228 return PIPE_VIDEO_PROFILE_UNKNOWN; 229 } 230} 231 232static inline VdpDecoderProfile 233PipeToProfile(enum pipe_video_profile p_profile) 234{ 235 switch (p_profile) { 236 case PIPE_VIDEO_PROFILE_MPEG1: 237 return VDP_DECODER_PROFILE_MPEG1; 238 case PIPE_VIDEO_PROFILE_MPEG2_SIMPLE: 239 return VDP_DECODER_PROFILE_MPEG2_SIMPLE; 240 case PIPE_VIDEO_PROFILE_MPEG2_MAIN: 241 return VDP_DECODER_PROFILE_MPEG2_MAIN; 242 case PIPE_VIDEO_PROFILE_MPEG4_AVC_BASELINE: 243 return VDP_DECODER_PROFILE_H264_BASELINE; 244 case PIPE_VIDEO_PROFILE_MPEG4_AVC_MAIN: 245 return VDP_DECODER_PROFILE_H264_MAIN; 246 case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH: 247 return VDP_DECODER_PROFILE_H264_HIGH; 248 case PIPE_VIDEO_PROFILE_MPEG4_SIMPLE: 249 return VDP_DECODER_PROFILE_MPEG4_PART2_SP; 250 case PIPE_VIDEO_PROFILE_MPEG4_ADVANCED_SIMPLE: 251 return VDP_DECODER_PROFILE_MPEG4_PART2_ASP; 252 default: 253 assert(0); 254 return -1; 255 } 256} 257 258static inline struct pipe_video_rect * 259RectToPipe(const VdpRect *src, struct pipe_video_rect *dst) 260{ 261 if (src) { 262 dst->x = MIN2(src->x1, src->x0); 263 dst->y = MIN2(src->y1, src->y0); 264 dst->w = abs(src->x1 - src->x0); 265 dst->h = abs(src->y1 - src->y0); 266 return dst; 267 } 268 return NULL; 269} 270 271typedef struct 272{ 273 struct vl_screen *vscreen; 274 struct vl_context *context; 275 struct vl_compositor compositor; 276} vlVdpDevice; 277 278typedef struct 279{ 280 vlVdpDevice *device; 281 Drawable drawable; 282} vlVdpPresentationQueueTarget; 283 284typedef struct 285{ 286 vlVdpDevice *device; 287 Drawable drawable; 288 struct vl_compositor compositor; 289} vlVdpPresentationQueue; 290 291typedef struct 292{ 293 vlVdpDevice *device; 294 struct vl_compositor compositor; 295} vlVdpVideoMixer; 296 297typedef struct 298{ 299 vlVdpDevice *device; 300 struct pipe_video_buffer *video_buffer; 301} vlVdpSurface; 302 303typedef uint64_t vlVdpTime; 304 305typedef struct 306{ 307 vlVdpTime timestamp; 308 vlVdpDevice *device; 309 struct pipe_surface *surface; 310 struct pipe_sampler_view *sampler_view; 311 struct pipe_fence_handle *fence; 312} vlVdpOutputSurface; 313 314typedef struct 315{ 316 vlVdpDevice *device; 317 struct pipe_video_decoder *decoder; 318 unsigned num_buffers; 319 void **buffers; 320 unsigned cur_buffer; 321} vlVdpDecoder; 322 323typedef uint32_t vlHandle; 324 325boolean vlCreateHTAB(void); 326void vlDestroyHTAB(void); 327vlHandle vlAddDataHTAB(void *data); 328void* vlGetDataHTAB(vlHandle handle); 329void vlRemoveDataHTAB(vlHandle handle); 330 331boolean vlGetFuncFTAB(VdpFuncId function_id, void **func); 332 333/* Public functions */ 334VdpDeviceCreateX11 vdp_imp_device_create_x11; 335VdpPresentationQueueTargetCreateX11 vlVdpPresentationQueueTargetCreateX11; 336 337/* Internal function pointers */ 338VdpGetErrorString vlVdpGetErrorString; 339VdpDeviceDestroy vlVdpDeviceDestroy; 340VdpGetProcAddress vlVdpGetProcAddress; 341VdpGetApiVersion vlVdpGetApiVersion; 342VdpGetInformationString vlVdpGetInformationString; 343VdpVideoSurfaceQueryCapabilities vlVdpVideoSurfaceQueryCapabilities; 344VdpVideoSurfaceQueryGetPutBitsYCbCrCapabilities vlVdpVideoSurfaceQueryGetPutBitsYCbCrCapabilities; 345VdpDecoderQueryCapabilities vlVdpDecoderQueryCapabilities; 346VdpOutputSurfaceQueryCapabilities vlVdpOutputSurfaceQueryCapabilities; 347VdpOutputSurfaceQueryGetPutBitsNativeCapabilities vlVdpOutputSurfaceQueryGetPutBitsNativeCapabilities; 348VdpOutputSurfaceQueryPutBitsIndexedCapabilities vlVdpOutputSurfaceQueryPutBitsIndexedCapabilities; 349VdpOutputSurfaceQueryPutBitsYCbCrCapabilities vlVdpOutputSurfaceQueryPutBitsYCbCrCapabilities; 350VdpBitmapSurfaceQueryCapabilities vlVdpBitmapSurfaceQueryCapabilities; 351VdpVideoMixerQueryFeatureSupport vlVdpVideoMixerQueryFeatureSupport; 352VdpVideoMixerQueryParameterSupport vlVdpVideoMixerQueryParameterSupport; 353VdpVideoMixerQueryParameterValueRange vlVdpVideoMixerQueryParameterValueRange; 354VdpVideoMixerQueryAttributeSupport vlVdpVideoMixerQueryAttributeSupport; 355VdpVideoMixerQueryAttributeValueRange vlVdpVideoMixerQueryAttributeValueRange; 356VdpVideoSurfaceCreate vlVdpVideoSurfaceCreate; 357VdpVideoSurfaceDestroy vlVdpVideoSurfaceDestroy; 358VdpVideoSurfaceGetParameters vlVdpVideoSurfaceGetParameters; 359VdpVideoSurfaceGetBitsYCbCr vlVdpVideoSurfaceGetBitsYCbCr; 360VdpVideoSurfacePutBitsYCbCr vlVdpVideoSurfacePutBitsYCbCr; 361VdpDecoderCreate vlVdpDecoderCreate; 362VdpDecoderDestroy vlVdpDecoderDestroy; 363VdpDecoderGetParameters vlVdpDecoderGetParameters; 364VdpDecoderRender vlVdpDecoderRender; 365VdpOutputSurfaceCreate vlVdpOutputSurfaceCreate; 366VdpOutputSurfaceDestroy vlVdpOutputSurfaceDestroy; 367VdpOutputSurfaceGetParameters vlVdpOutputSurfaceGetParameters; 368VdpOutputSurfaceGetBitsNative vlVdpOutputSurfaceGetBitsNative; 369VdpOutputSurfacePutBitsNative vlVdpOutputSurfacePutBitsNative; 370VdpOutputSurfacePutBitsIndexed vlVdpOutputSurfacePutBitsIndexed; 371VdpOutputSurfacePutBitsYCbCr vlVdpOutputSurfacePutBitsYCbCr; 372VdpOutputSurfaceRenderOutputSurface vlVdpOutputSurfaceRenderOutputSurface; 373VdpOutputSurfaceRenderBitmapSurface vlVdpOutputSurfaceRenderBitmapSurface; 374VdpBitmapSurfaceCreate vlVdpBitmapSurfaceCreate; 375VdpBitmapSurfaceDestroy vlVdpBitmapSurfaceDestroy; 376VdpBitmapSurfaceGetParameters vlVdpBitmapSurfaceGetParameters; 377VdpBitmapSurfacePutBitsNative vlVdpBitmapSurfacePutBitsNative; 378VdpPresentationQueueTargetDestroy vlVdpPresentationQueueTargetDestroy; 379VdpPresentationQueueCreate vlVdpPresentationQueueCreate; 380VdpPresentationQueueDestroy vlVdpPresentationQueueDestroy; 381VdpPresentationQueueSetBackgroundColor vlVdpPresentationQueueSetBackgroundColor; 382VdpPresentationQueueGetBackgroundColor vlVdpPresentationQueueGetBackgroundColor; 383VdpPresentationQueueGetTime vlVdpPresentationQueueGetTime; 384VdpPresentationQueueDisplay vlVdpPresentationQueueDisplay; 385VdpPresentationQueueBlockUntilSurfaceIdle vlVdpPresentationQueueBlockUntilSurfaceIdle; 386VdpPresentationQueueQuerySurfaceStatus vlVdpPresentationQueueQuerySurfaceStatus; 387VdpPreemptionCallback vlVdpPreemptionCallback; 388VdpPreemptionCallbackRegister vlVdpPreemptionCallbackRegister; 389VdpVideoMixerSetFeatureEnables vlVdpVideoMixerSetFeatureEnables; 390VdpVideoMixerCreate vlVdpVideoMixerCreate; 391VdpVideoMixerRender vlVdpVideoMixerRender; 392VdpVideoMixerSetAttributeValues vlVdpVideoMixerSetAttributeValues; 393VdpVideoMixerGetFeatureSupport vlVdpVideoMixerGetFeatureSupport; 394VdpVideoMixerGetFeatureEnables vlVdpVideoMixerGetFeatureEnables; 395VdpVideoMixerGetParameterValues vlVdpVideoMixerGetParameterValues; 396VdpVideoMixerGetAttributeValues vlVdpVideoMixerGetAttributeValues; 397VdpVideoMixerDestroy vlVdpVideoMixerDestroy; 398VdpGenerateCSCMatrix vlVdpGenerateCSCMatrix; 399 400#define VDPAU_OUT 0 401#define VDPAU_ERR 1 402#define VDPAU_WARN 2 403#define VDPAU_TRACE 3 404 405static inline void VDPAU_MSG(unsigned int level, const char *fmt, ...) 406{ 407 static int debug_level = -1; 408 409 if (debug_level == -1) { 410 debug_level = MAX2(debug_get_num_option("VDPAU_DEBUG", 0), 0); 411 } 412 413 if (level <= debug_level) { 414 va_list ap; 415 va_start(ap, fmt); 416 _debug_vprintf(fmt, ap); 417 va_end(ap); 418 } 419} 420 421#endif /* VDPAU_PRIVATE_H */ 422