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

Commit 8601efe4 authored by Martin Storsjo's avatar Martin Storsjo
Browse files

MediaCodec: Add a method for getting the component name

If the codec was chosen based on mime type, the caller does
not know what component actually was chosen. This allows
getting essential information (such as supported color formats,
for a video encoder) for this component.

Change-Id: Ie471f40f8104b37d27ced3dba5a54facc6504b1b
parent f0e3acd0
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -113,6 +113,8 @@ struct MediaCodec : public AHandler {
    // pending, an error is pending.
    void requestActivityNotification(const sp<AMessage> &notify);

    status_t getName(AString *componentName) const;

protected:
    virtual ~MediaCodec();
    virtual void onMessageReceived(const sp<AMessage> &msg);
@@ -154,6 +156,7 @@ private:
        kWhatCodecNotify                    = 'codc',
        kWhatRequestIDRFrame                = 'ridr',
        kWhatRequestActivityNotification    = 'racN',
        kWhatGetName                        = 'getN',
    };

    enum {
@@ -178,6 +181,7 @@ private:
    sp<ALooper> mLooper;
    sp<ALooper> mCodecLooper;
    sp<ACodec> mCodec;
    AString mComponentName;
    uint32_t mReplyID;
    uint32_t mFlags;
    sp<SurfaceTextureClient> mNativeWindow;
+40 −4
Original line number Diff line number Diff line
@@ -302,6 +302,20 @@ status_t MediaCodec::getOutputFormat(sp<AMessage> *format) const {
    return OK;
}

status_t MediaCodec::getName(AString *name) const {
    sp<AMessage> msg = new AMessage(kWhatGetName, id());

    sp<AMessage> response;
    status_t err;
    if ((err = PostAndAwaitResponse(msg, &response)) != OK) {
        return err;
    }

    CHECK(response->findString("name", name));

    return OK;
}

status_t MediaCodec::getInputBuffers(Vector<sp<ABuffer> > *buffers) const {
    sp<AMessage> msg = new AMessage(kWhatGetBuffers, id());
    msg->setInt32("portIndex", kPortIndexInput);
@@ -534,16 +548,15 @@ void MediaCodec::onMessageReceived(const sp<AMessage> &msg) {
                    CHECK_EQ(mState, INITIALIZING);
                    setState(INITIALIZED);

                    AString componentName;
                    CHECK(msg->findString("componentName", &componentName));
                    CHECK(msg->findString("componentName", &mComponentName));

                    if (componentName.startsWith("OMX.google.")) {
                    if (mComponentName.startsWith("OMX.google.")) {
                        mFlags |= kFlagIsSoftwareCodec;
                    } else {
                        mFlags &= ~kFlagIsSoftwareCodec;
                    }

                    if (componentName.endsWith(".secure")) {
                    if (mComponentName.endsWith(".secure")) {
                        mFlags |= kFlagIsSecure;
                    } else {
                        mFlags &= ~kFlagIsSecure;
@@ -1171,6 +1184,25 @@ void MediaCodec::onMessageReceived(const sp<AMessage> &msg) {
            break;
        }

        case kWhatGetName:
        {
            uint32_t replyID;
            CHECK(msg->senderAwaitsResponse(&replyID));

            if (mComponentName.empty()) {
                sp<AMessage> response = new AMessage;
                response->setInt32("err", INVALID_OPERATION);

                response->postReply(replyID);
                break;
            }

            sp<AMessage> response = new AMessage;
            response->setString("name", mComponentName.c_str());
            response->postReply(replyID);
            break;
        }

        default:
            TRESPASS();
    }
@@ -1240,6 +1272,10 @@ void MediaCodec::setState(State newState) {
        mActivityNotify.clear();
    }

    if (newState == UNINITIALIZED) {
        mComponentName.clear();
    }

    mState = newState;

    cancelPendingDequeueOperations();