Signed-off-by: Leo Liu <leo....@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 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev