[FFmpeg-devel] [PATCH] avcodec/imgconvert: Support non-planar colorspaces while padding

Michael Niedermayer michaelni at gmx.at
Sat Sep 19 04:14:24 CEST 2015


On Fri, Sep 18, 2015 at 04:31:16PM +0200, Przemysław Sobala wrote:
> ---
>  libavcodec/imgconvert.c | 99 ++++++++++++++++++++++++++++++++-----------------
>  1 file changed, 65 insertions(+), 34 deletions(-)
> 
> diff --git a/libavcodec/imgconvert.c b/libavcodec/imgconvert.c
> index dc67560..a523bd5 100644
> --- a/libavcodec/imgconvert.c
> +++ b/libavcodec/imgconvert.c
> @@ -236,54 +236,85 @@ int av_picture_pad(AVPicture *dst, const AVPicture *src, int height, int width,
>      int x_shift;
>      int yheight;
>      int i, y;
> +    int max_step[4];
>  
> -    if (pix_fmt < 0 || pix_fmt >= AV_PIX_FMT_NB ||
> -        !is_yuv_planar(desc)) return -1;
> +    if (pix_fmt < 0 || pix_fmt >= AV_PIX_FMT_NB)
> +        return -1;
>  
> -    for (i = 0; i < 3; i++) {
> -        x_shift = i ? desc->log2_chroma_w : 0;
> -        y_shift = i ? desc->log2_chroma_h : 0;
> +    if (is_yuv_planar(desc)) {
> +        for (i = 0; i < 3; i++) {
> +            x_shift = i ? desc->log2_chroma_w : 0;
> +            y_shift = i ? desc->log2_chroma_h : 0;
>  
> -        if (padtop || padleft) {
> -            memset(dst->data[i], color[i],
> -                dst->linesize[i] * (padtop >> y_shift) + (padleft >> x_shift));
> -        }
> +            if (padtop || padleft) {
> +                memset(dst->data[i], color[i],
> +                    dst->linesize[i] * (padtop >> y_shift) + (padleft >> x_shift));
> +            }
>  
> -        if (padleft || padright) {
> -            optr = dst->data[i] + dst->linesize[i] * (padtop >> y_shift) +
> -                (dst->linesize[i] - (padright >> x_shift));
> -            yheight = (height - 1 - (padtop + padbottom)) >> y_shift;
> -            for (y = 0; y < yheight; y++) {
> -                memset(optr, color[i], (padleft + padright) >> x_shift);
> -                optr += dst->linesize[i];
> +            if (padleft || padright) {
> +                optr = dst->data[i] + dst->linesize[i] * (padtop >> y_shift) +
> +                    (dst->linesize[i] - (padright >> x_shift));
> +                yheight = (height - 1 - (padtop + padbottom)) >> y_shift;
> +                for (y = 0; y < yheight; y++) {
> +                    memset(optr, color[i], (padleft + padright) >> x_shift);
> +                    optr += dst->linesize[i];
> +                }
>              }
> +
> +            if (src) { /* first line */
> +                uint8_t *iptr = src->data[i];
> +                optr = dst->data[i] + dst->linesize[i] * (padtop >> y_shift) +
> +                        (padleft >> x_shift);
> +                memcpy(optr, iptr, (width - padleft - padright) >> x_shift);
> +                iptr += src->linesize[i];
> +                optr = dst->data[i] + dst->linesize[i] * (padtop >> y_shift) +
> +                    (dst->linesize[i] - (padright >> x_shift));
> +                yheight = (height - 1 - (padtop + padbottom)) >> y_shift;
> +                for (y = 0; y < yheight; y++) {
> +                    memset(optr, color[i], (padleft + padright) >> x_shift);
> +                    memcpy(optr + ((padleft + padright) >> x_shift), iptr,
> +                           (width - padleft - padright) >> x_shift);
> +                    iptr += src->linesize[i];
> +                    optr += dst->linesize[i];
> +                }
> +            }
> +
> +            if (padbottom || padright) {
> +                optr = dst->data[i] + dst->linesize[i] *
> +                    ((height - padbottom) >> y_shift) - (padright >> x_shift);
> +                memset(optr, color[i],dst->linesize[i] *
> +                    (padbottom >> y_shift) + (padright >> x_shift));
> +            }
> +        }

this only reindents the code, moving the reindention to a seperate
patch would make it more readable


> +    } else {

> +        if (src) 
> +            return -1;

why ?


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

If a bugfix only changes things apparently unrelated to the bug with no
further explanation, that is a good sign that the bugfix is wrong.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20150919/097b0d2e/attachment.sig>


More information about the ffmpeg-devel mailing list