1afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber/* 2afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber * Copyright 2012, The Android Open Source Project 3afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber * 4afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber * you may not use this file except in compliance with the License. 6afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber * You may obtain a copy of the License at 7afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber * 8afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber * 10afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber * Unless required by applicable law or agreed to in writing, software 11afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber * See the License for the specific language governing permissions and 14afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber * limitations under the License. 15afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber */ 16afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber 17afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber#ifndef MEDIA_CODEC_LIST_H_ 18afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber 19afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber#define MEDIA_CODEC_LIST_H_ 20afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber 21afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber#include <media/stagefright/foundation/ABase.h> 22afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber#include <media/stagefright/foundation/AString.h> 2360b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar#include <media/IMediaCodecList.h> 2460b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar#include <media/IOMX.h> 2560b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar#include <media/MediaCodecInfo.h> 26afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber 27afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber#include <sys/types.h> 28afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber#include <utils/Errors.h> 29afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber#include <utils/KeyedVector.h> 30afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber#include <utils/Vector.h> 31513d967dae82cd03e67bff17b927cf869d9bc43eLajos Molnar#include <utils/StrongPointer.h> 32afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber 33afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Hubernamespace android { 34afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber 3579608158c2254fe1357959157f2d0c1560a8a6c6Chong Zhangextern const char *kMaxEncoderInputBuffers; 3679608158c2254fe1357959157f2d0c1560a8a6c6Chong Zhang 37513d967dae82cd03e67bff17b927cf869d9bc43eLajos Molnarstruct AMessage; 38513d967dae82cd03e67bff17b927cf869d9bc43eLajos Molnar 3960b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnarstruct MediaCodecList : public BnMediaCodecList { 4060b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar static sp<IMediaCodecList> getInstance(); 41afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber 4260b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar virtual ssize_t findCodecByType( 43afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber const char *type, bool encoder, size_t startIndex = 0) const; 44afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber 4560b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar virtual ssize_t findCodecByName(const char *name) const; 46afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber 4760b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar virtual size_t countCodecs() const; 48afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber 4960b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar virtual sp<MediaCodecInfo> getCodecInfo(size_t index) const { 5077c185d5499d6174e7a97b3e1512994d3a803151Lajos Molnar if (index >= mCodecInfos.size()) { 5177c185d5499d6174e7a97b3e1512994d3a803151Lajos Molnar ALOGE("b/24445127"); 5277c185d5499d6174e7a97b3e1512994d3a803151Lajos Molnar return NULL; 5377c185d5499d6174e7a97b3e1512994d3a803151Lajos Molnar } 5460b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar return mCodecInfos.itemAt(index); 5560b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar } 5669829f3bd09ee4e6be49fee8795c5df24c4da70eAndreas Huber 579e6955a19bf77ebf27b770e910efbe1ebf1ceac0Ronghua Wu virtual const sp<AMessage> getGlobalSettings() const; 589e6955a19bf77ebf27b770e910efbe1ebf1ceac0Ronghua Wu 5960b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar // to be used by MediaPlayerService alone 6060b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar static sp<IMediaCodecList> getLocalInstance(); 6169829f3bd09ee4e6be49fee8795c5df24c4da70eAndreas Huber 62a09152c6317e0295773b91f529e63c4d7c107752Ronghua Wu // only to be used by getLocalInstance 63a09152c6317e0295773b91f529e63c4d7c107752Ronghua Wu static void *profilerThreadWrapper(void * /*arg*/); 64a09152c6317e0295773b91f529e63c4d7c107752Ronghua Wu 65a09152c6317e0295773b91f529e63c4d7c107752Ronghua Wu // only to be used by MediaPlayerService 6665c8fbcf91f0f0b5f60a45d2777c36d396c4ba16Ronghua Wu void parseTopLevelXMLFile(const char *path, bool ignore_errors = false); 679e6955a19bf77ebf27b770e910efbe1ebf1ceac0Ronghua Wu 68b60521e269e5aeca773853dfeb150e9a512c7334Lajos Molnar enum Flags { 69b60521e269e5aeca773853dfeb150e9a512c7334Lajos Molnar kPreferSoftwareCodecs = 1, 70b60521e269e5aeca773853dfeb150e9a512c7334Lajos Molnar kHardwareCodecsOnly = 2, 71b60521e269e5aeca773853dfeb150e9a512c7334Lajos Molnar }; 72b60521e269e5aeca773853dfeb150e9a512c7334Lajos Molnar 73b60521e269e5aeca773853dfeb150e9a512c7334Lajos Molnar static void findMatchingCodecs( 74b60521e269e5aeca773853dfeb150e9a512c7334Lajos Molnar const char *mime, 75b60521e269e5aeca773853dfeb150e9a512c7334Lajos Molnar bool createEncoder, 76b60521e269e5aeca773853dfeb150e9a512c7334Lajos Molnar uint32_t flags, 77b60521e269e5aeca773853dfeb150e9a512c7334Lajos Molnar Vector<AString> *matching); 78b60521e269e5aeca773853dfeb150e9a512c7334Lajos Molnar 79b60521e269e5aeca773853dfeb150e9a512c7334Lajos Molnar static uint32_t getQuirksFor(const char *mComponentName); 80b60521e269e5aeca773853dfeb150e9a512c7334Lajos Molnar 81b60521e269e5aeca773853dfeb150e9a512c7334Lajos Molnar static bool isSoftwareCodec(const AString &componentName); 82b60521e269e5aeca773853dfeb150e9a512c7334Lajos Molnar 83b60521e269e5aeca773853dfeb150e9a512c7334Lajos Molnar 84afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huberprivate: 85eee82e44548f17253c2e06b25725f91c7b549ec2Lajos Molnar class BinderDeathObserver : public IBinder::DeathRecipient { 86eee82e44548f17253c2e06b25725f91c7b549ec2Lajos Molnar void binderDied(const wp<IBinder> &the_late_who __unused); 87eee82e44548f17253c2e06b25725f91c7b549ec2Lajos Molnar }; 88eee82e44548f17253c2e06b25725f91c7b549ec2Lajos Molnar 89eee82e44548f17253c2e06b25725f91c7b549ec2Lajos Molnar static sp<BinderDeathObserver> sBinderDeathObserver; 90eee82e44548f17253c2e06b25725f91c7b549ec2Lajos Molnar 91afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber enum Section { 92afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber SECTION_TOPLEVEL, 93c1f5cb4b11d0c9f52f69aec4fe2d36da2f8139c9Ronghua Wu SECTION_SETTINGS, 94afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber SECTION_DECODERS, 95afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber SECTION_DECODER, 96513d967dae82cd03e67bff17b927cf869d9bc43eLajos Molnar SECTION_DECODER_TYPE, 97afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber SECTION_ENCODERS, 98afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber SECTION_ENCODER, 99513d967dae82cd03e67bff17b927cf869d9bc43eLajos Molnar SECTION_ENCODER_TYPE, 100d74110cdef2becd4f7fd2334c34c3ca73f56b355Lajos Molnar SECTION_INCLUDE, 101afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber }; 102afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber 10360b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar static sp<IMediaCodecList> sCodecList; 10460b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar static sp<IMediaCodecList> sRemoteList; 105afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber 106afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber status_t mInitCheck; 107afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber Section mCurrentSection; 1089e6955a19bf77ebf27b770e910efbe1ebf1ceac0Ronghua Wu bool mUpdate; 109d74110cdef2becd4f7fd2334c34c3ca73f56b355Lajos Molnar Vector<Section> mPastSections; 110afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber int32_t mDepth; 111d74110cdef2becd4f7fd2334c34c3ca73f56b355Lajos Molnar AString mHrefBase; 112afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber 1139e6955a19bf77ebf27b770e910efbe1ebf1ceac0Ronghua Wu sp<AMessage> mGlobalSettings; 1149e6955a19bf77ebf27b770e910efbe1ebf1ceac0Ronghua Wu KeyedVector<AString, CodecSettings> mOverrides; 1159e6955a19bf77ebf27b770e910efbe1ebf1ceac0Ronghua Wu 11660b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar Vector<sp<MediaCodecInfo> > mCodecInfos; 11760b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar sp<MediaCodecInfo> mCurrentInfo; 118afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber 119afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber MediaCodecList(); 120afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber ~MediaCodecList(); 121afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber 122afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber status_t initCheck() const; 123d74110cdef2becd4f7fd2334c34c3ca73f56b355Lajos Molnar void parseXMLFile(const char *path); 124afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber 125afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber static void StartElementHandlerWrapper( 126afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber void *me, const char *name, const char **attrs); 127afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber 128afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber static void EndElementHandlerWrapper(void *me, const char *name); 129afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber 130afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber void startElementHandler(const char *name, const char **attrs); 131afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber void endElementHandler(const char *name); 132afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber 133d74110cdef2becd4f7fd2334c34c3ca73f56b355Lajos Molnar status_t includeXMLFile(const char **attrs); 134c1f5cb4b11d0c9f52f69aec4fe2d36da2f8139c9Ronghua Wu status_t addSettingFromAttributes(const char **attrs); 135afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber status_t addMediaCodecFromAttributes(bool encoder, const char **attrs); 136afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber void addMediaCodec(bool encoder, const char *name, const char *type = NULL); 137afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber 1389e6955a19bf77ebf27b770e910efbe1ebf1ceac0Ronghua Wu void setCurrentCodecInfo(bool encoder, const char *name, const char *type); 1399e6955a19bf77ebf27b770e910efbe1ebf1ceac0Ronghua Wu 140afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber status_t addQuirk(const char **attrs); 141afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber status_t addTypeFromAttributes(const char **attrs); 142513d967dae82cd03e67bff17b927cf869d9bc43eLajos Molnar status_t addLimit(const char **attrs); 143513d967dae82cd03e67bff17b927cf869d9bc43eLajos Molnar status_t addFeature(const char **attrs); 144afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber void addType(const char *name); 145afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber 14660b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar status_t initializeCapabilities(const char *type); 14760b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar 148afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber DISALLOW_EVIL_CONSTRUCTORS(MediaCodecList); 149afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber}; 150afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber 151afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber} // namespace android 152afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber 153afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber#endif // MEDIA_CODEC_LIST_H_ 154afc16d667afa23f5aa00154ccad62f8c45cf5419Andreas Huber 155