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