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