/* * Copyright 2012, 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_CODEC_LIST_H_ #define MEDIA_CODEC_LIST_H_ #include <media/stagefright/foundation/ABase.h> #include <media/stagefright/foundation/AString.h> #include <media/IMediaCodecList.h> #include <media/IOMX.h> #include <media/MediaCodecInfo.h> #include <sys/types.h> #include <utils/Errors.h> #include <utils/KeyedVector.h> #include <utils/Vector.h> #include <utils/StrongPointer.h> namespace android { extern const char *kMaxEncoderInputBuffers; struct AMessage; struct MediaCodecList : public BnMediaCodecList { static sp<IMediaCodecList> getInstance(); virtual ssize_t findCodecByType( const char *type, bool encoder, size_t startIndex = 0) const; virtual ssize_t findCodecByName(const char *name) const; virtual size_t countCodecs() const; virtual sp<MediaCodecInfo> getCodecInfo(size_t index) const { if (index >= mCodecInfos.size()) { ALOGE("b/24445127"); return NULL; } return mCodecInfos.itemAt(index); } virtual const sp<AMessage> getGlobalSettings() const; // to be used by MediaPlayerService alone static sp<IMediaCodecList> getLocalInstance(); // only to be used by getLocalInstance static void *profilerThreadWrapper(void * /*arg*/); // only to be used by MediaPlayerService void parseTopLevelXMLFile(const char *path, bool ignore_errors = false); enum Flags { kPreferSoftwareCodecs = 1, kHardwareCodecsOnly = 2, }; static void findMatchingCodecs( const char *mime, bool createEncoder, uint32_t flags, Vector<AString> *matching); static uint32_t getQuirksFor(const char *mComponentName); static bool isSoftwareCodec(const AString &componentName); private: class BinderDeathObserver : public IBinder::DeathRecipient { void binderDied(const wp<IBinder> &the_late_who __unused); }; static sp<BinderDeathObserver> sBinderDeathObserver; enum Section { SECTION_TOPLEVEL, SECTION_SETTINGS, SECTION_DECODERS, SECTION_DECODER, SECTION_DECODER_TYPE, SECTION_ENCODERS, SECTION_ENCODER, SECTION_ENCODER_TYPE, SECTION_INCLUDE, }; static sp<IMediaCodecList> sCodecList; static sp<IMediaCodecList> sRemoteList; status_t mInitCheck; Section mCurrentSection; bool mUpdate; Vector<Section> mPastSections; int32_t mDepth; AString mHrefBase; sp<AMessage> mGlobalSettings; KeyedVector<AString, CodecSettings> mOverrides; Vector<sp<MediaCodecInfo> > mCodecInfos; sp<MediaCodecInfo> mCurrentInfo; MediaCodecList(); ~MediaCodecList(); status_t initCheck() const; 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); void setCurrentCodecInfo(bool encoder, const char *name, const char *type); status_t addQuirk(const char **attrs); status_t addTypeFromAttributes(const char **attrs); status_t addLimit(const char **attrs); status_t addFeature(const char **attrs); void addType(const char *name); status_t initializeCapabilities(const char *type); DISALLOW_EVIL_CONSTRUCTORS(MediaCodecList); }; } // namespace android #endif // MEDIA_CODEC_LIST_H_