X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fstate_trackers%2Fvdpau%2Fmixer.c;h=ed5a64640882ceaeb38c6393d043c8dafd24c2fd;hb=eadbcb221db16af96aa6c3f40d48896d23d9eebc;hp=124125ebaad3666fab771da650ea30affc70f8ff;hpb=9032d2a13ecd019206a48767d9205c0aafa7cca2;p=mesa.git diff --git a/src/gallium/state_trackers/vdpau/mixer.c b/src/gallium/state_trackers/vdpau/mixer.c index 124125ebaad..ed5a6464088 100644 --- a/src/gallium/state_trackers/vdpau/mixer.c +++ b/src/gallium/state_trackers/vdpau/mixer.c @@ -24,117 +24,260 @@ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * **************************************************************************/ - - #include - #include - #include - #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 + +#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, + 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; + VdpStatus ret; + float csc[16]; + + VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Creating VideoMixer\n"); + + vlVdpDevice *dev = vlGetDataHTAB(device); + if (!dev) return VDP_STATUS_INVALID_HANDLE; - - vmixer = CALLOC(1, sizeof(vlVdpVideoMixer)); - if (!vmixer) + + 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; + 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) { ret = VDP_STATUS_ERROR; goto no_handle; - } - - + } + return VDP_STATUS_OK; - no_handle: + +no_handle: return ret; } +/** + * Destroy a VdpVideoMixer. + */ VdpStatus -vlVdpVideoMixerSetFeatureEnables ( - VdpVideoMixer mixer, - uint32_t feature_count, - VdpVideoMixerFeature const *features, - VdpBool const *feature_enables) +vlVdpVideoMixerDestroy(VdpVideoMixer mixer) { - 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; + 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; } -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) +/** + * Enable or disable features. + */ +VdpStatus +vlVdpVideoMixerSetFeatureEnables(VdpVideoMixer mixer, + uint32_t feature_count, + VdpVideoMixerFeature const *features, + VdpBool const *feature_enables) { - if (!(background_source_rect && video_surface_past && video_surface_future && video_source_rect && destination_rect && destination_video_rect && layers)) - return VDP_STATUS_INVALID_POINTER; + VDPAU_MSG(VDPAU_TRACE, "[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_NO_IMPLEMENTATION; + return VDP_STATUS_OK; } +/** + * Perform a video post-processing and compositing operation. + */ +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) +{ + struct pipe_video_rect src_rect; + + 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, + 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; +} + +/** + * 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 -vlVdpVideoMixerSetAttributeValues ( - VdpVideoMixer mixer, - uint32_t attribute_count, - VdpVideoMixerAttribute const *attributes, - void const *const *attribute_values) +vlVdpVideoMixerGetFeatureEnables(VdpVideoMixer mixer, + uint32_t feature_count, + VdpVideoMixerFeature const *features, + VdpBool *feature_enables) { - 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 + 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) +{ + 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; +}