Line data Source code
1 : /*
2 : * If not stated otherwise in this file or this component's LICENSE file the
3 : * following copyright and licenses apply:
4 : *
5 : * Copyright 2022 Sky UK
6 : *
7 : * Licensed under the Apache License, Version 2.0 (the "License");
8 : * you may not use this file except in compliance with the License.
9 : * You may obtain a copy of the License at
10 : *
11 : * http://www.apache.org/licenses/LICENSE-2.0
12 : *
13 : * Unless required by applicable law or agreed to in writing, software
14 : * distributed under the License is distributed on an "AS IS" BASIS,
15 : * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 : * See the License for the specific language governing permissions and
17 : * limitations under the License.
18 : */
19 :
20 : #ifndef FIREBOLT_RIALTO_SERVER_I_GST_GENERIC_PLAYER_PRIVATE_H_
21 : #define FIREBOLT_RIALTO_SERVER_I_GST_GENERIC_PLAYER_PRIVATE_H_
22 :
23 : #include "IMediaPipeline.h"
24 :
25 : #include <gst/app/gstappsrc.h>
26 : #include <gst/gst.h>
27 : #include <memory>
28 : #include <string>
29 : #include <vector>
30 :
31 : namespace firebolt::rialto::server
32 : {
33 : class IGstGenericPlayerPrivate
34 : {
35 : public:
36 489 : IGstGenericPlayerPrivate() = default;
37 489 : virtual ~IGstGenericPlayerPrivate() = default;
38 :
39 : IGstGenericPlayerPrivate(const IGstGenericPlayerPrivate &) = delete;
40 : IGstGenericPlayerPrivate &operator=(const IGstGenericPlayerPrivate &) = delete;
41 : IGstGenericPlayerPrivate(IGstGenericPlayerPrivate &&) = delete;
42 : IGstGenericPlayerPrivate &operator=(IGstGenericPlayerPrivate &&) = delete;
43 :
44 : /**
45 : * @brief Schedules need media data task. Called by the worker thread.
46 : */
47 : virtual void scheduleNeedMediaData(GstAppSrc *src) = 0;
48 :
49 : /**
50 : * @brief Schedules enough data task. Called by the worker thread.
51 : */
52 : virtual void scheduleEnoughData(GstAppSrc *src) = 0;
53 :
54 : /**
55 : * @brief Schedules audio underflow task. Called by the worker thread.
56 : */
57 : virtual void scheduleAudioUnderflow() = 0;
58 :
59 : /**
60 : * @brief Schedules video underflow task. Called by the worker thread.
61 : */
62 : virtual void scheduleVideoUnderflow() = 0;
63 :
64 : /**
65 : * @brief Schedules all sources attached task. Called by the worker thread.
66 : */
67 : virtual void scheduleAllSourcesAttached() = 0;
68 :
69 : /**
70 : * @brief Sets video sink rectangle. Called by the worker thread.
71 : *
72 : * @retval true on success.
73 : */
74 : virtual bool setVideoSinkRectangle() = 0;
75 :
76 : /**
77 : * @brief Sets immediate output. Called by the worker thread.
78 : *
79 : * @retval true on success.
80 : */
81 : virtual bool setImmediateOutput() = 0;
82 :
83 : /**
84 : * @brief Sets report decode error. Called by the worker thread.
85 : *
86 : * @retval true on success.
87 : */
88 : virtual bool setReportDecodeErrors() = 0;
89 :
90 : /**
91 : * @brief Sets the low latency property. Called by the worker thread.
92 : *
93 : * @retval true on success.
94 : */
95 : virtual bool setLowLatency() = 0;
96 :
97 : /**
98 : * @brief Sets the sync property. Called by the worker thread.
99 : *
100 : * @retval true on success.
101 : */
102 : virtual bool setSync() = 0;
103 :
104 : /**
105 : * @brief Sets the sync off property. Called by the worker thread.
106 : *
107 : * @retval true on success.
108 : */
109 : virtual bool setSyncOff() = 0;
110 :
111 : /**
112 : * @brief Sets the stream sync mode property. Called by the worker thread.
113 : *
114 : * @retval true on success.
115 : */
116 : virtual bool setStreamSyncMode(const MediaSourceType &type) = 0;
117 :
118 : /**
119 : * @brief Sets frame rendering. Called by the worker thread.
120 : *
121 : * @retval true on success.
122 : */
123 : virtual bool setRenderFrame() = 0;
124 :
125 : /**
126 : * @brief Sets buffering limit. Called by the worker thread.
127 : *
128 : * @retval true on success.
129 : */
130 : virtual bool setBufferingLimit() = 0;
131 :
132 : /**
133 : * @brief Sets use buffering. Called by the worker thread.
134 : *
135 : * @retval true on success.
136 : */
137 : virtual bool setUseBuffering() = 0;
138 :
139 : /**
140 : * @brief Sets Show Video Window property. Called by the worker thread.
141 : *
142 : * @retval true on success.
143 : */
144 : virtual bool setShowVideoWindow() = 0;
145 :
146 : /**
147 : * @brief Sends NeedMediaData notification. Called by the worker thread.
148 : */
149 : virtual void notifyNeedMediaData(const MediaSourceType mediaSource) = 0;
150 :
151 : /**
152 : * @brief Constructs a new buffer with data from media segment. Does not perform decryption.
153 : * Called by the worker thread.
154 : */
155 : virtual GstBuffer *createBuffer(const IMediaPipeline::MediaSegment &mediaSegment) const = 0;
156 :
157 : virtual void attachData(const firebolt::rialto::MediaSourceType mediaType) = 0;
158 :
159 : /**
160 : * @brief Checks the new audio mediaSegment metadata and updates the caps accordingly.
161 : */
162 : virtual void updateAudioCaps(int32_t rate, int32_t channels, const std::shared_ptr<CodecData> &codecData) = 0;
163 :
164 : /**
165 : * @brief Checks the new video mediaSegment metadata and updates the caps accordingly.
166 : */
167 : virtual void updateVideoCaps(int32_t width, int32_t height, Fraction frameRate,
168 : const std::shared_ptr<CodecData> &codecData) = 0;
169 :
170 : /**
171 : * @brief Adds clipping meta to the audio buffer.
172 : *
173 : * @param buffer the buffer to add the clipping meta to
174 : * @param clippingStart the start of the clipping
175 : * @param clippingEnd the end of the clipping
176 : */
177 : virtual void addAudioClippingToBuffer(GstBuffer *buffer, uint64_t clippingStart, uint64_t clippingEnd) const = 0;
178 :
179 : /**
180 : * @brief Changes pipeline state.
181 : *
182 : * @param[in] newState : The desired state.
183 : *
184 : * @retval state change status
185 : */
186 : virtual GstStateChangeReturn changePipelineState(GstState newState) = 0;
187 :
188 : /**
189 : * @brief Gets the current position of the element
190 : *
191 : * @param[in] element : The GstElement to check.
192 : *
193 : * @retval position of the element; -1 in case of failure
194 : */
195 : virtual int64_t getPosition(GstElement *element) = 0;
196 :
197 : /**
198 : * @brief Starts position reporting and check audio underflow. Called by the worker thread.
199 : */
200 : virtual void startPositionReportingAndCheckAudioUnderflowTimer() = 0;
201 :
202 : /**
203 : * @brief Stops position reporting and check audio underflow. Called by the worker thread.
204 : */
205 : virtual void stopPositionReportingAndCheckAudioUnderflowTimer() = 0;
206 :
207 : /**
208 : * @brief Starts notify playback info timer. Called by the worker thread.
209 : */
210 : virtual void startNotifyPlaybackInfoTimer() = 0;
211 :
212 : /**
213 : * @brief Stops notify playback info timer. Called by the worker thread.
214 : */
215 : virtual void stopNotifyPlaybackInfoTimer() = 0;
216 :
217 : /**
218 : * @brief Starts subtitle clock resync. Called by the worker thread.
219 : */
220 : virtual void startSubtitleClockResyncTimer() = 0;
221 :
222 : /**
223 : * @brief Stops subtitle clock resync. Called by the worker thread.
224 : */
225 : virtual void stopSubtitleClockResyncTimer() = 0;
226 :
227 : /**
228 : * @brief Stops worker thread. Called by the worker thread.
229 : */
230 : virtual void stopWorkerThread() = 0;
231 :
232 : /**
233 : * @brief Restores playback after underflow. Called by the worker thread.
234 : *
235 : * @param[in] underflowFlag : The audio or video underflow flag to be cleared.
236 : */
237 : virtual void cancelUnderflow(firebolt::rialto::MediaSourceType mediaSource) = 0;
238 :
239 : /**
240 : * @brief Sets pending playback rate after reaching PLAYING state
241 : *
242 : */
243 : virtual void setPendingPlaybackRate() = 0;
244 :
245 : /**
246 : * @brief Updates Playback Group in PlayerContext.
247 : */
248 : virtual void updatePlaybackGroup(GstElement *typefind, const GstCaps *caps) = 0;
249 :
250 : /**
251 : * @brief Notification that a new child element has been added to the autovideosink.
252 : * Stores the child video sink in the player context.
253 : *
254 : * @param[in] object : Element added to the autovideosink.
255 : */
256 : virtual void addAutoVideoSinkChild(GObject *object) = 0;
257 :
258 : /**
259 : * @brief Notification that a new child element has been added to the autoaudiosink.
260 : * Stores the child audio sink in the player context.
261 : *
262 : * @param[in] object : Element added to the autoaudiosink.
263 : */
264 : virtual void addAutoAudioSinkChild(GObject *object) = 0;
265 :
266 : /**
267 : * @brief Notification that a child element has been removed from the autovideosink.
268 : * Removes the child video sink in the player context if it has been stored.
269 : *
270 : * @param[in] object : Element removed from the autovideosink.
271 : */
272 : virtual void removeAutoVideoSinkChild(GObject *object) = 0;
273 :
274 : /**
275 : * @brief Notification that a child element has been removed from the autoaudiosink.
276 : * Removes the child audio sink in the player context if it has been stored.
277 : *
278 : * @param[in] object : Element removed from the autoaudiosink.
279 : */
280 : virtual void removeAutoAudioSinkChild(GObject *object) = 0;
281 :
282 : /**
283 : * @brief Gets the sink element for source type.
284 : *
285 : * @param[in] mediaSourceType : the source type to obtain the sink for
286 : *
287 : * @retval The sink, NULL if not found. Please call getObjectUnref() if it's non-null
288 : */
289 : virtual GstElement *getSink(const MediaSourceType &mediaSourceType) const = 0;
290 :
291 : /**
292 : * @brief Pushes GstSample if playback position has changed or new segment needs to be sent.
293 : *
294 : * @param[in] source : The Gst Source element, that should receive new sample
295 : * @param[in] typeStr : The media source type string
296 : */
297 : virtual void pushSampleIfRequired(GstElement *source, const std::string &typeStr) = 0;
298 :
299 : /**
300 : * @brief Reattaches source (or switches it)
301 : *
302 : * @param[in] source : The new media source
303 : *
304 : * @retval True on success
305 : */
306 : virtual bool reattachSource(const std::unique_ptr<IMediaPipeline::MediaSource> &source) = 0;
307 :
308 : /**
309 : * @brief Checks if the player has a source of the given type.
310 : *
311 : * @param[in] mediaSourceType : The source type to check
312 : *
313 : * @retval True if the player has a source of the given type, false otherwise
314 : */
315 : virtual bool hasSourceType(const MediaSourceType &mediaSourceType) const = 0;
316 :
317 : /**
318 : * @brief Sets source state flushed
319 : *
320 : * @param[in] mediaSourceType : the source type that has been flushed
321 : */
322 : virtual void setSourceFlushed(const MediaSourceType &mediaSourceType) = 0;
323 :
324 : /**
325 : * @brief Sends PlaybackInfo notification. Called by the worker thread.
326 : */
327 : virtual void notifyPlaybackInfo() = 0;
328 : };
329 : } // namespace firebolt::rialto::server
330 :
331 : #endif // FIREBOLT_RIALTO_SERVER_I_GST_GENERIC_PLAYER_PRIVATE_H_
|