[GStreamer][MSE] WebKitMediaSourceGStreamer refactoring
[WebKit-https.git] / Source / WebCore / platform / graphics / gstreamer / mse / WebKitMediaSourceGStreamerPrivate.h
1 /*
2  * Copyright (C) 2016 Metrological Group B.V.
3  * Copyright (C) 2016 Igalia S.L
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Library General Public License for more details.
14  *
15  * You should have received a copy of the GNU Library General Public License
16  * aint with this library; see the file COPYING.LIB.  If not, write to
17  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18  * Boston, MA 02110-1301, USA.
19  */
20
21 #pragma once
22
23 #if ENABLE(VIDEO) && USE(GSTREAMER) && ENABLE(MEDIA_SOURCE)
24
25 #include "AudioTrackPrivateGStreamer.h"
26 #include "SourceBufferPrivateGStreamer.h"
27 #include "VideoTrackPrivateGStreamer.h"
28 #include "WebKitMediaSourceGStreamer.h"
29
30 #include <gst/app/gstappsrc.h>
31 #include <gst/gst.h>
32 #include <wtf/Condition.h>
33 #include <wtf/RefPtr.h>
34 #include <wtf/glib/GRefPtr.h>
35
36 namespace WebCore {
37
38 class MediaPlayerPrivateGStreamerMSE;
39
40 };
41
42 void webKitMediaSrcUriHandlerInit(gpointer, gpointer);
43
44 #define WEBKIT_MEDIA_SRC_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), WEBKIT_TYPE_MEDIA_SRC, WebKitMediaSrcPrivate))
45
46 typedef struct _Stream Stream;
47
48 struct _Stream {
49     // Fields filled when the Stream is created.
50     WebKitMediaSrc* parent;
51
52     // AppSrc.
53     GstElement* appsrc;
54     GstPad* decodebinSinkPad;
55     WebCore::SourceBufferPrivateGStreamer* sourceBuffer;
56
57     // Fields filled when the track is attached.
58     WebCore::MediaSourceStreamTypeGStreamer type;
59     // Might be 0, e.g. for VP8/VP9.
60     GstElement* parser;
61     GRefPtr<GstCaps> caps;
62     RefPtr<WebCore::AudioTrackPrivateGStreamer> audioTrack;
63     RefPtr<WebCore::VideoTrackPrivateGStreamer> videoTrack;
64     WebCore::FloatSize presentationSize;
65
66     // This helps WebKitMediaSrcPrivate.appsrcNeedDataCount, ensuring that needDatas are
67     // counted only once per each appsrc.
68     bool appsrcNeedDataFlag;
69
70     // Used to enforce continuity in the appended data and avoid breaking the decoder.
71     MediaTime lastEnqueuedTime;
72 };
73
74 enum {
75     PROP_0,
76     PROP_LOCATION,
77     PROP_N_AUDIO,
78     PROP_N_VIDEO,
79     PROP_N_TEXT,
80     PROP_LAST
81 };
82
83 enum {
84     SIGNAL_VIDEO_CHANGED,
85     SIGNAL_AUDIO_CHANGED,
86     SIGNAL_TEXT_CHANGED,
87     LAST_SIGNAL
88 };
89
90 enum OnSeekDataAction {
91     Nothing,
92     MediaSourceSeekToTime
93 };
94
95 struct _WebKitMediaSrcPrivate {
96     // Used to coordinate the release of Stream track info.
97     Lock streamLock;
98     Condition streamCondition;
99
100     Deque<Stream*> streams;
101     GUniquePtr<gchar> location;
102     int numberOfAudioStreams;
103     int numberOfVideoStreams;
104     int numberOfTextStreams;
105     bool asyncStart;
106     bool allTracksConfigured;
107     unsigned numberOfPads;
108
109     MediaTime seekTime;
110
111     // On seek, we wait for all the seekDatas, then for all the needDatas, and then run the nextAction.
112     OnSeekDataAction appsrcSeekDataNextAction;
113     int appsrcSeekDataCount;
114     int appsrcNeedDataCount;
115
116     GRefPtr<GstBus> bus;
117     WebCore::MediaPlayerPrivateGStreamerMSE* mediaPlayerPrivate;
118 };
119
120 extern guint webKitMediaSrcSignals[LAST_SIGNAL];
121 extern GstAppSrcCallbacks enabledAppsrcCallbacks;
122 extern GstAppSrcCallbacks disabledAppsrcCallbacks;
123
124 void webKitMediaSrcUriHandlerInit(gpointer gIface, gpointer ifaceData);
125 void webKitMediaSrcFinalize(GObject*);
126 void webKitMediaSrcSetProperty(GObject*, guint propertyId, const GValue*, GParamSpec*);
127 void webKitMediaSrcGetProperty(GObject*, guint propertyId, GValue*, GParamSpec*);
128 void webKitMediaSrcDoAsyncStart(WebKitMediaSrc*);
129 void webKitMediaSrcDoAsyncDone(WebKitMediaSrc*);
130 GstStateChangeReturn webKitMediaSrcChangeState(GstElement*, GstStateChange);
131 gint64 webKitMediaSrcGetSize(WebKitMediaSrc*);
132 gboolean webKitMediaSrcQueryWithParent(GstPad*, GstObject*, GstQuery*);
133 void webKitMediaSrcUpdatePresentationSize(GstCaps*, Stream*);
134 void webKitMediaSrcLinkStreamToSrcPad(GstPad*, Stream*);
135 void webKitMediaSrcLinkParser(GstPad*, GstCaps*, Stream*);
136 void webKitMediaSrcFreeStream(WebKitMediaSrc*, Stream*);
137 void webKitMediaSrcCheckAllTracksConfigured(WebKitMediaSrc*);
138 GstURIType webKitMediaSrcUriGetType(GType);
139 const gchar* const* webKitMediaSrcGetProtocols(GType);
140 gchar* webKitMediaSrcGetUri(GstURIHandler*);
141 gboolean webKitMediaSrcSetUri(GstURIHandler*, const gchar*, GError**);
142
143 #endif // USE(GSTREAMER)