aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec/imgconvert.c
diff options
context:
space:
mode:
authorPrzemysław Sobala <przemyslaw.sobala@grupawp.pl>2015-09-18 15:40:58 +0200
committerMichael Niedermayer <michael@niedermayer.cc>2015-09-19 18:34:55 +0200
commit0d097a869c38850c9ac09bccef60a229470f489b (patch)
treea9b8f632f991d1abec98b4c25d6369b6954219d9 /libavcodec/imgconvert.c
parent6f9ba0cb82a6515c4571312c05934bdc7bb11a58 (diff)
downloadffmpeg-0d097a869c38850c9ac09bccef60a229470f489b.tar.gz
avcodec/imgconvert: Support non-planar colorspaces while padding
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
Diffstat (limited to 'libavcodec/imgconvert.c')
-rw-r--r--libavcodec/imgconvert.c37
1 files changed, 35 insertions, 2 deletions
diff --git a/libavcodec/imgconvert.c b/libavcodec/imgconvert.c
index 7c1b22fb39..2241cc1760 100644
--- a/libavcodec/imgconvert.c
+++ b/libavcodec/imgconvert.c
@@ -236,9 +236,41 @@ 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 (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]));
+ }
- if (pix_fmt < 0 || pix_fmt >= AV_PIX_FMT_NB ||
- !is_yuv_planar(desc)) return -1;
+ return 0;
+ }
for (i = 0; i < 3; i++) {
x_shift = i ? desc->log2_chroma_w : 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;
}