On 08/24/2017 02:52 AM, Christian König wrote:
Am 23.08.2017 um 23:41 schrieb Leo Liu:
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);

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

Right.
I checked "PIPE_VIDEO_CAP_PREFERS_INTERLACED" from encoder parameter under get_video_parameter()
I think I overlooked it yesterday. I will in fix it in V2.

Thanks,
Leo



        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;
     }



_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to