Changeset 274603 in webkit
- Timestamp:
- Mar 17, 2021, 5:15:57 PM (5 years ago)
- Location:
- trunk/Source
- Files:
-
- 5 edited
-
WTF/ChangeLog (modified) (1 diff)
-
WTF/wtf/HashTable.h (modified) (1 diff)
-
WebCore/ChangeLog (modified) (1 diff)
-
WebCore/platform/graphics/SourceBufferPrivate.cpp (modified) (17 diffs)
-
WebCore/platform/graphics/SourceBufferPrivate.h (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WTF/ChangeLog
r274602 r274603 1 2021-03-17 Alex Christensen <achristensen@webkit.org> 2 3 Reduce maximum HashTable entry size to 250 bytes 4 https://bugs.webkit.org/show_bug.cgi?id=223398 5 6 Reviewed by Yusuke Suzuki. 7 8 * wtf/HashTable.h: 9 (WTF::KeyTraits>::inlineLookup): 10 1 11 2021-03-17 Saam Barati <sbarati@apple.com> 2 12 -
trunk/Source/WTF/wtf/HashTable.h
r274463 r274603 669 669 ALWAYS_INLINE auto HashTable<Key, Value, Extractor, HashFunctions, Traits, KeyTraits>::inlineLookup(const T& key) -> ValueType* 670 670 { 671 static_assert(sizeof(Key) + sizeof(Value) < 400, "Your HashTable types are too big to efficiently move when rehashing. Consider using std::unique_ptrinstead");671 static_assert(sizeof(Key) + sizeof(Value) < 250, "Your HashTable types are too big to efficiently move when rehashing. Consider using UniqueRef instead"); 672 672 673 673 checkKey<HashTranslator>(key); -
trunk/Source/WebCore/ChangeLog
r274600 r274603 1 2021-03-17 Alex Christensen <achristensen@webkit.org> 2 3 Reduce maximum HashTable entry size to 250 bytes 4 https://bugs.webkit.org/show_bug.cgi?id=223398 5 6 Reviewed by Yusuke Suzuki. 7 8 This reduces memory use at runtime. 9 10 * platform/graphics/SourceBufferPrivate.cpp: 11 (WebCore::SourceBufferPrivate::resetTimestampOffsetInTrackBuffers): 12 (WebCore::SourceBufferPrivate::resetTrackBuffers): 13 (WebCore::SourceBufferPrivate::updateHighestPresentationTimestamp): 14 (WebCore::SourceBufferPrivate::updateBufferedFromTrackBuffers): 15 (WebCore::SourceBufferPrivate::reenqueSamples): 16 (WebCore::SourceBufferPrivate::clearTrackBuffers): 17 (WebCore::SourceBufferPrivate::bufferedSamplesForTrackId): 18 (WebCore::SourceBufferPrivate::fastSeekTimeForMediaTime): 19 (WebCore::SourceBufferPrivate::totalTrackBufferSizeInBytes const): 20 (WebCore::SourceBufferPrivate::addTrackBuffer): 21 (WebCore::SourceBufferPrivate::updateTrackIds): 22 (WebCore::SourceBufferPrivate::setAllTrackBuffersNeedRandomAccess): 23 (WebCore::SourceBufferPrivate::didReceiveSample): 24 * platform/graphics/SourceBufferPrivate.h: 25 1 26 2021-03-17 Aditya Keerthi <akeerthi@apple.com> 2 27 -
trunk/Source/WebCore/platform/graphics/SourceBufferPrivate.cpp
r274390 r274603 71 71 { 72 72 for (auto& trackBuffer : m_trackBufferMap.values()) { 73 trackBuffer. lastFrameTimescale = 0;74 trackBuffer. roundedTimestampOffset = MediaTime::invalidTime();73 trackBuffer.get().lastFrameTimescale = 0; 74 trackBuffer.get().roundedTimestampOffset = MediaTime::invalidTime(); 75 75 } 76 76 } … … 85 85 { 86 86 for (auto& trackBufferPair : m_trackBufferMap.values()) { 87 trackBufferPair. lastDecodeTimestamp = MediaTime::invalidTime();88 trackBufferPair.g reatestDecodeDuration = MediaTime::invalidTime();89 trackBufferPair. lastFrameDuration = MediaTime::invalidTime();90 trackBufferPair. highestPresentationTimestamp = MediaTime::invalidTime();91 trackBufferPair. needRandomAccessFlag = true;87 trackBufferPair.get().lastDecodeTimestamp = MediaTime::invalidTime(); 88 trackBufferPair.get().greatestDecodeDuration = MediaTime::invalidTime(); 89 trackBufferPair.get().lastFrameDuration = MediaTime::invalidTime(); 90 trackBufferPair.get().highestPresentationTimestamp = MediaTime::invalidTime(); 91 trackBufferPair.get().needRandomAccessFlag = true; 92 92 } 93 93 } … … 97 97 MediaTime highestTime; 98 98 for (auto& trackBuffer : m_trackBufferMap.values()) { 99 auto lastSampleIter = trackBuffer. samples.presentationOrder().rbegin();100 if (lastSampleIter == trackBuffer. samples.presentationOrder().rend())99 auto lastSampleIter = trackBuffer.get().samples.presentationOrder().rbegin(); 100 if (lastSampleIter == trackBuffer.get().samples.presentationOrder().rend()) 101 101 continue; 102 102 highestTime = std::max(highestTime, lastSampleIter->first); … … 125 125 MediaTime highestEndTime = MediaTime::negativeInfiniteTime(); 126 126 for (auto& trackBuffer : m_trackBufferMap.values()) { 127 if (!trackBuffer. buffered.length())127 if (!trackBuffer.get().buffered.length()) 128 128 continue; 129 highestEndTime = std::max(highestEndTime, trackBuffer. buffered.maximumBufferedTime());129 highestEndTime = std::max(highestEndTime, trackBuffer.get().buffered.maximumBufferedTime()); 130 130 } 131 131 … … 143 143 for (auto& trackBuffer : m_trackBufferMap.values()) { 144 144 // 4.1 Let track ranges equal the track buffer ranges for the current track buffer. 145 PlatformTimeRanges trackRanges = trackBuffer. buffered;145 PlatformTimeRanges trackRanges = trackBuffer.get().buffered; 146 146 if (!trackRanges.length()) 147 147 continue; … … 180 180 return; 181 181 182 auto it = m_trackBufferMap.find(trackID); 183 if (it == m_trackBufferMap.end()) 184 return; 185 186 auto& trackBuffer = it->value; 187 trackBuffer.needsReenqueueing = true; 188 reenqueueMediaForTime(trackBuffer, trackID, currentMediaTime()); 182 auto* trackBuffer = m_trackBufferMap.get(trackID); 183 if (!trackBuffer) 184 return; 185 trackBuffer->needsReenqueueing = true; 186 reenqueueMediaForTime(*trackBuffer, trackID, currentMediaTime()); 189 187 } 190 188 … … 203 201 { 204 202 for (auto& trackBufferPair : m_trackBufferMap.values()) { 205 trackBufferPair. samples.clear();206 trackBufferPair. decodeQueue.clear();203 trackBufferPair.get().samples.clear(); 204 trackBufferPair.get().decodeQueue.clear(); 207 205 } 208 206 } … … 210 208 void SourceBufferPrivate::bufferedSamplesForTrackId(const AtomString& trackId, CompletionHandler<void(Vector<String>&&)>&& completionHandler) 211 209 { 212 auto it = m_trackBufferMap.find(trackId);213 if ( it == m_trackBufferMap.end())210 auto* trackBuffer = m_trackBufferMap.get(trackId); 211 if (!trackBuffer) 214 212 completionHandler({ }); 215 213 216 auto& trackBuffer = it->value;217 214 Vector<String> sampleDescriptions; 218 for (auto& pair : trackBuffer .samples.decodeOrder())215 for (auto& pair : trackBuffer->samples.decodeOrder()) 219 216 sampleDescriptions.append(toString(*pair.second)); 220 217 … … 231 228 for (auto& trackBuffer : m_trackBufferMap.values()) { 232 229 // Find the sample which contains the target time time. 233 auto futureSyncSampleIterator = trackBuffer. samples.decodeOrder().findSyncSampleAfterPresentationTime(targetTime, positiveThreshold);234 auto pastSyncSampleIterator = trackBuffer. samples.decodeOrder().findSyncSamplePriorToPresentationTime(targetTime, negativeThreshold);235 auto upperBound = trackBuffer. samples.decodeOrder().end();236 auto lowerBound = trackBuffer. samples.decodeOrder().rend();230 auto futureSyncSampleIterator = trackBuffer.get().samples.decodeOrder().findSyncSampleAfterPresentationTime(targetTime, positiveThreshold); 231 auto pastSyncSampleIterator = trackBuffer.get().samples.decodeOrder().findSyncSamplePriorToPresentationTime(targetTime, negativeThreshold); 232 auto upperBound = trackBuffer.get().samples.decodeOrder().end(); 233 auto lowerBound = trackBuffer.get().samples.decodeOrder().rend(); 237 234 238 235 if (futureSyncSampleIterator == upperBound && pastSyncSampleIterator == lowerBound) … … 735 732 uint64_t totalSizeInBytes = 0; 736 733 for (auto& trackBuffer : m_trackBufferMap.values()) 737 totalSizeInBytes += trackBuffer. samples.sizeInBytes();734 totalSizeInBytes += trackBuffer.get().samples.sizeInBytes(); 738 735 739 736 return totalSizeInBytes; … … 743 740 { 744 741 ASSERT(!m_trackBufferMap.contains(trackId)); 745 auto& trackBuffer = m_trackBufferMap.add(trackId, TrackBuffer()).iterator->value;742 auto& trackBuffer = m_trackBufferMap.add(trackId, makeUniqueRef<TrackBuffer>()).iterator->value; 746 743 747 744 // 5.2.9 Add the track description for this track to the track buffer. 748 trackBuffer. description = description;749 750 m_hasAudio = m_hasAudio || trackBuffer. description->isAudio();751 m_hasVideo = m_hasVideo || trackBuffer. description->isVideo();745 trackBuffer.get().description = description; 746 747 m_hasAudio = m_hasAudio || trackBuffer.get().description->isAudio(); 748 m_hasVideo = m_hasVideo || trackBuffer.get().description->isVideo(); 752 749 } 753 750 … … 759 756 ASSERT(oldId != newId); 760 757 auto trackBuffer = m_trackBufferMap.take(oldId); 761 m_trackBufferMap.add(newId, WTFMove(trackBuffer)); 758 if (!trackBuffer) 759 continue; 760 m_trackBufferMap.add(newId, makeUniqueRefFromNonNullUniquePtr(WTFMove(trackBuffer))); 762 761 } 763 762 } … … 766 765 { 767 766 for (auto& trackBuffer : m_trackBufferMap.values()) 768 trackBuffer. needRandomAccessFlag = true;767 trackBuffer.get().needRandomAccessFlag = true; 769 768 } 770 769 … … 880 879 881 880 for (auto& trackBuffer : m_trackBufferMap.values()) { 882 trackBuffer. lastFrameTimescale = 0;883 trackBuffer. roundedTimestampOffset = MediaTime::invalidTime();881 trackBuffer.get().lastFrameTimescale = 0; 882 trackBuffer.get().roundedTimestampOffset = MediaTime::invalidTime(); 884 883 } 885 884 … … 889 888 // 1.3.3 Set the need random access point flag on all track buffers to true. 890 889 for (auto& trackBuffer : m_trackBufferMap.values()) 891 trackBuffer. needRandomAccessFlag = true;890 trackBuffer.get().needRandomAccessFlag = true; 892 891 893 892 // 1.3.4 Unset group start timestamp. … … 961 960 for (auto& trackBuffer : m_trackBufferMap.values()) { 962 961 // 1.6.2 Unset the last decode timestamp on all track buffers. 963 trackBuffer. lastDecodeTimestamp = MediaTime::invalidTime();962 trackBuffer.get().lastDecodeTimestamp = MediaTime::invalidTime(); 964 963 // 1.6.3 Unset the last frame duration on all track buffers. 965 trackBuffer.g reatestDecodeDuration = MediaTime::invalidTime();966 trackBuffer. lastFrameDuration = MediaTime::invalidTime();964 trackBuffer.get().greatestDecodeDuration = MediaTime::invalidTime(); 965 trackBuffer.get().lastFrameDuration = MediaTime::invalidTime(); 967 966 // 1.6.4 Unset the highest presentation timestamp on all track buffers. 968 trackBuffer. highestPresentationTimestamp = MediaTime::invalidTime();967 trackBuffer.get().highestPresentationTimestamp = MediaTime::invalidTime(); 969 968 // 1.6.5 Set the need random access point flag on all track buffers to true. 970 trackBuffer. needRandomAccessFlag = true;969 trackBuffer.get().needRandomAccessFlag = true; 971 970 } 972 971 … … 1267 1266 m_timestampOffset = frameEndTimestamp; 1268 1267 for (auto& trackBuffer : m_trackBufferMap.values()) { 1269 trackBuffer. lastFrameTimescale = 0;1270 trackBuffer. roundedTimestampOffset = MediaTime::invalidTime();1268 trackBuffer.get().lastFrameTimescale = 0; 1269 trackBuffer.get().roundedTimestampOffset = MediaTime::invalidTime(); 1271 1270 } 1272 1271 } -
trunk/Source/WebCore/platform/graphics/SourceBufferPrivate.h
r274390 r274603 111 111 112 112 struct TrackBuffer { 113 WTF_MAKE_STRUCT_FAST_ALLOCATED; 113 114 MediaTime lastDecodeTimestamp; 114 115 MediaTime greatestDecodeDuration; … … 184 185 bool m_hasVideo { false }; 185 186 186 HashMap<AtomString, TrackBuffer> m_trackBufferMap;187 HashMap<AtomString, UniqueRef<TrackBuffer>> m_trackBufferMap; 187 188 188 189 SourceBufferAppendMode m_appendMode { SourceBufferAppendMode::Segments };
Note:
See TracChangeset
for help on using the changeset viewer.