// Copyright 2013 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.

// A set of utility functions to perform WSOLA.

#ifndef COBALT_MEDIA_FILTERS_WSOLA_INTERNALS_H_
#define COBALT_MEDIA_FILTERS_WSOLA_INTERNALS_H_

#include <utility>

#include "cobalt/media/base/media_export.h"

namespace cobalt {
namespace media {

class AudioBus;

namespace internal {

typedef std::pair<int, int> Interval;

// Dot-product of channels of two AudioBus. For each AudioBus an offset is
// given. |dot_product[k]| is the dot-product of channel |k|. The caller should
// allocate sufficient space for |dot_product|.
MEDIA_EXPORT void MultiChannelDotProduct(const AudioBus* a, int frame_offset_a,
                                         const AudioBus* b, int frame_offset_b,
                                         int num_frames, float* dot_product);

// Energies of sliding windows of channels are interleaved.
// The number windows is |input->frames()| - (|frames_per_window| - 1), hence,
// the method assumes |energy| must be, at least, of size
// (|input->frames()| - (|frames_per_window| - 1)) * |input->channels()|.
MEDIA_EXPORT void MultiChannelMovingBlockEnergies(const AudioBus* input,
                                                  int frames_per_window,
                                                  float* energy);

// Fit the curve f(x) = a * x^2 + b * x + c such that
//   f(-1) = y[0]
//   f(0) = y[1]
//   f(1) = y[2]
// and return the maximum, assuming that y[0] <= y[1] >= y[2].
MEDIA_EXPORT void QuadraticInterpolation(const float* y_values, float* extremum,
                                         float* extremum_value);

// Search a subset of all candid blocks. The search is performed every
// |decimation| frames. This reduces complexity by a factor of about
// 1 / |decimation|. A cubic interpolation is used to have a better estimate of
// the best match.
MEDIA_EXPORT int DecimatedSearch(int decimation, Interval exclude_interval,
                                 const AudioBus* target_block,
                                 const AudioBus* search_segment,
                                 const float* energy_target_block,
                                 const float* energy_candid_blocks);

// Search [|low_limit|, |high_limit|] of |search_segment| to find a block that
// is most similar to |target_block|. |energy_target_block| is the energy of the
// |target_block|. |energy_candidate_blocks| is the energy of all blocks within
// |search_block|.
MEDIA_EXPORT int FullSearch(int low_limit, int hight_limimit,
                            Interval exclude_interval,
                            const AudioBus* target_block,
                            const AudioBus* search_block,
                            const float* energy_target_block,
                            const float* energy_candidate_blocks);

// Find the index of the block, within |search_block|, that is most similar
// to |target_block|. Obviously, the returned index is w.r.t. |search_block|.
// |exclude_interval| is an interval that is excluded from the search.
MEDIA_EXPORT int OptimalIndex(const AudioBus* search_block,
                              const AudioBus* target_block,
                              Interval exclude_interval);

// Return a "periodic" Hann window. This is the first L samples of an L+1
// Hann window. It is perfect reconstruction for overlap-and-add.
MEDIA_EXPORT void GetSymmetricHanningWindow(int window_length, float* window);

}  // namespace internal

}  // namespace media
}  // namespace cobalt

#endif  // COBALT_MEDIA_FILTERS_WSOLA_INTERNALS_H_
