diff --git a/libavcodec/ffv1dec.c b/libavcodec/ffv1dec.c index adc47be8ce..d73c2e04e6 100644 --- a/libavcodec/ffv1dec.c +++ b/libavcodec/ffv1dec.c @@ -357,8 +357,8 @@ static int decode_slice(AVCodecContext *c, void *arg) av_assert1(width && height); if (f->colorspace == 0) { - const int chroma_width = -((-width) >> f->chroma_h_shift); - const int chroma_height = -((-height) >> f->chroma_v_shift); + const int chroma_width = FF_CEIL_RSHIFT(width, f->chroma_h_shift); + const int chroma_height = FF_CEIL_RSHIFT(height, f->chroma_v_shift); const int cx = x >> f->chroma_h_shift; const int cy = y >> f->chroma_v_shift; decode_plane(fs, p->data[0] + ps*x + y*p->linesize[0], width, height, p->linesize[0], 0); diff --git a/libavcodec/ffv1enc.c b/libavcodec/ffv1enc.c index 41848ec5da..828ed9b6e0 100644 --- a/libavcodec/ffv1enc.c +++ b/libavcodec/ffv1enc.c @@ -973,8 +973,8 @@ static int encode_slice(AVCodecContext *c, void *arg) } if (f->colorspace == 0) { - const int chroma_width = -((-width) >> f->chroma_h_shift); - const int chroma_height = -((-height) >> f->chroma_v_shift); + const int chroma_width = FF_CEIL_RSHIFT(width, f->chroma_h_shift); + const int chroma_height = FF_CEIL_RSHIFT(height, f->chroma_v_shift); const int cx = x >> f->chroma_h_shift; const int cy = y >> f->chroma_v_shift; diff --git a/libavcodec/mimic.c b/libavcodec/mimic.c index 85c6a1a96b..8985f6b470 100644 --- a/libavcodec/mimic.c +++ b/libavcodec/mimic.c @@ -388,8 +388,8 @@ static int mimic_decode_frame(AVCodecContext *avctx, void *data, avctx->height = height; avctx->pix_fmt = AV_PIX_FMT_YUV420P; for (i = 0; i < 3; i++) { - ctx->num_vblocks[i] = -((-height) >> (3 + !!i)); - ctx->num_hblocks[i] = width >> (3 + !!i); + ctx->num_vblocks[i] = FF_CEIL_RSHIFT(height, 3 + !!i); + ctx->num_hblocks[i] = width >> (3 + !!i); } } else if (width != ctx->avctx->width || height != ctx->avctx->height) { avpriv_request_sample(avctx, "Resolution changing"); diff --git a/libavcodec/mjpegdec.c b/libavcodec/mjpegdec.c index b439547836..5619c36fab 100644 --- a/libavcodec/mjpegdec.c +++ b/libavcodec/mjpegdec.c @@ -1847,8 +1847,8 @@ the_end: int w = s->width; int h = s->height; if(index && index<3){ - w = -((-w) >> hshift); - h = -((-h) >> vshift); + w = FF_CEIL_RSHIFT(w, hshift); + h = FF_CEIL_RSHIFT(h, vshift); } if(dst){ uint8_t *dst2 = dst + s->linesize[index]*(h-1); diff --git a/libavcodec/snow.c b/libavcodec/snow.c index e2ecdf053f..99cd5fbc1d 100644 --- a/libavcodec/snow.c +++ b/libavcodec/snow.c @@ -81,8 +81,8 @@ void ff_snow_reset_contexts(SnowContext *s){ //FIXME better initial contexts } int ff_snow_alloc_blocks(SnowContext *s){ - int w= -((-s->avctx->width )>>LOG2_MB_SIZE); - int h= -((-s->avctx->height)>>LOG2_MB_SIZE); + int w= FF_CEIL_RSHIFT(s->avctx->width, LOG2_MB_SIZE); + int h= FF_CEIL_RSHIFT(s->avctx->height, LOG2_MB_SIZE); s->b_width = w; s->b_height= h; diff --git a/libavcodec/utils.c b/libavcodec/utils.c index 5899eb831a..0d8306b54c 100644 --- a/libavcodec/utils.c +++ b/libavcodec/utils.c @@ -179,8 +179,8 @@ void avcodec_set_dimensions(AVCodecContext *s, int width, int height) { s->coded_width = width; s->coded_height = height; - s->width = -((-width ) >> s->lowres); - s->height = -((-height) >> s->lowres); + s->width = FF_CEIL_RSHIFT(width, s->lowres); + s->height = FF_CEIL_RSHIFT(height, s->lowres); } #if (ARCH_ARM && HAVE_NEON) || ARCH_PPC || HAVE_MMX @@ -573,8 +573,9 @@ void avpriv_color_frame(AVFrame *frame, const int c[4]) for (p = 0; pnb_components; p++) { uint8_t *dst = frame->data[p]; int is_chroma = p == 1 || p == 2; - int bytes = -((-frame->width) >> (is_chroma ? desc->log2_chroma_w : 0)); - for (y = 0; y<-((-frame->height) >> (is_chroma ? desc->log2_chroma_h : 0)); y++){ + int bytes = is_chroma ? FF_CEIL_RSHIFT(frame->width, desc->log2_chroma_w) : frame->width; + int height = is_chroma ? FF_CEIL_RSHIFT(frame->height, desc->log2_chroma_h) : frame->height; + for (y = 0; y < height; y++) { if (desc->comp[0].depth_minus1 >= 8) { for (x = 0; xcodec->type) { case AVMEDIA_TYPE_VIDEO: - frame->width = FFMAX(avctx->width , -((-avctx->coded_width )>>avctx->lowres)); - frame->height = FFMAX(avctx->height, -((-avctx->coded_height)>>avctx->lowres)); + frame->width = FFMAX(avctx->width, FF_CEIL_RSHIFT(avctx->coded_width, avctx->lowres)); + frame->height = FFMAX(avctx->height, FF_CEIL_RSHIFT(avctx->coded_height, avctx->lowres)); if (frame->format < 0) frame->format = avctx->pix_fmt; if (!frame->sample_aspect_ratio.num) diff --git a/libavfilter/deshake_opencl.c b/libavfilter/deshake_opencl.c index adca5ea2cb..eea873ea4a 100644 --- a/libavfilter/deshake_opencl.c +++ b/libavfilter/deshake_opencl.c @@ -135,7 +135,8 @@ int ff_opencl_deshake_process_inout_buf(AVFilterContext *ctx, AVFrame *in, AVFra int ret = 0; AVFilterLink *link = ctx->inputs[0]; DeshakeContext *deshake = ctx->priv; - int chroma_height = -((-link->h) >> av_pix_fmt_desc_get(link->format)->log2_chroma_h); + const int hshift = av_pix_fmt_desc_get(link->format)->log2_chroma_h; + int chroma_height = FF_CEIL_RSHIFT(link->h, hshift); if ((!deshake->opencl_ctx.cl_inbuf) || (!deshake->opencl_ctx.cl_outbuf)) { deshake->opencl_ctx.in_plane_size[0] = (in->linesize[0] * in->height); diff --git a/libavfilter/vf_gradfun.c b/libavfilter/vf_gradfun.c index 48ac378e6a..52c67ffedc 100644 --- a/libavfilter/vf_gradfun.c +++ b/libavfilter/vf_gradfun.c @@ -172,8 +172,8 @@ static int config_input(AVFilterLink *inlink) if (!gf->buf) return AVERROR(ENOMEM); - gf->chroma_w = -((-inlink->w) >> hsub); - gf->chroma_h = -((-inlink->h) >> vsub); + gf->chroma_w = FF_CEIL_RSHIFT(inlink->w, hsub); + gf->chroma_h = FF_CEIL_RSHIFT(inlink->h, vsub); gf->chroma_r = av_clip(((((gf->radius >> hsub) + (gf->radius >> vsub)) / 2 ) + 1) & ~1, 4, 32); return 0; diff --git a/libavfilter/vf_tinterlace.c b/libavfilter/vf_tinterlace.c index 598e3147b9..f6bf054a0f 100644 --- a/libavfilter/vf_tinterlace.c +++ b/libavfilter/vf_tinterlace.c @@ -175,7 +175,7 @@ void copy_picture_field(uint8_t *dst[4], int dst_linesize[4], int h, i; for (plane = 0; plane < desc->nb_components; plane++) { - int lines = plane == 1 || plane == 2 ? -((-src_h) >> vsub) : src_h; + int lines = plane == 1 || plane == 2 ? FF_CEIL_RSHIFT(src_h, vsub) : src_h; int linesize = av_image_get_linesize(format, w, plane); uint8_t *dstp = dst[plane]; const uint8_t *srcp = src[plane]; diff --git a/libavutil/common.h b/libavutil/common.h index 13f2ffbd11..9091070a01 100644 --- a/libavutil/common.h +++ b/libavutil/common.h @@ -48,6 +48,8 @@ #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)) +/* assume a>0 and b>0 */ +#define FF_CEIL_RSHIFT(a,b) (-((-(a)) >> (b))) #define FFUDIV(a,b) (((a)>0 ?(a):(a)-(b)+1) / (b)) #define FFUMOD(a,b) ((a)-(b)*FFUDIV(a,b)) #define FFABS(a) ((a) >= 0 ? (a) : (-(a))) diff --git a/libavutil/frame.c b/libavutil/frame.c index ca6814ce27..d50e9b2569 100644 --- a/libavutil/frame.c +++ b/libavutil/frame.c @@ -138,7 +138,7 @@ static int get_video_buffer(AVFrame *frame, int align) for (i = 0; i < 4 && frame->linesize[i]; i++) { int h = FFALIGN(frame->height, 32); if (i == 1 || i == 2) - h = -((-h) >> desc->log2_chroma_h); + h = FF_CEIL_RSHIFT(h, desc->log2_chroma_h); frame->buf[i] = av_buffer_alloc(frame->linesize[i] * h + 16); if (!frame->buf[i]) diff --git a/libavutil/imgutils.c b/libavutil/imgutils.c index 3060b0705f..45d8ebe7df 100644 --- a/libavutil/imgutils.c +++ b/libavutil/imgutils.c @@ -284,7 +284,7 @@ void av_image_copy(uint8_t *dst_data[4], int dst_linesizes[4], return; } if (i == 1 || i == 2) { - h= -((-height)>>desc->log2_chroma_h); + h = FF_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/libswscale/rgb2rgb_template.c b/libswscale/rgb2rgb_template.c index 545c59add8..98e3a1472e 100644 --- a/libswscale/rgb2rgb_template.c +++ b/libswscale/rgb2rgb_template.c @@ -823,7 +823,7 @@ static void yuyvtoyuv420_c(uint8_t *ydst, uint8_t *udst, uint8_t *vdst, int lumStride, int chromStride, int srcStride) { int y; - const int chromWidth = -((-width) >> 1); + const int chromWidth = FF_CEIL_RSHIFT(width, 1); for (y = 0; y < height; y++) { extract_even_c(src, ydst, width); @@ -843,7 +843,7 @@ static void yuyvtoyuv422_c(uint8_t *ydst, uint8_t *udst, uint8_t *vdst, int lumStride, int chromStride, int srcStride) { int y; - const int chromWidth = -((-width) >> 1); + const int chromWidth = FF_CEIL_RSHIFT(width, 1); for (y = 0; y < height; y++) { extract_even_c(src, ydst, width); @@ -861,7 +861,7 @@ static void uyvytoyuv420_c(uint8_t *ydst, uint8_t *udst, uint8_t *vdst, int lumStride, int chromStride, int srcStride) { int y; - const int chromWidth = -((-width) >> 1); + const int chromWidth = FF_CEIL_RSHIFT(width, 1); for (y = 0; y < height; y++) { extract_even_c(src + 1, ydst, width); @@ -881,7 +881,7 @@ static void uyvytoyuv422_c(uint8_t *ydst, uint8_t *udst, uint8_t *vdst, int lumStride, int chromStride, int srcStride) { int y; - const int chromWidth = -((-width) >> 1); + const int chromWidth = FF_CEIL_RSHIFT(width, 1); for (y = 0; y < height; y++) { extract_even_c(src + 1, ydst, width); diff --git a/libswscale/swscale.c b/libswscale/swscale.c index 827837eec7..5cab133378 100644 --- a/libswscale/swscale.c +++ b/libswscale/swscale.c @@ -373,8 +373,8 @@ static int swScale(SwsContext *c, const uint8_t *src[], yuv2packed2_fn yuv2packed2 = c->yuv2packed2; yuv2packedX_fn yuv2packedX = c->yuv2packedX; yuv2anyX_fn yuv2anyX = c->yuv2anyX; - const int chrSrcSliceY = srcSliceY >> c->chrSrcVSubSample; - const int chrSrcSliceH = -((-srcSliceH) >> c->chrSrcVSubSample); + const int chrSrcSliceY = srcSliceY >> c->chrSrcVSubSample; + const int chrSrcSliceH = FF_CEIL_RSHIFT(srcSliceH, c->chrSrcVSubSample); int should_dither = is9_OR_10BPS(c->srcFormat) || is16BPS(c->srcFormat); int lastDstY; @@ -491,7 +491,7 @@ static int swScale(SwsContext *c, const uint8_t *src[], // Do we have enough lines in this slice to output the dstY line enough_lines = lastLumSrcY2 < srcSliceY + srcSliceH && - lastChrSrcY < -((-srcSliceY - srcSliceH) >> c->chrSrcVSubSample); + lastChrSrcY < FF_CEIL_RSHIFT(srcSliceY + srcSliceH, c->chrSrcVSubSample); if (!enough_lines) { lastLumSrcY = srcSliceY + srcSliceH - 1; diff --git a/libswscale/swscale_unscaled.c b/libswscale/swscale_unscaled.c index d42bb08810..8889183893 100644 --- a/libswscale/swscale_unscaled.c +++ b/libswscale/swscale_unscaled.c @@ -852,9 +852,9 @@ static int planarCopyWrapper(SwsContext *c, const uint8_t *src[], const AVPixFmtDescriptor *desc_dst = av_pix_fmt_desc_get(c->dstFormat); int plane, i, j; for (plane = 0; plane < 4; plane++) { - int length = (plane == 0 || plane == 3) ? c->srcW : -((-c->srcW ) >> c->chrDstHSubSample); - int y = (plane == 0 || plane == 3) ? srcSliceY: -((-srcSliceY) >> c->chrDstVSubSample); - int height = (plane == 0 || plane == 3) ? srcSliceH: -((-srcSliceH) >> c->chrDstVSubSample); + int length = (plane == 0 || plane == 3) ? c->srcW : FF_CEIL_RSHIFT(c->srcW, c->chrDstHSubSample); + int y = (plane == 0 || plane == 3) ? srcSliceY: FF_CEIL_RSHIFT(srcSliceY, c->chrDstVSubSample); + int height = (plane == 0 || plane == 3) ? srcSliceH: FF_CEIL_RSHIFT(srcSliceH, c->chrDstVSubSample); const uint8_t *srcPtr = src[plane]; uint8_t *dstPtr = dst[plane] + dstStride[plane] * y; int shiftonly= plane==1 || plane==2 || (!c->srcRange && plane==0); diff --git a/libswscale/utils.c b/libswscale/utils.c index 5f4dabfad7..b372e9698c 100644 --- a/libswscale/utils.c +++ b/libswscale/utils.c @@ -1228,11 +1228,11 @@ av_cold int sws_init_context(SwsContext *c, SwsFilter *srcFilter, (flags & SWS_FAST_BILINEAR))) c->chrSrcHSubSample = 1; - // Note the -((-x)>>y) is so that we always round toward +inf. - c->chrSrcW = -((-srcW) >> c->chrSrcHSubSample); - c->chrSrcH = -((-srcH) >> c->chrSrcVSubSample); - c->chrDstW = -((-dstW) >> c->chrDstHSubSample); - c->chrDstH = -((-dstH) >> c->chrDstVSubSample); + // Note the FF_CEIL_RSHIFT is so that we always round toward +inf. + c->chrSrcW = FF_CEIL_RSHIFT(srcW, c->chrSrcHSubSample); + c->chrSrcH = FF_CEIL_RSHIFT(srcH, c->chrSrcVSubSample); + c->chrDstW = FF_CEIL_RSHIFT(dstW, c->chrDstHSubSample); + c->chrDstH = FF_CEIL_RSHIFT(dstH, c->chrDstVSubSample); FF_ALLOC_OR_GOTO(c, c->formatConvBuffer, FFALIGN(srcW*2+78, 16) * 2, fail); diff --git a/libswscale/x86/rgb2rgb_template.c b/libswscale/x86/rgb2rgb_template.c index 26f0ddc0b5..d684b70d4c 100644 --- a/libswscale/x86/rgb2rgb_template.c +++ b/libswscale/x86/rgb2rgb_template.c @@ -2354,7 +2354,7 @@ static void RENAME(yuyvtoyuv420)(uint8_t *ydst, uint8_t *udst, uint8_t *vdst, co int lumStride, int chromStride, int srcStride) { int y; - const int chromWidth= -((-width)>>1); + const int chromWidth = FF_CEIL_RSHIFT(width, 1); for (y=0; y>1); + const int chromWidth = FF_CEIL_RSHIFT(width, 1); for (y=0; y>1); + const int chromWidth = FF_CEIL_RSHIFT(width, 1); for (y=0; y>1); + const int chromWidth = FF_CEIL_RSHIFT(width, 1); for (y=0; y