LCOV - code coverage report
Current view: top level - media/server/gstplayer/include - GenericPlayerContext.h (source / functions) Coverage Total Hit
Test: coverage.info Lines: 100.0 % 4 4
Test Date: 2026-05-08 12:58:51 Functions: 100.0 % 4 4

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

Generated by: LCOV version 2.0-1