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

Commit 996e7cdd authored by Zhou Song's avatar Zhou Song Committed by Linux Build Service Account
Browse files

audio: add support for error handling of dsp SSR

audio: Support for compress offload recovery
Change-Id: I08a5ea333732b76bb9df110d905daae074b7864b

AudioFlinger: Invalidate offload track during SSR
Change-Id: I728cfcadc8cd734914b94000a711d1e86bcfad9d

Audio: post error to client during SSR
Change-Id: Idf10939f1eb0c719a692e4f53f6e3040633fab40

nuplayer: update anchor time for offload usecase
Change-Id: Ib6e0f251207c87ad1525041d07187cef91f4dda5

Change-Id: I6404f6425d7b17260ade83f2681eacf31db488c5
parent 1af6939c
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -1097,6 +1097,7 @@ status_t AudioTrack::getPosition(uint32_t *position)
    // There may be some latency differences between the HAL position and the proxy position.
    if (isOffloadedOrDirect_l() && !isPurePcmData_l()) {
        uint32_t dspFrames = 0;
        status_t status;

        if (isOffloaded_l() && ((mState == STATE_PAUSED) || (mState == STATE_PAUSED_STOPPING))) {
            ALOGV("getPosition called in paused state, return cached position %u", mPausedPosition);
@@ -1106,8 +1107,11 @@ status_t AudioTrack::getPosition(uint32_t *position)

        if (mOutput != AUDIO_IO_HANDLE_NONE) {
            uint32_t halFrames; // actually unused
            (void) AudioSystem::getRenderPosition(mOutput, &halFrames, &dspFrames);
            // FIXME: on getRenderPosition() error, we return OK with frame position 0.
            status = AudioSystem::getRenderPosition(mOutput, &halFrames, &dspFrames);
            if (status != NO_ERROR) {
                ALOGW("failed to getRenderPosition for offload session");
                return INVALID_OPERATION;
            }
        }
        // FIXME: dspFrames may not be zero in (mState == STATE_STOPPED || mState == STATE_FLUSHED)
        // due to hardware latency. We leave this behavior for now.
+5 −1
Original line number Diff line number Diff line
@@ -1530,7 +1530,11 @@ int64_t MediaPlayerService::AudioOutput::getPlayedOutDurationUs(int64_t nowUs) c
        //        numFramesPlayed, (long long)numFramesPlayedAt);
    } else {                         // case 3: transitory at new track or audio fast tracks.
        res = mTrack->getPosition(&numFramesPlayed);
        CHECK_EQ(res, (status_t)OK);
        if (res != OK) {
            // return with invalid duration to indicate playback position should
            // be queried from MediaClock using system clock
            return -1;
        }
        numFramesPlayedAt = nowUs;
        numFramesPlayedAt += 1000LL * mTrack->latency() / 2; /* XXX */
        //ALOGD("getPosition: %u %lld", numFramesPlayed, (long long)numFramesPlayedAt);
+13 −5
Original line number Diff line number Diff line
@@ -472,9 +472,11 @@ void NuPlayer::Renderer::onMessageReceived(const sp<AMessage> &msg) {

            if (onDrainAudioQueue()) {
                uint32_t numFramesPlayed;
                CHECK_EQ(mAudioSink->getPosition(&numFramesPlayed),
                         (status_t)OK);

                if (mAudioSink->getPosition(&numFramesPlayed) != OK) {
                    ALOGE("Error in time stamp query, return from here.\
                             Fillbuffer is called as part of session recreation");
                    break;
                }
                uint32_t numFramesPendingPlayout =
                    mNumFramesWritten - numFramesPlayed;

@@ -812,10 +814,16 @@ size_t NuPlayer::Renderer::fillAudioBuffer(void *buffer, size_t size) {

    if (mAudioFirstAnchorTimeMediaUs >= 0) {
        int64_t nowUs = ALooper::GetNowUs();
        int64_t nowMediaUs =
            mAudioFirstAnchorTimeMediaUs + mAudioSink->getPlayedOutDurationUs(nowUs);
        int64_t nowMediaUs = 0;
        int64_t playedDuration = mAudioSink->getPlayedOutDurationUs(nowUs);
        if (playedDuration >= 0) {
            nowMediaUs = mAudioFirstAnchorTimeMediaUs + playedDuration;
        } else {
            getCurrentPosition(&nowMediaUs);
        }
        // we don't know how much data we are queueing for offloaded tracks.
        mMediaClock->updateAnchor(nowMediaUs, nowUs, INT64_MAX);
        mAnchorTimeMediaUs = nowMediaUs;
    }

    // for non-offloaded audio, we need to compute the frames written because
+4 −2
Original line number Diff line number Diff line
@@ -2700,8 +2700,10 @@ status_t MPEG4Writer::Track::threadEntry() {
    if (mIsAudio) {
        ALOGI("Audio track drift time: %" PRId64 " us", mOwner->getDriftTimeUs());
    }

    if (err == ERROR_END_OF_STREAM) {
    // if err is ERROR_IO (ex: during SSR), return OK to save the
    // recorded file successfully. Session tear down will happen as part of
    // client callback
    if ((mIsAudio && (err == ERROR_IO)) || (err == ERROR_END_OF_STREAM)) {
        return OK;
    }
    return err;
+7 −3
Original line number Diff line number Diff line
@@ -38,6 +38,7 @@
#include <media/stagefright/PersistentSurface.h>
#include <media/stagefright/Utils.h>
#include <stagefright/AVExtensions.h>
#include <OMX_Core.h>

namespace android {

@@ -594,6 +595,9 @@ void MediaCodecSource::signalEOS(status_t err) {
            output->mBufferQueue.clear();
            output->mEncoderReachedEOS = true;
            output->mErrorCode = err;
            if (err == OMX_ErrorHardware) {
                output->mErrorCode = ERROR_IO;
            }
            output->mCond.signal();

            reachedEOS = true;
@@ -678,7 +682,7 @@ status_t MediaCodecSource::feedEncoderInputBuffers() {
            status_t err = mEncoder->getInputBuffer(bufferIndex, &inbuf);
            if (err != OK || inbuf == NULL) {
                mbuf->release();
                signalEOS();
                signalEOS(err);
                break;
            }

@@ -826,7 +830,7 @@ void MediaCodecSource::onMessageReceived(const sp<AMessage> &msg) {
            sp<ABuffer> outbuf;
            status_t err = mEncoder->getOutputBuffer(index, &outbuf);
            if (err != OK || outbuf == NULL) {
                signalEOS();
                signalEOS(err);
                break;
            }

@@ -892,7 +896,7 @@ void MediaCodecSource::onMessageReceived(const sp<AMessage> &msg) {
            CHECK(msg->findInt32("err", &err));
            ALOGE("Encoder (%s) reported error : 0x%x",
                    mIsVideo ? "video" : "audio", err);
            signalEOS();
            signalEOS(err);
       }
       break;
    }
Loading