X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fstate_trackers%2Fvdpau%2Fmixer.c;h=8728157e8a5f7cbce5fed143d5af451b0859ba5b;hb=6cf0581159a33f3dc10be38cdc7ab94d9cbacc1e;hp=86ac099a7d8994d7f08e98dfd6035196166c3321;hpb=574ffb440dbd878d51fc9b9794a6396cbe6f75bb;p=mesa.git diff --git a/src/gallium/state_trackers/vdpau/mixer.c b/src/gallium/state_trackers/vdpau/mixer.c index 86ac099a7d8..8728157e8a5 100644 --- a/src/gallium/state_trackers/vdpau/mixer.c +++ b/src/gallium/state_trackers/vdpau/mixer.c @@ -26,10 +26,17 @@ **************************************************************************/ #include -#include -#include + +#include "util/u_memory.h" +#include "util/u_debug.h" + +#include "vl/vl_csc.h" + #include "vdpau_private.h" +/** + * Create a VdpVideoMixer. + */ VdpStatus vlVdpVideoMixerCreate(VdpDevice device, uint32_t feature_count, @@ -40,27 +47,33 @@ vlVdpVideoMixerCreate(VdpDevice device, 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 + ( + debug_get_bool_option("G3DVL_NO_CSC", FALSE) ? + VL_CSC_COLOR_STANDARD_IDENTITY : VL_CSC_COLOR_STANDARD_BT_601, + NULL, true, csc + ); + vl_compositor_set_csc_matrix(&vmixer->compositor, csc); /* * TODO: Handle features and parameters - * */ + */ *mixer = vlAddDataHTAB(vmixer); if (*mixer == 0) { @@ -69,17 +82,42 @@ vlVdpVideoMixerCreate(VdpDevice device, } return VDP_STATUS_OK; + no_handle: return ret; } +/** + * Destroy a VdpVideoMixer. + */ +VdpStatus +vlVdpVideoMixerDestroy(VdpVideoMixer mixer) +{ + 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; @@ -90,11 +128,14 @@ vlVdpVideoMixerSetFeatureEnables(VdpVideoMixer mixer, /* * 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, @@ -111,13 +152,35 @@ 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; + struct pipe_video_rect src_rect; - return VDP_STATUS_NO_IMPLEMENTATION; + 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; + + 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, @@ -133,8 +196,70 @@ vlVdpVideoMixerSetAttributeValues(VdpVideoMixer mixer, /* * TODO: Implement the function - * - * */ + */ + + return VDP_STATUS_OK; +} + +/** + * Retrieve whether features were requested at creation time. + */ +VdpStatus +vlVdpVideoMixerGetFeatureSupport(VdpVideoMixer mixer, + uint32_t feature_count, + VdpVideoMixerFeature const *features, + VdpBool *feature_supports) +{ + return VDP_STATUS_NO_IMPLEMENTATION; +} + +/** + * Retrieve whether features are enabled. + */ +VdpStatus +vlVdpVideoMixerGetFeatureEnables(VdpVideoMixer mixer, + uint32_t feature_count, + VdpVideoMixerFeature const *features, + VdpBool *feature_enables) +{ + return VDP_STATUS_NO_IMPLEMENTATION; +} + +/** + * Retrieve parameter values given at creation time. + */ +VdpStatus +vlVdpVideoMixerGetParameterValues(VdpVideoMixer mixer, + uint32_t parameter_count, + VdpVideoMixerParameter const *parameters, + void *const *parameter_values) +{ + return VDP_STATUS_NO_IMPLEMENTATION; +} + +/** + * Retrieve current attribute values. + */ +VdpStatus +vlVdpVideoMixerGetAttributeValues(VdpVideoMixer mixer, + uint32_t attribute_count, + VdpVideoMixerAttribute const *attributes, + void *const *attribute_values) +{ + 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; }