st/omx/dec: set dst rect to match src size
authorLeo Liu <leo.liu@amd.com>
Thu, 11 Aug 2016 19:20:53 +0000 (15:20 -0400)
committerLeo Liu <leo.liu@amd.com>
Tue, 6 Sep 2016 14:01:24 +0000 (10:01 -0400)
When creating interlaced video buffer, hegith set to "template.height =
align(tmpl->height/ array_size, VL_MACROBLOCK_HEIGHT);", and we use
"template.height *= array_size;" for the buffer height, so it actually
aligned with 32. With progressive video buffer it still aligned with 16,
thus causing different height between interlaced buffer and progressive
buffer for 4K (height=2160), and 720p (height=720).

When transcode the video, this will cause the 16 lines corruption
at the bottom of the encode video.

Signed-off-by: Leo Liu <leo.liu@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
src/gallium/state_trackers/omx/vid_dec.c

index 78429668bd1eff91431c44432de63320e357119b..f782263bda9a150eedb35a5f29d3ff2122e8304a 100644 (file)
@@ -569,16 +569,25 @@ static void vid_dec_deint(vid_dec_PrivateType *priv, struct pipe_video_buffer *s
    struct vl_compositor *compositor = &priv->compositor;
    struct vl_compositor_state *s = &priv->cstate;
    struct pipe_surface **dst_surface;
+   struct u_rect dst_rect;
 
    dst_surface = dst_buf->get_surfaces(dst_buf);
    vl_compositor_clear_layers(s);
 
+   dst_rect.x0 = 0;
+   dst_rect.x1 = src_buf->width;
+   dst_rect.y0 = 0;
+   dst_rect.y1 = src_buf->height;
+
    vl_compositor_set_yuv_layer(s, compositor, 0, src_buf, NULL, NULL, true);
-   vl_compositor_set_layer_dst_area(s, 0, NULL);
+   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, src_buf, NULL, NULL, false);
-   vl_compositor_set_layer_dst_area(s, 0, NULL);
+   vl_compositor_set_layer_dst_area(s, 0, &dst_rect);
    vl_compositor_render(s, compositor, dst_surface[1], NULL, false);
 }