X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fstate_trackers%2Fvdpau%2Fmixer.c;h=ed5a64640882ceaeb38c6393d043c8dafd24c2fd;hb=eadbcb221db16af96aa6c3f40d48896d23d9eebc;hp=fbd24a29414e17bf03783bcfc128f005af55b7fd;hpb=835ea8480f656ba4076e30813eb8c85965017266;p=mesa.git diff --git a/src/gallium/state_trackers/vdpau/mixer.c b/src/gallium/state_trackers/vdpau/mixer.c index fbd24a29414..ed5a6464088 100644 --- a/src/gallium/state_trackers/vdpau/mixer.c +++ b/src/gallium/state_trackers/vdpau/mixer.c @@ -27,13 +27,16 @@ #include -#include -#include +#include "util/u_memory.h" +#include "util/u_debug.h" -#include +#include "vl/vl_csc.h" #include "vdpau_private.h" +/** + * Create a VdpVideoMixer. + */ VdpStatus vlVdpVideoMixerCreate(VdpDevice device, uint32_t feature_count, @@ -70,7 +73,7 @@ vlVdpVideoMixerCreate(VdpDevice device, /* * TODO: Handle features and parameters - * */ + */ *mixer = vlAddDataHTAB(vmixer); if (*mixer == 0) { @@ -79,10 +82,14 @@ vlVdpVideoMixerCreate(VdpDevice device, } return VDP_STATUS_OK; + no_handle: return ret; } +/** + * Destroy a VdpVideoMixer. + */ VdpStatus vlVdpVideoMixerDestroy(VdpVideoMixer mixer) { @@ -101,6 +108,9 @@ vlVdpVideoMixerDestroy(VdpVideoMixer mixer) return VDP_STATUS_OK; } +/** + * Enable or disable features. + */ VdpStatus vlVdpVideoMixerSetFeatureEnables(VdpVideoMixer mixer, uint32_t feature_count, @@ -118,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, @@ -139,6 +152,8 @@ VdpStatus vlVdpVideoMixerRender(VdpVideoMixer mixer, uint32_t layer_count, VdpLayer const *layers) { + struct pipe_video_rect src_rect; + vlVdpVideoMixer *vmixer; vlVdpSurface *surf; vlVdpOutputSurface *dst; @@ -156,12 +171,16 @@ VdpStatus vlVdpVideoMixerRender(VdpVideoMixer mixer, return VDP_STATUS_INVALID_HANDLE; vl_compositor_clear_layers(&vmixer->compositor); - vl_compositor_set_buffer_layer(&vmixer->compositor, 0, surf->video_buffer, NULL, NULL); - vl_compositor_render(&vmixer->compositor, dst->surface, NULL, NULL); + 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, @@ -177,12 +196,14 @@ 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, @@ -192,6 +213,9 @@ vlVdpVideoMixerGetFeatureSupport(VdpVideoMixer mixer, return VDP_STATUS_NO_IMPLEMENTATION; } +/** + * Retrieve whether features are enabled. + */ VdpStatus vlVdpVideoMixerGetFeatureEnables(VdpVideoMixer mixer, uint32_t feature_count, @@ -201,6 +225,9 @@ vlVdpVideoMixerGetFeatureEnables(VdpVideoMixer mixer, return VDP_STATUS_NO_IMPLEMENTATION; } +/** + * Retrieve parameter values given at creation time. + */ VdpStatus vlVdpVideoMixerGetParameterValues(VdpVideoMixer mixer, uint32_t parameter_count, @@ -210,6 +237,9 @@ vlVdpVideoMixerGetParameterValues(VdpVideoMixer mixer, return VDP_STATUS_NO_IMPLEMENTATION; } +/** + * Retrieve current attribute values. + */ VdpStatus vlVdpVideoMixerGetAttributeValues(VdpVideoMixer mixer, uint32_t attribute_count, @@ -219,14 +249,35 @@ vlVdpVideoMixerGetAttributeValues(VdpVideoMixer mixer, 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"); + float matrix[16]; + enum VL_CSC_COLOR_STANDARD vl_std; + struct vl_procamp camp; + if (!(csc_matrix && procamp)) return VDP_STATUS_INVALID_POINTER; + if (procamp->struct_version > VDP_PROCAMP_VERSION) + return VDP_STATUS_INVALID_STRUCT_VERSION; + + switch (standard) { + case VDP_COLOR_STANDARD_ITUR_BT_601: vl_std = VL_CSC_COLOR_STANDARD_BT_601; break; + case VDP_COLOR_STANDARD_ITUR_BT_709: vl_std = VL_CSC_COLOR_STANDARD_BT_709; break; + case VDP_COLOR_STANDARD_SMPTE_240M: vl_std = VL_CSC_COLOR_STANDARD_SMPTE_240M; break; + default: return VDP_STATUS_INVALID_COLOR_STANDARD; + } + camp.brightness = procamp->brightness; + camp.contrast = procamp->contrast; + camp.saturation = procamp->saturation; + camp.hue = procamp->hue; + vl_csc_get_matrix(vl_std, &camp, 1, matrix); + memcpy(csc_matrix, matrix, sizeof(float)*12); return VDP_STATUS_OK; }