// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef MEDIA_BASE_VECTOR_MATH_TESTING_H_
#define MEDIA_BASE_VECTOR_MATH_TESTING_H_

#include <utility>

#include "build/build_config.h"
#include "media/base/media_shmem_export.h"

namespace media {
namespace vector_math {

// Optimized versions exposed for testing.  See vector_math.h for details.
MEDIA_SHMEM_EXPORT void FMAC_C(const float src[],
                               float scale,
                               int len,
                               float dest[]);
MEDIA_SHMEM_EXPORT void FMUL_C(const float src[],
                               float scale,
                               int len,
                               float dest[]);
MEDIA_SHMEM_EXPORT std::pair<float, float> EWMAAndMaxPower_C(
    float initial_value,
    const float src[],
    int len,
    float smoothing_factor);

#if defined(ARCH_CPU_X86_FAMILY) && !defined(OS_NACL)
MEDIA_SHMEM_EXPORT void FMAC_SSE(const float src[],
                                 float scale,
                                 int len,
                                 float dest[]);
MEDIA_SHMEM_EXPORT void FMUL_SSE(const float src[],
                                 float scale,
                                 int len,
                                 float dest[]);
MEDIA_SHMEM_EXPORT std::pair<float, float> EWMAAndMaxPower_SSE(
    float initial_value,
    const float src[],
    int len,
    float smoothing_factor);
#endif

#if defined(ARCH_CPU_ARM_FAMILY) && defined(USE_NEON)
MEDIA_SHMEM_EXPORT void FMAC_NEON(const float src[],
                                  float scale,
                                  int len,
                                  float dest[]);
MEDIA_SHMEM_EXPORT void FMUL_NEON(const float src[],
                                  float scale,
                                  int len,
                                  float dest[]);
MEDIA_SHMEM_EXPORT std::pair<float, float> EWMAAndMaxPower_NEON(
    float initial_value,
    const float src[],
    int len,
    float smoothing_factor);
#endif

}  // namespace vector_math
}  // namespace media

#endif  // MEDIA_BASE_VECTOR_MATH_TESTING_H_
