diff --git a/content/html/content/src/TimeRanges.cpp b/content/html/content/src/TimeRanges.cpp
index dfe1ed8cc42c..299a436e1a13 100644
--- a/content/html/content/src/TimeRanges.cpp
+++ b/content/html/content/src/TimeRanges.cpp
@@ -126,6 +126,17 @@ TimeRanges::Normalize()
}
}
+TimeRanges::index_type
+TimeRanges::Find(double aTime)
+{
+ for (index_type i = 0; i < mRanges.Length(); ++i) {
+ if (aTime >= mRanges[i].mStart && aTime < mRanges[i].mEnd) {
+ return i;
+ }
+ }
+ return NoIndex;
+}
+
JSObject*
TimeRanges::WrapObject(JSContext* aCx)
{
diff --git a/content/html/content/src/TimeRanges.h b/content/html/content/src/TimeRanges.h
index cc40c7d290e1..174e8358c6b8 100644
--- a/content/html/content/src/TimeRanges.h
+++ b/content/html/content/src/TimeRanges.h
@@ -80,6 +80,12 @@ private:
};
nsAutoTArray mRanges;
+
+public:
+ typedef nsTArray::index_type index_type;
+ static const index_type NoIndex = index_type(-1);
+
+ index_type Find(double aTime);
};
} // namespace dom
diff --git a/content/media/mediasource/MediaSourceDecoder.cpp b/content/media/mediasource/MediaSourceDecoder.cpp
index e222fa961702..e61e4ba0ad55 100644
--- a/content/media/mediasource/MediaSourceDecoder.cpp
+++ b/content/media/mediasource/MediaSourceDecoder.cpp
@@ -44,12 +44,6 @@ extern PRLogModuleInfo* GetMediaSourceAPILog();
namespace mozilla {
-namespace dom {
-
-class TimeRanges;
-
-} // namespace dom
-
class MediaSourceReader : public MediaDecoderReader
{
public:
@@ -206,17 +200,25 @@ private:
for (uint32_t i = mActiveVideoDecoder + 1; i < mDecoders.Length(); ++i) {
SubBufferDecoder* decoder = mDecoders[i];
+
+ nsRefPtr ranges = new dom::TimeRanges();
+ decoder->GetBuffered(ranges);
+
MSE_DEBUGV("MediaDecoderReader(%p)::SwitchVideoReaders(%d) decoder=%u (%p) discarded=%d"
- " hasVideo=%d timeThreshold=%lld startTime=%lld",
+ " hasVideo=%d timeThreshold=%f startTime=%f endTime=%f length=%u",
this, aType, i, decoder, decoder->IsDiscarded(),
decoder->GetReader()->GetMediaInfo().HasVideo(),
- mTimeThreshold, decoder->GetMediaStartTime());
+ double(mTimeThreshold) / USECS_PER_S,
+ ranges->GetStartTime(), ranges->GetEndTime(), ranges->Length());
- if (decoder->IsDiscarded() || !decoder->GetReader()->GetMediaInfo().HasVideo()) {
+ if (decoder->IsDiscarded() ||
+ !decoder->GetReader()->GetMediaInfo().HasVideo() ||
+ ranges->Length() == 0) {
continue;
}
- if (aType == SWITCH_FORCED || mTimeThreshold >= decoder->GetMediaStartTime()) {
+ if (aType == SWITCH_FORCED ||
+ ranges->Find(double(mTimeThreshold) / USECS_PER_S) != dom::TimeRanges::NoIndex) {
GetVideoReader()->SetIdle();
mActiveVideoDecoder = i;
@@ -423,27 +425,22 @@ MediaSourceReader::InitializePendingDecoders()
MediaInfo mi;
nsAutoPtr tags; // TODO: Handle metadata.
nsresult rv;
- int64_t startTime = INT64_MIN;
{
ReentrantMonitorAutoExit exitMon(mDecoder->GetReentrantMonitor());
rv = reader->ReadMetadata(&mi, getter_Transfers(tags));
- if (NS_SUCCEEDED(rv)) {
- reader->FindStartTime(startTime);
- }
}
reader->SetIdle();
- if (NS_FAILED(rv) || startTime == INT64_MIN) {
+ if (NS_FAILED(rv)) {
// XXX: Need to signal error back to owning SourceBuffer.
- MSE_DEBUG("MediaSourceReader(%p): Reader %p failed to initialize rv=%x startTime=%lld",
- this, reader, rv, startTime);
+ MSE_DEBUG("MediaSourceReader(%p): Reader %p failed to initialize rv=%x",
+ this, reader, rv);
continue;
}
- decoder->SetMediaStartTime(startTime);
bool active = false;
if (mi.HasVideo() || mi.HasAudio()) {
- MSE_DEBUG("MediaSourceReader(%p): Reader %p has video=%d audio=%d startTime=%lld",
- this, reader, mi.HasVideo(), mi.HasAudio(), startTime);
+ MSE_DEBUG("MediaSourceReader(%p): Reader %p has video=%d audio=%d",
+ this, reader, mi.HasVideo(), mi.HasAudio());
if (mi.HasVideo()) {
MSE_DEBUG("MediaSourceReader(%p): Reader %p video resolution=%dx%d",
this, reader, mi.mVideo.mDisplay.width, mi.mVideo.mDisplay.height);
diff --git a/content/media/mediasource/SubBufferDecoder.h b/content/media/mediasource/SubBufferDecoder.h
index 070b8710d1d2..67fc33a724cb 100644
--- a/content/media/mediasource/SubBufferDecoder.h
+++ b/content/media/mediasource/SubBufferDecoder.h
@@ -29,7 +29,7 @@ public:
// of the caller to manage the memory of the MediaResource object.
SubBufferDecoder(MediaResource* aResource, MediaSourceDecoder* aParentDecoder)
: BufferDecoder(aResource), mParentDecoder(aParentDecoder), mReader(nullptr)
- , mMediaDuration(-1), mMediaStartTime(0), mDiscarded(false)
+ , mMediaDuration(-1), mDiscarded(false)
{
}
@@ -69,16 +69,6 @@ public:
return mMediaDuration;
}
- int64_t GetMediaStartTime()
- {
- return mMediaStartTime;
- }
-
- void SetMediaStartTime(int64_t aMediaStartTime)
- {
- mMediaStartTime = aMediaStartTime;
- }
-
bool IsDiscarded()
{
return mDiscarded;
@@ -94,7 +84,6 @@ private:
MediaSourceDecoder* mParentDecoder;
nsRefPtr mReader;
int64_t mMediaDuration;
- int64_t mMediaStartTime;
bool mDiscarded;
};