1 /*
2 * Copyright (c) 2024, Alliance for Open Media. All rights reserved
3 *
4 * This source code is subject to the terms of the BSD 3-Clause Clear License
5 * and the Alliance for Open Media Patent License 1.0. If the BSD 3-Clause Clear
6 * License was not distributed with this source code in the LICENSE file, you
7 * can obtain it at www.aomedia.org/license/software-license/bsd-3-c-c. If the
8 * Alliance for Open Media Patent License 1.0 was not distributed with this
9 * source code in the PATENTS file, you can obtain it at
10 * www.aomedia.org/license/patent.
11 */
12
13 #include "iamf/cli/proto_conversion/channel_label_utils.h"
14
15 #include <array>
16 #include <utility>
17
18 #include "absl/status/statusor.h"
19 #include "absl/strings/string_view.h"
20 #include "iamf/cli/channel_label.h"
21 #include "iamf/cli/proto/audio_frame.pb.h"
22 #include "iamf/common/utils/map_utils.h"
23
24 namespace iamf_tools {
25 namespace {
26
27 using enum iamf_tools_cli_proto::ChannelLabel;
28 using enum ChannelLabel::Label;
29
30 constexpr auto kProtoAndInternalLabel = std::to_array<
31 std::pair<iamf_tools_cli_proto::ChannelLabel, ChannelLabel::Label>>({
32 {CHANNEL_LABEL_MONO, kMono}, {CHANNEL_LABEL_L_2, kL2},
33 {CHANNEL_LABEL_R_2, kR2}, {CHANNEL_LABEL_CENTRE, kCentre},
34 {CHANNEL_LABEL_LFE, kLFE}, {CHANNEL_LABEL_L_3, kL3},
35 {CHANNEL_LABEL_R_3, kR3}, {CHANNEL_LABEL_LTF_3, kLtf3},
36 {CHANNEL_LABEL_RTF_3, kRtf3}, {CHANNEL_LABEL_L_5, kL5},
37 {CHANNEL_LABEL_R_5, kR5}, {CHANNEL_LABEL_LS_5, kLs5},
38 {CHANNEL_LABEL_RS_5, kRs5}, {CHANNEL_LABEL_LTF_2, kLtf2},
39 {CHANNEL_LABEL_RTF_2, kRtf2}, {CHANNEL_LABEL_LTF_4, kLtf4},
40 {CHANNEL_LABEL_RTF_4, kRtf4}, {CHANNEL_LABEL_LTB_4, kLtb4},
41 {CHANNEL_LABEL_RTB_4, kRtb4}, {CHANNEL_LABEL_L_7, kL7},
42 {CHANNEL_LABEL_R_7, kR7}, {CHANNEL_LABEL_LSS_7, kLss7},
43 {CHANNEL_LABEL_RSS_7, kRss7}, {CHANNEL_LABEL_LRS_7, kLrs7},
44 {CHANNEL_LABEL_RRS_7, kRrs7}, {CHANNEL_LABEL_FLC, kFLc},
45 {CHANNEL_LABEL_FC, kFC}, {CHANNEL_LABEL_FRC, kFRc},
46 {CHANNEL_LABEL_FL, kFL}, {CHANNEL_LABEL_FR, kFR},
47 {CHANNEL_LABEL_SI_L, kSiL}, {CHANNEL_LABEL_SI_R, kSiR},
48 {CHANNEL_LABEL_BL, kBL}, {CHANNEL_LABEL_BR, kBR},
49 {CHANNEL_LABEL_TP_FL, kTpFL}, {CHANNEL_LABEL_TP_FR, kTpFR},
50 {CHANNEL_LABEL_TP_SI_L, kTpSiL}, {CHANNEL_LABEL_TP_SI_R, kTpSiR},
51 {CHANNEL_LABEL_TP_BL, kTpBL}, {CHANNEL_LABEL_TP_BR, kTpBR},
52 {CHANNEL_LABEL_A_0, kA0}, {CHANNEL_LABEL_A_1, kA1},
53 {CHANNEL_LABEL_A_2, kA2}, {CHANNEL_LABEL_A_3, kA3},
54 {CHANNEL_LABEL_A_4, kA4}, {CHANNEL_LABEL_A_5, kA5},
55 {CHANNEL_LABEL_A_6, kA6}, {CHANNEL_LABEL_A_7, kA7},
56 {CHANNEL_LABEL_A_8, kA8}, {CHANNEL_LABEL_A_9, kA9},
57 {CHANNEL_LABEL_A_10, kA10}, {CHANNEL_LABEL_A_11, kA11},
58 {CHANNEL_LABEL_A_12, kA12}, {CHANNEL_LABEL_A_13, kA13},
59 {CHANNEL_LABEL_A_14, kA14}, {CHANNEL_LABEL_A_15, kA15},
60 {CHANNEL_LABEL_A_16, kA16}, {CHANNEL_LABEL_A_17, kA17},
61 {CHANNEL_LABEL_A_18, kA18}, {CHANNEL_LABEL_A_19, kA19},
62 {CHANNEL_LABEL_A_20, kA20}, {CHANNEL_LABEL_A_21, kA21},
63 {CHANNEL_LABEL_A_22, kA22}, {CHANNEL_LABEL_A_23, kA23},
64 {CHANNEL_LABEL_A_24, kA24},
65 });
66 } // namespace
67
ProtoToLabel(iamf_tools_cli_proto::ChannelLabel proto_label)68 absl::StatusOr<ChannelLabel::Label> ChannelLabelUtils::ProtoToLabel(
69 iamf_tools_cli_proto::ChannelLabel proto_label) {
70 static const auto kProtoToLabel =
71 BuildStaticMapFromPairs(kProtoAndInternalLabel);
72
73 return LookupInMap(*kProtoToLabel, proto_label,
74 "Internal version of proto `ChannelLabel`");
75 }
76
77 absl::StatusOr<iamf_tools_cli_proto::ChannelLabel>
LabelToProto(ChannelLabel::Label label)78 ChannelLabelUtils::LabelToProto(ChannelLabel::Label label) {
79 static const auto kLabelToProto =
80 BuildStaticMapFromInvertedPairs(kProtoAndInternalLabel);
81
82 return LookupInMap(*kLabelToProto, label,
83 "Proto version of internal `ChannelLabel`");
84 }
85
86 } // namespace iamf_tools
87