Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
4358 Serge 1
/**************************************************************************
2
 *
3
 * Copyright 2010 Younes Manton.
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
#include 
29
#include 
30
 
31
#include "vdpau_private.h"
32
#include "pipe/p_screen.h"
33
#include "pipe/p_defines.h"
34
#include "util/u_debug.h"
35
 
36
/**
37
 * Retrieve the VDPAU version implemented by the backend.
38
 */
39
VdpStatus
40
vlVdpGetApiVersion(uint32_t *api_version)
41
{
42
   if (!api_version)
43
      return VDP_STATUS_INVALID_POINTER;
44
 
45
   *api_version = 1;
46
   return VDP_STATUS_OK;
47
}
48
 
49
/**
50
 * Retrieve an implementation-specific string description of the implementation.
51
 * This typically includes detailed version information.
52
 */
53
VdpStatus
54
vlVdpGetInformationString(char const **information_string)
55
{
56
   if (!information_string)
57
      return VDP_STATUS_INVALID_POINTER;
58
 
59
   *information_string = INFORMATION_STRING;
60
   return VDP_STATUS_OK;
61
}
62
 
63
/**
64
 * Query the implementation's VdpVideoSurface capabilities.
65
 */
66
VdpStatus
67
vlVdpVideoSurfaceQueryCapabilities(VdpDevice device, VdpChromaType surface_chroma_type,
68
                                   VdpBool *is_supported, uint32_t *max_width, uint32_t *max_height)
69
{
70
   vlVdpDevice *dev;
71
   struct pipe_screen *pscreen;
72
   uint32_t max_2d_texture_level;
73
 
74
   if (!(is_supported && max_width && max_height))
75
      return VDP_STATUS_INVALID_POINTER;
76
 
77
   dev = vlGetDataHTAB(device);
78
   if (!dev)
79
      return VDP_STATUS_INVALID_HANDLE;
80
 
81
   pscreen = dev->vscreen->pscreen;
82
   if (!pscreen)
83
      return VDP_STATUS_RESOURCES;
84
 
85
   pipe_mutex_lock(dev->mutex);
86
 
87
   /* XXX: Current limits */
88
   *is_supported = true;
89
   max_2d_texture_level = pscreen->get_param(pscreen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS);
90
   pipe_mutex_unlock(dev->mutex);
91
   if (!max_2d_texture_level)
92
      return VDP_STATUS_RESOURCES;
93
 
94
   /* I am not quite sure if it is max_2d_texture_level-1 or just max_2d_texture_level */
95
   *max_width = *max_height = pow(2,max_2d_texture_level-1);
96
 
97
   return VDP_STATUS_OK;
98
}
99
 
100
/**
101
 * Query the implementation's VdpVideoSurface GetBits/PutBits capabilities.
102
 */
103
VdpStatus
104
vlVdpVideoSurfaceQueryGetPutBitsYCbCrCapabilities(VdpDevice device, VdpChromaType surface_chroma_type,
105
                                                  VdpYCbCrFormat bits_ycbcr_format,
106
                                                  VdpBool *is_supported)
107
{
108
   vlVdpDevice *dev;
109
   struct pipe_screen *pscreen;
110
 
111
   if (!is_supported)
112
      return VDP_STATUS_INVALID_POINTER;
113
 
114
   dev = vlGetDataHTAB(device);
115
   if (!dev)
116
      return VDP_STATUS_INVALID_HANDLE;
117
 
118
   pscreen = dev->vscreen->pscreen;
119
   if (!pscreen)
120
      return VDP_STATUS_RESOURCES;
121
 
122
   pipe_mutex_lock(dev->mutex);
123
 
124
   switch(bits_ycbcr_format) {
125
   case VDP_YCBCR_FORMAT_UYVY:
126
   case VDP_YCBCR_FORMAT_YUYV:
127
      *is_supported = surface_chroma_type == VDP_CHROMA_TYPE_422;
128
      break;
129
 
130
   case VDP_YCBCR_FORMAT_Y8U8V8A8:
131
   case VDP_YCBCR_FORMAT_V8U8Y8A8:
132
      *is_supported = surface_chroma_type == VDP_CHROMA_TYPE_444;
133
      break;
134
 
135
   default:
136
      *is_supported = true;
137
      break;
138
   }
139
 
140
   *is_supported &= pscreen->is_video_format_supported
141
   (
142
      pscreen,
143
      FormatYCBCRToPipe(bits_ycbcr_format),
144
      PIPE_VIDEO_PROFILE_UNKNOWN
145
   );
146
   pipe_mutex_unlock(dev->mutex);
147
 
148
   return VDP_STATUS_OK;
149
}
150
 
