1 /*
2  * Copyright (C) 2018 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 // #define LOG_NDEBUG 0
18 #define LOG_TAG "AudioPresentationInfo"
19 
20 #include <vector>
21 
22 #include "AudioPresentationInfo.h"
23 
24 #include <utils/Log.h>
25 
26 namespace android {
27 
serializeAudioPresentations(const AudioPresentationCollection & presentations,std::ostream * serializedOutput)28 void serializeAudioPresentations(const AudioPresentationCollection& presentations,
29         std::ostream* serializedOutput) {
30     uint32_t numPresentations = presentations.size();
31     serializedOutput->write(reinterpret_cast<char*>(&numPresentations), sizeof(numPresentations));
32     for (const auto& ap : presentations) {
33         if (ap.mVersion == PRESENTATION_VERSION_1) {
34             serializedOutput->write(
35                     const_cast<char*>(reinterpret_cast<const char*>(&ap.mVersion)),
36                     sizeof(ap.mVersion));
37             serializedOutput->write(
38                     const_cast<char*>(reinterpret_cast<const char*>(&ap.mPresentationId)),
39                     sizeof(ap.mPresentationId));
40             serializedOutput->write(
41                     const_cast<char*>(reinterpret_cast<const char*>(&ap.mProgramId)),
42                     sizeof(ap.mProgramId));
43 
44             uint32_t numLabels = ap.mLabels.size();
45             serializedOutput->write(
46                     const_cast<char*>(reinterpret_cast<const char*>(&numLabels)),
47                     sizeof(numLabels));
48             for (const auto& label : ap.mLabels) {
49                 uint32_t labelKeySize = label.first.size();
50                 serializedOutput->write(
51                         const_cast<char*>(reinterpret_cast<const char*>(&labelKeySize)),
52                         sizeof(labelKeySize));
53                 serializedOutput->write(label.first.c_str(), labelKeySize);
54 
55                 uint32_t labelValSize = label.second.size();
56                 serializedOutput->write(
57                         const_cast<char*>(reinterpret_cast<const char*>(&labelValSize)),
58                         sizeof(labelValSize));
59                 serializedOutput->write(label.second.c_str(), labelValSize);
60             }
61 
62             uint32_t langSize = ap.mLanguage.size();
63             serializedOutput->write(
64                     const_cast<char*>(reinterpret_cast<const char*>(&langSize)),
65                     sizeof(langSize));
66             serializedOutput->write(ap.mLanguage.c_str(), langSize);
67 
68             serializedOutput->write(
69                     const_cast<char*>(reinterpret_cast<const char*>(&ap.mMasteringIndication)),
70                     sizeof(ap.mMasteringIndication));
71             serializedOutput->write(
72                     const_cast<char*>(reinterpret_cast<const char*>(&ap.mAudioDescriptionAvailable)),
73                     sizeof(ap.mAudioDescriptionAvailable));
74             serializedOutput->write(
75                     const_cast<char*>(reinterpret_cast<const char*>(&ap.mSpokenSubtitlesAvailable)),
76                     sizeof(ap.mSpokenSubtitlesAvailable));
77             serializedOutput->write(
78                     const_cast<char*>(reinterpret_cast<const char*>(&ap.mDialogueEnhancementAvailable)),
79                     sizeof(ap.mDialogueEnhancementAvailable));
80         }
81     }
82 }
83 
deserializeAudioPresentations(std::istream * serializedInput,AudioPresentationCollection * presentations)84 status_t deserializeAudioPresentations(std::istream* serializedInput,
85         AudioPresentationCollection *presentations) {
86     uint32_t numPresentations;
87     serializedInput->read(reinterpret_cast<char*>(&numPresentations), sizeof(numPresentations));
88     for (uint32_t i = 0; i < numPresentations; ++i) {
89         uint32_t version;
90         serializedInput->read(reinterpret_cast<char*>(&version), sizeof(version));
91         if (version == PRESENTATION_VERSION_1) {
92             AudioPresentationV1 ap;
93             serializedInput->read(
94                     reinterpret_cast<char*>(&ap.mPresentationId),
95                     sizeof(ap.mPresentationId));
96             serializedInput->read(reinterpret_cast<char*>(&ap.mProgramId), sizeof(ap.mProgramId));
97 
98             uint32_t numLabels;
99             serializedInput->read(reinterpret_cast<char*>(&numLabels), sizeof(numLabels));
100             for (uint32_t j = 0; j < numLabels; ++j) {
101                 uint32_t labelKeySize;
102                 serializedInput->read(reinterpret_cast<char*>(&labelKeySize), sizeof(labelKeySize));
103                 std::vector<char> labelKey(labelKeySize);
104                 serializedInput->read(labelKey.data(), labelKeySize);
105 
106                 uint32_t labelValSize;
107                 serializedInput->read(reinterpret_cast<char*>(&labelValSize), sizeof(labelValSize));
108                 std::vector<char> labelVal(labelValSize);
109                 serializedInput->read(labelVal.data(), labelValSize);
110                 ap.mLabels.emplace(
111                         std::string(reinterpret_cast<char*>(labelKey.data()), labelKeySize),
112                         std::string(reinterpret_cast<char*>(labelVal.data()), labelValSize));
113             }
114             uint32_t languageSize;
115             serializedInput->read(reinterpret_cast<char*>(&languageSize), sizeof(languageSize));
116             std::vector<char> language(languageSize);
117             serializedInput->read(language.data(), languageSize);
118             ap.mLanguage = std::string(reinterpret_cast<char*>(language.data()), languageSize);
119             serializedInput->read(reinterpret_cast<char*>(&ap.mMasteringIndication),
120                                  sizeof(ap.mMasteringIndication));
121             serializedInput->read(reinterpret_cast<char*>(&ap.mAudioDescriptionAvailable),
122                                  sizeof(ap.mAudioDescriptionAvailable));
123             serializedInput->read(reinterpret_cast<char*>(&ap.mSpokenSubtitlesAvailable),
124                                  sizeof(ap.mSpokenSubtitlesAvailable));
125             serializedInput->read(reinterpret_cast<char*>(&ap.mDialogueEnhancementAvailable),
126                                  sizeof(ap.mDialogueEnhancementAvailable));
127             presentations->push_back(std::move(ap));
128         } else {
129             ALOGE("Audio presentation info version is not supported");
130             return INVALID_OPERATION;
131         }
132     }
133     return OK;
134 }
135 
136 }  // namespace android
137