Signed-off-by: Vittorio Giovara <vittorio.giovara@gmail.com>tags/n3.0
| @@ -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_height = -((-height) >> f->chroma_v_shift); | |||||
| const int chroma_width = AV_CEIL_RSHIFT(width, f->chroma_h_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_height = -((-height) >> f->chroma_v_shift); | |||||
| const int chroma_width = AV_CEIL_RSHIFT(width, f->chroma_h_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_hblocks[i] = width >> (3 + !!i); | |||||
| ctx->num_vblocks[i] = AV_CEIL_RSHIFT(height, 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); | |||||
| lines = -(-(out->height) >> s->pix_desc->log2_chroma_h); | |||||
| length = AV_CEIL_RSHIFT(out->width / 2, s->pix_desc->log2_chroma_w); | |||||
| 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 chrSrcSliceH = -((-srcSliceH) >> c->chrSrcVSubSample); | |||||
| const int chrSrcSliceY = srcSliceY >> 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 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 : AV_CEIL_RSHIFT(c->srcW, c->chrDstHSubSample); | |||||
| int y = (plane == 0 || plane == 3) ? srcSliceY: AV_CEIL_RSHIFT(srcSliceY, 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. | |||||
| c->chrSrcW = -((-srcW) >> c->chrSrcHSubSample); | |||||
| c->chrSrcH = -((-srcH) >> c->chrSrcVSubSample); | |||||
| c->chrDstW = -((-dstW) >> c->chrDstHSubSample); | |||||
| c->chrDstH = -((-dstH) >> c->chrDstVSubSample); | |||||
| // Note the AV_CEIL_RSHIFT is so that we always round toward +inf. | |||||
| c->chrSrcW = AV_CEIL_RSHIFT(srcW, c->chrSrcHSubSample); | |||||
| c->chrSrcH = AV_CEIL_RSHIFT(srcH, c->chrSrcVSubSample); | |||||
| c->chrDstW = AV_CEIL_RSHIFT(dstW, c->chrDstHSubSample); | |||||
| 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); | ||||