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