160b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar/* 260b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar * Copyright 2014, The Android Open Source Project 360b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar * 460b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar * Licensed under the Apache License, Version 2.0 (the "License"); 560b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar * you may not use this file except in compliance with the License. 660b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar * You may obtain a copy of the License at 760b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar * 860b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar * http://www.apache.org/licenses/LICENSE-2.0 960b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar * 1060b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar * Unless required by applicable law or agreed to in writing, software 1160b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar * distributed under the License is distributed on an "AS IS" BASIS, 1260b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1360b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar * See the License for the specific language governing permissions and 1460b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar * limitations under the License. 1560b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar */ 1660b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar 1760b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar#ifndef MEDIA_CODEC_INFO_H_ 1860b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar 1960b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar#define MEDIA_CODEC_INFO_H_ 2060b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar 2160b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar#include <binder/Parcel.h> 2260b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar#include <media/stagefright/foundation/ABase.h> 2360b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar#include <media/stagefright/foundation/AString.h> 2460b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar 2560b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar#include <sys/types.h> 2660b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar#include <utils/Errors.h> 2760b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar#include <utils/KeyedVector.h> 2860b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar#include <utils/RefBase.h> 2960b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar#include <utils/Vector.h> 3060b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar#include <utils/StrongPointer.h> 3160b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar 3260b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnarnamespace android { 3360b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar 3460b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnarstruct AMessage; 3560b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnarstruct Parcel; 3660b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnarstruct CodecCapabilities; 3760b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar 3860b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnarstruct MediaCodecInfo : public RefBase { 3960b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar struct ProfileLevel { 4060b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar uint32_t mProfile; 4160b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar uint32_t mLevel; 4260b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar }; 4360b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar 4460b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar struct Capabilities : public RefBase { 4560b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar void getSupportedProfileLevels(Vector<ProfileLevel> *profileLevels) const; 4660b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar void getSupportedColorFormats(Vector<uint32_t> *colorFormats) const; 4760b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar uint32_t getFlags() const; 482461e0cf6ae3fe5c9b52ce9e3ac764f4aff5e5ebLajos Molnar const sp<AMessage> getDetails() const; 4960b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar 5060b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar private: 5160b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar Vector<ProfileLevel> mProfileLevels; 5260b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar Vector<uint32_t> mColorFormats; 5360b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar uint32_t mFlags; 5460b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar sp<AMessage> mDetails; 5560b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar 5660b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar Capabilities(); 5760b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar 5860b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar // read object from parcel even if object creation fails 5960b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar static sp<Capabilities> FromParcel(const Parcel &parcel); 6060b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar status_t writeToParcel(Parcel *parcel) const; 6160b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar 6260b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar DISALLOW_EVIL_CONSTRUCTORS(Capabilities); 6360b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar 6460b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar friend class MediaCodecInfo; 6560b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar }; 6660b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar 6760b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar bool isEncoder() const; 6860b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar bool hasQuirk(const char *name) const; 6960b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar void getSupportedMimes(Vector<AString> *mimes) const; 702461e0cf6ae3fe5c9b52ce9e3ac764f4aff5e5ebLajos Molnar const sp<Capabilities> getCapabilitiesFor(const char *mime) const; 7160b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar const char *getCodecName() const; 7260b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar 7360b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar /** 7460b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar * Serialization over Binder 7560b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar */ 7660b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar static sp<MediaCodecInfo> FromParcel(const Parcel &parcel); 7760b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar status_t writeToParcel(Parcel *parcel) const; 7860b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar 7960b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnarprivate: 8060b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar // variable set only in constructor - these are accessed by MediaCodecList 8160b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar // to avoid duplication of same variables 8260b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar AString mName; 8360b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar bool mIsEncoder; 8460b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar bool mHasSoleMime; // was initialized with mime 8560b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar 8660b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar Vector<AString> mQuirks; 8760b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar KeyedVector<AString, sp<Capabilities> > mCaps; 8860b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar 8960b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar sp<Capabilities> mCurrentCaps; // currently initalized capabilities 9060b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar 9160b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar ssize_t getCapabilityIndex(const char *mime) const; 9260b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar 9360b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar /* Methods used by MediaCodecList to construct the info 9460b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar * object from XML. 9560b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar * 9660b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar * After info object is created: 9760b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar * - additional quirks can be added 9860b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar * - additional mimes can be added 9960b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar * - OMX codec capabilities can be set for the current mime-type 10060b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar * - a capability detail can be set for the current mime-type 10160b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar * - a feature can be set for the current mime-type 10260b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar * - info object can be completed when parsing of a mime-type is done 10360b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar */ 10460b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar MediaCodecInfo(AString name, bool encoder, const char *mime); 10560b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar void addQuirk(const char *name); 10660b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar status_t addMime(const char *mime); 10760b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar status_t initializeCapabilities(const CodecCapabilities &caps); 10860b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar void addDetail(const AString &key, const AString &value); 10960b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar void addFeature(const AString &key, int32_t value); 110732c6d955524ead6c31e6e1bafbd41ea4cee525dLajos Molnar void addFeature(const AString &key, const char *value); 1116ff58f04f78886b07c72c0118eb71a78d08f5651Lajos Molnar void removeMime(const char *mime); 11260b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar void complete(); 11360b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar 11460b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar DISALLOW_EVIL_CONSTRUCTORS(MediaCodecInfo); 11560b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar 11660b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar friend class MediaCodecList; 11760b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar}; 11860b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar 11960b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar} // namespace android 12060b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar 12160b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar#endif // MEDIA_CODEC_INFO_H_ 12260b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar 12360b1c0e79d12a1c70758bc8d060156924635f8baLajos Molnar 124