diff options
author | Andreas Huber <andih@google.com> | 2011-12-05 11:34:43 -0800 |
---|---|---|
committer | Andreas Huber <andih@google.com> | 2011-12-05 11:34:43 -0800 |
commit | a0f2bf56e30f580535229fa6a58e7d48b762727c (patch) | |
tree | f375e7f5e9f183289bbd5c907f90b89924f11aa8 /media/libstagefright/AwesomePlayer.cpp | |
parent | fed8bb604c31bf6a60ca84aafed016d21d3e0f90 (diff) | |
download | frameworks_av-a0f2bf56e30f580535229fa6a58e7d48b762727c.zip frameworks_av-a0f2bf56e30f580535229fa6a58e7d48b762727c.tar.gz frameworks_av-a0f2bf56e30f580535229fa6a58e7d48b762727c.tar.bz2 |
Properly identify how much metadata we need to cache in order to instantiate
the extractor without blocking (and therefore be able to abort).
Change-Id: Id2acdde897e02baaeabadae70b7c95b66c9041b3
related-to-bug: 5666532
Diffstat (limited to 'media/libstagefright/AwesomePlayer.cpp')
-rw-r--r-- | media/libstagefright/AwesomePlayer.cpp | 43 |
1 files changed, 40 insertions, 3 deletions
diff --git a/media/libstagefright/AwesomePlayer.cpp b/media/libstagefright/AwesomePlayer.cpp index f6d054d..18dd8ef 100644 --- a/media/libstagefright/AwesomePlayer.cpp +++ b/media/libstagefright/AwesomePlayer.cpp @@ -1949,6 +1949,8 @@ status_t AwesomePlayer::finishSetDataSource_l() { mUri = newURI; } + AString sniffedMIME; + if (!strncasecmp("http://", mUri.string(), 7) || !strncasecmp("https://", mUri.string(), 8) || isWidevineStreaming) { @@ -1998,7 +2000,6 @@ status_t AwesomePlayer::finishSetDataSource_l() { mConnectingDataSource.clear(); - String8 contentType = dataSource->getMIMEType(); if (strncasecmp(contentType.string(), "audio/", 6)) { @@ -2020,16 +2021,51 @@ status_t AwesomePlayer::finishSetDataSource_l() { mLock.unlock(); + // Initially make sure we have at least 128 bytes for the sniff + // to complete without blocking. + static const size_t kMinBytesForSniffing = 128; + + off64_t metaDataSize = -1ll; for (;;) { status_t finalStatus; size_t cachedDataRemaining = mCachedSource->approxDataRemaining(&finalStatus); - if (finalStatus != OK || cachedDataRemaining >= kHighWaterMarkBytes + if (finalStatus != OK + || (metaDataSize >= 0 + && cachedDataRemaining >= metaDataSize) || (mFlags & PREPARE_CANCELLED)) { break; } + LOGV("now cached %d bytes of data", cachedDataRemaining); + + if (metaDataSize < 0 + && cachedDataRemaining >= kMinBytesForSniffing) { + String8 tmp; + float confidence; + sp<AMessage> meta; + if (!dataSource->sniff(&tmp, &confidence, &meta)) { + mLock.lock(); + return UNKNOWN_ERROR; + } + + // We successfully identified the file's extractor to + // be, remember this mime type so we don't have to + // sniff it again when we call MediaExtractor::Create() + // below. + sniffedMIME = tmp.string(); + + if (meta == NULL + || !meta->findInt64( + "meta-data-size", &metaDataSize)) { + metaDataSize = kHighWaterMarkBytes; + } + + CHECK_GE(metaDataSize, 0ll); + LOGV("metaDataSize = %lld bytes", metaDataSize); + } + usleep(200000); } @@ -2067,7 +2103,8 @@ status_t AwesomePlayer::finishSetDataSource_l() { mWVMExtractor->setAdaptiveStreamingMode(true); extractor = mWVMExtractor; } else { - extractor = MediaExtractor::Create(dataSource); + extractor = MediaExtractor::Create( + dataSource, sniffedMIME.empty() ? NULL : sniffedMIME.c_str()); if (extractor == NULL) { return UNKNOWN_ERROR; |