summaryrefslogtreecommitdiff
path: root/Source/WebCore/Modules/mediasource/SampleMap.h
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/Modules/mediasource/SampleMap.h')
-rw-r--r--Source/WebCore/Modules/mediasource/SampleMap.h120
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)