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

Commit 5c850396 authored by Andreas Huber's avatar Andreas Huber
Browse files

Add new APIs AMessage::(set|find)Buffer to make it safer to pass

ABuffer objects through messages.

Change-Id: I9f8b4e4c4767d0d70a0105e0c0813b754379b49d
parent 592b2136
Loading
Loading
Loading
Loading
+2 −3
Original line number Diff line number Diff line
@@ -324,9 +324,8 @@ status_t SimplePlayer::onPrepare() {
        CHECK_EQ(err, (status_t)OK);

        size_t j = 0;
        sp<RefBase> obj;
        while (format->findObject(StringPrintf("csd-%d", j).c_str(), &obj)) {
            sp<ABuffer> buffer = static_cast<ABuffer *>(obj.get());
        sp<ABuffer> buffer;
        while (format->findBuffer(StringPrintf("csd-%d", j).c_str(), &buffer)) {
            state->mCSD.push_back(buffer);

            ++j;
+7 −0
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@

namespace android {

struct ABuffer;
struct AString;
struct Parcel;

@@ -50,6 +51,7 @@ struct AMessage : public RefBase {
    void setPointer(const char *name, void *value);
    void setString(const char *name, const char *s, ssize_t len = -1);
    void setObject(const char *name, const sp<RefBase> &obj);
    void setBuffer(const char *name, const sp<ABuffer> &buffer);
    void setMessage(const char *name, const sp<AMessage> &obj);

    void setRect(
@@ -64,6 +66,7 @@ struct AMessage : public RefBase {
    bool findPointer(const char *name, void **value) const;
    bool findString(const char *name, AString *value) const;
    bool findObject(const char *name, sp<RefBase> *obj) const;
    bool findBuffer(const char *name, sp<ABuffer> *buffer) const;
    bool findMessage(const char *name, sp<AMessage> *obj) const;

    bool findRect(
@@ -101,6 +104,7 @@ struct AMessage : public RefBase {
        kTypeObject,
        kTypeMessage,
        kTypeRect,
        kTypeBuffer,
    };

    size_t countEntries() const;
@@ -143,6 +147,9 @@ private:
    void freeItem(Item *item);
    const Item *findItem(const char *name, Type type) const;

    void setObjectInternal(
            const char *name, const sp<RefBase> &obj, Type type);

    DISALLOW_EVIL_CONSTRUCTORS(AMessage);
};

+3 −6
Original line number Diff line number Diff line
@@ -176,13 +176,10 @@ status_t ConvertMessageToMap(
                break;
            }

            case AMessage::kTypeObject:
            case AMessage::kTypeBuffer:
            {
                sp<RefBase> obj;
                CHECK(msg->findObject(key, &obj));

                // XXX dangerous, object is not guaranteed to be a buffer.
                sp<ABuffer> buffer = static_cast<ABuffer *>(obj.get());
                sp<ABuffer> buffer;
                CHECK(msg->findBuffer(key, &buffer));

                valueObj = makeByteBufferObject(
                        env, buffer->data(), buffer->size());
+3 −5
Original line number Diff line number Diff line
@@ -768,7 +768,7 @@ status_t NuPlayer::feedDecoderInputData(bool audio, const sp<AMessage> &msg) {
         mediaTimeUs / 1E6);
#endif

    reply->setObject("buffer", accessUnit);
    reply->setBuffer("buffer", accessUnit);
    reply->post();

    return OK;
@@ -793,10 +793,8 @@ void NuPlayer::renderBuffer(bool audio, const sp<AMessage> &msg) {
        return;
    }

    sp<RefBase> obj;
    CHECK(msg->findObject("buffer", &obj));

    sp<ABuffer> buffer = static_cast<ABuffer *>(obj.get());
    sp<ABuffer> buffer;
    CHECK(msg->findBuffer("buffer", &buffer));

    int64_t &skipUntilMediaTimeUs =
        audio
+3 −6
Original line number Diff line number Diff line
@@ -214,8 +214,6 @@ sp<AMessage> NuPlayer::Decoder::makeFormat(const sp<MetaData> &meta) {

        buffer->meta()->setInt32("csd", true);
        mCSD.push(buffer);

        msg->setObject("csd", buffer);
    } else if (meta->findData(kKeyESDS, &type, &data, &size)) {
        ESDS esds((const char *)data, size);
        CHECK_EQ(esds.InitCheck(), (status_t)OK);
@@ -242,9 +240,8 @@ void NuPlayer::Decoder::onFillThisBuffer(const sp<AMessage> &msg) {
    CHECK(msg->findMessage("reply", &reply));

#if 0
    sp<RefBase> obj;
    CHECK(msg->findObject("buffer", &obj));
    sp<ABuffer> outBuffer = static_cast<ABuffer *>(obj.get());
    sp<ABuffer> outBuffer;
    CHECK(msg->findBuffer("buffer", &outBuffer));
#else
    sp<ABuffer> outBuffer;
#endif
@@ -253,7 +250,7 @@ void NuPlayer::Decoder::onFillThisBuffer(const sp<AMessage> &msg) {
        outBuffer = mCSD.editItemAt(mCSDIndex++);
        outBuffer->meta()->setInt64("timeUs", 0);

        reply->setObject("buffer", outBuffer);
        reply->setBuffer("buffer", outBuffer);
        reply->post();
        return;
    }
Loading