st/vdpau: add new formats to OutputSurface rendering
[mesa.git] / src / gallium / state_trackers / vdpau / vdpau_private.h
index e5d945629fb2d353cf18fe12f478f5382b2e3540..bb91de13103a288909e1a5278e1c1b3fc870f636 100644 (file)
 #include <vdpau/vdpau.h>
 #include <vdpau/vdpau_x11.h>
 
-#include <pipe/p_compiler.h>
-#include <pipe/p_video_decoder.h>
+#include "pipe/p_compiler.h"
+#include "pipe/p_video_codec.h"
 
-#include <util/u_debug.h>
-#include <vl/vl_compositor.h>
+#include "util/u_debug.h"
+#include "util/u_rect.h"
+#include "os/os_thread.h"
 
-#include <vl_winsys.h>
+#include "vl/vl_compositor.h"
+#include "vl/vl_csc.h"
+#include "vl/vl_matrix_filter.h"
+#include "vl/vl_median_filter.h"
+#include "vl/vl_winsys.h"
+
+/* Full VDPAU API documentation available at :
+ * ftp://download.nvidia.com/XFree86/vdpau/doxygen/html/index.html */
 
 #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)
@@ -82,6 +89,28 @@ PipeToChroma(enum pipe_video_chroma_format pipe_type)
    return -1;
 }
 
+static inline enum pipe_video_chroma_format
+FormatYCBCRToPipeChroma(VdpYCbCrFormat vdpau_format)
+{
+   switch (vdpau_format) {
+      case VDP_YCBCR_FORMAT_NV12:
+         return PIPE_VIDEO_CHROMA_FORMAT_420;
+      case VDP_YCBCR_FORMAT_YV12:
+         return PIPE_VIDEO_CHROMA_FORMAT_420;
+      case VDP_YCBCR_FORMAT_UYVY:
+         return PIPE_VIDEO_CHROMA_FORMAT_422;
+      case VDP_YCBCR_FORMAT_YUYV:
+         return PIPE_VIDEO_CHROMA_FORMAT_422;
+      case VDP_YCBCR_FORMAT_Y8U8V8A8:
+         return PIPE_VIDEO_CHROMA_FORMAT_444;
+      case VDP_YCBCR_FORMAT_V8U8Y8A8:
+         return PIPE_VIDEO_CHROMA_FORMAT_444;
+      default:
+         assert(0);
+   }
+
+   return PIPE_FORMAT_NONE;
+}
 
 static inline enum pipe_format
 FormatYCBCRToPipe(VdpYCbCrFormat vdpau_format)
@@ -95,15 +124,15 @@ FormatYCBCRToPipe(VdpYCbCrFormat vdpau_format)
          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_Y8U8V8A8:
+         return PIPE_FORMAT_R8G8B8A8_UNORM;
       case VDP_YCBCR_FORMAT_V8U8Y8A8:
-            return PIPE_FORMAT_VUYA;
+         return PIPE_FORMAT_B8G8R8A8_UNORM;
       default:
          assert(0);
    }
 
-   return -1;
+   return PIPE_FORMAT_NONE;
 }
 
 static inline VdpYCbCrFormat
@@ -118,10 +147,10 @@ PipeToFormatYCBCR(enum pipe_format p_format)
          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;
+      case PIPE_FORMAT_R8G8B8A8_UNORM:
+        return VDP_YCBCR_FORMAT_Y8U8V8A8;
+      case PIPE_FORMAT_B8G8R8A8_UNORM:
+         return VDP_YCBCR_FORMAT_V8U8Y8A8;
       default:
          assert(0);
    }
@@ -147,7 +176,7 @@ FormatRGBAToPipe(VdpRGBAFormat vdpau_format)
          assert(0);
    }
 
-   return -1;
+   return PIPE_FORMAT_NONE;
 }
 
 static inline VdpRGBAFormat
@@ -171,6 +200,38 @@ PipeToFormatRGBA(enum pipe_format p_format)
    return -1;
 }
 
