Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 60b1c0e7 authored by Lajos Molnar's avatar Lajos Molnar
Browse files

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
parent 8accee4f
Loading
Loading
Loading
Loading
+55 −0
Original line number Diff line number Diff line
/*
 * 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
+121 −0
Original line number Diff line number Diff line
/*
 * 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_

+20 −34
Original line number Diff line number Diff line
@@ -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);
};

+2 −2
Original line number Diff line number Diff line
@@ -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);

+3 −0
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ LOCAL_SRC_FILES:= \
    AudioRecord.cpp \
    AudioSystem.cpp \
    mediaplayer.cpp \
    IMediaCodecList.cpp \
    IMediaHTTPConnection.cpp \
    IMediaHTTPService.cpp \
    IMediaLogService.cpp \
@@ -36,6 +37,7 @@ LOCAL_SRC_FILES:= \
    IRemoteDisplay.cpp \
    IRemoteDisplayClient.cpp \
    IStreamSource.cpp \
    MediaCodecInfo.cpp \
    Metadata.cpp \
    mediarecorder.cpp \
    IMediaMetadataRetriever.cpp \
@@ -74,6 +76,7 @@ LOCAL_MODULE:= libmedia

LOCAL_C_INCLUDES := \
    $(TOP)/frameworks/native/include/media/openmax \
    $(TOP)/frameworks/av/media/libstagefright \
    external/icu/icu4c/source/common \
    external/icu/icu4c/source/i18n \
    $(call include-path-for, audio-effects) \
Loading