summaryrefslogtreecommitdiffstats
path: root/media/libstagefright
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
commit7f06639d375c44f260e00aa5e18cd883624b38bf (patch)
treebd7795b8ffae89845afcb222bcd7821ef7fe634a /media/libstagefright
parent8a61c22ecc2a38fffe978be210fe3f0a70efb71c (diff)
downloadframeworks_av-7f06639d375c44f260e00aa5e18cd883624b38bf.zip
frameworks_av-7f06639d375c44f260e00aa5e18cd883624b38bf.tar.gz
frameworks_av-7f06639d375c44f260e00aa5e18cd883624b38bf.tar.bz2
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
Diffstat (limited to 'media/libstagefright')
-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
4 files changed, 25 insertions, 21 deletions
diff --git a/media/libstagefright/SurfaceMediaSource.cpp b/media/libstagefright/SurfaceMediaSource.cpp
index c478b28..867f76d 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 ee05e45..b8b8688 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 6700a32..67471c7 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 f9223d6..c9d6562 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