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

Leo Liu leo.liu at amd.com
Wed Aug 23 21:41:43 UTC 2017


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);
       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);
+      }
+
+      old_buf->destroy(old_buf);
       context->target = surf->buffer;
    }
 
-- 
2.11.0



More information about the mesa-dev mailing list