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

Commit 96fc6cc6 authored by Andreas Huber's avatar Andreas Huber
Browse files

Various improvements to a cleaner shutdown of the wifi display connection.

Change-Id: Id029a89939e53c2bd1d20e572d3975ec2795c239
related-to-bug: 7247918
parent de799a74
Loading
Loading
Loading
Loading
+6 −0
Original line number Original line Diff line number Diff line
@@ -52,6 +52,8 @@ class GraphicBuffer;
// may be dropped.  It is possible to wait for the buffers to be
// may be dropped.  It is possible to wait for the buffers to be
// returned (but not implemented)
// returned (but not implemented)


#define DEBUG_PENDING_BUFFERS   0

class SurfaceMediaSource : public MediaSource,
class SurfaceMediaSource : public MediaSource,
                                public MediaBufferObserver,
                                public MediaBufferObserver,
                                protected BufferQueue::ConsumerListener {
                                protected BufferQueue::ConsumerListener {
@@ -169,6 +171,10 @@ private:


    size_t mNumPendingBuffers;
    size_t mNumPendingBuffers;


#if DEBUG_PENDING_BUFFERS
    Vector<MediaBuffer *> mPendingBuffers;
#endif

    // mCurrentTimestamp is the timestamp for the current texture. It
    // mCurrentTimestamp is the timestamp for the current texture. It
    // gets set to mLastQueuedTimestamp each time updateTexImage is called.
    // gets set to mLastQueuedTimestamp each time updateTexImage is called.
    int64_t mCurrentTimestamp;
    int64_t mCurrentTimestamp;
+3 −0
Original line number Original line Diff line number Diff line
@@ -2471,6 +2471,9 @@ bool ACodec::BaseState::onOMXEmptyBufferDone(IOMX::buffer_id bufferID) {
        // by this "mediaBuffer" object. Now that the OMX component has
        // by this "mediaBuffer" object. Now that the OMX component has
        // told us that it's done with the input buffer, we can decrement
        // told us that it's done with the input buffer, we can decrement
        // the mediaBuffer's reference count.
        // the mediaBuffer's reference count.

        ALOGV("releasing mbuf %p", mediaBuffer);

        ((MediaBuffer *)mediaBuffer)->release();
        ((MediaBuffer *)mediaBuffer)->release();
        mediaBuffer = NULL;
        mediaBuffer = NULL;


+32 −0
Original line number Original line Diff line number Diff line
@@ -191,6 +191,23 @@ status_t SurfaceMediaSource::stop()
    ALOGV("stop");
    ALOGV("stop");
    Mutex::Autolock lock(mMutex);
    Mutex::Autolock lock(mMutex);


    if (mStopped) {
        return OK;
    }

    while (mNumPendingBuffers > 0) {
        ALOGI("Still waiting for %d buffers to be returned.",
                mNumPendingBuffers);

#if DEBUG_PENDING_BUFFERS
        for (size_t i = 0; i < mPendingBuffers.size(); ++i) {
            ALOGI("%d: %p", i, mPendingBuffers.itemAt(i));
        }
#endif

        mMediaBuffersAvailableCondition.wait(mMutex);
    }

    mStopped = true;
    mStopped = true;
    mFrameAvailableCondition.signal();
    mFrameAvailableCondition.signal();
    mMediaBuffersAvailableCondition.signal();
    mMediaBuffersAvailableCondition.signal();
@@ -335,6 +352,12 @@ status_t SurfaceMediaSource::read( MediaBuffer **buffer,


    ++mNumPendingBuffers;
    ++mNumPendingBuffers;


#if DEBUG_PENDING_BUFFERS
    mPendingBuffers.push_back(*buffer);
#endif

    ALOGV("returning mbuf %p", *buffer);

    return OK;
    return OK;
}
}


@@ -391,6 +414,15 @@ void SurfaceMediaSource::signalBufferReturned(MediaBuffer *buffer) {
        CHECK(!"signalBufferReturned: bogus buffer");
        CHECK(!"signalBufferReturned: bogus buffer");
    }
    }


#if DEBUG_PENDING_BUFFERS
    for (size_t i = 0; i < mPendingBuffers.size(); ++i) {
        if (mPendingBuffers.itemAt(i) == buffer) {
            mPendingBuffers.removeAt(i);
            break;
        }
    }
#endif

    --mNumPendingBuffers;
    --mNumPendingBuffers;
    mMediaBuffersAvailableCondition.broadcast();
    mMediaBuffersAvailableCondition.broadcast();
}
}
+3 −3
Original line number Original line Diff line number Diff line
@@ -176,7 +176,7 @@ ANetworkSession::Session::Session(
}
}


