blob: 715ec6dfc7751bd37012fadc4f5cc4ec7936d7fa [file] [log] [blame]
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:211/*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 *
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
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Mirko Bonadei92ea95e2017-09-15 04:47:3111#ifndef MODULES_AUDIO_CODING_NETEQ_AUDIO_MULTI_VECTOR_H_
12#define MODULES_AUDIO_CODING_NETEQ_AUDIO_MULTI_VECTOR_H_
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:2113
Yves Gerey988cc082018-10-23 10:03:0114#include <stdint.h>
15#include <string.h>
Jonas Olssona4d87372019-07-05 17:08:3316
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:2117#include <vector>
18
Henrik Lundin00eb12a2018-09-05 16:14:5219#include "api/array_view.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3120#include "modules/audio_coding/neteq/audio_vector.h"
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:2121
22namespace webrtc {
23
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:2124class AudioMultiVector {
25 public:
Artem Titovd00ce742021-07-28 18:00:1726 // Creates an empty AudioMultiVector with `N` audio channels. `N` must be
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:2127 // larger than 0.
28 explicit AudioMultiVector(size_t N);
29
Artem Titovd00ce742021-07-28 18:00:1730 // Creates an AudioMultiVector with `N` audio channels, each channel having
31 // an initial size. `N` must be larger than 0.
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:2132 AudioMultiVector(size_t N, size_t initial_size);
33
34 virtual ~AudioMultiVector();
35
Byoungchan Lee604fd2f2022-01-21 00:49:3936 AudioMultiVector(const AudioMultiVector&) = delete;
37 AudioMultiVector& operator=(const AudioMultiVector&) = delete;
38
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:2139 // Deletes all values and make the vector empty.
40 virtual void Clear();
41
Artem Titovd00ce742021-07-28 18:00:1742 // Clears the vector and inserts `length` zeros into each channel.
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:2143 virtual void Zeros(size_t length);
44
Artem Titovd00ce742021-07-28 18:00:1745 // Copies all values from this vector to `copy_to`. Any contents in `copy_to`
46 // are deleted. After the operation is done, `copy_to` will be an exact
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:2147 // replica of this object. The source and the destination must have the same
48 // number of channels.
henrik.lundin@webrtc.orgf6ab6f82014-09-04 10:58:4349 virtual void CopyTo(AudioMultiVector* copy_to) const;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:2150
Artem Titovd00ce742021-07-28 18:00:1751 // Appends the contents of `append_this` to the end of this object. The array
Henrik Lundin00eb12a2018-09-05 16:14:5252 // is assumed to be channel-interleaved. The length must be an even multiple
53 // of this object's number of channels. The length of this object is increased
54 // with the length of the array divided by the number of channels.
55 void PushBackInterleaved(rtc::ArrayView<const int16_t> append_this);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:2156
Artem Titovd00ce742021-07-28 18:00:1757 // Appends the contents of AudioMultiVector `append_this` to this object. The
58 // length of this object is increased with the length of `append_this`.
henrik.lundin@webrtc.orgfd11bbf2013-09-30 20:38:4459 virtual void PushBack(const AudioMultiVector& append_this);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:2160
Artem Titovd00ce742021-07-28 18:00:1761 // Appends the contents of AudioMultiVector `append_this` to this object,
62 // taken from `index` up until the end of `append_this`. The length of this
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:2163 // object is increased.
henrik.lundin@webrtc.orgfd11bbf2013-09-30 20:38:4464 virtual void PushBackFromIndex(const AudioMultiVector& append_this,
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:2165 size_t index);
66
Artem Titovd00ce742021-07-28 18:00:1767 // Removes `length` elements from the beginning of this object, from each
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:2168 // channel.
69 virtual void PopFront(size_t length);
70
Artem Titovd00ce742021-07-28 18:00:1771 // Removes `length` elements from the end of this object, from each
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:2172 // channel.
73 virtual void PopBack(size_t length);
74
Artem Titovd00ce742021-07-28 18:00:1775 // Reads `length` samples from each channel and writes them interleaved to
76 // `destination`. The total number of elements written to `destination` is
77 // returned, i.e., `length` * number of channels. If the AudioMultiVector
78 // contains less than `length` samples per channel, this is reflected in the
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:2179 // return value.
henrik.lundin@webrtc.orgfd11bbf2013-09-30 20:38:4480 virtual size_t ReadInterleaved(size_t length, int16_t* destination) const;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:2181
Artem Titovd00ce742021-07-28 18:00:1782 // Like ReadInterleaved() above, but reads from `start_index` instead of from
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:2183 // the beginning.
84 virtual size_t ReadInterleavedFromIndex(size_t start_index,
85 size_t length,
henrik.lundin@webrtc.orgfd11bbf2013-09-30 20:38:4486 int16_t* destination) const;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:2187
88 // Like ReadInterleaved() above, but reads from the end instead of from
89 // the beginning.
90 virtual size_t ReadInterleavedFromEnd(size_t length,
henrik.lundin@webrtc.orgfd11bbf2013-09-30 20:38:4491 int16_t* destination) const;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:2192
93 // Overwrites each channel in this AudioMultiVector with values taken from
Artem Titovd00ce742021-07-28 18:00:1794 // `insert_this`. The values are taken from the beginning of `insert_this` and
95 // are inserted starting at `position`. `length` values are written into each
96 // channel. If `length` and `position` are selected such that the new data
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:2197 // extends beyond the end of the current AudioVector, the vector is extended
Artem Titovd00ce742021-07-28 18:00:1798 // to accommodate the new data. `length` is limited to the length of
99 // `insert_this`.
henrik.lundin@webrtc.orgfd11bbf2013-09-30 20:38:44100 virtual void OverwriteAt(const AudioMultiVector& insert_this,
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21101 size_t length,
102 size_t position);
103
Artem Titovd00ce742021-07-28 18:00:17104 // Appends `append_this` to the end of the current vector. Lets the two
105 // vectors overlap by `fade_length` samples (per channel), and cross-fade
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21106 // linearly in this region.
henrik.lundin@webrtc.orgfd11bbf2013-09-30 20:38:44107 virtual void CrossFade(const AudioMultiVector& append_this,
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21108 size_t fade_length);
109
110 // Returns the number of channels.
Karl Wiberg7f6c4d42015-04-09 13:44:22111 virtual size_t Channels() const;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21112
113 // Returns the number of elements per channel in this AudioMultiVector.
114 virtual size_t Size() const;
115
Artem Titovd00ce742021-07-28 18:00:17116 // Verify that each channel can hold at least `required_size` elements. If
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21117 // not, extend accordingly.
118 virtual void AssertSize(size_t required_size);
119
120 virtual bool Empty() const;
121
henrik.lundin@webrtc.org7825b1a2014-09-04 07:39:21122 // Copies the data between two channels in the AudioMultiVector. The method
Artem Titovd00ce742021-07-28 18:00:17123 // does not add any new channel. Thus, `from_channel` and `to_channel` must
henrik.lundin@webrtc.org7825b1a2014-09-04 07:39:21124 // both be valid channel numbers.
125 virtual void CopyChannel(size_t from_channel, size_t to_channel);
126
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21127 // Accesses and modifies a channel (i.e., an AudioVector object) of this
128 // AudioMultiVector.
henrik.lundin@webrtc.org1871dd22013-10-14 20:33:25129 const AudioVector& operator[](size_t index) const;
130 AudioVector& operator[](size_t index);
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21131
132 protected:
henrik.lundin@webrtc.org1871dd22013-10-14 20:33:25133 std::vector<AudioVector*> channels_;
henrik.lundin@webrtc.orge8433eb2013-11-12 13:15:02134 size_t num_channels_;
henrik.lundin@webrtc.orgd94659d2013-01-29 12:09:21135};
136
137} // namespace webrtc
Mirko Bonadei92ea95e2017-09-15 04:47:31138#endif // MODULES_AUDIO_CODING_NETEQ_AUDIO_MULTI_VECTOR_H_