⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 274603 in webkit


Ignore:
Timestamp:
Mar 17, 2021, 5:15:57 PM (5 years ago)
Author:
commit-queue@webkit.org
Message:

Reduce maximum HashTable entry size to 250 bytes
https://bugs.webkit.org/show_bug.cgi?id=223398

Patch by Alex Christensen <achristensen@webkit.org> on 2021-03-17
Reviewed by Yusuke Suzuki.

Source/WebCore:

This reduces memory use at runtime.

  • platform/graphics/SourceBufferPrivate.cpp:

(WebCore::SourceBufferPrivate::resetTimestampOffsetInTrackBuffers):
(WebCore::SourceBufferPrivate::resetTrackBuffers):
(WebCore::SourceBufferPrivate::updateHighestPresentationTimestamp):
(WebCore::SourceBufferPrivate::updateBufferedFromTrackBuffers):
(WebCore::SourceBufferPrivate::reenqueSamples):
(WebCore::SourceBufferPrivate::clearTrackBuffers):
(WebCore::SourceBufferPrivate::bufferedSamplesForTrackId):
(WebCore::SourceBufferPrivate::fastSeekTimeForMediaTime):
(WebCore::SourceBufferPrivate::totalTrackBufferSizeInBytes const):
(WebCore::SourceBufferPrivate::addTrackBuffer):
(WebCore::SourceBufferPrivate::updateTrackIds):
(WebCore::SourceBufferPrivate::setAllTrackBuffersNeedRandomAccess):
(WebCore::SourceBufferPrivate::didReceiveSample):

  • platform/graphics/SourceBufferPrivate.h:

Source/WTF:

  • wtf/HashTable.h:

(WTF::KeyTraits>::inlineLookup):

