diff options
author | Andreas Huber <andih@google.com> | 2011-08-25 13:40:16 -0700 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2011-08-25 13:40:16 -0700 |
commit | 24245683b9285b0b53c8900f088cf146000501c4 (patch) | |
tree | 43b77e68322df454e3b18a7e7bd43a91937eb0e7 | |
parent | 9a82f8acd4138fe920e91bd73e0041d52b2db237 (diff) | |
parent | 9a442c1b9a051edc6d4ceb0daad2d0a8433e7b0b (diff) | |
download | frameworks_av-24245683b9285b0b53c8900f088cf146000501c4.zip frameworks_av-24245683b9285b0b53c8900f088cf146000501c4.tar.gz frameworks_av-24245683b9285b0b53c8900f088cf146000501c4.tar.bz2 |
Merge "When encountering a discontinuity, flush(clear) all content enqueued up to that"
-rw-r--r-- | cmds/stagefright/stream.cpp | 37 | ||||
-rw-r--r-- | media/libstagefright/mpeg2ts/AnotherPacketSource.cpp | 32 |
2 files changed, 45 insertions, 24 deletions
diff --git a/cmds/stagefright/stream.cpp b/cmds/stagefright/stream.cpp index ee91c29..aa3bc03 100644 --- a/cmds/stagefright/stream.cpp +++ b/cmds/stagefright/stream.cpp @@ -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); diff --git a/media/libstagefright/mpeg2ts/AnotherPacketSource.cpp b/media/libstagefright/mpeg2ts/AnotherPacketSource.cpp index 2e66a2c..ce07e32 100644 --- a/media/libstagefright/mpeg2ts/AnotherPacketSource.cpp +++ b/media/libstagefright/mpeg2ts/AnotherPacketSource.cpp @@ -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; + + int32_t oldDiscontinuityType; + if (!oldBuffer->meta()->findInt32( + "discontinuity", &oldDiscontinuityType)) { + it = mBuffers.erase(it); + continue; + } - mBuffers.clear(); - mEOSResult = OK; + ++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(); |