Diff
Modified: trunk/Source/WebCore/ChangeLog (160753 => 160754)
--- trunk/Source/WebCore/ChangeLog 2013-12-18 06:27:44 UTC (rev 160753)
+++ trunk/Source/WebCore/ChangeLog 2013-12-18 06:49:50 UTC (rev 160754)
@@ -1,3 +1,39 @@
+2013-12-17 Jer Noble <jer.no...@apple.com>
+
+ [MSE] Add per-track signalling between SourceBuffer and SourceBufferPrivate.
+ https://bugs.webkit.org/show_bug.cgi?id=125899
+
+ Reviewed by Eric Carlson.
+
+ To accommodate the future addition of audio support to MSE in the Mac
+ port, add the concept of trackIDs to the communication between
+ SourceBuffer and SourceBufferPrivate.
+
+ The following virtual methods now take a trackID parameter:
+ * platform/graphics/SourceBufferPrivate.h:
+ (WebCore::SourceBufferPrivate::isReadyForMoreSamples):
+ (WebCore::SourceBufferPrivate::stopAskingForMoreSamples):
+ (WebCore::SourceBufferPrivate::notifyClientWhenReadyForMoreSamples):
+ * platform/graphics/SourceBufferPrivateClient.h:
+ (WebCore::SourceBufferPrivateClient::sourceBufferPrivateDidBecomeReadyForMoreSamples):
+
+ Update overridden methods in subclasses:
+ * Modules/mediasource/SourceBuffer.cpp:
+ (WebCore::SourceBuffer::sourceBufferPrivateDidBecomeReadyForMoreSamples):
+ * Modules/mediasource/SourceBuffer.h:
+ * platform/graphics/avfoundation/objc/SourceBufferPrivateAVFObjC.h:
+ * platform/graphics/avfoundation/objc/SourceBufferPrivateAVFObjC.mm:
+ (WebCore::SourceBufferPrivateAVFObjC::trackDidChangeEnabled):
+ (WebCore::SourceBufferPrivateAVFObjC::isReadyForMoreSamples):
+ * platform/mock/mediasource/MockSourceBufferPrivate.h:
+
+ Change the logic in provideMediaData to update a single TrackBuffer
+ rather than iterating over all of them:
+ * Modules/mediasource/SourceBuffer.cpp:
+ (WebCore::SourceBuffer::sourceBufferPrivateSeekToTime):
+ (WebCore::SourceBuffer::appendBufferTimerFired):
+ (WebCore::SourceBuffer::provideMediaData):
+
2013-12-17 Joseph Pecoraro <pecor...@apple.com>
Web Inspector: Remove InspectorAgent::hasFrontend
Modified: trunk/Source/WebCore/Modules/mediasource/SourceBuffer.cpp (160753 => 160754)
--- trunk/Source/WebCore/Modules/mediasource/SourceBuffer.cpp 2013-12-18 06:27:44 UTC (rev 160753)
+++ trunk/Source/WebCore/Modules/mediasource/SourceBuffer.cpp 2013-12-18 06:49:50 UTC (rev 160754)
@@ -286,9 +286,9 @@
trackBuffer.decodeQueue.clear();
for (auto iter = currentSampleDTSIterator; iter != trackBuffer.samples.decodeEnd(); ++iter)
trackBuffer.decodeQueue.insert(*iter);
+
+ provideMediaData(trackBuffer, trackID);
}
-
- provideMediaData();
}
MediaTime SourceBuffer::sourceBufferPrivateFastSeekTimeForMediaTime(SourceBufferPrivate*, const MediaTime& targetTime, const MediaTime& negativeThreshold, const MediaTime& positiveThreshold)
@@ -454,7 +454,8 @@
scheduleEvent(eventNames().updateendEvent);
m_source->monitorSourceBuffers();
- provideMediaData();
+ for (auto iter = m_trackBufferMap.begin(), end = m_trackBufferMap.end(); iter != end; ++iter)
+ provideMediaData(iter->value, iter->key);
}
const AtomicString& SourceBuffer::decodeError()
@@ -1123,39 +1124,38 @@
m_source->mediaElement()->textTrackKindChanged(track);
}
-void SourceBuffer::sourceBufferPrivateDidBecomeReadyForMoreSamples(SourceBufferPrivate*)
+void SourceBuffer::sourceBufferPrivateDidBecomeReadyForMoreSamples(SourceBufferPrivate*, AtomicString trackID)
{
LOG(Media, "SourceBuffer::sourceBufferPrivateDidBecomeReadyForMoreSamples(%p)", this);
- provideMediaData();
+ auto it = m_trackBufferMap.find(trackID);
+ if (it == m_trackBufferMap.end())
+ return;
+
+ provideMediaData(it->value, trackID);
}
-void SourceBuffer::provideMediaData()
+void SourceBuffer::provideMediaData(TrackBuffer& trackBuffer, AtomicString trackID)
{
- if (!m_private->isReadyForMoreSamples())
- return;
-
#if !LOG_DISABLED
unsigned enqueuedSamples = 0;
#endif
- for (auto it = m_trackBufferMap.begin(), end = m_trackBufferMap.end(); it != end; ++it) {
- TrackBuffer& trackBuffer = it->value;
- AtomicString trackID = it->key;
- auto sampleIt = trackBuffer.decodeQueue.begin();
- for (auto sampleEnd = trackBuffer.decodeQueue.end(); sampleIt != sampleEnd; ++sampleIt) {
- if (!m_private->isReadyForMoreSamples())
- break;
+ auto sampleIt = trackBuffer.decodeQueue.begin();
+ for (auto sampleEnd = trackBuffer.decodeQueue.end(); sampleIt != sampleEnd; ++sampleIt) {
+ if (!m_private->isReadyForMoreSamples(trackID)) {
+ m_private->notifyClientWhenReadyForMoreSamples(trackID);
+ break;
+ }
- RefPtr<MediaSample> sample = sampleIt->second;
- trackBuffer.lastEnqueuedPresentationTime = sample->presentationTime();
- m_private->enqueueSample(sample.release(), trackID);
+ RefPtr<MediaSample> sample = sampleIt->second;
+ trackBuffer.lastEnqueuedPresentationTime = sample->presentationTime();
+ m_private->enqueueSample(sample.release(), trackID);
#if !LOG_DISABLED
- ++enqueuedSamples;
+ ++enqueuedSamples;
#endif
- }
- trackBuffer.decodeQueue.erase(trackBuffer.decodeQueue.begin(), sampleIt);
}
+ trackBuffer.decodeQueue.erase(trackBuffer.decodeQueue.begin(), sampleIt);
LOG(Media, "SourceBuffer::provideMediaData(%p) - Enqueued %u samples", this, enqueuedSamples);
}
Modified: trunk/Source/WebCore/Modules/mediasource/SourceBuffer.h (160753 => 160754)
--- trunk/Source/WebCore/Modules/mediasource/SourceBuffer.h 2013-12-18 06:27:44 UTC (rev 160753)
+++ trunk/Source/WebCore/Modules/mediasource/SourceBuffer.h 2013-12-18 06:49:50 UTC (rev 160754)
@@ -108,7 +108,7 @@
virtual void sourceBufferPrivateDidReceiveSample(SourceBufferPrivate*, PassRefPtr<MediaSample>) OVERRIDE;
virtual bool sourceBufferPrivateHasAudio(const SourceBufferPrivate*) const OVERRIDE;
virtual bool sourceBufferPrivateHasVideo(const SourceBufferPrivate*) const OVERRIDE;
- virtual void sourceBufferPrivateDidBecomeReadyForMoreSamples(SourceBufferPrivate*) OVERRIDE;
+ virtual void sourceBufferPrivateDidBecomeReadyForMoreSamples(SourceBufferPrivate*, AtomicString trackID) OVERRIDE;
virtual void sourceBufferPrivateSeekToTime(SourceBufferPrivate*, const MediaTime&);
virtual MediaTime sourceBufferPrivateFastSeekTimeForMediaTime(SourceBufferPrivate*, const MediaTime&, const MediaTime& negativeThreshold, const MediaTime& positiveThreshold);
@@ -140,7 +140,8 @@
bool validateInitializationSegment(const InitializationSegment&);
- void provideMediaData();
+ struct TrackBuffer;
+ void provideMediaData(TrackBuffer&, AtomicString trackID);
void didDropSample();
RefPtr<SourceBufferPrivate> m_private;
@@ -163,7 +164,6 @@
MediaTime m_timestampOffset;
MediaTime m_highestPresentationEndTimestamp;
- struct TrackBuffer;
HashMap<AtomicString, TrackBuffer> m_trackBufferMap;
bool m_receivedFirstInitializationSegment;
RefPtr<TimeRanges> m_buffered;
Modified: trunk/Source/WebCore/platform/graphics/SourceBufferPrivate.h (160753 => 160754)
--- trunk/Source/WebCore/platform/graphics/SourceBufferPrivate.h 2013-12-18 06:27:44 UTC (rev 160753)
+++ trunk/Source/WebCore/platform/graphics/SourceBufferPrivate.h 2013-12-18 06:49:50 UTC (rev 160754)
@@ -65,8 +65,10 @@
virtual void flushAndEnqueueNonDisplayingSamples(Vector<RefPtr<MediaSample>>, AtomicString) { }
virtual void enqueueSample(PassRefPtr<MediaSample>, AtomicString) { }
- virtual bool isReadyForMoreSamples() { return false; }
+ virtual bool isReadyForMoreSamples(AtomicString) { return false; }
virtual void setActive(bool) { }
+ virtual void stopAskingForMoreSamples(AtomicString) { }
+ virtual void notifyClientWhenReadyForMoreSamples(AtomicString) { }
};
}
Modified: trunk/Source/WebCore/platform/graphics/SourceBufferPrivateClient.h (160753 => 160754)
--- trunk/Source/WebCore/platform/graphics/SourceBufferPrivateClient.h 2013-12-18 06:27:44 UTC (rev 160753)
+++ trunk/Source/WebCore/platform/graphics/SourceBufferPrivateClient.h 2013-12-18 06:49:50 UTC (rev 160754)
@@ -73,11 +73,10 @@
virtual bool sourceBufferPrivateHasAudio(const SourceBufferPrivate*) const = 0;
virtual bool sourceBufferPrivateHasVideo(const SourceBufferPrivate*) const = 0;
- virtual void sourceBufferPrivateDidBecomeReadyForMoreSamples(SourceBufferPrivate*) = 0;
+ virtual void sourceBufferPrivateDidBecomeReadyForMoreSamples(SourceBufferPrivate*, AtomicString trackID) = 0;
virtual MediaTime sourceBufferPrivateFastSeekTimeForMediaTime(SourceBufferPrivate*, const MediaTime& time, const MediaTime&, const MediaTime&) { return time; }
virtual void sourceBufferPrivateSeekToTime(SourceBufferPrivate*, const MediaTime&) { };
-
};
}
Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/SourceBufferPrivateAVFObjC.h (160753 => 160754)
--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/SourceBufferPrivateAVFObjC.h 2013-12-18 06:27:44 UTC (rev 160753)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/SourceBufferPrivateAVFObjC.h 2013-12-18 06:49:50 UTC (rev 160754)
@@ -92,7 +92,7 @@
virtual bool isFull() OVERRIDE;
virtual void flushAndEnqueueNonDisplayingSamples(Vector<RefPtr<MediaSample>>, AtomicString trackID) OVERRIDE;
virtual void enqueueSample(PassRefPtr<MediaSample>, AtomicString trackID) OVERRIDE;
- virtual bool isReadyForMoreSamples() OVERRIDE;
+ virtual bool isReadyForMoreSamples(AtomicString trackID) OVERRIDE;
virtual void setActive(bool) OVERRIDE;
Vector<RefPtr<VideoTrackPrivate>> m_videoTracks;
Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/SourceBufferPrivateAVFObjC.mm (160753 => 160754)
--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/SourceBufferPrivateAVFObjC.mm 2013-12-18 06:27:44 UTC (rev 160753)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/SourceBufferPrivateAVFObjC.mm 2013-12-18 06:49:50 UTC (rev 160754)
@@ -469,7 +469,7 @@
m_displayLayer = [[getAVSampleBufferDisplayLayerClass() alloc] init];
[m_displayLayer requestMediaDataWhenReadyOnQueue:dispatch_get_main_queue() usingBlock:^{
if (m_client)
- m_client->sourceBufferPrivateDidBecomeReadyForMoreSamples(this);
+ m_client->sourceBufferPrivateDidBecomeReadyForMoreSamples(this, AtomicString::number(trackID));
}];
if (m_mediaSource)
m_mediaSource->player()->addDisplayLayer(m_displayLayer.get());
@@ -538,8 +538,9 @@
m_mediaSource->player()->setHasAvailableVideoFrame(true);
}
-bool SourceBufferPrivateAVFObjC::isReadyForMoreSamples()
+bool SourceBufferPrivateAVFObjC::isReadyForMoreSamples(AtomicString trackID)
{
+ UNUSED_PARAM(trackID);
return [m_displayLayer isReadyForMoreMediaData];
}
Modified: trunk/Source/WebCore/platform/mock/mediasource/MockSourceBufferPrivate.h (160753 => 160754)
--- trunk/Source/WebCore/platform/mock/mediasource/MockSourceBufferPrivate.h 2013-12-18 06:27:44 UTC (rev 160753)
+++ trunk/Source/WebCore/platform/mock/mediasource/MockSourceBufferPrivate.h 2013-12-18 06:49:50 UTC (rev 160754)
@@ -73,7 +73,7 @@
virtual void flushAndEnqueueNonDisplayingSamples(Vector<RefPtr<MediaSample>>, AtomicString) OVERRIDE { }
virtual void enqueueSample(PassRefPtr<MediaSample>, AtomicString) OVERRIDE;
- virtual bool isReadyForMoreSamples() OVERRIDE { return true; }
+ virtual bool isReadyForMoreSamples(AtomicString) OVERRIDE { return true; }
virtual void setActive(bool) OVERRIDE;
void didReceiveInitializationSegment(const MockInitializationBox&);