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

Commit ced159b1 authored by Andreas Huber's avatar Andreas Huber
Browse files

When encountering a discontinuity, flush(clear) all content enqueued up to that

point except previously enqueued discontinuities.

Change-Id: Id04a559dc062fa4a5c80c599ad74bf81a543de01
related-to-bug: 5201378
parent 12bde60b
Loading
Loading
Loading
Loading
+27 −10
Original line number Diff line number Diff line
@@ -14,6 +14,10 @@
 * limitations under the License.
 */

//#define LOG_NDEBUG 0
#define LOG_TAG "stream"
#include "utils/Log.h"

#include <binder/ProcessState.h>

#include <media/IStreamSource.h>
@@ -50,7 +54,7 @@ protected:
private:
    int mFd;
    off64_t mFileSize;
    int64_t mNextSeekTimeUs;
    uint64_t mNumPacketsSent;

    sp<IStreamListener> mListener;
    Vector<sp<IMemory> > mBuffers;
@@ -61,7 +65,7 @@ private:
MyStreamSource::MyStreamSource(int fd)
    : mFd(fd),
      mFileSize(0),
      mNextSeekTimeUs(-1) {  // ALooper::GetNowUs() + 5000000ll) {
      mNumPacketsSent(0) {
    CHECK_GE(fd, 0);

    mFileSize = lseek64(fd, 0, SEEK_END);
@@ -84,18 +88,24 @@ void MyStreamSource::setBuffers(const Vector<sp<IMemory> > &buffers) {
void MyStreamSource::onBufferAvailable(size_t index) {
    CHECK_LT(index, mBuffers.size());

    if (mNextSeekTimeUs >= 0 && mNextSeekTimeUs <= ALooper::GetNowUs()) {
        off64_t offset = (off64_t)(((float)rand() / RAND_MAX) * mFileSize * 0.8);
        offset = (offset / 188) * 188;
#if 0
    if (mNumPacketsSent >= 20000) {
        LOGI("signalling discontinuity now");

        off64_t offset = 0;
        CHECK((offset % 188) == 0);

        lseek(mFd, offset, SEEK_SET);

        sp<AMessage> extra = new AMessage;
        extra->setInt32(IStreamListener::kKeyFormatChange, 0);

        mListener->issueCommand(
                IStreamListener::DISCONTINUITY, false /* synchronous */);
                IStreamListener::DISCONTINUITY, false /* synchronous */, extra);

        mNextSeekTimeUs = -1;
        mNextSeekTimeUs = ALooper::GetNowUs() + 5000000ll;
        mNumPacketsSent = 0;
    }
#endif

    sp<IMemory> mem = mBuffers.itemAt(index);

@@ -104,6 +114,8 @@ void MyStreamSource::onBufferAvailable(size_t index) {
        mListener->issueCommand(IStreamListener::EOS, false /* synchronous */);
    } else {
        mListener->queueBuffer(index, n);

        mNumPacketsSent += n / 188;
    }
}
////////////////////////////////////////////////////////////////////////////////
@@ -293,12 +305,17 @@ int main(int argc, char **argv) {
    sp<SurfaceComposerClient> composerClient = new SurfaceComposerClient;
    CHECK_EQ(composerClient->initCheck(), (status_t)OK);

    ssize_t displayWidth = composerClient->getDisplayWidth(0);
    ssize_t displayHeight = composerClient->getDisplayHeight(0);

    LOGV("display is %d x %d\n", displayWidth, displayHeight);

    sp<SurfaceControl> control =
        composerClient->createSurface(
                String8("A Surface"),
                0,
                1280,
                800,
                displayWidth,
                displayHeight,
                PIXEL_FORMAT_RGB_565,
                0);

+18 −14
Original line number Diff line number Diff line
@@ -136,24 +136,28 @@ void AnotherPacketSource::queueAccessUnit(const sp<ABuffer> &buffer) {
void AnotherPacketSource::queueDiscontinuity(
        ATSParser::DiscontinuityType type,
        const sp<AMessage> &extra) {
    sp<ABuffer> buffer = new ABuffer(0);
    buffer->meta()->setInt32("discontinuity", static_cast<int32_t>(type));
    buffer->meta()->setMessage("extra", extra);

    Mutex::Autolock autoLock(mLock);

#if 0
    if (type == ATSParser::DISCONTINUITY_SEEK
            || type == ATSParser::DISCONTINUITY_FORMATCHANGE) {
        // XXX Fix this: This will also clear any pending discontinuities,
        // If there's a pending DISCONTINUITY_FORMATCHANGE and the new
        // discontinuity is "just" a DISCONTINUITY_SEEK, this will effectively
        // downgrade the type of discontinuity received by the client.
    // Leave only discontinuities in the queue.
    List<sp<ABuffer> >::iterator it = mBuffers.begin();
    while (it != mBuffers.end()) {
        sp<ABuffer> oldBuffer = *it;

        mBuffers.clear();
        mEOSResult = OK;
        int32_t oldDiscontinuityType;
        if (!oldBuffer->meta()->findInt32(
                    "discontinuity", &oldDiscontinuityType)) {
            it = mBuffers.erase(it);
            continue;
        }

        ++it;
    }
#endif

    mEOSResult = OK;

    sp<ABuffer> buffer = new ABuffer(0);
    buffer->meta()->setInt32("discontinuity", static_cast<int32_t>(type));
    buffer->meta()->setMessage("extra", extra);

    mBuffers.push_back(buffer);
    mCondition.signal();