lavu: add AV_CEIL_RSHIFT and use it in various places

Signed-off-by: Vittorio Giovara <vittorio.giovara@gmail.com>
pull/170/merge
Clément Bœsch 9 years ago committed by Vittorio Giovara
parent 7570c9e04f
commit e8bc642202
  1. 4
      libavcodec/ffv1dec.c
  2. 4
      libavcodec/ffv1enc.c
  3. 4
      libavcodec/mimic.c
  4. 5
      libavfilter/vf_framepack.c
  5. 8
      libavutil/common.h
  6. 2
      libavutil/frame.c
  7. 2
      libavutil/imgutils.c
  8. 2
      libavutil/version.h
  9. 8
      libswscale/rgb2rgb_template.c
  10. 6
      libswscale/swscale.c
  11. 6
      libswscale/swscale_unscaled.c
  12. 10
      libswscale/utils.c
  13. 8
      libswscale/x86/rgb2rgb_template.c

@ -375,8 +375,8 @@ static int decode_slice(AVCodecContext *c, void *arg)
av_assert1(width && height); av_assert1(width && height);
if (f->colorspace == 0) { if (f->colorspace == 0) {
const int chroma_width = -((-width) >> f->chroma_h_shift); const int chroma_width = AV_CEIL_RSHIFT(width, f->chroma_h_shift);
const int chroma_height = -((-height) >> f->chroma_v_shift); const int chroma_height = AV_CEIL_RSHIFT(height, f->chroma_v_shift);
const int cx = x >> f->chroma_h_shift; const int cx = x >> f->chroma_h_shift;
const int cy = y >> f->chroma_v_shift; const int cy = y >> f->chroma_v_shift;
decode_plane(fs, p->data[0] + ps * x + y * p->linesize[0], width, decode_plane(fs, p->data[0] + ps * x + y * p->linesize[0], width,

@ -897,8 +897,8 @@ static int encode_slice(AVCodecContext *c, void *arg)
} }
if (f->colorspace == 0) { if (f->colorspace == 0) {
const int chroma_width = -((-width) >> f->chroma_h_shift); const int chroma_width = AV_CEIL_RSHIFT(width, f->chroma_h_shift);
const int chroma_height = -((-height) >> f->chroma_v_shift); const int chroma_height = AV_CEIL_RSHIFT(height, f->chroma_v_shift);
const int cx = x >> f->chroma_h_shift; const int cx = x >> f->chroma_h_shift;
const int cy = y >> f->chroma_v_shift; const int cy = y >> f->chroma_v_shift;

@ -392,8 +392,8 @@ static int mimic_decode_frame(AVCodecContext *avctx, void *data,
avctx->height = height; avctx->height = height;
avctx->pix_fmt = AV_PIX_FMT_YUV420P; avctx->pix_fmt = AV_PIX_FMT_YUV420P;
for (i = 0; i < 3; i++) { for (i = 0; i < 3; i++) {
ctx->num_vblocks[i] = -((-height) >> (3 + !!i)); ctx->num_vblocks[i] = AV_CEIL_RSHIFT(height, 3 + !!i);
ctx->num_hblocks[i] = width >> (3 + !!i); ctx->num_hblocks[i] = width >> (3 + !!i);
} }
} else if (width != ctx->avctx->width || height != ctx->avctx->height) { } else if (width != ctx->avctx->width || height != ctx->avctx->height) {
avpriv_request_sample(avctx, "Resolution changing"); avpriv_request_sample(avctx, "Resolution changing");

@ -25,6 +25,7 @@
#include <string.h> #include <string.h>
#include "libavutil/common.h"
#include "libavutil/imgutils.h" #include "libavutil/imgutils.h"
#include "libavutil/opt.h" #include "libavutil/opt.h"
#include "libavutil/pixdesc.h" #include "libavutil/pixdesc.h"
@ -158,8 +159,8 @@ static void horizontal_frame_pack(AVFilterLink *outlink,
for (plane = 0; plane < s->pix_desc->nb_components; plane++) { for (plane = 0; plane < s->pix_desc->nb_components; plane++) {
if (plane == 1 || plane == 2) { if (plane == 1 || plane == 2) {
length = -(-(out->width / 2) >> s->pix_desc->log2_chroma_w); length = AV_CEIL_RSHIFT(out->width / 2, s->pix_desc->log2_chroma_w);
lines = -(-(out->height) >> s->pix_desc->log2_chroma_h); lines = AV_CEIL_RSHIFT(out->height, s->pix_desc->log2_chroma_h);
} }
for (i = 0; i < lines; i++) { for (i = 0; i < lines; i++) {
int j; int j;

@ -50,6 +50,14 @@
#define RSHIFT(a,b) ((a) > 0 ? ((a) + ((1<<(b))>>1))>>(b) : ((a) + ((1<<(b))>>1)-1)>>(b)) #define RSHIFT(a,b) ((a) > 0 ? ((a) + ((1<<(b))>>1))>>(b) : ((a) + ((1<<(b))>>1)-1)>>(b))
/* assume b>0 */ /* assume b>0 */
#define ROUNDED_DIV(a,b) (((a)>0 ? (a) + ((b)>>1) : (a) - ((b)>>1))/(b)) #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 FFABS(a) ((a) >= 0 ? (a) : (-(a)))
#define FFSIGN(a) ((a) > 0 ? 1 : -1) #define FFSIGN(a) ((a) > 0 ? 1 : -1)

@ -111,7 +111,7 @@ static int get_video_buffer(AVFrame *frame, int align)
for (i = 0; i < 4 && frame->linesize[i]; i++) { for (i = 0; i < 4 && frame->linesize[i]; i++) {
int h = frame->height; int h = frame->height;
if (i == 1 || i == 2) 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); frame->buf[i] = av_buffer_alloc(frame->linesize[i] * h);
if (!frame->buf[i]) if (!frame->buf[i])

@ -291,7 +291,7 @@ void av_image_copy(uint8_t *dst_data[4], int dst_linesizes[4],
int h = height; int h = height;
int bwidth = av_image_get_linesize(pix_fmt, width, i); int bwidth = av_image_get_linesize(pix_fmt, width, i);
if (i == 1 || i == 2) { 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], av_image_copy_plane(dst_data[i], dst_linesizes[i],
src_data[i], src_linesizes[i], src_data[i], src_linesizes[i],

@ -54,7 +54,7 @@
*/ */
#define LIBAVUTIL_VERSION_MAJOR 55 #define LIBAVUTIL_VERSION_MAJOR 55
#define LIBAVUTIL_VERSION_MINOR 4 #define LIBAVUTIL_VERSION_MINOR 5
#define LIBAVUTIL_VERSION_MICRO 0 #define LIBAVUTIL_VERSION_MICRO 0
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \

@ -856,7 +856,7 @@ static void yuyvtoyuv420_c(uint8_t *ydst, uint8_t *udst, uint8_t *vdst,
int lumStride, int chromStride, int srcStride) int lumStride, int chromStride, int srcStride)
{ {
int y; int y;
const int chromWidth = -((-width) >> 1); const int chromWidth = AV_CEIL_RSHIFT(width, 1);
for (y = 0; y < height; y++) { for (y = 0; y < height; y++) {
extract_even_c(src, ydst, width); extract_even_c(src, ydst, width);
@ -876,7 +876,7 @@ static void yuyvtoyuv422_c(uint8_t *ydst, uint8_t *udst, uint8_t *vdst,
int lumStride, int chromStride, int srcStride) int lumStride, int chromStride, int srcStride)
{ {
int y; int y;
const int chromWidth = -((-width) >> 1); const int chromWidth = AV_CEIL_RSHIFT(width, 1);
for (y = 0; y < height; y++) { for (y = 0; y < height; y++) {
extract_even_c(src, ydst, width); extract_even_c(src, ydst, width);
@ -894,7 +894,7 @@ static void uyvytoyuv420_c(uint8_t *ydst, uint8_t *udst, uint8_t *vdst,
int lumStride, int chromStride, int srcStride) int lumStride, int chromStride, int srcStride)
{ {
int y; int y;
const int chromWidth = -((-width) >> 1); const int chromWidth = AV_CEIL_RSHIFT(width, 1);
for (y = 0; y < height; y++) { for (y = 0; y < height; y++) {
extract_even_c(src + 1, ydst, width); extract_even_c(src + 1, ydst, width);
@ -914,7 +914,7 @@ static void uyvytoyuv422_c(uint8_t *ydst, uint8_t *udst, uint8_t *vdst,
int lumStride, int chromStride, int srcStride) int lumStride, int chromStride, int srcStride)
{ {
int y; int y;
const int chromWidth = -((-width) >> 1); const int chromWidth = AV_CEIL_RSHIFT(width, 1);
for (y = 0; y < height; y++) { for (y = 0; y < height; y++) {
extract_even_c(src + 1, ydst, width); extract_even_c(src + 1, ydst, width);

@ -384,8 +384,8 @@ static int swscale(SwsContext *c, const uint8_t *src[],
yuv2packed2_fn yuv2packed2 = c->yuv2packed2; yuv2packed2_fn yuv2packed2 = c->yuv2packed2;
yuv2packedX_fn yuv2packedX = c->yuv2packedX; yuv2packedX_fn yuv2packedX = c->yuv2packedX;
yuv2anyX_fn yuv2anyX = c->yuv2anyX; yuv2anyX_fn yuv2anyX = c->yuv2anyX;
const int chrSrcSliceY = srcSliceY >> c->chrSrcVSubSample; const int chrSrcSliceY = srcSliceY >> c->chrSrcVSubSample;
const int chrSrcSliceH = -((-srcSliceH) >> c->chrSrcVSubSample); const int chrSrcSliceH = AV_CEIL_RSHIFT(srcSliceH, c->chrSrcVSubSample);
int should_dither = is9_OR_10BPS(c->srcFormat) || int should_dither = is9_OR_10BPS(c->srcFormat) ||
is16BPS(c->srcFormat); is16BPS(c->srcFormat);
int lastDstY; int lastDstY;
@ -484,7 +484,7 @@ static int swscale(SwsContext *c, const uint8_t *src[],
// Do we have enough lines in this slice to output the dstY line // Do we have enough lines in this slice to output the dstY line
enough_lines = lastLumSrcY2 < srcSliceY + srcSliceH && enough_lines = lastLumSrcY2 < srcSliceY + srcSliceH &&
lastChrSrcY < -((-srcSliceY - srcSliceH) >> c->chrSrcVSubSample); lastChrSrcY < AV_CEIL_RSHIFT(srcSliceY + srcSliceH, c->chrSrcVSubSample);
if (!enough_lines) { if (!enough_lines) {
lastLumSrcY = srcSliceY + srcSliceH - 1; lastLumSrcY = srcSliceY + srcSliceH - 1;

@ -798,9 +798,9 @@ static int planarCopyWrapper(SwsContext *c, const uint8_t *src[],
const AVPixFmtDescriptor *desc_dst = av_pix_fmt_desc_get(c->dstFormat); const AVPixFmtDescriptor *desc_dst = av_pix_fmt_desc_get(c->dstFormat);
int plane, i, j; int plane, i, j;
for (plane = 0; plane < 4; plane++) { for (plane = 0; plane < 4; plane++) {
int length = (plane == 0 || plane == 3) ? c->srcW : -((-c->srcW ) >> c->chrDstHSubSample); int length = (plane == 0 || plane == 3) ? c->srcW : AV_CEIL_RSHIFT(c->srcW, c->chrDstHSubSample);
int y = (plane == 0 || plane == 3) ? srcSliceY: -((-srcSliceY) >> c->chrDstVSubSample); int y = (plane == 0 || plane == 3) ? srcSliceY: AV_CEIL_RSHIFT(srcSliceY, c->chrDstVSubSample);
int height = (plane == 0 || plane == 3) ? srcSliceH: -((-srcSliceH) >> c->chrDstVSubSample); int height = (plane == 0 || plane == 3) ? srcSliceH: AV_CEIL_RSHIFT(srcSliceH, c->chrDstVSubSample);
const uint8_t *srcPtr = src[plane]; const uint8_t *srcPtr = src[plane];
uint8_t *dstPtr = dst[plane] + dstStride[plane] * y; uint8_t *dstPtr = dst[plane] + dstStride[plane] * y;
int shiftonly = plane == 1 || plane == 2 || (!c->srcRange && plane == 0); int shiftonly = plane == 1 || plane == 2 || (!c->srcRange && plane == 0);

@ -1019,11 +1019,11 @@ av_cold int sws_init_context(SwsContext *c, SwsFilter *srcFilter,
(flags & SWS_FAST_BILINEAR))) (flags & SWS_FAST_BILINEAR)))
c->chrSrcHSubSample = 1; c->chrSrcHSubSample = 1;
// Note the -((-x)>>y) is so that we always round toward +inf. // Note the AV_CEIL_RSHIFT is so that we always round toward +inf.
c->chrSrcW = -((-srcW) >> c->chrSrcHSubSample); c->chrSrcW = AV_CEIL_RSHIFT(srcW, c->chrSrcHSubSample);
c->chrSrcH = -((-srcH) >> c->chrSrcVSubSample); c->chrSrcH = AV_CEIL_RSHIFT(srcH, c->chrSrcVSubSample);
c->chrDstW = -((-dstW) >> c->chrDstHSubSample); c->chrDstW = AV_CEIL_RSHIFT(dstW, c->chrDstHSubSample);
c->chrDstH = -((-dstH) >> c->chrDstVSubSample); c->chrDstH = AV_CEIL_RSHIFT(dstH, c->chrDstVSubSample);
/* unscaled special cases */ /* unscaled special cases */
if (unscaled && !usesHFilter && !usesVFilter && if (unscaled && !usesHFilter && !usesVFilter &&

@ -2397,7 +2397,7 @@ static void RENAME(yuyvtoyuv420)(uint8_t *ydst, uint8_t *udst, uint8_t *vdst, co
int lumStride, int chromStride, int srcStride) int lumStride, int chromStride, int srcStride)
{ {
int y; int y;
const int chromWidth= -((-width)>>1); const int chromWidth = AV_CEIL_RSHIFT(width, 1);
for (y=0; y<height; y++) { for (y=0; y<height; y++) {
RENAME(extract_even)(src, ydst, width); RENAME(extract_even)(src, ydst, width);
@ -2423,7 +2423,7 @@ static void RENAME(yuyvtoyuv422)(uint8_t *ydst, uint8_t *udst, uint8_t *vdst, co
int lumStride, int chromStride, int srcStride) int lumStride, int chromStride, int srcStride)
{ {
int y; int y;
const int chromWidth= -((-width)>>1); const int chromWidth = AV_CEIL_RSHIFT(width, 1);
for (y=0; y<height; y++) { for (y=0; y<height; y++) {
RENAME(extract_even)(src, ydst, width); RENAME(extract_even)(src, ydst, width);
@ -2447,7 +2447,7 @@ static void RENAME(uyvytoyuv420)(uint8_t *ydst, uint8_t *udst, uint8_t *vdst, co
int lumStride, int chromStride, int srcStride) int lumStride, int chromStride, int srcStride)
{ {
int y; int y;
const int chromWidth= -((-width)>>1); const int chromWidth = AV_CEIL_RSHIFT(width, 1);
for (y=0; y<height; y++) { for (y=0; y<height; y++) {
RENAME(extract_even)(src+1, ydst, width); RENAME(extract_even)(src+1, ydst, width);
@ -2473,7 +2473,7 @@ static void RENAME(uyvytoyuv422)(uint8_t *ydst, uint8_t *udst, uint8_t *vdst, co
int lumStride, int chromStride, int srcStride) int lumStride, int chromStride, int srcStride)
{ {
int y; int y;
const int chromWidth= -((-width)>>1); const int chromWidth = AV_CEIL_RSHIFT(width, 1);
for (y=0; y<height; y++) { for (y=0; y<height; y++) {
RENAME(extract_even)(src+1, ydst, width); RENAME(extract_even)(src+1, ydst, width);

Loading…
Cancel
Save