diff options
author | Lajos Molnar <lajos@google.com> | 2014-08-06 16:55:46 -0700 |
---|---|---|
committer | Lajos Molnar <lajos@google.com> | 2014-08-07 17:40:13 -0700 |
commit | 60b1c0e79d12a1c70758bc8d060156924635f8ba (patch) | |
tree | 300d26ea36bca500a7105b7a94497dd1c2aa9fda /include | |
parent | 8accee4f0e94f19866d260be6eecd6c219eb4982 (diff) | |
download | frameworks_av-60b1c0e79d12a1c70758bc8d060156924635f8ba.zip frameworks_av-60b1c0e79d12a1c70758bc8d060156924635f8ba.tar.gz frameworks_av-60b1c0e79d12a1c70758bc8d060156924635f8ba.tar.bz2 |
stagefright: rework media codec list and infos
This is in preparation of serving the codec list and codec infos
from the mediaserver
Bug: 11990470
Change-Id: Ib8e2708679c9ce461a4ba179974a740cdcdf2731
Diffstat (limited to 'include')
-rw-r--r-- | include/media/IMediaCodecList.h | 55 | ||||
-rw-r--r-- | include/media/MediaCodecInfo.h | 121 | ||||
-rw-r--r-- | include/media/stagefright/MediaCodecList.h | 54 | ||||
-rw-r--r-- | include/media/stagefright/OMXCodec.h | 4 |
4 files changed, 198 insertions, 36 deletions
diff --git a/include/media/IMediaCodecList.h b/include/media/IMediaCodecList.h new file mode 100644 index 0000000..e93ea8b --- /dev/null +++ b/include/media/IMediaCodecList.h @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2014 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 ANDROID_IMEDIACODECLIST_H +#define ANDROID_IMEDIACODECLIST_H + +#include <utils/Errors.h> // for status_t +#include <binder/IInterface.h> +#include <binder/Parcel.h> + +namespace android { + +struct MediaCodecInfo; + +class IMediaCodecList: public IInterface +{ +public: + DECLARE_META_INTERFACE(MediaCodecList); + + virtual size_t countCodecs() const = 0; + virtual sp<MediaCodecInfo> getCodecInfo(size_t index) const = 0; + + virtual ssize_t findCodecByType( + const char *type, bool encoder, size_t startIndex = 0) const = 0; + + virtual ssize_t findCodecByName(const char *name) const = 0; +}; + +// ---------------------------------------------------------------------------- + +class BnMediaCodecList: public BnInterface<IMediaCodecList> +{ +public: + virtual status_t onTransact( uint32_t code, + const Parcel& data, + Parcel* reply, + uint32_t flags = 0); +}; + +}; // namespace android + +#endif // ANDROID_IMEDIACODECLIST_H diff --git a/include/media/MediaCodecInfo.h b/include/media/MediaCodecInfo.h new file mode 100644 index 0000000..29315ce --- /dev/null +++ b/include/media/MediaCodecInfo.h @@ -0,0 +1,121 @@ +/* + * Copyright 2014, 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_INFO_H_ + +#define MEDIA_CODEC_INFO_H_ + +#include <binder/Parcel.h> +#include <media/stagefright/foundation/ABase.h> +#include <media/stagefright/foundation/AString.h> + +#include <sys/types.h> +#include <utils/Errors.h> +#include <utils/KeyedVector.h> +#include <utils/RefBase.h> +#include <utils/Vector.h> +#include <utils/StrongPointer.h> + +namespace android { + +struct AMessage; +struct Parcel; +struct CodecCapabilities; + +struct MediaCodecInfo : public RefBase { + struct ProfileLevel { + uint32_t mProfile; + uint32_t mLevel; + }; + + struct Capabilities : public RefBase { + void getSupportedProfileLevels(Vector<ProfileLevel> *profileLevels) const; + void getSupportedColorFormats(Vector<uint32_t> *colorFormats) const; + uint32_t getFlags() const; + const sp<AMessage> &getDetails() const; + + private: + Vector<ProfileLevel> mProfileLevels; + Vector<uint32_t> mColorFormats; + uint32_t mFlags; + sp<AMessage> mDetails; + + Capabilities(); + + // read object from parcel even if object creation fails + static sp<Capabilities> FromParcel(const Parcel &parcel); + status_t writeToParcel(Parcel *parcel) const; + + DISALLOW_EVIL_CONSTRUCTORS(Capabilities); + + friend class MediaCodecInfo; + }; + + bool isEncoder() const; + bool hasQuirk(const char *name) const; + void getSupportedMimes(Vector<AString> *mimes) const; + const sp<Capabilities> &getCapabilitiesFor(const char *mime) const; + const char *getCodecName() const; + + /** + * Serialization over Binder + */ + static sp<MediaCodecInfo> FromParcel(const Parcel &parcel); + status_t writeToParcel(Parcel *parcel) const; + +private: + // variable set only in constructor - these are accessed by MediaCodecList + // to avoid duplication of same variables + AString mName; + bool mIsEncoder; + bool mHasSoleMime; // was initialized with mime + + Vector<AString> mQuirks; + KeyedVector<AString, sp<Capabilities> > mCaps; + + sp<Capabilities> mCurrentCaps; // currently initalized capabilities + + ssize_t getCapabilityIndex(const char *mime) const; + + /* Methods used by MediaCodecList to construct the info + * object from XML. + * + * After info object is created: + * - additional quirks can be added + * - additional mimes can be added + * - OMX codec capabilities can be set for the current mime-type + * - a capability detail can be set for the current mime-type + * - a feature can be set for the current mime-type + * - info object can be completed when parsing of a mime-type is done + */ + MediaCodecInfo(AString name, bool encoder, const char *mime); + void addQuirk(const char *name); + status_t addMime(const char *mime); + status_t initializeCapabilities(const CodecCapabilities &caps); + void addDetail(const AString &key, const AString &value); + void addFeature(const AString &key, int32_t value); + void complete(); + + DISALLOW_EVIL_CONSTRUCTORS(MediaCodecInfo); + + friend class MediaCodecList; +}; + +} // namespace android + +#endif // MEDIA_CODEC_INFO_H_ + + diff --git a/include/media/stagefright/MediaCodecList.h b/include/media/stagefright/MediaCodecList.h index c11fcc9..8605d99 100644 --- a/include/media/stagefright/MediaCodecList.h +++ b/include/media/stagefright/MediaCodecList.h @@ -20,6 +20,9 @@ #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> @@ -31,32 +34,22 @@ namespace android { struct AMessage; -struct MediaCodecList { - static const MediaCodecList *getInstance(); +struct MediaCodecList : public BnMediaCodecList { + static sp<IMediaCodecList> getInstance(); - ssize_t findCodecByType( + virtual ssize_t findCodecByType( const char *type, bool encoder, size_t startIndex = 0) const; - ssize_t findCodecByName(const char *name) const; + virtual ssize_t findCodecByName(const char *name) const; - size_t countCodecs() const; - const char *getCodecName(size_t index) const; - bool isEncoder(size_t index) const; - bool codecHasQuirk(size_t index, const char *quirkName) const; + virtual size_t countCodecs() const; - status_t getSupportedTypes(size_t index, Vector<AString> *types) const; + virtual sp<MediaCodecInfo> getCodecInfo(size_t index) const { + return mCodecInfos.itemAt(index); + } - struct ProfileLevel { - uint32_t mProfile; - uint32_t mLevel; - }; - status_t getCodecCapabilities( - size_t index, const char *type, - Vector<ProfileLevel> *profileLevels, - Vector<uint32_t> *colorFormats, - uint32_t *flags, - // TODO default argument is only for compatibility with existing JNI - sp<AMessage> *capabilities = NULL) const; + // to be used by MediaPlayerService alone + static sp<IMediaCodecList> getLocalInstance(); private: enum Section { @@ -70,17 +63,8 @@ private: SECTION_INCLUDE, }; - struct CodecInfo { - AString mName; - bool mIsEncoder; - uint32_t mTypes; - uint32_t mSoleType; - uint32_t mQuirks; - KeyedVector<uint32_t, sp<AMessage> > mCaps; - sp<AMessage> mCurrentCaps; - }; - - static MediaCodecList *sCodecList; + static sp<IMediaCodecList> sCodecList; + static sp<IMediaCodecList> sRemoteList; status_t mInitCheck; Section mCurrentSection; @@ -88,9 +72,9 @@ private: int32_t mDepth; AString mHrefBase; - Vector<CodecInfo> mCodecInfos; - KeyedVector<AString, size_t> mCodecQuirks; - KeyedVector<AString, size_t> mTypes; + Vector<sp<MediaCodecInfo> > mCodecInfos; + sp<MediaCodecInfo> mCurrentInfo; + sp<IOMX> mOMX; MediaCodecList(); ~MediaCodecList(); @@ -117,6 +101,8 @@ private: status_t addFeature(const char **attrs); void addType(const char *name); + status_t initializeCapabilities(const char *type); + DISALLOW_EVIL_CONSTRUCTORS(MediaCodecList); }; diff --git a/include/media/stagefright/OMXCodec.h b/include/media/stagefright/OMXCodec.h index 5590b60..e341160 100644 --- a/include/media/stagefright/OMXCodec.h +++ b/include/media/stagefright/OMXCodec.h @@ -28,7 +28,7 @@ namespace android { -struct MediaCodecList; +struct MediaCodecInfo; class MemoryDealer; struct OMXCodecObserver; struct CodecProfileLevel; @@ -115,7 +115,7 @@ struct OMXCodec : public MediaSource, Vector<CodecNameAndQuirks> *matchingCodecNamesAndQuirks); static uint32_t getComponentQuirks( - const MediaCodecList *list, size_t index); + const sp<MediaCodecInfo> &list); static bool findCodecQuirks(const char *componentName, uint32_t *quirks); |