RDK Documentation (Open Sourced RDK Components)
rmfplayer.cpp
1 /*
2  * If not stated otherwise in this file or this component's Licenses.txt file the
3  * following copyright and licenses apply:
4  *
5  * Copyright 2018 RDK Management
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 #include "rmfplayer.h"
20 #include "rdkmediaplayer.h"
21 #include <glib.h>
22 #include <limits>
23 #include <cmath>
24 #include <unistd.h>
25 #include "logger.h"
26 #include "mediaplayerdlna.h"
27 #include "mediaplayergeneric.h"
28 #ifdef USE_EXTERNAL_CAS
29 #include <jansson.h>
30 #endif
31 
32 #define TO_MS(x) (uint32_t)( (x) / 1000)
33 #define TUNE_LOG_MAX_SIZE 100
34 #define HEADER_SIZE 3
35 
36 namespace
37 {
38  const guint kProgressMonitorTimeoutMs = 250;
39  const guint kRefreshCachedTimeThrottleMs = 100;
40 }
41 
42 #ifdef USE_EXTERNAL_CAS
43 bool CASService::initialize(bool management, const std::string& casOcdmId, PSIInfo *psiInfo)
44 {
45  LOG_INFO("CASService initialize");
46  casOcdmId_ = casOcdmId;
47  casManager_ = CASManager::createInstance(casSFInterface_, casPipelineInterface_);
48 
49  if(!casManager_)
50  {
51  LOG_INFO("Failed to create casManager");
52  return false;
53  }
54 
55  bManagementSession_ = management;
56  if(env_.getUsageManagement() == CAS_USAGE_MANAGEMENT_FULL) {
57  bManagementSession_ = true;
58  }
59  else {
60  bManagementSession_ = management;
61  }
62  LOG_INFO("Management = %d", bManagementSession_);
63 
64  if(bManagementSession_ && (psiInfo == NULL)) {
65  casHelper_ = casManager_->createHelper(casOcdmId, env_);
66  }
67  else {
68  casHelper_ = casManager_->createHelper(psiInfo->pat, psiInfo->pmt, psiInfo->cat, env_);
69  }
70  if(!casHelper_)
71  {
72  LOG_INFO("Failed to create Helper");
73  return false;
74  }
75  return true;
76 }
77 
78 bool CASService::startStopDecrypt(const std::vector<uint16_t>& startPids, const std::vector<uint16_t>& stopPids)
79 {
80  LOG_INFO("[%s:%d] - Enter\n", __FUNCTION__, __LINE__);
81  if(!casHelper_)
82  {
83  LOG_INFO("casHelper_ Not available");
84  return false;
85  }
86 
87  casHelper_->registerStatusInformant(this);
88 
89  CASHelper::CASStartStatus status = casHelper_->startStopDecrypt(startPids, stopPids);
90  bool ret = false;
91  switch(status)
92  {
93  case CASHelper::CASStartStatus::OK:
94  LOG_INFO("Everything was created and CAS Started, there is no need to wait for status");
95  ret = true;
96  break;
97  case CASHelper::CASStartStatus::WAIT:
98  LOG_INFO("verything was created but the CAS has not started yet...");
99  break;
100  case CASHelper::CASStartStatus::ERROR:
101  LOG_INFO("CAS Start is Failed...");
102  break;
103  default:
104  LOG_INFO("Invalid CAS start status");
105  break;
106  }
107  return ret;
108 }
109 
110 void CASService::updatePSI(const std::vector<uint8_t>& pat, const std::vector<uint8_t>& pmt, const std::vector<uint8_t>& cat)
111 {
112  LOG_INFO("[%s:%d] - Enter\n", __FUNCTION__, __LINE__);
113  if(casHelper_)
114  {
115  casHelper_->updatePSI(pat, pmt, cat);
116  }
117  else
118  {
119  LOG_ERROR("[%s:%d] Failed to send CASService updatePSI \n", __FUNCTION__, __LINE__);
120  }
121 }
122 
123 void CASService::informStatus(const CASStatus& status) {
124  LOG_INFO("[%s:%d] Inform Status back to Source = %d\n", __FUNCTION__, __LINE__, status);
125  if(status == CASStatusInform::CASStatus_OK)
126  {
127  casPipelineInterface_->unmuteAudio();
128  }
129 }
130 
131 void CASService::casPublicData(const std::vector<uint8_t>& data)
132 {
133  LOG_INFO("casPublicData - Received");
134  std::string casData;
135  casData.assign(data.begin(), data.end());
136  LOG_INFO("casPublicData - %s\n", casData.c_str());
137  emit_.send(OnCASDataEvent(casData));
138 }
139 
140 void CASService::processSectionData(const uint32_t& filterId, const std::vector<uint8_t>& data)
141 {
142  LOG_INFO("processSectionData - CAS Service");
143  if(casManager_)
144  {
145  casManager_->processData(filterId, data);
146  }
147  else
148  {
149  LOG_ERROR("processSectionData - CASManager NULL");
150  }
151 }
152 
154 {
155  LOG_INFO("[%s:%d] - Enter\n", __FUNCTION__, __LINE__);
156  return bManagementSession_;
157 }
158 
159 ICasFilterStatus RMFPlayer::create(uint16_t pid, ICasFilterParam &param, ICasHandle **pHandle) {
160  LOG_INFO("create - CAS Upstream to Create Filter");
161  uint32_t filterId = 0;
162 
163  ICasFilterParam *filterParam = (ICasFilterParam *)malloc(sizeof(ICasFilterParam));
164  filterParam->pos_size = param.pos_size;
165  filterParam->neg_size = param.neg_size;
166  for (int i = 0; i < FILTER_SIZE; i++)
167  {
168  filterParam->pos_mask[i] = param.pos_mask[i];
169  filterParam->pos_value[i] = param.pos_value[i];
170  filterParam->neg_mask[i] = param.neg_mask[i];
171  filterParam->neg_value[i] = param.neg_value[i];
172  }
173  filterParam->disableCRC = param.disableCRC;
174  filterParam->noPaddingBytes = param.noPaddingBytes;
175  filterParam->mode = param.mode;
176  LOG_INFO("create : param - pos_size = %d, neg_size = %d\n", param.pos_size, param.neg_size);
177  m_mediaPlayer->setFilter(pid, (char *)filterParam, &filterId);
178  (*pHandle)->filterId = filterId;
179  if(filterParam)
180  {
181  free(filterParam);
182  filterParam = NULL;
183  }
184  return ICasFilterStatus_NoError;
185 }
186 
187 ICasFilterStatus RMFPlayer::setState(bool isRunning, ICasHandle* handle) {
188  LOG_INFO("setState - CAS Upstream to Create Filter");
189  uint32_t filterId = handle->filterId;
190  //pause filter
191  //stop cancel
192  if(!isRunning)
193  {
194  m_mediaPlayer->pauseFilter(filterId);
195  }
196 
197  return ICasFilterStatus_NoError;
198 }
199 
200 ICasFilterStatus RMFPlayer::start(ICasHandle* handle) {
201  LOG_INFO("start - CAS Upstream to Create Filter");
202  uint32_t filterId = handle->filterId;
203  //resume filter
204  m_mediaPlayer->resumeFilter(filterId);
205  return ICasFilterStatus_NoError;
206 }
207 
208 ICasFilterStatus RMFPlayer::destroy(ICasHandle* handle) {
209  LOG_INFO("[%s:%d] - Enter\n", __FUNCTION__, __LINE__);
210  LOG_INFO("destroy - CAS Upstream to Create Filter");
211  uint32_t filterId = handle->filterId;
212  m_mediaPlayer->releaseFilter(filterId);
213  return ICasFilterStatus_NoError;
214 }
215 
216 void RMFPlayer::unmuteAudio()
217 {
218 #ifdef USE_EXTERNAL_CAS
219  LOG_INFO("[%s:%d] - Enter\n", __FUNCTION__, __LINE__);
220  if(m_mediaPlayer->getAudioMute())
221  {
222  LOG_INFO("setAudioMute - false\n");
223  m_mediaPlayer->rmf_setAudioMute(false);
224  }
225 #endif
226 }
227 
228 uint32_t RMFPlayer::setKeySlot(uint16_t pid, std::vector<uint8_t> data){
229  LOG_INFO("[%s:%d] - Enter\n", __FUNCTION__, __LINE__);
230  uint32_t ret = RMF_RESULT_SUCCESS;
231  //For External CAS, the data sent is having a pointer address
232  //This needs to be made it is more generic for different platform and CAS
233  //E.g.: [232, 180, 153, 192], keyslot handle should be 0xE8B499C0
234  char* keyHandle = (char*)((data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3]);
235  RDK_LOG(RDK_LOG_INFO, "LOG.RDK.ANYCAS", "[%s:%d] keyHandle = 0x%x\n", __FUNCTION__, __LINE__, keyHandle);
236  if(pid == m_mediaPlayer->rmf_getVideoPid())
237  {
238  LOG_INFO("setKeySlot - Setting Video Key Slot, pid = %d", pid);
239  m_mediaPlayer->rmf_setVideoKeySlot(keyHandle);
240  }
241  else if (pid == m_mediaPlayer->rmf_getAudioPid())
242  {
243  LOG_INFO("setKeySlot - Setting Audio Key Slot, pid = %d", pid);
244  m_mediaPlayer->rmf_setAudioKeySlot(keyHandle);
245  }
246  else
247  {
248  LOG_INFO("setKeySlot - Invalid Pid - Not either Audio/Video Pid currently playing");
249  ret = RMF_RESULT_FAILURE;
250  }
251  return ret;
252 }
253 
254 uint32_t RMFPlayer::deleteKeySlot(uint16_t pid){
255  uint32_t ret = RMF_RESULT_SUCCESS;
256  RDK_LOG(RDK_LOG_INFO, "LOG.RDK.ANYCAS", "[%s:%d] pid = 0x%x\n", __FUNCTION__, __LINE__, pid);
257 
258  if(pid == m_mediaPlayer->rmf_getVideoPid())
259  {
260  LOG_INFO("deleteKeySlot - deleting Video Key Slot, pid = %d", pid);
261  m_mediaPlayer->rmf_deleteVideoKeySlot();
262  }
263  else if (pid == m_mediaPlayer->rmf_getAudioPid())
264  {
265  LOG_INFO("deleteKeySlot - deleting Audio Key Slot, pid = %d", pid);
266  m_mediaPlayer->rmf_deleteAudioKeySlot();
267  }
268  else
269  {
270  LOG_INFO("deleteKeySlot - Invalid Pid - Not either Audio/Video Pid currently playing");
271  ret = RMF_RESULT_FAILURE;
272  }
273  return ret;
274 }
275 
276 uint32_t RMFPlayer::getPATBuffer(std::vector<uint8_t>& patBuf) {
277  return m_mediaPlayer->getPATBuffer(patBuf);
278 }
279 
280 uint32_t RMFPlayer::getPMTBuffer(std::vector<uint8_t>& pmtBuf) {
281  return m_mediaPlayer->getPMTBuffer(pmtBuf);
282 }
283 
284 uint32_t RMFPlayer::getCATBuffer(std::vector<uint8_t>& catBuf) {
285  return m_mediaPlayer->getCATBuffer(catBuf);
286 }
287 #endif
288 
289 bool RMFPlayer::canPlayURL(const std::string& url)
290 {
291  std::string contentType;
292  return RMFPlayer::setContentType(url, contentType);
293 }
294 
295 RMFPlayer::RMFPlayer(RDKMediaPlayer* parent) :
296  RDKMediaPlayerImpl(parent),
297  m_mediaPlayer(new MediaPlayerDLNA(this)),
298  m_isLoaded(false),
299  m_isPaused(true),
300  m_currentTime(0.f),
301  m_lastReportedCurrentTime(0.f),
302  m_duration(0.f),
303  m_lastReportedDuration(0.f),
304  m_lastReportedPlaybackRate(0.f),
305  m_playerState(MediaPlayer::RMF_PLAYER_EMPTY),
306  m_videoState(MediaPlayer::RMF_VIDEO_BUFFER_HAVENOTHING),
307  m_videoStateMaximum(MediaPlayer::RMF_VIDEO_BUFFER_HAVENOTHING),
308 #ifdef USE_EXTERNAL_CAS
309  m_lastRefreshTime(0),
310  m_casService(NULL),
311  m_lastAudioPid(-1),
312  m_lastVideoPid(-1),
313 #endif
314  m_playbackProgressMonitorTag(0)
315 {
316 }
317 
318 RMFPlayer::~RMFPlayer()
319 {
320 }
321 
322 // RDKMediaPlayerImpl impl start
323 bool RMFPlayer::doCanPlayURL(const std::string& url)
324 {
325  return RMFPlayer::canPlayURL(url);
326 }
327 
328 void RMFPlayer::doInit()
329 {
330 }
331 
332 void RMFPlayer::doLoad(const std::string& url)
333 {
334  LOG_INFO("[%s:%d] - Enter\n", __FUNCTION__, __LINE__);
335  m_playerState = MediaPlayer::RMF_PLAYER_LOADING;
336  m_videoState = MediaPlayer::RMF_VIDEO_BUFFER_HAVENOTHING;
337  m_videoStateMaximum = MediaPlayer::RMF_VIDEO_BUFFER_HAVENOTHING;
338  m_lastReportedCurrentTime = 0.f;
339  m_lastReportedDuration = 0.f;
340  m_lastReportedPlaybackRate = 0.f;
341  m_isPaused = true;
342 #ifdef USE_EXTERNAL_CAS
343  m_lastAudioPid = -1;
344  m_lastVideoPid = -1;
345 #endif
346  m_setURLTime = getParent()->getSetURLTime();
347  m_loadStartTime = getParent()->getLoadStartTime();
348 
349  if (MediaPlayerDLNA::supportsUrl(url))
350  m_mediaPlayer.reset(new MediaPlayerDLNA(this));
351  else
352  m_mediaPlayer.reset(new MediaPlayerGeneric(this));
353 
354  setContentType(url, m_contentType);
355 
356  LOG_INFO("load(%s)", url.c_str());
357 
358  m_isLoaded = m_mediaPlayer->rmf_load(url);
359 
360  m_loadedTime = g_get_monotonic_time();
361 
362  m_loadCompleteTime = g_get_monotonic_time();
363 }
364 
365 bool RMFPlayer::isManagementSession() const
366 {
367  LOG_INFO("[%s:%d] - Enter\n", __FUNCTION__, __LINE__);
368 #ifdef USE_EXTERNAL_CAS
369  std::lock_guard<std::mutex> guard(cas_mutex);
370  if(m_casService)
371  {
372  return m_casService->isManagementSession();
373  }
374  else
375  {
376  return false;
377  }
378 #else
379  return false;
380 #endif
381 }
382 
383 #ifdef USE_EXTERNAL_CAS
384 void RMFPlayer::open(const std::string& openData)
385 {
386  LOG_INFO("[%s:%d] - Enter\n", __FUNCTION__, __LINE__);
387 
388  json_error_t error;
389  json_t *root = json_loads(openData.c_str(), 0, &error);
390  if (!root) {
391  LOG_INFO("json error on line %d: %s\n", error.line, error.text);
392  return;
393  }
394 
395  std::string mediaUrl = json_string_value(json_object_get(root, "mediaurl"));
396  std::string mode = json_string_value(json_object_get(root, "mode"));
397  std::string manage = json_string_value(json_object_get(root, "manage"));
398  std::string initData = json_string_value(json_object_get(root, "casinitdata"));
399  std::string casOcdmId = json_string_value(json_object_get(root, "casocdmid"));
400 
401  CASUsageMode mode_val;
402  CASUsageManagement manage_val;
403  if(mode == "MODE_NONE") { mode_val = CAS_USAGE_NULL; }
404  else if(mode == "MODE_LIVE") { mode_val = CAS_USAGE_LIVE; }
405  else if(mode == "MODE_RECORD") { mode_val = CAS_USAGE_RECORDING; }
406  else if(mode == "MODE_PLAYBACK") { mode_val = CAS_USAGE_PLAYBACK; }
407 
408  if(manage == "MANAGE_NONE") { manage_val = CAS_USAGE_MANAGEMENT_NONE; }
409  else if(manage == "MANAGE_FULL") { manage_val = CAS_USAGE_MANAGEMENT_FULL; }
410  else if(manage == "MANAGE_NO_PSI") { manage_val = CAS_USAGE_MANAGEMENT_NO_PSI; }
411  else if(manage == "MANAGE_NO_TUNER") { manage_val = CAS_USAGE_MANAGEMENT_NO_TUNE; }
412 
413  CASEnvironment env{ mediaUrl, mode_val, manage_val, initData};
414 
415  std::lock_guard<std::mutex> guard(cas_mutex);
416  m_casService = new CASService(getParent()->getEventEmitter(), env, this, this);
417  if(m_casService) {
418  LOG_INFO("Successfully created m_casService");
419  }
420  else {
421  LOG_INFO("Failed to create m_casService");
422  }
423 
424  if(casOcdmId.empty())
425  {
426  LOG_INFO("Missing casocdmid which is mandatory to create management session.");
427  }
428  else if(manage == "MANAGE_NO_PSI" || manage == "MANAGE_NO_TUNER")
429  {
430  if(m_casService && m_casService->initialize(true, casOcdmId, NULL) == false)
431  {
432  delete m_casService;
433  m_casService = NULL;
434  LOG_INFO("Failed to create Management Session");
435  }
436  }
437  else
438  {
439  LOG_INFO("Invalid Manage option: %s", manage.c_str());
440  }
441 
442  json_decref(root);
443 }
444 
445 void RMFPlayer::registerCASData()
446 {
447  LOG_INFO("[%s:%d] - Enter\n", __FUNCTION__, __LINE__);
448  std::lock_guard<std::mutex> guard(cas_mutex);
449  if(m_casService) {
450  std::shared_ptr<CASHelper> casHelper = m_casService->getCasHelper();
451  if(casHelper){
452  casHelper->registerDataListener(m_casService);
453  }
454  }
455  else{
456  LOG_INFO("No Management Session - Invalid Operation");
457  }
458 }
459 
460 void RMFPlayer::sendCASData(const std::string& data)
461 {
462  LOG_INFO("[%s:%d] - Enter\n", __FUNCTION__, __LINE__);
463  std::lock_guard<std::mutex> guard(cas_mutex);
464  if(m_casService)
465  {
466  json_error_t error;
467  json_t *root = json_loads(data.c_str(), 0, &error);
468 
469  if (root) {
470  std::string strPayload = json_string_value(json_object_get(root, "payload"));
471 
472  std::vector<uint8_t> payload;
473  payload.assign(strPayload.begin(), strPayload.end());
474 
475  std::shared_ptr<CASHelper> casHelper = m_casService->getCasHelper();
476  if(casHelper){
477  casHelper->sendData(payload);
478  }
479  json_decref(root);
480  }
481  else{
482  LOG_INFO("json error on line %d: %s\n", error.line, error.text);
483  }
484  }
485  else{
486  LOG_INFO("No Management Session - Invalid Operation");
487  }
488 }
489 
490 void RMFPlayer::destroy(const std::string& casOcdmId)
491 {
492  LOG_INFO("[%s:%d] - Enter\n", __FUNCTION__, __LINE__);
493  std::lock_guard<std::mutex> guard(cas_mutex);
494  if(m_casService)
495  {
496  delete m_casService;
497  m_casService = NULL;
498  }
499  else{
500  LOG_INFO("No Management Session - Invalid Operation");
501  }
502 }
503 #endif
504 
505 void RMFPlayer::doSetVideoRectangle(const IntRect& rect)
506 {
507  if (rect.width() > 0 && rect.height() > 0)
508  {
509  LOG_INFO("set video rectangle: %dx%d %dx%d", rect.x(), rect.y(), rect.width(), rect.height());
510  m_mediaPlayer->rmf_setVideoRectangle(rect.x(), rect.y(), rect.width(), rect.height());
511  }
512 }
513 
514 void RMFPlayer::doSetAudioLanguage(std::string& lang)
515 {
516  m_mediaPlayer->rmf_setAudioMute(true);
517  LOG_INFO("set lang: %s", lang.c_str());
518  m_mediaPlayer->rmf_setAudioLanguage(lang);
519 }
520 
521 void RMFPlayer::doPlay()
522 {
523  m_playStartTime = getParent()->getPlayStartTime();
524  if (!m_mediaPlayer->rmf_canItPlay())
525  {
526  LOG_INFO("cannot play, skip play()");
527  return;
528  }
529  if (m_isPaused || m_mediaPlayer->rmf_isPaused())
530  {
531  LOG_INFO("play()");
532  m_mediaPlayer->rmf_play();
533  if (m_videoState >= MediaPlayer::RMF_VIDEO_BUFFER_HAVEFUTUREDATA)
534  {
535  m_isPaused = false;
536  getParent()->getEventEmitter().send(OnPlayingEvent());
537  }
538  }
539  else
540  {
541  LOG_INFO("not paused, skip play()");
542  }
543  m_playEndTime = g_get_monotonic_time();
544  startPlaybackProgressMonitor();
545 }
546 
547 void RMFPlayer::doPause()
548 {
549  if (!m_mediaPlayer->rmf_isPaused())
550  {
551  LOG_INFO("pause()");
552  m_isPaused = true;
553  m_mediaPlayer->rmf_pause();
554  doTimeUpdate(true);
555  getParent()->getEventEmitter().send(OnPausedEvent());
556  }
557 }
558 
559 void RMFPlayer::doSetPosition(float position)
560 {
561  if (!std::isnan(position))
562  {
563  LOG_INFO("set currentTime: %f", position);
564  m_mediaPlayer->rmf_seek(position/1000);
565  }
566 }
567 
568 
569 void RMFPlayer::doSeekToLive()
570 {
571  if (m_mediaPlayer->rmf_isItInProgressRecording())
572  {
573  if (m_mediaPlayer->rmf_getRate() != 1.f)
574  {
575  LOG_INFO("set rate: 1.0");
576  m_mediaPlayer->rmf_setRate(1.f);
577  }
578  LOG_INFO("jumpToLive: true");
579  m_mediaPlayer->rmf_seekToLivePosition();
580  }
581 }
582 
583 
584 void RMFPlayer::doStop()
585 {
586  LOG_INFO("[%s:%d] Enter\n", __FUNCTION__, __LINE__);
587  LOG_INFO("stop()");
588  m_isLoaded = false;
589  stopPlaybackProgressMonitor();
590 #ifdef USE_EXTERNAL_CAS
591  std::lock_guard<std::mutex> guard(cas_mutex);
592  if(m_casService)
593  {
594  std::shared_ptr<CASHelper> casHelper = m_casService->getCasHelper();
595  if(casHelper){
596  casHelper->setState(CASHelper::CASHelperState::PAUSED);
597  }
598  std::vector<uint16_t> startPids;
599  std::vector<uint16_t> stopPids;
600  uint16_t pid = m_mediaPlayer->rmf_getVideoPid();
601  if (pid != -1)
602  {
603  LOG_INFO("VideoPid = %d\n", pid);
604  stopPids.push_back(pid);
605  }
606  pid = m_mediaPlayer->rmf_getAudioPid();
607  if (pid != -1)
608  {
609  LOG_INFO("AudioPid = %d\n", pid);
610  stopPids.push_back(pid);
611  }
612  if (stopPids.size() > 0)
613  {
614  m_casService->startStopDecrypt(startPids, stopPids);
615  }
616  }
617  if(m_casService)
618  {
619  delete m_casService;
620  m_casService = NULL;
621  }
622 #endif
623 
624  m_mediaPlayer->rmf_stop();
625  getParent()->getEventEmitter().send(OnClosedEvent());
626 #ifdef USE_EXTERNAL_CAS
627  if(m_casService)
628  {
629  delete m_casService;
630  m_casService = NULL;
631  }
632 #endif
633 }
634 
635 void RMFPlayer::doChangeSpeed(float speed, int32_t overshootTime)
636 {
637  m_currentTime = 0.f;
638  LOG_INFO("doChangeSpeed(%f, %d)", speed, overshootTime);
639  m_mediaPlayer->rmf_changeSpeed(speed, overshootTime);
640 }
641 
642 void RMFPlayer::doSetSpeed(float speed)
643 {
644  if (m_mediaPlayer->rmf_getRate() != speed)
645  {
646  LOG_INFO("doSetSpeed(%f)", speed);
647  m_mediaPlayer->rmf_setRate(speed);
648  }
649 }
650 
651 void RMFPlayer::doSetBlocked(bool blocked)
652 {
653  if (m_mediaPlayer->rmf_isMuted() != blocked)
654  {
655  LOG_INFO("set mute: %s", blocked ? "true" : "false");
656  m_mediaPlayer->rmf_setMute(blocked);
657  }
658 }
659 
660 void RMFPlayer::doSetEISSFilterStatus(bool status)
661 {
662  LOG_INFO("set EISS Filter Status: %s", status? "true" : "false");
663  m_mediaPlayer->rmf_setEissFilterStatus(status);
664 }
665 
666 void RMFPlayer::doSetVolume(float volume)
667 {
668  LOG_INFO("set volume: %f", volume);
669  if(!getParent()->getIsBlocked() && volume > 0)
670  m_mediaPlayer->rmf_setMute(false);
671  m_mediaPlayer->rmf_setVolume(volume);
672 }
673 
674 void RMFPlayer::doSetIsInProgressRecording(bool isInProgressRecording)
675 {
676  LOG_TRACE("set isInProgressRecording: %s", isInProgressRecording ? "true" : "false");
677  m_mediaPlayer->rmf_setInProgressRecording(isInProgressRecording);
678 }
679 
680 void RMFPlayer::doSetZoom(int zoom)
681 {
682  LOG_INFO("set videoZoom: %d", zoom);
683  m_mediaPlayer->rmf_setVideoZoom(zoom);
684 }
685 
686 void RMFPlayer::doSetNetworkBufferSize(int32_t networkBufferSize)
687 {
688  LOG_INFO("set networkBufferSize: %d", networkBufferSize);
689  m_mediaPlayer->rmf_setNetworkBufferSize(networkBufferSize);
690 }
691 
692 void RMFPlayer::doSetVideoBufferLength(float videoBufferLength)
693 {
694  LOG_TRACE("set videoBufferLength: %f", videoBufferLength);
695  m_mediaPlayer->rmf_setVideoBufferLength(videoBufferLength);
696 }
697 
698 void RMFPlayer::getProgressData(ProgressData* progressData)
699 {
700  progressData->position = m_lastReportedCurrentTime;
701  progressData->duration = m_lastReportedDuration;
702  progressData->speed = m_lastReportedPlaybackRate;
703  progressData->start = -1;
704  progressData->end = -1;
705 }
706 
707 // RDKMediaPlayerImpl impl end
708 
709 // MediaPlayerClient impl start
710 void RMFPlayer::mediaPlayerEngineUpdated()
711 {
712 }
713 
714 void RMFPlayer::mediaPlaybackCompleted()
715 {
716  getParent()->getEventEmitter().send(OnCompleteEvent());
717  getParent()->stop();//automatically call stop on player
718 }
719 
720 void RMFPlayer::mediaFrameReceived()
721 {
722  std::string tuneTimeLog;
723  if (m_setURLTime)
724  {
725  m_firstFrameTime = g_get_monotonic_time();
726 
727  if (m_loadStartTime == 0 || m_loadStartTime > m_setURLTime)
728  m_loadStartTime = m_setURLTime;
729 
730  char buffer[TUNE_LOG_MAX_SIZE];
731 
732  int len = sprintf_s(buffer, sizeof(buffer), "QAM_TUNE_TIME:TYPE-%s,%u,%u,%u,%u,%u",
733  m_contentType.c_str(),
734  TO_MS(m_loadedTime - m_loadStartTime), // time taken by load
735  TO_MS(m_loadCompleteTime - m_loadStartTime), // time of onLoaded event
736  TO_MS(m_playEndTime - m_playStartTime), // time taken by play
737  TO_MS(m_firstFrameTime - m_playStartTime), // time to render first frame
738  TO_MS(m_firstFrameTime - m_loadStartTime)); // tune time
739 
740  if (len > 0)
741  {
742  tuneTimeLog = std::string(buffer, len);
743  } else {
744  ERR_CHK(len);
745  }
746 
747  m_setURLTime = m_loadStartTime = 0;
748  }
749 
750  const std::string& lang = m_mediaPlayer->rmf_getAudioLanguages();
751  //const std::string& ccDescriptor = m_mediaPlayer->rmf_getCaptionDescriptor();
752  std::string speeds = "-60.0, -30.0, -15.0, -4.0, 1.0, 0.5, 4.0, 15.0, 30.0, 60.0";
753  getParent()->updateVideoMetadata(lang, speeds, m_duration, 1280, 720);//TODO fix 1280x720
754  if (!tuneTimeLog.empty())
755  {
756  getParent()->getEventEmitter().send(OnMetricLogEvent(tuneTimeLog.c_str()));
757  }
758  getParent()->getEventEmitter().send(OnProgressEvent(this));//fire the first progress event to signal we are tuned
759 }
760 
761 void RMFPlayer::mediaWarningReceived()
762 {
763  if (!m_isLoaded)
764  return;
765  uint32_t code = m_mediaPlayer->rmf_getMediaWarnData();
766  const std::string& description = m_mediaPlayer->rmf_getMediaWarnDescription();
767  getParent()->getEventEmitter().send(OnWarningEvent(code, description));
768 }
769 
770 void RMFPlayer::eissDataReceived()
771 {
772  if (!m_isLoaded)
773  return;
774  const std::string& eissData = m_mediaPlayer->rmf_getEISSDataBuffer();
775  getParent()->getEventEmitter().send(OnEISSDataReceivedEvent(eissData));
776 }
777 
778 void RMFPlayer::volumeChanged(float volume)
779 {
780 }
781 
782 void RMFPlayer::playerStateChanged()
783 {
784  MediaPlayer::RMFPlayerState oldState = m_playerState;
785  MediaPlayer::RMFPlayerState newState = m_mediaPlayer->rmf_playerState();
786  if (newState == oldState)
787  return;
788 
789  LOG_INFO("oldState=%s newState=%s", StateString(oldState), StateString(newState));
790 
791  if (newState == MediaPlayer::RMF_PLAYER_FORMATERROR ||
792  newState == MediaPlayer::RMF_PLAYER_NETWORKERROR ||
793  newState == MediaPlayer::RMF_PLAYER_DECODEERROR)
794  {
795  uint32_t code = static_cast<uint32_t>(m_mediaPlayer->rmf_playerState());
796  const std::string& description = m_mediaPlayer->rmf_getMediaErrorMessage();
797  getParent()->getEventEmitter().send(OnErrorEvent(code, description));
798  return;
799  }
800  m_playerState = newState;
801 }
802 
803 void RMFPlayer::videoStateChanged()
804 {
805  MediaPlayer::RMFVideoBufferState oldState = m_videoState;
806  MediaPlayer::RMFVideoBufferState newState = m_mediaPlayer->rmf_videoState();
807  if (newState == oldState)
808  return;
809 
810  LOG_INFO("oldState=%s newState=%s", StateString(oldState), StateString(newState));
811 
812  m_videoState = newState;
813  if (oldState > m_videoStateMaximum)
814  m_videoStateMaximum = oldState;
815 
816  bool isPotentiallyPlaying = potentiallyPlaying();
817 
818  bool isTimeUpdated = false;
819  isTimeUpdated = (isPotentiallyPlaying && newState < MediaPlayer::RMF_VIDEO_BUFFER_HAVEFUTUREDATA);
820  isTimeUpdated |= (newState >= MediaPlayer::RMF_VIDEO_BUFFER_HAVEMETADATA && oldState < MediaPlayer::RMF_VIDEO_BUFFER_HAVEMETADATA);
821  isTimeUpdated |= (newState >= MediaPlayer::RMF_VIDEO_BUFFER_HAVECURRENTDATA && oldState < MediaPlayer::RMF_VIDEO_BUFFER_HAVEMETADATA);
822 
823  if (isTimeUpdated)
824  timeChanged();
825 
826  bool isPlaying = false;
827  if (isPotentiallyPlaying)
828  {
829  isPlaying = (newState >= MediaPlayer::RMF_VIDEO_BUFFER_HAVEFUTUREDATA && oldState <= MediaPlayer::RMF_VIDEO_BUFFER_HAVECURRENTDATA);
830  }
831 
832  if (isPlaying)
833  {
834  m_isPaused = false;
835  getParent()->getEventEmitter().send(OnPlayingEvent());
836  }
837  else if (!m_isPaused &&
838  m_videoStateMaximum >= MediaPlayer::RMF_VIDEO_BUFFER_HAVEFUTUREDATA &&
839  m_videoState > MediaPlayer::RMF_VIDEO_BUFFER_HAVENOTHING &&
840  m_videoState < MediaPlayer::RMF_VIDEO_BUFFER_HAVEFUTUREDATA)
841  {
842  m_isPaused = true;
843  getParent()->getEventEmitter().send(OnPausedEvent());
844  }
845 }
846 
847 void RMFPlayer::durationChanged()
848 {
849  doTimeUpdate();
850 }
851 
852 void RMFPlayer::timeChanged()
853 {
854  doTimeUpdate();
855 }
856 
857 void RMFPlayer::rateChanged()
858 {
859  float rate = m_mediaPlayer->rmf_getRate();
860  if (rate != m_lastReportedPlaybackRate)
861  {
862  m_lastReportedPlaybackRate = rate;
863  LOG_INFO("newRate=%f", rate);
864  doTimeUpdate(true);
865  getParent()->getEventEmitter().send(OnSpeedChangeEvent(rate));
866  }
867 }
868 
869 void RMFPlayer::videoDecoderHandleReceived()
870 {
871  getParent()->onVidHandleReceived(m_mediaPlayer->rmf_getCCDecoderHandle());
872 }
873 
874 void RMFPlayer::psiReady()
875 {
876 #ifdef USE_EXTERNAL_CAS
877  LOG_INFO("[%s:%d] - Enter\n", __FUNCTION__, __LINE__);
878  PSIInfo psiInfo;
879 
880  if( getPATBuffer(psiInfo.pat) == 0 ||
881  getPMTBuffer(psiInfo.pmt) == 0 )
882  {
883  LOG_INFO("Failed to get PSI buffers (PAT or PMT or CAT)");
884  return;
885  }
886  std::lock_guard<std::mutex> guard(cas_mutex);
887  if( getCATBuffer(psiInfo.cat) == 0 )
888  {
889  LOG_INFO("Failed to get CAT buffer");
890  }
891  else
892  {
893  m_casPending = 1;
894  }
895 
896  if(!m_casService || m_casService->initialize(false, "", &psiInfo) == false)
897  {
898  if(m_casService)
899  delete m_casService;
900  m_casService = NULL;
901  LOG_INFO("Failed to create Tuning Session for CAS");
902  return;
903  }
904 
905  if(m_casService->isManagementSession())
906  {
907  LOG_INFO("Managemnet Session - No stopStartDecrypt");
908  return;
909  }
910 
911  int videoPid = -1, audioPid = -1;
912  if(((videoPid = m_mediaPlayer->rmf_getVideoPid()) != -1) &&
913  ((audioPid = m_mediaPlayer->rmf_getAudioPid()) != -1))
914  {
915  LOG_INFO("VideoPid = %d, AudioPid = %d", videoPid, audioPid);
916  m_lastAudioPid = audioPid;
917  m_lastVideoPid = videoPid;
918  std::vector<uint16_t> startPids;
919  std::vector<uint16_t> stopPids;
920  startPids.push_back(videoPid);
921  startPids.push_back(audioPid);
922 
923  m_casService->startStopDecrypt(startPids, stopPids);
924  }
925  else{
926  LOG_INFO("Failed to get the AV Pids. VideoPid = %d, AudioPid = %d", videoPid, audioPid);
927  }
928 #endif
929 }
930 
931 void RMFPlayer::languageChange()
932 {
933 #ifdef USE_EXTERNAL_CAS
934  LOG_INFO("Enter languageChange");
935  std::lock_guard<std::mutex> guard(cas_mutex);
936  if(m_casService)
937  {
938  int audioPid = -1;
939  if((m_lastAudioPid != -1) && (audioPid = m_mediaPlayer->rmf_getAudioPid()) != -1)
940  {
941  if(m_lastAudioPid != audioPid)
942  {
943  LOG_INFO("m_lastAudioPid = %d, AudioPid = %d", m_lastAudioPid, audioPid);
944  std::vector<uint16_t> startPids;
945  std::vector<uint16_t> stopPids;
946  startPids.push_back(audioPid);
947  stopPids.push_back(m_lastAudioPid);
948  m_casService->startStopDecrypt(startPids, stopPids);
949  m_lastAudioPid = audioPid;
950  }
951  else
952  {
953  LOG_INFO("No Change in Audio Pids m_lastAudioPid = %d, AudioPid = %d", m_lastAudioPid, audioPid);
954  }
955  }
956  else
957  {
958  LOG_INFO("Failed to get the Audio Pids. m_lastAudioPid = %d, AudioPid = %d", m_lastAudioPid, audioPid);
959  }
960  }
961  else
962  {
963  LOG_INFO("CAS Service not available");
964  }
965 #endif
966 }
967 
968 void RMFPlayer::psiUpdateReceived(uint8_t psiStatus)
969 {
970 #ifdef USE_EXTERNAL_CAS
971  LOG_INFO("Enter psiUpdateReceived\n");
972  std::lock_guard<std::mutex> guard(cas_mutex);
973  if(!m_casService)
974  {
975  LOG_INFO("m_casService not available");
976  return;
977  }
978  PSIInfo psiInfo;
979  bool hasBuffer = false;
980 
981  if((psiStatus & PAT_UPDATE) != 0)
982  {
983  if( getPATBuffer(psiInfo.pat) != 0)
984  {
985  LOG_INFO("get PSI buffers (PAT) Success");
986  hasBuffer = true;
987  }
988  }
989  else if( ((psiStatus & CAT_UPDATE) != 0) || ((psiStatus & CAT_ACQUIRE) != 0 && m_casPending) )
990  {
991  if( getCATBuffer(psiInfo.cat) != 0)
992  {
993  LOG_INFO("get PSI buffers (CAT) Success");
994  hasBuffer = true;
995  m_casPending = 0;
996  }
997  }
998  else if((psiStatus & PMT_UPDATE) != 0)
999  {
1000  if( getPMTBuffer(psiInfo.pmt) != 0)
1001  {
1002  LOG_INFO("get PSI buffers (PMT) Success");
1003  hasBuffer = true;
1004  }
1005  }
1006 
1007  if(hasBuffer)
1008  {
1009  m_casService->updatePSI(psiInfo.pat,psiInfo.pmt,psiInfo.cat);
1010  }
1011 #endif
1012 }
1013 
1014 void RMFPlayer::pmtUpdate()
1015 {
1016 #ifdef USE_EXTERNAL_CAS
1017  LOG_INFO("Enter pmtUpdate\n");
1018  std::lock_guard<std::mutex> guard(cas_mutex);
1019  if(!m_casService)
1020  {
1021  LOG_INFO("m_casService not available");
1022  return;
1023  }
1024 
1025  int videoPid = -1, audioPid = -1;
1026 
1027  if(((videoPid = m_mediaPlayer->rmf_getVideoPid()) != -1) &&
1028  ((audioPid = m_mediaPlayer->rmf_getAudioPid()) != -1))
1029  {
1030  LOG_INFO("VideoPid = %d, AudioPid = %d", videoPid, audioPid);
1031  std::vector<uint16_t> startPids;
1032  std::vector<uint16_t> stopPids;
1033 
1034  if(videoPid != m_lastVideoPid)
1035  {
1036  startPids.push_back(videoPid);
1037  stopPids.push_back(m_lastVideoPid);
1038  }
1039  if(audioPid != m_lastAudioPid)
1040  {
1041  startPids.push_back(audioPid);
1042  stopPids.push_back(m_lastAudioPid);
1043  }
1044  m_lastVideoPid = videoPid;
1045  m_lastAudioPid = audioPid;
1046 
1047  if ((startPids.size() != 0) || (stopPids.size() != 0))
1048  {
1049  m_casService->startStopDecrypt(startPids, stopPids);
1050  }
1051  else
1052  {
1053  LOG_INFO("No change in PIDs, not call startStopDecrypt");
1054  }
1055  }
1056  else
1057  {
1058  LOG_ERROR("Failed to get the AV Pids. VideoPid = %d, AudioPid = %d", videoPid, audioPid);
1059  }
1060 #endif
1061 }
1062 
1063 int RMFPlayer::getCurrentAudioPid()
1064 {
1065 #ifdef USE_EXTERNAL_CAS
1066  return m_lastAudioPid;
1067 #endif
1068 }
1069 
1070 int RMFPlayer::get_section_length(vector<uint8_t>sectionDataBuffer)
1071 {
1072 #ifdef USE_EXTERNAL_CAS
1073  int nSect = (((sectionDataBuffer[1]<<8)|(sectionDataBuffer[2]<<0))&0xFFF);
1074  RDK_LOG(RDK_LOG_INFO, "LOG.RDK.INBSI", "section_length %d, sectionDataBuffer.size() - %d \n", nSect, sectionDataBuffer.size());
1075  return nSect;
1076 #endif
1077 }
1078 
1079 vector<uint8_t> RMFPlayer::get_multiple_section_data(vector<uint8_t>&sectionDataBuffer, int sectionSize)
1080 {
1081 #ifdef USE_EXTERNAL_CAS
1082  std::vector<uint8_t> sectionDataParsed (sectionDataBuffer.begin(), sectionDataBuffer.begin() + sectionSize);
1083  sectionDataBuffer.erase(sectionDataBuffer.begin(), sectionDataBuffer.begin() + sectionSize);
1084  RDK_LOG(RDK_LOG_INFO, "LOG.RDK.INBSI", "get_multiple_section_data sectionDataBuffer.size() - %d, parsed - %d\n", sectionDataBuffer.size(),sectionDataParsed.size());
1085  return sectionDataParsed;
1086 #endif
1087 }
1088 
1089 void RMFPlayer::sectionDataReceived()
1090 {
1091 #ifdef USE_EXTERNAL_CAS
1092  LOG_INFO("sectionDataReceived");
1093  uint32_t filterId = 0;
1094  std::vector<uint8_t> sectionData;
1095  int sectionLength = 0;
1096  do {
1097  m_mediaPlayer->getSectionData(&filterId, sectionData);
1098  std::lock_guard<std::mutex> guard(cas_mutex);
1099  if(!filterId )
1100  {
1101  RDK_LOG(RDK_LOG_DEBUG, "LOG.RDK.INBSI", "filterId not available");
1102  return;
1103  }
1104  if(!m_casService)
1105  {
1106  LOG_ERROR("m_casService not available\n");
1107  return;
1108  }
1109  sectionLength = get_section_length(sectionData);
1110  RDK_LOG(RDK_LOG_DEBUG, "LOG.RDK.INBSI", "sectionLength %d, sectionData.size() - %d\n", sectionLength,(int)sectionData.size());
1111  while((int)sectionData.size() > (sectionLength + HEADER_SIZE)){
1112  std::vector<uint8_t> sectionDataParsed;
1113  sectionDataParsed = get_multiple_section_data(sectionData, (sectionLength + HEADER_SIZE));
1114  m_casService->processSectionData(filterId, sectionDataParsed);
1115  sectionLength = get_section_length(sectionData);
1116  };
1117 
1118  LOG_INFO("sectionDataReceived for Filter id = %d\n", filterId);
1119  m_casService->processSectionData(filterId, sectionData);
1120 
1121  }while(filterId);
1122 #endif
1123 }
1124 
1125 //MediaPlayerClient impl end
1126 
1127 void RMFPlayer::doTimeUpdate(bool forced)
1128 {
1129  if (!m_isLoaded)
1130  return;
1131 
1132  refreshCachedCurrentTime(forced);
1133 
1134  if (m_duration != m_lastReportedDuration)
1135  {
1136  m_lastReportedDuration = m_duration;
1137  }
1138  if (m_currentTime != m_lastReportedCurrentTime)
1139  {
1140  m_lastReportedCurrentTime = m_currentTime;
1141  getParent()->getEventEmitter().send(OnProgressEvent(this));
1142  }
1143 }
1144 
1145 void RMFPlayer::startPlaybackProgressMonitor()
1146 {
1147  if (m_playbackProgressMonitorTag != 0)
1148  return;
1149  static const auto triggerTimeUpdateFunc = [](gpointer data) -> gboolean {
1150  RMFPlayer &self = *static_cast<RMFPlayer*>(data);
1151  self.doTimeUpdate();
1152  return G_SOURCE_CONTINUE;
1153  };
1154  LOG_INFO("WMR startPlaybackProgressMonitor starting timer");
1155  m_playbackProgressMonitorTag = g_timeout_add(kProgressMonitorTimeoutMs, triggerTimeUpdateFunc, this);
1156 }
1157 
1158 void RMFPlayer::stopPlaybackProgressMonitor()
1159 {
1160  LOG_INFO("WMR stopPlaybackProgressMonitor");
1161  if (m_playbackProgressMonitorTag)
1162  g_source_remove(m_playbackProgressMonitorTag);
1163  m_playbackProgressMonitorTag = 0;
1164  m_lastRefreshTime = 0;
1165 }
1166 
1167 bool RMFPlayer::refreshCachedCurrentTime(bool forced)
1168 {
1169  if (!m_isLoaded)
1170  return false;
1171 
1172  gint64 now = g_get_monotonic_time();
1173  if (!forced && m_currentTime > 0.f && (now - m_lastRefreshTime) < kRefreshCachedTimeThrottleMs * 1000)
1174  return false;
1175 
1176  m_duration = m_mediaPlayer->rmf_getDuration();
1177  m_currentTime = m_mediaPlayer->rmf_getCurrentTime();
1178  m_lastRefreshTime = now;
1179 
1180  return true;
1181 }
1182 
1183 bool RMFPlayer::endedPlayback() const
1184 {
1185  float dur = m_mediaPlayer->rmf_getDuration();
1186  if (!std::isnan(dur))
1187  return false;
1188  if (m_videoState < MediaPlayer::RMF_VIDEO_BUFFER_HAVEMETADATA)
1189  return false;
1190  int rate = m_mediaPlayer->rmf_getRate();
1191  float now = m_mediaPlayer->rmf_getCurrentTime();
1192  if (rate > 0)
1193  return dur > 0 && now >= dur;
1194  if (rate < 0)
1195  return now <= 0;
1196  return false;
1197 }
1198 
1199 bool RMFPlayer::couldPlayIfEnoughData() const
1200 {
1201  if (m_videoState >= MediaPlayer::RMF_VIDEO_BUFFER_HAVEMETADATA && m_playerState >= MediaPlayer::RMF_PLAYER_FORMATERROR)
1202  return false;
1203  else
1204  return !m_mediaPlayer->rmf_isPaused() && !endedPlayback();
1205 }
1206 
1207 bool RMFPlayer::potentiallyPlaying() const
1208 {
1209  bool pausedToBuffer = (m_videoStateMaximum >= MediaPlayer::RMF_VIDEO_BUFFER_HAVEFUTUREDATA) && (m_videoState < MediaPlayer::RMF_VIDEO_BUFFER_HAVEFUTUREDATA);
1210  return (pausedToBuffer || m_videoState >= MediaPlayer::RMF_VIDEO_BUFFER_HAVEFUTUREDATA) && couldPlayIfEnoughData();
1211 }
1212 
1213 bool RMFPlayer::setContentType(const std::string &url, std::string& contentType)
1214 {
1215  const char* dvrStrIdentifier = "recordingId=";
1216  const char* liveStrIdentifier = "live=ocap://";
1217  const char* vodStrIdentifier = "live=vod://";
1218  const char* tuneStrIdentifier = "tune://";
1219 #ifdef ENABLE_RDKMEDIAPLAYER_TS_QAM_TEST
1220  const char* tsStrIdentifier = ".ts";
1221 #endif
1222 
1223  if (url.find(dvrStrIdentifier) != std::string::npos)
1224  {
1225  if (url.find("169.") != std::string::npos)
1226  {
1227  contentType = "mDVR";
1228  }
1229  else
1230  {
1231  contentType = "DVR";
1232  }
1233  }
1234  else if ((url.find(liveStrIdentifier) != std::string::npos) || (url.find(tuneStrIdentifier) != std::string::npos))
1235  {
1236  contentType = "LIVE";
1237  }
1238  else if (url.find(vodStrIdentifier) != std::string::npos)
1239  {
1240  contentType = "VOD";
1241  }
1242 #ifdef ENABLE_RDKMEDIAPLAYER_TS_QAM_TEST
1243  else if (url.find(tsStrIdentifier) != std::string::npos)
1244  {
1245  contentType = "LIVE";
1246  }
1247 #endif
1248  else
1249  {
1250  contentType = "Unsupported";
1251  return false;
1252  }
1253  return true;
1254 }
OnPausedEvent
Definition: rdkmediaplayerimpl.h:205
OnClosedEvent
Definition: rdkmediaplayerimpl.h:201
RDKMediaPlayer::updateVideoMetadata
void updateVideoMetadata(const std::string &languages, const std::string &speeds, int duration, int width, int height)
This API requests for OnMediaOpenedEvent() to be fired and updates the media data like speed,...
Definition: rdkmediaplayer.cpp:846
PSIInfo
Definition: casservice.h:36
CASService::informStatus
virtual void informStatus(const CASStatus &status) override
This API is invoked by CAS plugin when it requires to sends the CAS Status.
OnProgressEvent
Definition: rdkmediaplayerimpl.h:148
RDKMediaPlayer
Definition: rdkmediaplayer.h:52
CASService::initialize
bool initialize(bool management, const std::string &casOcdmId, PSIInfo *psiInfo)
This API to initialize the CAS Serivce includes casManager and casHelper.
MediaPlayer
Definition: mediaplayer.h:51
OnEISSDataReceivedEvent
Definition: rdkmediaplayerimpl.h:307
OnWarningEvent
Definition: rdkmediaplayerimpl.h:210
OnPlayingEvent
Definition: rdkmediaplayerimpl.h:204
CASService::startStopDecrypt
bool startStopDecrypt(const std::vector< uint16_t > &startPids, const std::vector< uint16_t > &stopPids)
This API to start/stop the decryption of the audio/video content.
CASService::isManagementSession
bool isManagementSession() const
This API is to check whether current one is for Managemnet or Tuning Session.
RDKMediaPlayer::getPlayStartTime
const gint64 & getPlayStartTime() const
Returns the player start time.
Definition: rdkmediaplayer.cpp:829
OnSpeedChangeEvent
Definition: rdkmediaplayerimpl.h:228
OnCompleteEvent
Definition: rdkmediaplayerimpl.h:206
RDK_LOG
#define RDK_LOG
Definition: rdk_debug.h:258
MediaPlayerGeneric
Definition: mediaplayergeneric.h:28
RDKMediaPlayer::getLoadStartTime
const gint64 & getLoadStartTime() const
Returns the value set using the function setLoadStartTime().
Definition: rdkmediaplayer.cpp:824
CASService
Definition: casservice.h:44
RDKMediaPlayer::onVidHandleReceived
void onVidHandleReceived(uint32_t handle)
This API receives the decoder handle and updates the closedcaption state.
Definition: rdkmediaplayer.cpp:839
OnCASDataEvent
Definition: rdkmediaplayerimpl.h:333
RMFPlayer
Definition: rmfplayer.h:48
ProgressData
Definition: rdkmediaplayerimpl.h:28
RDKMediaPlayerImpl
Definition: rdkmediaplayerimpl.h:40
MediaPlayerDLNA
Definition: mediaplayerdlna.h:45
CASService::processSectionData
void processSectionData(const uint32_t &filterId, const std::vector< uint8_t > &data)
This API is invoked by CAS plugin when it requires to push data.
RDKMediaPlayer::getSetURLTime
const gint64 & getSetURLTime() const
Returns the system monotonic time.
Definition: rdkmediaplayer.cpp:819
RDKMediaPlayer::stop
rtError stop()
This API stops the stream and releases unnecessary resources.
Definition: rdkmediaplayer.cpp:624
OnErrorEvent
Definition: rdkmediaplayerimpl.h:219
LOG_INFO
#define LOG_INFO(AAMP_JS_OBJECT, FORMAT,...)
Definition: jsutils.h:39
IntRect
Definition: intrect.h:22
CASService::casPublicData
void casPublicData(const std::vector< uint8_t > &data)
This API is invoked by CAS plugin when it requires to push data.
OnMetricLogEvent
Definition: rdkmediaplayerimpl.h:316
RDKMediaPlayer::getEventEmitter
EventEmitter & getEventEmitter()
This function is used to trigger the events.
Definition: rdkmediaplayer.cpp:834
CASService::updatePSI
void updatePSI(const std::vector< uint8_t > &pat, const std::vector< uint8_t > &pmt, const std::vector< uint8_t > &cat)
This API is updatePSI when PAT/PMT/CAT updates.
LOG_TRACE
#define LOG_TRACE
Definition: rdk_debug_priv.c:83