/* * Copyright 2017, The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef MEDIA_CODECS_XML_PARSER_H_ #define MEDIA_CODECS_XML_PARSER_H_ #include <map> #include <vector> #include <media/stagefright/foundation/ABase.h> #include <media/stagefright/foundation/AString.h> #include <sys/types.h> #include <utils/Errors.h> #include <utils/Vector.h> #include <utils/StrongPointer.h> namespace android { struct AMessage; // Quirk still supported, even though deprecated enum Quirks { kRequiresAllocateBufferOnInputPorts = 1, kRequiresAllocateBufferOnOutputPorts = 2, kQuirksMask = kRequiresAllocateBufferOnInputPorts | kRequiresAllocateBufferOnOutputPorts, }; // Lightweight struct for querying components. struct TypeInfo { AString mName; std::map<AString, AString> mStringFeatures; std::map<AString, bool> mBoolFeatures; std::map<AString, AString> mDetails; }; struct ProfileLevel { uint32_t mProfile; uint32_t mLevel; }; struct CodecInfo { std::vector<TypeInfo> mTypes; std::vector<ProfileLevel> mProfileLevels; std::vector<uint32_t> mColorFormats; uint32_t mFlags; bool mIsEncoder; }; class MediaCodecsXmlParser { public: MediaCodecsXmlParser(); ~MediaCodecsXmlParser(); void getGlobalSettings(std::map<AString, AString> *settings) const; status_t getCodecInfo(const char *name, CodecInfo *info) const; status_t getQuirks(const char *name, std::vector<AString> *quirks) const; private: enum Section { SECTION_TOPLEVEL, SECTION_SETTINGS, SECTION_DECODERS, SECTION_DECODER, SECTION_DECODER_TYPE, SECTION_ENCODERS, SECTION_ENCODER, SECTION_ENCODER_TYPE, SECTION_INCLUDE, }; status_t mInitCheck; Section mCurrentSection; bool mUpdate; Vector<Section> mPastSections; int32_t mDepth; AString mHrefBase; std::map<AString, AString> mGlobalSettings; // name -> CodecInfo std::map<AString, CodecInfo> mCodecInfos; std::map<AString, std::vector<AString>> mQuirks; AString mCurrentName; std::vector<TypeInfo>::iterator mCurrentType; status_t initCheck() const; void parseTopLevelXMLFile(const char *path, bool ignore_errors = false); void parseXMLFile(const char *path); static void StartElementHandlerWrapper( void *me, const char *name, const char **attrs); static void EndElementHandlerWrapper(void *me, const char *name); void startElementHandler(const char *name, const char **attrs); void endElementHandler(const char *name); status_t includeXMLFile(const char **attrs); status_t addSettingFromAttributes(const char **attrs); status_t addMediaCodecFromAttributes(bool encoder, const char **attrs); void addMediaCodec(bool encoder, const char *name, const char *type = NULL); status_t addQuirk(const char **attrs); status_t addTypeFromAttributes(const char **attrs, bool encoder); status_t addLimit(const char **attrs); status_t addFeature(const char **attrs); void addType(const char *name); DISALLOW_EVIL_CONSTRUCTORS(MediaCodecsXmlParser); }; } // namespace android #endif // MEDIA_CODECS_XML_PARSER_H_