11b362b15af34006e6a11974088a46d42b903418eJohann/* 21b362b15af34006e6a11974088a46d42b903418eJohann * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 31b362b15af34006e6a11974088a46d42b903418eJohann * 41b362b15af34006e6a11974088a46d42b903418eJohann * Use of this source code is governed by a BSD-style license 51b362b15af34006e6a11974088a46d42b903418eJohann * that can be found in the LICENSE file in the root of the source 61b362b15af34006e6a11974088a46d42b903418eJohann * tree. An additional intellectual property rights grant can be found 71b362b15af34006e6a11974088a46d42b903418eJohann * in the file PATENTS. All contributing project authors may 81b362b15af34006e6a11974088a46d42b903418eJohann * be found in the AUTHORS file in the root of the source tree. 91b362b15af34006e6a11974088a46d42b903418eJohann */ 101b362b15af34006e6a11974088a46d42b903418eJohann 111b362b15af34006e6a11974088a46d42b903418eJohann 121b362b15af34006e6a11974088a46d42b903418eJohann#include <limits.h> 131b362b15af34006e6a11974088a46d42b903418eJohann#include "vpx_config.h" 141b362b15af34006e6a11974088a46d42b903418eJohann#include "onyx_int.h" 151b362b15af34006e6a11974088a46d42b903418eJohann#include "mr_dissim.h" 161b362b15af34006e6a11974088a46d42b903418eJohann#include "vpx_mem/vpx_mem.h" 171b362b15af34006e6a11974088a46d42b903418eJohann#include "rdopt.h" 181b362b15af34006e6a11974088a46d42b903418eJohann 191b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_cal_low_res_mb_cols(VP8_COMP *cpi) 201b362b15af34006e6a11974088a46d42b903418eJohann{ 211b362b15af34006e6a11974088a46d42b903418eJohann int low_res_w; 221b362b15af34006e6a11974088a46d42b903418eJohann 231b362b15af34006e6a11974088a46d42b903418eJohann /* Support arbitrary down-sampling factor */ 241b362b15af34006e6a11974088a46d42b903418eJohann unsigned int iw = cpi->oxcf.Width*cpi->oxcf.mr_down_sampling_factor.den 251b362b15af34006e6a11974088a46d42b903418eJohann + cpi->oxcf.mr_down_sampling_factor.num - 1; 261b362b15af34006e6a11974088a46d42b903418eJohann 271b362b15af34006e6a11974088a46d42b903418eJohann low_res_w = iw/cpi->oxcf.mr_down_sampling_factor.num; 281b362b15af34006e6a11974088a46d42b903418eJohann cpi->mr_low_res_mb_cols = ((low_res_w + 15) >> 4); 291b362b15af34006e6a11974088a46d42b903418eJohann} 301b362b15af34006e6a11974088a46d42b903418eJohann 311b362b15af34006e6a11974088a46d42b903418eJohann#define GET_MV(x) \ 321b362b15af34006e6a11974088a46d42b903418eJohannif(x->mbmi.ref_frame !=INTRA_FRAME) \ 331b362b15af34006e6a11974088a46d42b903418eJohann{ \ 341b362b15af34006e6a11974088a46d42b903418eJohann mvx[cnt] = x->mbmi.mv.as_mv.row; \ 351b362b15af34006e6a11974088a46d42b903418eJohann mvy[cnt] = x->mbmi.mv.as_mv.col; \ 361b362b15af34006e6a11974088a46d42b903418eJohann cnt++; \ 371b362b15af34006e6a11974088a46d42b903418eJohann} 381b362b15af34006e6a11974088a46d42b903418eJohann 391b362b15af34006e6a11974088a46d42b903418eJohann#define GET_MV_SIGN(x) \ 401b362b15af34006e6a11974088a46d42b903418eJohannif(x->mbmi.ref_frame !=INTRA_FRAME) \ 411b362b15af34006e6a11974088a46d42b903418eJohann{ \ 421b362b15af34006e6a11974088a46d42b903418eJohann mvx[cnt] = x->mbmi.mv.as_mv.row; \ 431b362b15af34006e6a11974088a46d42b903418eJohann mvy[cnt] = x->mbmi.mv.as_mv.col; \ 441b362b15af34006e6a11974088a46d42b903418eJohann if (cm->ref_frame_sign_bias[x->mbmi.ref_frame] \ 451b362b15af34006e6a11974088a46d42b903418eJohann != cm->ref_frame_sign_bias[tmp->mbmi.ref_frame]) \ 461b362b15af34006e6a11974088a46d42b903418eJohann { \ 471b362b15af34006e6a11974088a46d42b903418eJohann mvx[cnt] *= -1; \ 481b362b15af34006e6a11974088a46d42b903418eJohann mvy[cnt] *= -1; \ 491b362b15af34006e6a11974088a46d42b903418eJohann } \ 501b362b15af34006e6a11974088a46d42b903418eJohann cnt++; \ 511b362b15af34006e6a11974088a46d42b903418eJohann} 521b362b15af34006e6a11974088a46d42b903418eJohann 531b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_cal_dissimilarity(VP8_COMP *cpi) 541b362b15af34006e6a11974088a46d42b903418eJohann{ 551b362b15af34006e6a11974088a46d42b903418eJohann VP8_COMMON *cm = &cpi->common; 561b362b15af34006e6a11974088a46d42b903418eJohann int i; 571b362b15af34006e6a11974088a46d42b903418eJohann 581b362b15af34006e6a11974088a46d42b903418eJohann /* Note: The first row & first column in mip are outside the frame, which 591b362b15af34006e6a11974088a46d42b903418eJohann * were initialized to all 0.(ref_frame, mode, mv...) 601b362b15af34006e6a11974088a46d42b903418eJohann * Their ref_frame = 0 means they won't be counted in the following 611b362b15af34006e6a11974088a46d42b903418eJohann * calculation. 621b362b15af34006e6a11974088a46d42b903418eJohann */ 631b362b15af34006e6a11974088a46d42b903418eJohann if (cpi->oxcf.mr_total_resolutions >1 641b362b15af34006e6a11974088a46d42b903418eJohann && cpi->oxcf.mr_encoder_id < (cpi->oxcf.mr_total_resolutions - 1)) 651b362b15af34006e6a11974088a46d42b903418eJohann { 661b362b15af34006e6a11974088a46d42b903418eJohann /* Store info for show/no-show frames for supporting alt_ref. 671b362b15af34006e6a11974088a46d42b903418eJohann * If parent frame is alt_ref, child has one too. 681b362b15af34006e6a11974088a46d42b903418eJohann */ 691b362b15af34006e6a11974088a46d42b903418eJohann LOWER_RES_FRAME_INFO* store_info 701b362b15af34006e6a11974088a46d42b903418eJohann = (LOWER_RES_FRAME_INFO*)cpi->oxcf.mr_low_res_mode_info; 711b362b15af34006e6a11974088a46d42b903418eJohann 721b362b15af34006e6a11974088a46d42b903418eJohann store_info->frame_type = cm->frame_type; 731b362b15af34006e6a11974088a46d42b903418eJohann 741b362b15af34006e6a11974088a46d42b903418eJohann if(cm->frame_type != KEY_FRAME) 751b362b15af34006e6a11974088a46d42b903418eJohann { 761b362b15af34006e6a11974088a46d42b903418eJohann store_info->is_frame_dropped = 0; 771b362b15af34006e6a11974088a46d42b903418eJohann for (i = 1; i < MAX_REF_FRAMES; i++) 781b362b15af34006e6a11974088a46d42b903418eJohann store_info->low_res_ref_frames[i] = cpi->current_ref_frames[i]; 791b362b15af34006e6a11974088a46d42b903418eJohann } 801b362b15af34006e6a11974088a46d42b903418eJohann 811b362b15af34006e6a11974088a46d42b903418eJohann if(cm->frame_type != KEY_FRAME) 821b362b15af34006e6a11974088a46d42b903418eJohann { 831b362b15af34006e6a11974088a46d42b903418eJohann int mb_row; 841b362b15af34006e6a11974088a46d42b903418eJohann int mb_col; 851b362b15af34006e6a11974088a46d42b903418eJohann /* Point to beginning of allocated MODE_INFO arrays. */ 861b362b15af34006e6a11974088a46d42b903418eJohann MODE_INFO *tmp = cm->mip + cm->mode_info_stride; 871b362b15af34006e6a11974088a46d42b903418eJohann LOWER_RES_MB_INFO* store_mode_info = store_info->mb_info; 881b362b15af34006e6a11974088a46d42b903418eJohann 891b362b15af34006e6a11974088a46d42b903418eJohann for (mb_row = 0; mb_row < cm->mb_rows; mb_row ++) 901b362b15af34006e6a11974088a46d42b903418eJohann { 911b362b15af34006e6a11974088a46d42b903418eJohann tmp++; 921b362b15af34006e6a11974088a46d42b903418eJohann for (mb_col = 0; mb_col < cm->mb_cols; mb_col ++) 931b362b15af34006e6a11974088a46d42b903418eJohann { 941b362b15af34006e6a11974088a46d42b903418eJohann int dissim = INT_MAX; 951b362b15af34006e6a11974088a46d42b903418eJohann 961b362b15af34006e6a11974088a46d42b903418eJohann if(tmp->mbmi.ref_frame !=INTRA_FRAME) 971b362b15af34006e6a11974088a46d42b903418eJohann { 981b362b15af34006e6a11974088a46d42b903418eJohann int mvx[8]; 991b362b15af34006e6a11974088a46d42b903418eJohann int mvy[8]; 1001b362b15af34006e6a11974088a46d42b903418eJohann int mmvx; 1011b362b15af34006e6a11974088a46d42b903418eJohann int mmvy; 1021b362b15af34006e6a11974088a46d42b903418eJohann int cnt=0; 1031b362b15af34006e6a11974088a46d42b903418eJohann const MODE_INFO *here = tmp; 1041b362b15af34006e6a11974088a46d42b903418eJohann const MODE_INFO *above = here - cm->mode_info_stride; 1051b362b15af34006e6a11974088a46d42b903418eJohann const MODE_INFO *left = here - 1; 1061b362b15af34006e6a11974088a46d42b903418eJohann const MODE_INFO *aboveleft = above - 1; 1071b362b15af34006e6a11974088a46d42b903418eJohann const MODE_INFO *aboveright = NULL; 1081b362b15af34006e6a11974088a46d42b903418eJohann const MODE_INFO *right = NULL; 1091b362b15af34006e6a11974088a46d42b903418eJohann const MODE_INFO *belowleft = NULL; 1101b362b15af34006e6a11974088a46d42b903418eJohann const MODE_INFO *below = NULL; 1111b362b15af34006e6a11974088a46d42b903418eJohann const MODE_INFO *belowright = NULL; 1121b362b15af34006e6a11974088a46d42b903418eJohann 1131b362b15af34006e6a11974088a46d42b903418eJohann /* If alternate reference frame is used, we have to 1141b362b15af34006e6a11974088a46d42b903418eJohann * check sign of MV. */ 1151b362b15af34006e6a11974088a46d42b903418eJohann if(cpi->oxcf.play_alternate) 1161b362b15af34006e6a11974088a46d42b903418eJohann { 1171b362b15af34006e6a11974088a46d42b903418eJohann /* Gather mv of neighboring MBs */ 1181b362b15af34006e6a11974088a46d42b903418eJohann GET_MV_SIGN(above) 1191b362b15af34006e6a11974088a46d42b903418eJohann GET_MV_SIGN(left) 1201b362b15af34006e6a11974088a46d42b903418eJohann GET_MV_SIGN(aboveleft) 1211b362b15af34006e6a11974088a46d42b903418eJohann 1221b362b15af34006e6a11974088a46d42b903418eJohann if(mb_col < (cm->mb_cols-1)) 1231b362b15af34006e6a11974088a46d42b903418eJohann { 1241b362b15af34006e6a11974088a46d42b903418eJohann right = here + 1; 1251b362b15af34006e6a11974088a46d42b903418eJohann aboveright = above + 1; 1261b362b15af34006e6a11974088a46d42b903418eJohann GET_MV_SIGN(right) 1271b362b15af34006e6a11974088a46d42b903418eJohann GET_MV_SIGN(aboveright) 1281b362b15af34006e6a11974088a46d42b903418eJohann } 1291b362b15af34006e6a11974088a46d42b903418eJohann 1301b362b15af34006e6a11974088a46d42b903418eJohann if(mb_row < (cm->mb_rows-1)) 1311b362b15af34006e6a11974088a46d42b903418eJohann { 1321b362b15af34006e6a11974088a46d42b903418eJohann below = here + cm->mode_info_stride; 1331b362b15af34006e6a11974088a46d42b903418eJohann belowleft = below - 1; 1341b362b15af34006e6a11974088a46d42b903418eJohann GET_MV_SIGN(below) 1351b362b15af34006e6a11974088a46d42b903418eJohann GET_MV_SIGN(belowleft) 1361b362b15af34006e6a11974088a46d42b903418eJohann } 1371b362b15af34006e6a11974088a46d42b903418eJohann 1381b362b15af34006e6a11974088a46d42b903418eJohann if(mb_col < (cm->mb_cols-1) 1391b362b15af34006e6a11974088a46d42b903418eJohann && mb_row < (cm->mb_rows-1)) 1401b362b15af34006e6a11974088a46d42b903418eJohann { 1411b362b15af34006e6a11974088a46d42b903418eJohann belowright = below + 1; 1421b362b15af34006e6a11974088a46d42b903418eJohann GET_MV_SIGN(belowright) 1431b362b15af34006e6a11974088a46d42b903418eJohann } 1441b362b15af34006e6a11974088a46d42b903418eJohann }else 1451b362b15af34006e6a11974088a46d42b903418eJohann { 1461b362b15af34006e6a11974088a46d42b903418eJohann /* No alt_ref and gather mv of neighboring MBs */ 1471b362b15af34006e6a11974088a46d42b903418eJohann GET_MV(above) 1481b362b15af34006e6a11974088a46d42b903418eJohann GET_MV(left) 1491b362b15af34006e6a11974088a46d42b903418eJohann GET_MV(aboveleft) 1501b362b15af34006e6a11974088a46d42b903418eJohann 1511b362b15af34006e6a11974088a46d42b903418eJohann if(mb_col < (cm->mb_cols-1)) 1521b362b15af34006e6a11974088a46d42b903418eJohann { 1531b362b15af34006e6a11974088a46d42b903418eJohann right = here + 1; 1541b362b15af34006e6a11974088a46d42b903418eJohann aboveright = above + 1; 1551b362b15af34006e6a11974088a46d42b903418eJohann GET_MV(right) 1561b362b15af34006e6a11974088a46d42b903418eJohann GET_MV(aboveright) 1571b362b15af34006e6a11974088a46d42b903418eJohann } 1581b362b15af34006e6a11974088a46d42b903418eJohann 1591b362b15af34006e6a11974088a46d42b903418eJohann if(mb_row < (cm->mb_rows-1)) 1601b362b15af34006e6a11974088a46d42b903418eJohann { 1611b362b15af34006e6a11974088a46d42b903418eJohann below = here + cm->mode_info_stride; 1621b362b15af34006e6a11974088a46d42b903418eJohann belowleft = below - 1; 1631b362b15af34006e6a11974088a46d42b903418eJohann GET_MV(below) 1641b362b15af34006e6a11974088a46d42b903418eJohann GET_MV(belowleft) 1651b362b15af34006e6a11974088a46d42b903418eJohann } 1661b362b15af34006e6a11974088a46d42b903418eJohann 1671b362b15af34006e6a11974088a46d42b903418eJohann if(mb_col < (cm->mb_cols-1) 1681b362b15af34006e6a11974088a46d42b903418eJohann && mb_row < (cm->mb_rows-1)) 1691b362b15af34006e6a11974088a46d42b903418eJohann { 1701b362b15af34006e6a11974088a46d42b903418eJohann belowright = below + 1; 1711b362b15af34006e6a11974088a46d42b903418eJohann GET_MV(belowright) 1721b362b15af34006e6a11974088a46d42b903418eJohann } 1731b362b15af34006e6a11974088a46d42b903418eJohann } 1741b362b15af34006e6a11974088a46d42b903418eJohann 1751b362b15af34006e6a11974088a46d42b903418eJohann if (cnt > 0) 1761b362b15af34006e6a11974088a46d42b903418eJohann { 1771b362b15af34006e6a11974088a46d42b903418eJohann int max_mvx = mvx[0]; 1781b362b15af34006e6a11974088a46d42b903418eJohann int min_mvx = mvx[0]; 1791b362b15af34006e6a11974088a46d42b903418eJohann int max_mvy = mvy[0]; 1801b362b15af34006e6a11974088a46d42b903418eJohann int min_mvy = mvy[0]; 1811b362b15af34006e6a11974088a46d42b903418eJohann int i; 1821b362b15af34006e6a11974088a46d42b903418eJohann 1831b362b15af34006e6a11974088a46d42b903418eJohann if (cnt > 1) 1841b362b15af34006e6a11974088a46d42b903418eJohann { 1851b362b15af34006e6a11974088a46d42b903418eJohann for (i=1; i< cnt; i++) 1861b362b15af34006e6a11974088a46d42b903418eJohann { 1871b362b15af34006e6a11974088a46d42b903418eJohann if (mvx[i] > max_mvx) max_mvx = mvx[i]; 1881b362b15af34006e6a11974088a46d42b903418eJohann else if (mvx[i] < min_mvx) min_mvx = mvx[i]; 1891b362b15af34006e6a11974088a46d42b903418eJohann if (mvy[i] > max_mvy) max_mvy = mvy[i]; 1901b362b15af34006e6a11974088a46d42b903418eJohann else if (mvy[i] < min_mvy) min_mvy = mvy[i]; 1911b362b15af34006e6a11974088a46d42b903418eJohann } 1921b362b15af34006e6a11974088a46d42b903418eJohann } 1931b362b15af34006e6a11974088a46d42b903418eJohann 1941b362b15af34006e6a11974088a46d42b903418eJohann mmvx = MAX(abs(min_mvx - here->mbmi.mv.as_mv.row), 1951b362b15af34006e6a11974088a46d42b903418eJohann abs(max_mvx - here->mbmi.mv.as_mv.row)); 1961b362b15af34006e6a11974088a46d42b903418eJohann mmvy = MAX(abs(min_mvy - here->mbmi.mv.as_mv.col), 1971b362b15af34006e6a11974088a46d42b903418eJohann abs(max_mvy - here->mbmi.mv.as_mv.col)); 1981b362b15af34006e6a11974088a46d42b903418eJohann dissim = MAX(mmvx, mmvy); 1991b362b15af34006e6a11974088a46d42b903418eJohann } 2001b362b15af34006e6a11974088a46d42b903418eJohann } 2011b362b15af34006e6a11974088a46d42b903418eJohann 2021b362b15af34006e6a11974088a46d42b903418eJohann /* Store mode info for next resolution encoding */ 2031b362b15af34006e6a11974088a46d42b903418eJohann store_mode_info->mode = tmp->mbmi.mode; 2041b362b15af34006e6a11974088a46d42b903418eJohann store_mode_info->ref_frame = tmp->mbmi.ref_frame; 2051b362b15af34006e6a11974088a46d42b903418eJohann store_mode_info->mv.as_int = tmp->mbmi.mv.as_int; 2061b362b15af34006e6a11974088a46d42b903418eJohann store_mode_info->dissim = dissim; 2071b362b15af34006e6a11974088a46d42b903418eJohann tmp++; 2081b362b15af34006e6a11974088a46d42b903418eJohann store_mode_info++; 2091b362b15af34006e6a11974088a46d42b903418eJohann } 2101b362b15af34006e6a11974088a46d42b903418eJohann } 2111b362b15af34006e6a11974088a46d42b903418eJohann } 2121b362b15af34006e6a11974088a46d42b903418eJohann } 2131b362b15af34006e6a11974088a46d42b903418eJohann} 2141b362b15af34006e6a11974088a46d42b903418eJohann 2151b362b15af34006e6a11974088a46d42b903418eJohann/* This function is called only when this frame is dropped at current 2161b362b15af34006e6a11974088a46d42b903418eJohann resolution level. */ 2171b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_store_drop_frame_info(VP8_COMP *cpi) 2181b362b15af34006e6a11974088a46d42b903418eJohann{ 2191b362b15af34006e6a11974088a46d42b903418eJohann /* If the frame is dropped in lower-resolution encoding, this information 2201b362b15af34006e6a11974088a46d42b903418eJohann is passed to higher resolution level so that the encoder knows there 2211b362b15af34006e6a11974088a46d42b903418eJohann is no mode & motion info available. 2221b362b15af34006e6a11974088a46d42b903418eJohann */ 2231b362b15af34006e6a11974088a46d42b903418eJohann if (cpi->oxcf.mr_total_resolutions >1 2241b362b15af34006e6a11974088a46d42b903418eJohann && cpi->oxcf.mr_encoder_id < (cpi->oxcf.mr_total_resolutions - 1)) 2251b362b15af34006e6a11974088a46d42b903418eJohann { 2261b362b15af34006e6a11974088a46d42b903418eJohann /* Store info for show/no-show frames for supporting alt_ref. 2271b362b15af34006e6a11974088a46d42b903418eJohann * If parent frame is alt_ref, child has one too. 2281b362b15af34006e6a11974088a46d42b903418eJohann */ 2291b362b15af34006e6a11974088a46d42b903418eJohann LOWER_RES_FRAME_INFO* store_info 2301b362b15af34006e6a11974088a46d42b903418eJohann = (LOWER_RES_FRAME_INFO*)cpi->oxcf.mr_low_res_mode_info; 2311b362b15af34006e6a11974088a46d42b903418eJohann 2321b362b15af34006e6a11974088a46d42b903418eJohann /* Set frame_type to be INTER_FRAME since we won't drop key frame. */ 2331b362b15af34006e6a11974088a46d42b903418eJohann store_info->frame_type = INTER_FRAME; 2341b362b15af34006e6a11974088a46d42b903418eJohann store_info->is_frame_dropped = 1; 2351b362b15af34006e6a11974088a46d42b903418eJohann } 2361b362b15af34006e6a11974088a46d42b903418eJohann} 237