#include <vdpau/vdpau.h>
-#include <util/u_memory.h>
-#include <util/u_debug.h>
+#include "util/u_memory.h"
+#include "util/u_debug.h"
-#include <vl/vl_csc.h>
+#include "vl/vl_csc.h"
#include "vdpau_private.h"
+/**
+ * Create a VdpVideoMixer.
+ */
VdpStatus
vlVdpVideoMixerCreate(VdpDevice device,
uint32_t feature_count,
VdpVideoMixer *mixer)
{
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_compositor_init(&vmixer->compositor, dev->context->pipe);
vl_csc_get_matrix
(
VL_CSC_COLOR_STANDARD_IDENTITY : VL_CSC_COLOR_STANDARD_BT_601,
NULL, true, csc
);
- vmixer->compositor->set_csc_matrix(vmixer->compositor, csc);
+ vl_compositor_set_csc_matrix(&vmixer->compositor, csc);
/*
* TODO: Handle features and parameters
- * */
+ */
*mixer = vlAddDataHTAB(vmixer);
if (*mixer == 0) {
}
return VDP_STATUS_OK;
+
no_handle:
return ret;
}
+/**
+ * Destroy a VdpVideoMixer.
+ */
VdpStatus
vlVdpVideoMixerDestroy(VdpVideoMixer mixer)
{
- return VDP_STATUS_NO_IMPLEMENTATION;
+ vlVdpVideoMixer *vmixer;
+
+ VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Destroying VideoMixer\n");
+
+ vmixer = vlGetDataHTAB(mixer);
+ if (!vmixer)
+ return VDP_STATUS_INVALID_HANDLE;
+
+ vl_compositor_cleanup(&vmixer->compositor);
+
+ FREE(vmixer);
+
+ return VDP_STATUS_OK;
}
+/**
+ * Enable or disable features.
+ */
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;
/*
* TODO: Set features
- * */
+ */
return VDP_STATUS_OK;
}
+/**
+ * Perform a video post-processing and compositing operation.
+ */
VdpStatus vlVdpVideoMixerRender(VdpVideoMixer mixer,
VdpOutputSurface background_surface,
VdpRect const *background_source_rect,
uint32_t layer_count,
VdpLayer const *layers)
{
+ struct pipe_video_rect src_rect;
+
vlVdpVideoMixer *vmixer;
vlVdpSurface *surf;
vlVdpOutputSurface *dst;
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);
+ vl_compositor_clear_layers(&vmixer->compositor);
+ vl_compositor_set_buffer_layer(&vmixer->compositor, 0, surf->video_buffer,
+ RectToPipe(video_source_rect, &src_rect), NULL);
+ vl_compositor_render(&vmixer->compositor, dst->surface, NULL, NULL, false);
return VDP_STATUS_OK;
}
+/**
+ * Set attribute values.
+ */
VdpStatus
vlVdpVideoMixerSetAttributeValues(VdpVideoMixer mixer,
uint32_t attribute_count,
/*
* TODO: Implement the function
- *
- * */
+ */
return VDP_STATUS_OK;
}
+/**
+ * Retrieve whether features were requested at creation time.
+ */
VdpStatus
vlVdpVideoMixerGetFeatureSupport(VdpVideoMixer mixer,
uint32_t feature_count,
return VDP_STATUS_NO_IMPLEMENTATION;
}
+/**
+ * Retrieve whether features are enabled.
+ */
VdpStatus
vlVdpVideoMixerGetFeatureEnables(VdpVideoMixer mixer,
uint32_t feature_count,
return VDP_STATUS_NO_IMPLEMENTATION;
}
+/**
+ * Retrieve parameter values given at creation time.
+ */
VdpStatus
vlVdpVideoMixerGetParameterValues(VdpVideoMixer mixer,
uint32_t parameter_count,
return VDP_STATUS_NO_IMPLEMENTATION;
}
+/**
+ * Retrieve current attribute values.
+ */
VdpStatus
vlVdpVideoMixerGetAttributeValues(VdpVideoMixer mixer,
uint32_t attribute_count,
{
return VDP_STATUS_NO_IMPLEMENTATION;
}
+
+/**
+ * Generate a color space conversion matrix.
+ */
+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;
+}