diff options
-rw-r--r-- | cmds/stagefright/stagefright.cpp | 60 | ||||
-rw-r--r-- | media/libstagefright/OMXCodec.cpp | 7 |
2 files changed, 67 insertions, 0 deletions
diff --git a/cmds/stagefright/stagefright.cpp b/cmds/stagefright/stagefright.cpp index 73215d3..5397a69 100644 --- a/cmds/stagefright/stagefright.cpp +++ b/cmds/stagefright/stagefright.cpp @@ -61,6 +61,66 @@ static void playSource(OMXClient *client, const sp<MediaSource> &source) { decoder->start(); + if (gReproduceBug == 3) { + status_t err; + MediaBuffer *buffer; + MediaSource::ReadOptions options; + int64_t seekTimeUs = -1; + for (;;) { + err = decoder->read(&buffer, &options); + options.clearSeekTo(); + + bool shouldSeek = false; + if (err != OK) { + printf("reached EOF.\n"); + + shouldSeek = true; + } else { + int32_t units, scale; + CHECK(buffer->meta_data()->findInt32(kKeyTimeUnits, &units)); + CHECK(buffer->meta_data()->findInt32(kKeyTimeScale, &scale)); + int64_t timestamp = ((OMX_TICKS)units * 1000000) / scale; + + bool failed = false; + if (seekTimeUs >= 0) { + int64_t diff = timestamp - seekTimeUs; + + if (diff > 500000) { + printf("ERROR: "); + failed = true; + } + } + + printf("buffer has timestamp %lld us (%.2f secs)\n", + timestamp, timestamp / 1E6); + + buffer->release(); + buffer = NULL; + + if (failed) { + break; + } + + shouldSeek = ((double)rand() / RAND_MAX) < 0.1; + shouldSeek = false; + } + + seekTimeUs = -1; + + if (shouldSeek) { + seekTimeUs = (rand() * 30E6) / RAND_MAX; + options.setSeekTo(seekTimeUs); + + printf("seeking to %lld us (%.2f secs)\n", + seekTimeUs, seekTimeUs / 1E6); + } + } + + decoder->stop(); + + return; + } + int n = 0; int64_t startTime = getNowUs(); diff --git a/media/libstagefright/OMXCodec.cpp b/media/libstagefright/OMXCodec.cpp index ba4c4c7..c4c6149 100644 --- a/media/libstagefright/OMXCodec.cpp +++ b/media/libstagefright/OMXCodec.cpp @@ -1148,6 +1148,13 @@ void OMXCodec::onCmdComplete(OMX_COMMANDTYPE cmd, OMX_U32 data) { CODEC_LOGV("Finished flushing both ports, now continuing from" " seek-time."); + // Clear this flag in case the decoder sent us either + // the EVENT_BUFFER_FLAG(1) or an output buffer with + // the EOS flag set _while_ flushing. Since we're going + // to submit "fresh" input data now, this flag no longer + // applies to our future. + mNoMoreOutputData = false; + drainInputBuffers(); fillOutputBuffers(); } |