blob: 43bb1a565eb038c3afb246427f9476090de89e77 [file] [log] [blame]
/*
* Copyright (c) 2024, Alliance for Open Media. All rights reserved
*
* This source code is subject to the terms of the BSD 3-Clause Clear License
* and the Alliance for Open Media Patent License 1.0. If the BSD 3-Clause Clear
* License was not distributed with this source code in the LICENSE file, you
* can obtain it at www.aomedia.org/license/software-license/bsd-3-c-c. If the
* Alliance for Open Media Patent License 1.0 was not distributed with this
* source code in the PATENTS file, you can obtain it at
* www.aomedia.org/license/patent.
*/
#ifndef CLI_CHANNEL_LABEL_H_
#define CLI_CHANNEL_LABEL_H_
#include <optional>
#include <string>
#include <vector>
#include "absl/container/flat_hash_set.h"
#include "absl/status/statusor.h"
#include "absl/strings/string_view.h"
#include "iamf/obu/audio_element.h"
#include "iamf/obu/recon_gain_info_parameter_data.h"
namespace iamf_tools {
/*!\brief Enums and static functions to help process channel labels.*/
class ChannelLabel {
public:
/*!\brief Labels associated with input or output channels.
*
* Labels naming conventions are based on the IAMF spec
* (https://aomediacodec.github.io/iamf/#processing-downmixmatrix,
* https://aomediacodec.github.io/iamf/#iamfgeneration-scalablechannelaudio-downmixmechanism).
*/
enum Label {
kOmitted,
// Mono channels.
kMono,
// Stereo or binaural channels.
kL2,
kR2,
kDemixedR2,
// Centre channel common to several layouts (e.g. 3.1.2, 5.x.y, 7.x.y).
kCentre,
// LFE channel common to several layouts (e.g. 3.1.2, 5.1.y, 7.1.y, 9.1.6).
kLFE,
// 3.1.2 surround channels.
kL3,
kR3,
kLtf3,
kRtf3,
kDemixedL3,
kDemixedR3,
// 5.x.y surround channels.
kL5,
kR5,
kLs5,
kRs5,
kDemixedL5,
kDemixedR5,
kDemixedLs5,
kDemixedRs5,
// Common channels between 5.1.2 and 7.1.2.
kLtf2,
kRtf2,
kDemixedLtf2,
kDemixedRtf2,
// Common channels between 5.1.4 and 7.1.4.
kLtf4,
kRtf4,
kLtb4,
kRtb4,
kDemixedLtb4,
kDemixedRtb4,
// 7.x.y surround channels.
kL7,
kR7,
kLss7,
kRss7,
kLrs7,
kRrs7,
kDemixedL7,
kDemixedR7,
kDemixedLrs7,
kDemixedRrs7,
// 9.1.6 surround channels.
kFLc,
kFC,
kFRc,
kFL,
kFR,
kSiL,
kSiR,
kBL,
kBR,
kTpFL,
kTpFR,
kTpSiL,
kTpSiR,
kTpBL,
kTpBR,
// Ambisonics channels.
kA0,
kA1,
kA2,
kA3,
kA4,
kA5,
kA6,
kA7,
kA8,
kA9,
kA10,
kA11,
kA12,
kA13,
kA14,
kA15,
kA16,
kA17,
kA18,
kA19,
kA20,
kA21,
kA22,
kA23,
kA24,
};
template <typename Sink>
friend void AbslStringify(Sink& sink, Label e) {
sink.Append(LabelToStringForDebugging(e));
}
/*!\brief Converts the `Label` to a debugging string.
*
* \param label Label to convert.
* \return Converted label.
*/
static std::string LabelToStringForDebugging(Label label);
/*!\brief Gets the channel label for an ambisonics channel number.
*
* \param ambisonics_channel_number Ambisonics channel number to get the label
* of.
* \return Converted label. A specific status on failure.
*/
static absl::StatusOr<Label> AmbisonicsChannelNumberToLabel(
int ambisonics_channel_number);
/*!\brief Returns the demixed version of a channel label.
*
* \param label Label to get the demixed version of.
* \return Converted label on success. A specific status if the channel is not
* suitable for demixing. A specific status on other failures.
*/
static absl::StatusOr<Label> GetDemixedLabel(Label label);
/*!\brief Gets the channel ordering to use for the associated input layout.
*
* The output is ordered to agree with the "precomputed" EAR matrices. Certain
* layouts are based on other layouts. The channels which are excluded are
* represented by `ChannelLabel::Label::kOmitted`.
*
* \param loudspeaker_layout Layout to get the channel ordering from.
* \param expanded_loudspeaker_layout Associated expanded loudspeaker layout
* or `std::nullopt` when it is not relevant.
* \return Channel ordering associated with the layout if known. Or a specific
* status on failure.
*/
static absl::StatusOr<std::vector<ChannelLabel::Label>>
LookupEarChannelOrderFromScalableLoudspeakerLayout(
ChannelAudioLayerConfig::LoudspeakerLayout loudspeaker_layout,
const std::optional<ChannelAudioLayerConfig::ExpandedLoudspeakerLayout>&
expanded_loudspeaker_layout);
/*!\brief Gets the labels related to reconstructing the input layout.
*
* Returns the labels that may be needed to reconstruct the
* `loudspeaker_layout`. This function is useful when audio frames represent
* channels which do agree with the `loudspeaker_layout`. Usually this occurs
* when there are multiple layers in a scalable channel audio element.
*
* \param loudspeaker_layout Layout to get the labels to reconstruct from.
* \param expanded_loudspeaker_layout Associated expanded loudspeaker layout
* or `std::nullopt` when it is not relevant.
* \return Labels to reconstruct the associated layout if known. Or a specific
* status on failure.
*/
static absl::StatusOr<absl::flat_hash_set<ChannelLabel::Label>>
LookupLabelsToReconstructFromScalableLoudspeakerLayout(
ChannelAudioLayerConfig::LoudspeakerLayout loudspeaker_layout,
const std::optional<ChannelAudioLayerConfig::ExpandedLoudspeakerLayout>&
expanded_loudspeaker_layout);
/*!\brief Gets the demixed labels for a given recon gain flag and layout.
*
* \param loudspeaker_layout Layout of the layer to get the labels from.
* \param recon_gain_flag Specifies the recon gain to get the labels for.
* \return Demixed channel labels. Or a specific status on failure.
*/
static absl::StatusOr<ChannelLabel::Label> GetDemixedChannelLabelForReconGain(
const ChannelAudioLayerConfig::LoudspeakerLayout& layout,
const ReconGainElement::ReconGainFlagBitmask& recon_gain_flag);
/*!\brief Converts the input string to a `Label`.
*
* Used only to support the deprecated `AudioFrameObuMetadata.channel_labels`
* field.
*
* Channel Labels, e.g. "L2", "Ls5". For ambisonics, use "A{ACN number}",
* e.g. "A0", "A13", but prefer using `AmbisonicsChannelNumberToLabel()`
* instead.
*
* \param label Label to convert.
* \return Converted label on success. A specific status on failure.
*/
// TODO(b/330558209): Remove when `AudioFrameObuMetadata.channel_labels` is
// removed.
static absl::StatusOr<Label> DeprecatedStringBasedLabelToLabel(
absl::string_view label);
};
} // namespace iamf_tools
#endif // CLI_CHANNEL_LABEL_H_