Multiply width by height using the int64_t type Also perform some other multiplications using the int64_t type. Avoid integer overflows when width and height are large (e.g., 1 << 15 or 1 << 16). Bug: aomedia:3508 Change-Id: Iaaae975637988e0d17e0d67c6bbfcd5adbbe1c76
diff --git a/av1/encoder/av1_noise_estimate.c b/av1/encoder/av1_noise_estimate.c index d66a63e..25007bb 100644 --- a/av1/encoder/av1_noise_estimate.c +++ b/av1/encoder/av1_noise_estimate.c
@@ -34,18 +34,19 @@ #endif void av1_noise_estimate_init(NOISE_ESTIMATE *const ne, int width, int height) { + const int64_t area = (int64_t)width * height; ne->enabled = 0; - ne->level = (width * height < 1280 * 720) ? kLowLow : kLow; + ne->level = (area < 1280 * 720) ? kLowLow : kLow; ne->value = 0; ne->count = 0; ne->thresh = 90; ne->last_w = 0; ne->last_h = 0; - if (width * height >= 1920 * 1080) { + if (area >= 1920 * 1080) { ne->thresh = 200; - } else if (width * height >= 1280 * 720) { + } else if (area >= 1280 * 720) { ne->thresh = 140; - } else if (width * height >= 640 * 360) { + } else if (area >= 640 * 360) { ne->thresh = 115; } ne->num_frames_estimate = 15;
diff --git a/av1/encoder/encoder.c b/av1/encoder/encoder.c index fed15eb..3c00553 100644 --- a/av1/encoder/encoder.c +++ b/av1/encoder/encoder.c
@@ -236,16 +236,16 @@ size_t encoded_frame_size) { const int upscaled_width = cm->superres_upscaled_width; const int height = cm->height; - const int luma_pic_size = upscaled_width * height; + const int64_t luma_pic_size = (int64_t)upscaled_width * height; const SequenceHeader *const seq_params = cm->seq_params; const BITSTREAM_PROFILE profile = seq_params->profile; const int pic_size_profile_factor = profile == PROFILE_0 ? 15 : (profile == PROFILE_1 ? 30 : 36); encoded_frame_size = (encoded_frame_size > 129 ? encoded_frame_size - 128 : 1); - const size_t uncompressed_frame_size = + const int64_t uncompressed_frame_size = (luma_pic_size * pic_size_profile_factor) >> 3; - return uncompressed_frame_size / (double)encoded_frame_size; + return (double)uncompressed_frame_size / encoded_frame_size; } static void auto_tile_size_balancing(AV1_COMMON *const cm, int num_sbs, @@ -1956,6 +1956,7 @@ const int stride = cpi->unfiltered_source->y_stride; const int width = cpi->unfiltered_source->y_width; const int height = cpi->unfiltered_source->y_height; + const int64_t area = (int64_t)width * height; const int bd = cm->seq_params->bit_depth; const int blk_w = 16; const int blk_h = 16; @@ -1963,10 +1964,10 @@ const int color_thresh = 4; const unsigned int var_thresh = 0; // Counts of blocks with no more than color_thresh colors. - int counts_1 = 0; + int64_t counts_1 = 0; // Counts of blocks with no more than color_thresh colors and variance larger // than var_thresh. - int counts_2 = 0; + int64_t counts_2 = 0; for (int r = 0; r + blk_h <= height; r += blk_h) { for (int c = 0; c + blk_w <= width; c += blk_w) { @@ -1991,17 +1992,15 @@ } // The threshold values are selected experimentally. - features->allow_screen_content_tools = - counts_1 * blk_h * blk_w * 10 > width * height; + features->allow_screen_content_tools = counts_1 * blk_h * blk_w * 10 > area; // IntraBC would force loop filters off, so we use more strict rules that also // requires that the block has high variance. features->allow_intrabc = features->allow_screen_content_tools && - counts_2 * blk_h * blk_w * 12 > width * height; + counts_2 * blk_h * blk_w * 12 > area; cpi->use_screen_content_tools = features->allow_screen_content_tools; cpi->is_screen_content_type = - features->allow_intrabc || - (counts_1 * blk_h * blk_w * 10 > width * height * 4 && - counts_2 * blk_h * blk_w * 30 > width * height); + features->allow_intrabc || (counts_1 * blk_h * blk_w * 10 > area * 4 && + counts_2 * blk_h * blk_w * 30 > area); } static void init_motion_estimation(AV1_COMP *cpi) {
diff --git a/av1/encoder/ratectrl.c b/av1/encoder/ratectrl.c index f1837bc..de0f596 100644 --- a/av1/encoder/ratectrl.c +++ b/av1/encoder/ratectrl.c
@@ -334,7 +334,7 @@ double framerate) { // Assume we do not need any constraint lower than 4K 20 fps static const double factor_safe = 3840 * 2160 * 20.0; - const double factor = width * height * framerate; + const double factor = (double)width * height * framerate; const int default_interval = clamp((int)(framerate * 0.125), MIN_GF_INTERVAL, MAX_GF_INTERVAL);