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
>From fe5215e57e8c111706713d5a2eb9b75db6073e8c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Przemys=C5=82aw=20Sobala?= <przemyslaw.sob...@grupawp.pl>
Date: Fri, 18 Sep 2015 15:40:58 +0200
Subject: [PATCH] avcodec/imgconvert: Support non-planar colorspaces while
 padding

---
 libavcodec/imgconvert.c | 37 +++++++++++++++++++++++++++++++++++--
 1 file changed, 35 insertions(+), 2 deletions(-)

diff --git a/libavcodec/imgconvert.c b/libavcodec/imgconvert.c
index dc67560..884e65e 100644
--- a/libavcodec/imgconvert.c
+++ b/libavcodec/imgconvert.c
@@ -236,10 +236,42 @@ 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)
+        return -1;
+    
+    if (!is_yuv_planar(desc)) {
+        if (src) 
+            return -1; //TODO: Not yet implemented
+        
+        av_image_fill_max_pixsteps(max_step, NULL, desc);
 
-    if (pix_fmt < 0 || pix_fmt >= AV_PIX_FMT_NB ||
-        !is_yuv_planar(desc)) return -1;
+        if (padtop || padleft) {
+            memset(dst->data[0], color[0],
+                    dst->linesize[0] * padtop + (padleft * max_step[0]));
+        }
+
+        if (padleft || padright) {
+            optr = dst->data[0] + dst->linesize[0] * padtop +
+                    (dst->linesize[0] - (padright * max_step[0]));
+            yheight = height - 1 - (padtop + padbottom);
+            for (y = 0; y < yheight; y++) {
+                memset(optr, color[0], (padleft + padright) * max_step[0]);
+                optr += dst->linesize[0];
+            }
+        }
 
+        if (padbottom || padright) {
+            optr = dst->data[0] + dst->linesize[0] * (height - padbottom) -
+                    (padright * max_step[0]);
+            memset(optr, color[0], dst->linesize[0] * padbottom +
+                    (padright * max_step[0]));
+        }
+        
+        return 0;
+    }
+    
     for (i = 0; i < 3; i++) {
         x_shift = i ? desc->log2_chroma_w : 0;
         y_shift = i ? desc->log2_chroma_h : 0;
@@ -284,6 +316,7 @@ int av_picture_pad(AVPicture *dst, const AVPicture *src, int height, int width,
                 (padbottom >> y_shift) + (padright >> x_shift));
         }
     }
+
     return 0;
 }
 
-- 
1.8.3.1

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Reply via email to