Am 29.06.2016 um 14:46 schrieb Leo Liu:


On 06/28/2016 05:07 AM, Christian König wrote:
Hi Leo,

nice catch patch is Reviewed-by: Christian König <christian.koe...@amd.com>.

But we still need to fix transcoding issue with interlaced as true. Our transcode support tunneling, basic the decode buffer will be used directly for encode.

Ah, yes of course. Sorry I was a bit fast with giving my rb on that, should have thought about it more.

The problem is that the VCE engine can only handle progressive frames and not the interlaced memory layout.

What we should do is implementing interlaced -> progressive conversion in the omx state tracker tunneling handling when that happens. Then set interlaced to false in the template and reallocate the video buffer for the next trancoding round.

The weave filter from the compositor could be used for interlaced -> progressive conversion. And btw: We are going to have the same problem with the VA-API state tracker.

Just concern this may cause performance compromised. How about we add a environment variable at the same time to false the interlaced, so that it's up to user to choose either way.

That shouldn't cause any performance issues, except for a slightly overhead on startup. See after reallocating the surfaces to a progressive format they will be reused over and over again.

Alternative we could detect that case while setting up the tunnel. E.g. figure out the format wanted by the decoder, figure out the format wanted by the encoder and get the intersection of both.

The problem is just that when you decode you don't necessary knew what the surface will be used for.

Regards,
Christian.


Regards,
Leo


Regards,
Christian.

Am 28.06.2016 um 09:01 schrieb Julien Isorce:
Thx Leo.
I confirm it works with nouveau driver so your fix is:
Tested-by: Julien Isorce <j.iso...@samsung.com <mailto:j.iso...@samsung.com>>

On 28 June 2016 at 02:27, Liu, Leo <leo....@amd.com <mailto:leo....@amd.com>> wrote:

    Hi Julien and Christian,


    I got a patch attached to fix the "fillout" problem, and please
    review.


    But we still need to fix transcoding issue with interlaced as
    true. Our transcode support tunneling, basic the decode buffer
    will be used directly for encode.


    Thanks,

    Leo



    ------------------------------------------------------------------------
    *From:* Julien Isorce <julien.iso...@gmail.com
    <mailto:julien.iso...@gmail.com>>
    *Sent:* June 27, 2016 4:54:07 PM
    *To:* Liu, Leo
    *Cc:* ML mesa-dev; Gurkirpal Singh; Koenig, Christian
    *Subject:* Re: [Mesa-dev] [PATCH 2/3] st/omx: add support for
    nouveau / interlaced
    Hi Leo,

    Sorry for the inconvenience, could you let me know how to
    reproduce the problem ?
    I have been playing with some gst pipelines and they all work
    but I can only test with nouveau driver.

    Cheers
    Julien


    On 27 June 2016 at 21:35, Leo Liu <leo....@amd.com> wrote:

        This patch break omx decode to file, it got seg fault. Will
        take look further.

        Regards,
        Leo



        On 06/27/2016 04:16 AM, Julien Isorce wrote:

            Signed-off-by: Julien Isorce <j.iso...@samsung.com>
            ---
            src/gallium/state_trackers/omx/vid_dec.c | 51
            ++++++++++++++++----------------
              1 file changed, 26 insertions(+), 25 deletions(-)

            diff --git a/src/gallium/state_trackers/omx/vid_dec.c
            b/src/gallium/state_trackers/omx/vid_dec.c
            index 564ca2f..85ffb88 100644
            --- a/src/gallium/state_trackers/omx/vid_dec.c
            +++ b/src/gallium/state_trackers/omx/vid_dec.c
            @@ -48,6 +48,7 @@
              #include "pipe/p_video_codec.h"
              #include "util/u_memory.h"
              #include "util/u_surface.h"
            +#include "vl/vl_video_buffer.h"
              #include "vl/vl_vlc.h"
                #include "entrypoint.h"
            @@ -515,34 +516,34 @@ static void
            vid_dec_FillOutput(vid_dec_PrivateType *priv, struct
            pipe_video_buff
                 OMX_VIDEO_PORTDEFINITIONTYPE *def =
            &port->sPortParam.format.video;
                   struct pipe_sampler_view **views;
            -   struct pipe_transfer *transfer;
            -   struct pipe_box box = { };
            -   uint8_t *src, *dst;
            +   unsigned i, j;
            +   unsigned width, height;
                   views = buf->get_sampler_view_planes(buf);
              -   dst = output->pBuffer;
            -
            -   box.width = def->nFrameWidth;
            -   box.height = def->nFrameHeight;
            -   box.depth = 1;
            -
            -   src = priv->pipe->transfer_map(priv->pipe,
            views[0]->texture, 0,
            - PIPE_TRANSFER_READ, &box, &transfer);
            -   util_copy_rect(dst, views[0]->texture->format,
            def->nStride, 0, 0,
            -                  box.width, box.height, src,
            transfer->stride, 0, 0);
            -  pipe_transfer_unmap(priv->pipe, transfer);
            -
            -   dst = ((uint8_t*)output->pBuffer) + (def->nStride *
            box.height);
            -
            -   box.width = def->nFrameWidth / 2;
            -   box.height = def->nFrameHeight / 2;
            -
            -   src = priv->pipe->transfer_map(priv->pipe,
            views[1]->texture, 0,
            - PIPE_TRANSFER_READ, &box, &transfer);
            -   util_copy_rect(dst, views[1]->texture->format,
            def->nStride, 0, 0,
            -                  box.width, box.height, src,
            transfer->stride, 0, 0);
            -  pipe_transfer_unmap(priv->pipe, transfer);
            +   for (i = 0; i < 2 /* NV12 */; i++) {
            +      if (!views[i]) continue;
            +      width = buf->width;
            +      height = buf->height;
            + vl_video_buffer_adjust_size(&width, &height, i,
            buf->interlaced, buf->chroma_format);
            +      for (j = 0; j < views[i]->texture->array_size; ++j) {
            +         struct pipe_box box = {0, 0, j, width, height, 1};
            +         struct pipe_transfer *transfer;
            +         uint8_t *map, *dst;
            +         map = priv->pipe->transfer_map(priv->pipe,
            views[i]->texture, 0,
            + PIPE_TRANSFER_READ, &box, &transfer);
            +         if (!map)
            +            return;
            +
            +         dst = ((uint8_t*)output->pBuffer +
            output->nOffset) + j * def->nStride + i * buf->width *
            buf->height;
            +         util_copy_rect(dst,
            + views[i]->texture->format,
            +            def->nStride *
            views[i]->texture->array_size, 0, 0,
            +            box.width, box.height, map,
            transfer->stride, 0, 0);
            +
            +  pipe_transfer_unmap(priv->pipe, transfer);
            +      }
            +   }
              }
                static void vid_dec_FrameDecoded(OMX_COMPONENTTYPE
            *comp, OMX_BUFFERHEADERTYPE* input,






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



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

Reply via email to