Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3)

Side by Side Diff: source/libvpx/vp9/encoder/vp9_mcomp.c

Issue 996503002: libvpx: Pull from upstream (Closed) Base URL: https://chromium.googlesource.com/chromium/deps/libvpx.git@master
Patch Set: Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « source/libvpx/vp9/encoder/vp9_mcomp.h ('k') | source/libvpx/vp9/encoder/vp9_pickmode.c » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 1696 matching lines...) Expand 10 before | Expand all | Expand 10 after
1707 break; 1707 break;
1708 }; 1708 };
1709 #endif 1709 #endif
1710 } else if (best_address == in_what) { 1710 } else if (best_address == in_what) {
1711 (*num00)++; 1711 (*num00)++;
1712 } 1712 }
1713 } 1713 }
1714 return bestsad; 1714 return bestsad;
1715 } 1715 }
1716 1716
1717 static int vector_match(int16_t *ref, int16_t *src, int bwl) {
1718 int best_sad = INT_MAX;
1719 int this_sad;
1720 int d;
1721 int center, offset = 0;
1722 int bw = 4 << bwl; // redundant variable, to be changed in the experiments.
1723 for (d = 0; d <= bw; d += 16) {
1724 this_sad = vp9_vector_var(&ref[d], src, bwl);
1725 if (this_sad < best_sad) {
1726 best_sad = this_sad;
1727 offset = d;
1728 }
1729 }
1730 center = offset;
1731
1732 for (d = -8; d <= 8; d += 16) {
1733 int this_pos = offset + d;
1734 // check limit
1735 if (this_pos < 0 || this_pos > bw)
1736 continue;
1737 this_sad = vp9_vector_var(&ref[this_pos], src, bwl);
1738 if (this_sad < best_sad) {
1739 best_sad = this_sad;
1740 center = this_pos;
1741 }
1742 }
1743 offset = center;
1744
1745 for (d = -4; d <= 4; d += 8) {
1746 int this_pos = offset + d;
1747 // check limit
1748 if (this_pos < 0 || this_pos > bw)
1749 continue;
1750 this_sad = vp9_vector_var(&ref[this_pos], src, bwl);
1751 if (this_sad < best_sad) {
1752 best_sad = this_sad;
1753 center = this_pos;
1754 }
1755 }
1756 offset = center;
1757
1758 for (d = -2; d <= 2; d += 4) {
1759 int this_pos = offset + d;
1760 // check limit
1761 if (this_pos < 0 || this_pos > bw)
1762 continue;
1763 this_sad = vp9_vector_var(&ref[this_pos], src, bwl);
1764 if (this_sad < best_sad) {
1765 best_sad = this_sad;
1766 center = this_pos;
1767 }
1768 }
1769 offset = center;
1770
1771 for (d = -1; d <= 1; d += 2) {
1772 int this_pos = offset + d;
1773 // check limit
1774 if (this_pos < 0 || this_pos > bw)
1775 continue;
1776 this_sad = vp9_vector_var(&ref[this_pos], src, bwl);
1777 if (this_sad < best_sad) {
1778 best_sad = this_sad;
1779 center = this_pos;
1780 }
1781 }
1782
1783 return (center - (bw >> 1));
1784 }
1785
1786 static const MV search_pos[9] = {
1787 {-1, -1}, {-1, 0}, {-1, 1}, {0, -1}, {0, 0}, {0, 1},
1788 {1, -1}, {1, 0}, {1, 1},
1789 };
1790
1791 unsigned int vp9_int_pro_motion_estimation(const VP9_COMP *cpi, MACROBLOCK *x,
1792 BLOCK_SIZE bsize) {
1793 MACROBLOCKD *xd = &x->e_mbd;
1794 DECLARE_ALIGNED(16, int16_t, hbuf[128]);
1795 DECLARE_ALIGNED(16, int16_t, vbuf[128]);
1796 DECLARE_ALIGNED(16, int16_t, src_hbuf[64]);
1797 DECLARE_ALIGNED(16, int16_t, src_vbuf[64]);
1798 int idx;
1799 const int bw = 4 << b_width_log2_lookup[bsize];
1800 const int bh = 4 << b_height_log2_lookup[bsize];
1801 const int search_width = bw << 1;
1802 const int search_height = bh << 1;
1803 const int src_stride = x->plane[0].src.stride;
1804 const int ref_stride = xd->plane[0].pre[0].stride;
1805 uint8_t const *ref_buf, *src_buf;
1806 MV *tmp_mv = &xd->mi[0].src_mi->mbmi.mv[0].as_mv;
1807 int best_sad;
1808 MV this_mv;
1809
1810 // Set up prediction 1-D reference set
1811 ref_buf = xd->plane[0].pre[0].buf - (bw >> 1);
1812 for (idx = 0; idx < search_width; idx += 16) {
1813 vp9_int_pro_row(&hbuf[idx], ref_buf, ref_stride, bh);
1814 ref_buf += 16;
1815 }
1816
1817 ref_buf = xd->plane[0].pre[0].buf - (bh >> 1) * ref_stride;
1818 for (idx = 0; idx < search_height; ++idx) {
1819 vbuf[idx] = vp9_int_pro_col(ref_buf, bw);
1820 ref_buf += ref_stride;
1821 }
1822
1823 // Set up src 1-D reference set
1824 for (idx = 0; idx < bw; idx += 16) {
1825 src_buf = x->plane[0].src.buf + idx;
1826 vp9_int_pro_row(&src_hbuf[idx], src_buf, src_stride, bh);
1827 }
1828
1829 src_buf = x->plane[0].src.buf;
1830 for (idx = 0; idx < bh; ++idx) {
1831 src_vbuf[idx] = vp9_int_pro_col(src_buf, bw);
1832 src_buf += src_stride;
1833 }
1834
1835 // Find the best match per 1-D search
1836 tmp_mv->col = vector_match(hbuf, src_hbuf, b_width_log2_lookup[bsize]);
1837 tmp_mv->row = vector_match(vbuf, src_vbuf, b_height_log2_lookup[bsize]);
1838
1839 best_sad = INT_MAX;
1840 this_mv = *tmp_mv;
1841 for (idx = 0; idx < 9; ++idx) {
1842 int this_sad;
1843 src_buf = x->plane[0].src.buf;
1844 ref_buf = xd->plane[0].pre[0].buf +
1845 (search_pos[idx].row + this_mv.row) * ref_stride +
1846 (search_pos[idx].col + this_mv.col);
1847
1848 this_sad = cpi->fn_ptr[bsize].sdf(src_buf, src_stride,
1849 ref_buf, ref_stride);
1850 if (this_sad < best_sad) {
1851 best_sad = this_sad;
1852 tmp_mv->row = search_pos[idx].row + this_mv.row;
1853 tmp_mv->col = search_pos[idx].col + this_mv.col;
1854 }
1855 }
1856 tmp_mv->row *= 8;
1857 tmp_mv->col *= 8;
1858 x->pred_mv[LAST_FRAME] = *tmp_mv;
1859
1860 return best_sad;
1861 }
1862
1717 /* do_refine: If last step (1-away) of n-step search doesn't pick the center 1863 /* do_refine: If last step (1-away) of n-step search doesn't pick the center
1718 point as the best match, we will do a final 1-away diamond 1864 point as the best match, we will do a final 1-away diamond
1719 refining search */ 1865 refining search */
1720 int vp9_full_pixel_diamond(const VP9_COMP *cpi, MACROBLOCK *x, 1866 int vp9_full_pixel_diamond(const VP9_COMP *cpi, MACROBLOCK *x,
1721 MV *mvp_full, int step_param, 1867 MV *mvp_full, int step_param,
1722 int sadpb, int further_steps, int do_refine, 1868 int sadpb, int further_steps, int do_refine,
1723 int *cost_list, 1869 int *cost_list,
1724 const vp9_variance_fn_ptr_t *fn_ptr, 1870 const vp9_variance_fn_ptr_t *fn_ptr,
1725 const MV *ref_mv, MV *dst_mv) { 1871 const MV *ref_mv, MV *dst_mv) {
1726 MV temp_mv; 1872 MV temp_mv;
(...skipping 413 matching lines...) Expand 10 before | Expand all | Expand 10 after
2140 break; 2286 break;
2141 default: 2287 default:
2142 assert(0 && "Invalid search method."); 2288 assert(0 && "Invalid search method.");
2143 } 2289 }
2144 2290
2145 if (method != NSTEP && rd && var < var_max) 2291 if (method != NSTEP && rd && var < var_max)
2146 var = vp9_get_mvpred_var(x, tmp_mv, ref_mv, fn_ptr, 1); 2292 var = vp9_get_mvpred_var(x, tmp_mv, ref_mv, fn_ptr, 1);
2147 2293
2148 return var; 2294 return var;
2149 } 2295 }
OLDNEW
« no previous file with comments | « source/libvpx/vp9/encoder/vp9_mcomp.h ('k') | source/libvpx/vp9/encoder/vp9_pickmode.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698