1 /*
2 * Copyright 2017, 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 #include <ios>
18 #include <list>
19
20 #include <android-base/logging.h>
21
22 #include <media/stagefright/omx/1.0/Conversion.h>
23 #include <media/stagefright/omx/1.0/OmxStore.h>
24 #include <media/stagefright/xmlparser/MediaCodecsXmlParser.h>
25
26 namespace android {
27 namespace hardware {
28 namespace media {
29 namespace omx {
30 namespace V1_0 {
31 namespace implementation {
32
OmxStore(const char * owner,const char * const * searchDirs,const char * mainXmlName,const char * performanceXmlName,const char * profilingResultsXmlPath)33 OmxStore::OmxStore(
34 const char* owner,
35 const char* const* searchDirs,
36 const char* mainXmlName,
37 const char* performanceXmlName,
38 const char* profilingResultsXmlPath) {
39 MediaCodecsXmlParser parser(searchDirs,
40 mainXmlName,
41 performanceXmlName,
42 profilingResultsXmlPath);
43 mParsingStatus = toStatus(parser.getParsingStatus());
44
45 const auto& serviceAttributeMap = parser.getServiceAttributeMap();
46 mServiceAttributeList.resize(serviceAttributeMap.size());
47 size_t i = 0;
48 for (const auto& attributePair : serviceAttributeMap) {
49 ServiceAttribute attribute;
50 attribute.key = attributePair.first;
51 attribute.value = attributePair.second;
52 mServiceAttributeList[i] = std::move(attribute);
53 ++i;
54 }
55
56 const auto& roleMap = parser.getRoleMap();
57 mRoleList.resize(roleMap.size());
58 i = 0;
59 for (const auto& rolePair : roleMap) {
60 RoleInfo role;
61 role.role = rolePair.first;
62 role.type = rolePair.second.type;
63 role.isEncoder = rolePair.second.isEncoder;
64 // TODO: Currently, preferPlatformNodes information is not available in
65 // the xml file. Once we have a way to provide this information, it
66 // should be parsed properly.
67 role.preferPlatformNodes = rolePair.first.compare(0, 5, "audio") == 0;
68 hidl_vec<NodeInfo>& nodeList = role.nodes;
69 nodeList.resize(rolePair.second.nodeList.size());
70 size_t j = 0;
71 for (const auto& nodePair : rolePair.second.nodeList) {
72 NodeInfo node;
73 node.name = nodePair.second.name;
74 node.owner = owner;
75 hidl_vec<NodeAttribute>& attributeList = node.attributes;
76 attributeList.resize(nodePair.second.attributeList.size());
77 size_t k = 0;
78 for (const auto& attributePair : nodePair.second.attributeList) {
79 NodeAttribute attribute;
80 attribute.key = attributePair.first;
81 attribute.value = attributePair.second;
82 attributeList[k] = std::move(attribute);
83 ++k;
84 }
85 nodeList[j] = std::move(node);
86 ++j;
87 }
88 mRoleList[i] = std::move(role);
89 ++i;
90 }
91
92 mPrefix = parser.getCommonPrefix();
93 }
94
~OmxStore()95 OmxStore::~OmxStore() {
96 }
97
listServiceAttributes(listServiceAttributes_cb _hidl_cb)98 Return<void> OmxStore::listServiceAttributes(listServiceAttributes_cb _hidl_cb) {
99 if (mParsingStatus == Status::NO_ERROR) {
100 _hidl_cb(Status::NO_ERROR, mServiceAttributeList);
101 } else {
102 _hidl_cb(mParsingStatus, hidl_vec<ServiceAttribute>());
103 }
104 return Void();
105 }
106
getNodePrefix(getNodePrefix_cb _hidl_cb)107 Return<void> OmxStore::getNodePrefix(getNodePrefix_cb _hidl_cb) {
108 _hidl_cb(mPrefix);
109 return Void();
110 }
111
listRoles(listRoles_cb _hidl_cb)112 Return<void> OmxStore::listRoles(listRoles_cb _hidl_cb) {
113 _hidl_cb(mRoleList);
114 return Void();
115 }
116
getOmx(hidl_string const & omxName)117 Return<sp<IOmx>> OmxStore::getOmx(hidl_string const& omxName) {
118 return IOmx::tryGetService(omxName);
119 }
120
121 } // namespace implementation
122 } // namespace V1_0
123 } // namespace omx
124 } // namespace media
125 } // namespace hardware
126 } // namespace android
127