vdpau: make state tracker far less noisy
[mesa.git] / src / gallium / state_trackers / vdpau / mixer.c
index 808ff9e9ce8beb40d2556c286ff543a8a88322d0..85f4e1541ab4a92ffc1e6a5c845fb3c74c0dc21d 100644 (file)
  **************************************************************************/
 
 #include <vdpau/vdpau.h>
+
 #include <util/u_memory.h>
 #include <util/u_debug.h>
+
+#include <vl/vl_csc.h>
+
 #include "vdpau_private.h"
 
 VdpStatus
@@ -39,20 +43,34 @@ vlVdpVideoMixerCreate(VdpDevice device,
                       void const *const *parameter_values,
                       VdpVideoMixer *mixer)
 {
-   VdpStatus ret;
    vlVdpVideoMixer *vmixer = NULL;
+   struct pipe_video_context *context;
+   VdpStatus ret;
+   float csc[16];
 
-   debug_printf("[VDPAU] Creating VideoMixer\n");
+   VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Creating VideoMixer\n");
 
    vlVdpDevice *dev = vlGetDataHTAB(device);
    if (!dev)
       return VDP_STATUS_INVALID_HANDLE;
 
+   context = dev->context->vpipe;
+
    vmixer = CALLOC(1, sizeof(vlVdpVideoMixer));
    if (!vmixer)
       return VDP_STATUS_RESOURCES;
 
    vmixer->device = dev;
+   vmixer->compositor = context->create_compositor(context);
+
+   vl_csc_get_matrix
+   (
+      debug_get_bool_option("G3DVL_NO_CSC", FALSE) ?
+      VL_CSC_COLOR_STANDARD_IDENTITY : VL_CSC_COLOR_STANDARD_BT_601,
+      NULL, true, csc
+   );
+   vmixer->compositor->set_csc_matrix(vmixer->compositor, csc);
+
    /*
     * TODO: Handle features and parameters
     * */
@@ -68,13 +86,31 @@ no_handle:
    return ret;
 }
 
+VdpStatus
+vlVdpVideoMixerDestroy(VdpVideoMixer mixer)
+{
+   vlVdpVideoMixer *vmixer;
+
+   VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Destroying VideoMixer\n");
+
+   vmixer = vlGetDataHTAB(mixer);
+   if (!vmixer)
+      return VDP_STATUS_INVALID_HANDLE;
+
+   vmixer->compositor->destroy(vmixer->compositor);
+
+   FREE(vmixer);
+
+   return VDP_STATUS_OK;
+}
+
 VdpStatus
 vlVdpVideoMixerSetFeatureEnables(VdpVideoMixer mixer,
                                  uint32_t feature_count,
                                  VdpVideoMixerFeature const *features,
                                  VdpBool const *feature_enables)
 {
-   debug_printf("[VDPAU] Setting VideoMixer features\n");
+   VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Setting VideoMixer features\n");
 
    if (!(features && feature_enables))
       return VDP_STATUS_INVALID_POINTER;
@@ -106,11 +142,28 @@ VdpStatus vlVdpVideoMixerRender(VdpVideoMixer mixer,
                                 uint32_t layer_count,
                                 VdpLayer const *layers)
 {
-   if (!(background_source_rect && video_surface_past && video_surface_future &&
-         video_source_rect && destination_rect && destination_video_rect && layers))
-      return VDP_STATUS_INVALID_POINTER;
+   vlVdpVideoMixer *vmixer;
+   vlVdpSurface *surf;
+   vlVdpOutputSurface *dst;
 
-   return VDP_STATUS_NO_IMPLEMENTATION;
+   vmixer = vlGetDataHTAB(mixer);
+   if (!vmixer)
+      return VDP_STATUS_INVALID_HANDLE;
+
+   surf = vlGetDataHTAB(video_surface_current);
+   if (!surf)
+      return VDP_STATUS_INVALID_HANDLE;
+
+   dst = vlGetDataHTAB(destination_surface);
+   if (!dst)
+      return VDP_STATUS_INVALID_HANDLE;
+
+   vmixer->compositor->clear_layers(vmixer->compositor);
+   vmixer->compositor->set_buffer_layer(vmixer->compositor, 0, surf->video_buffer, NULL, NULL);
+   vmixer->compositor->render_picture(vmixer->compositor, PIPE_MPEG12_PICTURE_TYPE_FRAME,
+                                      dst->surface, NULL, NULL);
+
+   return VDP_STATUS_OK;
 }
 
 VdpStatus
@@ -133,3 +186,51 @@ vlVdpVideoMixerSetAttributeValues(VdpVideoMixer mixer,
 
    return VDP_STATUS_OK;
 }
+
+VdpStatus
+vlVdpVideoMixerGetFeatureSupport(VdpVideoMixer mixer,
+                                 uint32_t feature_count,
+                                 VdpVideoMixerFeature const *features,
+                                 VdpBool *feature_supports)
+{
+   return VDP_STATUS_NO_IMPLEMENTATION;
+}
+
+VdpStatus
+vlVdpVideoMixerGetFeatureEnables(VdpVideoMixer mixer,
+                                 uint32_t feature_count,
+                                 VdpVideoMixerFeature const *features,
+                                 VdpBool *feature_enables)
+{
+   return VDP_STATUS_NO_IMPLEMENTATION;
+}
+
+VdpStatus
+vlVdpVideoMixerGetParameterValues(VdpVideoMixer mixer,
+                                  uint32_t parameter_count,
+                                  VdpVideoMixerParameter const *parameters,
+                                  void *const *parameter_values)
+{
+   return VDP_STATUS_NO_IMPLEMENTATION;
+}
+
+VdpStatus
+vlVdpVideoMixerGetAttributeValues(VdpVideoMixer mixer,
+                                  uint32_t attribute_count,
+                                  VdpVideoMixerAttribute const *attributes,
+                                  void *const *attribute_values)
+{
+   return VDP_STATUS_NO_IMPLEMENTATION;
+}
+
+VdpStatus
+vlVdpGenerateCSCMatrix(VdpProcamp *procamp,
+                       VdpColorStandard standard,
+                       VdpCSCMatrix *csc_matrix)
+{
+   VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Generating CSCMatrix\n");
+   if (!(csc_matrix && procamp))
+      return VDP_STATUS_INVALID_POINTER;
+
+   return VDP_STATUS_OK;
+}