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

Commit 94f48a75 authored by Lajos Molnar's avatar Lajos Molnar Committed by Gerrit Code Review
Browse files

Merge "stagefright: Move CodecCapabilities querying into MediaCodec"

parents 2f073fe3 65dd3eee
Loading
Loading
Loading
Loading
+19 −3
Original line number Diff line number Diff line
@@ -33,7 +33,6 @@ namespace android {

struct AMessage;
class Parcel;
struct CodecCapabilities;

typedef KeyedVector<AString, AString> CodecSettings;

@@ -44,12 +43,19 @@ struct MediaCodecInfo : public RefBase {
    };

    struct Capabilities : public RefBase {
        enum {
            // decoder flags
            kFlagSupportsAdaptivePlayback = 1 << 0,
            kFlagSupportsSecurePlayback = 1 << 1,
            kFlagSupportsTunneledPlayback = 1 << 2,
        };

        void getSupportedProfileLevels(Vector<ProfileLevel> *profileLevels) const;
        void getSupportedColorFormats(Vector<uint32_t> *colorFormats) const;
        uint32_t getFlags() const;
        const sp<AMessage> getDetails() const;

    private:
    protected:
        Vector<ProfileLevel> mProfileLevels;
        Vector<uint32_t> mColorFormats;
        uint32_t mFlags;
@@ -57,6 +63,7 @@ struct MediaCodecInfo : public RefBase {

        Capabilities();

    private:
        // read object from parcel even if object creation fails
        static sp<Capabilities> FromParcel(const Parcel &parcel);
        status_t writeToParcel(Parcel *parcel) const;
@@ -66,6 +73,14 @@ struct MediaCodecInfo : public RefBase {
        friend class MediaCodecInfo;
    };

    // Use a subclass to allow setting fields on construction without allowing
    // to do the same throughout the framework.
    struct CapabilitiesBuilder : public Capabilities {
        void addProfileLevel(uint32_t profile, uint32_t level);
        void addColorFormat(uint32_t format);
        void addFlags(uint32_t flags);
    };

    bool isEncoder() const;
    bool hasQuirk(const char *name) const;
    void getSupportedMimes(Vector<AString> *mimes) const;
@@ -107,7 +122,8 @@ private:
    void addQuirk(const char *name);
    status_t addMime(const char *mime);
    status_t updateMime(const char *mime);
    status_t initializeCapabilities(const CodecCapabilities &caps);
    // after this call Capabilities will be owned by MediaCodecInfo
    status_t setCapabilities(const sp<Capabilities> &caps);
    void addDetail(const AString &key, const AString &value);
    void addFeature(const AString &key, int32_t value);
    void addFeature(const AString &key, const char *value);
+8 −0
Original line number Diff line number Diff line
@@ -50,6 +50,10 @@ struct ACodec : public AHierarchicalStateMachine, public CodecBase {
    virtual void initiateStart();
    virtual void initiateShutdown(bool keepComponentAllocated = false);

    virtual status_t queryCapabilities(
            const AString &name, const AString &mime, bool isEncoder,
            sp<MediaCodecInfo::Capabilities> *caps);

    virtual status_t setSurface(const sp<Surface> &surface);

    virtual void signalFlush();
@@ -309,6 +313,10 @@ private:
            ssize_t *index = NULL);

    status_t setComponentRole(bool isEncoder, const char *mime);
    static const char *getComponentRole(bool isEncoder, const char *mime);
    static status_t setComponentRole(
            const sp<IOMX> &omx, IOMX::node_id node, const char *role);

    status_t configureCodec(const char *mime, const sp<AMessage> &msg);

    status_t configureTunneledVideoPlayback(int32_t audioHwSync,
+5 −0
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@
#include <stdint.h>
#include <media/IOMX.h>

#include <media/MediaCodecInfo.h>
#include <media/stagefright/foundation/AHandler.h>

namespace android {
@@ -59,6 +60,10 @@ struct CodecBase : public AHandler {
    // require an explicit message handler
    virtual void onMessageReceived(const sp<AMessage> &msg) = 0;

    virtual status_t queryCapabilities(
            const AString &name, const AString &mime, bool isEncoder,
            sp<MediaCodecInfo::Capabilities> *caps /* nonnull */) { return INVALID_OPERATION; }

    virtual status_t setSurface(const sp<Surface> &surface) { return INVALID_OPERATION; }

    virtual void signalFlush() = 0;
+8 −0
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@

#include <gui/IGraphicBufferProducer.h>
#include <media/hardware/CryptoAPI.h>
#include <media/MediaCodecInfo.h>
#include <media/MediaResource.h>
#include <media/stagefright/foundation/AHandler.h>
#include <media/stagefright/FrameRenderTracker.h>
@@ -73,6 +74,11 @@ struct MediaCodec : public AHandler {

    static sp<PersistentSurface> CreatePersistentInputSurface();

    // utility method to query capabilities
    static status_t QueryCapabilities(
            const AString &name, const AString &mime, bool isEncoder,
            sp<MediaCodecInfo::Capabilities> *caps /* nonnull */);

    status_t configure(
            const sp<AMessage> &format,
            const sp<Surface> &nativeWindow,
@@ -339,6 +345,8 @@ private:

    MediaCodec(const sp<ALooper> &looper, pid_t pid);

    static sp<CodecBase> GetCodecBase(const AString &name, bool nameIsType = false);

    static status_t PostAndAwaitResponse(
            const sp<AMessage> &msg, sp<AMessage> *response);

+17 −22
Original line number Diff line number Diff line
@@ -26,8 +26,6 @@
#include <media/stagefright/foundation/AMessage.h>
#include <binder/Parcel.h>

#include <media/stagefright/OMXCodec.h>

namespace android {

void MediaCodecInfo::Capabilities::getSupportedProfileLevels(
@@ -101,6 +99,21 @@ status_t MediaCodecInfo::Capabilities::writeToParcel(Parcel *parcel) const {
    return OK;
}

void MediaCodecInfo::CapabilitiesBuilder::addProfileLevel(uint32_t profile, uint32_t level) {
    ProfileLevel profileLevel;
    profileLevel.mProfile = profile;
    profileLevel.mLevel = level;
    mProfileLevels.push_back(profileLevel);
}

void MediaCodecInfo::CapabilitiesBuilder::addColorFormat(uint32_t format) {
    mColorFormats.push(format);
}

void MediaCodecInfo::CapabilitiesBuilder::addFlags(uint32_t flags) {
    mFlags |= flags;
}

bool MediaCodecInfo::isEncoder() const {
    return mIsEncoder;
}
@@ -225,26 +238,8 @@ void MediaCodecInfo::removeMime(const char *mime) {
    }
}

status_t MediaCodecInfo::initializeCapabilities(const CodecCapabilities &caps) {
    mCurrentCaps->mProfileLevels.clear();
    mCurrentCaps->mColorFormats.clear();

    for (size_t i = 0; i < caps.mProfileLevels.size(); ++i) {
        const CodecProfileLevel &src = caps.mProfileLevels.itemAt(i);

        ProfileLevel profileLevel;
        profileLevel.mProfile = src.mProfile;
        profileLevel.mLevel = src.mLevel;
        mCurrentCaps->mProfileLevels.push_back(profileLevel);
    }

    for (size_t i = 0; i < caps.mColorFormats.size(); ++i) {
        mCurrentCaps->mColorFormats.push_back(caps.mColorFormats.itemAt(i));
    }

    mCurrentCaps->mFlags = caps.mFlags;
    mCurrentCaps->mDetails = new AMessage;

status_t MediaCodecInfo::setCapabilities(const sp<Capabilities> &caps) {
    mCurrentCaps = caps;
    return OK;
}

Loading