[FFmpeg-devel] [PATCH 7/7] Re-implement avpicture_layout() using pixdesc and imgutils API.

Michael Niedermayer michaelni
Tue Nov 9 19:31:16 CET 2010


On Sun, Nov 07, 2010 at 11:07:30PM +0100, Stefano Sabatini wrote:
> The new implementation is more compact, more correct and doesn't hurt
> the eyes.
> ---
>  libavcodec/imgconvert.c |   65 ++++++++++------------------------------------
>  1 files changed, 14 insertions(+), 51 deletions(-)
> 
> diff --git a/libavcodec/imgconvert.c b/libavcodec/imgconvert.c
> index df2a90e..6fba703 100644
> --- a/libavcodec/imgconvert.c
> +++ b/libavcodec/imgconvert.c
> @@ -490,68 +490,31 @@ int avpicture_fill(AVPicture *picture, uint8_t *ptr,
>  int avpicture_layout(const AVPicture* src, enum PixelFormat pix_fmt, int width, int height,
>                       unsigned char *dest, int dest_size)
>  {
> -    const PixFmtInfo* pf = &pix_fmt_info[pix_fmt];
> +    int i, j, nb_planes = 0, linesizes[4];
>      const AVPixFmtDescriptor *desc = &av_pix_fmt_descriptors[pix_fmt];
> -    int i, j, w, ow, h, oh, data_planes;
> -    const unsigned char* s;
>      int size = avpicture_get_size(pix_fmt, width, height);
>  
>      if (size > dest_size || size < 0)
> -        return -1;
> -
> -    if (pf->pixel_type == FF_PIXEL_PACKED || pf->pixel_type == FF_PIXEL_PALETTE) {
> -        if (pix_fmt == PIX_FMT_YUYV422 ||
> -            pix_fmt == PIX_FMT_UYVY422 ||
> -            pix_fmt == PIX_FMT_BGR565BE ||
> -            pix_fmt == PIX_FMT_BGR565LE ||
> -            pix_fmt == PIX_FMT_BGR555BE ||
> -            pix_fmt == PIX_FMT_BGR555LE ||
> -            pix_fmt == PIX_FMT_BGR444BE ||
> -            pix_fmt == PIX_FMT_BGR444LE ||
> -            pix_fmt == PIX_FMT_RGB565BE ||
> -            pix_fmt == PIX_FMT_RGB565LE ||
> -            pix_fmt == PIX_FMT_RGB555BE ||
> -            pix_fmt == PIX_FMT_RGB555LE ||
> -            pix_fmt == PIX_FMT_RGB444BE ||
> -            pix_fmt == PIX_FMT_RGB444LE)
> -            w = width * 2;
> -        else if (pix_fmt == PIX_FMT_UYYVYY411)
> -            w = width + width/2;
> -        else if (pix_fmt == PIX_FMT_PAL8)
> -            w = width;
> -        else
> -            w = width * (pf->depth * pf->nb_channels / 8);
> +        return AVERROR(EINVAL);
>  
> -        data_planes = 1;
> -        h = height;
> -    } else {
> -        data_planes = pf->nb_channels;
> -        w = (width*pf->depth + 7)/8;
> -        h = height;
> -    }
> +    for (i = 0; i < desc->nb_components; i++)
> +        nb_planes = FFMAX(desc->comp[i].plane, nb_planes);
> +    nb_planes++;
>  
> -    ow = w;
> -    oh = h;
> +    av_image_fill_linesizes(linesizes, pix_fmt, width);
> +    for (i = 0; i < nb_planes; i++) {
> +        int h, s = (i == 1 || i == 2) ? desc->log2_chroma_h : 0;
> +        h = (height + (1 << s) - 1) >> s;
>  
> -    for (i=0; i<data_planes; i++) {
> -        if (i == 1) {
> -            w = (- ((-width) >> desc->log2_chroma_w) * pf->depth + 7) / 8;
> -            h = -((-height) >> desc->log2_chroma_h);
> -            if (pix_fmt == PIX_FMT_NV12 || pix_fmt == PIX_FMT_NV21)
> -                w <<= 1;
> -        } else if (i == 3) {
> -            w = ow;
> -            h = oh;
> -        }
>          s = src->data[i];
> -        for(j=0; j<h; j++) {
> -            memcpy(dest, s, w);
> -            dest += w;
> +        for (j = 0; j < h; j++) {
> +            memcpy(dest, s, linesizes[i]);

if linesize > w then this copies more than is defined in the input i think

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

The worst form of inequality is to try to make unequal things equal.
-- Aristotle
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20101109/105f16ca/attachment.pgp>



More information about the ffmpeg-devel mailing list