RDK Documentation (Open Sourced RDK Components)
AampSmokeTestPlayer.cpp
Go to the documentation of this file.
1 /*
2  * If not stated otherwise in this file or this component's Licenses.txt file
3  * the following copyright and licenses apply:
4  *
5  * Copyright 2022 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 /**
20  * @file AampSmokeTestPlayer.cpp
21  * @brief Aamp SmokeTest standalone Player
22  */
23 
24 #include "AampSmokeTestPlayer.h"
25 
26 AampPlayer mAampPlayer;
27 bool AampPlayer::mInitialized = false;
28 GMainLoop* AampPlayer::mAampGstPlayerMainLoop = NULL;
29 GThread* AampPlayer::mAampMainLoopThread = NULL;
30 SmokeTestEventListener* AampPlayer::mEventListener = NULL;
31 PlayerInstanceAAMP* AampPlayer::mPlayerInstanceAamp = NULL;
32 
33 AampPlayer :: AampPlayer():
34  mEnableProgressLog(false),
35  mTuneFailureDescription("")
36 {
37 };
38 
39 AampPlayer :: AampPlayer(const AampPlayer &aampPlayer):
40  mEnableProgressLog(aampPlayer.mEnableProgressLog),
41  mTuneFailureDescription(aampPlayer.mTuneFailureDescription)
42 {
43 };
44 
45 AampPlayer& AampPlayer::operator=(const AampPlayer &aampPlayer)
46 {
47  mEnableProgressLog = aampPlayer.mEnableProgressLog;
48  mTuneFailureDescription = aampPlayer.mTuneFailureDescription;
49  return *this;
50 };
51 
52 /**
53  * @brief Thread to run mainloop (for standalone mode)
54  * @param[in] arg user_data
55  * @retval void pointer
56  */
58 {
59  if (mAampPlayer.mAampGstPlayerMainLoop)
60  {
61  g_main_loop_run(mAampPlayer.mAampGstPlayerMainLoop); // blocks
62  printf("aampGstPlayerStreamThread: exited main event loop\n");
63  }
64 
65  g_main_loop_unref(mAampPlayer.mAampGstPlayerMainLoop);
66  mAampPlayer.mAampGstPlayerMainLoop = NULL;
67  return NULL;
68 }
69 
70 /**
71  * @brief To initialize Gstreamer and start mainloop (for standalone mode)
72  * @param[in] argc number of arguments
73  * @param[in] argv array of arguments
74  */
75 void AampPlayer::initPlayerLoop(int argc, char **argv)
76 {
77  if (!mInitialized)
78  {
79  mInitialized = true;
80  gst_init(&argc, &argv);
81  mAampGstPlayerMainLoop = g_main_loop_new(NULL, FALSE);
82  mAampMainLoopThread = g_thread_new("AAMPGstPlayerLoop", &aampGstPlayerStreamThread, NULL );
83  }
84 
85  mPlayerInstanceAamp = new PlayerInstanceAAMP();
86  if( !mEventListener )
87  {
88  printf( "allocating new SmokeTestEventListener\n");
89  mEventListener = new SmokeTestEventListener();
90  }
91  mPlayerInstanceAamp->RegisterEvents(mEventListener);
92 }
93 
94 FILE * AampPlayer::getConfigFile(const std::string& cfgFile)
95 {
96  if (cfgFile.empty())
97  {
98  return NULL;
99  }
100 
101 #ifdef SIMULATOR_BUILD
102  std::string cfgBasePath(getenv("HOME"));
103  std::string cfgPath = cfgBasePath + cfgFile;
104  FILE *f = fopen(cfgPath.c_str(), "rb");
105 #else
106  std::string cfgPath = "/opt" + cfgFile;
107  FILE *f = fopen(cfgPath.c_str(), "rb");
108 #endif
109 
110  return f;
111 }
112 
113 
114 const char *SmokeTestEventListener::stringifyPrivAAMPState(PrivAAMPState state)
115 {
116  static const char *stateName[] =
117  {
118  "IDLE",
119  "INITIALIZING",
120  "INITIALIZED",
121  "PREPARING",
122  "PREPARED",
123  "BUFFERING",
124  "PAUSED",
125  "SEEKING",
126  "PLAYING",
127  "STOPPING",
128  "STOPPED",
129  "COMPLETE",
130  "ERROR",
131  "RELEASED"
132  };
133  if( state>=eSTATE_IDLE && state<=eSTATE_RELEASED )
134  {
135  return stateName[state];
136  }
137  else
138  {
139  return "UNKNOWN";
140  }
141 }
142 
143 /**
144  * @brief Implementation of event callback
145  * @param e Event
146  */
147 void SmokeTestEventListener::Event(const AAMPEventPtr& e)
148 {
149  switch (e->getType())
150  {
152  {
153  StateChangedEventPtr ev = std::dynamic_pointer_cast<StateChangedEvent>(e);
154  printf("AAMP_EVENT_STATE_CHANGED: %s (%d)\n", mAampPlayer.mEventListener->stringifyPrivAAMPState(ev->getState()), ev->getState());
155  break;
156  }
157  case AAMP_EVENT_SEEKED:
158  {
159  SeekedEventPtr ev = std::dynamic_pointer_cast<SeekedEvent>(e);
160  printf("AAMP_EVENT_SEEKED: new positionMs %f\n", ev->getPosition());
161  break;
162  }
164  {
165  MediaMetadataEventPtr ev = std::dynamic_pointer_cast<MediaMetadataEvent>(e);
166  std::vector<std::string> languages = ev->getLanguages();
167  int langCount = ev->getLanguagesCount();
168  printf("AAMP_EVENT_MEDIA_METADATA\n");
169  for (int i = 0; i < langCount; i++)
170  {
171  printf("[] language: %s\n", languages[i].c_str());
172  }
173  printf("AAMP_EVENT_MEDIA_METADATA\n\tDuration=%ld\n\twidth=%d\n\tHeight=%d\n\tHasDRM=%d\n\tProgreamStartTime=%f\n", ev->getDuration(), ev->getWidth(), ev->getHeight(), ev->hasDrm(), ev->getProgramStartTime());
174  int bitrateCount = ev->getBitratesCount();
175  std::vector<long> bitrates = ev->getBitrates();
176  printf("Bitrates:\n");
177  for(int i = 0; i < bitrateCount; i++)
178  {
179  printf("\tbitrate(%d)=%ld\n", i, bitrates.at(i));
180  }
181  break;
182  }
183  case AAMP_EVENT_TUNED:
184  {
185  printf("AAMP_EVENT_TUNED\n");
186  break;
187  }
189  {
190  MediaErrorEventPtr ev = std::dynamic_pointer_cast<MediaErrorEvent>(e);
191  mAampPlayer.mTuneFailureDescription = ev->getDescription();
192  printf("AAMP_EVENT_TUNE_FAILED reason=%s\n",mAampPlayer.mTuneFailureDescription.c_str());
193  break;
194  }
196  {
197  SpeedChangedEventPtr ev = std::dynamic_pointer_cast<SpeedChangedEvent>(e);
198  printf("AAMP_EVENT_SPEED_CHANGED current rate=%f\n", ev->getRate());
199  break;
200  }
202  {
203  DrmMetaDataEventPtr ev = std::dynamic_pointer_cast<DrmMetaDataEvent>(e);
204  printf("AAMP_DRM_FAILED Tune failure:%d\t\naccess status str:%s\t\naccess status val:%d\t\nResponce code:%ld\t\nIs SecClient error:%d\t\n",ev->getFailure(), ev->getAccessStatus().c_str(), ev->getAccessStatusValue(), ev->getResponseCode(), ev->getSecclientError());
205  break;
206  }
207  case AAMP_EVENT_EOS:
208  printf("AAMP_EVENT_EOS\n");
209  break;
211  printf("AAMP_EVENT_PLAYLIST_INDEXED\n");
212  break;
213  case AAMP_EVENT_PROGRESS:
214  {
215  ProgressEventPtr ev = std::dynamic_pointer_cast<ProgressEvent>(e);
216  if(mAampPlayer.mEnableProgressLog)
217  {
218  printf("AAMP_EVENT_PROGRESS\n\tDuration=%lf\n\tposition=%lf\n\tstart=%lf\n\tend=%lf\n\tcurrRate=%f\n\tBufferedDuration=%lf\n\tPTS=%lld\n\ttimecode=%s\n",ev->getDuration(),ev->getPosition(),ev->getStart(),ev->getEnd(),ev->getSpeed(),ev->getBufferedDuration(),ev->getPTS(),ev->getSEITimeCode());
219  }
220  }
221  break;
223  {
224  CCHandleEventPtr ev = std::dynamic_pointer_cast<CCHandleEvent>(e);
225  printf("AAMP_EVENT_CC_HANDLE_RECEIVED CCHandle=%lu\n",ev->getCCHandle());
226  break;
227  }
229  {
230  BitrateChangeEventPtr ev = std::dynamic_pointer_cast<BitrateChangeEvent>(e);
231  printf("AAMP_EVENT_BITRATE_CHANGED\n\tbitrate=%ld\n\tdescription=\"%s\"\n\tresolution=%dx%d@%ffps\n\ttime=%d\n\tposition=%lf\n", ev->getBitrate(), ev->getDescription().c_str(), ev->getWidth(), ev->getHeight(), ev->getFrameRate(), ev->getTime(), ev->getPosition());
232  break;
233  }
235  printf("AAMP_EVENT_AUDIO_TRACKS_CHANGED\n");
236  break;
238  printf("AAMP_EVENT_TEXT_TRACKS_CHANGED\n");
239  break;
241  printf("AAMP_EVENT_ID3_METADATA\n");
242  break;
243  case AAMP_EVENT_BLOCKED :
244  {
245  BlockedEventPtr ev = std::dynamic_pointer_cast<BlockedEvent>(e);
246  printf("AAMP_EVENT_BLOCKED Reason:%s\n" ,ev->getReason().c_str());
247  break;
248  }
250  {
251  ContentGapEventPtr ev = std::dynamic_pointer_cast<ContentGapEvent>(e);
252  printf("AAMP_EVENT_CONTENT_GAP\n\tStart:%lf\n\tDuration:%lf\n", ev->getTime(), ev->getDuration());
253  break;
254  }
256  {
257  WatermarkSessionUpdateEventPtr ev = std::dynamic_pointer_cast<WatermarkSessionUpdateEvent>(e);
258  printf("AAMP_EVENT_WATERMARK_SESSION_UPDATE SessionHandle:%d Status:%d System:%s\n" ,ev->getSessionHandle(), ev->getStatus(), ev->getSystem().c_str());
259  break;
260  }
262  {
263  BufferingChangedEventPtr ev = std::dynamic_pointer_cast<BufferingChangedEvent>(e);
264  printf("AAMP_EVENT_BUFFERING_CHANGED Sending Buffer Change event status (Buffering): %s", (ev->buffering() ? "End": "Start"));
265  break;
266  }
268  {
269  ContentProtectionDataEventPtr ev = std::dynamic_pointer_cast<ContentProtectionDataEvent>(e);
270  printf("AAMP_EVENT_CONTENT_PROTECTION_UPDATE received stream type %s\n",ev->getStreamType().c_str());
271  std::vector<uint8_t> key = ev->getKeyID();
272  printf("AAMP_EVENT_CONTENT_PROTECTION_UPDATE received key is ");
273  for(int i=0;i<key.size();i++)
274  printf("%x",key.at(i)&0xff);
275  printf("\n");
276  cJSON *root = cJSON_CreateObject();
277  cJSON *KeyId = cJSON_CreateArray();
278  for(int i=0;i<key.size();i++)
279  cJSON_AddItemToArray(KeyId, cJSON_CreateNumber(key.at(i)));
280  cJSON_AddItemToObject(root,"keyID",KeyId);
281  std::string json = cJSON_Print(root);
282  mAampPlayer.mPlayerInstanceAamp->ProcessContentProtectionDataConfig(json.c_str());
283  break;
284  }
285  default:
286  break;
287  }
288 }
289 
AAMP_EVENT_DRM_METADATA
@ AAMP_EVENT_DRM_METADATA
Definition: AampEvent.h:71
AAMP_EVENT_CONTENT_GAP
@ AAMP_EVENT_CONTENT_GAP
Definition: AampEvent.h:85
AAMP_EVENT_BUFFERING_CHANGED
@ AAMP_EVENT_BUFFERING_CHANGED
Definition: AampEvent.h:64
AAMP_EVENT_TUNE_FAILED
@ AAMP_EVENT_TUNE_FAILED
Definition: AampEvent.h:48
AAMP_EVENT_WATERMARK_SESSION_UPDATE
@ AAMP_EVENT_WATERMARK_SESSION_UPDATE
Definition: AampEvent.h:87
AampPlayer::initPlayerLoop
void initPlayerLoop(int argc, char **argv)
To initialize Gstreamer and start mainloop (for standalone mode)
Definition: AampSmokeTestPlayer.cpp:75
AAMP_EVENT_PLAYLIST_INDEXED
@ AAMP_EVENT_PLAYLIST_INDEXED
Definition: AampEvent.h:51
AAMP_EVENT_STATE_CHANGED
@ AAMP_EVENT_STATE_CHANGED
Definition: AampEvent.h:60
AAMP_EVENT_BLOCKED
@ AAMP_EVENT_BLOCKED
Definition: AampEvent.h:84
AampPlayer
Definition: AampSmokeTestPlayer.h:39
PlayerInstanceAAMP
Player interface class for the JS pluggin.
Definition: main_aamp.h:692
AAMP_EVENT_SPEED_CHANGED
@ AAMP_EVENT_SPEED_CHANGED
Definition: AampEvent.h:49
AAMP_EVENT_AUDIO_TRACKS_CHANGED
@ AAMP_EVENT_AUDIO_TRACKS_CHANGED
Definition: AampEvent.h:66
AAMP_EVENT_CONTENT_PROTECTION_DATA_UPDATE
@ AAMP_EVENT_CONTENT_PROTECTION_DATA_UPDATE
Definition: AampEvent.h:88
AAMP_EVENT_TEXT_TRACKS_CHANGED
@ AAMP_EVENT_TEXT_TRACKS_CHANGED
Definition: AampEvent.h:67
SmokeTestEventListener::Event
void Event(const AAMPEventPtr &e)
Implementation of event callback.
Definition: AampSmokeTestPlayer.cpp:147
PlayerInstanceAAMP::ProcessContentProtectionDataConfig
void ProcessContentProtectionDataConfig(const char *jsonbuffer)
Definition: main_aamp.cpp:3026
eSTATE_RELEASED
@ eSTATE_RELEASED
Definition: AampEvent.h:171
AAMP_EVENT_EOS
@ AAMP_EVENT_EOS
Definition: AampEvent.h:50
AAMP_EVENT_ID3_METADATA
@ AAMP_EVENT_ID3_METADATA
Definition: AampEvent.h:82
AAMP_EVENT_TUNED
@ AAMP_EVENT_TUNED
Definition: AampEvent.h:47
PrivAAMPState
PrivAAMPState
Mapping all required status codes based on JS player requirement. These requirements may be forced by...
Definition: AampEvent.h:156
AampPlayer::aampGstPlayerStreamThread
static void * aampGstPlayerStreamThread(void *arg)
Thread to run mainloop (for standalone mode)
Definition: AampSmokeTestPlayer.cpp:57
AAMP_EVENT_CC_HANDLE_RECEIVED
@ AAMP_EVENT_CC_HANDLE_RECEIVED
Definition: AampEvent.h:53
AAMP_EVENT_MEDIA_METADATA
@ AAMP_EVENT_MEDIA_METADATA
Definition: AampEvent.h:55
AampSmokeTestPlayer.h
AampSmokeTestPlayer header file.
eSTATE_IDLE
@ eSTATE_IDLE
Definition: AampEvent.h:158
AAMP_EVENT_SEEKED
@ AAMP_EVENT_SEEKED
Definition: AampEvent.h:62
AAMP_EVENT_PROGRESS
@ AAMP_EVENT_PROGRESS
Definition: AampEvent.h:52
SmokeTestEventListener
Definition: AampSmokeTestPlayer.h:32
PlayerInstanceAAMP::RegisterEvents
void RegisterEvents(EventListener *eventListener)
Register event handler.
Definition: main_aamp.cpp:403
AAMP_EVENT_BITRATE_CHANGED
@ AAMP_EVENT_BITRATE_CHANGED
Definition: AampEvent.h:57