151
/**
152
 * Query the implementation's VdpDecoder capabilities.
153
 */
154
VdpStatus
155
vlVdpDecoderQueryCapabilities(VdpDevice device, VdpDecoderProfile profile,
156
                              VdpBool *is_supported, uint32_t *max_level, uint32_t *max_macroblocks,
157
                              uint32_t *max_width, uint32_t *max_height)
158
{
159
   vlVdpDevice *dev;
160
   struct pipe_screen *pscreen;
161
   enum pipe_video_profile p_profile;
162
 
163
   if (!(is_supported && max_level && max_macroblocks && max_width && max_height))
164
      return VDP_STATUS_INVALID_POINTER;
165
 
166
   dev = vlGetDataHTAB(device);
167
   if (!dev)
168
      return VDP_STATUS_INVALID_HANDLE;
169
 
170
   pscreen = dev->vscreen->pscreen;
171
   if (!pscreen)
172
      return VDP_STATUS_RESOURCES;
173
 
174
   p_profile = ProfileToPipe(profile);
175
   if (p_profile == PIPE_VIDEO_PROFILE_UNKNOWN)	{
176
      *is_supported = false;
177
      return VDP_STATUS_OK;
178
   }
179
 
180
   pipe_mutex_lock(dev->mutex);
181
   *is_supported = pscreen->get_video_param(pscreen, p_profile, PIPE_VIDEO_CAP_SUPPORTED);
182
   if (*is_supported) {
183
      *max_width = pscreen->get_video_param(pscreen, p_profile, PIPE_VIDEO_CAP_MAX_WIDTH);
184
      *max_height = pscreen->get_video_param(pscreen, p_profile, PIPE_VIDEO_CAP_MAX_HEIGHT);
185
      *max_level = 16;
186
      *max_macroblocks = (*max_width/16)*(*max_height/16);
187
   } else {
188
      *max_width = 0;
189
      *max_height = 0;
190
      *max_level = 0;
191
      *max_macroblocks = 0;
192
   }
193
   pipe_mutex_unlock(dev->mutex);
194
 
195
   return VDP_STATUS_OK;
196
}
197
 
198
/**
199
 * Query the implementation's VdpOutputSurface capabilities.
200
 */
201
VdpStatus
202
vlVdpOutputSurfaceQueryCapabilities(VdpDevice device, VdpRGBAFormat surface_rgba_format,
203
                                    VdpBool *is_supported, uint32_t *max_width, uint32_t *max_height)
