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-02-18 13:13:53 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) override;
     190              : 
     191              :     bool setSourcePosition(int32_t sourceId, int64_t position, bool resetTime, double appliedRate,
     192              :                            uint64_t stopPosition) override;
     193              : 
     194              :     bool processAudioGap(int64_t position, uint32_t duration, int64_t discontinuityGap, bool audioAac) override;
     195              : 
     196              :     bool setBufferingLimit(uint32_t limitBufferingMs) override;
     197              : 
     198              :     bool getBufferingLimit(uint32_t &limitBufferingMs) override;
     199              : 
     200              :     bool setUseBuffering(bool useBuffering) override;
     201              : 
     202              :     bool getUseBuffering(bool &useBuffering) override;
     203              : 
     204              :     bool switchSource(const std::unique_ptr<MediaSource> &source) override;
     205              : 
     206              :     void notifyApplicationState(ApplicationState state) override;
     207              : 
     208              : protected:
     209              :     /**
     210              :      * @brief The need data request data.
     211              :      */
     212              :     struct NeedDataRequest
     213              :     {
     214              :         int32_t sourceId;                                       /**< The source id. */
     215              :         std::shared_ptr<MediaPlayerShmInfo> shmInfo;            /**< The shared memory information. */
     216              :         std::unique_ptr<common::IMediaFrameWriter> frameWriter; /**< The frame writer used to add segments. */
     217              :     };
     218              : 
     219              :     /**
     220              :      * @brief The media player client.
     221              :      */
     222              :     std::weak_ptr<IMediaPipelineClient> m_mediaPipelineClient;
     223              : 
     224              :     /**
     225              :      * @brief The media player ipc object.
     226              :      */
     227              :     std::unique_ptr<IMediaPipelineIpc> m_mediaPipelineIpc;
     228              : 
     229              :     /**
     230              :      * @brief The rialto shared memory manager object.
     231              :      */
     232              :     IClientController &m_clientController;
     233              : 
     234              :     /**
     235              :      * @brief The Need data request map.
     236              :      * Key: requestId
     237              :      * Value: NeedDataRequest
     238              :      */
     239              :     std::map<uint32_t, std::shared_ptr<NeedDataRequest>> m_needDataRequestMap;
     240              : 
     241              :     /**
     242              :      * @brief The current application state. Protected by m_needDataRequestMapMutex
     243              :      */
     244              :     ApplicationState m_currentAppState;
     245              : 
     246              :     /**
     247              :      * @brief The need data request map mutex.
     248              :      */
     249              :     std::mutex m_needDataRequestMapMutex;
     250              : 
     251              :     /**
     252              :      * @brief The media frame writer factory.
     253              :      */
     254              :     std::shared_ptr<common::IMediaFrameWriterFactory> m_mediaFrameWriterFactory;
     255              : 
     256              :     /**
     257              :      * @brief The shared memory mutex.
     258              :      */
     259              :     std::mutex m_shmMutex;
     260              : 
     261              :     /**
     262              :      * @brief The current state of the MediaPipeline.
     263              :      */
     264              :     std::atomic<State> m_currentState;
     265              : 
     266              :     /**
     267              :      * @brief The flush request mutex.
     268              :      */
     269              :     std::mutex m_flushMutex;
     270              : 
     271              :     /**
     272              :      * @brief The attach source mutex.
     273              :      */
     274              :     std::mutex m_attachSourceMutex;
     275              : 
     276              :     /**
     277              :      * @brief The attach source condition variable.
     278              :      */
     279              :     std::condition_variable m_attachSourceCond;
     280              : 
     281              :     /**
     282              :      * @brief Whether attachSource is currently in progress.
     283              :      */
     284              :     bool m_attachingSource;
     285              : 
     286              :     /**
     287              :      * @brief The container with attached source id <-> MediaSourceType mapping
     288              :      */
     289              :     AttachedSources m_attachedSources;
     290              : 
     291              :     /**
     292              :      * @brief Sets the new internal MediaPipeline state based on the NetworkState.
     293              :      *
     294              :      * @param[in] state : The new NeworkState.
     295              :      */
     296              :     void updateState(NetworkState state);
     297              : 
     298              :     /**
     299              :      * @brief Sets the new internal MediaPipeline state based on the PlaybackState.
     300              :      *
     301              :      * @param[in] state : The new PlaybackState.
     302              :      */
     303              :     void updateState(PlaybackState state);
     304              : 
     305              :     /**
     306              :      * @brief Handles a have data request.
     307              :      *
     308              :      * @param[in] status  : The status
     309              :      * @param[in] needDataRequestId : Need data request id
     310              :      *
     311              :      * @retval true on success.
     312              :      */
     313              :     bool handleHaveData(MediaSourceStatus status, uint32_t needDataRequestId);
     314              : 
     315              :     /**
     316              :      * @brief Handles a set position request.
     317              :      *
     318              :      * @param[in] position : The playback position in nanoseconds.
     319              :      *
     320              :      * @retval true on success.
     321              :      */
     322              :     bool handleSetPosition(int64_t position);
     323              : 
     324              :     /**
     325              :      * @brief Discards the need data request with id.
     326              :      *
     327              :      * @param[in] needDataRequestId : Need data request id
     328              :      */
     329              :     void discardNeedDataRequest(uint32_t needDataRequestId);
     330              : };
     331              : 
     332              : }; // namespace firebolt::rialto::client
     333              : 
     334              : #endif // FIREBOLT_RIALTO_MEDIA_PIPELINE_H_
        

Generated by: LCOV version 2.0-1