[Mesa-dev] [PATCH 1/3] vdpau: Add support for parameters
Christian König
deathsimple at vodafone.de
Mon Dec 19 04:54:21 PST 2011
Committed all three with just a minor change:
removed check_video_surface in favor of doing the checks directly in the
render function.
On 19.12.2011 10:10, Maarten Lankhorst wrote:
> Currently only validating, since nothing else can be done with it yet
>
> Signed-off-by: Maarten Lankhorst<m.b.lankhorst at gmail.com>
>
> ---
> src/gallium/state_trackers/vdpau/mixer.c | 95 +++++++++++++++++++++-
> src/gallium/state_trackers/vdpau/query.c | 41 +++++++++-
> src/gallium/state_trackers/vdpau/vdpau_private.h | 3 +
> 3 files changed, 133 insertions(+), 6 deletions(-)
>
> diff --git a/src/gallium/state_trackers/vdpau/mixer.c b/src/gallium/state_trackers/vdpau/mixer.c
> index 1588744..276f5d5 100644
> --- a/src/gallium/state_trackers/vdpau/mixer.c
> +++ b/src/gallium/state_trackers/vdpau/mixer.c
> @@ -49,12 +49,16 @@ vlVdpVideoMixerCreate(VdpDevice device,
> vlVdpVideoMixer *vmixer = NULL;
> VdpStatus ret;
> float csc[16];
> + struct pipe_screen *screen;
> + unsigned max_width, max_height, i;
> + enum pipe_video_profile prof = PIPE_VIDEO_PROFILE_UNKNOWN;
>
> VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Creating VideoMixer\n");
>
> vlVdpDevice *dev = vlGetDataHTAB(device);
> if (!dev)
> return VDP_STATUS_INVALID_HANDLE;
> + screen = dev->vscreen->pscreen;
>
> vmixer = CALLOC(1, sizeof(vlVdpVideoMixer));
> if (!vmixer)
> @@ -72,7 +76,7 @@ vlVdpVideoMixerCreate(VdpDevice device,
> vl_compositor_set_csc_matrix(&vmixer->compositor, csc);
>
> /*
> - * TODO: Handle features and parameters
> + * TODO: Handle features
> */
>
> *mixer = vlAddDataHTAB(vmixer);
> @@ -80,10 +84,49 @@ vlVdpVideoMixerCreate(VdpDevice device,
> ret = VDP_STATUS_ERROR;
> goto no_handle;
> }
> -
> + vmixer->chroma_format = PIPE_VIDEO_CHROMA_FORMAT_420;
> + ret = VDP_STATUS_INVALID_VIDEO_MIXER_PARAMETER;
> + for (i = 0; i< parameter_count; ++i) {
> + switch (parameters[i]) {
> + case VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_WIDTH:
> + vmixer->video_width = *(uint32_t*)parameter_values[i];
> + break;
> + case VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_HEIGHT:
> + vmixer->video_height = *(uint32_t*)parameter_values[i];
> + break;
> + case VDP_VIDEO_MIXER_PARAMETER_CHROMA_TYPE:
> + vmixer->chroma_format = ChromaToPipe(*(VdpChromaType*)parameter_values[i]);
> + break;
> + case VDP_VIDEO_MIXER_PARAMETER_LAYERS:
> + vmixer->max_layers = *(uint32_t*)parameter_values[i];
> + break;
> + default: goto no_params;
> + }
> + }
> + ret = VDP_STATUS_INVALID_VALUE;
> + if (vmixer->max_layers> 4) {
> + VDPAU_MSG(VDPAU_TRACE, "[VDPAU] Max layers> 4 not supported\n", vmixer->max_layers);
> + goto no_params;
> + }
> + max_width = screen->get_video_param(screen, prof, PIPE_VIDEO_CAP_MAX_WIDTH);
> + max_height = screen->get_video_param(screen, prof, PIPE_VIDEO_CAP_MAX_HEIGHT);
> + if (vmixer->video_width< 48 ||
> + vmixer->video_width> max_width) {
> + VDPAU_MSG(VDPAU_TRACE, "[VDPAU] 48< %u< %u not valid for width\n", vmixer->video_width, max_width);
> + goto no_params;
> + }
> + if (vmixer->video_height< 48 ||
> + vmixer->video_height> max_height) {
> + VDPAU_MSG(VDPAU_TRACE, "[VDPAU] 48< %u< %u not valid for height\n", vmixer->video_height, max_height);
> + goto no_params;
> + }
> return VDP_STATUS_OK;
>
> +no_params:
> + vlRemoveDataHTAB(*mixer);
> no_handle:
> + vl_compositor_cleanup(&vmixer->compositor);
> + FREE(vmixer);
> return ret;
> }
>
> @@ -100,6 +143,7 @@ vlVdpVideoMixerDestroy(VdpVideoMixer mixer)
> vmixer = vlGetDataHTAB(mixer);
> if (!vmixer)
> return VDP_STATUS_INVALID_HANDLE;
> + vlRemoveDataHTAB(mixer);
>
> vl_compositor_cleanup(&vmixer->compositor);
>
> @@ -133,6 +177,18 @@ vlVdpVideoMixerSetFeatureEnables(VdpVideoMixer mixer,
> return VDP_STATUS_OK;
> }
>
> +static VdpStatus
> +check_video_surface(vlVdpVideoMixer *mixer, vlVdpSurface *surf)
> +{
> + if (surf->device != mixer->device)
> + return VDP_STATUS_HANDLE_DEVICE_MISMATCH;
> + if (mixer->video_width> surf->video_buffer->width ||
> + mixer->video_height> surf->video_buffer->height ||
> + mixer->chroma_format != surf->video_buffer->chroma_format)
> + return VDP_STATUS_INVALID_SIZE;
> + return VDP_STATUS_OK;
> +}
> +
> /**
> * Perform a video post-processing and compositing operation.
> */
> @@ -153,6 +209,7 @@ VdpStatus vlVdpVideoMixerRender(VdpVideoMixer mixer,
> VdpLayer const *layers)
> {
> struct pipe_video_rect src_rect, dst_rect, dst_clip;
> + VdpStatus ret;
>
> vlVdpVideoMixer *vmixer;
> vlVdpSurface *surf;
> @@ -165,6 +222,11 @@ VdpStatus vlVdpVideoMixerRender(VdpVideoMixer mixer,
> surf = vlGetDataHTAB(video_surface_current);
> if (!surf)
> return VDP_STATUS_INVALID_HANDLE;
> + ret = check_video_surface(vmixer, surf);
> + if (ret)
> + return ret;
> + if (layer_count> vmixer->max_layers)
> + return VDP_STATUS_INVALID_VALUE;
>
> dst = vlGetDataHTAB(destination_surface);
> if (!dst)
> @@ -237,7 +299,34 @@ vlVdpVideoMixerGetParameterValues(VdpVideoMixer mixer,
> VdpVideoMixerParameter const *parameters,
> void *const *parameter_values)
> {
> - return VDP_STATUS_NO_IMPLEMENTATION;
> + vlVdpVideoMixer *vmixer = vlGetDataHTAB(mixer);
> + unsigned i;
> + if (!vmixer)
> + return VDP_STATUS_INVALID_HANDLE;
> +
> + if (!parameter_count)
> + return VDP_STATUS_OK;
> + if (!(parameters&& parameter_values))
> + return VDP_STATUS_INVALID_POINTER;
> + for (i = 0; i< parameter_count; ++i) {
> + switch (parameters[i]) {
> + case VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_WIDTH:
> + *(uint32_t*)parameter_values[i] = vmixer->video_width;
> + break;
> + case VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_HEIGHT:
> + *(uint32_t*)parameter_values[i] = vmixer->video_height;
> + break;
> + case VDP_VIDEO_MIXER_PARAMETER_CHROMA_TYPE:
> + *(VdpChromaType*)parameter_values[i] = PipeToChroma(vmixer->chroma_format);
> + break;
> + case VDP_VIDEO_MIXER_PARAMETER_LAYERS:
> + *(uint32_t*)parameter_values[i] = vmixer->max_layers;
> + break;
> + default:
> + return VDP_STATUS_INVALID_VIDEO_MIXER_PARAMETER;
> + }
> + }
> + return VDP_STATUS_OK;
> }
>
> /**
> diff --git a/src/gallium/state_trackers/vdpau/query.c b/src/gallium/state_trackers/vdpau/query.c
> index 191e163..cbd5afd 100644
> --- a/src/gallium/state_trackers/vdpau/query.c
> +++ b/src/gallium/state_trackers/vdpau/query.c
> @@ -288,7 +288,18 @@ vlVdpVideoMixerQueryParameterSupport(VdpDevice device, VdpVideoMixerParameter pa
> if (!is_supported)
> return VDP_STATUS_INVALID_POINTER;
>
> - return VDP_STATUS_NO_IMPLEMENTATION;
> + switch (parameter) {
> + case VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_WIDTH:
> + case VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_HEIGHT:
> + case VDP_VIDEO_MIXER_PARAMETER_CHROMA_TYPE:
> + case VDP_VIDEO_MIXER_PARAMETER_LAYERS:
> + *is_supported = VDP_TRUE;
> + break;
> + default:
> + *is_supported = VDP_FALSE;
> + break;
> + }
> + return VDP_STATUS_OK;
> }
>
> /**
> @@ -298,10 +309,34 @@ VdpStatus
> vlVdpVideoMixerQueryParameterValueRange(VdpDevice device, VdpVideoMixerParameter parameter,
> void *min_value, void *max_value)
> {
> + vlVdpDevice *dev = vlGetDataHTAB(device);
> + struct pipe_screen *screen;
> + enum pipe_video_profile prof = PIPE_VIDEO_PROFILE_UNKNOWN;
> + if (!dev)
> + return VDP_STATUS_INVALID_HANDLE;
> if (!(min_value&& max_value))
> return VDP_STATUS_INVALID_POINTER;
> -
> - return VDP_STATUS_NO_IMPLEMENTATION;
> + screen = dev->vscreen->pscreen;
> + switch (parameter) {
> + case VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_WIDTH:
> + *(uint32_t*)min_value = 48;
> + *(uint32_t*)max_value = screen->get_video_param(screen, prof, PIPE_VIDEO_CAP_MAX_WIDTH);
> + break;
> + case VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_HEIGHT:
> + *(uint32_t*)min_value = 48;
> + *(uint32_t*)max_value = screen->get_video_param(screen, prof, PIPE_VIDEO_CAP_MAX_HEIGHT);
> + break;
> +
> + case VDP_VIDEO_MIXER_PARAMETER_LAYERS:
> + *(uint32_t*)min_value = 0;
> + *(uint32_t*)max_value = 4;
> + break;
> +
> + case VDP_VIDEO_MIXER_PARAMETER_CHROMA_TYPE:
> + default:
> + return VDP_STATUS_INVALID_VIDEO_MIXER_PARAMETER;
> + }
> + return VDP_STATUS_OK;
> }
>
> /**
> diff --git a/src/gallium/state_trackers/vdpau/vdpau_private.h b/src/gallium/state_trackers/vdpau/vdpau_private.h
> index 1922b70..fbada3b 100644
> --- a/src/gallium/state_trackers/vdpau/vdpau_private.h
> +++ b/src/gallium/state_trackers/vdpau/vdpau_private.h
> @@ -306,6 +306,9 @@ typedef struct
> {
> vlVdpDevice *device;
> struct vl_compositor compositor;
> + unsigned video_width, video_height;
> + enum pipe_video_chroma_format chroma_format;
> + unsigned max_layers;
> } vlVdpVideoMixer;
>
> typedef struct
Thanks,
Christian.
More information about the mesa-dev
mailing list