Skip to content

Commit 324e893

Browse files
committed
VPLAY-12568:Implement cancelReservation UVE-API
Reason for change:cancelReservation UVE call Test Procedure: Refer jira ticket Priority: P1 Signed-off-by: varshnie <varshniblue14@gmail.com>
1 parent 24cf84e commit 324e893

12 files changed

Lines changed: 228 additions & 6 deletions

AdManagerBase.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,14 @@ class CDAIObject
110110
* @param[in] reservationId The reservation identifier
111111
*/
112112
virtual void NotifyReservationComplete(const std::string& reservationId) {}
113+
114+
/**
115+
* @fn cancelReservation
116+
* @brief Cancel ad reservation
117+
* @param[in] playingReservationId The reservation identifier which is currently playing
118+
* @param[in] cancelAtReservationId The reservation identifier which needs to be cancelled
119+
*/
120+
virtual void CancelReservation(const std::string& playingReservationId, const std::string& cancelAtReservationId) {}
113121
};
114122

115123

admanager_mpd.cpp

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,19 @@ void CDAIObjectMPD::NotifyReservationComplete(const std::string& reservationId)
6767
}
6868
}
6969

70+
/**
71+
* @brief Cancel ad reservation
72+
* @param[in] playingReservationId The reservation identifier which is currently playing
73+
* @param[in] cancelAtReservationId The reservation identifier which needs to be cancelled
74+
*/
75+
void CDAIObjectMPD::CancelReservation(const std::string& playingReservationId, const std::string& cancelAtReservationId)
76+
{
77+
if (mPrivObj)
78+
{
79+
mPrivObj->CancelReservation(playingReservationId, cancelAtReservationId);
80+
}
81+
}
82+
7083
/**
7184
* @brief PrivateCDAIObjectMPD constructor
7285
*/
@@ -1585,7 +1598,7 @@ void PrivateCDAIObjectMPD::CacheAdData(const std::string &periodId, const std::s
15851598
std::lock_guard<std::mutex> guard(mAdFulfillMtx);
15861599
if(isAdBreakObjectExist(periodId))
15871600
{
1588-
mAdBreaks[periodId].ads->emplace_back(AdNode{false, false, false, adId, url, 0, "", 0, NULL});
1601+
mAdBreaks[periodId].ads->emplace_back(AdNode{false, false, false, adId, url, 0, "", 0, NULL, ""});
15891602
mAdFulfillQ.push(AdFulfillObj(periodId, adId, url));
15901603
notify = true;
15911604
}
@@ -1909,3 +1922,29 @@ void PrivateCDAIObjectMPD::NotifyReservationComplete(const std::string& reservat
19091922
AAMPLOG_WARN("[CDAI] NotifyReservationComplete: adBreakId %s not found", reservationId.c_str());
19101923
}
19111924
}
1925+
1926+
/**
1927+
* @brief Cancel the reservation for the ad break
1928+
* @param[in] playingReservationId Ad break ID to be cancelled
1929+
* @param[in] cancelAtReservationId Ad break ID at which the cancellation should happen
1930+
*/
1931+
void PrivateCDAIObjectMPD::CancelReservation(const std::string& playingReservationId, const std::string& cancelAtReservationId)
1932+
{
1933+
std::lock_guard<std::mutex> lock(mDaiMtx); // Ensure thread safety if ad state is shared
1934+
1935+
// Log the action for audit/debug
1936+
AAMPLOG_INFO("[CDAI] PrivateCDAIObjectMPD::CancelReservation called: playingReservationId=%s, cancelAtReservationId=%s",
1937+
playingReservationId.c_str(), cancelAtReservationId.c_str());
1938+
1939+
// Apply cancellation to the currently playing ad in the current break
1940+
if (mCurAds && mCurAdIdx >= 0 && mCurAdIdx < (int)mCurAds->size())
1941+
{
1942+
mCurAds->at(mCurAdIdx).cancelAtReservationId = cancelAtReservationId;
1943+
AAMPLOG_INFO("[CDAI]AD playing under reservationId=%s will be truncated at %s.",
1944+
playingReservationId.c_str(), cancelAtReservationId.c_str());
1945+
}
1946+
else
1947+
{
1948+
AAMPLOG_WARN("[CDAI] PrivateCDAIObjectMPD::CancelReservation: No current ads list!");
1949+
}
1950+
}

