RDK Documentation (Open Sourced RDK Components)
rdkmediaplayer.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 "rdkmediaplayer.h"
20 #include <glib.h>
21 #include <string>
22 #include <limits>
23 #include <unistd.h>
24 #include "logger.h"
25 #include "rmfplayer.h"
26 #include "aampplayer.h"
27 #include "rmf_osal_init.h"
28 #include <jansson.h>
29 
31  rtObject& obj;
32  ReleaseOnScopeEnd(rtObject& o) : obj(o)
33  {
34  }
36  {
37  obj.Release();
38  }
39 };
40 
41 #define CALL_ON_MAIN_THREAD(body) \
42  do { \
43  this->AddRef(); \
44  g_timeout_add_full( \
45  G_PRIORITY_HIGH, \
46  0, \
47  [](gpointer data) -> gboolean \
48  { \
49  RDKMediaPlayer &self = *static_cast<RDKMediaPlayer*>(data); \
50  ReleaseOnScopeEnd releaseOnScopeEnd(self); \
51  body \
52  return G_SOURCE_REMOVE; \
53  }, \
54  this, \
55  0); \
56  } while(0)
57 
58 void stringToBool(rtString const& s, bool& b)
59 {
60  if(s.compare("true") == 0)
61  b = true;
62  else if(s.compare("false") == 0)
63  b = false;
64  //else b remains unchanged
65  //LOG_INFO("%s in=%s out=%d\n", __PRETTY_FUNCTION__, s.cString(), (int)b);
66 }
67 
68 void boolToString(bool b, rtString& s)
69 {
70  s = b ? rtString("true") : rtString("false");
71 }
72 
73 rtDefineObject (RDKMediaPlayer, rtObject);
74 rtDefineProperty (RDKMediaPlayer, url);
75 rtDefineProperty (RDKMediaPlayer, audioLanguage);
76 rtDefineProperty (RDKMediaPlayer, secondaryAudioLanguage);
77 rtDefineProperty (RDKMediaPlayer, position);
78 rtDefineProperty (RDKMediaPlayer, speed);
79 rtDefineProperty (RDKMediaPlayer, volume);
80 rtDefineProperty (RDKMediaPlayer, blocked);
81 rtDefineProperty (RDKMediaPlayer, isInProgressRecording);;
82 rtDefineProperty (RDKMediaPlayer, zoom);
83 rtDefineProperty (RDKMediaPlayer, networkBufferSize);
84 rtDefineProperty (RDKMediaPlayer, videoBufferLength);
85 rtDefineProperty (RDKMediaPlayer, eissFilterStatus);
86 rtDefineProperty (RDKMediaPlayer, loadStartTime);
87 rtDefineProperty (RDKMediaPlayer, closedCaptionsEnabled);
88 rtDefineProperty (RDKMediaPlayer, closedCaptionsOptions);
89 rtDefineProperty (RDKMediaPlayer, closedCaptionsTrack);
90 rtDefineProperty (RDKMediaPlayer, contentOptions);
91 rtDefineProperty (RDKMediaPlayer, autoPlay);
92 rtDefineProperty (RDKMediaPlayer, duration);
93 rtDefineProperty (RDKMediaPlayer, availableAudioLanguages);
94 rtDefineProperty (RDKMediaPlayer, availableClosedCaptionsLanguages);
95 rtDefineProperty (RDKMediaPlayer, availableSpeeds);
96 rtDefineProperty (RDKMediaPlayer, tsbEnabled);
97 rtDefineMethod (RDKMediaPlayer, setVideoRectangle);
98 rtDefineMethod (RDKMediaPlayer, play);
99 rtDefineMethod (RDKMediaPlayer, pause);
100 rtDefineMethod (RDKMediaPlayer, seekToLive);
101 rtDefineMethod (RDKMediaPlayer, stop);
102 rtDefineMethod (RDKMediaPlayer, changeSpeed);
103 rtDefineMethod (RDKMediaPlayer, setPositionRelative);
104 rtDefineMethod (RDKMediaPlayer, requestStatus);
105 rtDefineMethod (RDKMediaPlayer, setAdditionalAuth);
106 rtDefineMethod (RDKMediaPlayer, setListener);
107 rtDefineMethod (RDKMediaPlayer, delListener);
108 rtDefineMethod (RDKMediaPlayer, destroy);
109 rtDefineMethod (RDKMediaPlayer, open);
110 rtDefineMethod (RDKMediaPlayer, sendCASData);
111 
112 RDKMediaPlayer::RDKMediaPlayer() :
113  m_pImpl(0),
114  m_speed(1),
115  m_vidDecoderHandle(0),
116  m_duration(0.0f),
117  m_closedCaptionsEnabled(false),
118  m_urlQueued(false),
119  m_autoPlay(false)
120 {
121  m_closedCaptionsOptions["textSize"] = "";
122  m_closedCaptionsOptions["fontStyle"] = "";
123  m_closedCaptionsOptions["textForegroundColor"] = "";
124  m_closedCaptionsOptions["textForegroundOpacity"] = "";
125  m_closedCaptionsOptions["textBackgroundColor"] = "";
126  m_closedCaptionsOptions["textBackgroundOpacity"] = "";
127  m_closedCaptionsOptions["textItalicized"] = "";
128  m_closedCaptionsOptions["textUnderline"] = "";
129  m_closedCaptionsOptions["windowFillColor"] = "";
130  m_closedCaptionsOptions["windowFillOpacity"] = "";
131  m_closedCaptionsOptions["windowBorderEdgeColor"] = "";
132  m_closedCaptionsOptions["windowBorderEdgeStyle"] = "";
133  m_closedCaptionsOptions["textEdgeColor"] = "";
134  m_closedCaptionsOptions["textEdgeStyle"] = "";
135  m_closedCaptionsOptions["fontSize"] = "";
136  m_audioLanguage = "en";
137  m_loadStartTime = g_get_monotonic_time();//can be set more exactly via loadStartTime property
138 
139  m_seekTime = 0.0f; //CID 82876 - Initializing values
140  m_volume = 0.0f;
141  m_videoBufferLength = 0.0f;
142  m_zoom = 0;
143  m_networkBufferSize = 0;
144  m_overshootTime = 0;
145  m_isBlocked = false;
146  m_duration = 0;
147  m_tsbEnabled = false;
148  m_isInProgressRecording = false;
149  m_eissFilterStatus = false;
150  rmf_osal_init( "/etc/rmfconfig.ini", "/etc/debug.ini" );
151 }
152 
153 RDKMediaPlayer::~RDKMediaPlayer()
154 {
155  LOG_WARNING("Destroying RDKMediaPlayer (should almost NEVER happen!)");
156 }
157 
158 void RDKMediaPlayer::onInit()
159 {
160  LOG_INFO("%s\n", __PRETTY_FUNCTION__);
161 }
162 
163 // rtRemote properties
164 rtError RDKMediaPlayer::currentURL(rtString& s) const
165 {
166  s = m_currentURL.c_str();
167  return RT_OK;
168 }
169 
170 rtError RDKMediaPlayer::startQueuedTune()
171 {
172  LOG_INFO("enter %s\n", m_currentURL.c_str());
173 
174  m_urlQueued = false;
175 
176  if(m_currentURL.size() == 0)
177  return RT_OK;
178 
179  if(!m_pImpl || !m_pImpl->doCanPlayURL(m_currentURL))
180  m_pImpl = nullptr;
181 
182  if(!m_pImpl)
183  {
184  for(std::vector<RDKMediaPlayerImpl*>::iterator it = m_playerCache.begin(); it != m_playerCache.end(); ++it)
185  {
186  if( !((*it)->isManagementSession()) && (*it)->doCanPlayURL(m_currentURL) )
187  {
188  LOG_INFO("Reusing cached player");
189  m_pImpl = *it;
190  }
191  }
192  if(!m_pImpl)
193  {
194  if(AAMPPlayer::canPlayURL(m_currentURL))
195  {
196  LOG_INFO("Creating AAMPPlayer");
197  m_pImpl = new AAMPPlayer(this);
198  }
199  else
200  if(RMFPlayer::canPlayURL(m_currentURL))
201  {
202  LOG_INFO("Creating RMFPlayer");
203  m_pImpl = new RMFPlayer(this);
204  }
205  else
206  {
207  LOG_WARNING("Unsupported media type!");
208  return RT_FAIL;
209  }
210 
211  m_pImpl->doInit();
212  m_playerCache.push_back(m_pImpl);
214  }
215  }
216  CALL_ON_MAIN_THREAD (
217  LOG_INFO("Tuning player to %s\n", self.m_currentURL.c_str());
218  self.m_pImpl->setTuneState(TuneStart);
219  self.m_pImpl->doLoad(self.m_currentURL);
220  if(self.m_autoPlay)
221  self.play();
222  self.m_pImpl->doSetVideoRectangle(self.m_videoRect);
223  );
224  return RT_OK;
225 }
226 
227 rtError RDKMediaPlayer::setCurrentURL(rtString const& s)
228 {
229  m_seekTime = 0;
230  m_speed = 0;
231  m_setURLTime = g_get_monotonic_time();
232  m_currentURL = s.cString();
233  LOG_INFO("enter %s\n", m_currentURL.c_str());
234  m_urlQueued = true;
235  m_duration = 0;
236  m_vidDecoderHandle = 0;
237 
238  if(m_pImpl)
239  {
240  if(m_pImpl->getTuneState() == TuneStart)
241  {
242  LOG_INFO("stopping player\n");//CID:127658 - NO argument available
243  stop();
244  return RT_OK;
245  }
246  else if(m_pImpl->getTuneState() == TuneStop)
247  {
248  LOG_INFO("waiting on player to stop\n");//CID:127658 - NO argument available
249  return RT_OK;
250  }
251  }
252  LOG_INFO("calling startQueuedTune");
253  return startQueuedTune();
254 }
255 
256 rtError RDKMediaPlayer::audioLanguage(rtString& s) const
257 {
258  s = m_audioLanguage.c_str();
259  return RT_OK;
260 }
261 
262 rtError RDKMediaPlayer::setAudioLanguage(rtString const& s)
263 {
264  m_audioLanguage = s.cString();
265  LOG_INFO("%s %s\n", __PRETTY_FUNCTION__, m_audioLanguage.c_str());
266  if(m_pImpl)
267  {
268  CALL_ON_MAIN_THREAD(self.m_pImpl->doSetAudioLanguage(self.m_audioLanguage););
269  }
270  return RT_OK;
271 }
272 
273 rtError RDKMediaPlayer::secondaryAudioLanguage(rtString& s) const
274 {
275  s = m_secondaryAudioLanguage.c_str();
276  return RT_OK;
277 }
279 {
280  m_secondaryAudioLanguage = s.cString();
281  LOG_INFO("%s %s\n", __PRETTY_FUNCTION__, m_secondaryAudioLanguage.c_str());
282  return RT_OK;
283 }
284 
285 rtError RDKMediaPlayer::position(float& t) const
286 {
287  if(m_pImpl)
288  {
289  ProgressData pd;
290  m_pImpl->getProgressData(&pd);
291  t = pd.position;
292  }
293  else
294  t = 0;
295  return RT_OK;
296 }
297 
298 rtError RDKMediaPlayer::setPosition(float const& t)
299 {
300  LOG_INFO("%s %f\n", __PRETTY_FUNCTION__, t);
301  m_seekTime = t;
302  if(!m_pImpl)
303  return RT_OK;
304  CALL_ON_MAIN_THREAD(self.m_pImpl->doSetPosition(self.m_seekTime););
305  return RT_OK;
306 }
307 
308 rtError RDKMediaPlayer::speed(float& t) const
309 {
310  if(m_pImpl)
311  {
312  ProgressData pd;
313  m_pImpl->getProgressData(&pd);
314  t = pd.speed;
315  }
316  else
317  t = 0;
318  return RT_OK;
319 }
320 
321 rtError RDKMediaPlayer::setSpeed(float const& t)
322 {
323  LOG_INFO("%s %f\n", __PRETTY_FUNCTION__, t);
324  m_speed = t;
325  if(!m_pImpl)
326  return RT_OK;
327  CALL_ON_MAIN_THREAD(self.m_pImpl->doSetSpeed(self.m_speed););
328  updateClosedCaptionsState();
329  return RT_OK;
330 }
331 
332 rtError RDKMediaPlayer::volume(float& t) const
333 {
334  t = m_volume;
335  return RT_OK;
336 }
337 rtError RDKMediaPlayer::setVolume(float const& t)
338 {
339  LOG_INFO("%s %f\n", __PRETTY_FUNCTION__, t);
340  m_volume = t;
341  if(!m_pImpl)
342  return RT_OK;
343  CALL_ON_MAIN_THREAD(self.m_pImpl->doSetVolume(self.m_volume););
344  return RT_OK;
345 }
346 
347 rtError RDKMediaPlayer::blocked(rtString& t) const
348 {
349  boolToString(m_isBlocked, t);
350  return RT_OK;
351 }
352 
353 rtError RDKMediaPlayer::setBlocked(rtString const& t)
354 {
355  stringToBool(t, m_isBlocked);
356  LOG_INFO("%s %d\n", __PRETTY_FUNCTION__, (int)m_isBlocked);
357  if(!m_pImpl)
358  return RT_OK;
359  CALL_ON_MAIN_THREAD(self.m_pImpl->doSetBlocked(self.m_isBlocked););
360  return RT_OK;
361 }
362 
363 rtError RDKMediaPlayer::isInProgressRecording(rtString& t) const
364 {
365  boolToString(m_isInProgressRecording, t);
366  return RT_OK;
367 }
369 {
370  stringToBool(t, m_isInProgressRecording);
371  LOG_INFO("%s %d\n", __PRETTY_FUNCTION__, (int)m_isInProgressRecording);
372  if(!m_pImpl)
373  return RT_OK;
374  CALL_ON_MAIN_THREAD(self.m_pImpl->doSetIsInProgressRecording(self.m_isInProgressRecording););
375  return RT_OK;
376 }
377 
378 rtError RDKMediaPlayer::zoom(rtString& t) const
379 {
380  t = m_zoom ? rtString("NONE") : rtString("FULL");
381  return RT_OK;
382 }
383 
384 rtError RDKMediaPlayer::setZoom(rtString const& t)
385 {
386  if(t.compare("FULL")==0)
387  m_zoom = 0;
388  else
389  m_zoom = 1;
390  LOG_INFO("%s %s=%d\n", __PRETTY_FUNCTION__, t.cString(), m_zoom);
391  if(m_pImpl)
392  return RT_OK;
393  CALL_ON_MAIN_THREAD(self.m_pImpl->doSetZoom(self.m_zoom););
394  return RT_OK;
395 }
396 
397 rtError RDKMediaPlayer::networkBufferSize(int32_t& t) const
398 {
399  t = m_networkBufferSize;
400  return RT_OK;
401 }
402 
403 rtError RDKMediaPlayer::setNetworkBufferSize(int32_t const& t)
404 {
405  LOG_INFO("%s %d\n", __PRETTY_FUNCTION__, t);
406  m_networkBufferSize = t;
407  if(!m_pImpl)
408  return RT_OK;
409  CALL_ON_MAIN_THREAD(self.m_pImpl->doSetNetworkBufferSize(self.m_networkBufferSize););
410  return RT_OK;
411 }
412 
413 rtError RDKMediaPlayer::videoBufferLength(float& t) const
414 {
415  t = m_videoBufferLength;
416  return RT_OK;
417 }
419 {
420  LOG_INFO("%s %f\n", __PRETTY_FUNCTION__, t);//CID:127671 - Type cast since t is a float variable
421  m_videoBufferLength = t;
422  if(!m_pImpl)
423  return RT_OK;
424  CALL_ON_MAIN_THREAD(self.m_pImpl->doSetVideoBufferLength(self.m_videoBufferLength););
425  return RT_OK;
426 }
427 
428 rtError RDKMediaPlayer::eissFilterStatus(rtString& t) const
429 {
430  boolToString(m_eissFilterStatus, t);
431  return RT_OK;
432 }
433 
434 rtError RDKMediaPlayer::setEissFilterStatus(rtString const& t)
435 {
436  stringToBool(t, m_eissFilterStatus);
437  LOG_INFO("%s %d\n", __PRETTY_FUNCTION__, (int)m_eissFilterStatus);
438  if(!m_pImpl)
439  return RT_OK;
440  CALL_ON_MAIN_THREAD(self.m_pImpl->doSetEISSFilterStatus(self.m_eissFilterStatus););
441  return RT_OK;
442 }
443 
444 rtError RDKMediaPlayer::loadStartTime(int64_t& t) const
445 {
446  t = m_loadStartTime;
447  return RT_OK;
448 }
449 
450 rtError RDKMediaPlayer::setLoadStartTime(int64_t const& t)
451 {
452  LOG_INFO("%s %lld\n", __PRETTY_FUNCTION__, t);
453  m_loadStartTime = t;
454  return RT_OK;
455 }
456 
457 rtError RDKMediaPlayer::closedCaptionsEnabled(rtString& t) const
458 {
459  boolToString(m_closedCaptionsEnabled, t);
460  return RT_OK;
461 }
462 
464 {
465  stringToBool(t, m_closedCaptionsEnabled);
466  LOG_INFO("%s %d\n", __PRETTY_FUNCTION__, (int)m_closedCaptionsEnabled);
467  updateClosedCaptionsState();
468  return RT_OK;
469 }
470 
471 rtError RDKMediaPlayer::closedCaptionsOptions(rtObjectRef& t) const
472 {
473  for(std::map<std::string, std::string>::const_iterator it = m_closedCaptionsOptions.begin();
474  it != m_closedCaptionsOptions.end();
475  it++)
476  {
477  t.set(it->first.c_str(), rtValue(it->second.c_str()));
478  }
479  return RT_OK;
480 }
481 
482 rtError RDKMediaPlayer::setClosedCaptionsOptions(rtObjectRef const& t)
483 {
484  for(std::map<std::string, std::string>::iterator it = m_closedCaptionsOptions.begin();
485  it != m_closedCaptionsOptions.end();
486  it++)
487  {
488  rtValue v;
489  if(t.get(it->first.c_str(), v) == RT_OK)
490  it->second = v.convert<rtString>().cString();
491  }
492 
493  for(std::map<std::string, std::string>::iterator it = m_closedCaptionsOptions.begin();
494  it != m_closedCaptionsOptions.end();
495  it++)
496  {
497  LOG_INFO("%s %s:%s\n", __PRETTY_FUNCTION__, it->first.c_str(), it->second.c_str());//CID:127401 - Type casting for it->second.c_str()
498  }
499  return RT_OK;
500 }
501 
502 rtError RDKMediaPlayer::closedCaptionsTrack(rtString& t) const
503 {
504  t = m_closedCaptionsTrack.c_str();
505  return RT_OK;
506 }
507 
508 rtError RDKMediaPlayer::setClosedCaptionsTrack(rtString const& t)
509 {
510  m_closedCaptionsTrack = t.cString();
511  LOG_INFO("%s %s\n", __PRETTY_FUNCTION__, m_closedCaptionsTrack.c_str());
512  return RT_OK;
513 }
514 
515 rtError RDKMediaPlayer::contentOptions(rtObjectRef& t) const
516 {
517  t = m_contentOptions;
518  return RT_OK;
519 }
520 
521 rtError RDKMediaPlayer::setContentOptions(rtObjectRef const& t)
522 {
523  m_contentOptions = t;
524  return RT_OK;
525 }
526 
527 rtError RDKMediaPlayer::autoPlay(rtString& t) const
528 {
529  boolToString(m_autoPlay, t);
530  return RT_OK;
531 }
532 
533 rtError RDKMediaPlayer::setAutoPlay(rtString const& t)
534 {
535  LOG_INFO("%s %s\n", __PRETTY_FUNCTION__, t.cString());
536  stringToBool(t, m_autoPlay);
537  return RT_OK;
538 }
539 
540 rtError RDKMediaPlayer::duration(float& t) const
541 {
542  t = m_duration;
543  return RT_OK;
544 }
545 
546 rtError RDKMediaPlayer::availableAudioLanguages(rtString& t) const
547 {
548  t = m_availableAudioLanguages.c_str();
549  return RT_OK;
550 }
551 
553 {
554  t = m_availableClosedCaptionsLanguages.c_str();
555  return RT_OK;
556 }
557 
558 rtError RDKMediaPlayer::availableSpeeds(rtString& t) const
559 {
560  t = m_availableSpeeds.c_str();
561  return RT_OK;
562 }
563 
564 rtError RDKMediaPlayer::tsbEnabled(rtString& t) const
565 {
566  boolToString(m_tsbEnabled, t);
567  return RT_OK;
568 }
569 
570 rtError RDKMediaPlayer::setTsbEnabled(rtString const& t)
571 {
572  LOG_INFO("%s %s\n", __PRETTY_FUNCTION__, t.cString());
573  stringToBool(t, m_tsbEnabled);
574  return RT_OK;
575 }
576 
577 
578 // rtRemote methods
579 rtError RDKMediaPlayer::setVideoRectangle(int32_t x, int32_t y, int32_t w, int32_t h)
580 {
581  LOG_INFO("%s %d %d %d %d\n", __PRETTY_FUNCTION__, x, y, w, h);
582  m_videoRect = IntRect(x,y,w,h);
583  if(!m_pImpl)
584  return RT_OK;
585  CALL_ON_MAIN_THREAD(self.m_pImpl->doSetVideoRectangle(self.m_videoRect););
586  return RT_OK;
587 }
588 
590 {
591  LOG_INFO("%s\n", __PRETTY_FUNCTION__);
592  m_playStartTime = g_get_monotonic_time();
593  m_speed = 1;
594  m_overshootTime = 0;
595  if(!m_pImpl)
596  return RT_OK;
597  CALL_ON_MAIN_THREAD(self.m_pImpl->doPlay(););
598  updateClosedCaptionsState();
599  return RT_OK;
600 }
601 
603 {
604  LOG_INFO("%s\n", __PRETTY_FUNCTION__);
605  m_speed = 0;
606  m_overshootTime = 0;
607  if(!m_pImpl)
608  return RT_OK;
609  CALL_ON_MAIN_THREAD(self.m_pImpl->doPause(););
610  return RT_OK;
611 }
612 
614 {
615  LOG_INFO("%s\n", __PRETTY_FUNCTION__);
616  m_speed = 1;
617  if(!m_pImpl)
618  return RT_OK;
619  CALL_ON_MAIN_THREAD(self.m_pImpl->doSeekToLive(););
620  return RT_OK;
621 }
622 
623 
625 {
626  LOG_INFO("%s\n", __PRETTY_FUNCTION__);
627  if(!m_pImpl)
628  return RT_OK;
629  if(m_pImpl->getTuneState() == TuneStop)
630  return RT_OK;
631  m_pImpl->setTuneState(TuneStop);
632  CALL_ON_MAIN_THREAD(
633  if(self.m_pImpl)
634  {
635  self.m_vidDecoderHandle = 0;
636  self.updateClosedCaptionsState();//m_vidDecoderHandle = 0 will be disabled
637  self.m_pImpl->doStop();
638  //usleep(1000000);//TODO REMOVE
639  self.m_pImpl->setTuneState(TuneNone);
640  }
641  if(self.m_urlQueued)
642  {
643  LOG_INFO("calling startQueuedTune");
644  self.startQueuedTune();
645  }
646  );
647  return RT_OK;
648 }
649 
650 rtError RDKMediaPlayer::changeSpeed(float speed, int32_t overshootTime)
651 {
652  LOG_INFO("%s %f %d\n", __PRETTY_FUNCTION__, speed, overshootTime);
653  m_speed = speed;
654  m_overshootTime = overshootTime;
655  if(!m_pImpl)
656  return RT_OK;
657  CALL_ON_MAIN_THREAD(self.m_pImpl->doChangeSpeed(self.m_speed, self.m_overshootTime););
658  return RT_OK;
659 }
660 
662 {
663  if(m_pImpl)
664  {
665  ProgressData pd;
666  m_pImpl->getProgressData(&pd);
667  m_seekTime = pd.position + seconds/1000.0;
668  }
669  else
670  m_seekTime = 0 + seconds/1000.0;
671  if(m_seekTime < 0)
672  m_seekTime = 0;
673  if(!m_pImpl)
674  return RT_OK;
675  CALL_ON_MAIN_THREAD(self.m_pImpl->doSetPosition(self.m_seekTime););
676  return RT_OK;
677 }
678 
680 {
681  LOG_INFO("%s\n", __PRETTY_FUNCTION__);
682  if(m_pImpl)
683  getEventEmitter().send(OnStatusEvent(m_pImpl));
684  return RT_OK;
685 }
686 
687 rtError RDKMediaPlayer::setAdditionalAuth(rtObjectRef const& t)
688 {
689  LOG_INFO("%s\n", __PRETTY_FUNCTION__);
690  return RT_OK;
691 }
692 
693 rtError RDKMediaPlayer::setListener(rtString eventName, const rtFunctionRef& f)
694 {
695  return m_eventEmitter.setListener(eventName, f);
696 }
697 
698 rtError RDKMediaPlayer::delListener(rtString eventName, const rtFunctionRef& f)
699 {
700  return m_eventEmitter.delListener(eventName, f);
701 }
702 
704 {
705  LOG_INFO("%s\n", __PRETTY_FUNCTION__);
706  exit(0);
707 }
708 
709 rtError RDKMediaPlayer::open(rtString openData, rtString resp)
710 {
711  LOG_INFO("%s, openData = %s\n", __PRETTY_FUNCTION__, openData.cString());
712  rtError ret = RT_OK;
713  json_error_t error;
714  json_t *root = json_loads(openData.cString(), 0, &error);
715 
716  if (!root) {
717  LOG_INFO("json error on line %d: %s\n", error.line, error.text);
718  return RT_FAIL;
719  }
720 
721  std::string url = json_string_value(json_object_get(root, "mediaurl"));
722  std::string mode = json_string_value(json_object_get(root, "mode"));
723  std::string manage = json_string_value(json_object_get(root, "manage"));
724  // For CAS Management Session
725  if((mode == "MODE_NONE") &&
726  (manage == "MANAGE_FULL" || manage == "MANAGE_NO_PSI" || manage == "MANAGE_NO_TUNER"))
727  {
728  std::string casocdmid = json_string_value(json_object_get(root, "casocdmid"));
729 
730  if(casocdmid.empty() || (manage == "MANAGE_FULL" && url.empty())) {
731  LOG_INFO("ocdmcasid is mandatory for CAS management session or url is empty");
732  json_decref(root);
733  return RT_FAIL;
734  }
735 
736  for(std::vector<RDKMediaPlayerImpl*>::iterator it = m_playerCache.begin(); it != m_playerCache.end(); ++it)
737  {
738  if( (*it)->isManagementSession() )
739  {
740  LOG_INFO("Reusing cached player");
741  m_pImpl = *it;
742  break;
743  }
744  }
745 
746  if(!m_pImpl)
747  {
748  m_pImpl = new RMFPlayer(this);
749  m_pImpl->doInit();
750  m_playerCache.push_back(m_pImpl);
751  if(manage == "MANAGE_FULL") {
752  setCurrentURL(url.c_str());
753  }
754  std::string data = openData.cString();
755 #ifdef USE_EXTERNAL_CAS
756  ((RMFPlayer *)m_pImpl)->open(data);
757  ((RMFPlayer *)m_pImpl)->registerCASData();
758 #endif
759  }
760  else
761  {
762  LOG_INFO("CAS Managment session is already avialable");
763  }
764  resp = (std::to_string((uintptr_t)m_pImpl)).c_str();
765  LOG_INFO("resp = %x", resp.cString());
766  }
767  // For Live Playback Session
768  else if ((mode == "MODE_LIVE" || mode == "MODE_PLAYBACK") && manage == "MANAGE_NONE") {
769  if (url.empty())
770  {
771  LOG_INFO("MediaUrl is mandatory when ModeType is LIVE, PLAYBACK");
772  json_decref(root);
773  return RT_FAIL;
774  }
775  setCurrentURL(url.c_str());
776  std::string data = openData.cString();
777 #ifdef USE_EXTERNAL_CAS
778  ((RMFPlayer *)m_pImpl)->open(data);
779 #endif
780  for(std::vector<RDKMediaPlayerImpl*>::iterator it = m_playerCache.begin(); it != m_playerCache.end(); ++it)
781  {
782  if( !((*it)->isManagementSession()) && (*it)->doCanPlayURL(m_currentURL) )
783  {
784  LOG_INFO("Reusing cached player");
785  resp = (std::to_string((uintptr_t)*it)).c_str();
786  LOG_INFO("resp = %x", resp.cString());
787  }
788  }
789  }
790  else {
791  LOG_INFO("Invalid Option to Open media or cas management session ...");
792  json_decref(root);
793  return RT_FAIL;
794  }
795 
796  json_decref(root);
797 
798  return RT_OK;
799 }
800 
801 rtError RDKMediaPlayer::sendCASData(rtString data, rtString resp)
802 {
803  LOG_INFO("%s\n", __PRETTY_FUNCTION__);
804  if(!m_pImpl)
805  return RT_FAIL;
806  std::string strData = data.cString();
807 #ifdef USE_EXTERNAL_CAS
808  ((RMFPlayer *)m_pImpl)->sendCASData(strData);
809 #endif
810 
811  return RT_OK;
812 }
813 
815 {
816  return m_isBlocked;
817 }
818 
819 const gint64& RDKMediaPlayer::getSetURLTime() const
820 {
821  return m_setURLTime;
822 }
823 
824 const gint64& RDKMediaPlayer::getLoadStartTime() const
825 {
826  return m_loadStartTime;
827 }
828 
829 const gint64& RDKMediaPlayer::getPlayStartTime() const
830 {
831  return m_playStartTime;
832 }
833 
835 {
836  return m_eventEmitter;
837 }
838 
840 {
841  LOG_INFO("%s %u\n", __PRETTY_FUNCTION__, handle);
842  m_vidDecoderHandle = handle;
843  updateClosedCaptionsState();
844 }
845 
846 void RDKMediaPlayer::updateVideoMetadata(const std::string& languages, const std::string& speeds, int duration, int width, int height)
847 {
848  m_availableAudioLanguages = languages;
849  m_availableSpeeds = speeds;
850  m_duration = duration;
851 #ifndef DISABLE_CLOSEDCAPTIONS
852  m_availableClosedCaptionsLanguages = m_closedCaptions.getAvailableTracks();
853 #endif
854  std::string mediaType;//should be "live", "liveTSB", or "recorded"
855  getEventEmitter().send(OnMediaOpenedEvent(mediaType.c_str(), duration, width, height, m_availableSpeeds.c_str(), m_availableAudioLanguages.c_str(), m_availableClosedCaptionsLanguages.c_str()));
856 }
857 
858 void RDKMediaPlayer::updateClosedCaptionsState()
859 {
860 #ifndef DISABLE_CLOSEDCAPTIONS
861  LOG_INFO("%s m_vidDecoderHandle=%u m_closedCaptionsEnabled=%d m_speed=%f\n", __PRETTY_FUNCTION__, (uint32_t)m_vidDecoderHandle, (int)m_closedCaptionsEnabled, m_speed);
862 
863  if(m_vidDecoderHandle && m_closedCaptionsEnabled && m_speed >= 0 && m_speed <= 1 )
864  {
865  if(!m_closedCaptions.isEnabled())
866  {
867  LOG_INFO("updateClosedCaptionsState cc start\n");
868  if(!m_closedCaptions.setEnabled(true))
869  {
870  //m_pres->reportMediaWarning(XREProtocol::MEDIA_WARNING_CAPTION_STATE_CHANGE_FAILED, "Failed to set CC state");
871  }
872  m_closedCaptions.start((void*)m_vidDecoderHandle);
873  m_closedCaptions.setVisible(true);
874  }
875  }
876  else
877  {
878  if(m_closedCaptions.isEnabled())
879  {
880  LOG_INFO("updateClosedCaptionsState cc stop\n");
881  m_closedCaptions.stop();
882  if(!m_closedCaptions.setEnabled(false))
883  {
884  //m_pres->reportMediaWarning(XREProtocol::MEDIA_WARNING_CAPTION_STATE_CHANGE_FAILED, "Failed to set CC state");
885  }
886  }
887  }
888 #endif
889 }
RDKMediaPlayer::availableAudioLanguages
rtError availableAudioLanguages(rtString &t) const
This method returns the languages available on the stream.
Definition: rdkmediaplayer.cpp:546
RDKMediaPlayer::delListener
rtError delListener(rtString eventName, const rtFunctionRef &f)
This API deregisters the listeners associated with the event.
Definition: rdkmediaplayer.cpp:698
RDKMediaPlayer::duration
rtError duration(float &t) const
This API returns the duration of video in milliseconds.
Definition: rdkmediaplayer.cpp:540
RDKMediaPlayer::setIsInProgressRecording
rtError setIsInProgressRecording(rtString const &t)
This API is intended to set the recording state.
Definition: rdkmediaplayer.cpp:368
RDKMediaPlayer::closedCaptionsTrack
rtError closedCaptionsTrack(rtString &t) const
Returns the available closed caption tracks for this stream.
Definition: rdkmediaplayer.cpp:502
RDKMediaPlayer::tsbEnabled
rtError tsbEnabled(rtString &t) const
This API returns true, if TSB is enabled for this resource.
Definition: rdkmediaplayer.cpp:564
RDKMediaPlayer::position
rtError position(float &t) const
This API returns the current position details from the progress data.
Definition: rdkmediaplayer.cpp:285
OnMediaOpenedEvent
Definition: rdkmediaplayerimpl.h:85
RDKMediaPlayer::getIsBlocked
bool getIsBlocked() const
Returns the blocked status.
Definition: rdkmediaplayer.cpp:814
RDKMediaPlayer::pause
rtError pause()
This API pause the stream and retain the playhead position.
Definition: rdkmediaplayer.cpp:602
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
RDKMediaPlayer::networkBufferSize
rtError networkBufferSize(int32_t &t) const
This API returns the size of the buffer in milliseconds.
Definition: rdkmediaplayer.cpp:397
RDKMediaPlayer::setSecondaryAudioLanguage
rtError setSecondaryAudioLanguage(rtString const &s)
This API is to set the secondary audio language.
Definition: rdkmediaplayer.cpp:278
RDKMediaPlayer::contentOptions
rtError contentOptions(rtObjectRef &t) const
Returns the content options.
Definition: rdkmediaplayer.cpp:515
RDKMediaPlayer::setPosition
rtError setPosition(float const &t)
Moves the playhead to the absolute mediatime specified.
Definition: rdkmediaplayer.cpp:298
RDKMediaPlayer::requestStatus
rtError requestStatus()
This API requests the onStatus event to be fired.
Definition: rdkmediaplayer.cpp:679
RDKMediaPlayer
Definition: rdkmediaplayer.h:52
RDKMediaPlayer::setEissFilterStatus
rtError setEissFilterStatus(rtString const &t)
This API is to enable/disable the EISS filter.
Definition: rdkmediaplayer.cpp:434
RDKMediaPlayer::zoom
rtError zoom(rtString &t) const
This API returns either FULL" or "NONE".
Definition: rdkmediaplayer.cpp:378
ReleaseOnScopeEnd
Definition: rdkmediaplayer.cpp:30
RDKMediaPlayer::setNetworkBufferSize
rtError setNetworkBufferSize(int32_t const &t)
The API sets the network buffer size.
Definition: rdkmediaplayer.cpp:403
RDKMediaPlayer::secondaryAudioLanguage
rtError secondaryAudioLanguage(rtString &s) const
Function returns the secondary audio language.
Definition: rdkmediaplayer.cpp:273
RDKMediaPlayer::setVideoRectangle
rtError setVideoRectangle(int32_t x, int32_t y, int32_t w, int32_t h)
API to draw a rectangle.
Definition: rdkmediaplayer.cpp:579
RDKMediaPlayer::setClosedCaptionsEnabled
rtError setClosedCaptionsEnabled(rtString const &t)
This method allows close captioning to be enabled.
Definition: rdkmediaplayer.cpp:463
RDKMediaPlayer::setBlocked
rtError setBlocked(rtString const &t)
This method will block the video and mute the audio if flag is true.
Definition: rdkmediaplayer.cpp:353
RDKMediaPlayer::setSpeed
rtError setSpeed(float const &t)
This API is to set the playback rate.
Definition: rdkmediaplayer.cpp:321
AAMPPlayer
Definition: aampplayer.h:29
RDKMediaPlayer::closedCaptionsEnabled
rtError closedCaptionsEnabled(rtString &t) const
This API returns the closed caption status.
Definition: rdkmediaplayer.cpp:457
RDKMediaPlayer::setAudioLanguage
rtError setAudioLanguage(rtString const &s)
This API is to set the audio language to the player.
Definition: rdkmediaplayer.cpp:262
RDKMediaPlayer::availableClosedCaptionsLanguages
rtError availableClosedCaptionsLanguages(rtString &t) const
This API was supposed to return array of the available captions languages for this video.
Definition: rdkmediaplayer.cpp:552
OnStatusEvent
Definition: rdkmediaplayerimpl.h:102
RDKMediaPlayer::setPositionRelative
rtError setPositionRelative(float seconds)
Sets the position of the video by adding the given number of seconds.
Definition: rdkmediaplayer.cpp:661
RDKMediaPlayer::setVideoBufferLength
rtError setVideoBufferLength(float const &t)
This API is to set the range of buffered video.
Definition: rdkmediaplayer.cpp:418
RDKMediaPlayer::setLoadStartTime
rtError setLoadStartTime(int64_t const &t)
This API is to set the start time of the video.
Definition: rdkmediaplayer.cpp:450
RDKMediaPlayer::getPlayStartTime
const gint64 & getPlayStartTime() const
Returns the player start time.
Definition: rdkmediaplayer.cpp:829
RDKMediaPlayer::setVolume
rtError setVolume(float const &t)
This method sets the volume level for the player instance and is persisted across different URLs.
Definition: rdkmediaplayer.cpp:337
RDKMediaPlayer::getLoadStartTime
const gint64 & getLoadStartTime() const
Returns the value set using the function setLoadStartTime().
Definition: rdkmediaplayer.cpp:824
RDKMediaPlayer::volume
rtError volume(float &t) const
This API returns the current volume.
Definition: rdkmediaplayer.cpp:332
RDKMediaPlayer::blocked
rtError blocked(rtString &t) const
This API is to check video is blocked or not.
Definition: rdkmediaplayer.cpp:347
RDKMediaPlayer::setCurrentURL
rtError setCurrentURL(rtString const &s)
This API performs following functionalities.
Definition: rdkmediaplayer.cpp:227
RDKMediaPlayer::onVidHandleReceived
void onVidHandleReceived(uint32_t handle)
This API receives the decoder handle and updates the closedcaption state.
Definition: rdkmediaplayer.cpp:839
RDKMediaPlayer::setClosedCaptionsOptions
rtError setClosedCaptionsOptions(rtObjectRef const &t)
Sets the close caption options to use when close captioning is enabled.
Definition: rdkmediaplayer.cpp:482
RDKMediaPlayer::currentURL
rtError currentURL(rtString &s) const
This API returns current playback URL.
Definition: rdkmediaplayer.cpp:164
RMFPlayer
Definition: rmfplayer.h:48
RDKMediaPlayer::audioLanguage
rtError audioLanguage(rtString &s) const
This API returns the audio language selected.
Definition: rdkmediaplayer.cpp:256
ProgressData
Definition: rdkmediaplayerimpl.h:28
RDKMediaPlayer::loadStartTime
rtError loadStartTime(int64_t &t) const
This API returns the start time of the video.
Definition: rdkmediaplayer.cpp:444
RDKMediaPlayer::setTsbEnabled
rtError setTsbEnabled(rtString const &t)
This API is to enable/disable TSB.
Definition: rdkmediaplayer.cpp:570
RDKMediaPlayer::getSetURLTime
const gint64 & getSetURLTime() const
Returns the system monotonic time.
Definition: rdkmediaplayer.cpp:819
RDKMediaPlayer::setZoom
rtError setZoom(rtString const &t)
This API sets the value 0 or 1 depending on the argument "FULL" or "NONE".
Definition: rdkmediaplayer.cpp:384
RDKMediaPlayer::stop
rtError stop()
This API stops the stream and releases unnecessary resources.
Definition: rdkmediaplayer.cpp:624
RDKMediaPlayer::setClosedCaptionsTrack
rtError setClosedCaptionsTrack(rtString const &t)
Sets the caption track to be played when closedCaptionEnabled is true.
Definition: rdkmediaplayer.cpp:508
RDKMediaPlayer::play
rtError play()
This API starts video playback.
Definition: rdkmediaplayer.cpp:589
LOG_INFO
#define LOG_INFO(AAMP_JS_OBJECT, FORMAT,...)
Definition: jsutils.h:39
RDKMediaPlayer::isInProgressRecording
rtError isInProgressRecording(rtString &t) const
This API is intended to check recording status.
Definition: rdkmediaplayer.cpp:363
IntRect
Definition: intrect.h:22
RDKMediaPlayer::setAutoPlay
rtError setAutoPlay(rtString const &t)
This API sets the auto play flag of the player.
Definition: rdkmediaplayer.cpp:533
RDKMediaPlayer::getEventEmitter
EventEmitter & getEventEmitter()
This function is used to trigger the events.
Definition: rdkmediaplayer.cpp:834
EventEmitter
Definition: rtevents.h:51
RDKMediaPlayer::setAdditionalAuth
rtError setAdditionalAuth(rtObjectRef const &t)
Sets additional auth data on the player that the player may need to continue playback.
Definition: rdkmediaplayer.cpp:687
RDKMediaPlayer::availableSpeeds
rtError availableSpeeds(rtString &t) const
This API returns available playback rates for this video.
Definition: rdkmediaplayer.cpp:558
RDKMediaPlayer::changeSpeed
rtError changeSpeed(float speed, int32_t overshootTime)
This is an alternative to setting the speed property directly.
Definition: rdkmediaplayer.cpp:650
RDKMediaPlayer::speed
rtError speed(float &t) const
This API is to return current playback rate.
Definition: rdkmediaplayer.cpp:308
RDKMediaPlayer::open
rtError open(rtString param, rtString resp)
Open the CAS Management Service Session for CMI.
Definition: rdkmediaplayer.cpp:709
RDKMediaPlayer::seekToLive
rtError seekToLive()
Moves the playhead to the live position in the player.
Definition: rdkmediaplayer.cpp:613
RDKMediaPlayer::closedCaptionsOptions
rtError closedCaptionsOptions(rtObjectRef &t) const
Returns the list of supported closed caption options supported by this player.
Definition: rdkmediaplayer.cpp:471
RDKMediaPlayer::eissFilterStatus
rtError eissFilterStatus(rtString &t) const
This API checks EISS(ETV Integrated Signaling System) filter is enabled or not.
Definition: rdkmediaplayer.cpp:428
RDKMediaPlayer::sendCASData
rtError sendCASData(rtString data, rtString resp)
Send the data to CAS System.
Definition: rdkmediaplayer.cpp:801
RDKMediaPlayer::destroy
rtError destroy()
Request to destroy the video resource.
Definition: rdkmediaplayer.cpp:703
RDKMediaPlayer::autoPlay
rtError autoPlay(rtString &t) const
This API indicates autoplay is enabled or not.
Definition: rdkmediaplayer.cpp:527
RDKMediaPlayer::setContentOptions
rtError setContentOptions(rtObjectRef const &t)
This API is to update the content option.
Definition: rdkmediaplayer.cpp:521
RDKMediaPlayer::setListener
rtError setListener(rtString eventName, const rtFunctionRef &f)
Register an event listener for the specified event name.
Definition: rdkmediaplayer.cpp:693
RDKMediaPlayer::videoBufferLength
rtError videoBufferLength(float &t) const
This API returns the size of the video buffer.
Definition: rdkmediaplayer.cpp:413
OnPlayerInitializedEvent
Definition: rdkmediaplayerimpl.h:202