LCOV - code coverage report
Current view: top level - media/client/main/include - MediaPipeline.h (source / functions) Coverage Total Hit
Test: coverage.info Lines: 100.0 % 2 2
Test Date: 2025-10-07 14:22:52 Functions: 100.0 % 2 2

            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_MEDIA_PIPELINE_H_
      21              : #define FIREBOLT_RIALTO_MEDIA_PIPELINE_H_
      22              : 
      23              : #include "AttachedSources.h"
      24              : #include "IClientController.h"
      25              : #include "IControlClient.h"
      26              : #include "IMediaFrameWriter.h"
      27              : #include "IMediaPipeline.h"
      28              : #include "IMediaPipelineIpc.h"
      29              : #include <atomic>
      30              : #include <condition_variable>
      31              : #include <map>
      32              : #include <memory>
      33              : #include <mutex>
      34              : #include <string>
      35              : #include <vector>
      36              : 
      37              : namespace firebolt::rialto
      38              : {
      39              : /**
      40              :  * @brief IMediaPipeline factory class definition.
      41              :  */
      42              : class MediaPipelineFactory : public IMediaPipelineFactory
      43              : {
      44              : public:
      45            3 :     MediaPipelineFactory() = default;
      46            3 :     ~MediaPipelineFactory() override = default;
      47              : 
      48              :     std::unique_ptr<IMediaPipeline> createMediaPipeline(std::weak_ptr<IMediaPipelineClient> client,
      49              :                                                         const VideoRequirements &videoRequirements) const override;
      50              : 
      51              :     /**
      52              :      * @brief IMediaPipeline factory method with factory parameters for mock injection.
      53              :      *
      54              :      * @param[in] client                  : The Rialto media player client.
      55              :      * @param[in] videoRequirements       : The video decoder requirements for the MediaPipeline session.
      56              :      * @param[in] mediaPipelineIpcFactory : This was added for the test environment where a mock object needs to be passed in.
      57              :      * @param[in] clientController        : This was added for the test environment where a mock object needs to be passed in.
      58              :      *
      59              :      * @retval the new backend instance or null on error.
      60              :      */
      61              :     std::unique_ptr<IMediaPipeline>
      62              :     createMediaPipeline(std::weak_ptr<IMediaPipelineClient> client, const VideoRequirements &videoRequirements,
      63              :                         std::weak_ptr<client::IMediaPipelineIpcFactory> mediaPipelineIpcFactory,
      64              :                         std::weak_ptr<client::IClientController> clientController) const;
      65              : };
      66              : 
      67              : }; // namespace firebolt::rialto
      68              : 
      69              : namespace firebolt::rialto::client
      70              : {
      71              : class IMediaPipelineAndIControlClient : public IMediaPipeline, public IControlClient
      72              : {
      73              : };
      74              : 
      75              : /**
      76              :  * @brief The definition of the MediaPipeline.
      77              :  */
      78              : class MediaPipeline : public IMediaPipelineAndIControlClient, public IMediaPipelineIpcClient
      79              : {
      80              : public:
      81              :     /**
      82              :      * @brief The possible states of the MediaPipeline.
      83              :      */
      84              :     enum class State
      85              :     {
      86              :         IDLE,         /**< The MediaPipeline is idle. */
      87              :         BUFFERING,    /**< The MediaPipeline is buffering data. */
      88              :         PLAYING,      /**< The MediaPipeline is playing. */
      89              :         SEEKING,      /**< The MediaPipeline is seeking position. */
      90              :         FAILURE,      /**< The MediaPipeline is failed. */
      91              :         END_OF_STREAM /**< The MediaPipeline is at the end of stream. */
      92              :     };
      93              : 
      94              :     /**
      95              :      * @brief The constructor.
      96              :      *
      97              :      * @param[in] client                        : The Rialto media player client.
      98              :      * @param[in] videoRequirements             : The video decoder requirements for the MediaPipeline session.
      99              :      * @param[in] mediaPipelineIpcFactory         : The media player ipc factory.
     100              :      * @param[in] mediaFrameWriterFactory       : The media frame writer factory.
     101              :      * @param[in] clientController           : The shared memory manager.
     102              :      */
     103              :     MediaPipeline(std::weak_ptr<IMediaPipelineClient> client, const VideoRequirements &videoRequirements,
     104              :                   const std::shared_ptr<IMediaPipelineIpcFactory> &mediaPipelineIpcFactory,
     105              :                   const std::shared_ptr<common::IMediaFrameWriterFactory> &mediaFrameWriterFactory,
     106              :                   IClientController &clientController);
     107              : 
     108              :     /**
     109              :      * @brief Virtual destructor.
     110              :      */
     111              :     virtual ~MediaPipeline();
     112              : 
     113              :     bool load(MediaType type, const std::string &mimeType, const std::string &url) override;
     114              : 
     115              :     bool attachSource(const std::unique_ptr<IMediaPipeline::MediaSource> &source) override;
     116              : 
     117              :     bool removeSource(int32_t id) override;
     118              : 
     119              :     bool allSourcesAttached() override;
     120              : 
     121              :     bool play() override;
     122              : 
     123              :     bool pause() override;
     124              : 
     125              :     bool stop() override;
     126              : 
     127              :     bool setPlaybackRate(double rate) override;
     128              : 
     129              :     bool setPosition(int64_t position) override;
     130              : 
     131              :     bool getPosition(int64_t &position) override;
     132              : 
     133              :     bool setImmediateOutput(int32_t sourceId, bool immediateOutput) override;
     134              : 
     135              :     bool getImmediateOutput(int32_t sourceId, bool &immediateOutput) override;
     136              : 
     137              :     bool getStats(int32_t sourceId, uint64_t &renderedFrames, uint64_t &droppedFrames) override;
     138              :     bool setVideoWindow(uint32_t x, uint32_t y, uint32_t width, uint32_t height) override;
     139              : 
     140              :     bool haveData(MediaSourceStatus status, uint32_t needDataRequestId) override;
     141              : 
     142              :     AddSegmentStatus addSegment(uint32_t needDataRequestId, const std::unique_ptr<MediaSegment> &mediaSegment) override;
     143              : 
     144              :     std::weak_ptr<IMediaPipelineClient> getClient() override;
     145              : 
     146              :     void notifyPlaybackState(PlaybackState state) override;
     147              : 
     148              :     void notifyPosition(int64_t position) override;
     149              : 
     150              :     void notifyNetworkState(NetworkState state) override;
     151              : 
     152              :     void notifyNeedMediaData(int32_t sourceId, size_t frameCount, uint32_t requestId,
     153              :                              const std::shared_ptr<MediaPlayerShmInfo> &shmInfo) override;
     154              : 
     155              :     void notifyQos(int32_t sourceId, const QosInfo &qosInfo) override;
     156              : 
     157              :     void notifyBufferUnderflow(int32_t sourceId) override;
     158              : 
     159              :     void notifyPlaybackError(int32_t sourceId, PlaybackError error) override;
     160              : 
     161              :     void notifySourceFlushed(int32_t sourceId) override;
     162              : 
     163              :     bool renderFrame() override;
     164              : 
     165              :     bool setVolume(double targetVolume, uint32_t volumeDuration, EaseType easeType) override;
     166              : 
     167              :     bool getVolume(double &currentVolume) override;
     168              : 
     169              :     bool setMute(int32_t sourceId, bool mute) override;
     170              : 
     171              :     bool getMute(int32_t sourceId, bool &mute) override;
     172              : 
     173              :     bool setTextTrackIdentifier(const std::string &textTrackIdentifier) override;
     174              : 
     175              :     bool getTextTrackIdentifier(std::string &textTrackIdentifier) override;
     176              : 
     177              :     bool setLowLatency(bool lowLatency) override;
     178              : 
     179              :     bool setSync(bool sync) override;
     180              : 
     181              :     bool getSync(bool &sync) override;
     182              : 
     183              :     bool setSyncOff(bool syncOff) override;
     184              : 
     185              :     bool setStreamSyncMode(int32_t sourceId, int32_t streamSyncMode) override;
     186              : 
     187              :     bool getStreamSyncMode(int32_t &streamSyncMode) override;
     188              : 
     189              :     bool flush(int32_t sourceId, bool resetTime, bool &async) override;
     190              : 
     191              :     bool setSourcePosition(int32_t sourceId, int64_t position, bool resetTime, double appliedRate,
     192              :                            uint64_t stopPosition) override;
     193              : 
     194              :     bool setSubtitleOffset(int32_t sourceId, int64_t position) override;
     195              : 
     196              :     bool processAudioGap(int64_t position, uint32_t duration, int64_t discontinuityGap, bool audioAac) override;
     197              : 
     198              :     bool setBufferingLimit(uint32_t limitBufferingMs) override;
     199              : 
     200              :     bool getBufferingLimit(uint32_t &limitBufferingMs) override;
     201              : 
     202              :     bool setUseBuffering(bool useBuffering) override;
     203              : 
     204              :     bool getUseBuffering(bool &useBuffering) override;
     205              : 
     206              :     bool switchSource(const std::unique_ptr<MediaSource> &source) override;
     207              : 
     208              :     void notifyApplicationState(ApplicationState state) override;
     209              : 
     210              : protected:
     211              :     /**
     212              :      * @brief The need data request data.
     213              :      */
     214              :     struct NeedDataRequest
     215              :     {
     216              :         int32_t sourceId;                                       /**< The source id. */
     217              :         std::shared_ptr<MediaPlayerShmInfo> shmInfo;            /**< The shared memory information. */
     218              :         std::unique_ptr<common::IMediaFrameWriter> frameWriter; /**< The frame writer used to add segments. */
     219              :     };
     220              : 
     221              :     /**
     222              :      * @brief The media player client.
     223              :      */
     224              :     std::weak_ptr<IMediaPipelineClient> m_mediaPipelineClient;
     225              : 
     226              :     /**
     227              :      * @brief The media player ipc object.
     228              :      */
     229              :     std::unique_ptr<IMediaPipelineIpc> m_mediaPipelineIpc;
     230              : 
     231              :     /**
     232              :      * @brief The rialto shared memory manager object.
     233              :      */
     234              :     IClientController &m_clientController;
     235              : 
     236              :     /**
     237              :      * @brief The Need data request map.
     238              :      * Key: requestId
     239              :      * Value: NeedDataRequest
     240              :      */
     241              :     std::map<uint32_t, std::shared_ptr<NeedDataRequest>> m_needDataRequestMap;
     242              : 
     243              :     /**
     244              :      * @brief The current application state. Protected by m_needDataRequestMapMutex
     245              :      */
     246              :     ApplicationState m_currentAppState;
     247              : 
     248              :     /**
     249              :      * @brief The need data request map mutex.
     250              :      */
     251              :     std::mutex m_needDataRequestMapMutex;
     252              : 
     253              :     /**
     254              :      * @brief The media frame writer factory.
     255              :      */
     256              :     std::shared_ptr<common::IMediaFrameWriterFactory> m_mediaFrameWriterFactory;
     257              : 
     258              :     /**
     259              :      * @brief The shared memory mutex.
     260              :      */
     261              :     std::mutex m_shmMutex;
     262              : 
     263              :     /**
     264              :      * @brief The current state of the MediaPipeline.
     265              :      */
     266              :     std::atomic<State> m_currentState;
     267              : 
     268              :     /**
     269              :      * @brief The flush request mutex.
     270              :      */
     271              :     std::mutex m_flushMutex;
     272              : 
     273              :     /**
     274              :      * @brief The attach source mutex.
     275              :      */
     276              :     std::mutex m_attachSourceMutex;
     277              : 
     278              :     /**
     279              :      * @brief The attach source condition variable.
     280              :      */
     281              :     std::condition_variable m_attachSourceCond;
     282              : 
     283              :     /**
     284              :      * @brief Whether attachSource is currently in progress.
     285              :      */
     286              :     bool m_attachingSource;
     287              : 
     288              :     /**
     289              :      * @brief The container with attached source id <-> MediaSourceType mapping
     290              :      */
     291              :     AttachedSources m_attachedSources;
     292              : 
     293              :     /**
     294              :      * @brief Sets the new internal MediaPipeline state based on the NetworkState.
     295              :      *
     296              :      * @param[in] state : The new NeworkState.
     297              :      */
     298              :     void updateState(NetworkState state);
     299              : 
     300              :     /**
     301              :      * @brief Sets the new internal MediaPipeline state based on the PlaybackState.
     302              :      *
     303              :      * @param[in] state : The new PlaybackState.
     304              :      */
     305              :     void updateState(PlaybackState state);
     306              : 
     307              :     /**
     308              :      * @brief Handles a have data request.
     309              :      *
     310              :      * @param[in] status  : The status
     311              :      * @param[in] needDataRequestId : Need data request id
     312              :      *
     313              :      * @retval true on success.
     314              :      */
     315              :     bool handleHaveData(MediaSourceStatus status, uint32_t needDataRequestId);
     316              : 
     317              :     /**
     318              :      * @brief Handles a set position request.
     319              :      *
     320              :      * @param[in] position : The playback position in nanoseconds.
     321              :      *
     322              :      * @retval true on success.
     323              :      */
     324              :     bool handleSetPosition(int64_t position);
     325              : 
     326              :     /**
     327              :      * @brief Discards the need data request with id.
     328              :      *
     329              :      * @param[in] needDataRequestId : Need data request id
     330              :      */
     331              :     void discardNeedDataRequest(uint32_t needDataRequestId);
     332              : };
     333              : 
     334              : }; // namespace firebolt::rialto::client
     335              : 
     336              : #endif // FIREBOLT_RIALTO_MEDIA_PIPELINE_H_
        

Generated by: LCOV version 2.0-1