LCOV - code coverage report
Current view: top level - media/server/service/source - MediaPipelineService.cpp (source / functions) Coverage Total Hit
Test: coverage.info Lines: 98.1 % 427 419
Test Date: 2026-09-11 17:36:12 Functions: 98.0 % 50 49

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

Generated by: LCOV version 2.0-1