Loading services/camera/libcameraservice/device3/Camera3OutputStream.cpp +31 −17 Original line number Diff line number Diff line Loading @@ -54,9 +54,8 @@ Camera3OutputStream::Camera3OutputStream(int id, mState = STATE_ERROR; } if (setId > CAMERA3_STREAM_SET_ID_INVALID) { mBufferReleasedListener = new BufferReleasedListener(this); } bool needsReleaseNotify = setId > CAMERA3_STREAM_SET_ID_INVALID; mBufferProducerListener = new BufferProducerListener(this, needsReleaseNotify); } Camera3OutputStream::Camera3OutputStream(int id, Loading Loading @@ -87,9 +86,8 @@ Camera3OutputStream::Camera3OutputStream(int id, mState = STATE_ERROR; } if (setId > CAMERA3_STREAM_SET_ID_INVALID) { mBufferReleasedListener = new BufferReleasedListener(this); } bool needsReleaseNotify = setId > CAMERA3_STREAM_SET_ID_INVALID; mBufferProducerListener = new BufferProducerListener(this, needsReleaseNotify); } Camera3OutputStream::Camera3OutputStream(int id, Loading Loading @@ -124,10 +122,8 @@ Camera3OutputStream::Camera3OutputStream(int id, } mConsumerName = String8("Deferred"); if (setId > CAMERA3_STREAM_SET_ID_INVALID) { mBufferReleasedListener = new BufferReleasedListener(this); } bool needsReleaseNotify = setId > CAMERA3_STREAM_SET_ID_INVALID; mBufferProducerListener = new BufferProducerListener(this, needsReleaseNotify); } Camera3OutputStream::Camera3OutputStream(int id, camera3_stream_type_t type, Loading @@ -151,9 +147,8 @@ Camera3OutputStream::Camera3OutputStream(int id, camera3_stream_type_t type, mDropBuffers(false), mDequeueBufferLatency(kDequeueLatencyBinSize) { if (setId > CAMERA3_STREAM_SET_ID_INVALID) { mBufferReleasedListener = new BufferReleasedListener(this); } bool needsReleaseNotify = setId > CAMERA3_STREAM_SET_ID_INVALID; mBufferProducerListener = new BufferProducerListener(this, needsReleaseNotify); // Subclasses expected to initialize mConsumer themselves } Loading Loading @@ -261,7 +256,7 @@ status_t Camera3OutputStream::returnBufferCheckedLocked( notifyBufferReleased(anwBuffer); if (mUseBufferManager) { // Return this buffer back to buffer manager. mBufferReleasedListener->onBufferReleased(); mBufferProducerListener->onBufferReleased(); } } else { if (mTraceFirstBuffer && (stream_type == CAMERA3_STREAM_OUTPUT)) { Loading Loading @@ -387,8 +382,8 @@ status_t Camera3OutputStream::configureConsumerQueueLocked() { // Configure consumer-side ANativeWindow interface. The listener may be used // to notify buffer manager (if it is used) of the returned buffers. res = mConsumer->connect(NATIVE_WINDOW_API_CAMERA, /*listener*/mBufferReleasedListener, /*reportBufferRemoval*/true); /*reportBufferRemoval*/true, /*listener*/mBufferProducerListener); if (res != OK) { ALOGE("%s: Unable to connect to native window for stream %d", __FUNCTION__, mId); Loading Loading @@ -790,7 +785,7 @@ status_t Camera3OutputStream::updateStream(const std::vector<sp<Surface>> &/*out return INVALID_OPERATION; } void Camera3OutputStream::BufferReleasedListener::onBufferReleased() { void Camera3OutputStream::BufferProducerListener::onBufferReleased() { sp<Camera3OutputStream> stream = mParent.promote(); if (stream == nullptr) { ALOGV("%s: Parent camera3 output stream was destroyed", __FUNCTION__); Loading Loading @@ -823,6 +818,25 @@ void Camera3OutputStream::BufferReleasedListener::onBufferReleased() { } } void Camera3OutputStream::BufferProducerListener::onBuffersDiscarded( const std::vector<sp<GraphicBuffer>>& buffers) { sp<Camera3OutputStream> stream = mParent.promote(); if (stream == nullptr) { ALOGV("%s: Parent camera3 output stream was destroyed", __FUNCTION__); return; } if (buffers.size() > 0) { Mutex::Autolock l(stream->mLock); stream->onBuffersRemovedLocked(buffers); if (stream->mUseBufferManager) { stream->mBufferManager->onBuffersRemoved(stream->getId(), stream->getStreamSetId(), buffers.size()); } ALOGV("Stream %d: %zu Buffers discarded.", stream->getId(), buffers.size()); } } void Camera3OutputStream::onBuffersRemovedLocked( const std::vector<sp<GraphicBuffer>>& removedBuffers) { sp<Camera3StreamBufferFreedListener> callback = mBufferFreedListener.promote(); Loading services/camera/libcameraservice/device3/Camera3OutputStream.h +15 −11 Original line number Diff line number Diff line Loading @@ -146,18 +146,22 @@ class Camera3OutputStream : */ virtual status_t setConsumers(const std::vector<sp<Surface>>& consumers); class BufferReleasedListener : public BnProducerListener { class BufferProducerListener : public SurfaceListener { public: BufferReleasedListener(wp<Camera3OutputStream> parent) : mParent(parent) {} BufferProducerListener(wp<Camera3OutputStream> parent, bool needsReleaseNotify) : mParent(parent), mNeedsReleaseNotify(needsReleaseNotify) {} /** * Implementation of IProducerListener, used to notify this stream that the consumer * has returned a buffer and it is ready to return to Camera3BufferManager for reuse. */ virtual void onBufferReleased(); virtual bool needsReleaseNotify() { return mNeedsReleaseNotify; } virtual void onBuffersDiscarded(const std::vector<sp<GraphicBuffer>>& buffers); private: wp<Camera3OutputStream> mParent; bool mNeedsReleaseNotify; }; virtual status_t detachBuffer(sp<GraphicBuffer>* buffer, int* fenceFd); Loading Loading @@ -262,10 +266,10 @@ class Camera3OutputStream : sp<Camera3BufferManager> mBufferManager; /** * Buffer released listener, used to notify the buffer manager that a buffer is released * from consumer side. * Buffer producer listener, used to handle notification when a buffer is released * from consumer side, or a set of buffers are discarded by the consumer. */ sp<BufferReleasedListener> mBufferReleasedListener; sp<BufferProducerListener> mBufferProducerListener; /** * Flag indicating if the buffer manager is used to allocate the stream buffers Loading Loading
services/camera/libcameraservice/device3/Camera3OutputStream.cpp +31 −17 Original line number Diff line number Diff line Loading @@ -54,9 +54,8 @@ Camera3OutputStream::Camera3OutputStream(int id, mState = STATE_ERROR; } if (setId > CAMERA3_STREAM_SET_ID_INVALID) { mBufferReleasedListener = new BufferReleasedListener(this); } bool needsReleaseNotify = setId > CAMERA3_STREAM_SET_ID_INVALID; mBufferProducerListener = new BufferProducerListener(this, needsReleaseNotify); } Camera3OutputStream::Camera3OutputStream(int id, Loading Loading @@ -87,9 +86,8 @@ Camera3OutputStream::Camera3OutputStream(int id, mState = STATE_ERROR; } if (setId > CAMERA3_STREAM_SET_ID_INVALID) { mBufferReleasedListener = new BufferReleasedListener(this); } bool needsReleaseNotify = setId > CAMERA3_STREAM_SET_ID_INVALID; mBufferProducerListener = new BufferProducerListener(this, needsReleaseNotify); } Camera3OutputStream::Camera3OutputStream(int id, Loading Loading @@ -124,10 +122,8 @@ Camera3OutputStream::Camera3OutputStream(int id, } mConsumerName = String8("Deferred"); if (setId > CAMERA3_STREAM_SET_ID_INVALID) { mBufferReleasedListener = new BufferReleasedListener(this); } bool needsReleaseNotify = setId > CAMERA3_STREAM_SET_ID_INVALID; mBufferProducerListener = new BufferProducerListener(this, needsReleaseNotify); } Camera3OutputStream::Camera3OutputStream(int id, camera3_stream_type_t type, Loading @@ -151,9 +147,8 @@ Camera3OutputStream::Camera3OutputStream(int id, camera3_stream_type_t type, mDropBuffers(false), mDequeueBufferLatency(kDequeueLatencyBinSize) { if (setId > CAMERA3_STREAM_SET_ID_INVALID) { mBufferReleasedListener = new BufferReleasedListener(this); } bool needsReleaseNotify = setId > CAMERA3_STREAM_SET_ID_INVALID; mBufferProducerListener = new BufferProducerListener(this, needsReleaseNotify); // Subclasses expected to initialize mConsumer themselves } Loading Loading @@ -261,7 +256,7 @@ status_t Camera3OutputStream::returnBufferCheckedLocked( notifyBufferReleased(anwBuffer); if (mUseBufferManager) { // Return this buffer back to buffer manager. mBufferReleasedListener->onBufferReleased(); mBufferProducerListener->onBufferReleased(); } } else { if (mTraceFirstBuffer && (stream_type == CAMERA3_STREAM_OUTPUT)) { Loading Loading @@ -387,8 +382,8 @@ status_t Camera3OutputStream::configureConsumerQueueLocked() { // Configure consumer-side ANativeWindow interface. The listener may be used // to notify buffer manager (if it is used) of the returned buffers. res = mConsumer->connect(NATIVE_WINDOW_API_CAMERA, /*listener*/mBufferReleasedListener, /*reportBufferRemoval*/true); /*reportBufferRemoval*/true, /*listener*/mBufferProducerListener); if (res != OK) { ALOGE("%s: Unable to connect to native window for stream %d", __FUNCTION__, mId); Loading Loading @@ -790,7 +785,7 @@ status_t Camera3OutputStream::updateStream(const std::vector<sp<Surface>> &/*out return INVALID_OPERATION; } void Camera3OutputStream::BufferReleasedListener::onBufferReleased() { void Camera3OutputStream::BufferProducerListener::onBufferReleased() { sp<Camera3OutputStream> stream = mParent.promote(); if (stream == nullptr) { ALOGV("%s: Parent camera3 output stream was destroyed", __FUNCTION__); Loading Loading @@ -823,6 +818,25 @@ void Camera3OutputStream::BufferReleasedListener::onBufferReleased() { } } void Camera3OutputStream::BufferProducerListener::onBuffersDiscarded( const std::vector<sp<GraphicBuffer>>& buffers) { sp<Camera3OutputStream> stream = mParent.promote(); if (stream == nullptr) { ALOGV("%s: Parent camera3 output stream was destroyed", __FUNCTION__); return; } if (buffers.size() > 0) { Mutex::Autolock l(stream->mLock); stream->onBuffersRemovedLocked(buffers); if (stream->mUseBufferManager) { stream->mBufferManager->onBuffersRemoved(stream->getId(), stream->getStreamSetId(), buffers.size()); } ALOGV("Stream %d: %zu Buffers discarded.", stream->getId(), buffers.size()); } } void Camera3OutputStream::onBuffersRemovedLocked( const std::vector<sp<GraphicBuffer>>& removedBuffers) { sp<Camera3StreamBufferFreedListener> callback = mBufferFreedListener.promote(); Loading
services/camera/libcameraservice/device3/Camera3OutputStream.h +15 −11 Original line number Diff line number Diff line Loading @@ -146,18 +146,22 @@ class Camera3OutputStream : */ virtual status_t setConsumers(const std::vector<sp<Surface>>& consumers); class BufferReleasedListener : public BnProducerListener { class BufferProducerListener : public SurfaceListener { public: BufferReleasedListener(wp<Camera3OutputStream> parent) : mParent(parent) {} BufferProducerListener(wp<Camera3OutputStream> parent, bool needsReleaseNotify) : mParent(parent), mNeedsReleaseNotify(needsReleaseNotify) {} /** * Implementation of IProducerListener, used to notify this stream that the consumer * has returned a buffer and it is ready to return to Camera3BufferManager for reuse. */ virtual void onBufferReleased(); virtual bool needsReleaseNotify() { return mNeedsReleaseNotify; } virtual void onBuffersDiscarded(const std::vector<sp<GraphicBuffer>>& buffers); private: wp<Camera3OutputStream> mParent; bool mNeedsReleaseNotify; }; virtual status_t detachBuffer(sp<GraphicBuffer>* buffer, int* fenceFd); Loading Loading @@ -262,10 +266,10 @@ class Camera3OutputStream : sp<Camera3BufferManager> mBufferManager; /** * Buffer released listener, used to notify the buffer manager that a buffer is released * from consumer side. * Buffer producer listener, used to handle notification when a buffer is released * from consumer side, or a set of buffers are discarded by the consumer. */ sp<BufferReleasedListener> mBufferReleasedListener; sp<BufferProducerListener> mBufferProducerListener; /** * Flag indicating if the buffer manager is used to allocate the stream buffers Loading