[FFmpeg-devel] [PATCH] Fix linesize computation for NV formats

Michael Niedermayer michaelni
Tue Nov 24 15:27:22 CET 2009


On Fri, Nov 20, 2009 at 02:16:44PM -0200, Ramiro Polla wrote:
> On Fri, Nov 20, 2009 at 9:56 AM, Ramiro Polla <ramiro.polla at gmail.com> wrote:
> > On Thu, Nov 19, 2009 at 10:54 PM, Ramiro Polla <ramiro.polla at gmail.com> wrote:
> >> On Thu, Nov 19, 2009 at 10:38 PM, Stefano Sabatini
> >> <stefano.sabatini-lala at poste.it> wrote:
> >>> On date Thursday 2009-11-19 17:51:30 +0100, Michael Niedermayer encoded:
> >>>> On Thu, Nov 19, 2009 at 01:37:03AM +0100, Stefano Sabatini wrote:
> >>> [...]
> >>>> > So basically all the code affected by the change is indeed code which
> >>>> > is never used, my patch simply makes the linesize params semantics for
> >>>> > NV formats consistent with that of all the other formats (thus
> >>>> > simplifying the code if we choose to use pixdesc for ff_fill_XXX).
> >>>>
> >>>> if no code uses NV12 it should be removed (i dont belive this though)
> >>>> if any code uses NV12 your patch will break it.
> >>>
> >>> ffmpeg doesn't support NV12 as input, but can convert to NV12 /
> >>> NV21. So we can create a stream with pix_fmt nv12 but there is no mean
> >>> to visually test it (e.g. with ffplay) or convert it back to a stream
> >>> which is playable by ffmpeg, but maybe someone can suggest some way to
> >>> display such a format e.g. with mplayer or vlc.
> >>>
> >>> Also I wonder how hard would be to add it as an input format in lsws.
> >>
> >> I have a device with a hardware decoder to nv12 that also displays in
> >> nv12 at work. I might take a look tomorrow if I manage to find some
> >> time...
> >
> > One more change was needed to get raw nv12 output properly. With
> > attached patch I can
> > ./ffmpeg_g -i input.avi -s 1280x720 -pix_fmt nv12 -f rawvideo -y output.nv12
> > and then feed output.nv12 to the display frame by frame.
> >
> > I haven't worked on nv12 support as input to swscale yet. I'll do it
> > either this afternoon or in two weeks =)
> 
> And here is a patch to take nv12 and nv21 as input for swscale
> (depends on the previous patch).
> 
> Ramiro Polla

>  swscale.c          |    2 ++
>  swscale_template.c |   23 +++++++++++++++++++++++
>  2 files changed, 25 insertions(+)
> 7e95c118694ad7ee4d89e948fea7e3252238d5d9  nv12in.diff
> Index: libswscale/swscale.c
> ===================================================================
> --- libswscale/swscale.c	(revis?o 29937)
> +++ libswscale/swscale.c	(c?pia de trabalho)
> @@ -134,6 +134,8 @@
>          || (x)==PIX_FMT_GRAY8       \
>          || (x)==PIX_FMT_YUV410P     \
>          || (x)==PIX_FMT_YUV440P     \
> +        || (x)==PIX_FMT_NV12        \
> +        || (x)==PIX_FMT_NV21        \
>          || (x)==PIX_FMT_GRAY16BE    \
>          || (x)==PIX_FMT_GRAY16LE    \
>          || (x)==PIX_FMT_YUV444P     \
> Index: libswscale/swscale_template.c
> ===================================================================
> --- libswscale/swscale_template.c	(revis?o 29937)
> +++ libswscale/swscale_template.c	(c?pia de trabalho)
> @@ -1784,6 +1784,27 @@
>  #endif
>  }
>  
> +#define NVxxToUV(U, V)              \
> +    int i;                          \
> +    for (i = 0; i < width; i++) {   \
> +        dstU[i]= src1[2*i+U];       \
> +        dstV[i]= src1[2*i+V];       \
> +    }                               \
> +
> +static inline void RENAME(nv12ToUV)(uint8_t *dstU, uint8_t *dstV,
> +                                    const uint8_t *src1, const uint8_t *src2,
> +                                    long width, uint32_t *unused)
> +{
> +    NVxxToUV(0, 1);
> +}
> +
> +static inline void RENAME(nv21ToUV)(uint8_t *dstU, uint8_t *dstV,
> +                                    const uint8_t *src1, const uint8_t *src2,
> +                                    long width, uint32_t *unused)
> +{
> +    NVxxToUV(1, 0);
> +}

you need just 1 function, just exchange the 2 dst pointers


[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

I hate to see young programmers poisoned by the kind of thinking
Ulrich Drepper puts forward since it is simply too narrow -- Roman Shaposhnik
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20091124/c8c28704/attachment.pgp>



More information about the ffmpeg-devel mailing list