summaryrefslogtreecommitdiff
path: root/libavutil
diff options
context:
space:
mode:
authorClément Bœsch <ubitux@gmail.com>2016-01-08 16:16:10 +0100
committerVittorio Giovara <vittorio.giovara@gmail.com>2016-01-11 15:32:56 -0500
commite8bc642202c10beda1ea4e93ec8492b1e39805e5 (patch)
treefa974fb54c3d1b8bfb244f7ac0bce6e95e2ccdd6 /libavutil
parent7570c9e04f010c9b3bfdeb4338d330f2cdd25278 (diff)
lavu: add AV_CEIL_RSHIFT and use it in various places
Signed-off-by: Vittorio Giovara <vittorio.giovara@gmail.com>
Diffstat (limited to 'libavutil')
-rw-r--r--libavutil/common.h8
-rw-r--r--libavutil/frame.c2
-rw-r--r--libavutil/imgutils.c2
-rw-r--r--libavutil/version.h2
4 files changed, 11 insertions, 3 deletions
diff --git a/libavutil/common.h b/libavutil/common.h
index 7a43ccf10a..d2ddcba9ed 100644
--- a/libavutil/common.h
+++ b/libavutil/common.h
@@ -50,6 +50,14 @@
#define RSHIFT(a,b) ((a) > 0 ? ((a) + ((1<<(b))>>1))>>(b) : ((a) + ((1<<(b))>>1)-1)>>(b))
/* assume b>0 */
#define ROUNDED_DIV(a,b) (((a)>0 ? (a) + ((b)>>1) : (a) - ((b)>>1))/(b))
+
+/**
+ * Fast a / (1 << b) rounded toward +inf, assuming a >= 0 and b >= 0.
+ */
+#define AV_CEIL_RSHIFT(a, b) \
+ (av_builtin_constant_p(b) ? ((a) + (1 << (b)) - 1) >> (b) \
+ : -((-(a)) >> (b)))
+
#define FFABS(a) ((a) >= 0 ? (a) : (-(a)))
#define FFSIGN(a) ((a) > 0 ? 1 : -1)
diff --git a/libavutil/frame.c b/libavutil/frame.c
index e4f6ab3daa..15276fee49 100644
--- a/libavutil/frame.c
+++ b/libavutil/frame.c
@@ -111,7 +111,7 @@ static int get_video_buffer(AVFrame *frame, int align)
for (i = 0; i < 4 && frame->linesize[i]; i++) {
int h = frame->height;
if (i == 1 || i == 2)
- h = -((-h) >> desc->log2_chroma_h);
+ h = AV_CEIL_RSHIFT(h, desc->log2_chroma_h);
frame->buf[i] = av_buffer_alloc(frame->linesize[i] * h);
if (!frame->buf[i])
diff --git a/libavutil/imgutils.c b/libavutil/imgutils.c
index 4fb7a9b0aa..6c581396a3 100644
--- a/libavutil/imgutils.c
+++ b/libavutil/imgutils.c
@@ -291,7 +291,7 @@ void av_image_copy(uint8_t *dst_data[4], int dst_linesizes[4],
int h = height;
int bwidth = av_image_get_linesize(pix_fmt, width, i);
if (i == 1 || i == 2) {
- h= -((-height)>>desc->log2_chroma_h);
+ h = AV_CEIL_RSHIFT(height, desc->log2_chroma_h);
}
av_image_copy_plane(dst_data[i], dst_linesizes[i],
src_data[i], src_linesizes[i],
diff --git a/libavutil/version.h b/libavutil/version.h
index 802a44549f..25457acaf0 100644
--- a/libavutil/version.h
+++ b/libavutil/version.h
@@ -54,7 +54,7 @@
*/
#define LIBAVUTIL_VERSION_MAJOR 55
-#define LIBAVUTIL_VERSION_MINOR 4
+#define LIBAVUTIL_VERSION_MINOR 5
#define LIBAVUTIL_VERSION_MICRO 0
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \