blob: 2a5f29f4f53e2fc53dff1d77280b9a2f3aa52c8b [file] [log] [blame]
aleloi6321b492016-12-05 01:46:09 -08001/*
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 06:47:31 +020011#ifndef AUDIO_UTILITY_AUDIO_FRAME_OPERATIONS_H_
12#define AUDIO_UTILITY_AUDIO_FRAME_OPERATIONS_H_
aleloi6321b492016-12-05 01:46:09 -080013
14#include <stddef.h>
Yves Gerey988cc082018-10-23 12:03:01 +020015#include <stdint.h>
aleloi6321b492016-12-05 01:46:09 -080016
Danil Chapovalove9041612021-02-22 12:43:39 +010017#include "absl/base/attributes.h"
Fredrik Solenbergbbf21a32018-04-12 22:44:09 +020018#include "api/audio/audio_frame.h"
aleloi6321b492016-12-05 01:46:09 -080019
20namespace webrtc {
21
aleloi6321b492016-12-05 01:46:09 -080022// TODO(andrew): consolidate this with utility.h and audio_frame_manipulator.h.
23// Change reference parameters to pointers. Consider using a namespace rather
24// than a class.
25class AudioFrameOperations {
26 public:
Artem Titovb0ea6372021-07-26 11:47:07 +020027 // Add samples in `frame_to_add` with samples in `result_frame`
28 // putting the results in `results_frame`. The fields
29 // `vad_activity_` and `speech_type_` of the result frame are
30 // updated. If `result_frame` is empty (`samples_per_channel_`==0),
31 // the samples in `frame_to_add` are added to it. The number of
aleloi6321b492016-12-05 01:46:09 -080032 // channels and number of samples per channel must match except when
Artem Titovb0ea6372021-07-26 11:47:07 +020033 // `result_frame` is empty.
aleloi6321b492016-12-05 01:46:09 -080034 static void Add(const AudioFrame& frame_to_add, AudioFrame* result_frame);
35
Artem Titovcfea2182021-08-10 01:22:31 +020036 // `frame.num_channels_` will be updated. This version checks for sufficient
Artem Titovb0ea6372021-07-26 11:47:07 +020037 // buffer size and that `num_channels_` is mono. Use UpmixChannels
Alex Loikob4977de2019-01-28 16:38:38 +010038 // instead. TODO(bugs.webrtc.org/8649): remove.
Danil Chapovalove9041612021-02-22 12:43:39 +010039 ABSL_DEPRECATED("bugs.webrtc.org/8649")
40 static int MonoToStereo(AudioFrame* frame);
jens.nielsen228c2682017-03-01 05:11:22 -080041
Artem Titovcfea2182021-08-10 01:22:31 +020042 // `frame.num_channels_` will be updated. This version checks that
Artem Titovb0ea6372021-07-26 11:47:07 +020043 // `num_channels_` is stereo. Use DownmixChannels
Alex Loikob4977de2019-01-28 16:38:38 +010044 // instead. TODO(bugs.webrtc.org/8649): remove.
Danil Chapovalove9041612021-02-22 12:43:39 +010045 ABSL_DEPRECATED("bugs.webrtc.org/8649")
46 static int StereoToMono(AudioFrame* frame);
aleloi6321b492016-12-05 01:46:09 -080047
Artem Titovb0ea6372021-07-26 11:47:07 +020048 // Downmixes 4 channels `src_audio` to stereo `dst_audio`. This is an in-place
49 // operation, meaning `src_audio` and `dst_audio` may point to the same
jens.nielsen228c2682017-03-01 05:11:22 -080050 // buffer.
51 static void QuadToStereo(const int16_t* src_audio,
52 size_t samples_per_channel,
53 int16_t* dst_audio);
54
Artem Titovcfea2182021-08-10 01:22:31 +020055 // `frame.num_channels_` will be updated. This version checks that
Artem Titovb0ea6372021-07-26 11:47:07 +020056 // `num_channels_` is 4 channels.
jens.nielsen228c2682017-03-01 05:11:22 -080057 static int QuadToStereo(AudioFrame* frame);
58
Artem Titovb0ea6372021-07-26 11:47:07 +020059 // Downmixes `src_channels` `src_audio` to `dst_channels` `dst_audio`.
60 // This is an in-place operation, meaning `src_audio` and `dst_audio`
jens.nielsen228c2682017-03-01 05:11:22 -080061 // may point to the same buffer. Supported channel combinations are
62 // Stereo to Mono, Quad to Mono, and Quad to Stereo.
63 static void DownmixChannels(const int16_t* src_audio,
64 size_t src_channels,
65 size_t samples_per_channel,
66 size_t dst_channels,
67 int16_t* dst_audio);
68
Artem Titovcfea2182021-08-10 01:22:31 +020069 // `frame.num_channels_` will be updated. This version checks that
Artem Titovb0ea6372021-07-26 11:47:07 +020070 // `num_channels_` and `dst_channels` are valid and performs relevant downmix.
Alex Loikob4977de2019-01-28 16:38:38 +010071 // Supported channel combinations are N channels to Mono, and Quad to Stereo.
72 static void DownmixChannels(size_t dst_channels, AudioFrame* frame);
73
Artem Titovcfea2182021-08-10 01:22:31 +020074 // `frame.num_channels_` will be updated. This version checks that
Artem Titovb0ea6372021-07-26 11:47:07 +020075 // `num_channels_` and `dst_channels` are valid and performs relevant
Alex Loikob4977de2019-01-28 16:38:38 +010076 // downmix. Supported channel combinations are Mono to N
77 // channels. The single channel is replicated.
78 static void UpmixChannels(size_t target_number_of_channels,
79 AudioFrame* frame);
jens.nielsen228c2682017-03-01 05:11:22 -080080
Artem Titovb0ea6372021-07-26 11:47:07 +020081 // Swap the left and right channels of `frame`. Fails silently if `frame` is
aleloi6321b492016-12-05 01:46:09 -080082 // not stereo.
83 static void SwapStereoChannels(AudioFrame* frame);
84
Artem Titovb0ea6372021-07-26 11:47:07 +020085 // Conditionally zero out contents of `frame` for implementing audio mute:
86 // `previous_frame_muted` && `current_frame_muted` - Zero out whole frame.
87 // `previous_frame_muted` && !`current_frame_muted` - Fade-in at frame start.
88 // !`previous_frame_muted` && `current_frame_muted` - Fade-out at frame end.
89 // !`previous_frame_muted` && !`current_frame_muted` - Leave frame untouched.
aleloi6321b492016-12-05 01:46:09 -080090 static void Mute(AudioFrame* frame,
91 bool previous_frame_muted,
92 bool current_frame_muted);
93
94 // Zero out contents of frame.
95 static void Mute(AudioFrame* frame);
96
Artem Titovb0ea6372021-07-26 11:47:07 +020097 // Halve samples in `frame`.
aleloi6321b492016-12-05 01:46:09 -080098 static void ApplyHalfGain(AudioFrame* frame);
99
oprypin67fdb802017-03-09 06:25:06 -0800100 static int Scale(float left, float right, AudioFrame* frame);
aleloi6321b492016-12-05 01:46:09 -0800101
oprypin67fdb802017-03-09 06:25:06 -0800102 static int ScaleWithSat(float scale, AudioFrame* frame);
aleloi6321b492016-12-05 01:46:09 -0800103};
104
105} // namespace webrtc
106
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200107#endif // AUDIO_UTILITY_AUDIO_FRAME_OPERATIONS_H_