This commit is contained in:
Robert O'Callahan 2011-12-09 17:48:40 +13:00
Родитель 0eb913e126
Коммит 23c74606fc
5 изменённых файлов: 31 добавлений и 10 удалений

Просмотреть файл

@ -644,8 +644,10 @@ void nsBuiltinDecoder::NotifySuspendedStatusChanged()
NS_ASSERTION(NS_IsMainThread(), "Should be on main thread."); NS_ASSERTION(NS_IsMainThread(), "Should be on main thread.");
if (!mStream) if (!mStream)
return; return;
bool suspended = mStream->IsSuspendedByCache(); nsMediaStream* activeStream;
printf("*** nsBuiltinDecoder::NotifySuspendedStatusChanged(%p), suspended=%d\n", this, suspended); bool suspended = mStream->IsSuspendedByCache(&activeStream);
printf("*** nsBuiltinDecoder::NotifySuspendedStatusChanged(%p), suspended=%d, active-stream=%p\n", this, suspended, activeStream);
if (suspended && mElement) { if (suspended && mElement) {
// if this is an autoplay element, we need to kick off its autoplaying // if this is an autoplay element, we need to kick off its autoplaying
// now so we consume data and hopefully free up cache space // now so we consume data and hopefully free up cache space

Просмотреть файл

@ -1908,14 +1908,21 @@ nsMediaCacheStream::IsSeekable()
} }
bool bool
nsMediaCacheStream::AreAllStreamsForResourceSuspended() nsMediaCacheStream::AreAllStreamsForResourceSuspended(nsMediaStream** aActiveStream)
{ {
ReentrantMonitorAutoEnter mon(gMediaCache->GetReentrantMonitor()); ReentrantMonitorAutoEnter mon(gMediaCache->GetReentrantMonitor());
nsMediaCache::ResourceStreamIterator iter(mResourceID); nsMediaCache::ResourceStreamIterator iter(mResourceID);
while (nsMediaCacheStream* stream = iter.Next()) { while (nsMediaCacheStream* stream = iter.Next()) {
if (!stream->mCacheSuspended && !stream->mChannelEnded) if (!stream->mCacheSuspended && !stream->mChannelEnded) {
if (aActiveStream) {
*aActiveStream = stream->mClient;
}
return false; return false;
} }
}
if (aActiveStream) {
*aActiveStream = nsnull;
}
return true; return true;
} }

Просмотреть файл

@ -43,7 +43,9 @@
#include "nsIPrincipal.h" #include "nsIPrincipal.h"
#include "nsCOMPtr.h" #include "nsCOMPtr.h"
class nsMediaStream;
class nsByteRange; class nsByteRange;
namespace mozilla { namespace mozilla {
class ReentrantMonitorAutoEnter; class ReentrantMonitorAutoEnter;
} }
@ -354,7 +356,9 @@ public:
// Returns true when all streams for this resource are suspended or their // Returns true when all streams for this resource are suspended or their
// channel has ended. // channel has ended.
bool AreAllStreamsForResourceSuspended(); // If aActiveStream is non-null, fills it with a pointer to a stream
// for this resource that is not suspended or ended.
bool AreAllStreamsForResourceSuspended(nsMediaStream** aActiveStream);
// These methods must be called on a different thread from the main // These methods must be called on a different thread from the main
// thread. They should always be called on the same thread for a given // thread. They should always be called on the same thread for a given

Просмотреть файл

@ -831,9 +831,9 @@ nsMediaChannelStream::EnsureCacheUpToDate()
} }
bool bool
nsMediaChannelStream::IsSuspendedByCache() nsMediaChannelStream::IsSuspendedByCache(nsMediaStream** aActiveStream)
{ {
return mCacheStream.AreAllStreamsForResourceSuspended(); return mCacheStream.AreAllStreamsForResourceSuspended(aActiveStream);
} }
bool bool
@ -949,7 +949,13 @@ public:
} }
virtual PRInt64 GetCachedDataEnd(PRInt64 aOffset) { return NS_MAX(aOffset, mSize); } virtual PRInt64 GetCachedDataEnd(PRInt64 aOffset) { return NS_MAX(aOffset, mSize); }
virtual bool IsDataCachedToEndOfStream(PRInt64 aOffset) { return true; } virtual bool IsDataCachedToEndOfStream(PRInt64 aOffset) { return true; }
virtual bool IsSuspendedByCache() { return false; } virtual bool IsSuspendedByCache(nsMediaStream** aActiveStream)
{
if (aActiveStream) {
*aActiveStream = nsnull;
}
return false;
}
virtual bool IsSuspended() { return false; } virtual bool IsSuspended() { return false; }
nsresult GetCachedRanges(nsTArray<nsByteRange>& aRanges); nsresult GetCachedRanges(nsTArray<nsByteRange>& aRanges);

Просмотреть файл

@ -272,7 +272,9 @@ public:
// changes. // changes.
// For resources using the media cache, this returns true only when all // For resources using the media cache, this returns true only when all
// streams for the same resource are all suspended. // streams for the same resource are all suspended.
virtual bool IsSuspendedByCache() = 0; // If aActiveStream is non-null, fills it with a pointer to a stream
// for this resource that is not suspended or ended.
virtual bool IsSuspendedByCache(nsMediaStream** aActiveStream) = 0;
// Returns true if this stream has been suspended. // Returns true if this stream has been suspended.
virtual bool IsSuspended() = 0; virtual bool IsSuspended() = 0;
// Reads only data which is cached in the media cache. If you try to read // Reads only data which is cached in the media cache. If you try to read
@ -404,7 +406,7 @@ public:
virtual PRInt64 GetNextCachedData(PRInt64 aOffset); virtual PRInt64 GetNextCachedData(PRInt64 aOffset);
virtual PRInt64 GetCachedDataEnd(PRInt64 aOffset); virtual PRInt64 GetCachedDataEnd(PRInt64 aOffset);
virtual bool IsDataCachedToEndOfStream(PRInt64 aOffset); virtual bool IsDataCachedToEndOfStream(PRInt64 aOffset);
virtual bool IsSuspendedByCache(); virtual bool IsSuspendedByCache(nsMediaStream** aActiveStream);
virtual bool IsSuspended(); virtual bool IsSuspended();
class Listener : public nsIStreamListener, class Listener : public nsIStreamListener,