Location:
trunk/Source
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WTF/ChangeLog

    r274602 r274603  
     12021-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
    1112021-03-17  Saam Barati  <sbarati@apple.com>
    212
  • trunk/Source/WTF/wtf/HashTable.h

    r274463 r274603  
    669669    ALWAYS_INLINE auto HashTable<Key, Value, Extractor, HashFunctions, Traits, KeyTraits>::inlineLookup(const T& key) -> ValueType*
    670670    {
    671         static_assert(sizeof(Key) + sizeof(Value) < 400, "Your HashTable types are too big to efficiently move when rehashing.  Consider using std::unique_ptr instead");
     671        static_assert(sizeof(Key) + sizeof(Value) < 250, "Your HashTable types are too big to efficiently move when rehashing.  Consider using UniqueRef instead");
    672672
    673673        checkKey<HashTranslator>(key);
  • trunk/Source/WebCore/ChangeLog

    r274600 r274603  
     12021-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
    1262021-03-17  Aditya Keerthi  <akeerthi@apple.com>
    227
  • trunk/Source/WebCore/platform/graphics/SourceBufferPrivate.cpp

    r274390 r274603  
    7171{
    7272    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();
    7575    }
    7676}
     
    8585{
    8686    for (auto& trackBufferPair : m_trackBufferMap.values()) {
    87         trackBufferPair.lastDecodeTimestamp = MediaTime::invalidTime();
    88         trackBufferPair.greatestDecodeDuration = 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;
    9292    }
    9393}
     
    9797    MediaTime highestTime;
    9898    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())
    101101            continue;
    102102        highestTime = std::max(highestTime, lastSampleIter->first);
     
    125125    MediaTime highestEndTime = MediaTime::negativeInfiniteTime();
    126126    for (auto& trackBuffer : m_trackBufferMap.values()) {
    127         if (!trackBuffer.buffered.length())
     127        if (!trackBuffer.get().buffered.length())
    128128            continue;
    129         highestEndTime = std::max(highestEndTime, trackBuffer.buffered.maximumBufferedTime());
     129        highestEndTime = std::max(highestEndTime, trackBuffer.get().buffered.maximumBufferedTime());
    130130    }
    131131
     
    143143    for (auto& trackBuffer : m_trackBufferMap.values()) {
    144144        // 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;
    146146        if (!trackRanges.length())
    147147            continue;
     
    180180        return;
    181181
    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());
    189187}
    190188
     
    203201{
    204202    for (auto& trackBufferPair : m_trackBufferMap.values()) {
    205         trackBufferPair.samples.clear();
    206         trackBufferPair.decodeQueue.clear();
     203        trackBufferPair.get().samples.clear();
     204        trackBufferPair.get().decodeQueue.clear();
    207205    }
    208206}
     
    210208void SourceBufferPrivate::bufferedSamplesForTrackId(const AtomString& trackId, CompletionHandler<void(Vector<String>&&)>&& completionHandler)
    211209{
    212     auto it = m_trackBufferMap.find(trackId);
    213     if (it == m_trackBufferMap.end())
     210    auto* trackBuffer = m_trackBufferMap.get(trackId);
     211    if (!trackBuffer)
    214212        completionHandler({ });
    215213
    216     auto& trackBuffer = it->value;
    217214    Vector<String> sampleDescriptions;
    218     for (auto& pair : trackBuffer.samples.decodeOrder())
     215    for (auto& pair : trackBuffer->samples.decodeOrder())
    219216        sampleDescriptions.append(toString(*pair.second));
    220217
     
    231228    for (auto& trackBuffer : m_trackBufferMap.values()) {
    232229        // 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();
    237234
    238235        if (futureSyncSampleIterator == upperBound && pastSyncSampleIterator == lowerBound)
     
    735732    uint64_t totalSizeInBytes = 0;
    736733    for (auto& trackBuffer : m_trackBufferMap.values())
    737         totalSizeInBytes += trackBuffer.samples.sizeInBytes();
     734        totalSizeInBytes += trackBuffer.get().samples.sizeInBytes();
    738735
    739736    return totalSizeInBytes;
     
    743740{
    744741    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;
    746743
    747744    // 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();
    752749}
    753750
     
    759756        ASSERT(oldId != newId);
    760757        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)));
    762761    }
    763762}
     
    766765{
    767766    for (auto& trackBuffer : m_trackBufferMap.values())
    768         trackBuffer.needRandomAccessFlag = true;
     767        trackBuffer.get().needRandomAccessFlag = true;
    769768}
    770769
     
    880879
    881880            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();
    884883            }
    885884
     
    889888            // 1.3.3 Set the need random access point flag on all track buffers to true.
    890889            for (auto& trackBuffer : m_trackBufferMap.values())
    891                 trackBuffer.needRandomAccessFlag = true;
     890                trackBuffer.get().needRandomAccessFlag = true;
    892891
    893892            // 1.3.4 Unset group start timestamp.
     
    961960            for (auto& trackBuffer : m_trackBufferMap.values()) {
    962961                // 1.6.2 Unset the last decode timestamp on all track buffers.
    963                 trackBuffer.lastDecodeTimestamp = MediaTime::invalidTime();
     962                trackBuffer.get().lastDecodeTimestamp = MediaTime::invalidTime();
    964963                // 1.6.3 Unset the last frame duration on all track buffers.
    965                 trackBuffer.greatestDecodeDuration = MediaTime::invalidTime();
    966                 trackBuffer.lastFrameDuration = MediaTime::invalidTime();
     964                trackBuffer.get().greatestDecodeDuration = MediaTime::invalidTime();
     965                trackBuffer.get().lastFrameDuration = MediaTime::invalidTime();
    967966                // 1.6.4 Unset the highest presentation timestamp on all track buffers.
    968                 trackBuffer.highestPresentationTimestamp = MediaTime::invalidTime();
     967                trackBuffer.get().highestPresentationTimestamp = MediaTime::invalidTime();
    969968                // 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;
    971970            }
    972971
     
    12671266            m_timestampOffset = frameEndTimestamp;
    12681267            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();
    12711270            }
    12721271        }
  • trunk/Source/WebCore/platform/graphics/SourceBufferPrivate.h

    r274390 r274603  
    111111
    112112    struct TrackBuffer {
     113        WTF_MAKE_STRUCT_FAST_ALLOCATED;
    113114        MediaTime lastDecodeTimestamp;
    114115        MediaTime greatestDecodeDuration;
     
    184185    bool m_hasVideo { false };
    185186
    186     HashMap<AtomString, TrackBuffer> m_trackBufferMap;
     187    HashMap<AtomString, UniqueRef<TrackBuffer>> m_trackBufferMap;
    187188
    188189    SourceBufferAppendMode m_appendMode { SourceBufferAppendMode::Segments };
Note: See TracChangeset for help on using the changeset viewer.