d7ce03fd22bcd3591bd9ecd286e90cacf778582d
[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 findSampleStartingOnOrAfterPresentationTime(const MediaTime&);
61     WEBCORE_EXPORT reverse_iterator reverseFindSampleContainingPresentationTime(const MediaTime&);
62     WEBCORE_EXPORT reverse_iterator reverseFindSampleBeforePresentationTime(const MediaTime&);
63     WEBCORE_EXPORT iterator_range findSamplesBetweenPresentationTimes(const MediaTime&, const MediaTime&);
64     WEBCORE_EXPORT iterator_range findSamplesWithinPresentationRange(const MediaTime&, const MediaTime&);
65     WEBCORE_EXPORT iterator_range findSamplesWithinPresentationRangeFromEnd(const MediaTime&, const MediaTime&);
66
67 private:
68     MapType m_samples;
69 };
70
71 class DecodeOrderSampleMap {
72     friend class SampleMap;
73 public:
74     typedef std::pair<MediaTime, MediaTime> KeyType;
75     using MapType = std::map<KeyType, RefPtr<MediaSample>, std::less<KeyType>, FastAllocator<std::pair<const KeyType, RefPtr<MediaSample>>>>;
76     typedef MapType::iterator iterator;
77     typedef MapType::const_iterator const_iterator;
78     typedef MapType::reverse_iterator reverse_iterator;
79     typedef MapType::const_reverse_iterator const_reverse_iterator;
80     typedef std::pair<reverse_iterator, reverse_iterator> reverse_iterator_range;
81
82     iterator begin() { return m_samples.begin(); }
83     const_iterator begin() const { return m_samples.begin(); }
84     iterator end() { return m_samples.end(); }
85     const_iterator end() const { return m_samples.end(); }
86     reverse_iterator rbegin() { return m_samples.rbegin(); }
87     const_reverse_iterator rbegin() const { return m_samples.rbegin(); }
88     reverse_iterator rend() { return m_samples.rend(); }
89     const_reverse_iterator rend() const { return m_samples.rend(); }
90
91     WEBCORE_EXPORT iterator findSampleWithDecodeKey(const KeyType&);
92     WEBCORE_EXPORT reverse_iterator reverseFindSampleWithDecodeKey(const KeyType&);
93     WEBCORE_EXPORT reverse_iterator findSyncSamplePriorToPresentationTime(const MediaTime&, const MediaTime& threshold = MediaTime::positiveInfiniteTime());
94     WEBCORE_EXPORT reverse_iterator findSyncSamplePriorToDecodeIterator(reverse_iterator);
95     WEBCORE_EXPORT iterator findSyncSampleAfterPresentationTime(const MediaTime&, const MediaTime& threshold = MediaTime::positiveInfiniteTime());
96     WEBCORE_EXPORT iterator findSyncSampleAfterDecodeIterator(iterator);
97     WEBCORE_EXPORT reverse_iterator_range findDependentSamples(MediaSample*);
98
99 private:
100     MapType m_samples;
101     PresentationOrderSampleMap m_presentationOrder;
102 };
103
104 class SampleMap {
105 public:
106     SampleMap() = default;
107
108     WEBCORE_EXPORT bool empty() const;
109     WEBCORE_EXPORT void clear();
110     WEBCORE_EXPORT void addSample(MediaSample&);
111     WEBCORE_EXPORT void removeSample(MediaSample*);
112     size_t sizeInBytes() const { return m_totalSize; }
113
114     template<typename I>
115     void addRange(I begin, I end);
116
117     DecodeOrderSampleMap& decodeOrder() { return m_decodeOrder; }
118     const DecodeOrderSampleMap& decodeOrder() const { return m_decodeOrder; }
119     PresentationOrderSampleMap& presentationOrder() { return m_decodeOrder.m_presentationOrder; }
120     const PresentationOrderSampleMap& presentationOrder() const { return m_decodeOrder.m_presentationOrder; }
121
122 private:
123     DecodeOrderSampleMap m_decodeOrder;
124     size_t m_totalSize { 0 };
125 };
126
127 template<typename I>
128 inline void SampleMap::addRange(I begin, I end)
129 {
130     for (I iter = begin; iter != end; ++iter)
131         addSample(*iter->second);
132 }
133
134 } // namespace WebCore
135
136 #endif // ENABLE(MEDIA_SOURCE)