admanager_mpd.h

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,14 @@ class CDAIObjectMPD: public CDAIObject
9898
* @param[in] reservationId The reservation identifier
9999
*/
100100
virtual void NotifyReservationComplete(const std::string& reservationId) override;
101+
102+
/**
103+
* @fn CancelReservation
104+
* @brief Cancel ad reservation
105+
* @param[in] playingReservationId The reservation identifier which is currently playing
106+
* @param[in] cancelAtReservationId The reservation identifier which needs to be cancelled
107+
*/
108+
virtual void CancelReservation(const std::string& playingReservationId, const std::string& cancelAtReservationId) override;
101109
};
102110

103111

@@ -130,11 +138,12 @@ struct AdNode {
130138
std::string basePeriodId; /**< Id of the base period at the beginning of the Ad */
131139
int basePeriodOffset; /**< Offset of the base period at the beginning of the Ad in milliseconds */
132140
MPD* mpd; /**< Pointer to the MPD object */
141+
std::string cancelAtReservationId;
133142

134143
/**
135144
* @brief AdNode default constructor
136145
*/
137-
AdNode() : invalid(false), placed(false), resolved(false), adId(), url(), duration(0), basePeriodId(), basePeriodOffset(0), mpd(nullptr)
146+
AdNode() : invalid(false), placed(false), resolved(false), adId(), url(), duration(0), basePeriodId(), basePeriodOffset(0), mpd(nullptr), cancelAtReservationId()
138147
{
139148

140149
}
@@ -153,9 +162,9 @@ struct AdNode {
153162
* @param[in] mpd - Pointer to the MPD object
154163
*/
155164
AdNode(bool invalid, bool placed, bool resolved, std::string adId, std::string url, uint64_t duration,
156-
std::string basePeriodId, int basePeriodOffset, MPD* mpd)
165+
std::string basePeriodId, int basePeriodOffset, MPD* mpd, std::string cancelAtReservationId="")
157166
: invalid(invalid), placed(placed), resolved(resolved), adId(std::move(adId)), url(std::move(url)), duration(duration), basePeriodId(std::move(basePeriodId)),
158-
basePeriodOffset(basePeriodOffset), mpd(mpd)
167+
basePeriodOffset(basePeriodOffset), mpd(mpd), cancelAtReservationId(std::move(cancelAtReservationId))
159168
{
160169

161170
}
@@ -168,7 +177,7 @@ struct AdNode {
168177
AdNode(const AdNode& adNode)
169178
: invalid(adNode.invalid), placed(adNode.placed), resolved(adNode.resolved), adId(adNode.adId),
170179
url(adNode.url), duration(adNode.duration), basePeriodId(adNode.basePeriodId),
171-
basePeriodOffset(adNode.basePeriodOffset), mpd(adNode.mpd)
180+
basePeriodOffset(adNode.basePeriodOffset), mpd(adNode.mpd), cancelAtReservationId(adNode.cancelAtReservationId)
172181
{
173182
}
174183

@@ -413,6 +422,13 @@ class PrivateCDAIObjectMPD
413422
*/
414423
void NotifyReservationComplete(const std::string& reservationId);
415424

425+
/**
426+
* @fn CancelReservation
427+
* @brief Cancel ad reservation
428+
* @param[in] playingReservationId The reservation identifier which is currently playing
429+
* @param[in] cancelAtReservationId The reservation identifier which needs to be cancelled
430+
*/
431+
void CancelReservation(const std::string& playingReservationId, const std::string& cancelAtReservationId);
416432
/**
417433
* @fn FulFillAdObject
418434
*

jsbindings/jsmediaplayer.cpp

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3567,6 +3567,53 @@ JSValueRef AAMPMediaPlayerJS_isOOBCCRenderingSupported (JSContextRef ctx, JSObje
35673567
return JSValueMakeBoolean(ctx, bRet);
35683568
}
35693569

3570+
/**
3571+
* @brief Callback invoked from JS to cancel ad reservation
3572+
* @param[in] ctx JS execution context
3573+
* @param[in] function JSObject that is the function being called
3574+
* @param[in] thisObject JSObject that is the 'this' variable in the function's scope
3575+
* @param[in] argumentCount number of args
3576+
* @param[in] arguments[] JSValue array of args
3577+
* @param[out] exception pointer to a JSValueRef in which to return an exception, if any
3578+
* @retval JSValue that is the function's return value
3579+
*/
3580+
static JSValueRef AAMPMediaPlayer_JS_cancelReservation(JSContextRef ctx, JSObjectRef function,
3581+
JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[],
3582+
JSValueRef* exception)
3583+
{
3584+
LOG_TRACE("Enter");
3585+
3586+
AAMPMediaPlayer_JS* privObj = (AAMPMediaPlayer_JS*)JSObjectGetPrivate(thisObject);
3587+
if(!privObj || !privObj->_aamp)
3588+
{
3589+
LOG_ERROR_EX("JSObjectGetPrivate returned NULL!");
3590+
*exception = aamp_GetException(ctx, AAMPJS_MISSING_OBJECT, "Can only call CancelReservation() on instances of AAMPPlayer");
3591+
return JSValueMakeUndefined(ctx);
3592+
}
3593+
3594+
if (argumentCount != 2)
3595+
{
3596+
LOG_ERROR(privObj,"InvalidArgument - argumentCount=%zu, expected: 2", argumentCount);
3597+
*exception = aamp_GetException(ctx, AAMPJS_INVALID_ARGUMENT, "Failed to execute CancelReservation() - 2 arguments required");
3598+
return JSValueMakeUndefined(ctx);
3599+
}
3600+
3601+
char* playingReservationId_c = aamp_JSValueToCString(ctx, arguments[0], exception);
3602+
char* cancelAtReservationId_c = aamp_JSValueToCString(ctx, arguments[1], exception);
3603+
3604+
std::string playingReservationId = playingReservationId_c ? playingReservationId_c : "";
3605+
std::string cancelAtReservationId = cancelAtReservationId_c ? cancelAtReservationId_c : "";
3606+
3607+
SAFE_DELETE_ARRAY(playingReservationId_c);
3608+
SAFE_DELETE_ARRAY(cancelAtReservationId_c);
3609+
3610+
LOG_INFO(privObj, "CancelReservation called with playingReservationId=%s, cancelAtReservationId=%s", playingReservationId.c_str(), cancelAtReservationId.c_str());
3611+
privObj->_aamp->CancelReservation(playingReservationId, cancelAtReservationId);
3612+
3613+
LOG_TRACE("EXIT");
3614+
return JSValueMakeUndefined(ctx);
3615+
}
3616+
35703617
/**
35713618
* @brief Array containing the AAMPMediaPlayer's statically declared functions
35723619
*/
@@ -3643,7 +3690,7 @@ static const JSStaticFunction AAMPMediaPlayer_JS_static_functions[] = {
36433690

36443691
{ "getSessionID", AAMPMediaPlayerJS_getSessionID, kJSPropertyAttributeDontDelete | kJSPropertyAttributeReadOnly},
36453692
{ "updateManifest", AAMPMediaPlayerJS_updateManifest, kJSPropertyAttributeDontDelete | kJSPropertyAttributeReadOnly },
3646-
3693+
{ "cancelReservation", AAMPMediaPlayer_JS_cancelReservation, kJSPropertyAttributeDontDelete | kJSPropertyAttributeReadOnly },
36473694
{ NULL, NULL, 0 },
36483695
};
36493696

main_aamp.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,17 @@ void PlayerInstanceAAMP::NotifyReservationComplete(const std::string& reservatio
280280
aamp->NotifyReservationComplete(reservationId);
281281
}
282282

283+
/**
284+
* @brief Cancel an ad reservation.
285+
*/
286+
void PlayerInstanceAAMP::CancelReservation(const std::string& playingReservationId, const std::string& cancelAtReservationId)
287+
{
288+
if (aamp)
289+
{
290+
aamp->CancelReservation(playingReservationId, cancelAtReservationId);
291+
}
292+
}
293+
283294
/**
284295
* @brief API to reset configuration across tunes for single player instance
285296
*/

main_aamp.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,15 @@ class PlayerInstanceAAMP
188188
*/
189189
void NotifyReservationComplete(const std::string& reservationId);
190190

191+
/**
192+
* @fn CancelReservation
193+
*
194+
* @param[in] playingReservationId - Reservation Id which is currently playing.
195+
* @param[in] cancelAtReservationId - Reservation Id at which the cancellation has to be done.
196+
* @return void
197+
*/
198+
void CancelReservation(const std::string& playingReservationId, const std::string& cancelAtReservationId);
199+
191200
/**
192201
* @fn SetUserAgent
193202
*

priv_aamp.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9245,6 +9245,22 @@ void PrivateInstanceAAMP::NotifyReservationComplete(const std::string& reservati
92459245
}
92469246
}
92479247

9248+
/**
9249+
* @brief Cancel ad reservation
9250+
* @param[in] playingReservationId The reservation identifier of the currently playing ad, if any. This can be used by the CDAIObject to determine if the cancellation is for an ad that is currently playing.
9251+
* @param[in] cancelAtReservationId The reservation identifier of the ad reservation to be cancelled. This is the reservation that the CDAIObject should cancel. If this matches the playingReservationId, it indicates that the currently playing ad reservation should be cancelled.
9252+
*/
9253+
void PrivateInstanceAAMP::CancelReservation(const std::string& playingReservationId, const std::string& cancelAtReservationId)
9254+
{
9255+
if (mCdaiObject) {
9256+
mCdaiObject->CancelReservation(playingReservationId, cancelAtReservationId);
9257+
}
9258+
else
9259+
{
9260+
AAMPLOG_WARN("[AAMP] CDAIObject not set. Cannot cancel reservation for reservationId: %s ", cancelAtReservationId.c_str());
9261+
}
9262+
}
9263+
92489264
/**
92499265
* @brief updates download metrics to VideoStat object, this is used for VideoFragment as it takes duration for calculation purpose.
92509266
*/

priv_aamp.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1599,6 +1599,15 @@ class PrivateInstanceAAMP : public DrmCallbacks, public std::enable_shared_from_
15991599
*/
16001600
void NotifyReservationComplete(const std::string& reservationId);
16011601

1602+
/**
1603+
* @fn CancelReservation
1604+
*
1605+
* @param[in] playingReservationId The reservation identifier which is currently playing
1606+
* @param[in] cancelAtReservationId The reservation identifier which needs to be cancelled
1607+
* @return void
1608+
*/
1609+
void CancelReservation(const std::string& playingReservationId, const std::string& cancelAtReservationId);
1610+
16021611
/**
16031612
* @fn getLastInjectedPosition
16041613
*

test/utests/fakes/FakeAdManager.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,4 +161,8 @@ void CDAIObjectMPD::NotifyReservationComplete(const std::string& reservationId)
161161
{
162162
g_MockPrivateCDAIObjectMPD->NotifyReservationComplete(reservationId);
163163
}
164+
}
165+
166+
void CDAIObjectMPD::CancelReservation(const std::string& playingReservationId, const std::string& cancelAtReservationId)
167+
{
164168
}

test/utests/fakes/FakePlayerInstanceAamp.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,7 @@ const std::vector<TimedMetadata> & PlayerInstanceAAMP::GetTimedMetadata( void )
169169
void PlayerInstanceAAMP::ProcessContentProtectionDataConfig(const char *jsonbuffer) { }
170170
void PlayerInstanceAAMP::SetRuntimeDRMConfigSupport(bool DynamicDRMSupported) { }
171171
void PlayerInstanceAAMP::NotifyReservationComplete(const std::string& reservationId) { }
172+
void PlayerInstanceAAMP::CancelReservation(const std::string& playingReservationId, const std::string& cancelAtReservationId) { }
172173
bool PlayerInstanceAAMP::IsLive() { return false; }
173174
bool PlayerInstanceAAMP::GetVideoMute(void) { return false; }
174175
bool PlayerInstanceAAMP::GetCCStatus(void) { return false; }

0 commit comments

Comments
 (0)