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 <stdlib.h>
141b362b15af34006e6a11974088a46d42b903418eJohann#include "vpx_config.h"
151b362b15af34006e6a11974088a46d42b903418eJohann#include "vpx/vpx_integer.h"
161b362b15af34006e6a11974088a46d42b903418eJohann
171b362b15af34006e6a11974088a46d42b903418eJohannstatic unsigned int sad_mx_n_c(const unsigned char *src_ptr, int src_stride,
181b362b15af34006e6a11974088a46d42b903418eJohann                               const unsigned char *ref_ptr, int ref_stride,
191b362b15af34006e6a11974088a46d42b903418eJohann                               unsigned int max_sad, int m, int n)
201b362b15af34006e6a11974088a46d42b903418eJohann{
211b362b15af34006e6a11974088a46d42b903418eJohann    int r, c;
221b362b15af34006e6a11974088a46d42b903418eJohann    unsigned int sad = 0;
231b362b15af34006e6a11974088a46d42b903418eJohann
241b362b15af34006e6a11974088a46d42b903418eJohann    for (r = 0; r < n; r++)
251b362b15af34006e6a11974088a46d42b903418eJohann    {
261b362b15af34006e6a11974088a46d42b903418eJohann        for (c = 0; c < m; c++)
271b362b15af34006e6a11974088a46d42b903418eJohann        {
281b362b15af34006e6a11974088a46d42b903418eJohann            sad += abs(src_ptr[c] - ref_ptr[c]);
291b362b15af34006e6a11974088a46d42b903418eJohann        }
301b362b15af34006e6a11974088a46d42b903418eJohann
311b362b15af34006e6a11974088a46d42b903418eJohann        if (sad > max_sad)
321b362b15af34006e6a11974088a46d42b903418eJohann          break;
331b362b15af34006e6a11974088a46d42b903418eJohann
341b362b15af34006e6a11974088a46d42b903418eJohann        src_ptr += src_stride;
351b362b15af34006e6a11974088a46d42b903418eJohann        ref_ptr += ref_stride;
361b362b15af34006e6a11974088a46d42b903418eJohann    }
371b362b15af34006e6a11974088a46d42b903418eJohann
381b362b15af34006e6a11974088a46d42b903418eJohann    return sad;
391b362b15af34006e6a11974088a46d42b903418eJohann}
401b362b15af34006e6a11974088a46d42b903418eJohann
411b362b15af34006e6a11974088a46d42b903418eJohann/* max_sad is provided as an optional optimization point. Alternative
421b362b15af34006e6a11974088a46d42b903418eJohann * implementations of these functions are not required to check it.
431b362b15af34006e6a11974088a46d42b903418eJohann */
441b362b15af34006e6a11974088a46d42b903418eJohann
451b362b15af34006e6a11974088a46d42b903418eJohannunsigned int vp8_sad16x16_c(const unsigned char *src_ptr, int src_stride,
461b362b15af34006e6a11974088a46d42b903418eJohann                            const unsigned char *ref_ptr, int ref_stride,
471b362b15af34006e6a11974088a46d42b903418eJohann                            unsigned int max_sad)
481b362b15af34006e6a11974088a46d42b903418eJohann{
491b362b15af34006e6a11974088a46d42b903418eJohann    return sad_mx_n_c(src_ptr, src_stride, ref_ptr, ref_stride, max_sad, 16, 16);
501b362b15af34006e6a11974088a46d42b903418eJohann}
511b362b15af34006e6a11974088a46d42b903418eJohann
521b362b15af34006e6a11974088a46d42b903418eJohannunsigned int vp8_sad8x8_c(const unsigned char *src_ptr, int src_stride,
531b362b15af34006e6a11974088a46d42b903418eJohann                          const unsigned char *ref_ptr, int ref_stride,
541b362b15af34006e6a11974088a46d42b903418eJohann                          unsigned int max_sad)
551b362b15af34006e6a11974088a46d42b903418eJohann{
561b362b15af34006e6a11974088a46d42b903418eJohann    return sad_mx_n_c(src_ptr, src_stride, ref_ptr, ref_stride, max_sad, 8, 8);
571b362b15af34006e6a11974088a46d42b903418eJohann}
581b362b15af34006e6a11974088a46d42b903418eJohann
591b362b15af34006e6a11974088a46d42b903418eJohannunsigned int vp8_sad16x8_c(const unsigned char *src_ptr, int src_stride,
601b362b15af34006e6a11974088a46d42b903418eJohann                           const unsigned char *ref_ptr, int ref_stride,
611b362b15af34006e6a11974088a46d42b903418eJohann                           unsigned int max_sad)
621b362b15af34006e6a11974088a46d42b903418eJohann{
631b362b15af34006e6a11974088a46d42b903418eJohann    return sad_mx_n_c(src_ptr, src_stride, ref_ptr, ref_stride, max_sad, 16, 8);
641b362b15af34006e6a11974088a46d42b903418eJohann
651b362b15af34006e6a11974088a46d42b903418eJohann}
661b362b15af34006e6a11974088a46d42b903418eJohann
671b362b15af34006e6a11974088a46d42b903418eJohannunsigned int vp8_sad8x16_c(const unsigned char *src_ptr, int src_stride,
681b362b15af34006e6a11974088a46d42b903418eJohann                           const unsigned char *ref_ptr, int ref_stride,
691b362b15af34006e6a11974088a46d42b903418eJohann                           unsigned int max_sad)
701b362b15af34006e6a11974088a46d42b903418eJohann{
711b362b15af34006e6a11974088a46d42b903418eJohann    return sad_mx_n_c(src_ptr, src_stride, ref_ptr, ref_stride, max_sad, 8, 16);
721b362b15af34006e6a11974088a46d42b903418eJohann}
731b362b15af34006e6a11974088a46d42b903418eJohann
741b362b15af34006e6a11974088a46d42b903418eJohannunsigned int vp8_sad4x4_c(const unsigned char *src_ptr, int src_stride,
751b362b15af34006e6a11974088a46d42b903418eJohann                          const unsigned char *ref_ptr, int ref_stride,
761b362b15af34006e6a11974088a46d42b903418eJohann                          unsigned int max_sad)
771b362b15af34006e6a11974088a46d42b903418eJohann{
781b362b15af34006e6a11974088a46d42b903418eJohann    return sad_mx_n_c(src_ptr, src_stride, ref_ptr, ref_stride, max_sad, 4, 4);
791b362b15af34006e6a11974088a46d42b903418eJohann}
801b362b15af34006e6a11974088a46d42b903418eJohann
811b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_sad16x16x3_c(const unsigned char *src_ptr, int src_stride,
821b362b15af34006e6a11974088a46d42b903418eJohann                      const unsigned char *ref_ptr, int ref_stride,
831b362b15af34006e6a11974088a46d42b903418eJohann                      unsigned int *sad_array)
841b362b15af34006e6a11974088a46d42b903418eJohann{
851b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[0] = vp8_sad16x16_c(src_ptr, src_stride, ref_ptr + 0, ref_stride, UINT_MAX);
861b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[1] = vp8_sad16x16_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, UINT_MAX);
871b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[2] = vp8_sad16x16_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, UINT_MAX);
881b362b15af34006e6a11974088a46d42b903418eJohann}
891b362b15af34006e6a11974088a46d42b903418eJohann
901b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_sad16x16x8_c(const unsigned char *src_ptr, int src_stride,
911b362b15af34006e6a11974088a46d42b903418eJohann                      const unsigned char *ref_ptr, int ref_stride,
921b362b15af34006e6a11974088a46d42b903418eJohann                      unsigned short *sad_array)
931b362b15af34006e6a11974088a46d42b903418eJohann{
941b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[0] = (unsigned short)vp8_sad16x16_c(src_ptr, src_stride, ref_ptr + 0, ref_stride, UINT_MAX);
951b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[1] = (unsigned short)vp8_sad16x16_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, UINT_MAX);
961b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[2] = (unsigned short)vp8_sad16x16_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, UINT_MAX);
971b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[3] = (unsigned short)vp8_sad16x16_c(src_ptr, src_stride, ref_ptr + 3, ref_stride, UINT_MAX);
981b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[4] = (unsigned short)vp8_sad16x16_c(src_ptr, src_stride, ref_ptr + 4, ref_stride, UINT_MAX);
991b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[5] = (unsigned short)vp8_sad16x16_c(src_ptr, src_stride, ref_ptr + 5, ref_stride, UINT_MAX);
1001b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[6] = (unsigned short)vp8_sad16x16_c(src_ptr, src_stride, ref_ptr + 6, ref_stride, UINT_MAX);
1011b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[7] = (unsigned short)vp8_sad16x16_c(src_ptr, src_stride, ref_ptr + 7, ref_stride, UINT_MAX);
1021b362b15af34006e6a11974088a46d42b903418eJohann}
1031b362b15af34006e6a11974088a46d42b903418eJohann
1041b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_sad16x8x3_c(const unsigned char *src_ptr, int src_stride,
1051b362b15af34006e6a11974088a46d42b903418eJohann                     const unsigned char *ref_ptr, int ref_stride,
1061b362b15af34006e6a11974088a46d42b903418eJohann                     unsigned int *sad_array)
1071b362b15af34006e6a11974088a46d42b903418eJohann{
1081b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[0] = vp8_sad16x8_c(src_ptr, src_stride, ref_ptr + 0, ref_stride, UINT_MAX);
1091b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[1] = vp8_sad16x8_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, UINT_MAX);
1101b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[2] = vp8_sad16x8_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, UINT_MAX);
1111b362b15af34006e6a11974088a46d42b903418eJohann}
1121b362b15af34006e6a11974088a46d42b903418eJohann
1131b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_sad16x8x8_c(const unsigned char *src_ptr, int src_stride,
1141b362b15af34006e6a11974088a46d42b903418eJohann                     const unsigned char *ref_ptr, int ref_stride,
1151b362b15af34006e6a11974088a46d42b903418eJohann                     unsigned short *sad_array)
1161b362b15af34006e6a11974088a46d42b903418eJohann{
1171b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[0] = (unsigned short)vp8_sad16x8_c(src_ptr, src_stride, ref_ptr + 0, ref_stride, UINT_MAX);
1181b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[1] = (unsigned short)vp8_sad16x8_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, UINT_MAX);
1191b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[2] = (unsigned short)vp8_sad16x8_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, UINT_MAX);
1201b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[3] = (unsigned short)vp8_sad16x8_c(src_ptr, src_stride, ref_ptr + 3, ref_stride, UINT_MAX);
1211b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[4] = (unsigned short)vp8_sad16x8_c(src_ptr, src_stride, ref_ptr + 4, ref_stride, UINT_MAX);
1221b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[5] = (unsigned short)vp8_sad16x8_c(src_ptr, src_stride, ref_ptr + 5, ref_stride, UINT_MAX);
1231b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[6] = (unsigned short)vp8_sad16x8_c(src_ptr, src_stride, ref_ptr + 6, ref_stride, UINT_MAX);
1241b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[7] = (unsigned short)vp8_sad16x8_c(src_ptr, src_stride, ref_ptr + 7, ref_stride, UINT_MAX);
1251b362b15af34006e6a11974088a46d42b903418eJohann}
1261b362b15af34006e6a11974088a46d42b903418eJohann
1271b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_sad8x8x3_c(const unsigned char *src_ptr, int src_stride,
1281b362b15af34006e6a11974088a46d42b903418eJohann                    const unsigned char *ref_ptr, int ref_stride,
1291b362b15af34006e6a11974088a46d42b903418eJohann                    unsigned int *sad_array)
1301b362b15af34006e6a11974088a46d42b903418eJohann{
1311b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[0] = vp8_sad8x8_c(src_ptr, src_stride, ref_ptr + 0, ref_stride, UINT_MAX);
1321b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[1] = vp8_sad8x8_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, UINT_MAX);
1331b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[2] = vp8_sad8x8_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, UINT_MAX);
1341b362b15af34006e6a11974088a46d42b903418eJohann}
1351b362b15af34006e6a11974088a46d42b903418eJohann
1361b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_sad8x8x8_c(const unsigned char *src_ptr, int src_stride,
1371b362b15af34006e6a11974088a46d42b903418eJohann                    const unsigned char *ref_ptr, int ref_stride,
1381b362b15af34006e6a11974088a46d42b903418eJohann                    unsigned short *sad_array)
1391b362b15af34006e6a11974088a46d42b903418eJohann{
1401b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[0] = (unsigned short)vp8_sad8x8_c(src_ptr, src_stride, ref_ptr + 0, ref_stride, UINT_MAX);
1411b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[1] = (unsigned short)vp8_sad8x8_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, UINT_MAX);
1421b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[2] = (unsigned short)vp8_sad8x8_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, UINT_MAX);
1431b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[3] = (unsigned short)vp8_sad8x8_c(src_ptr, src_stride, ref_ptr + 3, ref_stride, UINT_MAX);
1441b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[4] = (unsigned short)vp8_sad8x8_c(src_ptr, src_stride, ref_ptr + 4, ref_stride, UINT_MAX);
1451b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[5] = (unsigned short)vp8_sad8x8_c(src_ptr, src_stride, ref_ptr + 5, ref_stride, UINT_MAX);
1461b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[6] = (unsigned short)vp8_sad8x8_c(src_ptr, src_stride, ref_ptr + 6, ref_stride, UINT_MAX);
1471b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[7] = (unsigned short)vp8_sad8x8_c(src_ptr, src_stride, ref_ptr + 7, ref_stride, UINT_MAX);
1481b362b15af34006e6a11974088a46d42b903418eJohann}
1491b362b15af34006e6a11974088a46d42b903418eJohann
1501b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_sad8x16x3_c(const unsigned char *src_ptr, int src_stride,
1511b362b15af34006e6a11974088a46d42b903418eJohann                     const unsigned char *ref_ptr, int ref_stride,
1521b362b15af34006e6a11974088a46d42b903418eJohann                     unsigned int *sad_array)
1531b362b15af34006e6a11974088a46d42b903418eJohann{
1541b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[0] = vp8_sad8x16_c(src_ptr, src_stride, ref_ptr + 0, ref_stride, UINT_MAX);
1551b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[1] = vp8_sad8x16_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, UINT_MAX);
1561b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[2] = vp8_sad8x16_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, UINT_MAX);
1571b362b15af34006e6a11974088a46d42b903418eJohann}
1581b362b15af34006e6a11974088a46d42b903418eJohann
1591b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_sad8x16x8_c(const unsigned char *src_ptr, int src_stride,
1601b362b15af34006e6a11974088a46d42b903418eJohann                     const unsigned char *ref_ptr, int ref_stride,
1611b362b15af34006e6a11974088a46d42b903418eJohann                     unsigned short *sad_array)
1621b362b15af34006e6a11974088a46d42b903418eJohann{
1631b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[0] = (unsigned short)vp8_sad8x16_c(src_ptr, src_stride, ref_ptr + 0, ref_stride, UINT_MAX);
1641b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[1] = (unsigned short)vp8_sad8x16_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, UINT_MAX);
1651b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[2] = (unsigned short)vp8_sad8x16_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, UINT_MAX);
1661b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[3] = (unsigned short)vp8_sad8x16_c(src_ptr, src_stride, ref_ptr + 3, ref_stride, UINT_MAX);
1671b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[4] = (unsigned short)vp8_sad8x16_c(src_ptr, src_stride, ref_ptr + 4, ref_stride, UINT_MAX);
1681b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[5] = (unsigned short)vp8_sad8x16_c(src_ptr, src_stride, ref_ptr + 5, ref_stride, UINT_MAX);
1691b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[6] = (unsigned short)vp8_sad8x16_c(src_ptr, src_stride, ref_ptr + 6, ref_stride, UINT_MAX);
1701b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[7] = (unsigned short)vp8_sad8x16_c(src_ptr, src_stride, ref_ptr + 7, ref_stride, UINT_MAX);
1711b362b15af34006e6a11974088a46d42b903418eJohann}
1721b362b15af34006e6a11974088a46d42b903418eJohann
1731b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_sad4x4x3_c(const unsigned char *src_ptr, int src_stride,
1741b362b15af34006e6a11974088a46d42b903418eJohann                    const unsigned char *ref_ptr, int ref_stride,
1751b362b15af34006e6a11974088a46d42b903418eJohann                    unsigned int *sad_array)
1761b362b15af34006e6a11974088a46d42b903418eJohann{
1771b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[0] = vp8_sad4x4_c(src_ptr, src_stride, ref_ptr + 0, ref_stride, UINT_MAX);
1781b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[1] = vp8_sad4x4_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, UINT_MAX);
1791b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[2] = vp8_sad4x4_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, UINT_MAX);
1801b362b15af34006e6a11974088a46d42b903418eJohann}
1811b362b15af34006e6a11974088a46d42b903418eJohann
1821b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_sad4x4x8_c(const unsigned char *src_ptr, int src_stride,
1831b362b15af34006e6a11974088a46d42b903418eJohann                    const unsigned char *ref_ptr, int ref_stride,
1841b362b15af34006e6a11974088a46d42b903418eJohann                    unsigned short *sad_array)
1851b362b15af34006e6a11974088a46d42b903418eJohann{
1861b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[0] = (unsigned short)vp8_sad4x4_c(src_ptr, src_stride, ref_ptr + 0, ref_stride, UINT_MAX);
1871b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[1] = (unsigned short)vp8_sad4x4_c(src_ptr, src_stride, ref_ptr + 1, ref_stride, UINT_MAX);
1881b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[2] = (unsigned short)vp8_sad4x4_c(src_ptr, src_stride, ref_ptr + 2, ref_stride, UINT_MAX);
1891b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[3] = (unsigned short)vp8_sad4x4_c(src_ptr, src_stride, ref_ptr + 3, ref_stride, UINT_MAX);
1901b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[4] = (unsigned short)vp8_sad4x4_c(src_ptr, src_stride, ref_ptr + 4, ref_stride, UINT_MAX);
1911b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[5] = (unsigned short)vp8_sad4x4_c(src_ptr, src_stride, ref_ptr + 5, ref_stride, UINT_MAX);
1921b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[6] = (unsigned short)vp8_sad4x4_c(src_ptr, src_stride, ref_ptr + 6, ref_stride, UINT_MAX);
1931b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[7] = (unsigned short)vp8_sad4x4_c(src_ptr, src_stride, ref_ptr + 7, ref_stride, UINT_MAX);
1941b362b15af34006e6a11974088a46d42b903418eJohann}
1951b362b15af34006e6a11974088a46d42b903418eJohann
1961b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_sad16x16x4d_c(const unsigned char *src_ptr, int src_stride,
1971b362b15af34006e6a11974088a46d42b903418eJohann                       const unsigned char * const ref_ptr[], int ref_stride,
1981b362b15af34006e6a11974088a46d42b903418eJohann                       unsigned int *sad_array)
1991b362b15af34006e6a11974088a46d42b903418eJohann{
2001b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[0] = vp8_sad16x16_c(src_ptr, src_stride, ref_ptr[0], ref_stride, UINT_MAX);
2011b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[1] = vp8_sad16x16_c(src_ptr, src_stride, ref_ptr[1], ref_stride, UINT_MAX);
2021b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[2] = vp8_sad16x16_c(src_ptr, src_stride, ref_ptr[2], ref_stride, UINT_MAX);
2031b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[3] = vp8_sad16x16_c(src_ptr, src_stride, ref_ptr[3], ref_stride, UINT_MAX);
2041b362b15af34006e6a11974088a46d42b903418eJohann}
2051b362b15af34006e6a11974088a46d42b903418eJohann
2061b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_sad16x8x4d_c(const unsigned char *src_ptr, int src_stride,
2071b362b15af34006e6a11974088a46d42b903418eJohann                      const unsigned char * const ref_ptr[], int ref_stride,
2081b362b15af34006e6a11974088a46d42b903418eJohann                      unsigned int *sad_array)
2091b362b15af34006e6a11974088a46d42b903418eJohann{
2101b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[0] = vp8_sad16x8_c(src_ptr, src_stride, ref_ptr[0], ref_stride, UINT_MAX);
2111b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[1] = vp8_sad16x8_c(src_ptr, src_stride, ref_ptr[1], ref_stride, UINT_MAX);
2121b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[2] = vp8_sad16x8_c(src_ptr, src_stride, ref_ptr[2], ref_stride, UINT_MAX);
2131b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[3] = vp8_sad16x8_c(src_ptr, src_stride, ref_ptr[3], ref_stride, UINT_MAX);
2141b362b15af34006e6a11974088a46d42b903418eJohann}
2151b362b15af34006e6a11974088a46d42b903418eJohann
2161b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_sad8x8x4d_c(const unsigned char *src_ptr, int src_stride,
2171b362b15af34006e6a11974088a46d42b903418eJohann                     const unsigned char * const ref_ptr[], int ref_stride,
2181b362b15af34006e6a11974088a46d42b903418eJohann                     unsigned int *sad_array)
2191b362b15af34006e6a11974088a46d42b903418eJohann{
2201b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[0] = vp8_sad8x8_c(src_ptr, src_stride, ref_ptr[0], ref_stride, UINT_MAX);
2211b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[1] = vp8_sad8x8_c(src_ptr, src_stride, ref_ptr[1], ref_stride, UINT_MAX);
2221b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[2] = vp8_sad8x8_c(src_ptr, src_stride, ref_ptr[2], ref_stride, UINT_MAX);
2231b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[3] = vp8_sad8x8_c(src_ptr, src_stride, ref_ptr[3], ref_stride, UINT_MAX);
2241b362b15af34006e6a11974088a46d42b903418eJohann}
2251b362b15af34006e6a11974088a46d42b903418eJohann
2261b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_sad8x16x4d_c(const unsigned char *src_ptr, int src_stride,
2271b362b15af34006e6a11974088a46d42b903418eJohann                      const unsigned char * const ref_ptr[], int ref_stride,
2281b362b15af34006e6a11974088a46d42b903418eJohann                      unsigned int *sad_array)
2291b362b15af34006e6a11974088a46d42b903418eJohann{
2301b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[0] = vp8_sad8x16_c(src_ptr, src_stride, ref_ptr[0], ref_stride, UINT_MAX);
2311b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[1] = vp8_sad8x16_c(src_ptr, src_stride, ref_ptr[1], ref_stride, UINT_MAX);
2321b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[2] = vp8_sad8x16_c(src_ptr, src_stride, ref_ptr[2], ref_stride, UINT_MAX);
2331b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[3] = vp8_sad8x16_c(src_ptr, src_stride, ref_ptr[3], ref_stride, UINT_MAX);
2341b362b15af34006e6a11974088a46d42b903418eJohann}
2351b362b15af34006e6a11974088a46d42b903418eJohann
2361b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_sad4x4x4d_c(const unsigned char *src_ptr, int src_stride,
2371b362b15af34006e6a11974088a46d42b903418eJohann                     const unsigned char * const ref_ptr[], int  ref_stride,
2381b362b15af34006e6a11974088a46d42b903418eJohann                     unsigned int *sad_array)
2391b362b15af34006e6a11974088a46d42b903418eJohann{
2401b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[0] = vp8_sad4x4_c(src_ptr, src_stride, ref_ptr[0], ref_stride, UINT_MAX);
2411b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[1] = vp8_sad4x4_c(src_ptr, src_stride, ref_ptr[1], ref_stride, UINT_MAX);
2421b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[2] = vp8_sad4x4_c(src_ptr, src_stride, ref_ptr[2], ref_stride, UINT_MAX);
2431b362b15af34006e6a11974088a46d42b903418eJohann    sad_array[3] = vp8_sad4x4_c(src_ptr, src_stride, ref_ptr[3], ref_stride, UINT_MAX);
2441b362b15af34006e6a11974088a46d42b903418eJohann}
2451b362b15af34006e6a11974088a46d42b903418eJohann
2461b362b15af34006e6a11974088a46d42b903418eJohann/* Copy 2 macroblocks to a buffer */
2471b362b15af34006e6a11974088a46d42b903418eJohannvoid vp8_copy32xn_c(unsigned char *src_ptr, int src_stride,
2481b362b15af34006e6a11974088a46d42b903418eJohann                    unsigned char *dst_ptr, int dst_stride,
2491b362b15af34006e6a11974088a46d42b903418eJohann                    int height)
2501b362b15af34006e6a11974088a46d42b903418eJohann{
2511b362b15af34006e6a11974088a46d42b903418eJohann    int r;
2521b362b15af34006e6a11974088a46d42b903418eJohann
2531b362b15af34006e6a11974088a46d42b903418eJohann    for (r = 0; r < height; r++)
2541b362b15af34006e6a11974088a46d42b903418eJohann    {
2551b362b15af34006e6a11974088a46d42b903418eJohann#if !(CONFIG_FAST_UNALIGNED)
2561b362b15af34006e6a11974088a46d42b903418eJohann        dst_ptr[0] = src_ptr[0];
2571b362b15af34006e6a11974088a46d42b903418eJohann        dst_ptr[1] = src_ptr[1];
2581b362b15af34006e6a11974088a46d42b903418eJohann        dst_ptr[2] = src_ptr[2];
2591b362b15af34006e6a11974088a46d42b903418eJohann        dst_ptr[3] = src_ptr[3];
2601b362b15af34006e6a11974088a46d42b903418eJohann        dst_ptr[4] = src_ptr[4];
2611b362b15af34006e6a11974088a46d42b903418eJohann        dst_ptr[5] = src_ptr[5];
2621b362b15af34006e6a11974088a46d42b903418eJohann        dst_ptr[6] = src_ptr[6];
2631b362b15af34006e6a11974088a46d42b903418eJohann        dst_ptr[7] = src_ptr[7];
2641b362b15af34006e6a11974088a46d42b903418eJohann        dst_ptr[8] = src_ptr[8];
2651b362b15af34006e6a11974088a46d42b903418eJohann        dst_ptr[9] = src_ptr[9];
2661b362b15af34006e6a11974088a46d42b903418eJohann        dst_ptr[10] = src_ptr[10];
2671b362b15af34006e6a11974088a46d42b903418eJohann        dst_ptr[11] = src_ptr[11];
2681b362b15af34006e6a11974088a46d42b903418eJohann        dst_ptr[12] = src_ptr[12];
2691b362b15af34006e6a11974088a46d42b903418eJohann        dst_ptr[13] = src_ptr[13];
2701b362b15af34006e6a11974088a46d42b903418eJohann        dst_ptr[14] = src_ptr[14];
2711b362b15af34006e6a11974088a46d42b903418eJohann        dst_ptr[15] = src_ptr[15];
2721b362b15af34006e6a11974088a46d42b903418eJohann        dst_ptr[16] = src_ptr[16];
2731b362b15af34006e6a11974088a46d42b903418eJohann        dst_ptr[17] = src_ptr[17];
2741b362b15af34006e6a11974088a46d42b903418eJohann        dst_ptr[18] = src_ptr[18];
2751b362b15af34006e6a11974088a46d42b903418eJohann        dst_ptr[19] = src_ptr[19];
2761b362b15af34006e6a11974088a46d42b903418eJohann        dst_ptr[20] = src_ptr[20];
2771b362b15af34006e6a11974088a46d42b903418eJohann        dst_ptr[21] = src_ptr[21];
2781b362b15af34006e6a11974088a46d42b903418eJohann        dst_ptr[22] = src_ptr[22];
2791b362b15af34006e6a11974088a46d42b903418eJohann        dst_ptr[23] = src_ptr[23];
2801b362b15af34006e6a11974088a46d42b903418eJohann        dst_ptr[24] = src_ptr[24];
2811b362b15af34006e6a11974088a46d42b903418eJohann        dst_ptr[25] = src_ptr[25];
2821b362b15af34006e6a11974088a46d42b903418eJohann        dst_ptr[26] = src_ptr[26];
2831b362b15af34006e6a11974088a46d42b903418eJohann        dst_ptr[27] = src_ptr[27];
2841b362b15af34006e6a11974088a46d42b903418eJohann        dst_ptr[28] = src_ptr[28];
2851b362b15af34006e6a11974088a46d42b903418eJohann        dst_ptr[29] = src_ptr[29];
2861b362b15af34006e6a11974088a46d42b903418eJohann        dst_ptr[30] = src_ptr[30];
2871b362b15af34006e6a11974088a46d42b903418eJohann        dst_ptr[31] = src_ptr[31];
2881b362b15af34006e6a11974088a46d42b903418eJohann#else
2891b362b15af34006e6a11974088a46d42b903418eJohann        ((uint32_t *)dst_ptr)[0] = ((uint32_t *)src_ptr)[0] ;
2901b362b15af34006e6a11974088a46d42b903418eJohann        ((uint32_t *)dst_ptr)[1] = ((uint32_t *)src_ptr)[1] ;
2911b362b15af34006e6a11974088a46d42b903418eJohann        ((uint32_t *)dst_ptr)[2] = ((uint32_t *)src_ptr)[2] ;
2921b362b15af34006e6a11974088a46d42b903418eJohann        ((uint32_t *)dst_ptr)[3] = ((uint32_t *)src_ptr)[3] ;
2931b362b15af34006e6a11974088a46d42b903418eJohann        ((uint32_t *)dst_ptr)[4] = ((uint32_t *)src_ptr)[4] ;
2941b362b15af34006e6a11974088a46d42b903418eJohann        ((uint32_t *)dst_ptr)[5] = ((uint32_t *)src_ptr)[5] ;
2951b362b15af34006e6a11974088a46d42b903418eJohann        ((uint32_t *)dst_ptr)[6] = ((uint32_t *)src_ptr)[6] ;
2961b362b15af34006e6a11974088a46d42b903418eJohann        ((uint32_t *)dst_ptr)[7] = ((uint32_t *)src_ptr)[7] ;
2971b362b15af34006e6a11974088a46d42b903418eJohann#endif
2981b362b15af34006e6a11974088a46d42b903418eJohann        src_ptr += src_stride;
2991b362b15af34006e6a11974088a46d42b903418eJohann        dst_ptr += dst_stride;
3001b362b15af34006e6a11974088a46d42b903418eJohann
3011b362b15af34006e6a11974088a46d42b903418eJohann    }
3021b362b15af34006e6a11974088a46d42b903418eJohann}
303