+static inline enum pipe_format
+FormatIndexedToPipe(VdpRGBAFormat vdpau_format)
+{
+   switch (vdpau_format) {
+      case VDP_INDEXED_FORMAT_A4I4:
+         return PIPE_FORMAT_A4R4_UNORM;
+      case VDP_INDEXED_FORMAT_I4A4:
+         return PIPE_FORMAT_R4A4_UNORM;
+      case VDP_INDEXED_FORMAT_A8I8:
+         return PIPE_FORMAT_A8R8_UNORM;
+      case VDP_INDEXED_FORMAT_I8A8:
+         return PIPE_FORMAT_R8A8_UNORM;
+      default:
+         assert(0);
+   }
+
+   return PIPE_FORMAT_NONE;
+}
+
+static inline enum pipe_format
+FormatColorTableToPipe(VdpColorTableFormat vdpau_format)
+{
+   switch(vdpau_format) {
+      case VDP_COLOR_TABLE_FORMAT_B8G8R8X8:
+         return PIPE_FORMAT_B8G8R8X8_UNORM;
+      default:
+         assert(0);
+   }
+
+   return PIPE_FORMAT_NONE;
+}
+
 static inline enum pipe_video_profile
 ProfileToPipe(VdpDecoderProfile vdpau_profile)
 {
@@ -183,10 +244,20 @@ ProfileToPipe(VdpDecoderProfile vdpau_profile)
          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 */
+      case VDP_DECODER_PROFILE_H264_MAIN:
          return PIPE_VIDEO_PROFILE_MPEG4_AVC_MAIN;
       case VDP_DECODER_PROFILE_H264_HIGH:
-            return PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH;
+         return PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH;
+      case VDP_DECODER_PROFILE_MPEG4_PART2_SP:
+         return PIPE_VIDEO_PROFILE_MPEG4_SIMPLE;
+      case VDP_DECODER_PROFILE_MPEG4_PART2_ASP:
+         return PIPE_VIDEO_PROFILE_MPEG4_ADVANCED_SIMPLE;
+      case VDP_DECODER_PROFILE_VC1_SIMPLE:
+         return PIPE_VIDEO_PROFILE_VC1_SIMPLE;
+      case VDP_DECODER_PROFILE_VC1_MAIN:
+         return PIPE_VIDEO_PROFILE_VC1_MAIN;
+      case VDP_DECODER_PROFILE_VC1_ADVANCED:
+         return PIPE_VIDEO_PROFILE_VC1_ADVANCED;
       default:
          return PIPE_VIDEO_PROFILE_UNKNOWN;
    }
@@ -204,60 +275,143 @@ PipeToProfile(enum pipe_video_profile p_profile)
          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 */
+      case PIPE_VIDEO_PROFILE_MPEG4_AVC_MAIN:
          return VDP_DECODER_PROFILE_H264_MAIN;
       case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH:
-            return VDP_DECODER_PROFILE_H264_HIGH;
+         return VDP_DECODER_PROFILE_H264_HIGH;
+      case PIPE_VIDEO_PROFILE_MPEG4_SIMPLE:
+         return VDP_DECODER_PROFILE_MPEG4_PART2_SP;
+      case PIPE_VIDEO_PROFILE_MPEG4_ADVANCED_SIMPLE:
+         return VDP_DECODER_PROFILE_MPEG4_PART2_ASP;
+      case PIPE_VIDEO_PROFILE_VC1_SIMPLE:
+         return VDP_DECODER_PROFILE_VC1_SIMPLE;
+      case PIPE_VIDEO_PROFILE_VC1_MAIN:
+         return VDP_DECODER_PROFILE_VC1_MAIN;
+      case PIPE_VIDEO_PROFILE_VC1_ADVANCED:
+         return VDP_DECODER_PROFILE_VC1_ADVANCED;
       default:
          assert(0);
          return -1;
    }
 }
 
-typedef struct
+static inline struct u_rect *
+RectToPipe(const VdpRect *src, struct u_rect *dst)
 {
-   struct vl_screen *vscreen;
-   struct vl_context *context;
-} vlVdpDevice;
+   if (src) {
+      dst->x0 = src->x0;
+      dst->y0 = src->y0;
+      dst->x1 = src->x1;
+      dst->y1 = src->y1;
+      return dst;
+   }
+   return NULL;
+}
 
