From 66e72bc85fb762876baff60ef29de729da93cf26 Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Tue, 4 Sep 2012 16:30:49 -0700 Subject: 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 --- include/media/stagefright/SurfaceMediaSource.h | 3 ++ media/libstagefright/SurfaceMediaSource.cpp | 4 +++ .../wifi-display/source/Converter.cpp | 4 +++ .../libstagefright/wifi-display/source/Converter.h | 2 ++ .../wifi-display/source/PlaybackSession.cpp | 36 +++++++++------------- 5 files changed, 28 insertions(+), 21 deletions(-) diff --git a/include/media/stagefright/SurfaceMediaSource.h b/include/media/stagefright/SurfaceMediaSource.h index 724c68d..840b4aa 100644 --- a/include/media/stagefright/SurfaceMediaSource.h +++ b/include/media/stagefright/SurfaceMediaSource.h @@ -111,6 +111,9 @@ public: sp 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 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 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 getOutputFormat() const; void feedAccessUnit(const sp &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 source = new SurfaceMediaSource(info.w, info.h); sp source = new SurfaceMediaSource(720, 1280); - sp sm = defaultServiceManager(); - sp binder = sm->getService(String16("SurfaceFlinger")); - sp service = interface_cast(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 = 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 sm = defaultServiceManager(); + sp binder = sm->getService(String16("SurfaceFlinger")); + sp service = interface_cast(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 -- cgit v1.1