On 08/24/2017 11:34 AM, Christian König wrote:
Am 24.08.2017 um 17:11 schrieb Leo Liu:
Signed-off-by: Leo Liu <leo....@amd.com>

Reviewed-by: Christian König <christian.koe...@amd.com> for the series.

Andy do you want to test this? Should make VA-API transcoding simpler to use.

Just got chance to test the transcoding(encoding previously). There is an issue with current patch 2, which is encode/decoder have buffer deinterlaced/interlaced.
v3, will address that, and performance keep same as before.

Regards,
Leo





Regards,
Christian.

---
src/gallium/auxiliary/vl/vl_compositor.c | 87 +++++++++++++++++++++-----------
  src/gallium/auxiliary/vl/vl_compositor.h | 21 ++++----
  src/gallium/state_trackers/omx/vid_dec.c | 32 +-----------
  3 files changed, 68 insertions(+), 72 deletions(-)

diff --git a/src/gallium/auxiliary/vl/vl_compositor.c b/src/gallium/auxiliary/vl/vl_compositor.c
index a79bf11264..794c8b5b17 100644
--- a/src/gallium/auxiliary/vl/vl_compositor.c
+++ b/src/gallium/auxiliary/vl/vl_compositor.c
@@ -885,6 +885,32 @@ draw_layers(struct vl_compositor *c, struct vl_compositor_state *s, struct u_rec
     }
  }
  +static void