ANetworkSession::Session::~Session() {
ANetworkSession::Session::~Session() {
    ALOGI("Session %d gone", mSessionID);
    ALOGV("Session %d gone", mSessionID);


    close(mSocket);
    close(mSocket);
    mSocket = -1;
    mSocket = -1;
@@ -1084,7 +1084,7 @@ void ANetworkSession::threadLoop() {
                } else {
                } else {
                    status_t err = session->readMore();
                    status_t err = session->readMore();
                    if (err != OK) {
                    if (err != OK) {
                        ALOGI("readMore on socket %d failed w/ error %d (%s)",
                        ALOGE("readMore on socket %d failed w/ error %d (%s)",
                              s, err, strerror(-err));
                              s, err, strerror(-err));
                    }
                    }
                }
                }
@@ -1093,7 +1093,7 @@ void ANetworkSession::threadLoop() {
            if (FD_ISSET(s, &ws)) {
            if (FD_ISSET(s, &ws)) {
                status_t err = session->writeMore();
                status_t err = session->writeMore();
                if (err != OK) {
                if (err != OK) {
                    ALOGI("writeMore on socket %d failed w/ error %d (%s)",
                    ALOGE("writeMore on socket %d failed w/ error %d (%s)",
                          s, err, strerror(-err));
                          s, err, strerror(-err));
                }
                }
            }
            }
+75 −30
Original line number Original line Diff line number Diff line
@@ -20,12 +20,15 @@


#include "Converter.h"
#include "Converter.h"


#include "MediaPuller.h"

#include <cutils/properties.h>
#include <cutils/properties.h>
#include <gui/SurfaceTextureClient.h>
#include <gui/SurfaceTextureClient.h>
#include <media/ICrypto.h>
#include <media/ICrypto.h>
#include <media/stagefright/foundation/ABuffer.h>
#include <media/stagefright/foundation/ABuffer.h>
#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/foundation/ADebug.h>
#include <media/stagefright/foundation/AMessage.h>
#include <media/stagefright/foundation/AMessage.h>
#include <media/stagefright/MediaBuffer.h>
#include <media/stagefright/MediaCodec.h>
#include <media/stagefright/MediaCodec.h>
#include <media/stagefright/MediaDefs.h>
#include <media/stagefright/MediaDefs.h>
#include <media/stagefright/MediaErrors.h>
#include <media/stagefright/MediaErrors.h>
@@ -53,14 +56,12 @@ Converter::Converter(
}
}


Converter::~Converter() {
Converter::~Converter() {
    if (mEncoder != NULL) {
    CHECK(mEncoder == NULL);
        mEncoder->release();
        mEncoder.clear();
}
}


    AString mime;
void Converter::shutdownAsync() {
    CHECK(mInputFormat->findString("mime", &mime));
    ALOGV("shutdown");
    ALOGI("encoder (%s) shut down.", mime.c_str());
    (new AMessage(kWhatShutdown, id()))->post();
}
}


status_t Converter::initCheck() const {
status_t Converter::initCheck() const {
@@ -155,16 +156,6 @@ status_t Converter::initEncoder() {
    return mEncoder->getOutputBuffers(&mEncoderOutputBuffers);
    return mEncoder->getOutputBuffers(&mEncoderOutputBuffers);
}
}


void Converter::feedAccessUnit(const sp<ABuffer> &accessUnit) {
    sp<AMessage> msg = new AMessage(kWhatFeedAccessUnit, id());
    msg->setBuffer("accessUnit", accessUnit);
    msg->post();
}

void Converter::signalEOS() {
    (new AMessage(kWhatInputEOS, id()))->post();
}

void Converter::notifyError(status_t err) {
void Converter::notifyError(status_t err) {
    sp<AMessage> notify = mNotify->dup();
    sp<AMessage> notify = mNotify->dup();
    notify->setInt32("what", kWhatError);
    notify->setInt32("what", kWhatError);
@@ -174,32 +165,70 @@ void Converter::notifyError(status_t err) {


void Converter::onMessageReceived(const sp<AMessage> &msg) {
void Converter::onMessageReceived(const sp<AMessage> &msg) {
    switch (msg->what()) {
    switch (msg->what()) {
        case kWhatFeedAccessUnit:
        case kWhatMediaPullerNotify:
        {
        {
            int32_t what;
            CHECK(msg->findInt32("what", &what));

            if (mEncoder == NULL) {
                ALOGV("got msg '%s' after encoder shutdown.",
                      msg->debugString().c_str());

                if (what == MediaPuller::kWhatAccessUnit) {
                    sp<ABuffer> accessUnit;
                    sp<ABuffer> accessUnit;
                    CHECK(msg->findBuffer("accessUnit", &accessUnit));
                    CHECK(msg->findBuffer("accessUnit", &accessUnit));


            mInputBufferQueue.push_back(accessUnit);
                    void *mbuf;
                    if (accessUnit->meta()->findPointer("mediaBuffer", &mbuf)
                            && mbuf != NULL) {
                        ALOGV("releasing mbuf %p", mbuf);


            feedEncoderInputBuffers();
                        accessUnit->meta()->setPointer("mediaBuffer", NULL);


            scheduleDoMoreWork();
                        static_cast<MediaBuffer *>(mbuf)->release();
                        mbuf = NULL;
                    }
                }
                break;
                break;
            }
            }


        case kWhatInputEOS:
            if (what == MediaPuller::kWhatEOS) {
        {
                mInputBufferQueue.push_back(NULL);
                mInputBufferQueue.push_back(NULL);


                feedEncoderInputBuffers();
                feedEncoderInputBuffers();


                scheduleDoMoreWork();
                scheduleDoMoreWork();
            } else {
                CHECK_EQ(what, MediaPuller::kWhatAccessUnit);

                sp<ABuffer> accessUnit;
                CHECK(msg->findBuffer("accessUnit", &accessUnit));

#if 0
                void *mbuf;
                if (accessUnit->meta()->findPointer("mediaBuffer", &mbuf)
                        && mbuf != NULL) {
                    ALOGI("queueing mbuf %p", mbuf);
                }
#endif

                mInputBufferQueue.push_back(accessUnit);

                feedEncoderInputBuffers();

                scheduleDoMoreWork();
            }
            break;
            break;
        }
        }


        case kWhatDoMoreWork:
        case kWhatDoMoreWork:
        {
        {
            mDoMoreWorkPending = false;
            mDoMoreWorkPending = false;

            if (mEncoder == NULL) {
                break;
            }

            status_t err = doMoreWork();
            status_t err = doMoreWork();


            if (err != OK) {
            if (err != OK) {
@@ -212,6 +241,10 @@ void Converter::onMessageReceived(const sp<AMessage> &msg) {


        case kWhatRequestIDRFrame:
        case kWhatRequestIDRFrame:
        {
        {
            if (mEncoder == NULL) {
                break;
            }

            if (mIsVideo) {
            if (mIsVideo) {
                ALOGI("requesting IDR frame");
                ALOGI("requesting IDR frame");
                mEncoder->requestIDRFrame();
                mEncoder->requestIDRFrame();
@@ -219,6 +252,18 @@ void Converter::onMessageReceived(const sp<AMessage> &msg) {
            break;
            break;
        }
        }


        case kWhatShutdown:
        {
            ALOGI("shutting down encoder");
            mEncoder->release();
            mEncoder.clear();

            AString mime;
            CHECK(mInputFormat->findString("mime", &mime));
            ALOGI("encoder (%s) shut down.", mime.c_str());
            break;
        }

        default:
        default:
            TRESPASS();
            TRESPASS();
    }
    }
Loading