summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2012-09-04 16:30:49 -0700
committerAndreas Huber <andih@google.com>2012-09-04 16:47:21 -0700
commit66e72bc85fb762876baff60ef29de729da93cf26 (patch)
treebe694f1cbe0c554e4e4e351cdc7c80b177a864f2
parentfbe9d81ff5fbdc5aecdcdd13e4a5d7f019824f96 (diff)
Configure the SurfaceMediaSource to emit the same number of buffers
as the video encoder allocates for its input. Do this before connecting the bufferqueue through surface flinger. Change-Id: Ibc81db1359afe2d88fdb75b23fadae65c8a6f7cc
-rw-r--r--include/media/stagefright/SurfaceMediaSource.h3
-rw-r--r--media/libstagefright/SurfaceMediaSource.cpp4
-rw-r--r--media/libstagefright/wifi-display/source/Converter.cpp4
-rw-r--r--media/libstagefright/wifi-display/source/Converter.h2
-rw-r--r--media/libstagefright/wifi-display/source/PlaybackSession.cpp36
5 files changed, 28 insertions, 21 deletions
diff --git a/include/media/stagefright/SurfaceMediaSource.h b/include/media/stagefright/SurfaceMediaSource.h
index 724c68d3..840b4aa7 100644
--- a/include/media/stagefright/SurfaceMediaSource.h
+++ b/include/media/stagefright/SurfaceMediaSource.h
@@ -111,6 +111,9 @@ public:
sp<BufferQueue> getBufferQueue() const { return mBufferQueue; }
+ // To be called before start()
+ status_t setMaxAcquiredBufferCount(size_t count);
+
protected:
// Implementation of the BufferQueue::ConsumerListener interface. These
diff --git a/media/libstagefright/SurfaceMediaSource.cpp b/media/libstagefright/SurfaceMediaSource.cpp
index c478b285..867f76d1 100644
--- a/media/libstagefright/SurfaceMediaSource.cpp
+++ b/media/libstagefright/SurfaceMediaSource.cpp
@@ -167,6 +167,10 @@ status_t SurfaceMediaSource::start(MetaData *params)
return OK;
}
+status_t SurfaceMediaSource::setMaxAcquiredBufferCount(size_t count) {
+ return mBufferQueue->setMaxAcquiredBufferCount(count);
+}
+
status_t SurfaceMediaSource::stop()
{
diff --git a/media/libstagefright/wifi-display/source/Converter.cpp b/media/libstagefright/wifi-display/source/Converter.cpp
index ee05e457..b8b8688e 100644
--- a/media/libstagefright/wifi-display/source/Converter.cpp
+++ b/media/libstagefright/wifi-display/source/Converter.cpp
@@ -54,6 +54,10 @@ status_t Converter::initCheck() const {
return mInitCheck;
}
+size_t Converter::getInputBufferCount() const {
+ return mEncoderInputBuffers.size();
+}
+
sp<AMessage> Converter::getOutputFormat() const {
return mOutputFormat;
}
diff --git a/media/libstagefright/wifi-display/source/Converter.h b/media/libstagefright/wifi-display/source/Converter.h
index 6700a321..67471c7f 100644
--- a/media/libstagefright/wifi-display/source/Converter.h
+++ b/media/libstagefright/wifi-display/source/Converter.h
@@ -36,6 +36,8 @@ struct Converter : public AHandler {
status_t initCheck() const;
+ size_t getInputBufferCount() const;
+
sp<AMessage> getOutputFormat() const;
void feedAccessUnit(const sp<ABuffer> &accessUnit);
diff --git a/media/libstagefright/wifi-display/source/PlaybackSession.cpp b/media/libstagefright/wifi-display/source/PlaybackSession.cpp
index f9223d62..c9d6562b 100644
--- a/media/libstagefright/wifi-display/source/PlaybackSession.cpp
+++ b/media/libstagefright/wifi-display/source/PlaybackSession.cpp
@@ -600,27 +600,6 @@ status_t WifiDisplaySource::PlaybackSession::setupPacketizer() {
// sp<SurfaceMediaSource> source = new SurfaceMediaSource(info.w, info.h);
sp<SurfaceMediaSource> source = new SurfaceMediaSource(720, 1280);
- sp<IServiceManager> sm = defaultServiceManager();
- sp<IBinder> binder = sm->getService(String16("SurfaceFlinger"));
- sp<ISurfaceComposer> service = interface_cast<ISurfaceComposer>(binder);
- CHECK(service != NULL);
-
- service->connectDisplay(source->getBufferQueue());
-
-#if 0
- {
- ALOGI("reading buffer");
-
- CHECK_EQ((status_t)OK, source->start());
- MediaBuffer *mbuf;
- CHECK_EQ((status_t)OK, source->read(&mbuf));
- mbuf->release();
- mbuf = NULL;
-
- ALOGI("got buffer");
- }
-#endif
-
#if 0
ssize_t index = mSerializer->addSource(source);
#else
@@ -644,10 +623,25 @@ status_t WifiDisplaySource::PlaybackSession::setupPacketizer() {
sp<Converter> converter =
new Converter(notify, mCodecLooper, format);
+ CHECK_EQ(converter->initCheck(), (status_t)OK);
+
+ size_t numInputBuffers = converter->getInputBufferCount();
+ ALOGI("numInputBuffers to the encoder is %d", numInputBuffers);
looper()->registerHandler(converter);
mTracks.add(index, new Track(converter));
+
+ sp<IServiceManager> sm = defaultServiceManager();
+ sp<IBinder> binder = sm->getService(String16("SurfaceFlinger"));
+ sp<ISurfaceComposer> service = interface_cast<ISurfaceComposer>(binder);
+ CHECK(service != NULL);
+
+ // Add one reference to account for the serializer.
+ err = source->setMaxAcquiredBufferCount(numInputBuffers + 1);
+ CHECK_EQ(err, (status_t)OK);
+
+ service->connectDisplay(source->getBufferQueue());
#endif
#if 0