16ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa/* 26ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa * Copyright 2017, The Android Open Source Project 36ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa * 46ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa * Licensed under the Apache License, Version 2.0 (the "License"); 56ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa * you may not use this file except in compliance with the License. 66ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa * You may obtain a copy of the License at 76ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa * 86ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa * http://www.apache.org/licenses/LICENSE-2.0 96ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa * 106ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa * Unless required by applicable law or agreed to in writing, software 116ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa * distributed under the License is distributed on an "AS IS" BASIS, 126ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa * See the License for the specific language governing permissions and 146ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa * limitations under the License. 156ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa */ 166ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 176ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa//#define LOG_NDEBUG 0 186ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa#define LOG_TAG "MediaCodecsXmlParser" 196ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa#include <utils/Log.h> 206ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 216ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa#include <media/vndk/xmlparser/1.0/MediaCodecsXmlParser.h> 226ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 236ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa#include <media/MediaCodecInfo.h> 246ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 256ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa#include <media/stagefright/foundation/ADebug.h> 266ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa#include <media/stagefright/foundation/AMessage.h> 276ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa#include <media/stagefright/foundation/AUtils.h> 286ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa#include <media/stagefright/MediaErrors.h> 296ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 306ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa#include <sys/stat.h> 316ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 326ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa#include <expat.h> 336ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa#include <string> 346ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 356ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa#define MEDIA_CODECS_CONFIG_FILE_PATH_MAX_LENGTH 256 366ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 376ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasanamespace android { 386ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 396ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasanamespace { // Local variables and functions 406ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 416ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasaconst char *kProfilingResults = 426ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa "/data/misc/media/media_codecs_profiling_results.xml"; 436ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 446ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa// Treblized media codec list will be located in /odm/etc or /vendor/etc. 456ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasaconst char *kConfigLocationList[] = 466ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa {"/odm/etc", "/vendor/etc", "/etc"}; 476ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasaconstexpr int kConfigLocationListSize = 486ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa (sizeof(kConfigLocationList) / sizeof(kConfigLocationList[0])); 496ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 506ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasabool findMediaCodecListFileFullPath( 516ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa const char *file_name, std::string *out_path) { 526ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa for (int i = 0; i < kConfigLocationListSize; i++) { 536ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa *out_path = std::string(kConfigLocationList[i]) + "/" + file_name; 546ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa struct stat file_stat; 556ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (stat(out_path->c_str(), &file_stat) == 0 && 566ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa S_ISREG(file_stat.st_mode)) { 576ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return true; 586ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 596ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 606ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return false; 616ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa} 626ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 636ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa// Find TypeInfo by name. 646ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasastd::vector<TypeInfo>::iterator findTypeInfo( 656ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa CodecInfo &codecInfo, const AString &typeName) { 666ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return std::find_if( 676ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa codecInfo.mTypes.begin(), codecInfo.mTypes.end(), 686ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa [typeName](const auto &typeInfo) { 696ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return typeInfo.mName == typeName; 706ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa }); 716ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa} 726ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 736ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa// Convert a string into a boolean value. 746ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasabool ParseBoolean(const char *s) { 756ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (!strcasecmp(s, "true") || !strcasecmp(s, "yes") || !strcasecmp(s, "y")) { 766ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return true; 776ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 786ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa char *end; 796ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa unsigned long res = strtoul(s, &end, 10); 806ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return *s != '\0' && *end == '\0' && res > 0; 816ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa} 826ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 836ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa} // unnamed namespace 846ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 856ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin VongmasaMediaCodecsXmlParser::MediaCodecsXmlParser() : 866ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mInitCheck(NO_INIT), 876ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mUpdate(false) { 886ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa std::string config_file_path; 896ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (findMediaCodecListFileFullPath( 906ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa "media_codecs.xml", &config_file_path)) { 916ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa parseTopLevelXMLFile(config_file_path.c_str(), false); 926ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } else { 936ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mInitCheck = NAME_NOT_FOUND; 946ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 956ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (findMediaCodecListFileFullPath( 966ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa "media_codecs_performance.xml", &config_file_path)) { 976ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa parseTopLevelXMLFile(config_file_path.c_str(), true); 986ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 996ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa parseTopLevelXMLFile(kProfilingResults, true); 1006ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa} 1016ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 1026ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasavoid MediaCodecsXmlParser::parseTopLevelXMLFile( 1036ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa const char *codecs_xml, bool ignore_errors) { 1046ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa // get href_base 1056ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa const char *href_base_end = strrchr(codecs_xml, '/'); 1066ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (href_base_end != NULL) { 1076ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mHrefBase = AString(codecs_xml, href_base_end - codecs_xml + 1); 1086ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 1096ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 1106ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mInitCheck = OK; // keeping this here for safety 1116ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mCurrentSection = SECTION_TOPLEVEL; 1126ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mDepth = 0; 1136ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 1146ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa parseXMLFile(codecs_xml); 1156ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 1166ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (mInitCheck != OK) { 1176ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (ignore_errors) { 1186ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mInitCheck = OK; 1196ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return; 1206ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 1216ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mCodecInfos.clear(); 1226ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return; 1236ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 1246ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa} 1256ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 1266ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin VongmasaMediaCodecsXmlParser::~MediaCodecsXmlParser() { 1276ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa} 1286ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 1296ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasastatus_t MediaCodecsXmlParser::initCheck() const { 1306ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return mInitCheck; 1316ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa} 1326ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 1336ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasavoid MediaCodecsXmlParser::parseXMLFile(const char *path) { 1346ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa FILE *file = fopen(path, "r"); 1356ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 1366ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (file == NULL) { 1376ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ALOGW("unable to open media codecs configuration xml file: %s", path); 1386ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mInitCheck = NAME_NOT_FOUND; 1396ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return; 1406ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 1416ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 1426ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ALOGV("Start parsing %s", path); 1436ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa XML_Parser parser = ::XML_ParserCreate(NULL); 1446ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa CHECK(parser != NULL); 1456ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 1466ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ::XML_SetUserData(parser, this); 1476ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ::XML_SetElementHandler( 1486ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa parser, StartElementHandlerWrapper, EndElementHandlerWrapper); 1496ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 1506ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa const int BUFF_SIZE = 512; 1516ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa while (mInitCheck == OK) { 1526ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa void *buff = ::XML_GetBuffer(parser, BUFF_SIZE); 1536ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (buff == NULL) { 1546ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ALOGE("failed in call to XML_GetBuffer()"); 1556ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mInitCheck = UNKNOWN_ERROR; 1566ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa break; 1576ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 1586ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 1596ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa int bytes_read = ::fread(buff, 1, BUFF_SIZE, file); 1606ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (bytes_read < 0) { 1616ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ALOGE("failed in call to read"); 1626ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mInitCheck = ERROR_IO; 1636ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa break; 1646ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 1656ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 1666ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa XML_Status status = ::XML_ParseBuffer(parser, bytes_read, bytes_read == 0); 1676ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (status != XML_STATUS_OK) { 1686ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ALOGE("malformed (%s)", ::XML_ErrorString(::XML_GetErrorCode(parser))); 1696ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mInitCheck = ERROR_MALFORMED; 1706ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa break; 1716ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 1726ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 1736ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (bytes_read == 0) { 1746ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa break; 1756ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 1766ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 1776ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 1786ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ::XML_ParserFree(parser); 1796ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 1806ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa fclose(file); 1816ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa file = NULL; 1826ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa} 1836ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 1846ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa// static 1856ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasavoid MediaCodecsXmlParser::StartElementHandlerWrapper( 1866ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa void *me, const char *name, const char **attrs) { 1876ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa static_cast<MediaCodecsXmlParser *>(me)->startElementHandler(name, attrs); 1886ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa} 1896ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 1906ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa// static 1916ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasavoid MediaCodecsXmlParser::EndElementHandlerWrapper(void *me, const char *name) { 1926ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa static_cast<MediaCodecsXmlParser *>(me)->endElementHandler(name); 1936ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa} 1946ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 1956ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasastatus_t MediaCodecsXmlParser::includeXMLFile(const char **attrs) { 1966ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa const char *href = NULL; 1976ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa size_t i = 0; 1986ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa while (attrs[i] != NULL) { 1996ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (!strcmp(attrs[i], "href")) { 2006ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (attrs[i + 1] == NULL) { 2016ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return -EINVAL; 2026ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 2036ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa href = attrs[i + 1]; 2046ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ++i; 2056ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } else { 2066ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ALOGE("includeXMLFile: unrecognized attribute: %s", attrs[i]); 2076ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return -EINVAL; 2086ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 2096ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ++i; 2106ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 2116ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 2126ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa // For security reasons and for simplicity, file names can only contain 2136ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa // [a-zA-Z0-9_.] and must start with media_codecs_ and end with .xml 2146ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa for (i = 0; href[i] != '\0'; i++) { 2156ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (href[i] == '.' || href[i] == '_' || 2166ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa (href[i] >= '0' && href[i] <= '9') || 2176ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa (href[i] >= 'A' && href[i] <= 'Z') || 2186ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa (href[i] >= 'a' && href[i] <= 'z')) { 2196ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa continue; 2206ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 2216ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ALOGE("invalid include file name: %s", href); 2226ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return -EINVAL; 2236ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 2246ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 2256ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa AString filename = href; 2266ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (!filename.startsWith("media_codecs_") || 2276ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa !filename.endsWith(".xml")) { 2286ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ALOGE("invalid include file name: %s", href); 2296ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return -EINVAL; 2306ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 2316ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa filename.insert(mHrefBase, 0); 2326ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 2336ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa parseXMLFile(filename.c_str()); 2346ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return mInitCheck; 2356ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa} 2366ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 2376ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasavoid MediaCodecsXmlParser::startElementHandler( 2386ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa const char *name, const char **attrs) { 2396ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (mInitCheck != OK) { 2406ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return; 2416ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 2426ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 2436ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa bool inType = true; 2446ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 2456ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (!strcmp(name, "Include")) { 2466ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mInitCheck = includeXMLFile(attrs); 2476ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (mInitCheck == OK) { 2486ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mPastSections.push(mCurrentSection); 2496ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mCurrentSection = SECTION_INCLUDE; 2506ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 2516ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ++mDepth; 2526ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return; 2536ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 2546ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 2556ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa switch (mCurrentSection) { 2566ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa case SECTION_TOPLEVEL: 2576ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa { 2586ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (!strcmp(name, "Decoders")) { 2596ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mCurrentSection = SECTION_DECODERS; 2606ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } else if (!strcmp(name, "Encoders")) { 2616ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mCurrentSection = SECTION_ENCODERS; 2626ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } else if (!strcmp(name, "Settings")) { 2636ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mCurrentSection = SECTION_SETTINGS; 2646ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 2656ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa break; 2666ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 2676ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 2686ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa case SECTION_SETTINGS: 2696ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa { 2706ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (!strcmp(name, "Setting")) { 2716ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mInitCheck = addSettingFromAttributes(attrs); 2726ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 2736ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa break; 2746ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 2756ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 2766ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa case SECTION_DECODERS: 2776ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa { 2786ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (!strcmp(name, "MediaCodec")) { 2796ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mInitCheck = 2806ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa addMediaCodecFromAttributes(false /* encoder */, attrs); 2816ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 2826ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mCurrentSection = SECTION_DECODER; 2836ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 2846ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa break; 2856ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 2866ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 2876ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa case SECTION_ENCODERS: 2886ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa { 2896ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (!strcmp(name, "MediaCodec")) { 2906ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mInitCheck = 2916ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa addMediaCodecFromAttributes(true /* encoder */, attrs); 2926ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 2936ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mCurrentSection = SECTION_ENCODER; 2946ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 2956ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa break; 2966ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 2976ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 2986ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa case SECTION_DECODER: 2996ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa case SECTION_ENCODER: 3006ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa { 3016ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (!strcmp(name, "Quirk")) { 3026ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mInitCheck = addQuirk(attrs); 3036ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } else if (!strcmp(name, "Type")) { 3046ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mInitCheck = addTypeFromAttributes(attrs, (mCurrentSection == SECTION_ENCODER)); 3056ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mCurrentSection = 3066ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa (mCurrentSection == SECTION_DECODER 3076ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ? SECTION_DECODER_TYPE : SECTION_ENCODER_TYPE); 3086ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 3096ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 3106ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa inType = false; 3116ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa // fall through 3126ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 3136ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa case SECTION_DECODER_TYPE: 3146ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa case SECTION_ENCODER_TYPE: 3156ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa { 3166ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa // ignore limits and features specified outside of type 3176ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa bool outside = !inType && mCurrentType == mCodecInfos[mCurrentName].mTypes.end(); 3186ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (outside && (!strcmp(name, "Limit") || !strcmp(name, "Feature"))) { 3196ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ALOGW("ignoring %s specified outside of a Type", name); 3206ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } else if (!strcmp(name, "Limit")) { 3216ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mInitCheck = addLimit(attrs); 3226ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } else if (!strcmp(name, "Feature")) { 3236ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mInitCheck = addFeature(attrs); 3246ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 3256ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa break; 3266ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 3276ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 3286ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa default: 3296ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa break; 3306ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 3316ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 3326ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ++mDepth; 3336ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa} 3346ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 3356ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasavoid MediaCodecsXmlParser::endElementHandler(const char *name) { 3366ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (mInitCheck != OK) { 3376ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return; 3386ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 3396ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 3406ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa switch (mCurrentSection) { 3416ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa case SECTION_SETTINGS: 3426ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa { 3436ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (!strcmp(name, "Settings")) { 3446ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mCurrentSection = SECTION_TOPLEVEL; 3456ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 3466ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa break; 3476ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 3486ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 3496ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa case SECTION_DECODERS: 3506ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa { 3516ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (!strcmp(name, "Decoders")) { 3526ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mCurrentSection = SECTION_TOPLEVEL; 3536ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 3546ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa break; 3556ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 3566ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 3576ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa case SECTION_ENCODERS: 3586ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa { 3596ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (!strcmp(name, "Encoders")) { 3606ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mCurrentSection = SECTION_TOPLEVEL; 3616ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 3626ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa break; 3636ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 3646ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 3656ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa case SECTION_DECODER_TYPE: 3666ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa case SECTION_ENCODER_TYPE: 3676ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa { 3686ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (!strcmp(name, "Type")) { 3696ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mCurrentSection = 3706ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa (mCurrentSection == SECTION_DECODER_TYPE 3716ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ? SECTION_DECODER : SECTION_ENCODER); 3726ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 3736ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mCurrentType = mCodecInfos[mCurrentName].mTypes.end(); 3746ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 3756ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa break; 3766ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 3776ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 3786ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa case SECTION_DECODER: 3796ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa { 3806ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (!strcmp(name, "MediaCodec")) { 3816ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mCurrentSection = SECTION_DECODERS; 3826ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mCurrentName.clear(); 3836ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 3846ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa break; 3856ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 3866ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 3876ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa case SECTION_ENCODER: 3886ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa { 3896ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (!strcmp(name, "MediaCodec")) { 3906ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mCurrentSection = SECTION_ENCODERS; 3916ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mCurrentName.clear(); 3926ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 3936ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa break; 3946ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 3956ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 3966ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa case SECTION_INCLUDE: 3976ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa { 3986ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (!strcmp(name, "Include") && mPastSections.size() > 0) { 3996ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mCurrentSection = mPastSections.top(); 4006ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mPastSections.pop(); 4016ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 4026ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa break; 4036ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 4046ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 4056ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa default: 4066ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa break; 4076ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 4086ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 4096ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa --mDepth; 4106ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa} 4116ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 4126ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasastatus_t MediaCodecsXmlParser::addSettingFromAttributes(const char **attrs) { 4136ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa const char *name = NULL; 4146ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa const char *value = NULL; 4156ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa const char *update = NULL; 4166ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 4176ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa size_t i = 0; 4186ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa while (attrs[i] != NULL) { 4196ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (!strcmp(attrs[i], "name")) { 4206ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (attrs[i + 1] == NULL) { 4216ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ALOGE("addSettingFromAttributes: name is null"); 4226ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return -EINVAL; 4236ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 4246ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa name = attrs[i + 1]; 4256ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ++i; 4266ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } else if (!strcmp(attrs[i], "value")) { 4276ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (attrs[i + 1] == NULL) { 4286ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ALOGE("addSettingFromAttributes: value is null"); 4296ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return -EINVAL; 4306ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 4316ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa value = attrs[i + 1]; 4326ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ++i; 4336ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } else if (!strcmp(attrs[i], "update")) { 4346ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (attrs[i + 1] == NULL) { 4356ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ALOGE("addSettingFromAttributes: update is null"); 4366ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return -EINVAL; 4376ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 4386ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa update = attrs[i + 1]; 4396ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ++i; 4406ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } else { 4416ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ALOGE("addSettingFromAttributes: unrecognized attribute: %s", attrs[i]); 4426ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return -EINVAL; 4436ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 4446ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 4456ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ++i; 4466ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 4476ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 4486ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (name == NULL || value == NULL) { 4496ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ALOGE("addSettingFromAttributes: name or value unspecified"); 4506ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return -EINVAL; 4516ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 4526ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 4536ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mUpdate = (update != NULL) && ParseBoolean(update); 4546ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (mUpdate != (mGlobalSettings.count(name) > 0)) { 4556ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ALOGE("addSettingFromAttributes: updating non-existing setting"); 4566ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return -EINVAL; 4576ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 4586ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mGlobalSettings[name] = value; 4596ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 4606ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return OK; 4616ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa} 4626ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 4636ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasastatus_t MediaCodecsXmlParser::addMediaCodecFromAttributes( 4646ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa bool encoder, const char **attrs) { 4656ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa const char *name = NULL; 4666ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa const char *type = NULL; 4676ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa const char *update = NULL; 4686ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 4696ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa size_t i = 0; 4706ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa while (attrs[i] != NULL) { 4716ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (!strcmp(attrs[i], "name")) { 4726ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (attrs[i + 1] == NULL) { 4736ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ALOGE("addMediaCodecFromAttributes: name is null"); 4746ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return -EINVAL; 4756ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 4766ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa name = attrs[i + 1]; 4776ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ++i; 4786ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } else if (!strcmp(attrs[i], "type")) { 4796ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (attrs[i + 1] == NULL) { 4806ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ALOGE("addMediaCodecFromAttributes: type is null"); 4816ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return -EINVAL; 4826ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 4836ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa type = attrs[i + 1]; 4846ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ++i; 4856ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } else if (!strcmp(attrs[i], "update")) { 4866ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (attrs[i + 1] == NULL) { 4876ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ALOGE("addMediaCodecFromAttributes: update is null"); 4886ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return -EINVAL; 4896ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 4906ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa update = attrs[i + 1]; 4916ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ++i; 4926ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } else { 4936ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ALOGE("addMediaCodecFromAttributes: unrecognized attribute: %s", attrs[i]); 4946ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return -EINVAL; 4956ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 4966ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 4976ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ++i; 4986ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 4996ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 5006ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (name == NULL) { 5016ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ALOGE("addMediaCodecFromAttributes: name not found"); 5026ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return -EINVAL; 5036ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 5046ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 5056ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mUpdate = (update != NULL) && ParseBoolean(update); 5066ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (mUpdate != (mCodecInfos.count(name) > 0)) { 5076ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ALOGE("addMediaCodecFromAttributes: updating non-existing codec or vice versa"); 5086ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return -EINVAL; 5096ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 5106ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 5116ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa CodecInfo *info = &mCodecInfos[name]; 5126ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (mUpdate) { 5136ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa // existing codec 5146ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mCurrentName = name; 5156ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mCurrentType = info->mTypes.begin(); 5166ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (type != NULL) { 5176ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa // existing type 5186ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mCurrentType = findTypeInfo(*info, type); 5196ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (mCurrentType == info->mTypes.end()) { 5206ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ALOGE("addMediaCodecFromAttributes: updating non-existing type"); 5216ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return -EINVAL; 5226ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 5236ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 5246ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } else { 5256ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa // new codec 5266ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mCurrentName = name; 5276ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mQuirks[name].clear(); 5286ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa info->mTypes.clear(); 5296ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa info->mTypes.emplace_back(); 5306ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mCurrentType = --info->mTypes.end(); 5316ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mCurrentType->mName = type; 5326ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa info->mIsEncoder = encoder; 5336ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 5346ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 5356ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return OK; 5366ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa} 5376ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 5386ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasastatus_t MediaCodecsXmlParser::addQuirk(const char **attrs) { 5396ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa const char *name = NULL; 5406ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 5416ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa size_t i = 0; 5426ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa while (attrs[i] != NULL) { 5436ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (!strcmp(attrs[i], "name")) { 5446ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (attrs[i + 1] == NULL) { 5456ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ALOGE("addQuirk: name is null"); 5466ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return -EINVAL; 5476ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 5486ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa name = attrs[i + 1]; 5496ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ++i; 5506ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } else { 5516ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ALOGE("addQuirk: unrecognized attribute: %s", attrs[i]); 5526ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return -EINVAL; 5536ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 5546ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 5556ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ++i; 5566ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 5576ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 5586ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (name == NULL) { 5596ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ALOGE("addQuirk: name not found"); 5606ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return -EINVAL; 5616ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 5626ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 5636ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mQuirks[mCurrentName].emplace_back(name); 5646ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return OK; 5656ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa} 5666ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 5676ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasastatus_t MediaCodecsXmlParser::addTypeFromAttributes(const char **attrs, bool encoder) { 5686ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa const char *name = NULL; 5696ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa const char *update = NULL; 5706ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 5716ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa size_t i = 0; 5726ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa while (attrs[i] != NULL) { 5736ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (!strcmp(attrs[i], "name")) { 5746ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (attrs[i + 1] == NULL) { 5756ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ALOGE("addTypeFromAttributes: name is null"); 5766ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return -EINVAL; 5776ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 5786ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa name = attrs[i + 1]; 5796ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ++i; 5806ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } else if (!strcmp(attrs[i], "update")) { 5816ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (attrs[i + 1] == NULL) { 5826ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ALOGE("addTypeFromAttributes: update is null"); 5836ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return -EINVAL; 5846ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 5856ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa update = attrs[i + 1]; 5866ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ++i; 5876ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } else { 5886ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ALOGE("addTypeFromAttributes: unrecognized attribute: %s", attrs[i]); 5896ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return -EINVAL; 5906ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 5916ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 5926ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ++i; 5936ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 5946ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 5956ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (name == NULL) { 5966ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return -EINVAL; 5976ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 5986ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 5996ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa CodecInfo *info = &mCodecInfos[mCurrentName]; 6006ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa info->mIsEncoder = encoder; 6016ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mCurrentType = findTypeInfo(*info, name); 6026ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (!mUpdate) { 6036ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (mCurrentType != info->mTypes.end()) { 6046ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ALOGE("addTypeFromAttributes: re-defining existing type without update"); 6056ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return -EINVAL; 6066ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 6076ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa info->mTypes.emplace_back(); 6086ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mCurrentType = --info->mTypes.end(); 6096ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } else if (mCurrentType == info->mTypes.end()) { 6106ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ALOGE("addTypeFromAttributes: updating non-existing type"); 6116ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return -EINVAL; 6126ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 6136ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 6146ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return OK; 6156ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa} 6166ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 6176ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasastatic status_t limitFoundMissingAttr(const AString &name, const char *attr, bool found = true) { 6186ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ALOGE("limit '%s' with %s'%s' attribute", name.c_str(), 6196ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa (found ? "" : "no "), attr); 6206ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return -EINVAL; 6216ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa} 6226ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 6236ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasastatic status_t limitError(const AString &name, const char *msg) { 6246ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ALOGE("limit '%s' %s", name.c_str(), msg); 6256ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return -EINVAL; 6266ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa} 6276ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 6286ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasastatic status_t limitInvalidAttr(const AString &name, const char *attr, const AString &value) { 6296ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ALOGE("limit '%s' with invalid '%s' attribute (%s)", name.c_str(), 6306ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa attr, value.c_str()); 6316ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return -EINVAL; 6326ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa} 6336ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 6346ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasastatus_t MediaCodecsXmlParser::addLimit(const char **attrs) { 6356ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa sp<AMessage> msg = new AMessage(); 6366ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 6376ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa size_t i = 0; 6386ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa while (attrs[i] != NULL) { 6396ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (attrs[i + 1] == NULL) { 6406ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ALOGE("addLimit: limit is not given"); 6416ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return -EINVAL; 6426ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 6436ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 6446ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa // attributes with values 6456ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (!strcmp(attrs[i], "name") 6466ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa || !strcmp(attrs[i], "default") 6476ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa || !strcmp(attrs[i], "in") 6486ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa || !strcmp(attrs[i], "max") 6496ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa || !strcmp(attrs[i], "min") 6506ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa || !strcmp(attrs[i], "range") 6516ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa || !strcmp(attrs[i], "ranges") 6526ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa || !strcmp(attrs[i], "scale") 6536ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa || !strcmp(attrs[i], "value")) { 6546ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa msg->setString(attrs[i], attrs[i + 1]); 6556ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ++i; 6566ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } else { 6576ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ALOGE("addLimit: unrecognized limit: %s", attrs[i]); 6586ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return -EINVAL; 6596ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 6606ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ++i; 6616ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 6626ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 6636ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa AString name; 6646ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (!msg->findString("name", &name)) { 6656ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ALOGE("limit with no 'name' attribute"); 6666ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return -EINVAL; 6676ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 6686ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 6696ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa // size, blocks, bitrate, frame-rate, blocks-per-second, aspect-ratio, 6706ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa // measured-frame-rate, measured-blocks-per-second: range 6716ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa // quality: range + default + [scale] 6726ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa // complexity: range + default 6736ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa bool found; 6746ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (mCurrentType == mCodecInfos[mCurrentName].mTypes.end()) { 6756ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ALOGW("ignoring null type"); 6766ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return OK; 6776ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 6786ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 6796ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (name == "aspect-ratio" || name == "bitrate" || name == "block-count" 6806ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa || name == "blocks-per-second" || name == "complexity" 6816ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa || name == "frame-rate" || name == "quality" || name == "size" 6826ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa || name == "measured-blocks-per-second" || name.startsWith("measured-frame-rate-")) { 6836ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa AString min, max; 6846ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (msg->findString("min", &min) && msg->findString("max", &max)) { 6856ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa min.append("-"); 6866ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa min.append(max); 6876ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (msg->contains("range") || msg->contains("value")) { 6886ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return limitError(name, "has 'min' and 'max' as well as 'range' or " 6896ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa "'value' attributes"); 6906ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 6916ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa msg->setString("range", min); 6926ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } else if (msg->contains("min") || msg->contains("max")) { 6936ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return limitError(name, "has only 'min' or 'max' attribute"); 6946ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } else if (msg->findString("value", &max)) { 6956ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa min = max; 6966ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa min.append("-"); 6976ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa min.append(max); 6986ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (msg->contains("range")) { 6996ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return limitError(name, "has both 'range' and 'value' attributes"); 7006ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 7016ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa msg->setString("range", min); 7026ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 7036ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 7046ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa AString range, scale = "linear", def, in_; 7056ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (!msg->findString("range", &range)) { 7066ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return limitError(name, "with no 'range', 'value' or 'min'/'max' attributes"); 7076ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 7086ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 7096ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if ((name == "quality" || name == "complexity") ^ 7106ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa (found = msg->findString("default", &def))) { 7116ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return limitFoundMissingAttr(name, "default", found); 7126ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 7136ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (name != "quality" && msg->findString("scale", &scale)) { 7146ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return limitFoundMissingAttr(name, "scale"); 7156ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 7166ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if ((name == "aspect-ratio") ^ (found = msg->findString("in", &in_))) { 7176ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return limitFoundMissingAttr(name, "in", found); 7186ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 7196ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 7206ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (name == "aspect-ratio") { 7216ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (!(in_ == "pixels") && !(in_ == "blocks")) { 7226ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return limitInvalidAttr(name, "in", in_); 7236ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 7246ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa in_.erase(5, 1); // (pixel|block)-aspect-ratio 7256ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa in_.append("-"); 7266ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa in_.append(name); 7276ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa name = in_; 7286ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 7296ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (name == "quality") { 7306ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mCurrentType->mDetails["quality-scale"] = scale; 7316ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 7326ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (name == "quality" || name == "complexity") { 7336ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa AString tag = name; 7346ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa tag.append("-default"); 7356ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mCurrentType->mDetails[tag] = def; 7366ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 7376ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa AString tag = name; 7386ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa tag.append("-range"); 7396ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mCurrentType->mDetails[tag] = range; 7406ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } else { 7416ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa AString max, value, ranges; 7426ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (msg->contains("default")) { 7436ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return limitFoundMissingAttr(name, "default"); 7446ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } else if (msg->contains("in")) { 7456ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return limitFoundMissingAttr(name, "in"); 7466ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } else if ((name == "channel-count" || name == "concurrent-instances") ^ 7476ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa (found = msg->findString("max", &max))) { 7486ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return limitFoundMissingAttr(name, "max", found); 7496ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } else if (msg->contains("min")) { 7506ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return limitFoundMissingAttr(name, "min"); 7516ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } else if (msg->contains("range")) { 7526ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return limitFoundMissingAttr(name, "range"); 7536ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } else if ((name == "sample-rate") ^ 7546ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa (found = msg->findString("ranges", &ranges))) { 7556ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return limitFoundMissingAttr(name, "ranges", found); 7566ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } else if (msg->contains("scale")) { 7576ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return limitFoundMissingAttr(name, "scale"); 7586ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } else if ((name == "alignment" || name == "block-size") ^ 7596ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa (found = msg->findString("value", &value))) { 7606ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return limitFoundMissingAttr(name, "value", found); 7616ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 7626ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 7636ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (max.size()) { 7646ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa AString tag = "max-"; 7656ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa tag.append(name); 7666ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mCurrentType->mDetails[tag] = max; 7676ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } else if (value.size()) { 7686ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mCurrentType->mDetails[name] = value; 7696ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } else if (ranges.size()) { 7706ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa AString tag = name; 7716ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa tag.append("-ranges"); 7726ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mCurrentType->mDetails[tag] = ranges; 7736ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } else { 7746ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ALOGW("Ignoring unrecognized limit '%s'", name.c_str()); 7756ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 7766ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 7776ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 7786ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return OK; 7796ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa} 7806ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 7816ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasastatus_t MediaCodecsXmlParser::addFeature(const char **attrs) { 7826ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa size_t i = 0; 7836ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa const char *name = NULL; 7846ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa int32_t optional = -1; 7856ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa int32_t required = -1; 7866ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa const char *value = NULL; 7876ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 7886ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa while (attrs[i] != NULL) { 7896ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (attrs[i + 1] == NULL) { 7906ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ALOGE("addFeature: feature is not given"); 7916ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return -EINVAL; 7926ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 7936ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 7946ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa // attributes with values 7956ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (!strcmp(attrs[i], "name")) { 7966ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa name = attrs[i + 1]; 7976ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ++i; 7986ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } else if (!strcmp(attrs[i], "optional") || !strcmp(attrs[i], "required")) { 7996ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa int value = (int)ParseBoolean(attrs[i + 1]); 8006ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (!strcmp(attrs[i], "optional")) { 8016ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa optional = value; 8026ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } else { 8036ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa required = value; 8046ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 8056ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ++i; 8066ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } else if (!strcmp(attrs[i], "value")) { 8076ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa value = attrs[i + 1]; 8086ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ++i; 8096ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } else { 8106ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ALOGE("addFeature: unrecognized attribute: %s", attrs[i]); 8116ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return -EINVAL; 8126ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 8136ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ++i; 8146ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 8156ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (name == NULL) { 8166ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ALOGE("feature with no 'name' attribute"); 8176ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return -EINVAL; 8186ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 8196ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 8206ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (optional == required && optional != -1) { 8216ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ALOGE("feature '%s' is both/neither optional and required", name); 8226ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return -EINVAL; 8236ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 8246ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 8256ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (mCurrentType == mCodecInfos[mCurrentName].mTypes.end()) { 8266ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ALOGW("ignoring null type"); 8276ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return OK; 8286ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 8296ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (value != NULL) { 8306ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mCurrentType->mStringFeatures[name] = value; 8316ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } else { 8326ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa mCurrentType->mBoolFeatures[name] = (required == 1) || (optional == 0); 8336ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 8346ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return OK; 8356ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa} 8366ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 8376ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasavoid MediaCodecsXmlParser::getGlobalSettings( 8386ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa std::map<AString, AString> *settings) const { 8396ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa settings->clear(); 8406ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa settings->insert(mGlobalSettings.begin(), mGlobalSettings.end()); 8416ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa} 8426ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 8436ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasastatus_t MediaCodecsXmlParser::getCodecInfo(const char *name, CodecInfo *info) const { 8446ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (mCodecInfos.count(name) == 0) { 8456ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ALOGE("Codec not found with name '%s'", name); 8466ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return NAME_NOT_FOUND; 8476ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 8486ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa *info = mCodecInfos.at(name); 8496ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return OK; 8506ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa} 8516ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 8526ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasastatus_t MediaCodecsXmlParser::getQuirks(const char *name, std::vector<AString> *quirks) const { 8536ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa if (mQuirks.count(name) == 0) { 8546ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa ALOGE("Codec not found with name '%s'", name); 8556ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return NAME_NOT_FOUND; 8566ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa } 8576ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa quirks->clear(); 8586ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa quirks->insert(quirks->end(), mQuirks.at(name).begin(), mQuirks.at(name).end()); 8596ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa return OK; 8606ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa} 8616ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa 8626ed07dc02d4240f94e7fb0786fb263bdc7a610baPawin Vongmasa} // namespace android 863