Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  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
  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
  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
  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
  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
  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
  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
  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
  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
  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
  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 *
  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
  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.    struct vl_compositor_state cstate;
  327.  
  328.    struct {
  329.       bool supported, enabled;
  330.       unsigned level;
  331.       struct vl_median_filter *filter;
  332.    } noise_reduction;
  333.  
  334.    struct {
  335.       bool supported, enabled;
  336.       float value;
  337.       struct vl_matrix_filter *filter;
  338.    } sharpness;
  339.  
  340.    unsigned video_width, video_height;
  341.    enum pipe_video_chroma_format chroma_format;
  342.    unsigned max_layers, skip_chroma_deint;
  343.    float luma_key_min, luma_key_max;
  344.  
  345.    bool custom_csc;
  346.    vl_csc_matrix csc;
  347. } vlVdpVideoMixer;
  348.  
  349. typedef struct
  350. {
  351.    vlVdpDevice *device;
  352.    struct pipe_video_buffer templat, *video_buffer;
  353. } vlVdpSurface;
  354.  
  355. typedef struct
  356. {
  357.    vlVdpDevice *device;
  358.    struct pipe_sampler_view *sampler_view;
  359. } vlVdpBitmapSurface;
  360.  
  361. typedef uint64_t vlVdpTime;
  362.  
  363. typedef struct
  364. {
  365.    vlVdpDevice *device;
  366.    struct pipe_surface *surface;
  367.    struct pipe_sampler_view *sampler_view;
  368.    struct pipe_fence_handle *fence;
  369.    struct vl_compositor_state cstate;
  370.    struct u_rect dirty_area;
  371. } vlVdpOutputSurface;
  372.  
  373. typedef struct
  374. {
  375.    vlVdpDevice *device;
  376.    Drawable drawable;
  377. } vlVdpPresentationQueueTarget;
  378.  
  379. typedef struct
  380. {
  381.    vlVdpDevice *device;
  382.    Drawable drawable;
  383.    struct vl_compositor_state cstate;
  384.    vlVdpOutputSurface *last_surf;
  385. } vlVdpPresentationQueue;
  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.  
  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.