LCOV - code coverage report
Current view: top level - media/server/service/source - MediaPipelineService.cpp (source / functions) Coverage Total Hit
Test: coverage.info Lines: 100.0 % 387 387
Test Date: 2025-02-18 13:13:53 Functions: 100.0 % 45 45

            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              : #include "MediaPipelineService.h"
      21              : #include "IMediaPipelineServerInternal.h"
      22              : #include "RialtoServerLogging.h"
      23              : #include <exception>
      24              : #include <future>
      25              : #include <string>
      26              : #include <utility>
      27              : #include <vector>
      28              : 
      29              : namespace firebolt::rialto::server::service
      30              : {
      31          127 : MediaPipelineService::MediaPipelineService(
      32              :     IPlaybackService &playbackService, std::shared_ptr<IMediaPipelineServerInternalFactory> &&mediaPipelineFactory,
      33              :     std::shared_ptr<IMediaPipelineCapabilitiesFactory> &&mediaPipelineCapabilitiesFactory,
      34          127 :     IDecryptionService &decryptionService)
      35          127 :     : m_playbackService{playbackService}, m_mediaPipelineFactory{mediaPipelineFactory},
      36          127 :       m_mediaPipelineCapabilities{mediaPipelineCapabilitiesFactory->createMediaPipelineCapabilities()},
      37          254 :       m_decryptionService{decryptionService}
      38              : {
      39          127 :     if (!m_mediaPipelineCapabilities)
      40              :     {
      41            1 :         throw std::runtime_error("Could not create Media Pipeline Capabilities");
      42              :     }
      43              : 
      44          126 :     RIALTO_SERVER_LOG_DEBUG("MediaPipelineService is constructed");
      45          130 : }
      46              : 
      47          252 : MediaPipelineService::~MediaPipelineService()
      48              : {
      49          126 :     RIALTO_SERVER_LOG_DEBUG("MediaPipelineService is destructed");
      50          252 : }
      51              : 
      52            1 : void MediaPipelineService::clearMediaPipelines()
      53              : {
      54            1 :     std::lock_guard<std::mutex> lock{m_mediaPipelineMutex};
      55            1 :     m_mediaPipelines.clear();
      56              : }
      57              : 
      58           81 : bool MediaPipelineService::createSession(int sessionId, const std::shared_ptr<IMediaPipelineClient> &mediaPipelineClient,
      59              :                                          std::uint32_t maxWidth, std::uint32_t maxHeight)
      60              : {
      61           81 :     RIALTO_SERVER_LOG_DEBUG("MediaPipelineService requested to create new session with id: %d", sessionId);
      62           81 :     if (!m_playbackService.isActive())
      63              :     {
      64            1 :         RIALTO_SERVER_LOG_ERROR("Skip to create session with id: %d - Session Server in Inactive state", sessionId);
      65            1 :         return false;
      66              :     }
      67              : 
      68              :     {
      69           80 :         std::lock_guard<std::mutex> lock{m_mediaPipelineMutex};
      70           80 :         if (m_mediaPipelines.size() == static_cast<size_t>(m_playbackService.getMaxPlaybacks()))
      71              :         {
      72            1 :             RIALTO_SERVER_LOG_ERROR("Unable to create a session with id: %d. Max session number reached.", sessionId);
      73            1 :             return false;
      74              :         }
      75           79 :         if (m_mediaPipelines.find(sessionId) != m_mediaPipelines.end())
      76              :         {
      77            1 :             RIALTO_SERVER_LOG_ERROR("Session with id: %d already exists", sessionId);
      78            1 :             return false;
      79              :         }
      80           78 :         auto shmBuffer = m_playbackService.getShmBuffer();
      81           78 :         m_mediaPipelines.emplace(
      82          156 :             std::make_pair(sessionId,
      83          234 :                            m_mediaPipelineFactory->createMediaPipelineServerInternal(mediaPipelineClient,
      84           78 :                                                                                      VideoRequirements{maxWidth, maxHeight},
      85              :                                                                                      sessionId, shmBuffer,
      86              :                                                                                      m_decryptionService)));
      87           78 :         if (!m_mediaPipelines.at(sessionId))
      88              :         {
      89            1 :             RIALTO_SERVER_LOG_ERROR("Could not create MediaPipeline for session with id: %d", sessionId);
      90            1 :             m_mediaPipelines.erase(sessionId);
      91            1 :             return false;
      92              :         }
      93           81 :     }
      94              : 
      95           77 :     RIALTO_SERVER_LOG_INFO("New session with id: %d created", sessionId);
      96           77 :     return true;
      97              : }
      98              : 
      99            3 : bool MediaPipelineService::destroySession(int sessionId)
     100              : {
     101            3 :     RIALTO_SERVER_LOG_DEBUG("MediaPipelineService requested to destroy session with id: %d", sessionId);
     102              :     {
     103            3 :         std::lock_guard<std::mutex> lock{m_mediaPipelineMutex};
     104            3 :         auto mediaPipelineIter = m_mediaPipelines.find(sessionId);
     105            3 :         if (mediaPipelineIter == m_mediaPipelines.end())
     106              :         {
     107            2 :             RIALTO_SERVER_LOG_ERROR("Session with id: %d does not exists", sessionId);
     108            2 :             return false;
     109              :         }
     110            1 :         m_mediaPipelines.erase(mediaPipelineIter);
     111            3 :     }
     112            1 :     RIALTO_SERVER_LOG_INFO("Session with id: %d destroyed", sessionId);
     113            1 :     return true;
     114              : }
     115              : 
     116            3 : bool MediaPipelineService::load(int sessionId, MediaType type, const std::string &mimeType, const std::string &url)
     117              : {
     118            3 :     RIALTO_SERVER_LOG_INFO("MediaPipelineService requested to load session with id: %d", sessionId);
     119              : 
     120            3 :     std::lock_guard<std::mutex> lock{m_mediaPipelineMutex};
     121            3 :     auto mediaPipelineIter = m_mediaPipelines.find(sessionId);
     122            3 :     if (mediaPipelineIter == m_mediaPipelines.end())
     123              :     {
     124            1 :         RIALTO_SERVER_LOG_ERROR("Session with id: %d does not exists", sessionId);
     125            1 :         return false;
     126              :     }
     127            2 :     return mediaPipelineIter->second->load(type, mimeType, url);
     128            3 : }
     129              : 
     130            3 : bool MediaPipelineService::attachSource(int sessionId, const std::unique_ptr<IMediaPipeline::MediaSource> &source)
     131              : {
     132            3 :     RIALTO_SERVER_LOG_INFO("MediaPipelineService requested to attach source, session id: %d", sessionId);
     133              : 
     134            3 :     std::lock_guard<std::mutex> lock{m_mediaPipelineMutex};
     135            3 :     auto mediaPipelineIter = m_mediaPipelines.find(sessionId);
     136            3 :     if (mediaPipelineIter == m_mediaPipelines.end())
     137              :     {
     138            1 :         RIALTO_SERVER_LOG_ERROR("Session with id: %d does not exists", sessionId);
     139            1 :         return false;
     140              :     }
     141            2 :     return mediaPipelineIter->second->attachSource(source);
     142            3 : }
     143              : 
     144            3 : bool MediaPipelineService::removeSource(int sessionId, std::int32_t sourceId)
     145              : {
     146            3 :     RIALTO_SERVER_LOG_INFO("MediaPipelineService requested to remove source, session id: %d", sessionId);
     147              : 
     148            3 :     std::lock_guard<std::mutex> lock{m_mediaPipelineMutex};
     149            3 :     auto mediaPipelineIter = m_mediaPipelines.find(sessionId);
     150            3 :     if (mediaPipelineIter == m_mediaPipelines.end())
     151              :     {
     152            1 :         RIALTO_SERVER_LOG_ERROR("Session with id: %d does not exists", sessionId);
     153            1 :         return false;
     154              :     }
     155            2 :     return mediaPipelineIter->second->removeSource(sourceId);
     156            3 : }
     157              : 
     158            3 : bool MediaPipelineService::allSourcesAttached(int sessionId)
     159              : {
     160            3 :     RIALTO_SERVER_LOG_INFO("MediaPipelineService notified that all sources were attached, session id: %d", sessionId);
     161              : 
     162            3 :     std::lock_guard<std::mutex> lock{m_mediaPipelineMutex};
     163            3 :     auto mediaPipelineIter = m_mediaPipelines.find(sessionId);
     164            3 :     if (mediaPipelineIter == m_mediaPipelines.end())
     165              :     {
     166            1 :         RIALTO_SERVER_LOG_ERROR("Session with id: %d does not exists", sessionId);
     167            1 :         return false;
     168              :     }
     169            2 :     return mediaPipelineIter->second->allSourcesAttached();
     170            3 : }
     171              : 
     172            3 : bool MediaPipelineService::play(int sessionId)
     173              : {
     174            3 :     RIALTO_SERVER_LOG_INFO("MediaPipelineService requested to play, session id: %d", sessionId);
     175              : 
     176            3 :     std::lock_guard<std::mutex> lock{m_mediaPipelineMutex};
     177            3 :     auto mediaPipelineIter = m_mediaPipelines.find(sessionId);
     178            3 :     if (mediaPipelineIter == m_mediaPipelines.end())
     179              :     {
     180            1 :         RIALTO_SERVER_LOG_ERROR("Session with id: %d does not exists", sessionId);
     181            1 :         return false;
     182              :     }
     183            2 :     return mediaPipelineIter->second->play();
     184            3 : }
     185              : 
     186            3 : bool MediaPipelineService::pause(int sessionId)
     187              : {
     188            3 :     RIALTO_SERVER_LOG_INFO("MediaPipelineService requested to pause, session id: %d", sessionId);
     189              : 
     190            3 :     std::lock_guard<std::mutex> lock{m_mediaPipelineMutex};
     191            3 :     auto mediaPipelineIter = m_mediaPipelines.find(sessionId);
     192            3 :     if (mediaPipelineIter == m_mediaPipelines.end())
     193              :     {
     194            1 :         RIALTO_SERVER_LOG_ERROR("Session with id: %d does not exists", sessionId);
     195            1 :         return false;
     196              :     }
     197            2 :     return mediaPipelineIter->second->pause();
     198            3 : }
     199              : 
     200            3 : bool MediaPipelineService::stop(int sessionId)
     201              : {
     202            3 :     RIALTO_SERVER_LOG_INFO("MediaPipelineService requested to stop, session id: %d", sessionId);
     203              : 
     204            3 :     std::lock_guard<std::mutex> lock{m_mediaPipelineMutex};
     205            3 :     auto mediaPipelineIter = m_mediaPipelines.find(sessionId);
     206            3 :     if (mediaPipelineIter == m_mediaPipelines.end())
     207              :     {
     208            1 :         RIALTO_SERVER_LOG_ERROR("Session with id: %d does not exists", sessionId);
     209            1 :         return false;
     210              :     }
     211            2 :     return mediaPipelineIter->second->stop();
     212            3 : }
     213              : 
     214            3 : bool MediaPipelineService::setPlaybackRate(int sessionId, double rate)
     215              : {
     216            3 :     RIALTO_SERVER_LOG_INFO("MediaPipelineService requested to set playback rate, session id: %d", sessionId);
     217              : 
     218            3 :     std::lock_guard<std::mutex> lock{m_mediaPipelineMutex};
     219            3 :     auto mediaPipelineIter = m_mediaPipelines.find(sessionId);
     220            3 :     if (mediaPipelineIter == m_mediaPipelines.end())
     221              :     {
     222            1 :         RIALTO_SERVER_LOG_ERROR("Session with id: %d does not exists", sessionId);
     223            1 :         return false;
     224              :     }
     225            2 :     return mediaPipelineIter->second->setPlaybackRate(rate);
     226            3 : }
     227              : 
     228            3 : bool MediaPipelineService::setPosition(int sessionId, std::int64_t position)
     229              : {
     230            3 :     RIALTO_SERVER_LOG_INFO("MediaPipelineService requested to set position, session id: %d", sessionId);
     231              : 
     232            3 :     std::lock_guard<std::mutex> lock{m_mediaPipelineMutex};
     233            3 :     auto mediaPipelineIter = m_mediaPipelines.find(sessionId);
     234            3 :     if (mediaPipelineIter == m_mediaPipelines.end())
     235              :     {
     236            1 :         RIALTO_SERVER_LOG_ERROR("Session with id: %d does not exists", sessionId);
     237            1 :         return false;
     238              :     }
     239            2 :     return mediaPipelineIter->second->setPosition(position);
     240            3 : }
     241              : 
     242            3 : bool MediaPipelineService::getPosition(int sessionId, std::int64_t &position)
     243              : {
     244            3 :     RIALTO_SERVER_LOG_INFO("MediaPipelineService requested to get position, session id: %d", sessionId);
     245              : 
     246            3 :     std::lock_guard<std::mutex> lock{m_mediaPipelineMutex};
     247            3 :     auto mediaPipelineIter = m_mediaPipelines.find(sessionId);
     248            3 :     if (mediaPipelineIter == m_mediaPipelines.end())
     249              :     {
     250            1 :         RIALTO_SERVER_LOG_ERROR("Session with id: %d does not exists", sessionId);
     251            1 :         return false;
     252              :     }
     253            2 :     return mediaPipelineIter->second->getPosition(position);
     254            3 : }
     255              : 
     256            3 : bool MediaPipelineService::setImmediateOutput(int sessionId, int32_t sourceId, bool immediateOutput)
     257              : {
     258            3 :     RIALTO_SERVER_LOG_INFO("MediaPipelineService requested to setImmediateOutput, session id: %d", sessionId);
     259              : 
     260            3 :     std::lock_guard<std::mutex> lock{m_mediaPipelineMutex};
     261            3 :     auto mediaPipelineIter = m_mediaPipelines.find(sessionId);
     262            3 :     if (mediaPipelineIter == m_mediaPipelines.end())
     263              :     {
     264            1 :         RIALTO_SERVER_LOG_ERROR("Session with id: %d does not exists", sessionId);
     265            1 :         return false;
     266              :     }
     267            2 :     return mediaPipelineIter->second->setImmediateOutput(sourceId, immediateOutput);
     268            3 : }
     269              : 
     270            3 : bool MediaPipelineService::getImmediateOutput(int sessionId, int32_t sourceId, bool &immediateOutput)
     271              : {
     272            3 :     RIALTO_SERVER_LOG_INFO("MediaPipelineService requested to getImmediateOutput, session id: %d", sessionId);
     273              : 
     274            3 :     std::lock_guard<std::mutex> lock{m_mediaPipelineMutex};
     275            3 :     auto mediaPipelineIter = m_mediaPipelines.find(sessionId);
     276            3 :     if (mediaPipelineIter == m_mediaPipelines.end())
     277              :     {
     278            1 :         RIALTO_SERVER_LOG_ERROR("Session with id: %d does not exists", sessionId);
     279            1 :         return false;
     280              :     }
     281            2 :     return mediaPipelineIter->second->getImmediateOutput(sourceId, immediateOutput);
     282            3 : }
     283              : 
     284            3 : bool MediaPipelineService::getStats(int sessionId, int32_t sourceId, uint64_t &renderedFrames, uint64_t &droppedFrames)
     285              : {
     286            3 :     RIALTO_SERVER_LOG_INFO("MediaPipelineService requested to get stats, session id: %d", sessionId);
     287              : 
     288            3 :     std::lock_guard<std::mutex> lock{m_mediaPipelineMutex};
     289            3 :     auto mediaPipelineIter = m_mediaPipelines.find(sessionId);
     290            3 :     if (mediaPipelineIter == m_mediaPipelines.end())
     291              :     {
     292            1 :         RIALTO_SERVER_LOG_ERROR("Session with id: %d does not exists", sessionId);
     293            1 :         return false;
     294              :     }
     295            2 :     return mediaPipelineIter->second->getStats(sourceId, renderedFrames, droppedFrames);
     296            3 : }
     297              : 
     298            3 : bool MediaPipelineService::setVideoWindow(int sessionId, std::uint32_t x, std::uint32_t y, std::uint32_t width,
     299              :                                           std::uint32_t height)
     300              : {
     301            3 :     RIALTO_SERVER_LOG_INFO("MediaPipelineService requested to set video window, session id: %d", sessionId);
     302              : 
     303            3 :     std::lock_guard<std::mutex> lock{m_mediaPipelineMutex};
     304            3 :     auto mediaPipelineIter = m_mediaPipelines.find(sessionId);
     305            3 :     if (mediaPipelineIter == m_mediaPipelines.end())
     306              :     {
     307            1 :         RIALTO_SERVER_LOG_ERROR("Session with id: %d does not exists", sessionId);
     308            1 :         return false;
     309              :     }
     310            2 :     return mediaPipelineIter->second->setVideoWindow(x, y, width, height);
     311            3 : }
     312              : 
     313            3 : bool MediaPipelineService::haveData(int sessionId, MediaSourceStatus status, std::uint32_t numFrames,
     314              :                                     std::uint32_t needDataRequestId)
     315              : {
     316            3 :     RIALTO_SERVER_LOG_DEBUG("New data available, session id: %d", sessionId);
     317              : 
     318            3 :     std::lock_guard<std::mutex> lock{m_mediaPipelineMutex};
     319            3 :     auto mediaPipelineIter = m_mediaPipelines.find(sessionId);
     320            3 :     if (mediaPipelineIter == m_mediaPipelines.end())
     321              :     {
     322            1 :         RIALTO_SERVER_LOG_ERROR("Session with id: %d does not exists", sessionId);
     323            1 :         return false;
     324              :     }
     325            2 :     return mediaPipelineIter->second->haveData(status, numFrames, needDataRequestId);
     326            3 : }
     327              : 
     328            3 : bool MediaPipelineService::renderFrame(int sessionId)
     329              : {
     330            3 :     RIALTO_SERVER_LOG_DEBUG("Render frame requested, session id: %d", sessionId);
     331              : 
     332            3 :     std::lock_guard<std::mutex> lock{m_mediaPipelineMutex};
     333            3 :     auto mediaPipelineIter = m_mediaPipelines.find(sessionId);
     334            3 :     if (mediaPipelineIter == m_mediaPipelines.end())
     335              :     {
     336            1 :         RIALTO_SERVER_LOG_ERROR("Session with id: %d does not exists", sessionId);
     337            1 :         return false;
     338              :     }
     339            2 :     return mediaPipelineIter->second->renderFrame();
     340            3 : }
     341            3 : bool MediaPipelineService::setVolume(int sessionId, double targetVolume, uint32_t volumeDuration, EaseType easeType)
     342              : {
     343            3 :     RIALTO_SERVER_LOG_DEBUG("Set volume requested, session id: %d", sessionId);
     344              : 
     345            3 :     std::lock_guard<std::mutex> lock{m_mediaPipelineMutex};
     346            3 :     auto mediaPipelineIter = m_mediaPipelines.find(sessionId);
     347            3 :     if (mediaPipelineIter == m_mediaPipelines.end())
     348              :     {
     349            1 :         RIALTO_SERVER_LOG_ERROR("Session with id: %d does not exists", sessionId);
     350            1 :         return false;
     351              :     }
     352            2 :     return mediaPipelineIter->second->setVolume(targetVolume, volumeDuration, easeType);
     353            3 : }
     354              : 
     355            3 : bool MediaPipelineService::getVolume(int sessionId, double &volume)
     356              : {
     357            3 :     RIALTO_SERVER_LOG_DEBUG("Get volume requested, session id: %d", sessionId);
     358              : 
     359            3 :     std::lock_guard<std::mutex> lock{m_mediaPipelineMutex};
     360            3 :     auto mediaPipelineIter = m_mediaPipelines.find(sessionId);
     361            3 :     if (mediaPipelineIter == m_mediaPipelines.end())
     362              :     {
     363            1 :         RIALTO_SERVER_LOG_ERROR("Session with id: %d does not exists", sessionId);
     364            1 :         return false;
     365              :     }
     366            2 :     return mediaPipelineIter->second->getVolume(volume);
     367            3 : }
     368              : 
     369            3 : bool MediaPipelineService::setMute(int sessionId, std::int32_t sourceId, bool mute)
     370              : {
     371            3 :     RIALTO_SERVER_LOG_DEBUG("Set mute requested, session id: %d", sessionId);
     372              : 
     373            3 :     std::lock_guard<std::mutex> lock{m_mediaPipelineMutex};
     374            3 :     auto mediaPipelineIter = m_mediaPipelines.find(sessionId);
     375            3 :     if (mediaPipelineIter == m_mediaPipelines.end())
     376              :     {
     377            1 :         RIALTO_SERVER_LOG_ERROR("Session with id: %d does not exist", sessionId);
     378            1 :         return false;
     379              :     }
     380            2 :     return mediaPipelineIter->second->setMute(sourceId, mute);
     381            3 : }
     382              : 
     383            3 : bool MediaPipelineService::getMute(int sessionId, std::int32_t sourceId, bool &mute)
     384              : {
     385            3 :     RIALTO_SERVER_LOG_DEBUG("Get mute requested, session id: %d", sessionId);
     386              : 
     387            3 :     std::lock_guard<std::mutex> lock{m_mediaPipelineMutex};
     388            3 :     auto mediaPipelineIter = m_mediaPipelines.find(sessionId);
     389            3 :     if (mediaPipelineIter == m_mediaPipelines.end())
     390              :     {
     391            1 :         RIALTO_SERVER_LOG_ERROR("Session with id: %d does not exist", sessionId);
     392            1 :         return false;
     393              :     }
     394            2 :     return mediaPipelineIter->second->getMute(sourceId, mute);
     395            3 : }
     396              : 
     397            3 : bool MediaPipelineService::setTextTrackIdentifier(int sessionId, const std::string &textTrackIdentifier)
     398              : {
     399            3 :     RIALTO_SERVER_LOG_DEBUG("Set text track identifier requested, session id: %d", sessionId);
     400              : 
     401            3 :     std::lock_guard<std::mutex> lock{m_mediaPipelineMutex};
     402            3 :     auto mediaPipelineIter = m_mediaPipelines.find(sessionId);
     403            3 :     if (mediaPipelineIter == m_mediaPipelines.end())
     404              :     {
     405            1 :         RIALTO_SERVER_LOG_ERROR("Session with id: %d does not exist", sessionId);
     406            1 :         return false;
     407              :     }
     408            2 :     return mediaPipelineIter->second->setTextTrackIdentifier(textTrackIdentifier);
     409            3 : }
     410              : 
     411            3 : bool MediaPipelineService::getTextTrackIdentifier(int sessionId, std::string &textTrackIdentifier)
     412              : {
     413            3 :     RIALTO_SERVER_LOG_DEBUG("Get text track identifier requested, session id: %d", sessionId);
     414              : 
     415            3 :     std::lock_guard<std::mutex> lock{m_mediaPipelineMutex};
     416            3 :     auto mediaPipelineIter = m_mediaPipelines.find(sessionId);
     417            3 :     if (mediaPipelineIter == m_mediaPipelines.end())
     418              :     {
     419            1 :         RIALTO_SERVER_LOG_ERROR("Session with id: %d does not exist", sessionId);
     420            1 :         return false;
     421              :     }
     422            2 :     return mediaPipelineIter->second->getTextTrackIdentifier(textTrackIdentifier);
     423            3 : }
     424              : 
     425            3 : bool MediaPipelineService::setLowLatency(int sessionId, bool lowLatency)
     426              : {
     427            3 :     RIALTO_SERVER_LOG_DEBUG("Set low latency requested, session id: %d", sessionId);
     428              : 
     429            3 :     std::lock_guard<std::mutex> lock{m_mediaPipelineMutex};
     430            3 :     auto mediaPipelineIter = m_mediaPipelines.find(sessionId);
     431            3 :     if (mediaPipelineIter == m_mediaPipelines.end())
     432              :     {
     433            1 :         RIALTO_SERVER_LOG_ERROR("Session with id: %d does not exist", sessionId);
     434            1 :         return false;
     435              :     }
     436            2 :     return mediaPipelineIter->second->setLowLatency(lowLatency);
     437            3 : }
     438              : 
     439            3 : bool MediaPipelineService::setSync(int sessionId, bool sync)
     440              : {
     441            3 :     RIALTO_SERVER_LOG_DEBUG("Set sync requested, session id: %d", sessionId);
     442              : 
     443            3 :     std::lock_guard<std::mutex> lock{m_mediaPipelineMutex};
     444            3 :     auto mediaPipelineIter = m_mediaPipelines.find(sessionId);
     445            3 :     if (mediaPipelineIter == m_mediaPipelines.end())
     446              :     {
     447            1 :         RIALTO_SERVER_LOG_ERROR("Session with id: %d does not exist", sessionId);
     448            1 :         return false;
     449              :     }
     450            2 :     return mediaPipelineIter->second->setSync(sync);
     451            3 : }
     452              : 
     453            3 : bool MediaPipelineService::getSync(int sessionId, bool &sync)
     454              : {
     455            3 :     RIALTO_SERVER_LOG_DEBUG("Get sync requested, session id: %d", sessionId);
     456              : 
     457            3 :     std::lock_guard<std::mutex> lock{m_mediaPipelineMutex};
     458            3 :     auto mediaPipelineIter = m_mediaPipelines.find(sessionId);
     459            3 :     if (mediaPipelineIter == m_mediaPipelines.end())
     460              :     {
     461            1 :         RIALTO_SERVER_LOG_ERROR("Session with id: %d does not exist", sessionId);
     462            1 :         return false;
     463              :     }
     464            2 :     return mediaPipelineIter->second->getSync(sync);
     465            3 : }
     466              : 
     467            3 : bool MediaPipelineService::setSyncOff(int sessionId, bool syncOff)
     468              : {
     469            3 :     RIALTO_SERVER_LOG_DEBUG("Set sync off requested, session id: %d", sessionId);
     470              : 
     471            3 :     std::lock_guard<std::mutex> lock{m_mediaPipelineMutex};
     472            3 :     auto mediaPipelineIter = m_mediaPipelines.find(sessionId);
     473            3 :     if (mediaPipelineIter == m_mediaPipelines.end())
     474              :     {
     475            1 :         RIALTO_SERVER_LOG_ERROR("Session with id: %d does not exist", sessionId);
     476            1 :         return false;
     477              :     }
     478            2 :     return mediaPipelineIter->second->setSyncOff(syncOff);
     479            3 : }
     480              : 
     481            3 : bool MediaPipelineService::setStreamSyncMode(int sessionId, int32_t sourceId, int32_t streamSyncMode)
     482              : {
     483            3 :     RIALTO_SERVER_LOG_DEBUG("Set stream sync mode requested, session id: %d", sessionId);
     484              : 
     485            3 :     std::lock_guard<std::mutex> lock{m_mediaPipelineMutex};
     486            3 :     auto mediaPipelineIter = m_mediaPipelines.find(sessionId);
     487            3 :     if (mediaPipelineIter == m_mediaPipelines.end())
     488              :     {
     489            1 :         RIALTO_SERVER_LOG_ERROR("Session with id: %d does not exist", sessionId);
     490            1 :         return false;
     491              :     }
     492            2 :     return mediaPipelineIter->second->setStreamSyncMode(sourceId, streamSyncMode);
     493            3 : }
     494              : 
     495            3 : bool MediaPipelineService::getStreamSyncMode(int sessionId, int32_t &streamSyncMode)
     496              : {
     497            3 :     RIALTO_SERVER_LOG_DEBUG("Get stream sync mode requested, session id: %d", sessionId);
     498              : 
     499            3 :     std::lock_guard<std::mutex> lock{m_mediaPipelineMutex};
     500            3 :     auto mediaPipelineIter = m_mediaPipelines.find(sessionId);
     501            3 :     if (mediaPipelineIter == m_mediaPipelines.end())
     502              :     {
     503            1 :         RIALTO_SERVER_LOG_ERROR("Session with id: %d does not exist", sessionId);
     504            1 :         return false;
     505              :     }
     506            2 :     return mediaPipelineIter->second->getStreamSyncMode(streamSyncMode);
     507            3 : }
     508              : 
     509            3 : bool MediaPipelineService::flush(int sessionId, std::int32_t sourceId, bool resetTime)
     510              : {
     511            3 :     RIALTO_SERVER_LOG_DEBUG("Flush requested, session id: %d", sessionId);
     512              : 
     513            3 :     std::lock_guard<std::mutex> lock{m_mediaPipelineMutex};
     514            3 :     auto mediaPipelineIter = m_mediaPipelines.find(sessionId);
     515            3 :     if (mediaPipelineIter == m_mediaPipelines.end())
     516              :     {
     517            1 :         RIALTO_SERVER_LOG_ERROR("Session with id: %d does not exist", sessionId);
     518            1 :         return false;
     519              :     }
     520            2 :     return mediaPipelineIter->second->flush(sourceId, resetTime);
     521            3 : }
     522              : 
     523            3 : bool MediaPipelineService::setSourcePosition(int sessionId, int32_t sourceId, int64_t position, bool resetTime,
     524              :                                              double appliedRate, uint64_t stopPosition)
     525              : {
     526            3 :     RIALTO_SERVER_LOG_DEBUG("Set Source Position requested, session id: %d", sessionId);
     527              : 
     528            3 :     std::lock_guard<std::mutex> lock{m_mediaPipelineMutex};
     529            3 :     auto mediaPipelineIter = m_mediaPipelines.find(sessionId);
     530            3 :     if (mediaPipelineIter == m_mediaPipelines.end())
     531              :     {
     532            1 :         RIALTO_SERVER_LOG_ERROR("Session with id: %d does not exist", sessionId);
     533            1 :         return false;
     534              :     }
     535            2 :     return mediaPipelineIter->second->setSourcePosition(sourceId, position, resetTime, appliedRate, stopPosition);
     536            3 : }
     537              : 
     538            3 : bool MediaPipelineService::processAudioGap(int sessionId, int64_t position, uint32_t duration, int64_t discontinuityGap,
     539              :                                            bool audioAac)
     540              : {
     541            3 :     RIALTO_SERVER_LOG_DEBUG("Process Audio Gap requested, session id: %d", sessionId);
     542              : 
     543            3 :     std::lock_guard<std::mutex> lock{m_mediaPipelineMutex};
     544            3 :     auto mediaPipelineIter = m_mediaPipelines.find(sessionId);
     545            3 :     if (mediaPipelineIter == m_mediaPipelines.end())
     546              :     {
     547            1 :         RIALTO_SERVER_LOG_ERROR("Session with id: %d does not exist", sessionId);
     548            1 :         return false;
     549              :     }
     550            2 :     return mediaPipelineIter->second->processAudioGap(position, duration, discontinuityGap, audioAac);
     551            3 : }
     552              : 
     553            3 : bool MediaPipelineService::setBufferingLimit(int sessionId, uint32_t limitBufferingMs)
     554              : {
     555            3 :     RIALTO_SERVER_LOG_DEBUG("Set buffering limit requested, session id: %d", sessionId);
     556              : 
     557            3 :     std::lock_guard<std::mutex> lock{m_mediaPipelineMutex};
     558            3 :     auto mediaPipelineIter = m_mediaPipelines.find(sessionId);
     559            3 :     if (mediaPipelineIter == m_mediaPipelines.end())
     560              :     {
     561            1 :         RIALTO_SERVER_LOG_ERROR("Session with id: %d does not exist", sessionId);
     562            1 :         return false;
     563              :     }
     564            2 :     return mediaPipelineIter->second->setBufferingLimit(limitBufferingMs);
     565            3 : }
     566              : 
     567            3 : bool MediaPipelineService::getBufferingLimit(int sessionId, uint32_t &limitBufferingMs)
     568              : {
     569            3 :     RIALTO_SERVER_LOG_DEBUG("Get buffering limit requested, session id: %d", sessionId);
     570              : 
     571            3 :     std::lock_guard<std::mutex> lock{m_mediaPipelineMutex};
     572            3 :     auto mediaPipelineIter = m_mediaPipelines.find(sessionId);
     573            3 :     if (mediaPipelineIter == m_mediaPipelines.end())
     574              :     {
     575            1 :         RIALTO_SERVER_LOG_ERROR("Session with id: %d does not exist", sessionId);
     576            1 :         return false;
     577              :     }
     578            2 :     return mediaPipelineIter->second->getBufferingLimit(limitBufferingMs);
     579            3 : }
     580              : 
     581            3 : bool MediaPipelineService::setUseBuffering(int sessionId, bool useBuffering)
     582              : {
     583            3 :     RIALTO_SERVER_LOG_DEBUG("Set use buffering requested, session id: %d", sessionId);
     584              : 
     585            3 :     std::lock_guard<std::mutex> lock{m_mediaPipelineMutex};
     586            3 :     auto mediaPipelineIter = m_mediaPipelines.find(sessionId);
     587            3 :     if (mediaPipelineIter == m_mediaPipelines.end())
     588              :     {
     589            1 :         RIALTO_SERVER_LOG_ERROR("Session with id: %d does not exist", sessionId);
     590            1 :         return false;
     591              :     }
     592            2 :     return mediaPipelineIter->second->setUseBuffering(useBuffering);
     593            3 : }
     594              : 
     595            3 : bool MediaPipelineService::getUseBuffering(int sessionId, bool &useBuffering)
     596              : {
     597            3 :     RIALTO_SERVER_LOG_DEBUG("Get use buffering requested, session id: %d", sessionId);
     598              : 
     599            3 :     std::lock_guard<std::mutex> lock{m_mediaPipelineMutex};
     600            3 :     auto mediaPipelineIter = m_mediaPipelines.find(sessionId);
     601            3 :     if (mediaPipelineIter == m_mediaPipelines.end())
     602              :     {
     603            1 :         RIALTO_SERVER_LOG_ERROR("Session with id: %d does not exist", sessionId);
     604            1 :         return false;
     605              :     }
     606            2 :     return mediaPipelineIter->second->getUseBuffering(useBuffering);
     607            3 : }
     608              : 
     609            3 : bool MediaPipelineService::switchSource(int sessionId, const std::unique_ptr<IMediaPipeline::MediaSource> &source)
     610              : {
     611            3 :     RIALTO_SERVER_LOG_INFO("MediaPipelineService requested to switch source, session id: %d", sessionId);
     612              : 
     613            3 :     std::lock_guard<std::mutex> lock{m_mediaPipelineMutex};
     614            3 :     auto mediaPipelineIter = m_mediaPipelines.find(sessionId);
     615            3 :     if (mediaPipelineIter == m_mediaPipelines.end())
     616              :     {
     617            1 :         RIALTO_SERVER_LOG_ERROR("Session with id: %d does not exists", sessionId);
     618            1 :         return false;
     619              :     }
     620            2 :     return mediaPipelineIter->second->switchSource(source);
     621            3 : }
     622              : 
     623            1 : std::vector<std::string> MediaPipelineService::getSupportedMimeTypes(MediaSourceType type)
     624              : {
     625            1 :     return m_mediaPipelineCapabilities->getSupportedMimeTypes(type);
     626              : }
     627              : 
     628            1 : bool MediaPipelineService::isMimeTypeSupported(const std::string &mimeType)
     629              : {
     630            1 :     return m_mediaPipelineCapabilities->isMimeTypeSupported(mimeType);
     631              : }
     632              : 
     633            1 : std::vector<std::string> MediaPipelineService::getSupportedProperties(MediaSourceType mediaType,
     634              :                                                                       const std::vector<std::string> &propertyNames)
     635              : {
     636            1 :     return m_mediaPipelineCapabilities->getSupportedProperties(mediaType, propertyNames);
     637              : }
     638              : 
     639            2 : void MediaPipelineService::ping(const std::shared_ptr<IHeartbeatProcedure> &heartbeatProcedure)
     640              : {
     641            2 :     RIALTO_SERVER_LOG_DEBUG("Ping requested");
     642            2 :     std::lock_guard<std::mutex> lock{m_mediaPipelineMutex};
     643            3 :     for (const auto &mediaPipelinePair : m_mediaPipelines)
     644              :     {
     645            1 :         auto &mediaPipeline = mediaPipelinePair.second;
     646            1 :         mediaPipeline->ping(heartbeatProcedure->createHandler());
     647              :     }
     648            2 : }
     649              : } // namespace firebolt::rialto::server::service
        

Generated by: LCOV version 2.0-1