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