1 /*************************************************************************** 2 \file : ADM_coreVdpau.cpp 3 \brief : Wrapper around vdpau functions 4 \author : (C) 2010 by mean fixounet@free.fr 5 ***************************************************************************/ 6 7 /*************************************************************************** 8 * * 9 * This program is free software; you can redistribute it and/or modify * 10 * it under the terms of the GNU General Public License as published by * 11 * the Free Software Foundation; either version 2 of the License, or * 12 * (at your option) any later version. * 13 * * 14 ***************************************************************************/ 15 16 #ifndef ADM_CORE_VDPAU_H 17 #define ADM_CORE_VDPAU_H 18 19 #ifdef USE_VDPAU 20 #include "vdpau/vdpau_x11.h" 21 #include "vdpau/vdpau.h" 22 23 #define FF_VDPAU_STATE_USED_FOR_RENDER 1 24 #define FF_VDPAU_STATE_USED_FOR_REFERENCE 2 25 26 struct ADM_vdpauRenderState { 27 VdpVideoSurface surface; 28 int state; // Holds FF_VDPAU_STATE_* values. 29 int refCount; // Used by how many client MEANX 30 }; 31 32 #endif 33 34 #include "ADM_windowInfo.h" 35 /** 36 \class admVdpau 37 */ 38 class admVdpau 39 { 40 protected: 41 static GUI_WindowInfo myWindowInfo; 42 #ifdef USE_VDPAU 43 static bool queryYUVPutBitSupport(VdpRGBAFormat rgb,VdpYCbCrFormat yuv); 44 static VdpStatus mixerEnableFeature( VdpVideoMixer mixer,uint32_t nbFeature,VdpVideoMixerFeature *feature,VdpBool *enabledFeature); 45 static bool mixerFeatureSupported(VdpVideoMixerFeature attribute); 46 #endif 47 public: 48 static bool init(GUI_WindowInfo *x); 49 static bool isOperationnal(void); 50 static bool cleanup(void); 51 /* Surface */ 52 #ifdef USE_VDPAU 53 static void *getVdpDevice(void); 54 static void *getProcAddress(void); 55 static VdpGetProcAddress *getProcAddress2(void) ; 56 static const char *getErrorString(VdpStatus er); 57 static bool mixerIsFeatureEnabled( VdpVideoMixer mixer,VdpVideoMixerFeature feature); 58 static VdpStatus surfaceCreate(uint32_t width,uint32_t height,VdpVideoSurface *surface); 59 static VdpStatus surfaceDestroy(VdpVideoSurface surface); 60 static VdpStatus getDataSurface(VdpVideoSurface surface,uint8_t *planes[3],uint32_t stride[3]); 61 static VdpStatus surfacePutBits(VdpVideoSurface surface,uint8_t *planes[3],uint32_t stride[3]); 62 /* Decoder */ 63 static VdpStatus decoderCreate( VdpDevice dev,VdpDecoderProfile profile, uint32_t width, uint32_t height, uint32_t max_references, VdpDecoder * decoder); 64 static VdpStatus decoderDestroy(VdpDecoder decoder); 65 66 static VdpStatus decoderRender( 67 VdpDecoder decoder, 68 VdpVideoSurface target, 69 const void *info, 70 uint32_t bitstream_buffer_count, 71 VdpBitstreamBuffer const * bitstream_buffers); 72 73 /* Output surface */ 74 static VdpStatus outputSurfaceCreate( 75 VdpRGBAFormat rgba_format, 76 uint32_t width, 77 uint32_t height, 78 VdpOutputSurface * surface); 79 80 static VdpStatus outputSurfaceDestroy(VdpOutputSurface surface); 81 static VdpStatus outPutSurfacePutBitsYV12( 82 VdpOutputSurface surface, 83 uint8_t *planes[3], 84 uint32_t pitches[3]); 85 // Warning only RGBA32 supported! 86 static VdpStatus outputSurfaceGetBitsNative(VdpOutputSurface surface, 87 uint8_t *buffer, uint32_t w,uint32_t h); 88 static VdpStatus outputSurfaceGetBitsNative_FieldWeave(VdpOutputSurface surface, 89 uint8_t *buffer, uint32_t w,uint32_t h); 90 91 92 /* Presentation queue */ 93 static VdpStatus presentationQueueCreate(VdpPresentationQueue *queue); 94 static VdpStatus presentationQueueDestroy(VdpPresentationQueue queue); 95 static VdpStatus presentationQueueDisplay(VdpPresentationQueue queue,VdpOutputSurface outputSurface); 96 /* Mixer */ 97 static VdpStatus mixerCreate(uint32_t width,uint32_t height, VdpVideoMixer *mixer,bool deinterlace=false,bool ivtc=false); 98 static VdpStatus mixerDestroy(VdpVideoMixer mixer); 99 static VdpStatus mixerRender(VdpVideoMixer mixer,VdpVideoSurface sourceSurface,VdpOutputSurface targetOutputSurface, uint32_t targetWidth, uint32_t targetHeight ); 100 static VdpStatus mixerRenderWithCropping(VdpVideoMixer mixer,VdpVideoSurface sourceSurface,VdpOutputSurface targetOutputSurface, uint32_t targetWidth, uint32_t targetHeight , 101 uint32_t sourceWidth, uint32_t sourceHeight); 102 static VdpStatus mixerRenderFieldWithPastAndFuture(bool topField,VdpVideoMixer mixer, 103 VdpVideoSurface sourceSurface[3], // Past present future 104 VdpOutputSurface targetOutputSurface, uint32_t targetWidth, uint32_t targetHeight,uint32_t sourceWidth, uint32_t sourceHeight ); 105 static VdpStatus mixerRenderFrameWithPastAndFuture(VdpVideoMixer mixer, 106 VdpVideoSurface sourceSurface[3], // Past present future 107 VdpOutputSurface targetOutputSurface, uint32_t targetWidth, uint32_t targetHeight,uint32_t sourceWidth, uint32_t sourceHeight ); 108 109 static VdpStatus mixerGetAttributesValue(VdpVideoMixer mixer, 110 uint32_t attrCount, 111 const VdpVideoMixerAttribute *xkeys, 112 void * const* values); 113 static VdpStatus mixerSetAttributesValue(VdpVideoMixer mixer, 114 uint32_t attrCount, 115 const VdpVideoMixerAttribute *xkeys, 116 void * const* values); 117 static bool queryDecoderCapabilities( VdpDecoderProfile profile, // return true if supported 118 int * max_width, 119 int * max_height); dimensionRoundUp(int x)120 static int dimensionRoundUp(int x) 121 { 122 return (x+15) & ~15; 123 } 124 static VdpStatus outputSurfaceGetParameters( VdpOutputSurface surface, VdpRGBAFormat * rgba_format, 125 uint32_t * width, uint32_t * height); 126 static VdpStatus surfaceGetParameters(VdpVideoSurface surface,VdpChromaType *chomra,uint32_t *w,uint32_t *h); 127 128 #endif 129 }; 130 #endif 131