• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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