[MSE] Removing samples when presentation order does not match decode order can cause...
[WebKit.git] / Source / WebCore / Modules / mediasource / SampleMap.h
1 /*
2  * Copyright (C) 2013 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #pragma once
27
28 #if ENABLE(MEDIA_SOURCE)
29
30 #include <map>
31 #include <wtf/MediaTime.h>
32 #include <wtf/RefPtr.h>
33
34 namespace WebCore {
35
36 class MediaSample;
37 class SampleMap;
38
39 class PresentationOrderSampleMap {
40     friend class SampleMap;
41 public:
42     using MapType = std::map<MediaTime, RefPtr<MediaSample>, std::less<MediaTime>, FastAllocator<std::pair<const MediaTime, RefPtr<MediaSample>>>>;
43     typedef MapType::iterator iterator;
44     typedef MapType::const_iterator const_iterator;
45     typedef MapType::reverse_iterator reverse_iterator;
46     typedef MapType::const_reverse_iterator const_reverse_iterator;
47     typedef std::pair<iterator, iterator> iterator_range;
48
49     iterator begin() { return m_samples.begin(); }
50     const_iterator begin() const { return m_samples.begin(); }
51     iterator end() { return m_samples.end(); }
52     const_iterator end() const { return m_samples.end(); }
53     reverse_iterator rbegin() { return m_samples.rbegin(); }
54     const_reverse_iterator rbegin() const { return m_samples.rbegin(); }
55     reverse_iterator rend() { return m_samples.rend(); }
56     const_reverse_iterator rend() const { return m_samples.rend(); }
57
58     WEBCORE_EXPORT iterator findSampleWithPresentationTime(const MediaTime&);
59     WEBCORE_EXPORT iterator findSampleContainingPresentationTime(const MediaTime&);
60     WEBCORE_EXPORT iterator findSampleContainingOrAfterPresentationTime(const MediaTime&);
61     WEBCORE_EXPORT iterator findSampleStartingOnOrAfterPresentationTime(const MediaTime&);
62     WEBCORE_EXPORT iterator findSampleStartingAfterPresentationTime(const MediaTime&);
63     WEBCORE_EXPORT reverse_iterator reverseFindSampleContainingPresentationTime(const MediaTime&);
64     WEBCORE_EXPORT reverse_iterator reverseFindSampleBeforePresentationTime(const MediaTime&);
65     WEBCORE_EXPORT iterator_range findSamplesBetweenPresentationTimes(const MediaTime&, const MediaTime&);
66     WEBCORE_EXPORT iterator_range findSamplesWithinPresentationRange(const MediaTime&, const MediaTime&);
67     WEBCORE_EXPORT iterator_range findSamplesWithinPresentationRangeFromEnd(const MediaTime&, const MediaTime&);
68
69 private:
70     MapType m_samples;
71 };
72
73 class DecodeOrderSampleMap {
74     friend class SampleMap;
75 public:
76     typedef std::pair<MediaTime, MediaTime> KeyType;
77     using MapType = std::map<KeyType, RefPtr<MediaSample>, std::less<KeyType>, FastAllocator<std::pair<const KeyType, RefPtr<MediaSample>>>>;
78     typedef MapType::iterator iterator;
79     typedef MapType::const_iterator const_iterator;
80     typedef MapType::reverse_iterator reverse_iterator;
81     typedef MapType::const_reverse_iterator const_reverse_iterator;
82     typedef std::pair<reverse_iterator, reverse_iterator> reverse_iterator_range;
83
84     iterator begin() { return m_samples.begin(); }
85     const_iterator begin() const { return m_samples.begin(); }
86     iterator end() { return m_samples.end(); }
87     const_iterator end() const { return m_samples.end(); }
88     reverse_iterator rbegin() { return m_samples.rbegin(); }
89     const_reverse_iterator rbegin() const { return m_samples.rbegin(); }
90     reverse_iterator rend() { return m_samples.rend(); }
91     const_reverse_iterator rend() const { return m_samples.rend(); }
92
93     WEBCORE_EXPORT iterator findSampleWithDecodeKey(const KeyType&);
94     WEBCORE_EXPORT reverse_iterator reverseFindSampleWithDecodeKey(const KeyType&);
95     WEBCORE_EXPORT reverse_iterator findSyncSamplePriorToPresentationTime(const MediaTime&, const MediaTime& threshold = MediaTime::positiveInfiniteTime());
96     WEBCORE_EXPORT reverse_iterator findSyncSamplePriorToDecodeIterator(reverse_iterator);
97     WEBCORE_EXPORT iterator findSyncSampleAfterPresentationTime(const MediaTime&, const MediaTime& threshold = MediaTime::positiveInfiniteTime());
98     WEBCORE_EXPORT iterator findSyncSampleAfterDecodeIterator(iterator);
99     WEBCORE_EXPORT reverse_iterator_range findDependentSamples(MediaSample*);
100
101 private:
102     MapType m_samples;
103     PresentationOrderSampleMap m_presentationOrder;
104 };
105
106 class SampleMap {
107 public:
108     SampleMap() = default;
109
110     WEBCORE_EXPORT bool empty() const;
111     WEBCORE_EXPORT void clear();
112     WEBCORE_EXPORT void addSample(MediaSample&);
113     WEBCORE_EXPORT void removeSample(MediaSample*);
114     size_t sizeInBytes() const { return m_totalSize; }
115
116     template<typename I>
117     void addRange(I begin, I end);
118
119     DecodeOrderSampleMap& decodeOrder() { return m_decodeOrder; }
120     const DecodeOrderSampleMap& decodeOrder() const { return m_decodeOrder; }
121     PresentationOrderSampleMap& presentationOrder() { return m_decodeOrder.m_presentationOrder; }
122     const PresentationOrderSampleMap& presentationOrder() const { return m_decodeOrder.m_presentationOrder; }
123
124 private:
125     DecodeOrderSampleMap m_decodeOrder;
126     size_t m_totalSize { 0 };
127 };
128
129 template<typename I>
130 inline void SampleMap::addRange(I begin, I end)
131 {
132     for (I iter = begin; iter != end; ++iter)
133         addSample(*iter->second);
134 }
135
136 } // namespace WebCore
137
138 #endif // ENABLE(MEDIA_SOURCE)