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

Commit 3fb9f68d authored by Wei Jia's avatar Wei Jia
Browse files

ACodec: handle errors related to native window.

Bug: 17068327
Bug: 13133027
Change-Id: I9875e524222a10d1be26be5a84b9633b4aaeb210
parent a8143b2b
Loading
Loading
Loading
Loading
+5 −2
Original line number Original line Diff line number Diff line
@@ -478,10 +478,13 @@ void NuPlayer::Decoder::onShutdown() {


        if (mNativeWindow != NULL) {
        if (mNativeWindow != NULL) {
            // reconnect to surface as MediaCodec disconnected from it
            // reconnect to surface as MediaCodec disconnected from it
            CHECK_EQ((int)NO_ERROR,
            status_t error =
                    native_window_api_connect(
                    native_window_api_connect(
                            mNativeWindow->getNativeWindow().get(),
                            mNativeWindow->getNativeWindow().get(),
                            NATIVE_WINDOW_API_MEDIA));
                            NATIVE_WINDOW_API_MEDIA);
            ALOGW_IF(error != NO_ERROR,
                    "[%s] failed to connect to native window, error=%d",
                    mComponentName.c_str(), error);
        }
        }
        mComponentName = "decoder";
        mComponentName = "decoder";
    }
    }
+8 −4
Original line number Original line Diff line number Diff line
@@ -813,7 +813,10 @@ status_t ACodec::allocateOutputBuffersFromNativeWindow() {


    for (OMX_U32 i = cancelStart; i < cancelEnd; i++) {
    for (OMX_U32 i = cancelStart; i < cancelEnd; i++) {
        BufferInfo *info = &mBuffers[kPortIndexOutput].editItemAt(i);
        BufferInfo *info = &mBuffers[kPortIndexOutput].editItemAt(i);
        cancelBufferToNativeWindow(info);
        status_t error = cancelBufferToNativeWindow(info);
        if (err == 0) {
            err = error;
        }
    }
    }


    return err;
    return err;
@@ -888,11 +891,12 @@ status_t ACodec::cancelBufferToNativeWindow(BufferInfo *info) {
    int err = mNativeWindow->cancelBuffer(
    int err = mNativeWindow->cancelBuffer(
        mNativeWindow.get(), info->mGraphicBuffer.get(), -1);
        mNativeWindow.get(), info->mGraphicBuffer.get(), -1);


    CHECK_EQ(err, 0);
    ALOGW_IF(err != 0, "[%s] can not return buffer %u to native window",
            mComponentName.c_str(), info->mBufferID);


    info->mStatus = BufferInfo::OWNED_BY_NATIVE_WINDOW;
    info->mStatus = BufferInfo::OWNED_BY_NATIVE_WINDOW;


    return OK;
    return err;
}
}


ACodec::BufferInfo *ACodec::dequeueBufferFromNativeWindow() {
ACodec::BufferInfo *ACodec::dequeueBufferFromNativeWindow() {
@@ -992,7 +996,7 @@ status_t ACodec::freeBuffer(OMX_U32 portIndex, size_t i) {


    if (portIndex == kPortIndexOutput && mNativeWindow != NULL
    if (portIndex == kPortIndexOutput && mNativeWindow != NULL
            && info->mStatus == BufferInfo::OWNED_BY_US) {
            && info->mStatus == BufferInfo::OWNED_BY_US) {
        CHECK_EQ((status_t)OK, cancelBufferToNativeWindow(info));
        cancelBufferToNativeWindow(info);
    }
    }


    CHECK_EQ(mOMX->freeBuffer(
    CHECK_EQ(mOMX->freeBuffer(