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_GENERIC_PLAYER_CONTEXT_H_
21 : #define FIREBOLT_RIALTO_SERVER_GENERIC_PLAYER_CONTEXT_H_
22 :
23 : #include "IGstSrc.h"
24 : #include "IRdkGstreamerUtilsWrapper.h"
25 : #include "ITimer.h"
26 : #include "MediaCommon.h"
27 : #include <gst/gst.h>
28 : #include <list>
29 : #include <map>
30 : #include <memory>
31 : #include <mutex>
32 : #include <unordered_map>
33 : #include <vector>
34 :
35 : namespace firebolt::rialto::server
36 : {
37 : constexpr double kNoPendingPlaybackRate{0.0};
38 :
39 : enum class EosState
40 : {
41 : PENDING,
42 : SET
43 : };
44 :
45 : /**
46 : * @brief Structure used for video geometry
47 : */
48 : struct Rectangle
49 : {
50 : int x, y, width, height;
51 503 : constexpr Rectangle() : x(0), y(0), width(0), height(0) {}
52 1 : constexpr Rectangle(int x_, int y_, int w_, int h_) : x(x_), y(y_), width(w_), height(h_) {}
53 : Rectangle(const Rectangle &rhs) = default;
54 10 : inline constexpr bool empty() { return (width == 0) || (height == 0); }
55 2 : inline void clear() { x = y = width = height = 0; }
56 : };
57 :
58 : /**
59 : * @brief Structure used for set source position
60 : */
61 : struct SegmentData
62 : {
63 : int64_t position;
64 : bool resetTime;
65 : double appliedRate;
66 : uint64_t stopPosition;
67 : };
68 :
69 : struct GenericPlayerContext
70 : {
71 : /**
72 : * @brief The rialto src object.
73 : */
74 : std::shared_ptr<IGstSrc> gstSrc{nullptr};
75 :
76 : /**
77 : * @brief The gstreamer pipeline.
78 : */
79 : GstElement *pipeline{nullptr};
80 :
81 : /**
82 : * @brief The gstreamer source.
83 : */
84 : GstElement *source{nullptr};
85 :
86 : /**
87 : * @brief A map of streams attached to the source.
88 : */
89 : StreamInfoMap streamInfo{};
90 :
91 : /**
92 : * @brief Child sink of the autovideosink.
93 : */
94 : GstElement *autoVideoChildSink{nullptr};
95 :
96 : /**
97 : * @brief Child sink of the autoaudiosink.
98 : */
99 : GstElement *autoAudioChildSink{nullptr};
100 :
101 : /**
102 : * @brief The subtitle sink
103 : */
104 : GstElement *subtitleSink{nullptr};
105 :
106 : /**
107 : * @brief The video sink
108 : */
109 : GstElement *videoSink{nullptr};
110 :
111 : /**
112 : * @brief Flag used to check, if video decoder handle has been set.
113 : */
114 : bool isVideoHandleSet{false};
115 :
116 : /**
117 : * @brief Flag used to check, if BUFFERED notification has been sent.
118 : *
119 : * Flag can be used only in worker thread
120 : */
121 : bool bufferedNotificationSent{false};
122 :
123 : /**
124 : * @brief Flag used to check, if the playback is in the playing state
125 : *
126 : * Flag can be used only in worker thread
127 : */
128 : bool isPlaying{false};
129 :
130 : /**
131 : * @brief Flag used to check, if EOS has been notified to the client
132 : *
133 : * Flag can be used only in worker thread
134 : */
135 : bool eosNotified{false};
136 :
137 : /**
138 : * @brief Pending video geometry
139 : */
140 : Rectangle pendingGeometry;
141 :
142 : /**
143 : * @brief Current playback rate
144 : */
145 : double playbackRate{1.0};
146 :
147 : /**
148 : * @brief Pending playback rate
149 : */
150 : double pendingPlaybackRate{kNoPendingPlaybackRate};
151 :
152 : /**
153 : * @brief Pending immediate output for MediaSourceType::VIDEO
154 : */
155 : std::optional<bool> pendingImmediateOutputForVideo{};
156 :
157 : /**
158 : * @brief Pending low latency
159 : */
160 : std::optional<bool> pendingLowLatency{};
161 :
162 : /**
163 : * @brief Pending sync
164 : */
165 : std::optional<bool> pendingSync{};
166 :
167 : /**
168 : * @brief Pending sync off
169 : */
170 : std::optional<bool> pendingSyncOff{};
171 :
172 : /**
173 : * @brief Pending buffering limit
174 : */
175 : std::optional<uint32_t> pendingBufferingLimit{};
176 :
177 : /**
178 : * @brief Pending use buffering
179 : */
180 : std::optional<bool> pendingUseBuffering{};
181 :
182 : /**
183 : * @brief Pending stream sync mode
184 : */
185 : std::map<MediaSourceType, int32_t> pendingStreamSyncMode{};
186 :
187 : /**
188 : * @brief Pending render frame
189 : */
190 : bool pendingRenderFrame{false};
191 :
192 : /**
193 : * @brief Pending show video window
194 : */
195 : std::optional<bool> pendingShowVideoWindow{};
196 :
197 : /**
198 : * @brief Last audio sample timestamps
199 : * TODO(LLDEV-31012) Needed to detect audio stream underflow
200 : */
201 : int64_t lastAudioSampleTimestamps{0};
202 :
203 : /**
204 : * @brief The decryption service.
205 : */
206 : IDecryptionService *decryptionService{nullptr};
207 :
208 : /**
209 : * @brief Flag used to check, if audio source has been recently removed
210 : *
211 : * Flag can be used only in worker thread
212 : */
213 : bool audioSourceRemoved{false};
214 :
215 : /**
216 : * @brief Audio elements of gst pipeline.
217 : *
218 : * Attribute can be used only in worker thread
219 : */
220 : firebolt::rialto::wrappers::PlaybackGroupPrivate playbackGroup;
221 :
222 : /**
223 : * @brief A map of streams that have ended.
224 : */
225 : std::unordered_map<MediaSourceType, EosState> endOfStreamInfo{};
226 :
227 : /**
228 : * @brief Flag used to check if client already notified server that all sources were attached
229 : *
230 : * Attribute can be used only in worker thread
231 : */
232 : bool wereAllSourcesAttached{false};
233 :
234 : /**
235 : * @brief Flag used to check if FinishSetupSource is finished. It is needed to avoid need data overwriting.
236 : *
237 : * Attribute can be used only in worker thread
238 : */
239 : bool setupSourceFinished{false};
240 :
241 : /**
242 : * @brief Queued source positions. Used by SetSourcePosition task to request pushing new sample.
243 : *
244 : * Attribute can be used only in worker thread
245 : */
246 : std::map<GstElement *, std::vector<SegmentData>> initialPositions;
247 :
248 : /**
249 : * @brief Currently set position of a source. Used to check, if additional segment should be pushed.
250 : *
251 : * Attribute can be used only in worker thread
252 : */
253 : std::map<GstElement *, SegmentData> currentPosition;
254 :
255 : /**
256 : * @brief The mutex, which protects properties, which are read/written by main/worker thread.
257 : * This mutex should be removed in future, when we find out better solution for
258 : * property read-write.
259 : */
260 : std::mutex propertyMutex;
261 :
262 : /**
263 : * @brief Flag used to check if audio fade is enabled
264 : *
265 : * Attribute can be used only in worker thread
266 : */
267 : std::atomic_bool audioFadeEnabled{false};
268 : };
269 : } // namespace firebolt::rialto::server
270 :
271 : #endif // FIREBOLT_RIALTO_SERVER_GENERIC_PLAYER_CONTEXT_H_
|