[Mesa-dev] [PATCH 2/3] st/omx: add support for nouveau / interlaced

Leo Liu leo.liu at amd.com
Wed Jun 29 16:22:03 UTC 2016



On 06/29/2016 09:08 AM, Christian König wrote:
> 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.koenig at 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.

Yeah. I will do this way.

Thanks,
Leo

>
> 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.isorce at samsung.com 
>>>> <mailto:j.isorce at samsung.com>>
>>>>
>>>> On 28 June 2016 at 02:27, Liu, Leo <Leo.Liu at amd.com 
>>>> <mailto:Leo.Liu at 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.isorce at gmail.com
>>>>     <mailto:julien.isorce at 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.liu at 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.isorce at 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 at lists.freedesktop.org
>>>> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>>>
>>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20160629/781eabc7/attachment-0001.html>


More information about the mesa-dev mailing list