[Mesa-dev] [PATCH 1/2] st/va: move YUV content to deinterlaced buffer when reallocated for encoder

Christian K├Ânig deathsimple at vodafone.de
Thu Aug 24 06:52:09 UTC 2017


Am 23.08.2017 um 23:41 schrieb Leo Liu:
> Signed-off-by: Leo Liu <leo.liu at amd.com>
> ---
>   src/gallium/state_trackers/va/picture.c | 40 +++++++++++++++++++++++++++++----
>   1 file changed, 36 insertions(+), 4 deletions(-)
>
> diff --git a/src/gallium/state_trackers/va/picture.c b/src/gallium/state_trackers/va/picture.c
> index 47e63d3b30..3c5eb5de97 100644
> --- a/src/gallium/state_trackers/va/picture.c
> +++ b/src/gallium/state_trackers/va/picture.c
> @@ -626,9 +626,12 @@ vlVaEndPicture(VADriverContextP ctx, VAContextID context_id)
>                                           PIPE_VIDEO_CAP_SUPPORTS_INTERLACED);
>   
>      if (surf->buffer->interlaced != interlaced) {
> -      surf->templat.interlaced = screen->get_video_param(screen, context->decoder->profile,
> -                                                         PIPE_VIDEO_ENTRYPOINT_BITSTREAM,
> -                                                         PIPE_VIDEO_CAP_PREFERS_INTERLACED);
> +      surf->templat.interlaced =
> +         (context->decoder->entrypoint == PIPE_VIDEO_ENTRYPOINT_ENCODE) ?
> +         interlaced :
> +         screen->get_video_param(screen, context->decoder->profile,
> +                                 PIPE_VIDEO_ENTRYPOINT_BITSTREAM,
> +                                 PIPE_VIDEO_CAP_PREFERS_INTERLACED);

Why not just:
> screen->get_video_param(screen, context->decoder->profile,
>     context->decoder->entrypoint,
>     PIPE_VIDEO_CAP_PREFERS_INTERLACED);
?

>         realloc = true;
>      }
>   
> @@ -657,13 +660,42 @@ vlVaEndPicture(VADriverContextP ctx, VAContextID context_id)
>      }
>   
>      if (realloc) {
> -      surf->buffer->destroy(surf->buffer);
> +      struct pipe_video_buffer *old_buf = surf->buffer;
>   
>         if (vlVaHandleSurfaceAllocate(ctx, surf, &surf->templat) != VA_STATUS_SUCCESS) {
>            mtx_unlock(&drv->mutex);
>            return VA_STATUS_ERROR_ALLOCATION_FAILED;
>         }
>   
> +      if (context->decoder->entrypoint == PIPE_VIDEO_ENTRYPOINT_ENCODE) {
> +         struct vl_compositor *compositor = &drv->compositor;
> +         struct vl_compositor_state *s = &drv->cstate;
> +         struct pipe_surface **dst_surface;
> +         struct u_rect dst_rect;
> +
> +         dst_surface = surf->buffer->get_surfaces(surf->buffer);
> +         vl_compositor_clear_layers(s);
> +
> +         dst_rect.x0 = 0;
> +         dst_rect.x1 = old_buf->width;
> +         dst_rect.y0 = 0;
> +         dst_rect.y1 = old_buf->height;
> +
> +         vl_compositor_set_yuv_layer(s, compositor, 0, old_buf, NULL, NULL, true);
> +         vl_compositor_set_layer_dst_area(s, 0, &dst_rect);
> +         vl_compositor_render(s, compositor, dst_surface[0], NULL, false);
> +
> +         dst_rect.x1 /= 2;
> +         dst_rect.y1 /= 2;
> +
> +         vl_compositor_set_yuv_layer(s, compositor, 0, old_buf, NULL, NULL, false);
> +         vl_compositor_set_layer_dst_area(s, 0, &dst_rect);
> +         vl_compositor_render(s, compositor, dst_surface[1], NULL, false);
> +
> +         context->decoder->context->flush(context->decoder->context, NULL, 0);

Looks like we have mostly the same in the OMX state tracker, would it 
make sense to have a helper for this?

Apart from that looks good to me,
Christian.

> +      }
> +
> +      old_buf->destroy(old_buf);
>         context->target = surf->buffer;
>      }
>   




More information about the mesa-dev mailing list