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

Przemysław Sobala przemyslaw.sobala at grupawp.pl
Sat Sep 19 12:33:55 CEST 2015


W dniu 19.09.2015 o 04:14, Michael Niedermayer pisze:
> 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

I've rearranged the code a bit.

>> +    } else {
>
>> +        if (src)
>> +            return -1;
>
> why ?
>

Because it's not yet implemented.
I've added a comment.
New patch attached.

--
Regards
Przemysław Sobala


Główne Spółki Grupy Wirtualna Polska:

Wirtualna Polska Holding Spółka Akcyjna z siedzibą w Warszawie, ul. Jutrzenki 137A, 02-231 Warszawa, wpisana do Krajowego Rejestru Sądowego - Rejestru Przedsiębiorców prowadzonego przez Sąd Rejonowy dla m.st. Warszawy w Warszawie pod nr KRS: 0000407130, kapitał zakładowy: 1 245 651,90 zł (w całości wpłacony), Numer Identyfikacji Podatkowej (NIP): 521-31-11-513

Grupa Wirtualna Polska Spółka z ograniczoną odpowiedzialnością z siedzibą w Warszawie, ul. Jutrzenki 137A, 02-231 Warszawa, wpisana do Krajowego Rejestru Sądowego - Rejestru Przedsiębiorców prowadzonego przez Sąd Rejonowy dla m.st. Warszawy w Warszawie pod nr KRS: 0000373814, kapitał zakładowy: 317 957 800,00 zł, Numer Identyfikacji Podatkowej (NIP): 527-26-45-593

WP Shopping Spółka z ograniczoną odpowiedzialnością z siedzibą w Gdańsku, ul. Romualda Traugutta 115 C, 80-226 Gdańsk, wpisana do Krajowego Rejestru Sądowego - Rejestru Przedsiębiorców prowadzonego przez Sąd Rejonowy Gdańsk - Północ w Gdańsku pod nr KRS: 0000546914, kapitał zakładowy: 170.000,00 złotych (w całości wpłacony), Numer Identyfikacji Podatkowej (NIP): 957-07-51-216
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-avcodec-imgconvert-Support-non-planar-colorspaces-wh.patch
Type: text/x-patch
Size: 2326 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20150919/76d0589b/attachment.bin>


More information about the ffmpeg-devel mailing list