+set_yuv_layer(struct vl_compositor_state *s, struct vl_compositor *c, unsigned layer, + struct pipe_video_buffer *buffer, struct u_rect *src_rect,
+              struct u_rect *dst_rect, bool y)
+{
+   struct pipe_sampler_view **sampler_views;
+   unsigned i;
+
+   assert(s && c && buffer);
+
+   assert(layer < VL_COMPOSITOR_MAX_LAYERS);
+
+   s->used_layers |= 1 << layer;
+   sampler_views = buffer->get_sampler_view_components(buffer);
+   for (i = 0; i < 3; ++i) {
+      s->layers[layer].samplers[i] = c->sampler_linear;
+ pipe_sampler_view_reference(&s->layers[layer].sampler_views[i], sampler_views[i]);
+   }
+
+   calc_src_and_dst(&s->layers[layer], buffer->width, buffer->height,
+ src_rect ? *src_rect : default_rect(&s->layers[layer]), + dst_rect ? *dst_rect : default_rect(&s->layers[layer]));
+
+   s->layers[layer].fs = (y) ? c->fs_weave_yuv.y : c->fs_weave_yuv.uv;
+}
+
  void
  vl_compositor_reset_dirty_area(struct u_rect *dirty)
  {
@@ -1143,36 +1169,6 @@ vl_compositor_set_layer_rotation(struct vl_compositor_state *s,
  }
    void
-vl_compositor_set_yuv_layer(struct vl_compositor_state *s,
-                            struct vl_compositor *c,
-                            unsigned layer,
-                            struct pipe_video_buffer *buffer,
-                            struct u_rect *src_rect,
-                            struct u_rect *dst_rect,
-                            bool y)
-{
-   struct pipe_sampler_view **sampler_views;
-   unsigned i;
-
-   assert(s && c && buffer);
-
-   assert(layer < VL_COMPOSITOR_MAX_LAYERS);
-
-   s->used_layers |= 1 << layer;
-   sampler_views = buffer->get_sampler_view_components(buffer);
-   for (i = 0; i < 3; ++i) {
-      s->layers[layer].samplers[i] = c->sampler_linear;
- pipe_sampler_view_reference(&s->layers[layer].sampler_views[i], sampler_views[i]);
-   }
-
-   calc_src_and_dst(&s->layers[layer], buffer->width, buffer->height,
- src_rect ? *src_rect : default_rect(&s->layers[layer]), - dst_rect ? *dst_rect : default_rect(&s->layers[layer]));
-
-   s->layers[layer].fs = (y) ? c->fs_weave_yuv.y : c->fs_weave_yuv.uv;
-}
-
-void
  vl_compositor_render(struct vl_compositor_state *s,
                       struct vl_compositor       *c,
                       struct pipe_surface        *dst_surface,
@@ -1215,6 +1211,37 @@ vl_compositor_render(struct vl_compositor_state *s,
     draw_layers(c, s, dirty_area);
  }
  +void
+vl_compositor_yuv_deint(struct vl_compositor_state *s,
+                        struct vl_compositor *c,
+                        struct pipe_video_buffer *src,
+                        struct pipe_video_buffer *dst)
+{
+   struct pipe_surface **dst_surfaces;
+   struct u_rect dst_rect;
+
+   dst_surfaces = dst->get_surfaces(dst);
+   vl_compositor_clear_layers(s);
+
+   dst_rect.x0 = 0;
+   dst_rect.x1 = src->width;
+   dst_rect.y0 = 0;
+   dst_rect.y1 = src->height;
+
+   set_yuv_layer(s, c, 0, src, NULL, NULL, true);
+   vl_compositor_set_layer_dst_area(s, 0, &dst_rect);
+   vl_compositor_render(s, c, dst_surfaces[0], NULL, false);
+
+   dst_rect.x1 /= 2;
+   dst_rect.y1 /= 2;
+
+   set_yuv_layer(s, c, 0, src, NULL, NULL, false);
+   vl_compositor_set_layer_dst_area(s, 0, &dst_rect);
+   vl_compositor_render(s, c, dst_surfaces[1], NULL, false);
+
+   s->pipe->flush(s->pipe, NULL, 0);
+}
+
  bool
  vl_compositor_init(struct vl_compositor *c, struct pipe_context *pipe)
  {
diff --git a/src/gallium/auxiliary/vl/vl_compositor.h b/src/gallium/auxiliary/vl/vl_compositor.h
index 535abb75cd..2546d75b23 100644
--- a/src/gallium/auxiliary/vl/vl_compositor.h
+++ b/src/gallium/auxiliary/vl/vl_compositor.h
@@ -240,18 +240,6 @@ vl_compositor_set_layer_rotation(struct vl_compositor_state *state,
                                   unsigned layer,
                                   enum vl_compositor_rotation rotate);
  -/**
- * set a layer of y or uv to render
- */
-void
-vl_compositor_set_yuv_layer(struct vl_compositor_state *s,
-                            struct vl_compositor *c,
-                            unsigned layer,
-                            struct pipe_video_buffer *buffer,
-                            struct u_rect *src_rect,
-                            struct u_rect *dst_rect,
-                            bool y);
-
  /*@}*/
    /**
@@ -265,6 +253,15 @@ vl_compositor_render(struct vl_compositor_state *state,
                       bool                        clear_dirty);
    /**
+ * deinterlace yuv buffer
+ */
+void
+vl_compositor_yuv_deint(struct vl_compositor_state *state,
+                        struct vl_compositor *compositor,
+                        struct pipe_video_buffer *src,
+                        struct pipe_video_buffer *dst);
+
+/**
   * destroy this compositor
   */
  void
diff --git a/src/gallium/state_trackers/omx/vid_dec.c b/src/gallium/state_trackers/omx/vid_dec.c
index 313bc0aa8b..28741c09a4 100644
--- a/src/gallium/state_trackers/omx/vid_dec.c
+++ b/src/gallium/state_trackers/omx/vid_dec.c
@@ -579,34 +579,6 @@ static void vid_dec_FillOutput(vid_dec_PrivateType *priv, struct pipe_video_buff
     }
  }
-static void vid_dec_deint(vid_dec_PrivateType *priv, struct pipe_video_buffer *src_buf,
-                          struct pipe_video_buffer *dst_buf)
-{
-   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, &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, &dst_rect);
-   vl_compositor_render(s, compositor, dst_surface[1], NULL, false);
-}
-
static void vid_dec_FrameDecoded(OMX_COMPONENTTYPE *comp, OMX_BUFFERHEADERTYPE* input,
                                   OMX_BUFFERHEADERTYPE* output)
  {
@@ -642,8 +614,8 @@ static void vid_dec_FrameDecoded(OMX_COMPONENTTYPE *comp, OMX_BUFFERHEADERTYPE* new_vbuf = priv->pipe->create_video_buffer(priv->pipe, &templat);
                /* convert the interlaced to the progressive */
-            vid_dec_deint(priv, input->pInputPortPrivate, new_vbuf);
-            priv->pipe->flush(priv->pipe, NULL, 0);
+            vl_compositor_yuv_deint(&priv->cstate, &priv->compositor,
+ input->pInputPortPrivate, new_vbuf);
                /* set the progrssive buffer for next round */
              vbuf->destroy(vbuf);



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

Reply via email to