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