[GStreamer] Refactor media player to use MediaTime consistently
[WebKit-https.git] / Source / WebCore / platform / graphics / gstreamer / mse / MediaPlayerPrivateGStreamerMSE.h
1 /*
2  * Copyright (C) 2007, 2009 Apple Inc.  All rights reserved.
3  * Copyright (C) 2007 Collabora Ltd. All rights reserved.
4  * Copyright (C) 2007 Alp Toker <alp@atoker.com>
5  * Copyright (C) 2009, 2010, 2016 Igalia S.L
6  * Copyright (C) 2015 Sebastian Dröge <sebastian@centricular.com>
7  * Copyright (C) 2015, 2016 Metrological Group B.V.
8  *
9  * This library is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Library General Public
11  * License as published by the Free Software Foundation; either
12  * version 2 of the License, or (at your option) any later version.
13  *
14  * This library is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * Library General Public License for more details.
18  *
19  * You should have received a copy of the GNU Library General Public License
20  * aint with this library; see the file COPYING.LIB.  If not, write to
21  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
22  * Boston, MA 02110-1301, USA.
23  */
24
25 #pragma once
26
27 #if ENABLE(VIDEO) && USE(GSTREAMER) && ENABLE(MEDIA_SOURCE) 
28
29 #include "GRefPtrGStreamer.h"
30 #include "MediaPlayerPrivateGStreamer.h"
31 #include "MediaSample.h"
32 #include "MediaSourceGStreamer.h"
33 #include "PlaybackPipeline.h"
34 #include "WebKitMediaSourceGStreamer.h"
35
36 namespace WebCore {
37
38 class MediaSourceClientGStreamerMSE;
39 class AppendPipeline;
40 class PlaybackPipeline;
41
42 class MediaPlayerPrivateGStreamerMSE : public MediaPlayerPrivateGStreamer {
43     WTF_MAKE_NONCOPYABLE(MediaPlayerPrivateGStreamerMSE); WTF_MAKE_FAST_ALLOCATED;
44
45     friend class MediaSourceClientGStreamerMSE;
46
47 public:
48     explicit MediaPlayerPrivateGStreamerMSE(MediaPlayer*);
49     virtual ~MediaPlayerPrivateGStreamerMSE();
50
51     static void registerMediaEngine(MediaEngineRegistrar);
52
53     void load(const String&) override;
54     void load(const String&, MediaSourcePrivateClient*) override;
55
56     void setDownloadBuffering() override { };
57
58     bool isLiveStream() const override { return false; }
59     MediaTime currentMediaTime() const override;
60
61     void pause() override;
62     bool seeking() const override;
63     void seek(const MediaTime&) override;
64     void configurePlaySink() override;
65     bool changePipelineState(GstState) override;
66
67     void durationChanged() override;
68     MediaTime durationMediaTime() const override;
69
70     void setRate(float) override;
71     std::unique_ptr<PlatformTimeRanges> buffered() const override;
72     MediaTime maxMediaTimeSeekable() const override;
73
74     void sourceChanged() override;
75
76     void setReadyState(MediaPlayer::ReadyState);
77     void waitForSeekCompleted();
78     void seekCompleted();
79     MediaSourcePrivateClient* mediaSourcePrivateClient() { return m_mediaSource.get(); }
80
81     void markEndOfStream(MediaSourcePrivate::EndOfStreamStatus);
82
83     void trackDetected(RefPtr<AppendPipeline>, RefPtr<WebCore::TrackPrivateBase>, bool firstTrackDetected);
84     void notifySeekNeedsDataForTime(const MediaTime&);
85
86     static bool supportsCodecs(const String& codecs);
87
88 #if ENABLE(ENCRYPTED_MEDIA)
89     void attemptToDecryptWithInstance(const CDMInstance&) final;
90 #endif
91
92 private:
93     static void getSupportedTypes(HashSet<String, ASCIICaseInsensitiveHash>&);
94     static MediaPlayer::SupportsType supportsType(const MediaEngineSupportParameters&);
95
96     static bool isAvailable();
97
98     // FIXME: Reduce code duplication.
99     void updateStates() override;
100
101     bool doSeek(const MediaTime&, float, GstSeekFlags) override;
102     bool doSeek();
103     void maybeFinishSeek();
104     void updatePlaybackRate() override;
105     void asyncStateChangeDone() override;
106
107     // FIXME: Implement.
108     std::optional<PlatformVideoPlaybackQualityMetrics> videoPlaybackQualityMetrics() override { return std::nullopt; }
109     bool isTimeBuffered(const MediaTime&) const;
110
111     bool isMediaSource() const override { return true; }
112
113     void setMediaSourceClient(Ref<MediaSourceClientGStreamerMSE>);
114     RefPtr<MediaSourceClientGStreamerMSE> mediaSourceClient();
115
116     HashMap<RefPtr<SourceBufferPrivateGStreamer>, RefPtr<AppendPipeline>> m_appendPipelinesMap;
117     bool m_eosMarked = false;
118     mutable bool m_eosPending = false;
119     bool m_gstSeekCompleted = true;
120     RefPtr<MediaSourcePrivateClient> m_mediaSource;
121     RefPtr<MediaSourceClientGStreamerMSE> m_mediaSourceClient;
122     MediaTime m_mediaTimeDuration;
123     bool m_mseSeekCompleted = true;
124     RefPtr<PlaybackPipeline> m_playbackPipeline;
125 };
126
127 } // namespace WebCore
128
129 #endif // USE(GSTREAMER)