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

Commit 76d73bce authored by Wonsik Kim's avatar Wonsik Kim
Browse files

stagefright: explicitly mark discarded buffers

Return buffers always, but mark discarded buffers explicitly.

Bug: 33059528
Test: (manual) open a website with a looping video and see that it works.
Test: adb shell am instrument -e size small -w 'android.media.cts/android.support.test.runner.AndroidJUnitRunner'
Change-Id: Icbe12d09b5721747437592e11def2302f4c8bf79
parent b11a5896
Loading
Loading
Loading
Loading
+12 −12
Original line number Original line Diff line number Diff line
@@ -5513,9 +5513,8 @@ void ACodec::BaseState::onInputBufferFilled(const sp<AMessage> &msg) {
    int32_t err = OK;
    int32_t err = OK;
    bool eos = false;
    bool eos = false;
    PortMode mode = getPortMode(kPortIndexInput);
    PortMode mode = getPortMode(kPortIndexInput);

    int32_t discarded = 0;
    sp<RefBase> obj;
    if (msg->findInt32("discarded", &discarded) && discarded) {
    if (!msg->findObject("buffer", &obj)) {
        /* these are unfilled buffers returned by client */
        /* these are unfilled buffers returned by client */
        CHECK(msg->findInt32("err", &err));
        CHECK(msg->findInt32("err", &err));


@@ -5527,9 +5526,10 @@ void ACodec::BaseState::onInputBufferFilled(const sp<AMessage> &msg) {
                 mCodec->mComponentName.c_str(), err);
                 mCodec->mComponentName.c_str(), err);
            eos = true;
            eos = true;
        }
        }
    } else {
        buffer = static_cast<MediaCodecBuffer *>(obj.get());
    }
    }
    sp<RefBase> obj;
    CHECK(msg->findObject("buffer", &obj));
    buffer = static_cast<MediaCodecBuffer *>(obj.get());


    int32_t tmp;
    int32_t tmp;
    if (buffer != NULL && buffer->meta()->findInt32("eos", &tmp) && tmp) {
    if (buffer != NULL && buffer->meta()->findInt32("eos", &tmp) && tmp) {
@@ -5957,10 +5957,11 @@ void ACodec::BaseState::onOutputBufferDrained(const sp<AMessage> &msg) {
    IOMX::buffer_id bufferID;
    IOMX::buffer_id bufferID;
    CHECK(msg->findInt32("buffer-id", (int32_t*)&bufferID));
    CHECK(msg->findInt32("buffer-id", (int32_t*)&bufferID));
    sp<RefBase> obj;
    sp<RefBase> obj;
    sp<MediaCodecBuffer> buffer = nullptr;
    CHECK(msg->findObject("buffer", &obj));
    if (msg->findObject("buffer", &obj)) {
    sp<MediaCodecBuffer> buffer = static_cast<MediaCodecBuffer *>(obj.get());
        buffer = static_cast<MediaCodecBuffer *>(obj.get());
    int32_t discarded = 0;
    }
    msg->findInt32("discarded", &discarded);

    ssize_t index;
    ssize_t index;
    BufferInfo *info = mCodec->findBufferByID(kPortIndexOutput, bufferID, &index);
    BufferInfo *info = mCodec->findBufferByID(kPortIndexOutput, bufferID, &index);
    BufferInfo::Status status = BufferInfo::getSafeStatus(info);
    BufferInfo::Status status = BufferInfo::getSafeStatus(info);
@@ -5992,7 +5993,7 @@ void ACodec::BaseState::onOutputBufferDrained(const sp<AMessage> &msg) {
    int32_t render;
    int32_t render;
    if (mCodec->mNativeWindow != NULL
    if (mCodec->mNativeWindow != NULL
            && msg->findInt32("render", &render) && render != 0
            && msg->findInt32("render", &render) && render != 0
            && buffer != NULL && buffer->size() != 0) {
            && !discarded && buffer->size() != 0) {
        ATRACE_NAME("render");
        ATRACE_NAME("render");
        // The client wants this buffer to be rendered.
        // The client wants this buffer to be rendered.


@@ -6031,8 +6032,7 @@ void ACodec::BaseState::onOutputBufferDrained(const sp<AMessage> &msg) {
            info->mIsReadFence = false;
            info->mIsReadFence = false;
        }
        }
    } else {
    } else {
        if (mCodec->mNativeWindow != NULL &&
        if (mCodec->mNativeWindow != NULL && (discarded || buffer->size() != 0)) {
            (buffer == NULL || buffer->size() != 0)) {
            // move read fence into write fence to avoid clobbering
            // move read fence into write fence to avoid clobbering
            info->mIsReadFence = false;
            info->mIsReadFence = false;
            ATRACE_NAME("frame-drop");
            ATRACE_NAME("frame-drop");
+3 −0
Original line number Original line Diff line number Diff line
@@ -2361,6 +2361,9 @@ void MediaCodec::returnBuffersToCodecOnPort(int32_t portIndex, bool isReclaim) {


        if (info->mNotify != NULL) {
        if (info->mNotify != NULL) {
            sp<AMessage> msg = info->mNotify;
            sp<AMessage> msg = info->mNotify;
            msg->setObject("buffer", (info->mSecureData != nullptr)
                    ? info->mSecureData : info->mData);
            msg->setInt32("discarded", true);
            info->mNotify = NULL;
            info->mNotify = NULL;
            if (isReclaim && info->mOwnedByClient) {
            if (isReclaim && info->mOwnedByClient) {
                ALOGD("port %d buffer %zu still owned by client when codec is reclaimed",
                ALOGD("port %d buffer %zu still owned by client when codec is reclaimed",