1 /*
2  * Copyright 2014, The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef MEDIA_CODEC_INFO_H_
18 
19 #define MEDIA_CODEC_INFO_H_
20 
21 #include <binder/Parcel.h>
22 #include <media/stagefright/foundation/ABase.h>
23 #include <media/stagefright/foundation/AString.h>
24 
25 #include <sys/types.h>
26 #include <utils/Errors.h>
27 #include <utils/KeyedVector.h>
28 #include <utils/RefBase.h>
29 #include <utils/Vector.h>
30 #include <utils/StrongPointer.h>
31 
32 namespace android {
33 
34 struct AMessage;
35 class Parcel;
36 
37 typedef KeyedVector<AString, AString> CodecSettings;
38 
39 struct MediaCodecInfo : public RefBase {
40     struct ProfileLevel {
41         uint32_t mProfile;
42         uint32_t mLevel;
43     };
44 
45     struct Capabilities : public RefBase {
46         enum {
47             // decoder flags
48             kFlagSupportsAdaptivePlayback = 1 << 0,
49             kFlagSupportsSecurePlayback = 1 << 1,
50             kFlagSupportsTunneledPlayback = 1 << 2,
51 
52             // encoder flags
53             kFlagSupportsIntraRefresh = 1 << 0,
54 
55         };
56 
57         void getSupportedProfileLevels(Vector<ProfileLevel> *profileLevels) const;
58         void getSupportedColorFormats(Vector<uint32_t> *colorFormats) const;
59         uint32_t getFlags() const;
60         const sp<AMessage> getDetails() const;
61 
62     protected:
63         Vector<ProfileLevel> mProfileLevels;
64         Vector<uint32_t> mColorFormats;
65         uint32_t mFlags;
66         sp<AMessage> mDetails;
67 
68         Capabilities();
69 
70     private:
71         // read object from parcel even if object creation fails
72         static sp<Capabilities> FromParcel(const Parcel &parcel);
73         status_t writeToParcel(Parcel *parcel) const;
74 
75         DISALLOW_EVIL_CONSTRUCTORS(Capabilities);
76 
77         friend class MediaCodecInfo;
78     };
79 
80     // Use a subclass to allow setting fields on construction without allowing
81     // to do the same throughout the framework.
82     struct CapabilitiesBuilder : public Capabilities {
83         void addProfileLevel(uint32_t profile, uint32_t level);
84         void addColorFormat(uint32_t format);
85         void addFlags(uint32_t flags);
86     };
87 
88     bool isEncoder() const;
89     bool hasQuirk(const char *name) const;
90     void getSupportedMimes(Vector<AString> *mimes) const;
91     const sp<Capabilities> getCapabilitiesFor(const char *mime) const;
92     const char *getCodecName() const;
93 
94     /**
95      * Serialization over Binder
96      */
97     static sp<MediaCodecInfo> FromParcel(const Parcel &parcel);
98     status_t writeToParcel(Parcel *parcel) const;
99 
100 private:
101     // variable set only in constructor - these are accessed by MediaCodecList
102     // to avoid duplication of same variables
103     AString mName;
104     bool mIsEncoder;
105     bool mHasSoleMime; // was initialized with mime
106 
107     Vector<AString> mQuirks;
108     KeyedVector<AString, sp<Capabilities> > mCaps;
109 
110     sp<Capabilities> mCurrentCaps; // currently initalized capabilities
111 
112     ssize_t getCapabilityIndex(const char *mime) const;
113 
114     /* Methods used by MediaCodecList to construct the info
115      * object from XML.
116      *
117      * After info object is created:
118      * - additional quirks can be added
119      * - additional mimes can be added
120      *   - OMX codec capabilities can be set for the current mime-type
121      *   - a capability detail can be set for the current mime-type
122      *   - a feature can be set for the current mime-type
123      *   - info object can be completed when parsing of a mime-type is done
124      */
125     MediaCodecInfo(AString name, bool encoder, const char *mime);
126     void addQuirk(const char *name);
127     status_t addMime(const char *mime);
128     status_t updateMime(const char *mime);
129 
130     status_t initializeCapabilities(const sp<Capabilities> &caps);
131     void addDetail(const AString &key, const AString &value);
132     void addFeature(const AString &key, int32_t value);
133     void addFeature(const AString &key, const char *value);
134     void removeMime(const char *mime);
135     void complete();
136 
137     DISALLOW_EVIL_CONSTRUCTORS(MediaCodecInfo);
138 
139     friend class MediaCodecList;
140     friend class MediaCodecListOverridesTest;
141 };
142 
143 }  // namespace android
144 
145 #endif  // MEDIA_CODEC_INFO_H_
146 
147 
148