204
{
205
   vlVdpDevice *dev;
206
   struct pipe_screen *pscreen;
207
   enum pipe_format format;
208
 
209
   dev = vlGetDataHTAB(device);
210
   if (!dev)
211
      return VDP_STATUS_INVALID_HANDLE;
212
 
213
   pscreen = dev->vscreen->pscreen;
214
   if (!pscreen)
215
      return VDP_STATUS_RESOURCES;
216
 
217
   format = FormatRGBAToPipe(surface_rgba_format);
218
   if (format == PIPE_FORMAT_NONE || format == PIPE_FORMAT_A8_UNORM)
219
      return VDP_STATUS_INVALID_RGBA_FORMAT;
220
 
221
   if (!(is_supported && max_width && max_height))
222
      return VDP_STATUS_INVALID_POINTER;
223
 
224
   pipe_mutex_lock(dev->mutex);
225
   *is_supported = pscreen->is_format_supported
226
   (
227
      pscreen, format, PIPE_TEXTURE_3D, 1,
228
      PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET
229
   );
230
   if (*is_supported) {
231
      uint32_t max_2d_texture_level = pscreen->get_param(
232
         pscreen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS);
233
 
234
      if (!max_2d_texture_level) {
235
         pipe_mutex_unlock(dev->mutex);
236
         return VDP_STATUS_ERROR;
237
      }
238
 
239
      *max_width = *max_height = pow(2, max_2d_texture_level - 1);
240
   } else {
241
      *max_width = 0;
242
      *max_height = 0;
243
   }
244
   pipe_mutex_unlock(dev->mutex);
245
 
246
   return VDP_STATUS_OK;
247
}
248
 
249
/**
250
 * Query the implementation's capability to perform a PutBits operation using
251
 * application data matching the surface's format.
252
 */
253
VdpStatus
254
vlVdpOutputSurfaceQueryGetPutBitsNativeCapabilities(VdpDevice device, VdpRGBAFormat surface_rgba_format,
255
                                                    VdpBool *is_supported)
256
{
257
   vlVdpDevice *dev;
258
   struct pipe_screen *pscreen;
259
   enum pipe_format format;
260
 
261
   dev = vlGetDataHTAB(device);
262
   if (!dev)
263
      return VDP_STATUS_INVALID_HANDLE;
264
 
265
   pscreen = dev->vscreen->pscreen;
266
   if (!pscreen)
267
      return VDP_STATUS_ERROR;
268
 
269
   format = FormatRGBAToPipe(surface_rgba_format);
270
   if (format == PIPE_FORMAT_NONE || format == PIPE_FORMAT_A8_UNORM)
271
      return VDP_STATUS_INVALID_RGBA_FORMAT;
272
 
273
   if (!is_supported)
274
      return VDP_STATUS_INVALID_POINTER;
275
 
276
   pipe_mutex_lock(dev->mutex);
277
   *is_supported = pscreen->is_format_supported
278
   (
279
      pscreen, format, PIPE_TEXTURE_2D, 1,
280
      PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET
281
   );
282
   pipe_mutex_unlock(dev->mutex);
283
 
284
   return VDP_STATUS_OK;
285
}
286
 
287
/**
288
 * Query the implementation's capability to perform a PutBits operation using
289
 * application data in a specific indexed format.
290
 */
291
VdpStatus
292
vlVdpOutputSurfaceQueryPutBitsIndexedCapabilities(VdpDevice device,
293
                                                  VdpRGBAFormat surface_rgba_format,
294
                                                  VdpIndexedFormat bits_indexed_format,
295
                                                  VdpColorTableFormat color_table_format,
296
                                                  VdpBool *is_supported)
297
{
298
   vlVdpDevice *dev;
299
   struct pipe_screen *pscreen;
300
   enum pipe_format rgba_format, index_format, colortbl_format;
301
 
302
   dev = vlGetDataHTAB(device);
303
   if (!dev)
304
      return VDP_STATUS_INVALID_HANDLE;
305
 
306
   pscreen = dev->vscreen->pscreen;
307
   if (!pscreen)
308
      return VDP_STATUS_ERROR;
309
 
310
   rgba_format = FormatRGBAToPipe(surface_rgba_format);
311
   if (rgba_format == PIPE_FORMAT_NONE || rgba_format == PIPE_FORMAT_A8_UNORM)
312
      return VDP_STATUS_INVALID_RGBA_FORMAT;
313
 
314
   index_format = FormatIndexedToPipe(bits_indexed_format);
315
   if (index_format == PIPE_FORMAT_NONE)
316
       return VDP_STATUS_INVALID_INDEXED_FORMAT;
317
 
318
   colortbl_format = FormatColorTableToPipe(color_table_format);
319
   if (colortbl_format == PIPE_FORMAT_NONE)
320
       return VDP_STATUS_INVALID_COLOR_TABLE_FORMAT;
321
 
322
   if (!is_supported)
323
      return VDP_STATUS_INVALID_POINTER;
324
 
325
   pipe_mutex_lock(dev->mutex);
326
   *is_supported = pscreen->is_format_supported
327
   (
328
      pscreen, rgba_format, PIPE_TEXTURE_2D, 1,
329
      PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET
330
   );
331
 
332
   *is_supported &= pscreen->is_format_supported
333
   (
334
      pscreen, index_format, PIPE_TEXTURE_2D, 1,
335
      PIPE_BIND_SAMPLER_VIEW
336
   );
337
 
338
   *is_supported &= pscreen->is_format_supported
339
   (
340
      pscreen, colortbl_format, PIPE_TEXTURE_1D, 1,
341
      PIPE_BIND_SAMPLER_VIEW
342
   );
343
   pipe_mutex_unlock(dev->mutex);
344
 
345
   return VDP_STATUS_OK;
346
}
347
 
