19 #include "rmfplayer.h"
20 #include "rdkmediaplayer.h"
26 #include "mediaplayerdlna.h"
27 #include "mediaplayergeneric.h"
28 #ifdef USE_EXTERNAL_CAS
32 #define TO_MS(x) (uint32_t)( (x) / 1000)
33 #define TUNE_LOG_MAX_SIZE 100
38 const guint kProgressMonitorTimeoutMs = 250;
39 const guint kRefreshCachedTimeThrottleMs = 100;
42 #ifdef USE_EXTERNAL_CAS
46 casOcdmId_ = casOcdmId;
47 casManager_ = CASManager::createInstance(casSFInterface_, casPipelineInterface_);
51 LOG_INFO(
"Failed to create casManager");
55 bManagementSession_ = management;
56 if(env_.getUsageManagement() == CAS_USAGE_MANAGEMENT_FULL) {
57 bManagementSession_ =
true;
60 bManagementSession_ = management;
62 LOG_INFO(
"Management = %d", bManagementSession_);
64 if(bManagementSession_ && (psiInfo == NULL)) {
65 casHelper_ = casManager_->createHelper(casOcdmId, env_);
68 casHelper_ = casManager_->createHelper(psiInfo->pat, psiInfo->pmt, psiInfo->cat, env_);
80 LOG_INFO(
"[%s:%d] - Enter\n", __FUNCTION__, __LINE__);
83 LOG_INFO(
"casHelper_ Not available");
87 casHelper_->registerStatusInformant(
this);
89 CASHelper::CASStartStatus status = casHelper_->startStopDecrypt(startPids, stopPids);
93 case CASHelper::CASStartStatus::OK:
94 LOG_INFO(
"Everything was created and CAS Started, there is no need to wait for status");
97 case CASHelper::CASStartStatus::WAIT:
98 LOG_INFO(
"verything was created but the CAS has not started yet...");
100 case CASHelper::CASStartStatus::ERROR:
104 LOG_INFO(
"Invalid CAS start status");
110 void CASService::updatePSI(
const std::vector<uint8_t>& pat,
const std::vector<uint8_t>& pmt,
const std::vector<uint8_t>& cat)
112 LOG_INFO(
"[%s:%d] - Enter\n", __FUNCTION__, __LINE__);
115 casHelper_->updatePSI(pat, pmt, cat);
119 LOG_ERROR(
"[%s:%d] Failed to send CASService updatePSI \n", __FUNCTION__, __LINE__);
124 LOG_INFO(
"[%s:%d] Inform Status back to Source = %d\n", __FUNCTION__, __LINE__, status);
125 if(status == CASStatusInform::CASStatus_OK)
127 casPipelineInterface_->unmuteAudio();
133 LOG_INFO(
"casPublicData - Received");
135 casData.assign(data.begin(), data.end());
136 LOG_INFO(
"casPublicData - %s\n", casData.c_str());
142 LOG_INFO(
"processSectionData - CAS Service");
145 casManager_->processData(filterId, data);
149 LOG_ERROR(
"processSectionData - CASManager NULL");
155 LOG_INFO(
"[%s:%d] - Enter\n", __FUNCTION__, __LINE__);
156 return bManagementSession_;
159 ICasFilterStatus RMFPlayer::create(uint16_t pid, ICasFilterParam ¶m, ICasHandle **pHandle) {
160 LOG_INFO(
"create - CAS Upstream to Create Filter");
161 uint32_t filterId = 0;
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++)
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];
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;
184 return ICasFilterStatus_NoError;
187 ICasFilterStatus RMFPlayer::setState(
bool isRunning, ICasHandle* handle) {
188 LOG_INFO(
"setState - CAS Upstream to Create Filter");
189 uint32_t filterId = handle->filterId;
194 m_mediaPlayer->pauseFilter(filterId);
197 return ICasFilterStatus_NoError;
200 ICasFilterStatus RMFPlayer::start(ICasHandle* handle) {
201 LOG_INFO(
"start - CAS Upstream to Create Filter");
202 uint32_t filterId = handle->filterId;
204 m_mediaPlayer->resumeFilter(filterId);
205 return ICasFilterStatus_NoError;
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;
216 void RMFPlayer::unmuteAudio()
218 #ifdef USE_EXTERNAL_CAS
219 LOG_INFO(
"[%s:%d] - Enter\n", __FUNCTION__, __LINE__);
220 if(m_mediaPlayer->getAudioMute())
223 m_mediaPlayer->rmf_setAudioMute(
false);
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;
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())
238 LOG_INFO(
"setKeySlot - Setting Video Key Slot, pid = %d", pid);
239 m_mediaPlayer->rmf_setVideoKeySlot(keyHandle);
241 else if (pid == m_mediaPlayer->rmf_getAudioPid())
243 LOG_INFO(
"setKeySlot - Setting Audio Key Slot, pid = %d", pid);
244 m_mediaPlayer->rmf_setAudioKeySlot(keyHandle);
248 LOG_INFO(
"setKeySlot - Invalid Pid - Not either Audio/Video Pid currently playing");
249 ret = RMF_RESULT_FAILURE;
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);
258 if(pid == m_mediaPlayer->rmf_getVideoPid())
260 LOG_INFO(
"deleteKeySlot - deleting Video Key Slot, pid = %d", pid);
261 m_mediaPlayer->rmf_deleteVideoKeySlot();
263 else if (pid == m_mediaPlayer->rmf_getAudioPid())
265 LOG_INFO(
"deleteKeySlot - deleting Audio Key Slot, pid = %d", pid);
266 m_mediaPlayer->rmf_deleteAudioKeySlot();
270 LOG_INFO(
"deleteKeySlot - Invalid Pid - Not either Audio/Video Pid currently playing");
271 ret = RMF_RESULT_FAILURE;
276 uint32_t RMFPlayer::getPATBuffer(std::vector<uint8_t>& patBuf) {
277 return m_mediaPlayer->getPATBuffer(patBuf);
280 uint32_t RMFPlayer::getPMTBuffer(std::vector<uint8_t>& pmtBuf) {
281 return m_mediaPlayer->getPMTBuffer(pmtBuf);
284 uint32_t RMFPlayer::getCATBuffer(std::vector<uint8_t>& catBuf) {
285 return m_mediaPlayer->getCATBuffer(catBuf);
289 bool RMFPlayer::canPlayURL(
const std::string& url)
291 std::string contentType;
292 return RMFPlayer::setContentType(url, contentType);
301 m_lastReportedCurrentTime(0.f),
303 m_lastReportedDuration(0.f),
304 m_lastReportedPlaybackRate(0.f),
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),
314 m_playbackProgressMonitorTag(0)
318 RMFPlayer::~RMFPlayer()
323 bool RMFPlayer::doCanPlayURL(
const std::string& url)
325 return RMFPlayer::canPlayURL(url);
328 void RMFPlayer::doInit()
332 void RMFPlayer::doLoad(
const std::string& url)
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;
342 #ifdef USE_EXTERNAL_CAS
349 if (MediaPlayerDLNA::supportsUrl(url))
354 setContentType(url, m_contentType);
358 m_isLoaded = m_mediaPlayer->rmf_load(url);
360 m_loadedTime = g_get_monotonic_time();
362 m_loadCompleteTime = g_get_monotonic_time();
365 bool RMFPlayer::isManagementSession()
const
367 LOG_INFO(
"[%s:%d] - Enter\n", __FUNCTION__, __LINE__);
368 #ifdef USE_EXTERNAL_CAS
369 std::lock_guard<std::mutex> guard(cas_mutex);
372 return m_casService->isManagementSession();
383 #ifdef USE_EXTERNAL_CAS
384 void RMFPlayer::open(
const std::string& openData)
386 LOG_INFO(
"[%s:%d] - Enter\n", __FUNCTION__, __LINE__);
389 json_t *root = json_loads(openData.c_str(), 0, &error);
391 LOG_INFO(
"json error on line %d: %s\n", error.line, error.text);
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"));
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; }
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; }
413 CASEnvironment env{ mediaUrl, mode_val, manage_val, initData};
415 std::lock_guard<std::mutex> guard(cas_mutex);
416 m_casService =
new CASService(getParent()->getEventEmitter(), env,
this,
this);
418 LOG_INFO(
"Successfully created m_casService");
421 LOG_INFO(
"Failed to create m_casService");
424 if(casOcdmId.empty())
426 LOG_INFO(
"Missing casocdmid which is mandatory to create management session.");
428 else if(manage ==
"MANAGE_NO_PSI" || manage ==
"MANAGE_NO_TUNER")
430 if(m_casService && m_casService->initialize(
true, casOcdmId, NULL) ==
false)
434 LOG_INFO(
"Failed to create Management Session");
439 LOG_INFO(
"Invalid Manage option: %s", manage.c_str());
445 void RMFPlayer::registerCASData()
447 LOG_INFO(
"[%s:%d] - Enter\n", __FUNCTION__, __LINE__);
448 std::lock_guard<std::mutex> guard(cas_mutex);
450 std::shared_ptr<CASHelper> casHelper = m_casService->getCasHelper();
452 casHelper->registerDataListener(m_casService);
456 LOG_INFO(
"No Management Session - Invalid Operation");
460 void RMFPlayer::sendCASData(
const std::string& data)
462 LOG_INFO(
"[%s:%d] - Enter\n", __FUNCTION__, __LINE__);
463 std::lock_guard<std::mutex> guard(cas_mutex);
467 json_t *root = json_loads(data.c_str(), 0, &error);
470 std::string strPayload = json_string_value(json_object_get(root,
"payload"));
472 std::vector<uint8_t> payload;
473 payload.assign(strPayload.begin(), strPayload.end());
475 std::shared_ptr<CASHelper> casHelper = m_casService->getCasHelper();
477 casHelper->sendData(payload);
482 LOG_INFO(
"json error on line %d: %s\n", error.line, error.text);
486 LOG_INFO(
"No Management Session - Invalid Operation");
490 void RMFPlayer::destroy(
const std::string& casOcdmId)
492 LOG_INFO(
"[%s:%d] - Enter\n", __FUNCTION__, __LINE__);
493 std::lock_guard<std::mutex> guard(cas_mutex);
500 LOG_INFO(
"No Management Session - Invalid Operation");
505 void RMFPlayer::doSetVideoRectangle(
const IntRect& rect)
507 if (rect.width() > 0 && rect.height() > 0)
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());
514 void RMFPlayer::doSetAudioLanguage(std::string& lang)
516 m_mediaPlayer->rmf_setAudioMute(
true);
517 LOG_INFO(
"set lang: %s", lang.c_str());
518 m_mediaPlayer->rmf_setAudioLanguage(lang);
521 void RMFPlayer::doPlay()
524 if (!m_mediaPlayer->rmf_canItPlay())
526 LOG_INFO(
"cannot play, skip play()");
529 if (m_isPaused || m_mediaPlayer->rmf_isPaused())
532 m_mediaPlayer->rmf_play();
533 if (m_videoState >= MediaPlayer::RMF_VIDEO_BUFFER_HAVEFUTUREDATA)
541 LOG_INFO(
"not paused, skip play()");
543 m_playEndTime = g_get_monotonic_time();
544 startPlaybackProgressMonitor();
547 void RMFPlayer::doPause()
549 if (!m_mediaPlayer->rmf_isPaused())
553 m_mediaPlayer->rmf_pause();
559 void RMFPlayer::doSetPosition(
float position)
561 if (!std::isnan(position))
563 LOG_INFO(
"set currentTime: %f", position);
564 m_mediaPlayer->rmf_seek(position/1000);
569 void RMFPlayer::doSeekToLive()
571 if (m_mediaPlayer->rmf_isItInProgressRecording())
573 if (m_mediaPlayer->rmf_getRate() != 1.f)
576 m_mediaPlayer->rmf_setRate(1.f);
579 m_mediaPlayer->rmf_seekToLivePosition();
584 void RMFPlayer::doStop()
586 LOG_INFO(
"[%s:%d] Enter\n", __FUNCTION__, __LINE__);
589 stopPlaybackProgressMonitor();
590 #ifdef USE_EXTERNAL_CAS
591 std::lock_guard<std::mutex> guard(cas_mutex);
594 std::shared_ptr<CASHelper> casHelper = m_casService->getCasHelper();
596 casHelper->setState(CASHelper::CASHelperState::PAUSED);
598 std::vector<uint16_t> startPids;
599 std::vector<uint16_t> stopPids;
600 uint16_t pid = m_mediaPlayer->rmf_getVideoPid();
604 stopPids.push_back(pid);
606 pid = m_mediaPlayer->rmf_getAudioPid();
610 stopPids.push_back(pid);
612 if (stopPids.size() > 0)
614 m_casService->startStopDecrypt(startPids, stopPids);
624 m_mediaPlayer->rmf_stop();
626 #ifdef USE_EXTERNAL_CAS
635 void RMFPlayer::doChangeSpeed(
float speed, int32_t overshootTime)
638 LOG_INFO(
"doChangeSpeed(%f, %d)", speed, overshootTime);
639 m_mediaPlayer->rmf_changeSpeed(speed, overshootTime);
642 void RMFPlayer::doSetSpeed(
float speed)
644 if (m_mediaPlayer->rmf_getRate() != speed)
647 m_mediaPlayer->rmf_setRate(speed);
651 void RMFPlayer::doSetBlocked(
bool blocked)
653 if (m_mediaPlayer->rmf_isMuted() != blocked)
655 LOG_INFO(
"set mute: %s", blocked ?
"true" :
"false");
656 m_mediaPlayer->rmf_setMute(blocked);
660 void RMFPlayer::doSetEISSFilterStatus(
bool status)
662 LOG_INFO(
"set EISS Filter Status: %s", status?
"true" :
"false");
663 m_mediaPlayer->rmf_setEissFilterStatus(status);
666 void RMFPlayer::doSetVolume(
float volume)
669 if(!getParent()->getIsBlocked() && volume > 0)
670 m_mediaPlayer->rmf_setMute(
false);
671 m_mediaPlayer->rmf_setVolume(volume);
674 void RMFPlayer::doSetIsInProgressRecording(
bool isInProgressRecording)
676 LOG_TRACE(
"set isInProgressRecording: %s", isInProgressRecording ?
"true" :
"false");
677 m_mediaPlayer->rmf_setInProgressRecording(isInProgressRecording);
680 void RMFPlayer::doSetZoom(
int zoom)
682 LOG_INFO(
"set videoZoom: %d", zoom);
683 m_mediaPlayer->rmf_setVideoZoom(zoom);
686 void RMFPlayer::doSetNetworkBufferSize(int32_t networkBufferSize)
688 LOG_INFO(
"set networkBufferSize: %d", networkBufferSize);
689 m_mediaPlayer->rmf_setNetworkBufferSize(networkBufferSize);
692 void RMFPlayer::doSetVideoBufferLength(
float videoBufferLength)
694 LOG_TRACE(
"set videoBufferLength: %f", videoBufferLength);
695 m_mediaPlayer->rmf_setVideoBufferLength(videoBufferLength);
698 void RMFPlayer::getProgressData(
ProgressData* progressData)
700 progressData->position = m_lastReportedCurrentTime;
701 progressData->duration = m_lastReportedDuration;
702 progressData->speed = m_lastReportedPlaybackRate;
703 progressData->start = -1;
704 progressData->end = -1;
710 void RMFPlayer::mediaPlayerEngineUpdated()
714 void RMFPlayer::mediaPlaybackCompleted()
720 void RMFPlayer::mediaFrameReceived()
722 std::string tuneTimeLog;
725 m_firstFrameTime = g_get_monotonic_time();
727 if (m_loadStartTime == 0 || m_loadStartTime > m_setURLTime)
728 m_loadStartTime = m_setURLTime;
730 char buffer[TUNE_LOG_MAX_SIZE];
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),
735 TO_MS(m_loadCompleteTime - m_loadStartTime),
736 TO_MS(m_playEndTime - m_playStartTime),
737 TO_MS(m_firstFrameTime - m_playStartTime),
738 TO_MS(m_firstFrameTime - m_loadStartTime));
742 tuneTimeLog = std::string(buffer, len);
747 m_setURLTime = m_loadStartTime = 0;
750 const std::string& lang = m_mediaPlayer->rmf_getAudioLanguages();
752 std::string speeds =
"-60.0, -30.0, -15.0, -4.0, 1.0, 0.5, 4.0, 15.0, 30.0, 60.0";
754 if (!tuneTimeLog.empty())
761 void RMFPlayer::mediaWarningReceived()
765 uint32_t code = m_mediaPlayer->rmf_getMediaWarnData();
766 const std::string& description = m_mediaPlayer->rmf_getMediaWarnDescription();
770 void RMFPlayer::eissDataReceived()
774 const std::string& eissData = m_mediaPlayer->rmf_getEISSDataBuffer();
778 void RMFPlayer::volumeChanged(
float volume)
782 void RMFPlayer::playerStateChanged()
784 MediaPlayer::RMFPlayerState oldState = m_playerState;
785 MediaPlayer::RMFPlayerState newState = m_mediaPlayer->rmf_playerState();
786 if (newState == oldState)
789 LOG_INFO(
"oldState=%s newState=%s", StateString(oldState), StateString(newState));
791 if (newState == MediaPlayer::RMF_PLAYER_FORMATERROR ||
792 newState == MediaPlayer::RMF_PLAYER_NETWORKERROR ||
793 newState == MediaPlayer::RMF_PLAYER_DECODEERROR)
795 uint32_t code =
static_cast<uint32_t
>(m_mediaPlayer->rmf_playerState());
796 const std::string& description = m_mediaPlayer->rmf_getMediaErrorMessage();
800 m_playerState = newState;
803 void RMFPlayer::videoStateChanged()
805 MediaPlayer::RMFVideoBufferState oldState = m_videoState;
806 MediaPlayer::RMFVideoBufferState newState = m_mediaPlayer->rmf_videoState();
807 if (newState == oldState)
810 LOG_INFO(
"oldState=%s newState=%s", StateString(oldState), StateString(newState));
812 m_videoState = newState;
813 if (oldState > m_videoStateMaximum)
814 m_videoStateMaximum = oldState;
816 bool isPotentiallyPlaying = potentiallyPlaying();
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);
826 bool isPlaying =
false;
827 if (isPotentiallyPlaying)
829 isPlaying = (newState >= MediaPlayer::RMF_VIDEO_BUFFER_HAVEFUTUREDATA && oldState <= MediaPlayer::RMF_VIDEO_BUFFER_HAVECURRENTDATA);
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)
847 void RMFPlayer::durationChanged()
852 void RMFPlayer::timeChanged()
857 void RMFPlayer::rateChanged()
859 float rate = m_mediaPlayer->rmf_getRate();
860 if (rate != m_lastReportedPlaybackRate)
862 m_lastReportedPlaybackRate = rate;
869 void RMFPlayer::videoDecoderHandleReceived()
874 void RMFPlayer::psiReady()
876 #ifdef USE_EXTERNAL_CAS
877 LOG_INFO(
"[%s:%d] - Enter\n", __FUNCTION__, __LINE__);
880 if( getPATBuffer(psiInfo.pat) == 0 ||
881 getPMTBuffer(psiInfo.pmt) == 0 )
883 LOG_INFO(
"Failed to get PSI buffers (PAT or PMT or CAT)");
886 std::lock_guard<std::mutex> guard(cas_mutex);
887 if( getCATBuffer(psiInfo.cat) == 0 )
889 LOG_INFO(
"Failed to get CAT buffer");
896 if(!m_casService || m_casService->initialize(
false,
"", &psiInfo) ==
false)
901 LOG_INFO(
"Failed to create Tuning Session for CAS");
905 if(m_casService->isManagementSession())
907 LOG_INFO(
"Managemnet Session - No stopStartDecrypt");
911 int videoPid = -1, audioPid = -1;
912 if(((videoPid = m_mediaPlayer->rmf_getVideoPid()) != -1) &&
913 ((audioPid = m_mediaPlayer->rmf_getAudioPid()) != -1))
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);
923 m_casService->startStopDecrypt(startPids, stopPids);
926 LOG_INFO(
"Failed to get the AV Pids. VideoPid = %d, AudioPid = %d", videoPid, audioPid);
931 void RMFPlayer::languageChange()
933 #ifdef USE_EXTERNAL_CAS
935 std::lock_guard<std::mutex> guard(cas_mutex);
939 if((m_lastAudioPid != -1) && (audioPid = m_mediaPlayer->rmf_getAudioPid()) != -1)
941 if(m_lastAudioPid != audioPid)
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;
953 LOG_INFO(
"No Change in Audio Pids m_lastAudioPid = %d, AudioPid = %d", m_lastAudioPid, audioPid);
958 LOG_INFO(
"Failed to get the Audio Pids. m_lastAudioPid = %d, AudioPid = %d", m_lastAudioPid, audioPid);
963 LOG_INFO(
"CAS Service not available");
968 void RMFPlayer::psiUpdateReceived(uint8_t psiStatus)
970 #ifdef USE_EXTERNAL_CAS
971 LOG_INFO(
"Enter psiUpdateReceived\n");
972 std::lock_guard<std::mutex> guard(cas_mutex);
975 LOG_INFO(
"m_casService not available");
979 bool hasBuffer =
false;
981 if((psiStatus & PAT_UPDATE) != 0)
983 if( getPATBuffer(psiInfo.pat) != 0)
985 LOG_INFO(
"get PSI buffers (PAT) Success");
989 else if( ((psiStatus & CAT_UPDATE) != 0) || ((psiStatus & CAT_ACQUIRE) != 0 && m_casPending) )
991 if( getCATBuffer(psiInfo.cat) != 0)
993 LOG_INFO(
"get PSI buffers (CAT) Success");
998 else if((psiStatus & PMT_UPDATE) != 0)
1000 if( getPMTBuffer(psiInfo.pmt) != 0)
1002 LOG_INFO(
"get PSI buffers (PMT) Success");
1009 m_casService->updatePSI(psiInfo.pat,psiInfo.pmt,psiInfo.cat);
1014 void RMFPlayer::pmtUpdate()
1016 #ifdef USE_EXTERNAL_CAS
1018 std::lock_guard<std::mutex> guard(cas_mutex);
1021 LOG_INFO(
"m_casService not available");
1025 int videoPid = -1, audioPid = -1;
1027 if(((videoPid = m_mediaPlayer->rmf_getVideoPid()) != -1) &&
1028 ((audioPid = m_mediaPlayer->rmf_getAudioPid()) != -1))
1030 LOG_INFO(
"VideoPid = %d, AudioPid = %d", videoPid, audioPid);
1031 std::vector<uint16_t> startPids;
1032 std::vector<uint16_t> stopPids;
1034 if(videoPid != m_lastVideoPid)
1036 startPids.push_back(videoPid);
1037 stopPids.push_back(m_lastVideoPid);
1039 if(audioPid != m_lastAudioPid)
1041 startPids.push_back(audioPid);
1042 stopPids.push_back(m_lastAudioPid);
1044 m_lastVideoPid = videoPid;
1045 m_lastAudioPid = audioPid;
1047 if ((startPids.size() != 0) || (stopPids.size() != 0))
1049 m_casService->startStopDecrypt(startPids, stopPids);
1053 LOG_INFO(
"No change in PIDs, not call startStopDecrypt");
1058 LOG_ERROR(
"Failed to get the AV Pids. VideoPid = %d, AudioPid = %d", videoPid, audioPid);
1063 int RMFPlayer::getCurrentAudioPid()
1065 #ifdef USE_EXTERNAL_CAS
1066 return m_lastAudioPid;
1070 int RMFPlayer::get_section_length(vector<uint8_t>sectionDataBuffer)
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());
1079 vector<uint8_t> RMFPlayer::get_multiple_section_data(vector<uint8_t>§ionDataBuffer,
int sectionSize)
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;
1089 void RMFPlayer::sectionDataReceived()
1091 #ifdef USE_EXTERNAL_CAS
1093 uint32_t filterId = 0;
1094 std::vector<uint8_t> sectionData;
1095 int sectionLength = 0;
1097 m_mediaPlayer->getSectionData(&filterId, sectionData);
1098 std::lock_guard<std::mutex> guard(cas_mutex);
1101 RDK_LOG(RDK_LOG_DEBUG,
"LOG.RDK.INBSI",
"filterId not available");
1106 LOG_ERROR(
"m_casService not available\n");
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);
1118 LOG_INFO(
"sectionDataReceived for Filter id = %d\n", filterId);
1119 m_casService->processSectionData(filterId, sectionData);
1127 void RMFPlayer::doTimeUpdate(
bool forced)
1132 refreshCachedCurrentTime(forced);
1134 if (m_duration != m_lastReportedDuration)
1136 m_lastReportedDuration = m_duration;
1138 if (m_currentTime != m_lastReportedCurrentTime)
1140 m_lastReportedCurrentTime = m_currentTime;
1145 void RMFPlayer::startPlaybackProgressMonitor()
1147 if (m_playbackProgressMonitorTag != 0)
1149 static const auto triggerTimeUpdateFunc = [](gpointer data) -> gboolean {
1151 self.doTimeUpdate();
1152 return G_SOURCE_CONTINUE;
1154 LOG_INFO(
"WMR startPlaybackProgressMonitor starting timer");
1155 m_playbackProgressMonitorTag = g_timeout_add(kProgressMonitorTimeoutMs, triggerTimeUpdateFunc,
this);
1158 void RMFPlayer::stopPlaybackProgressMonitor()
1160 LOG_INFO(
"WMR stopPlaybackProgressMonitor");
1161 if (m_playbackProgressMonitorTag)
1162 g_source_remove(m_playbackProgressMonitorTag);
1163 m_playbackProgressMonitorTag = 0;
1164 m_lastRefreshTime = 0;
1167 bool RMFPlayer::refreshCachedCurrentTime(
bool forced)
1172 gint64 now = g_get_monotonic_time();
1173 if (!forced && m_currentTime > 0.f && (now - m_lastRefreshTime) < kRefreshCachedTimeThrottleMs * 1000)
1176 m_duration = m_mediaPlayer->rmf_getDuration();
1177 m_currentTime = m_mediaPlayer->rmf_getCurrentTime();
1178 m_lastRefreshTime = now;
1183 bool RMFPlayer::endedPlayback()
const
1185 float dur = m_mediaPlayer->rmf_getDuration();
1186 if (!std::isnan(dur))
1188 if (m_videoState < MediaPlayer::RMF_VIDEO_BUFFER_HAVEMETADATA)
1190 int rate = m_mediaPlayer->rmf_getRate();
1191 float now = m_mediaPlayer->rmf_getCurrentTime();
1193 return dur > 0 && now >= dur;
1199 bool RMFPlayer::couldPlayIfEnoughData()
const
1201 if (m_videoState >= MediaPlayer::RMF_VIDEO_BUFFER_HAVEMETADATA && m_playerState >= MediaPlayer::RMF_PLAYER_FORMATERROR)
1204 return !m_mediaPlayer->rmf_isPaused() && !endedPlayback();
1207 bool RMFPlayer::potentiallyPlaying()
const
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();
1213 bool RMFPlayer::setContentType(
const std::string &url, std::string& contentType)
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";
1223 if (url.find(dvrStrIdentifier) != std::string::npos)
1225 if (url.find(
"169.") != std::string::npos)
1227 contentType =
"mDVR";
1231 contentType =
"DVR";
1234 else if ((url.find(liveStrIdentifier) != std::string::npos) || (url.find(tuneStrIdentifier) != std::string::npos))
1236 contentType =
"LIVE";
1238 else if (url.find(vodStrIdentifier) != std::string::npos)
1240 contentType =
"VOD";
1242 #ifdef ENABLE_RDKMEDIAPLAYER_TS_QAM_TEST
1243 else if (url.find(tsStrIdentifier) != std::string::npos)
1245 contentType =
"LIVE";
1250 contentType =
"Unsupported";