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