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

Commit 6032a601 authored by Andreas Huber's avatar Andreas Huber
Browse files

Signal errors to the client instead of asserting in ACodec.

Also make sure NuPlayer can properly shutdown in certain edge cases.

Change-Id: Iceb16d600d87ba66c802e60e95bf62f66487a453
parent fdfbbf62
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -316,9 +316,11 @@ void NuPlayer::onMessageReceived(const sp<AMessage> &msg) {
                                &cropLeft, &cropTop, &cropRight, &cropBottom));

                    LOGV("Video output format changed to %d x %d "
                         "(crop: %d, %d, %d, %d)",
                         "(crop: %d x %d @ (%d, %d))",
                         width, height,
                         cropLeft, cropTop, cropRight, cropBottom);
                         (cropRight - cropLeft + 1),
                         (cropBottom - cropTop + 1),
                         cropLeft, cropTop);

                    notifyListener(
                            MEDIA_SET_VIDEO_SIZE,
+28 −17
Original line number Diff line number Diff line
@@ -395,12 +395,24 @@ void NuPlayer::Renderer::onQueueBuffer(const sp<AMessage> &msg) {
        postDrainVideoQueue();
    }

    if (mSyncQueues && !mAudioQueue.empty() && !mVideoQueue.empty()) {
    if (!mSyncQueues || mAudioQueue.empty() || mVideoQueue.empty()) {
        return;
    }

    sp<ABuffer> firstAudioBuffer = (*mAudioQueue.begin()).mBuffer;
    sp<ABuffer> firstVideoBuffer = (*mVideoQueue.begin()).mBuffer;

    if (firstAudioBuffer == NULL || firstVideoBuffer == NULL) {
        // EOS signalled on either queue.
        syncQueuesDone();
        return;
    }

    int64_t firstAudioTimeUs;
    int64_t firstVideoTimeUs;
        CHECK((*mAudioQueue.begin()).mBuffer->meta()
    CHECK(firstAudioBuffer->meta()
            ->findInt64("timeUs", &firstAudioTimeUs));
        CHECK((*mVideoQueue.begin()).mBuffer->meta()
    CHECK(firstVideoBuffer->meta()
            ->findInt64("timeUs", &firstVideoTimeUs));

    int64_t diff = firstVideoTimeUs - firstAudioTimeUs;
@@ -418,7 +430,6 @@ void NuPlayer::Renderer::onQueueBuffer(const sp<AMessage> &msg) {

    syncQueuesDone();
}
}

void NuPlayer::Renderer::syncQueuesDone() {
    if (!mSyncQueues) {
+23 −3
Original line number Diff line number Diff line
@@ -1738,7 +1738,17 @@ ACodec::LoadedToIdleState::LoadedToIdleState(ACodec *codec)
void ACodec::LoadedToIdleState::stateEntered() {
    LOGV("[%s] Now Loaded->Idle", mCodec->mComponentName.c_str());

    CHECK_EQ(allocateBuffers(), (status_t)OK);
    status_t err;
    if ((err = allocateBuffers()) != OK) {
        LOGE("Failed to allocate buffers after transitioning to IDLE state "
             "(error 0x%08x)",
             err);

        sp<AMessage> notify = mCodec->mNotify->dup();
        notify->setInt32("what", ACodec::kWhatError);
        notify->setInt32("omx-error", OMX_ErrorUndefined);
        notify->post();
    }
}

status_t ACodec::LoadedToIdleState::allocateBuffers() {
@@ -2046,8 +2056,18 @@ bool ACodec::OutputPortSettingsChangedState::onOMXEvent(
                            mCodec->mNode, OMX_CommandPortEnable, kPortIndexOutput),
                         (status_t)OK);

                CHECK_EQ(mCodec->allocateBuffersOnPort(kPortIndexOutput),
                         (status_t)OK);
                status_t err;
                if ((err = mCodec->allocateBuffersOnPort(
                                kPortIndexOutput)) != OK) {
                    LOGE("Failed to allocate output port buffers after "
                         "port reconfiguration (error 0x%08x)",
                         err);

                    sp<AMessage> notify = mCodec->mNotify->dup();
                    notify->setInt32("what", ACodec::kWhatError);
                    notify->setInt32("omx-error", OMX_ErrorUndefined);
                    notify->post();
                }

                return true;
            } else if (data1 == (OMX_U32)OMX_CommandPortEnable) {