From f71c4ae136f7749b9dfdaa2dd64d771868eeeb2d Mon Sep 17 00:00:00 2001 From: Daniel Lam Date: Fri, 23 Mar 2012 18:12:04 -0700 Subject: [PATCH] Added a DummyConsumer for use with BufferQueue. The DummyConsumer is a consumer that can connect to BufferQueue that does nothing. It is required as BufferQueue checks if a consumer is connected. Also fixes a bug where SurfaceTexture was reusing old texture slots. Bug: 6172739 Change-Id: I5e7a118dd4d07807ba4c763200242b5ee7d3412b --- include/gui/BufferQueue.h | 1 + include/gui/DummyConsumer.h | 49 ++++++++++++++++++++++++++++++++++ libs/gui/Android.mk | 1 + libs/gui/DummyConsumer.cpp | 52 +++++++++++++++++++++++++++++++++++++ libs/gui/SurfaceTexture.cpp | 2 ++ 5 files changed, 105 insertions(+) create mode 100644 include/gui/DummyConsumer.h create mode 100644 libs/gui/DummyConsumer.cpp diff --git a/include/gui/BufferQueue.h b/include/gui/BufferQueue.h index c01f2be42..99776b552 100644 --- a/include/gui/BufferQueue.h +++ b/include/gui/BufferQueue.h @@ -18,6 +18,7 @@ #define ANDROID_GUI_BUFFERQUEUE_H #include +#include #include #include diff --git a/include/gui/DummyConsumer.h b/include/gui/DummyConsumer.h new file mode 100644 index 000000000..6fc8da77e --- /dev/null +++ b/include/gui/DummyConsumer.h @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef ANDROID_GUI_DUMMYCONSUMER_H +#define ANDROID_GUI_DUMMYCONSUMER_H + +#include + +namespace android { +// ---------------------------------------------------------------------------- + + +// The DummyConsumer does not keep a reference to BufferQueue +// unlike SurfaceTexture. This prevents a circular reference from +// forming. The BufferQueue indirectly keeps a DummyConsumer alive +// through the proxy ConsumerListener. +class DummyConsumer : public virtual RefBase, + protected BufferQueue::ConsumerListener { +public: + DummyConsumer(sp bufferQueue); + virtual ~DummyConsumer(); + +protected: + + // Implementation of the BufferQueue::ConsumerListener interface. These + // calls are used to notify the SurfaceTexture of asynchronous events in the + // BufferQueue. + virtual void onFrameAvailable(); + virtual void onBuffersReleased(); + +}; + +// ---------------------------------------------------------------------------- +}; // namespace android + +#endif // ANDROID_GUI_DUMMYCONSUMER_H diff --git a/libs/gui/Android.mk b/libs/gui/Android.mk index 2f4ac6294..8bda3aaaf 100644 --- a/libs/gui/Android.mk +++ b/libs/gui/Android.mk @@ -21,6 +21,7 @@ LOCAL_SRC_FILES:= \ LayerState.cpp \ Surface.cpp \ SurfaceComposerClient.cpp \ + DummyConsumer.cpp LOCAL_SHARED_LIBRARIES := \ libcutils \ diff --git a/libs/gui/DummyConsumer.cpp b/libs/gui/DummyConsumer.cpp new file mode 100644 index 000000000..e42aa05b9 --- /dev/null +++ b/libs/gui/DummyConsumer.cpp @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define LOG_TAG "DummyConsumer" +// #define LOG_NDEBUG 0 + +#include + +#include +#include + +namespace android { + +DummyConsumer::DummyConsumer(sp bufferQueue) { + wp listener; + sp proxy; + listener = static_cast(this); + proxy = new BufferQueue::ProxyConsumerListener(listener); + + status_t err = bufferQueue->consumerConnect(proxy); + if (err != NO_ERROR) { + ALOGE("DummyConsumer: error connecting to BufferQueue: %s (%d)", + strerror(-err), err); + } +} + +DummyConsumer::~DummyConsumer() { + ALOGV("~DummyConsumer"); +} + +void DummyConsumer::onFrameAvailable() { + ALOGV("onFrameAvailable"); +} + +void DummyConsumer::onBuffersReleased() { + ALOGV("onBuffersReleased"); +} + +}; // namespace android diff --git a/libs/gui/SurfaceTexture.cpp b/libs/gui/SurfaceTexture.cpp index 0f2125578..07248f63d 100644 --- a/libs/gui/SurfaceTexture.cpp +++ b/libs/gui/SurfaceTexture.cpp @@ -575,6 +575,8 @@ void SurfaceTexture::onBuffersReleased() { freeBufferLocked(i); } } + + mCurrentTexture = BufferQueue::INVALID_BUFFER_SLOT; } void SurfaceTexture::dump(String8& result) const