348
/**
349
 * Query the implementation's capability to perform a PutBits operation using
350
 * application data in a specific YCbCr/YUB format.
351
 */
352
VdpStatus
353
vlVdpOutputSurfaceQueryPutBitsYCbCrCapabilities(VdpDevice device, VdpRGBAFormat surface_rgba_format,
354
                                                VdpYCbCrFormat bits_ycbcr_format,
355
                                                VdpBool *is_supported)
356
{
357
   vlVdpDevice *dev;
358
   struct pipe_screen *pscreen;
359
   enum pipe_format rgba_format, ycbcr_format;
360
 
361
   dev = vlGetDataHTAB(device);
362
   if (!dev)
363
      return VDP_STATUS_INVALID_HANDLE;
364
 
365
   pscreen = dev->vscreen->pscreen;
366
   if (!pscreen)
367
      return VDP_STATUS_ERROR;
368
 
369
   rgba_format = FormatRGBAToPipe(surface_rgba_format);
370
   if (rgba_format == PIPE_FORMAT_NONE || rgba_format == PIPE_FORMAT_A8_UNORM)
371
      return VDP_STATUS_INVALID_RGBA_FORMAT;
372
 
373
   ycbcr_format = FormatYCBCRToPipe(bits_ycbcr_format);
374
   if (ycbcr_format == PIPE_FORMAT_NONE)
375
       return VDP_STATUS_INVALID_INDEXED_FORMAT;
376
 
377
   if (!is_supported)
378
      return VDP_STATUS_INVALID_POINTER;
379
 
380
   pipe_mutex_lock(dev->mutex);
381
   *is_supported = pscreen->is_format_supported
382
   (
383
      pscreen, rgba_format, PIPE_TEXTURE_2D, 1,
384
      PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET
385
   );
386
 
387
   *is_supported &= pscreen->is_video_format_supported
388
   (
389
      pscreen, ycbcr_format,
390
      PIPE_VIDEO_PROFILE_UNKNOWN
391
   );
392
   pipe_mutex_unlock(dev->mutex);
393
 
394
   return VDP_STATUS_OK;
395
}
396
 
397
/**
398
 * Query the implementation's VdpBitmapSurface capabilities.
399
 */
400
VdpStatus
401
vlVdpBitmapSurfaceQueryCapabilities(VdpDevice device, VdpRGBAFormat surface_rgba_format,
402
                                    VdpBool *is_supported, uint32_t *max_width, uint32_t *max_height)
