diff options
author | Andreas Huber <andih@google.com> | 2012-09-04 16:30:49 -0700 |
---|---|---|
committer | Andreas Huber <andih@google.com> | 2012-09-04 16:47:21 -0700 |
commit | 7f06639d375c44f260e00aa5e18cd883624b38bf (patch) | |
tree | bd7795b8ffae89845afcb222bcd7821ef7fe634a /media/libstagefright | |
parent | 8a61c22ecc2a38fffe978be210fe3f0a70efb71c (diff) | |
download | frameworks_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')
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 |