-typedef struct
+static inline struct pipe_box
+RectToPipeBox(const VdpRect *rect, struct pipe_resource *res)
 {
-   vlVdpDevice *device;
-   Drawable drawable;
-} vlVdpPresentationQueueTarget;
+   struct pipe_box box;
+
+   box.x = 0;
+   box.y = 0;
+   box.z = 0;
+   box.width = res->width0;
+   box.height = res->height0;
+   box.depth = 1;
+
+   if (rect) {
+      box.x = MIN2(rect->x0, rect->x1);
+      box.y = MIN2(rect->y0, rect->y1);
+      box.width = abs(rect->x1 - rect->x0);
+      box.height = abs(rect->y1 - rect->y0);
+   }
+
+   return box;
+}
 
 typedef struct
 {
-   vlVdpDevice *device;
-   Drawable drawable;
+   struct vl_screen *vscreen;
+   struct pipe_context *context;
    struct vl_compositor compositor;
-} vlVdpPresentationQueue;
+   pipe_mutex mutex;
+
+   struct {
+      struct vl_compositor_state *cstate;
+      VdpOutputSurface surface;
+   } delayed_rendering;
+} vlVdpDevice;
 
 typedef struct
 {
    vlVdpDevice *device;
-   struct vl_compositor compositor;
+   struct vl_compositor_state cstate;
+
+   struct {
+      bool supported, enabled;
+      unsigned level;
+      struct vl_median_filter *filter;
+   } noise_reduction;
+
+   struct {
+      bool supported, enabled;
+      float value;
+      struct vl_matrix_filter *filter;
+   } sharpness;
+
+   unsigned video_width, video_height;
+   enum pipe_video_chroma_format chroma_format;
+   unsigned max_layers, skip_chroma_deint;
+   float luma_key_min, luma_key_max;
+
+   bool custom_csc;
+   vl_csc_matrix csc;
 } vlVdpVideoMixer;
 
 typedef struct
 {
    vlVdpDevice *device;
-   struct pipe_video_buffer *video_buffer;
+   struct pipe_video_buffer templat, *video_buffer;
 } vlVdpSurface;
 
+typedef struct
+{
+   vlVdpDevice *device;
+   struct pipe_sampler_view *sampler_view;
+} vlVdpBitmapSurface;
+
+typedef uint64_t vlVdpTime;
+
 typedef struct
 {
    vlVdpDevice *device;
    struct pipe_surface *surface;
    struct pipe_sampler_view *sampler_view;
+   struct pipe_fence_handle *fence;
+   struct vl_compositor_state cstate;
+   struct u_rect dirty_area;
 } vlVdpOutputSurface;
 
 typedef struct
 {
    vlVdpDevice *device;
-   struct pipe_video_decoder *decoder;
-   struct pipe_video_decode_buffer *buffer[VL_NUM_DECODE_BUFFERS];
-   unsigned cur_buffer;
+   Drawable drawable;
+} vlVdpPresentationQueueTarget;
+
+typedef struct
+{
+   vlVdpDevice *device;
+   Drawable drawable;
+   struct vl_compositor_state cstate;
+   vlVdpOutputSurface *last_surf;
+} vlVdpPresentationQueue;
+
+typedef struct
+{
+   vlVdpDevice *device;
+   pipe_mutex mutex;
+   struct pipe_video_codec *decoder;
 } vlVdpDecoder;
 
 typedef uint32_t vlHandle;
@@ -274,6 +428,12 @@ boolean vlGetFuncFTAB(VdpFuncId function_id, void **func);
 VdpDeviceCreateX11 vdp_imp_device_create_x11;
 VdpPresentationQueueTargetCreateX11 vlVdpPresentationQueueTargetCreateX11;
 
+void vlVdpDefaultSamplerViewTemplate(struct pipe_sampler_view *templ, struct pipe_resource *res);
+
+/* Delayed rendering funtionality */
+void vlVdpResolveDelayedRendering(vlVdpDevice *dev, struct pipe_surface *surface, struct u_rect *dirty_area);
+void vlVdpSave4DelayedRendering(vlVdpDevice *dev, VdpOutputSurface surface, struct vl_compositor_state *cstate);
+
 /* Internal function pointers */
 VdpGetErrorString vlVdpGetErrorString;
 VdpDeviceDestroy vlVdpDeviceDestroy;
@@ -298,6 +458,7 @@ VdpVideoSurfaceDestroy vlVdpVideoSurfaceDestroy;
 VdpVideoSurfaceGetParameters vlVdpVideoSurfaceGetParameters;
 VdpVideoSurfaceGetBitsYCbCr vlVdpVideoSurfaceGetBitsYCbCr;
 VdpVideoSurfacePutBitsYCbCr vlVdpVideoSurfacePutBitsYCbCr;
+void vlVdpVideoSurfaceClear(vlVdpSurface *vlsurf);
 VdpDecoderCreate vlVdpDecoderCreate;
 VdpDecoderDestroy vlVdpDecoderDestroy;
 VdpDecoderGetParameters vlVdpDecoderGetParameters;
@@ -358,4 +519,4 @@ static inline void VDPAU_MSG(unsigned int level, const char *fmt, ...)
    }
 }
 
-#endif // VDPAU_PRIVATE_H
+#endif /* VDPAU_PRIVATE_H */