blob: 5c68cd7c47a7b4adbdf626e01cb56b30bbeac9e8 [file] [log] [blame]
/**************************************************************************
*
* Copyright 2010 Younes Manton & Thomas Balling Sørensen.
* All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sub license, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice (including the
* next paragraph) shall be included in all copies or substantial portions
* of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
* IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
**************************************************************************/
#ifndef VDPAU_PRIVATE_H
#define VDPAU_PRIVATE_H
#include <assert.h>
#include <vdpau/vdpau.h>
#include <vdpau/vdpau_x11.h>
#include <pipe/p_compiler.h>
#include <pipe/p_video_decoder.h>
#include <util/u_debug.h>
#include <vl/vl_compositor.h>
#include <vl_winsys.h>
#define INFORMATION G3DVL VDPAU Driver Shared Library version VER_MAJOR.VER_MINOR
#define QUOTEME(x) #x
#define TOSTRING(x) QUOTEME(x)
#define INFORMATION_STRING TOSTRING(INFORMATION)
#define VL_HANDLES
#define VL_NUM_DECODE_BUFFERS 4
static inline enum pipe_video_chroma_format
ChromaToPipe(VdpChromaType vdpau_type)
{
switch (vdpau_type) {
case VDP_CHROMA_TYPE_420:
return PIPE_VIDEO_CHROMA_FORMAT_420;
case VDP_CHROMA_TYPE_422:
return PIPE_VIDEO_CHROMA_FORMAT_422;
case VDP_CHROMA_TYPE_444:
return PIPE_VIDEO_CHROMA_FORMAT_444;
default:
assert(0);
}
return -1;
}
static inline VdpChromaType
PipeToChroma(enum pipe_video_chroma_format pipe_type)
{
switch (pipe_type) {
case PIPE_VIDEO_CHROMA_FORMAT_420:
return VDP_CHROMA_TYPE_420;
case PIPE_VIDEO_CHROMA_FORMAT_422:
return VDP_CHROMA_TYPE_422;
case PIPE_VIDEO_CHROMA_FORMAT_444:
return VDP_CHROMA_TYPE_444;
default:
assert(0);
}
return -1;
}
static inline enum pipe_format
FormatYCBCRToPipe(VdpYCbCrFormat vdpau_format)
{
switch (vdpau_format) {
case VDP_YCBCR_FORMAT_NV12:
return PIPE_FORMAT_NV12;
case VDP_YCBCR_FORMAT_YV12:
return PIPE_FORMAT_YV12;
case VDP_YCBCR_FORMAT_UYVY:
return PIPE_FORMAT_UYVY;
case VDP_YCBCR_FORMAT_YUYV:
return PIPE_FORMAT_YUYV;
case VDP_YCBCR_FORMAT_Y8U8V8A8: /* Not defined in p_format.h */
return 0;
case VDP_YCBCR_FORMAT_V8U8Y8A8:
return PIPE_FORMAT_VUYA;
default:
assert(0);
}
return -1;
}
static inline VdpYCbCrFormat
PipeToFormatYCBCR(enum pipe_format p_format)
{
switch (p_format) {
case PIPE_FORMAT_NV12:
return VDP_YCBCR_FORMAT_NV12;
case PIPE_FORMAT_YV12:
return VDP_YCBCR_FORMAT_YV12;
case PIPE_FORMAT_UYVY:
return VDP_YCBCR_FORMAT_UYVY;
case PIPE_FORMAT_YUYV:
return VDP_YCBCR_FORMAT_YUYV;
//case PIPE_FORMAT_YUVA:
// return VDP_YCBCR_FORMAT_Y8U8V8A8;
case PIPE_FORMAT_VUYA:
return VDP_YCBCR_FORMAT_V8U8Y8A8;
default:
assert(0);
}
return -1;
}
static inline enum pipe_format
FormatRGBAToPipe(VdpRGBAFormat vdpau_format)
{
switch (vdpau_format) {
case VDP_RGBA_FORMAT_A8:
return PIPE_FORMAT_A8_UNORM;
case VDP_RGBA_FORMAT_B10G10R10A2:
return PIPE_FORMAT_B10G10R10A2_UNORM;
case VDP_RGBA_FORMAT_B8G8R8A8:
return PIPE_FORMAT_B8G8R8A8_UNORM;
case VDP_RGBA_FORMAT_R10G10B10A2:
return PIPE_FORMAT_R10G10B10A2_UNORM;
case VDP_RGBA_FORMAT_R8G8B8A8:
return PIPE_FORMAT_R8G8B8A8_UNORM;
default:
assert(0);
}
return -1;
}
static inline VdpRGBAFormat
PipeToFormatRGBA(enum pipe_format p_format)
{
switch (p_format) {
case PIPE_FORMAT_A8_UNORM:
return VDP_RGBA_FORMAT_A8;
case PIPE_FORMAT_B10G10R10A2_UNORM:
return VDP_RGBA_FORMAT_B10G10R10A2;
case PIPE_FORMAT_B8G8R8A8_UNORM:
return VDP_RGBA_FORMAT_B8G8R8A8;
case PIPE_FORMAT_R10G10B10A2_UNORM:
return VDP_RGBA_FORMAT_R10G10B10A2;
case PIPE_FORMAT_R8G8B8A8_UNORM:
return VDP_RGBA_FORMAT_R8G8B8A8;
default:
assert(0);
}
return -1;
}
static inline enum pipe_video_profile
ProfileToPipe(VdpDecoderProfile vdpau_profile)
{
switch (vdpau_profile) {
case VDP_DECODER_PROFILE_MPEG1:
return PIPE_VIDEO_PROFILE_MPEG1;
case VDP_DECODER_PROFILE_MPEG2_SIMPLE:
return PIPE_VIDEO_PROFILE_MPEG2_SIMPLE;
case VDP_DECODER_PROFILE_MPEG2_MAIN:
return PIPE_VIDEO_PROFILE_MPEG2_MAIN;
case VDP_DECODER_PROFILE_H264_BASELINE:
return PIPE_VIDEO_PROFILE_MPEG4_AVC_BASELINE;
case VDP_DECODER_PROFILE_H264_MAIN: /* Not defined in p_format.h */
return PIPE_VIDEO_PROFILE_MPEG4_AVC_MAIN;
case VDP_DECODER_PROFILE_H264_HIGH:
return PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH;
default:
return PIPE_VIDEO_PROFILE_UNKNOWN;
}
}
static inline VdpDecoderProfile
PipeToProfile(enum pipe_video_profile p_profile)
{
switch (p_profile) {
case PIPE_VIDEO_PROFILE_MPEG1:
return VDP_DECODER_PROFILE_MPEG1;
case PIPE_VIDEO_PROFILE_MPEG2_SIMPLE:
return VDP_DECODER_PROFILE_MPEG2_SIMPLE;
case PIPE_VIDEO_PROFILE_MPEG2_MAIN:
return VDP_DECODER_PROFILE_MPEG2_MAIN;
case PIPE_VIDEO_PROFILE_MPEG4_AVC_BASELINE:
return VDP_DECODER_PROFILE_H264_BASELINE;
case PIPE_VIDEO_PROFILE_MPEG4_AVC_MAIN: /* Not defined in p_format.h */
return VDP_DECODER_PROFILE_H264_MAIN;
case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH:
return VDP_DECODER_PROFILE_H264_HIGH;
default:
assert(0);
return -1;
}
}
typedef struct
{
struct vl_screen *vscreen;
struct vl_context *context;
} vlVdpDevice;
typedef struct
{
vlVdpDevice *device;
Drawable drawable;
} vlVdpPresentationQueueTarget;
typedef struct
{
vlVdpDevice *device;
Drawable drawable;
struct vl_compositor compositor;
} vlVdpPresentationQueue;
typedef struct
{
vlVdpDevice *device;
struct vl_compositor compositor;
} vlVdpVideoMixer;
typedef struct
{
vlVdpDevice *device;
struct pipe_video_buffer *video_buffer;
} vlVdpSurface;
typedef struct
{
vlVdpDevice *device;
struct pipe_surface *surface;
struct pipe_sampler_view *sampler_view;
} vlVdpOutputSurface;
typedef struct
{
vlVdpDevice *device;
struct pipe_video_decoder *decoder;
void *buffer[VL_NUM_DECODE_BUFFERS];
unsigned cur_buffer;
} vlVdpDecoder;
typedef uint32_t vlHandle;
boolean vlCreateHTAB(void);
void vlDestroyHTAB(void);
vlHandle vlAddDataHTAB(void *data);
void* vlGetDataHTAB(vlHandle handle);
void vlRemoveDataHTAB(vlHandle handle);
boolean vlGetFuncFTAB(VdpFuncId function_id, void **func);
/* Public functions */
VdpDeviceCreateX11 vdp_imp_device_create_x11;
VdpPresentationQueueTargetCreateX11 vlVdpPresentationQueueTargetCreateX11;
/* Internal function pointers */
VdpGetErrorString vlVdpGetErrorString;
VdpDeviceDestroy vlVdpDeviceDestroy;
VdpGetProcAddress vlVdpGetProcAddress;
VdpGetApiVersion vlVdpGetApiVersion;
VdpGetInformationString vlVdpGetInformationString;
VdpVideoSurfaceQueryCapabilities vlVdpVideoSurfaceQueryCapabilities;
VdpVideoSurfaceQueryGetPutBitsYCbCrCapabilities vlVdpVideoSurfaceQueryGetPutBitsYCbCrCapabilities;
VdpDecoderQueryCapabilities vlVdpDecoderQueryCapabilities;
VdpOutputSurfaceQueryCapabilities vlVdpOutputSurfaceQueryCapabilities;
VdpOutputSurfaceQueryGetPutBitsNativeCapabilities vlVdpOutputSurfaceQueryGetPutBitsNativeCapabilities;
VdpOutputSurfaceQueryPutBitsIndexedCapabilities vlVdpOutputSurfaceQueryPutBitsIndexedCapabilities;
VdpOutputSurfaceQueryPutBitsYCbCrCapabilities vlVdpOutputSurfaceQueryPutBitsYCbCrCapabilities;
VdpBitmapSurfaceQueryCapabilities vlVdpBitmapSurfaceQueryCapabilities;
VdpVideoMixerQueryFeatureSupport vlVdpVideoMixerQueryFeatureSupport;
VdpVideoMixerQueryParameterSupport vlVdpVideoMixerQueryParameterSupport;
VdpVideoMixerQueryParameterValueRange vlVdpVideoMixerQueryParameterValueRange;
VdpVideoMixerQueryAttributeSupport vlVdpVideoMixerQueryAttributeSupport;
VdpVideoMixerQueryAttributeValueRange vlVdpVideoMixerQueryAttributeValueRange;
VdpVideoSurfaceCreate vlVdpVideoSurfaceCreate;
VdpVideoSurfaceDestroy vlVdpVideoSurfaceDestroy;
VdpVideoSurfaceGetParameters vlVdpVideoSurfaceGetParameters;
VdpVideoSurfaceGetBitsYCbCr vlVdpVideoSurfaceGetBitsYCbCr;
VdpVideoSurfacePutBitsYCbCr vlVdpVideoSurfacePutBitsYCbCr;
VdpDecoderCreate vlVdpDecoderCreate;
VdpDecoderDestroy vlVdpDecoderDestroy;
VdpDecoderGetParameters vlVdpDecoderGetParameters;
VdpDecoderRender vlVdpDecoderRender;
VdpOutputSurfaceCreate vlVdpOutputSurfaceCreate;
VdpOutputSurfaceDestroy vlVdpOutputSurfaceDestroy;
VdpOutputSurfaceGetParameters vlVdpOutputSurfaceGetParameters;
VdpOutputSurfaceGetBitsNative vlVdpOutputSurfaceGetBitsNative;
VdpOutputSurfacePutBitsNative vlVdpOutputSurfacePutBitsNative;
VdpOutputSurfacePutBitsIndexed vlVdpOutputSurfacePutBitsIndexed;
VdpOutputSurfacePutBitsYCbCr vlVdpOutputSurfacePutBitsYCbCr;
VdpOutputSurfaceRenderOutputSurface vlVdpOutputSurfaceRenderOutputSurface;
VdpOutputSurfaceRenderBitmapSurface vlVdpOutputSurfaceRenderBitmapSurface;
VdpBitmapSurfaceCreate vlVdpBitmapSurfaceCreate;
VdpBitmapSurfaceDestroy vlVdpBitmapSurfaceDestroy;
VdpBitmapSurfaceGetParameters vlVdpBitmapSurfaceGetParameters;
VdpBitmapSurfacePutBitsNative vlVdpBitmapSurfacePutBitsNative;
VdpPresentationQueueTargetDestroy vlVdpPresentationQueueTargetDestroy;
VdpPresentationQueueCreate vlVdpPresentationQueueCreate;
VdpPresentationQueueDestroy vlVdpPresentationQueueDestroy;
VdpPresentationQueueSetBackgroundColor vlVdpPresentationQueueSetBackgroundColor;
VdpPresentationQueueGetBackgroundColor vlVdpPresentationQueueGetBackgroundColor;
VdpPresentationQueueGetTime vlVdpPresentationQueueGetTime;
VdpPresentationQueueDisplay vlVdpPresentationQueueDisplay;
VdpPresentationQueueBlockUntilSurfaceIdle vlVdpPresentationQueueBlockUntilSurfaceIdle;
VdpPresentationQueueQuerySurfaceStatus vlVdpPresentationQueueQuerySurfaceStatus;
VdpPreemptionCallback vlVdpPreemptionCallback;
VdpPreemptionCallbackRegister vlVdpPreemptionCallbackRegister;
VdpVideoMixerSetFeatureEnables vlVdpVideoMixerSetFeatureEnables;
VdpVideoMixerCreate vlVdpVideoMixerCreate;
VdpVideoMixerRender vlVdpVideoMixerRender;
VdpVideoMixerSetAttributeValues vlVdpVideoMixerSetAttributeValues;
VdpVideoMixerGetFeatureSupport vlVdpVideoMixerGetFeatureSupport;
VdpVideoMixerGetFeatureEnables vlVdpVideoMixerGetFeatureEnables;
VdpVideoMixerGetParameterValues vlVdpVideoMixerGetParameterValues;
VdpVideoMixerGetAttributeValues vlVdpVideoMixerGetAttributeValues;
VdpVideoMixerDestroy vlVdpVideoMixerDestroy;
VdpGenerateCSCMatrix vlVdpGenerateCSCMatrix;
#define VDPAU_OUT 0
#define VDPAU_ERR 1
#define VDPAU_WARN 2
#define VDPAU_TRACE 3
static inline void VDPAU_MSG(unsigned int level, const char *fmt, ...)
{
static int debug_level = -1;
if (debug_level == -1) {
debug_level = MAX2(debug_get_num_option("VDPAU_DEBUG", 0), 0);
}
if (level <= debug_level) {
va_list ap;
va_start(ap, fmt);
_debug_vprintf(fmt, ap);
va_end(ap);
}
}
#endif // VDPAU_PRIVATE_H