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

Commit 16f61fcb authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Camera: Exit PreviewStreamSpacer when disconnecting stream" into tm-dev am: c3a3ee83

parents ef3e88c9 c3a3ee83
Loading
Loading
Loading
Loading
+5 −1
Original line number Original line Diff line number Diff line
@@ -689,7 +689,7 @@ status_t Camera3OutputStream::configureConsumerQueueLocked(bool allowPreviewResp
            mSyncToDisplay = true;
            mSyncToDisplay = true;
            mTotalBufferCount += kDisplaySyncExtraBuffer;
            mTotalBufferCount += kDisplaySyncExtraBuffer;
        } else if (defaultToSpacer) {
        } else if (defaultToSpacer) {
            mPreviewFrameSpacer = new PreviewFrameSpacer(*this, mConsumer);
            mPreviewFrameSpacer = new PreviewFrameSpacer(this, mConsumer);
            mTotalBufferCount ++;
            mTotalBufferCount ++;
            res = mPreviewFrameSpacer->run(String8::format("PreviewSpacer-%d", mId).string());
            res = mPreviewFrameSpacer->run(String8::format("PreviewSpacer-%d", mId).string());
            if (res != OK) {
            if (res != OK) {
@@ -970,6 +970,10 @@ status_t Camera3OutputStream::disconnectLocked() {


    returnPrefetchedBuffersLocked();
    returnPrefetchedBuffersLocked();


    if (mPreviewFrameSpacer != nullptr) {
        mPreviewFrameSpacer->requestExit();
    }

    ALOGV("%s: disconnecting stream %d from native window", __FUNCTION__, getId());
    ALOGV("%s: disconnecting stream %d from native window", __FUNCTION__, getId());


    res = native_window_api_disconnect(mConsumer.get(),
    res = native_window_api_disconnect(mConsumer.get(),
+16 −7
Original line number Original line Diff line number Diff line
@@ -27,13 +27,12 @@ namespace android {


namespace camera3 {
namespace camera3 {


PreviewFrameSpacer::PreviewFrameSpacer(Camera3OutputStream& parent, sp<Surface> consumer) :
PreviewFrameSpacer::PreviewFrameSpacer(wp<Camera3OutputStream> parent, sp<Surface> consumer) :
        mParent(parent),
        mParent(parent),
        mConsumer(consumer) {
        mConsumer(consumer) {
}
}


PreviewFrameSpacer::~PreviewFrameSpacer() {
PreviewFrameSpacer::~PreviewFrameSpacer() {
    Thread::requestExitAndWait();
}
}


status_t PreviewFrameSpacer::queuePreviewBuffer(nsecs_t timestamp, nsecs_t readoutTimestamp,
status_t PreviewFrameSpacer::queuePreviewBuffer(nsecs_t timestamp, nsecs_t readoutTimestamp,
@@ -51,8 +50,12 @@ bool PreviewFrameSpacer::threadLoop() {
    Mutex::Autolock l(mLock);
    Mutex::Autolock l(mLock);
    if (mPendingBuffers.size() == 0) {
    if (mPendingBuffers.size() == 0) {
        mBufferCond.waitRelative(mLock, kWaitDuration);
        mBufferCond.waitRelative(mLock, kWaitDuration);
        if (exitPending()) {
            return false;
        } else {
            return true;
            return true;
        }
        }
    }


    nsecs_t currentTime = systemTime();
    nsecs_t currentTime = systemTime();
    auto buffer = mPendingBuffers.front();
    auto buffer = mPendingBuffers.front();
@@ -71,7 +74,7 @@ bool PreviewFrameSpacer::threadLoop() {
    if (frameWaitTime > 0 && mPendingBuffers.size() < 2) {
    if (frameWaitTime > 0 && mPendingBuffers.size() < 2) {
        mBufferCond.waitRelative(mLock, frameWaitTime);
        mBufferCond.waitRelative(mLock, frameWaitTime);
        if (exitPending()) {
        if (exitPending()) {
            return true;
            return false;
        }
        }
        currentTime = systemTime();
        currentTime = systemTime();
    }
    }
@@ -92,7 +95,13 @@ void PreviewFrameSpacer::requestExit() {


void PreviewFrameSpacer::queueBufferToClientLocked(
void PreviewFrameSpacer::queueBufferToClientLocked(
        const BufferHolder& bufferHolder, nsecs_t currentTime) {
        const BufferHolder& bufferHolder, nsecs_t currentTime) {
    mParent.setTransform(bufferHolder.transform, true/*mayChangeMirror*/);
    sp<Camera3OutputStream> parent = mParent.promote();
    if (parent == nullptr) {
        ALOGV("%s: Parent camera3 output stream was destroyed", __FUNCTION__);
        return;
    }

    parent->setTransform(bufferHolder.transform, true/*mayChangeMirror*/);


    status_t res = native_window_set_buffers_timestamp(mConsumer.get(), bufferHolder.timestamp);
    status_t res = native_window_set_buffers_timestamp(mConsumer.get(), bufferHolder.timestamp);
    if (res != OK) {
    if (res != OK) {
@@ -101,13 +110,13 @@ void PreviewFrameSpacer::queueBufferToClientLocked(
    }
    }


    Camera3Stream::queueHDRMetadata(bufferHolder.anwBuffer.get()->handle, mConsumer,
    Camera3Stream::queueHDRMetadata(bufferHolder.anwBuffer.get()->handle, mConsumer,
            mParent.getDynamicRangeProfile());
            parent->getDynamicRangeProfile());


    res = mConsumer->queueBuffer(mConsumer.get(), bufferHolder.anwBuffer.get(),
    res = mConsumer->queueBuffer(mConsumer.get(), bufferHolder.anwBuffer.get(),
            bufferHolder.releaseFence);
            bufferHolder.releaseFence);
    if (res != OK) {
    if (res != OK) {
        close(bufferHolder.releaseFence);
        close(bufferHolder.releaseFence);
        if (mParent.shouldLogError(res)) {
        if (parent->shouldLogError(res)) {
            ALOGE("%s: Failed to queue buffer to client: %s(%d)", __FUNCTION__,
            ALOGE("%s: Failed to queue buffer to client: %s(%d)", __FUNCTION__,
                    strerror(-res), res);
                    strerror(-res), res);
        }
        }
+2 −3
Original line number Original line Diff line number Diff line
@@ -49,7 +49,7 @@ class Camera3OutputStream;
 */
 */
class PreviewFrameSpacer : public Thread {
class PreviewFrameSpacer : public Thread {
  public:
  public:
    explicit PreviewFrameSpacer(Camera3OutputStream& parent, sp<Surface> consumer);
    explicit PreviewFrameSpacer(wp<Camera3OutputStream> parent, sp<Surface> consumer);
    virtual ~PreviewFrameSpacer();
    virtual ~PreviewFrameSpacer();


    // Queue preview buffer locally
    // Queue preview buffer locally
@@ -75,8 +75,7 @@ class PreviewFrameSpacer : public Thread {


    void queueBufferToClientLocked(const BufferHolder& bufferHolder, nsecs_t currentTime);
    void queueBufferToClientLocked(const BufferHolder& bufferHolder, nsecs_t currentTime);



    wp<Camera3OutputStream> mParent;
    Camera3OutputStream& mParent;
    sp<ANativeWindow> mConsumer;
    sp<ANativeWindow> mConsumer;
    mutable Mutex mLock;
    mutable Mutex mLock;
    Condition mBufferCond;
    Condition mBufferCond;