vdpau: get at least the very basic mixer functions working
[mesa.git] / src / gallium / state_trackers / vdpau / mixer.c
index 124125ebaad3666fab771da650ea30affc70f8ff..2fe0f1ca6f46bfe804b05348920300462cea67a3 100644 (file)
  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  *
  **************************************************************************/
- #include <vdpau/vdpau.h>
- #include <util/u_memory.h>
-  #include <util/u_debug.h>
-  #include "vdpau_private.h"
-
- VdpStatus     
- vlVdpVideoMixerCreate (VdpDevice device, 
-                                               uint32_t feature_count, 
-                                               VdpVideoMixerFeature const *features, 
-                                               uint32_t parameter_count, 
-                                               VdpVideoMixerParameter const *parameters, 
-                                               void const *const *parameter_values, 
-                                               VdpVideoMixer *mixer)
+
+#include <vdpau/vdpau.h>
+#include <util/u_memory.h>
+#include <util/u_debug.h>
+#include "vdpau_private.h"
+
+VdpStatus
+vlVdpVideoMixerCreate(VdpDevice device,
+                      uint32_t feature_count,
+                      VdpVideoMixerFeature const *features,
+                      uint32_t parameter_count,
+                      VdpVideoMixerParameter const *parameters,
+                      void const *const *parameter_values,
+                      VdpVideoMixer *mixer)
 {
-       VdpStatus ret;
-       vlVdpVideoMixer *vmixer = NULL;
-       
-       debug_printf("[VDPAU] Creating VideoMixer\n");
-       
-       vlVdpDevice *dev = vlGetDataHTAB(device);
-       if (!dev)
+   vlVdpVideoMixer *vmixer = NULL;
+   struct pipe_video_context *context;
+   VdpStatus ret;
+
+   debug_printf("[VDPAU] Creating VideoMixer\n");
+
+   vlVdpDevice *dev = vlGetDataHTAB(device);
+   if (!dev)
       return VDP_STATUS_INVALID_HANDLE;
-         
-       vmixer = CALLOC(1, sizeof(vlVdpVideoMixer));
-       if (!vmixer)
+
+   context = dev->context->vpipe;
+
+   vmixer = CALLOC(1, sizeof(vlVdpVideoMixer));
+   if (!vmixer)
       return VDP_STATUS_RESOURCES;
-         
-       vmixer->device = dev;
-         /*
-          * TODO: Handle features and parameters
-          * */
-         
-       *mixer = vlAddDataHTAB(vmixer);
-    if (*mixer == 0) {
+
+   vmixer->device = dev;
+   vmixer->compositor = context->create_compositor(context);
+
+   /*
+    * TODO: Handle features and parameters
+    * */
+
+   *mixer = vlAddDataHTAB(vmixer);
+   if (*mixer == 0) {
       ret = VDP_STATUS_ERROR;
       goto no_handle;
-    }
-   
-   
+   }
+
    return VDP_STATUS_OK;
-   no_handle:
+no_handle:
    return ret;
 }
 
 VdpStatus
-vlVdpVideoMixerSetFeatureEnables (
-                       VdpVideoMixer mixer, 
-                       uint32_t feature_count, 
-                       VdpVideoMixerFeature const *features, 
-                       VdpBool const *feature_enables)
+vlVdpVideoMixerSetFeatureEnables(VdpVideoMixer mixer,
+                                 uint32_t feature_count,
+                                 VdpVideoMixerFeature const *features,
+                                 VdpBool const *feature_enables)
 {
-       debug_printf("[VDPAU] Setting VideoMixer features\n");
-       
-       if (!(features && feature_enables))     
-               return VDP_STATUS_INVALID_POINTER;
-       
-       vlVdpVideoMixer *vmixer = vlGetDataHTAB(mixer);
-       if (!vmixer)
-               return VDP_STATUS_INVALID_HANDLE;
-               
-       /*
-          * TODO: Set features
-          * */
-       
-       
-       return VDP_STATUS_OK;
+   debug_printf("[VDPAU] Setting VideoMixer features\n");
+
+   if (!(features && feature_enables))
+      return VDP_STATUS_INVALID_POINTER;
+
+   vlVdpVideoMixer *vmixer = vlGetDataHTAB(mixer);
+   if (!vmixer)
+      return VDP_STATUS_INVALID_HANDLE;
+
+   /*
+    * TODO: Set features
+    * */
+
+   return VDP_STATUS_OK;
 }
 
-VdpStatus vlVdpVideoMixerRender (
-               VdpVideoMixer mixer, 
-               VdpOutputSurface background_surface, 
-               VdpRect const *background_source_rect, 
-               VdpVideoMixerPictureStructure current_picture_structure, 
-               uint32_t video_surface_past_count, 
-               VdpVideoSurface const *video_surface_past, 
-               VdpVideoSurface video_surface_current, 
-               uint32_t video_surface_future_count, 
-               VdpVideoSurface const *video_surface_future, 
-               VdpRect const *video_source_rect, 
-               VdpOutputSurface destination_surface, 
-               VdpRect const *destination_rect, 
-               VdpRect const *destination_video_rect, 
-               uint32_t layer_count, 
-               VdpLayer const *layers)
+VdpStatus vlVdpVideoMixerRender(VdpVideoMixer mixer,
+                                VdpOutputSurface background_surface,
+                                VdpRect const *background_source_rect,
+                                VdpVideoMixerPictureStructure current_picture_structure,
+                                uint32_t video_surface_past_count,
+                                VdpVideoSurface const *video_surface_past,
+                                VdpVideoSurface video_surface_current,
+                                uint32_t video_surface_future_count,
+                                VdpVideoSurface const *video_surface_future,
+                                VdpRect const *video_source_rect,
+                                VdpOutputSurface destination_surface,
+                                VdpRect const *destination_rect,
+                                VdpRect const *destination_video_rect,
+                                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;
+
+   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_NO_IMPLEMENTATION;
+   return VDP_STATUS_OK;
 }
 
 VdpStatus
-vlVdpVideoMixerSetAttributeValues (
-               VdpVideoMixer mixer, 
-               uint32_t attribute_count, 
-               VdpVideoMixerAttribute const *attributes, 
-               void const *const *attribute_values)
+vlVdpVideoMixerSetAttributeValues(VdpVideoMixer mixer,
+                                  uint32_t attribute_count,
+                                  VdpVideoMixerAttribute const *attributes,
+                                  void const *const *attribute_values)
 {
-       if (!(attributes && attribute_values))  
-               return VDP_STATUS_INVALID_POINTER;
-       
-       vlVdpVideoMixer *vmixer = vlGetDataHTAB(mixer);
-       if (!vmixer)
-               return VDP_STATUS_INVALID_HANDLE;
-               
-       /*
-        * TODO: Implement the function
-        * 
-        * */
-       
-       return VDP_STATUS_OK;
-}
\ No newline at end of file
+   if (!(attributes && attribute_values))
+      return VDP_STATUS_INVALID_POINTER;
+
+   vlVdpVideoMixer *vmixer = vlGetDataHTAB(mixer);
+   if (!vmixer)
+      return VDP_STATUS_INVALID_HANDLE;
+
+   /*
+    * TODO: Implement the function
+    *
+    * */
+
+   return VDP_STATUS_OK;
+}