Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 66e72bc8 authored by Andreas Huber's avatar Andreas Huber
Browse files

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
parent fbe9d81f
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -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
+4 −0
Original line number Diff line number Diff line
@@ -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()
{
+4 −0
Original line number Diff line number Diff line
@@ -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;
}
+2 −0
Original line number Diff line number Diff line
@@ -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);
+15 −21
Original line number Diff line number Diff line
@@ -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