Roc Toolkit internal modules
Roc Toolkit: real-time audio streaming
Toggle main menu visibility
Loading...
Searching...
No Matches
channel_mapper_matrix.h
Go to the documentation of this file.
1
/*
2
* Copyright (c) 2023 Roc Streaming authors
3
*
4
* This Source Code Form is subject to the terms of the Mozilla Public
5
* License, v. 2.0. If a copy of the MPL was not distributed with this
6
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
7
*/
8
9
//! @file roc_audio/channel_mapper_matrix.h
10
//! @brief Channel mapping matrix.
11
12
#ifndef ROC_AUDIO_CHANNEL_MAPPER_MATRIX_H_
13
#define ROC_AUDIO_CHANNEL_MAPPER_MATRIX_H_
14
15
#include "
roc_audio/channel_defs.h
"
16
#include "
roc_audio/channel_set.h
"
17
#include "
roc_audio/channel_tables.h
"
18
#include "
roc_core/noncopyable.h
"
19
20
namespace
roc
{
21
namespace
audio
{
22
23
//! Channel mapping matrix.
24
//!
25
//! Used for mapping between two surround layouts. Not used if one or both
26
//! layouts are multitrack.
27
//!
28
//! In surround mapping, every output channel is calculated as a sum of every
29
//! input channel multiplied by a coefficient from this matrix.
30
//!
31
//! Matrix coefficients are defined for physical channel indices in frame,
32
//! e.g. coeff(1, 2) defines coefficient for second channel in output frame
33
//! and third channel in input frame, no matter what is the logical position
34
//! of the channels (L, R, ...).
35
//!
36
//! This allows to use this matrix not just for mapping between different
37
//! channel masks, but also for different channel orders, in one operation.
38
class
ChannelMapperMatrix :
public
core::NonCopyable
<> {
39
public
:
40
ChannelMapperMatrix();
41
42
//! Build matrix.
43
//! @remarks
44
//! Builds matrix based on three tables:
45
//! - two channel order tables
46
//! (define order of input and output channels)
47
//! - channel mapping table
48
//! (defines mapping coefficients between input and output channels)
49
void
build
(
const
ChannelSet
& in_chans,
const
ChannelSet
& out_chans);
50
51
//! Returns coefficient for a pair of input and output indices.
52
//! @remarks
53
//! @p out_index and @p in_index define physical channel offsets
54
//! in audio frame, not their logical positions.
55
sample_t
coeff
(
size_t
out_index,
size_t
in_index)
const
{
56
return
index_matrix_[out_index][in_index];
57
}
58
59
private
:
60
// Mapping of physical index in frame <=> logical channel position.
61
// We create one index map for input and one for output.
62
struct
IndexMap {
63
ChannelSet
enabled_chans;
64
size_t
chan_2_index[
ChanPos_Max
];
65
ChannelPosition
index_2_chan[
ChanPos_Max
];
66
67
IndexMap() {
68
memset(chan_2_index, 0,
sizeof
(chan_2_index));
69
memset(index_2_chan, 0,
sizeof
(index_2_chan));
70
}
71
};
72
73
// Mapping matrix for downmixing or upmixing from input to output.
74
// Uses logical channel positions.
75
struct
ChannelMap {
76
sample_t
chan_matrix[
ChanPos_Max
][
ChanPos_Max
];
77
78
ChannelMap() {
79
memset(chan_matrix, 0,
sizeof
(chan_matrix));
80
}
81
};
82
83
void
build_index_mapping_(IndexMap& index_map,
const
ChannelSet& ch_set);
84
85
bool
build_channel_mapping_(ChannelMap& result_map,
86
const
ChannelSet& in_chans,
87
const
ChannelSet& out_chans);
88
89
bool
can_downmix_(
const
ChannelSet& in_chans,
const
ChannelSet& out_chans);
90
91
const
ChannelMapTable* next_downmix_table_(
const
ChannelSet& in_chans,
92
const
ChannelSet& out_chans);
93
const
ChannelMapTable* next_upmix_table_(
const
ChannelSet& in_chans,
94
const
ChannelSet& out_chans);
95
96
void
fill_mapping_from_table_(ChannelMap& result_map,
97
const
ChannelMapTable& map_table,
98
bool
is_downmixing,
99
const
ChannelSet& in_chans,
100
const
ChannelSet& out_chans);
101
102
void
fill_fallback_mapping_(ChannelMap& result_map,
103
const
ChannelSet& in_chans,
104
const
ChannelSet& out_chans);
105
106
void
combine_mappings_(ChannelMap& result_map,
const
ChannelMap& next_map);
107
void
normalize_mapping_(ChannelMap& chan_map);
108
109
void
populate_index_matrix_(
const
IndexMap& in_index_map,
110
const
IndexMap& out_index_map,
111
const
ChannelMap& chan_map);
112
113
void
print_table_matrix_(
const
ChannelMap& chan_map);
114
void
print_index_matrix_(
const
IndexMap& in_index_map,
const
IndexMap& out_index_map);
115
116
sample_t
index_matrix_[
ChanPos_Max
][
ChanPos_Max
];
117
};
118
119
}
// namespace audio
120
}
// namespace roc
121
122
#endif
// ROC_AUDIO_CHANNEL_MAPPER_MATRIX_H_
channel_defs.h
Channel layout, order, and positions.
channel_set.h
Channel set.
channel_tables.h
Channel tables.
roc::audio::ChannelMapperMatrix::coeff
sample_t coeff(size_t out_index, size_t in_index) const
Returns coefficient for a pair of input and output indices.
Definition
channel_mapper_matrix.h:55
roc::audio::ChannelMapperMatrix::build
void build(const ChannelSet &in_chans, const ChannelSet &out_chans)
Build matrix.
roc::audio::ChannelSet
Channel set. Multi-word bitmask with bits corresponding to enabled channels. Meaning of each channel ...
Definition
channel_set.h:26
roc::core::NonCopyable
Base class for non-copyable objects.
Definition
noncopyable.h:23
roc::audio
Audio frames and audio processing.
roc::audio::ChannelPosition
ChannelPosition
Surround channel position.
Definition
channel_defs.h:86
roc::audio::ChanPos_Max
@ ChanPos_Max
Maximum value of enum.
Definition
channel_defs.h:141
roc::audio::sample_t
float sample_t
Raw audio sample.
Definition
sample.h:22
roc
Root namespace.
noncopyable.h
Non-copyable object.
roc_audio
channel_mapper_matrix.h
Generated by
1.17.0