/*
 *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#ifndef WEBRTC_MODULES_AUDIO_CODING_NETEQ4_MERGE_H_
#define WEBRTC_MODULES_AUDIO_CODING_NETEQ4_MERGE_H_

#include <assert.h>

#include "webrtc/modules/audio_coding/neteq4/audio_multi_vector.h"
#include "webrtc/system_wrappers/interface/constructor_magic.h"
#include "webrtc/typedefs.h"

namespace webrtc {

// Forward declarations.
class Expand;
class SyncBuffer;

// This class handles the transition from expansion to normal operation.
// When a packet is not available for decoding when needed, the expand operation
// is called to generate extrapolation data. If the missing packet arrives,
// i.e., it was just delayed, it can be decoded and appended directly to the
// end of the expanded data (thanks to how the Expand class operates). However,
// if a later packet arrives instead, the loss is a fact, and the new data must
// be stitched together with the end of the expanded data. This stitching is
// what the Merge class does.
class Merge {
 public:
  Merge(int fs_hz, size_t num_channels, Expand* expand, SyncBuffer* sync_buffer)
      : fs_hz_(fs_hz),
        fs_mult_(fs_hz_ / 8000),
        num_channels_(num_channels),
        timestamps_per_call_(fs_hz_ / 100),
        expand_(expand),
        sync_buffer_(sync_buffer),
        expanded_(num_channels_) {
    assert(num_channels_ > 0);
  }

  // The main method to produce the audio data. The decoded data is supplied in
  // |input|, having |input_length| samples in total for all channels
  // (interleaved). The result is written to |output|. The number of channels
  // allocated in |output| defines the number of channels that will be used when
  // de-interleaving |input|. The values in |external_mute_factor_array| (Q14)
  // will be used to scale the audio, and is updated in the process. The array
  // must have |num_channels_| elements.
  int Process(int16_t* input, size_t input_length,
              int16_t* external_mute_factor_array,
              AudioMultiVector* output);

 private:
  static const int kMaxSampleRate = 48000;
  static const int kExpandDownsampLength = 100;
  static const int kInputDownsampLength = 40;
  static const int kMaxCorrelationLength = 60;

  // Calls |expand_| to get more expansion data to merge with. The data is
  // written to |expanded_signal_|. Returns the length of the expanded data,
  // while |expand_period| will be the number of samples in one expansion period
  // (typically one pitch period). The value of |old_length| will be the number
  // of samples that were taken from the |sync_buffer_|.
  int GetExpandedSignal(int* old_length, int* expand_period);

  // Analyzes |input| and |expanded_signal| to find maximum values. Returns
  // a muting factor (Q14) to be used on the new data.
  int16_t SignalScaling(const int16_t* input, int input_length,
                        const int16_t* expanded_signal,
                        int16_t* expanded_max, int16_t* input_max) const;

  // Downsamples |input| (|input_length| samples) and |expanded_signal| to
  // 4 kHz sample rate. The downsampled signals are written to
  // |input_downsampled_| and |expanded_downsampled_|, respectively.
  void Downsample(const int16_t* input, int input_length,
                  const int16_t* expanded_signal, int expanded_length);

  // Calculates cross-correlation between |input_downsampled_| and
  // |expanded_downsampled_|, and finds the correlation maximum. The maximizing
  // lag is returned.
  int16_t CorrelateAndPeakSearch(int16_t expanded_max, int16_t input_max,
                                 int start_position, int input_length,
                                 int expand_period) const;

  const int fs_hz_;
  const int fs_mult_;  // fs_hz_ / 8000.
  const size_t num_channels_;
  const int timestamps_per_call_;
  Expand* expand_;
  SyncBuffer* sync_buffer_;
  int16_t expanded_downsampled_[kExpandDownsampLength];
  int16_t input_downsampled_[kInputDownsampLength];
  AudioMultiVector expanded_;

  DISALLOW_COPY_AND_ASSIGN(Merge);
};

}  // namespace webrtc
#endif  // WEBRTC_MODULES_AUDIO_CODING_NETEQ4_MERGE_H_