403
{
404
   vlVdpDevice *dev;
405
   struct pipe_screen *pscreen;
406
   enum pipe_format format;
407
 
408
   dev = vlGetDataHTAB(device);
409
   if (!dev)
410
      return VDP_STATUS_INVALID_HANDLE;
411
 
412
   pscreen = dev->vscreen->pscreen;
413
   if (!pscreen)
414
      return VDP_STATUS_RESOURCES;
415
 
416
   format = FormatRGBAToPipe(surface_rgba_format);
417
   if (format == PIPE_FORMAT_NONE)
418
      return VDP_STATUS_INVALID_RGBA_FORMAT;
419
 
420
   if (!(is_supported && max_width && max_height))
421
      return VDP_STATUS_INVALID_POINTER;
422
 
423
   pipe_mutex_lock(dev->mutex);
424
   *is_supported = pscreen->is_format_supported
425
   (
426
      pscreen, format, PIPE_TEXTURE_3D, 1,
427
      PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET
428
   );
429
   if (*is_supported) {
430
      uint32_t max_2d_texture_level = pscreen->get_param(
431
         pscreen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS);
432
 
433
      if (!max_2d_texture_level) {
434
         pipe_mutex_unlock(dev->mutex);
435
         return VDP_STATUS_ERROR;
436
      }
437
 
438
      *max_width = *max_height = pow(2, max_2d_texture_level - 1);
439
   } else {
440
      *max_width = 0;
441
      *max_height = 0;
442
   }
443
   pipe_mutex_unlock(dev->mutex);
444
 
445
   return VDP_STATUS_OK;
446
}
447
 
448
/**
449
 * Query the implementation's support for a specific feature.
450
 */
451
VdpStatus
452
vlVdpVideoMixerQueryFeatureSupport(VdpDevice device, VdpVideoMixerFeature feature,
453
                                   VdpBool *is_supported)
454
{
455
   if (!is_supported)
456
      return VDP_STATUS_INVALID_POINTER;
457
 
458
   switch (feature) {
459
   case VDP_VIDEO_MIXER_FEATURE_SHARPNESS:
460
   case VDP_VIDEO_MIXER_FEATURE_NOISE_REDUCTION:
461
      *is_supported = VDP_TRUE;
462
      break;
463
   default:
464
      *is_supported = VDP_FALSE;
465
      break;
466
   }
467
   return VDP_STATUS_OK;
468
}
469
 
470
/**
471
 * Query the implementation's support for a specific parameter.
472
 */
473
VdpStatus
474
vlVdpVideoMixerQueryParameterSupport(VdpDevice device, VdpVideoMixerParameter parameter,
475
                                     VdpBool *is_supported)
476
{
477
   if (!is_supported)
478
      return VDP_STATUS_INVALID_POINTER;
479
 
480
   switch (parameter) {
481
   case VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_WIDTH:
482
   case VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_HEIGHT:
483
   case VDP_VIDEO_MIXER_PARAMETER_CHROMA_TYPE:
484
   case VDP_VIDEO_MIXER_PARAMETER_LAYERS:
485
      *is_supported = VDP_TRUE;
486
      break;
487
   default:
488
      *is_supported = VDP_FALSE;
489
      break;
490
   }
491
   return VDP_STATUS_OK;
492
}
493
 
494
/**
495
 * Query the implementation's supported for a specific parameter.
496
 */
497
VdpStatus
498
vlVdpVideoMixerQueryParameterValueRange(VdpDevice device, VdpVideoMixerParameter parameter,
499
                                        void *min_value, void *max_value)
500
{
501
   vlVdpDevice *dev = vlGetDataHTAB(device);
502
   struct pipe_screen *screen;
503
   enum pipe_video_profile prof = PIPE_VIDEO_PROFILE_UNKNOWN;
504
 
505
   if (!dev)
506
      return VDP_STATUS_INVALID_HANDLE;
507
   if (!(min_value && max_value))
508
      return VDP_STATUS_INVALID_POINTER;
509
 
510
   pipe_mutex_lock(dev->mutex);
511
   screen = dev->vscreen->pscreen;
512
   switch (parameter) {
513
   case VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_WIDTH:
514
      *(uint32_t*)min_value = 48;
515
      *(uint32_t*)max_value = screen->get_video_param(screen, prof, PIPE_VIDEO_CAP_MAX_WIDTH);
516
      break;
517
   case VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_HEIGHT:
518
      *(uint32_t*)min_value = 48;
519
      *(uint32_t*)max_value = screen->get_video_param(screen, prof, PIPE_VIDEO_CAP_MAX_HEIGHT);
520
      break;
521
 
522
   case VDP_VIDEO_MIXER_PARAMETER_LAYERS:
523
      *(uint32_t*)min_value = 0;
524
      *(uint32_t*)max_value = 4;
525
      break;
526
 
527
   case VDP_VIDEO_MIXER_PARAMETER_CHROMA_TYPE:
528
   default:
529
      pipe_mutex_unlock(dev->mutex);
530
      return VDP_STATUS_INVALID_VIDEO_MIXER_PARAMETER;
531
   }
532
   pipe_mutex_unlock(dev->mutex);
533
   return VDP_STATUS_OK;
534
}
535
 
