RDK Documentation (Open Sourced RDK Components)
AampEventListener.cpp
Go to the documentation of this file.
1 /*
2  * If not stated otherwise in this file or this component's license file the
3  * following copyright and licenses apply:
4  *
5  * Copyright 2020 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 /**
21  * @file AampEventListener.cpp
22  * @brief Impl for AAMP Event listener classes.
23  */
24 
25 #include "AampEventListener.h"
26 #include <string.h>
27 
28 /**
29  * @brief API to convert AAMPEventPtr object to legacy AAMPEvent object.
30  *
31  * @param[in] e - AAMPEventPtr object
32  * @param[out] event - AAMPEvent object to which values have to be populated
33  */
34 static void GenerateLegacyAAMPEvent(const AAMPEventPtr &e, AAMPEvent &event)
35 {
36  AAMPEventType type = e->getType();
37  event.type = type;
38  switch (type)
39  {
41  {
42  MediaErrorEventPtr ev = std::dynamic_pointer_cast<MediaErrorEvent>(e);
43  event.data.mediaError.failure = ev->getFailure();
44  event.data.mediaError.code = ev->getCode();
45  event.data.mediaError.description = ev->getDescription().c_str();
46  event.data.mediaError.shouldRetry = ev->shouldRetry();
47  if(-1 != ev->getClass()) //Only send the verbose logging for DRM failure due to secclient/secmanager
48  {
49  event.data.mediaError.classCode = ev->getClass();
50  event.data.mediaError.reasonCode = ev->getReason();
51  event.data.mediaError.shouldRetry = ev->getBusinessStatus();
52  }
53  break;
54  }
56  {
57  SpeedChangedEventPtr ev = std::dynamic_pointer_cast<SpeedChangedEvent>(e);
58  event.data.speedChanged.rate = ev->getRate();
59  break;
60  }
62  {
63  ProgressEventPtr ev = std::dynamic_pointer_cast<ProgressEvent>(e);
64  event.data.progress.durationMiliseconds = ev->getDuration();
65  event.data.progress.positionMiliseconds = ev->getPosition();
66  event.data.progress.playbackSpeed = ev->getSpeed();
67  event.data.progress.startMiliseconds = ev->getStart();
68  event.data.progress.endMiliseconds = ev->getEnd();
69  event.data.progress.videoPTS = ev->getPTS();
70  event.data.progress.videoBufferedMiliseconds = ev->getBufferedDuration();
71  event.data.progress.timecode = ev->getSEITimeCode();
72  break;
73  }
75  {
76  CCHandleEventPtr ev = std::dynamic_pointer_cast<CCHandleEvent>(e);
77  event.data.ccHandle.handle = ev->getCCHandle();
78  break;
79  }
81  {
82  MediaMetadataEventPtr ev = std::dynamic_pointer_cast<MediaMetadataEvent>(e);
83  event.data.metadata.durationMiliseconds = ev->getDuration();
84  event.data.metadata.languageCount = ev->getLanguagesCount();
85  event.data.metadata.bitrateCount = ev->getBitratesCount();
86  event.data.metadata.supportedSpeedCount = ev->getSupportedSpeedCount();
87  event.data.metadata.width = ev->getWidth();
88  event.data.metadata.height = ev->getHeight();
89  event.data.metadata.hasDrm = ev->hasDrm();
90  event.data.metadata.programStartTime = ev->getProgramStartTime();
91 
92  std::vector<std::string> languages = ev->getLanguages();
93  for (int i = 0; i < event.data.metadata.languageCount && i < MAX_LANGUAGE_COUNT; i++)
94  {
95  memset(event.data.metadata.languages[i], '\0', MAX_LANGUAGE_TAG_LENGTH);
96  strncpy(event.data.metadata.languages[i], languages[i].c_str(), MAX_LANGUAGE_TAG_LENGTH - 1);
97  }
98  std::vector<long> bitrates = ev->getBitrates();
99  for(int i = 0; i < event.data.metadata.bitrateCount && i < MAX_BITRATE_COUNT; i++)
100  {
101  event.data.metadata.bitrates[i] = bitrates[i];
102  }
103  std::vector<float> speeds = ev->getSupportedSpeeds();
104  for(int i = 0; i < event.data.metadata.supportedSpeedCount && i < MAX_SUPPORTED_SPEED_COUNT; i++)
105  {
106  event.data.metadata.supportedSpeeds[i] = speeds[i];
107  }
108  break;
109  }
111  {
112  BitrateChangeEventPtr ev = std::dynamic_pointer_cast<BitrateChangeEvent>(e);
113  event.data.bitrateChanged.time = ev->getTime();
114  event.data.bitrateChanged.bitrate= ev->getBitrate();
115  event.data.bitrateChanged.description = ev->getDescription().c_str();
116  event.data.bitrateChanged.width = ev->getWidth();
117  event.data.bitrateChanged.height = ev->getHeight();
118  event.data.bitrateChanged.framerate = ev->getFrameRate();
119  event.data.bitrateChanged.position = ev->getPosition();
120  event.data.bitrateChanged.cappedProfile = ev->getCappedProfileStatus();
121  event.data.bitrateChanged.displayWidth = ev->getDisplayWidth();
122  event.data.bitrateChanged.displayHeight = ev->getDisplayHeight();
123  event.data.bitrateChanged.videoScanType = ev->getScanType();
124  event.data.bitrateChanged.aspectRatioWidth = ev->getAspectRatioWidth();
125  event.data.bitrateChanged.aspectRatioHeight = ev->getAspectRatioHeight();
126  break;
127  }
129  {
130  TimedMetadataEventPtr ev = std::dynamic_pointer_cast<TimedMetadataEvent>(e);
131  event.data.timedMetadata.szName = ev->getName().c_str();
132  event.data.timedMetadata.id = ev->getId().c_str();
133  event.data.timedMetadata.timeMilliseconds = ev->getTime();
134  event.data.timedMetadata.durationMilliSeconds = ev->getDuration();
135  event.data.timedMetadata.szContent = ev->getContent().c_str();
136  break;
137  }
139  {
140  BulkTimedMetadataEventPtr ev = std::dynamic_pointer_cast<BulkTimedMetadataEvent>(e);
141  event.data.bulktimedMetadata.szMetaContent = ev->getContent().c_str();
142  break;
143  }
145  {
146  StateChangedEventPtr ev = std::dynamic_pointer_cast<StateChangedEvent>(e);
147  event.data.stateChanged.state = ev->getState();
148  break;
149  }
151  {
152  SupportedSpeedsChangedEventPtr ev = std::dynamic_pointer_cast<SupportedSpeedsChangedEvent>(e);
153  event.data.speedsChanged.supportedSpeedCount = ev->getSupportedSpeedCount();
154  std::vector<float> speeds = ev->getSupportedSpeeds();
155  for(int i = 0; i < event.data.speedsChanged.supportedSpeedCount && i < MAX_SUPPORTED_SPEED_COUNT; i++)
156  {
157  event.data.speedsChanged.supportedSpeeds[i] = speeds[i];
158  }
159  break;
160  }
161  case AAMP_EVENT_SEEKED:
162  {
163  SeekedEventPtr ev = std::dynamic_pointer_cast<SeekedEvent>(e);
164  event.data.seeked.positionMiliseconds = ev->getPosition();
165  break;
166  }
168  {
169  TuneProfilingEventPtr ev = std::dynamic_pointer_cast<TuneProfilingEvent>(e);
170  event.data.tuneProfile.microData = ev->getProfilingData().c_str();
171  break;
172  }
174  {
175  BufferingChangedEventPtr ev = std::dynamic_pointer_cast<BufferingChangedEvent>(e);
176  event.data.bufferingChanged.buffering = ev->buffering();
177  break;
178  }
180  {
181  DrmMetaDataEventPtr ev = std::dynamic_pointer_cast<DrmMetaDataEvent>(e);
182  event.data.dash_drmmetadata.failure = ev->getFailure();
183  event.data.dash_drmmetadata.accessStatus = ev->getAccessStatus().c_str();
184  event.data.dash_drmmetadata.accessStatus_value = ev->getAccessStatusValue();
185  event.data.dash_drmmetadata.responseCode = ev->getResponseCode();
186  event.data.dash_drmmetadata.isSecClientError = ev->getSecclientError();
187  break;
188  }
190  {
191  AnomalyReportEventPtr ev = std::dynamic_pointer_cast<AnomalyReportEvent>(e);
192  event.data.anomalyReport.severity = ev->getSeverity();
193  event.data.anomalyReport.msg = ev->getMessage().c_str();
194  break;
195  }
197  {
198  WebVttCueEventPtr ev = std::dynamic_pointer_cast<WebVttCueEvent>(e);
199  event.data.cue.cueData = ev->getCueData();
200  break;
201  }
203  {
204  AdResolvedEventPtr ev = std::dynamic_pointer_cast<AdResolvedEvent>(e);
205  event.data.adResolved.resolveStatus = ev->getResolveStatus();
206  event.data.adResolved.adId = ev->getAdId().c_str();
207  event.data.adResolved.startMS = ev->getStart();
208  event.data.adResolved.durationMs = ev->getDuration();
209  break;
210  }
213  {
214  AdReservationEventPtr ev = std::dynamic_pointer_cast<AdReservationEvent>(e);
215  event.data.adReservation.adBreakId = ev->getAdBreakId().c_str();
216  event.data.adReservation.position = ev->getPosition();
217  break;
218  }
223  {
224  AdPlacementEventPtr ev = std::dynamic_pointer_cast<AdPlacementEvent>(e);
225  event.data.adPlacement.adId = ev->getAdId().c_str();
226  event.data.adPlacement.position = ev->getPosition();
227  event.data.adPlacement.offset = ev->getOffset();
228  event.data.adPlacement.duration = ev->getDuration();
229  event.data.adPlacement.errorCode = ev->getErrorCode();
230  break;
231  }
233  {
234  MetricsDataEventPtr ev = std::dynamic_pointer_cast<MetricsDataEvent>(e);
235  event.data.metricsData.type = ev->getMetricsDataType();
236  event.data.metricsData.metricUUID = ev->getMetricUUID().c_str();
237  event.data.metricsData.data = ev->getMetricsData().c_str();
238  break;
239  }
241  {
242  ID3MetadataEventPtr ev = std::dynamic_pointer_cast<ID3MetadataEvent>(e);
243  // This is a calculated risk. ID3 metadata is used b Sky alone and they are making a copy of
244  // data before processing it which will avoid any unexpected behavior here.
245  // This support will be removed once all AAMP users move onto the new event listener implementation
246  event.data.id3Metadata.data = const_cast<uint8_t *>(ev->getMetadata().data());
247  event.data.id3Metadata.length = ev->getMetadataSize();
248  break;
249  }
251  {
252  DrmMessageEventPtr ev = std::dynamic_pointer_cast<DrmMessageEvent>(e);
253  event.data.drmMessage.data = ev->getMessage().c_str();
254  break;
255  }
257  {
258  ContentGapEventPtr ev = std::dynamic_pointer_cast<ContentGapEvent>(e);
259  event.data.timedMetadata.timeMilliseconds = ev->getTime();
260  event.data.timedMetadata.durationMilliSeconds = ev->getDuration();
261  break;
262  }
264  {
265  HTTPResponseHeaderEventPtr ev = std::dynamic_pointer_cast<HTTPResponseHeaderEvent>(e);
266  event.data.httpResponseHeader.header = ev->getHeader().c_str();
267  event.data.httpResponseHeader.response = ev->getResponse().c_str();
268  break;
269  }
271  {
272  ContentProtectionDataEventPtr ev = std::dynamic_pointer_cast<ContentProtectionDataEvent>(e);
273  event.data.contentProtectionData.keyID = const_cast<uint8_t *>(ev->getKeyID().data());
274  event.data.contentProtectionData.streamType = ev->getStreamType().c_str();
275  break;
276  }
277  default:
278  // Some events without payload also falls here, for now
279  // Hence skipping adding an assert to purposefully crash if mapping is not done to Legacy event
280  break;
281  }
282 }
283 
284 /**
285  * @brief API to send event to event listener
286  * Additional processing can be done here if required
287  */
288 void AAMPEventListener::SendEvent(const AAMPEventPtr &event)
289 {
290  AAMPEvent legacyEvent;
291  // Convert to AAMPEvent for legacy event listeners
292  GenerateLegacyAAMPEvent(event, legacyEvent);
293  Event(legacyEvent);
294 }
295 
296 /**
297  * @brief API to send event.
298  */
299 void AAMPEventObjectListener::SendEvent(const AAMPEventPtr &event)
300 {
301  Event(event);
302 }
AAMP_EVENT_DRM_METADATA
@ AAMP_EVENT_DRM_METADATA
Definition: AampEvent.h:71
AAMP_EVENT_BULK_TIMED_METADATA
@ AAMP_EVENT_BULK_TIMED_METADATA
Definition: AampEvent.h:59
AAMPEventObjectListener::SendEvent
void SendEvent(const AAMPEventPtr &event) override
API to send event.
Definition: AampEventListener.cpp:299
AAMPEventObjectListener::Event
virtual void Event(const AAMPEventPtr &event)=0
API in which event payload is received. Will be overridden by application and its event processing is...
GenerateLegacyAAMPEvent
static void GenerateLegacyAAMPEvent(const AAMPEventPtr &e, AAMPEvent &event)
API to convert AAMPEventPtr object to legacy AAMPEvent object.
Definition: AampEventListener.cpp:34
AAMP_EVENT_CONTENT_GAP
@ AAMP_EVENT_CONTENT_GAP
Definition: AampEvent.h:85
AAMP_EVENT_AD_PLACEMENT_END
@ AAMP_EVENT_AD_PLACEMENT_END
Definition: AampEvent.h:78
AAMP_EVENT_BUFFERING_CHANGED
@ AAMP_EVENT_BUFFERING_CHANGED
Definition: AampEvent.h:64
AAMP_EVENT_REPORT_ANOMALY
@ AAMP_EVENT_REPORT_ANOMALY
Definition: AampEvent.h:72
AAMP_EVENT_TUNE_FAILED
@ AAMP_EVENT_TUNE_FAILED
Definition: AampEvent.h:48
AAMP_EVENT_DRM_MESSAGE
@ AAMP_EVENT_DRM_MESSAGE
Definition: AampEvent.h:83
AAMP_EVENT_AD_RESERVATION_END
@ AAMP_EVENT_AD_RESERVATION_END
Definition: AampEvent.h:76
AAMP_EVENT_STATE_CHANGED
@ AAMP_EVENT_STATE_CHANGED
Definition: AampEvent.h:60
AAMP_EVENT_SPEEDS_CHANGED
@ AAMP_EVENT_SPEEDS_CHANGED
Definition: AampEvent.h:61
AampEventListener.h
Classes for AAMP Event listener.
AAMP_EVENT_AD_PLACEMENT_PROGRESS
@ AAMP_EVENT_AD_PLACEMENT_PROGRESS
Definition: AampEvent.h:80
AAMP_EVENT_SPEED_CHANGED
@ AAMP_EVENT_SPEED_CHANGED
Definition: AampEvent.h:49
AAMP_EVENT_AD_RESOLVED
@ AAMP_EVENT_AD_RESOLVED
Definition: AampEvent.h:74
AAMP_EVENT_CONTENT_PROTECTION_DATA_UPDATE
@ AAMP_EVENT_CONTENT_PROTECTION_DATA_UPDATE
Definition: AampEvent.h:88
AAMPEvent
Structure of the AAMP events. Recommend new AAMP integration layers to use AAMPEventObject based list...
Definition: AampEvent.h:204
AAMP_EVENT_TUNE_PROFILING
@ AAMP_EVENT_TUNE_PROFILING
Definition: AampEvent.h:63
AAMPEventListener::SendEvent
void SendEvent(const AAMPEventPtr &event) override
API to send event to event listener Additional processing can be done here if required.
Definition: AampEventListener.cpp:288
AAMP_EVENT_ID3_METADATA
@ AAMP_EVENT_ID3_METADATA
Definition: AampEvent.h:82
AAMP_EVENT_REPORT_METRICS_DATA
@ AAMP_EVENT_REPORT_METRICS_DATA
Definition: AampEvent.h:81
AAMP_EVENT_AD_RESERVATION_START
@ AAMP_EVENT_AD_RESERVATION_START
Definition: AampEvent.h:75
AAMP_EVENT_CC_HANDLE_RECEIVED
@ AAMP_EVENT_CC_HANDLE_RECEIVED
Definition: AampEvent.h:53
AAMP_EVENT_WEBVTT_CUE_DATA
@ AAMP_EVENT_WEBVTT_CUE_DATA
Definition: AampEvent.h:73
AAMP_EVENT_MEDIA_METADATA
@ AAMP_EVENT_MEDIA_METADATA
Definition: AampEvent.h:55
AAMPEventType
AAMPEventType
Type of the events sending to the JSPP player.
Definition: AampEvent.h:44
AAMP_EVENT_AD_PLACEMENT_START
@ AAMP_EVENT_AD_PLACEMENT_START
Definition: AampEvent.h:77
AAMP_EVENT_TIMED_METADATA
@ AAMP_EVENT_TIMED_METADATA
Definition: AampEvent.h:58
AAMP_EVENT_SEEKED
@ AAMP_EVENT_SEEKED
Definition: AampEvent.h:62
AAMP_EVENT_PROGRESS
@ AAMP_EVENT_PROGRESS
Definition: AampEvent.h:52
AAMPEventListener::Event
virtual void Event(const AAMPEvent &event)=0
API in which event payload is received. Will be overridden by application and its event processing is...
AAMP_EVENT_HTTP_RESPONSE_HEADER
@ AAMP_EVENT_HTTP_RESPONSE_HEADER
Definition: AampEvent.h:86
AAMP_EVENT_BITRATE_CHANGED
@ AAMP_EVENT_BITRATE_CHANGED
Definition: AampEvent.h:57
AAMP_EVENT_AD_PLACEMENT_ERROR
@ AAMP_EVENT_AD_PLACEMENT_ERROR
Definition: AampEvent.h:79