diff options
Diffstat (limited to 'Source/WebCore/Modules/mediasource/SampleMap.h')
-rw-r--r-- | Source/WebCore/Modules/mediasource/SampleMap.h | 120 |
1 files changed, 87 insertions, 33 deletions
diff --git a/Source/WebCore/Modules/mediasource/SampleMap.h b/Source/WebCore/Modules/mediasource/SampleMap.h index deb42c453..639797a2b 100644 --- a/Source/WebCore/Modules/mediasource/SampleMap.h +++ b/Source/WebCore/Modules/mediasource/SampleMap.h @@ -23,8 +23,7 @@ * THE POSSIBILITY OF SUCH DAMAGE. */ -#ifndef SampleMap_h -#define SampleMap_h +#pragma once #if ENABLE(MEDIA_SOURCE) @@ -35,48 +34,103 @@ namespace WebCore { class MediaSample; +class SampleMap; -class SampleMap { +class PresentationOrderSampleMap { + friend class SampleMap; public: typedef std::map<MediaTime, RefPtr<MediaSample>> MapType; typedef MapType::iterator iterator; + typedef MapType::const_iterator const_iterator; typedef MapType::reverse_iterator reverse_iterator; + typedef MapType::const_reverse_iterator const_reverse_iterator; typedef std::pair<iterator, iterator> iterator_range; + + iterator begin() { return m_samples.begin(); } + const_iterator begin() const { return m_samples.begin(); } + iterator end() { return m_samples.end(); } + const_iterator end() const { return m_samples.end(); } + reverse_iterator rbegin() { return m_samples.rbegin(); } + const_reverse_iterator rbegin() const { return m_samples.rbegin(); } + reverse_iterator rend() { return m_samples.rend(); } + const_reverse_iterator rend() const { return m_samples.rend(); } + + WEBCORE_EXPORT iterator findSampleWithPresentationTime(const MediaTime&); + WEBCORE_EXPORT iterator findSampleContainingPresentationTime(const MediaTime&); + WEBCORE_EXPORT iterator findSampleStartingOnOrAfterPresentationTime(const MediaTime&); + WEBCORE_EXPORT reverse_iterator reverseFindSampleContainingPresentationTime(const MediaTime&); + WEBCORE_EXPORT reverse_iterator reverseFindSampleBeforePresentationTime(const MediaTime&); + WEBCORE_EXPORT iterator_range findSamplesBetweenPresentationTimes(const MediaTime&, const MediaTime&); + WEBCORE_EXPORT iterator_range findSamplesWithinPresentationRange(const MediaTime&, const MediaTime&); + WEBCORE_EXPORT iterator_range findSamplesWithinPresentationRangeFromEnd(const MediaTime&, const MediaTime&); + +private: + MapType m_samples; +}; + +class DecodeOrderSampleMap { + friend class SampleMap; +public: + typedef std::pair<MediaTime, MediaTime> KeyType; + typedef std::map<KeyType, RefPtr<MediaSample>> MapType; + typedef MapType::iterator iterator; + typedef MapType::const_iterator const_iterator; + typedef MapType::reverse_iterator reverse_iterator; + typedef MapType::const_reverse_iterator const_reverse_iterator; typedef std::pair<reverse_iterator, reverse_iterator> reverse_iterator_range; - void addSample(PassRefPtr<MediaSample>); - void removeSample(MediaSample*); - - iterator presentationBegin() { return m_presentationSamples.begin(); } - iterator presentationEnd() { return m_presentationSamples.end(); } - iterator decodeBegin() { return m_decodeSamples.begin(); } - iterator decodeEnd() { return m_decodeSamples.end(); } - reverse_iterator reversePresentationBegin() { return m_presentationSamples.rbegin(); } - reverse_iterator reversePresentationEnd() { return m_presentationSamples.rend(); } - reverse_iterator reverseDecodeBegin() { return m_decodeSamples.rbegin(); } - reverse_iterator reverseDecodeEnd() { return m_decodeSamples.rend(); } - - iterator findSampleContainingPresentationTime(const MediaTime&); - iterator findSampleAfterPresentationTime(const MediaTime&); - iterator findSampleWithDecodeTime(const MediaTime&); - reverse_iterator reverseFindSampleContainingPresentationTime(const MediaTime&); - reverse_iterator reverseFindSampleBeforePresentationTime(const MediaTime&); - reverse_iterator reverseFindSampleWithDecodeTime(const MediaTime&); - reverse_iterator findSyncSamplePriorToPresentationTime(const MediaTime&, const MediaTime& threshold = MediaTime::positiveInfiniteTime()); - reverse_iterator findSyncSamplePriorToDecodeIterator(reverse_iterator); - iterator findSyncSampleAfterPresentationTime(const MediaTime&, const MediaTime& threshold = MediaTime::positiveInfiniteTime()); - iterator findSyncSampleAfterDecodeIterator(iterator); - - iterator_range findSamplesBetweenPresentationTimes(const MediaTime&, const MediaTime&); - reverse_iterator_range findDependentSamples(MediaSample*); - + iterator begin() { return m_samples.begin(); } + const_iterator begin() const { return m_samples.begin(); } + iterator end() { return m_samples.end(); } + const_iterator end() const { return m_samples.end(); } + reverse_iterator rbegin() { return m_samples.rbegin(); } + const_reverse_iterator rbegin() const { return m_samples.rbegin(); } + reverse_iterator rend() { return m_samples.rend(); } + const_reverse_iterator rend() const { return m_samples.rend(); } + + WEBCORE_EXPORT iterator findSampleWithDecodeKey(const KeyType&); + WEBCORE_EXPORT reverse_iterator reverseFindSampleWithDecodeKey(const KeyType&); + WEBCORE_EXPORT reverse_iterator findSyncSamplePriorToPresentationTime(const MediaTime&, const MediaTime& threshold = MediaTime::positiveInfiniteTime()); + WEBCORE_EXPORT reverse_iterator findSyncSamplePriorToDecodeIterator(reverse_iterator); + WEBCORE_EXPORT iterator findSyncSampleAfterPresentationTime(const MediaTime&, const MediaTime& threshold = MediaTime::positiveInfiniteTime()); + WEBCORE_EXPORT iterator findSyncSampleAfterDecodeIterator(iterator); + WEBCORE_EXPORT reverse_iterator_range findDependentSamples(MediaSample*); + +private: + MapType m_samples; + PresentationOrderSampleMap m_presentationOrder; +}; + +class SampleMap { +public: + SampleMap() = default; + + WEBCORE_EXPORT bool empty() const; + WEBCORE_EXPORT void clear(); + WEBCORE_EXPORT void addSample(MediaSample&); + WEBCORE_EXPORT void removeSample(MediaSample*); + size_t sizeInBytes() const { return m_totalSize; } + + template<typename I> + void addRange(I begin, I end); + + DecodeOrderSampleMap& decodeOrder() { return m_decodeOrder; } + const DecodeOrderSampleMap& decodeOrder() const { return m_decodeOrder; } + PresentationOrderSampleMap& presentationOrder() { return m_decodeOrder.m_presentationOrder; } + const PresentationOrderSampleMap& presentationOrder() const { return m_decodeOrder.m_presentationOrder; } + private: - MapType m_presentationSamples; - MapType m_decodeSamples; + DecodeOrderSampleMap m_decodeOrder; + size_t m_totalSize { 0 }; }; +template<typename I> +inline void SampleMap::addRange(I begin, I end) +{ + for (I iter = begin; iter != end; ++iter) + addSample(*iter->second); } -#endif +} // namespace WebCore -#endif // SampleMap_h +#endif // ENABLE(MEDIA_SOURCE) |