536
/**
537
 * Query the implementation's support for a specific attribute.
538
 */
539
VdpStatus
540
vlVdpVideoMixerQueryAttributeSupport(VdpDevice device, VdpVideoMixerAttribute attribute,
541
                                     VdpBool *is_supported)
542
{
543
   if (!is_supported)
544
      return VDP_STATUS_INVALID_POINTER;
545
 
546
   switch (attribute) {
547
   case VDP_VIDEO_MIXER_ATTRIBUTE_BACKGROUND_COLOR:
548
   case VDP_VIDEO_MIXER_ATTRIBUTE_CSC_MATRIX:
549
   case VDP_VIDEO_MIXER_ATTRIBUTE_NOISE_REDUCTION_LEVEL:
550
   case VDP_VIDEO_MIXER_ATTRIBUTE_SHARPNESS_LEVEL:
551
   case VDP_VIDEO_MIXER_ATTRIBUTE_LUMA_KEY_MIN_LUMA:
552
   case VDP_VIDEO_MIXER_ATTRIBUTE_LUMA_KEY_MAX_LUMA:
553
   case VDP_VIDEO_MIXER_ATTRIBUTE_SKIP_CHROMA_DEINTERLACE:
554
      *is_supported = VDP_TRUE;
555
      break;
556
   default:
557
      *is_supported = VDP_FALSE;
558
   }
559
   return VDP_STATUS_OK;
560
}
561
 
562
/**
563
 * Query the implementation's supported for a specific attribute.
564
 */
565
VdpStatus
566
vlVdpVideoMixerQueryAttributeValueRange(VdpDevice device, VdpVideoMixerAttribute attribute,
567
                                        void *min_value, void *max_value)
568
{
569
   if (!(min_value && max_value))
570
      return VDP_STATUS_INVALID_POINTER;
571
 
572
   switch (attribute) {
573
   case VDP_VIDEO_MIXER_ATTRIBUTE_NOISE_REDUCTION_LEVEL:
574
   case VDP_VIDEO_MIXER_ATTRIBUTE_LUMA_KEY_MIN_LUMA:
575
   case VDP_VIDEO_MIXER_ATTRIBUTE_LUMA_KEY_MAX_LUMA:
576
      *(float*)min_value = 0.f;
577
      *(float*)max_value = 1.f;
578
      break;
579
   case VDP_VIDEO_MIXER_ATTRIBUTE_SHARPNESS_LEVEL:
580
      *(float*)min_value = -1.f;
581
      *(float*)max_value = 1.f;
582
      break;
583
   case VDP_VIDEO_MIXER_ATTRIBUTE_SKIP_CHROMA_DEINTERLACE:
584
      *(uint8_t*)min_value = 0;
585
      *(uint8_t*)max_value = 1;
586
      break;
587
   case VDP_VIDEO_MIXER_ATTRIBUTE_BACKGROUND_COLOR:
588
   case VDP_VIDEO_MIXER_ATTRIBUTE_CSC_MATRIX:
589
   default:
590
      return VDP_STATUS_INVALID_VIDEO_MIXER_ATTRIBUTE;
591
   }
592
   return VDP_STATUS_OK;
593
}