Changeset 248301 in webkit
- Timestamp:
- Aug 6, 2019, 10:05:13 AM (7 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 12 edited
-
LayoutTests/ChangeLog (modified) (1 diff)
-
LayoutTests/media/media-source/media-source-minimumupcomingpresentationtime-expected.txt (added)
-
LayoutTests/media/media-source/media-source-minimumupcomingpresentationtime.html (added)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/Modules/mediasource/SourceBuffer.cpp (modified) (7 diffs)
-
Source/WebCore/Modules/mediasource/SourceBuffer.h (modified) (2 diffs)
-
Source/WebCore/platform/graphics/SourceBufferPrivate.h (modified) (1 diff)
-
Source/WebCore/platform/graphics/avfoundation/objc/SourceBufferPrivateAVFObjC.h (modified) (1 diff)
-
Source/WebCore/platform/graphics/avfoundation/objc/SourceBufferPrivateAVFObjC.mm (modified) (2 diffs)
-
Source/WebCore/platform/mock/mediasource/MockSourceBufferPrivate.cpp (modified) (1 diff)
-
Source/WebCore/platform/mock/mediasource/MockSourceBufferPrivate.h (modified) (2 diffs)
-
Source/WebCore/testing/Internals.cpp (modified) (1 diff)
-
Source/WebCore/testing/Internals.h (modified) (1 diff)
-
Source/WebCore/testing/Internals.idl (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r248300 r248301 1 2019-08-06 Jer Noble <jer.noble@apple.com> 2 3 Adopt -expectMinimumUpcomingSampleBufferPresentationTime: 4 https://bugs.webkit.org/show_bug.cgi?id=200457 5 <rdar://problem/53961130> 6 7 Reviewed by Eric Carlson. 8 9 * media/media-source/media-source-minimumupcomingpresentationtime-expected.txt: Added. 10 * media/media-source/media-source-minimumupcomingpresentationtime.html: Added. 11 1 12 2019-08-06 Russell Epstein <repstein@apple.com> 2 13 -
trunk/Source/WebCore/ChangeLog
r248297 r248301 1 2019-08-06 Jer Noble <jer.noble@apple.com> 2 3 Adopt -expectMinimumUpcomingSampleBufferPresentationTime: 4 https://bugs.webkit.org/show_bug.cgi?id=200457 5 <rdar://problem/53961130> 6 7 Reviewed by Eric Carlson. 8 9 Test: media/media-source/media-source-minimumupcomingpresentationtime.html 10 11 Adopt a new API vended by AVSampleBufferDisplayLayer, piped from SourceBuffer down 12 through SourceBufferPrivate to SourceBufferPrivateAVFObjC. This value should be 13 reset and updated when new samples are appended. 14 15 * Modules/mediasource/SourceBuffer.cpp: 16 (WebCore::SourceBuffer::sourceBufferPrivateDidReceiveSample): 17 (WebCore::SourceBuffer::provideMediaData): 18 (WebCore::SourceBuffer::updateMinimumUpcomingPresentationTime): 19 (WebCore::SourceBuffer::resetMinimumUpcomingPresentationTime): 20 (WebCore::SourceBuffer::minimumUpcomingPresentationTimeForTrackID): 21 (WebCore::SourceBuffer::setMaximumQueueDepthForTrackID): 22 * Modules/mediasource/SourceBuffer.h: 23 * platform/graphics/SourceBufferPrivate.h: 24 (WebCore::SourceBufferPrivate::canSetMinimumUpcomingPresentationTime const): 25 (WebCore::SourceBufferPrivate::setMinimumUpcomingPresentationTime): 26 (WebCore::SourceBufferPrivate::clearMinimumUpcomingPresentationTime): 27 (WebCore::SourceBufferPrivate::enqueuedSamplesForTrackID): 28 (WebCore::SourceBufferPrivate::minimumUpcomingPresentationTimeForTrackID): 29 (WebCore::SourceBufferPrivate::setMaximumQueueDepthForTrackID): 30 * platform/graphics/avfoundation/objc/SourceBufferPrivateAVFObjC.h: 31 * platform/graphics/avfoundation/objc/SourceBufferPrivateAVFObjC.mm: 32 (WebCore::SourceBufferPrivateAVFObjC::canSetMinimumUpcomingPresentationTime const): 33 (WebCore::SourceBufferPrivateAVFObjC::setMinimumUpcomingPresentationTime): 34 (WebCore::SourceBufferPrivateAVFObjC::clearMinimumUpcomingPresentationTime): 35 * platform/mock/mediasource/MockSourceBufferPrivate.cpp: 36 (WebCore::MockSourceBufferPrivate::minimumUpcomingPresentationTimeForTrackID): 37 (WebCore::MockSourceBufferPrivate::setMaximumQueueDepthForTrackID): 38 (WebCore::MockSourceBufferPrivate::canSetMinimumUpcomingPresentationTime const): 39 (WebCore::MockSourceBufferPrivate::setMinimumUpcomingPresentationTime): 40 (WebCore::MockSourceBufferPrivate::clearMinimumUpcomingPresentationTime): 41 * platform/mock/mediasource/MockSourceBufferPrivate.h: 42 * testing/Internals.cpp: 43 (WebCore::Internals::minimumUpcomingPresentationTimeForTrackID): 44 (WebCore::Internals::setMaximumQueueDepthForTrackID): 45 * testing/Internals.h: 46 * testing/Internals.idl: 47 1 48 2019-08-06 Antti Koivisto <antti@apple.com> 2 49 -
trunk/Source/WebCore/Modules/mediasource/SourceBuffer.cpp
r247783 r248301 71 71 MediaTime highestPresentationTimestamp; 72 72 MediaTime lastEnqueuedPresentationTime; 73 MediaTime minimumEnqueuedPresentationTime; 73 74 DecodeOrderSampleMap::KeyType lastEnqueuedDecodeKey; 74 75 MediaTime lastEnqueuedDecodeDuration; … … 78 79 bool enabled { false }; 79 80 bool needsReenqueueing { false }; 81 bool needsMinimumUpcomingPresentationTimeUpdating { false }; 80 82 SampleMap samples; 81 83 DecodeOrderSampleMap::MapType decodeQueue; … … 1789 1791 if (trackBuffer.lastEnqueuedDecodeKey.first.isInvalid() || decodeKey > trackBuffer.lastEnqueuedDecodeKey) { 1790 1792 trackBuffer.decodeQueue.insert(DecodeOrderSampleMap::MapType::value_type(decodeKey, &sample)); 1793 1794 if (trackBuffer.minimumEnqueuedPresentationTime.isValid() && sample.presentationTime() < trackBuffer.minimumEnqueuedPresentationTime) 1795 trackBuffer.needsMinimumUpcomingPresentationTimeUpdating = true; 1791 1796 } 1792 1797 … … 2022 2027 #endif 2023 2028 2029 if (trackBuffer.needsMinimumUpcomingPresentationTimeUpdating) 2030 resetMinimumUpcomingPresentationTime(trackBuffer, trackID); 2031 2024 2032 while (!trackBuffer.decodeQueue.empty()) { 2025 2033 if (!m_private->isReadyForMoreSamples(trackID)) { … … 2062 2070 } 2063 2071 2072 updateMinimumUpcomingPresentationTime(trackBuffer, trackID); 2073 2064 2074 #if !RELEASE_LOG_DISABLED 2065 2075 DEBUG_LOG(LOGIDENTIFIER, "enqueued ", enqueuedSamples, " samples, ", static_cast<size_t>(trackBuffer.decodeQueue.size()), " remaining"); … … 2067 2077 2068 2078 trySignalAllSamplesInTrackEnqueued(trackID); 2079 } 2080 2081 void SourceBuffer::updateMinimumUpcomingPresentationTime(TrackBuffer& trackBuffer, const AtomString& trackID) 2082 { 2083 if (!m_private->canSetMinimumUpcomingPresentationTime(trackID)) 2084 return; 2085 2086 if (trackBuffer.decodeQueue.empty()) { 2087 trackBuffer.minimumEnqueuedPresentationTime = MediaTime::invalidTime(); 2088 m_private->clearMinimumUpcomingPresentationTime(trackID); 2089 return; 2090 } 2091 2092 auto minPts = std::min_element(trackBuffer.decodeQueue.begin(), trackBuffer.decodeQueue.end(), [](auto& left, auto& right) -> bool { 2093 return left.second->outputPresentationTime() < right.second->outputPresentationTime(); 2094 }); 2095 2096 if (minPts == trackBuffer.decodeQueue.end()) { 2097 trackBuffer.minimumEnqueuedPresentationTime = MediaTime::invalidTime(); 2098 m_private->clearMinimumUpcomingPresentationTime(trackID); 2099 return; 2100 } 2101 2102 trackBuffer.minimumEnqueuedPresentationTime = minPts->second->outputPresentationTime(); 2103 m_private->setMinimumUpcomingPresentationTime(trackID, trackBuffer.minimumEnqueuedPresentationTime); 2104 } 2105 2106 2107 void SourceBuffer::resetMinimumUpcomingPresentationTime(TrackBuffer& trackBuffer, const AtomString& trackID) 2108 { 2109 if (!m_private->canSetMinimumUpcomingPresentationTime(trackID)) 2110 return; 2111 2112 trackBuffer.minimumEnqueuedPresentationTime = MediaTime::invalidTime(); 2113 m_private->clearMinimumUpcomingPresentationTime(trackID); 2069 2114 } 2070 2115 … … 2272 2317 } 2273 2318 2319 MediaTime SourceBuffer::minimumUpcomingPresentationTimeForTrackID(const AtomString& trackID) 2320 { 2321 return m_private->minimumUpcomingPresentationTimeForTrackID(trackID); 2322 } 2323 2324 void SourceBuffer::setMaximumQueueDepthForTrackID(const AtomString& trackID, size_t maxQueueDepth) 2325 { 2326 m_private->setMaximumQueueDepthForTrackID(trackID, maxQueueDepth); 2327 } 2328 2274 2329 Document& SourceBuffer::document() const 2275 2330 { -
trunk/Source/WebCore/Modules/mediasource/SourceBuffer.h
r246490 r248301 199 199 200 200 void updateBufferedFromTrackBuffers(); 201 void updateMinimumUpcomingPresentationTime(TrackBuffer&, const AtomString& trackID); 202 void resetMinimumUpcomingPresentationTime(TrackBuffer&, const AtomString& trackID); 201 203 202 204 void appendError(bool); … … 211 213 WEBCORE_EXPORT Vector<String> bufferedSamplesForTrackID(const AtomString&); 212 214 WEBCORE_EXPORT Vector<String> enqueuedSamplesForTrackID(const AtomString&); 215 WEBCORE_EXPORT MediaTime minimumUpcomingPresentationTimeForTrackID(const AtomString&); 216 WEBCORE_EXPORT void setMaximumQueueDepthForTrackID(const AtomString&, size_t); 213 217 214 218 Ref<SourceBufferPrivate> m_private; -
trunk/Source/WebCore/platform/graphics/SourceBufferPrivate.h
r246490 r248301 63 63 virtual void notifyClientWhenReadyForMoreSamples(const AtomString&) { } 64 64 65 virtual bool canSetMinimumUpcomingPresentationTime(const AtomString&) const { return false; } 66 virtual void setMinimumUpcomingPresentationTime(const AtomString&, const MediaTime&) { } 67 virtual void clearMinimumUpcomingPresentationTime(const AtomString&) { } 68 virtual bool canSwitchToType(const ContentType&) { return false; } 69 70 // Internals Utility methods: 65 71 virtual Vector<String> enqueuedSamplesForTrackID(const AtomString&) { return { }; } 66 67 virtual bool canSwitchToType(const ContentType&) { return false;}72 virtual MediaTime minimumUpcomingPresentationTimeForTrackID(const AtomString&) { return MediaTime::invalidTime(); } 73 virtual void setMaximumQueueDepthForTrackID(const AtomString&, size_t) { } 68 74 69 75 #if !RELEASE_LOG_DISABLED -
trunk/Source/WebCore/platform/graphics/avfoundation/objc/SourceBufferPrivateAVFObjC.h
r246490 r248301 164 164 void setActive(bool) final; 165 165 void notifyClientWhenReadyForMoreSamples(const AtomString& trackID) final; 166 bool canSetMinimumUpcomingPresentationTime(const AtomString&) const override; 167 void setMinimumUpcomingPresentationTime(const AtomString&, const MediaTime&) override; 168 void clearMinimumUpcomingPresentationTime(const AtomString&) override; 166 169 bool canSwitchToType(const ContentType&) final; 167 170 -
trunk/Source/WebCore/platform/graphics/avfoundation/objc/SourceBufferPrivateAVFObjC.mm
r248190 r248301 70 70 @interface AVSampleBufferDisplayLayer (WebCoreAVSampleBufferDisplayLayerQueueManagementPrivate) 71 71 - (void)prerollDecodeWithCompletionHandler:(void (^)(BOOL success))block; 72 - (void)expectMinimumUpcomingSampleBufferPresentationTime: (CMTime)minimumUpcomingPresentationTime; 73 - (void)resetUpcomingSampleBufferPresentationTimeExpectations; 72 74 @end 73 75 … … 1259 1261 } 1260 1262 1263 bool SourceBufferPrivateAVFObjC::canSetMinimumUpcomingPresentationTime(const AtomString& trackIDString) const 1264 { 1265 int trackID = trackIDString.toInt(); 1266 if (trackID == m_enabledVideoTrackID) 1267 return [getAVSampleBufferDisplayLayerClass() instancesRespondToSelector:@selector(expectMinimumUpcomingSampleBufferPresentationTime:)]; 1268 return false; 1269 } 1270 1271 void SourceBufferPrivateAVFObjC::setMinimumUpcomingPresentationTime(const AtomString& trackIDString, const MediaTime& presentationTime) 1272 { 1273 ASSERT(canSetMinimumUpcomingPresentationTime(trackIDString)); 1274 if (canSetMinimumUpcomingPresentationTime(trackIDString)) 1275 [m_displayLayer expectMinimumUpcomingSampleBufferPresentationTime:toCMTime(presentationTime)]; 1276 } 1277 1278 void SourceBufferPrivateAVFObjC::clearMinimumUpcomingPresentationTime(const AtomString& trackIDString) 1279 { 1280 ASSERT(canSetMinimumUpcomingPresentationTime(trackIDString)); 1281 if (canSetMinimumUpcomingPresentationTime(trackIDString)) 1282 [m_displayLayer resetUpcomingSampleBufferPresentationTimeExpectations]; 1283 } 1284 1261 1285 bool SourceBufferPrivateAVFObjC::canSwitchToType(const ContentType& contentType) 1262 1286 { -
trunk/Source/WebCore/platform/mock/mediasource/MockSourceBufferPrivate.cpp
r246490 r248301 241 241 } 242 242 243 MediaTime MockSourceBufferPrivate::minimumUpcomingPresentationTimeForTrackID(const AtomString&) 244 { 245 return m_minimumUpcomingPresentationTime; 246 } 247 248 void MockSourceBufferPrivate::setMaximumQueueDepthForTrackID(const AtomString&, size_t maxQueueDepth) 249 { 250 m_maxQueueDepth = maxQueueDepth; 251 } 252 253 bool MockSourceBufferPrivate::canSetMinimumUpcomingPresentationTime(const AtomString&) const 254 { 255 return true; 256 } 257 258 void MockSourceBufferPrivate::setMinimumUpcomingPresentationTime(const AtomString&, const MediaTime& presentationTime) 259 { 260 m_minimumUpcomingPresentationTime = presentationTime; 261 } 262 263 void MockSourceBufferPrivate::clearMinimumUpcomingPresentationTime(const AtomString&) 264 { 265 m_minimumUpcomingPresentationTime = MediaTime::invalidTime(); 266 } 267 243 268 bool MockSourceBufferPrivate::canSwitchToType(const ContentType& contentType) 244 269 { -
trunk/Source/WebCore/platform/mock/mediasource/MockSourceBufferPrivate.h
r246490 r248301 63 63 MediaPlayer::ReadyState readyState() const final; 64 64 void setReadyState(MediaPlayer::ReadyState) final; 65 bool canSetMinimumUpcomingPresentationTime(const AtomString&) const final; 66 void setMinimumUpcomingPresentationTime(const AtomString&, const MediaTime&) final; 67 void clearMinimumUpcomingPresentationTime(const AtomString&) final; 65 68 bool canSwitchToType(const ContentType&) final; 66 69 67 void flush(const AtomString&) final { m_enqueuedSamples.clear(); }70 void flush(const AtomString&) final { m_enqueuedSamples.clear(); m_minimumUpcomingPresentationTime = MediaTime::invalidTime(); } 68 71 void enqueueSample(Ref<MediaSample>&&, const AtomString&) final; 69 bool isReadyForMoreSamples(const AtomString&) final { return true; }72 bool isReadyForMoreSamples(const AtomString&) final { return !m_maxQueueDepth || m_enqueuedSamples.size() < m_maxQueueDepth.value(); } 70 73 void setActive(bool) final; 71 74 72 75 Vector<String> enqueuedSamplesForTrackID(const AtomString&) final; 76 MediaTime minimumUpcomingPresentationTimeForTrackID(const AtomString&) final; 77 void setMaximumQueueDepthForTrackID(const AtomString&, size_t) final; 73 78 74 79 void didReceiveInitializationSegment(const MockInitializationBox&); … … 82 87 MockMediaSourcePrivate* m_mediaSource; 83 88 SourceBufferPrivateClient* m_client; 89 MediaTime m_minimumUpcomingPresentationTime; 84 90 Vector<String> m_enqueuedSamples; 85 91 Optional<size_t> m_maxQueueDepth; 86 92 Vector<char> m_inputBuffer; 87 93 }; -
trunk/Source/WebCore/testing/Internals.cpp
r248046 r248301 3751 3751 } 3752 3752 3753 double Internals::minimumUpcomingPresentationTimeForTrackID(SourceBuffer& buffer, const AtomString& trackID) 3754 { 3755 return buffer.minimumUpcomingPresentationTimeForTrackID(trackID).toDouble(); 3756 } 3757 3753 3758 void Internals::setShouldGenerateTimestamps(SourceBuffer& buffer, bool flag) 3754 3759 { 3755 3760 buffer.setShouldGenerateTimestamps(flag); 3761 } 3762 3763 void Internals::setMaximumQueueDepthForTrackID(SourceBuffer& buffer, const AtomString& trackID, size_t maxQueueDepth) 3764 { 3765 buffer.setMaximumQueueDepthForTrackID(trackID, maxQueueDepth); 3756 3766 } 3757 3767 -
trunk/Source/WebCore/testing/Internals.h
r248046 r248301 584 584 Vector<String> bufferedSamplesForTrackID(SourceBuffer&, const AtomString&); 585 585 Vector<String> enqueuedSamplesForTrackID(SourceBuffer&, const AtomString&); 586 double minimumUpcomingPresentationTimeForTrackID(SourceBuffer&, const AtomString&); 586 587 void setShouldGenerateTimestamps(SourceBuffer&, bool); 588 void setMaximumQueueDepthForTrackID(SourceBuffer&, const AtomString&, size_t); 587 589 #endif 588 590 -
trunk/Source/WebCore/testing/Internals.idl
r248046 r248301 586 586 [Conditional=MEDIA_SOURCE] sequence<DOMString> enqueuedSamplesForTrackID(SourceBuffer buffer, DOMString trackID); 587 587 [Conditional=MEDIA_SOURCE] void setShouldGenerateTimestamps(SourceBuffer buffer, boolean flag); 588 [Conditional=MEDIA_SOURCE] double minimumUpcomingPresentationTimeForTrackID(SourceBuffer buffer, DOMString trackID); 589 [Conditional=MEDIA_SOURCE] void setMaximumQueueDepthForTrackID(SourceBuffer buffer, DOMString trackID, unsigned long maxQueueDepth); 588 590 589 591 [Conditional=VIDEO, MayThrowException] void beginMediaSessionInterruption(DOMString interruptionType);
Note:
See TracChangeset
for help on using the changeset viewer.