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

Commit 3a9243ec 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...

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

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/av/+/18415584



Change-Id: I73565eb7ea61170fc40fdeda09dfef37a54d921b
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 30a6f493 2aa59434
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -695,7 +695,7 @@ status_t Camera3OutputStream::configureConsumerQueueLocked(bool allowPreviewResp
            mSyncToDisplay = true;
            mTotalBufferCount += kDisplaySyncExtraBuffer;
        } else if (defaultToSpacer) {
            mPreviewFrameSpacer = new PreviewFrameSpacer(*this, mConsumer);
            mPreviewFrameSpacer = new PreviewFrameSpacer(this, mConsumer);
            mTotalBufferCount ++;
            res = mPreviewFrameSpacer->run(String8::format("PreviewSpacer-%d", mId).string());
            if (res != OK) {
@@ -980,6 +980,10 @@ status_t Camera3OutputStream::disconnectLocked() {

    returnPrefetchedBuffersLocked();

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

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

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

namespace camera3 {

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

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

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

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

void PreviewFrameSpacer::queueBufferToClientLocked(
        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);
    if (res != OK) {
@@ -101,13 +110,13 @@ void PreviewFrameSpacer::queueBufferToClientLocked(
    }

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

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

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

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


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