Skip to content

Commit d116573

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 d116573

12 files changed

Lines changed: 247 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: 59 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
*/
@@ -864,6 +877,7 @@ bool PrivateCDAIObjectMPD::CheckForAdTerminate(double currOffset)
864877
uint64_t fragOffset = (uint64_t)(currOffset * 1000);
865878
if (mCurAds && (mCurAdIdx < mCurAds->size()))
866879
{
880+
867881
if (fragOffset >= (mCurAds->at(mCurAdIdx).duration + OFFSET_ALIGN_FACTOR))
868882
{
869883
//Current Ad is playing beyond the AdBreak + OFFSET_ALIGN_FACTOR
@@ -1585,7 +1599,7 @@ void PrivateCDAIObjectMPD::CacheAdData(const std::string &periodId, const std::s
15851599
std::lock_guard<std::mutex> guard(mAdFulfillMtx);
15861600
if(isAdBreakObjectExist(periodId))
15871601
{
1588-
mAdBreaks[periodId].ads->emplace_back(AdNode{false, false, false, adId, url, 0, "", 0, NULL});
1602+
mAdBreaks[periodId].ads->emplace_back(AdNode{false, false, false, adId, url, 0, "", 0, NULL, ""});
15891603
mAdFulfillQ.push(AdFulfillObj(periodId, adId, url));
15901604
notify = true;
15911605
}
@@ -1909,3 +1923,47 @@ void PrivateCDAIObjectMPD::NotifyReservationComplete(const std::string& reservat
19091923
AAMPLOG_WARN("[CDAI] NotifyReservationComplete: adBreakId %s not found", reservationId.c_str());
19101924
}
19111925
}
1926+
1927+
/**
1928+
* @brief Cancel the reservation for the ad break
1929+
* @param[in] playingReservationId Ad break ID to be cancelled
1930+
* @param[in] cancelAtReservationId Ad break ID at which the cancellation should happen
1931+
*/
1932+
void PrivateCDAIObjectMPD::CancelReservation(const std::string& playingReservationId, const std::string& cancelAtReservationId)
1933+
{
1934+
std::lock_guard<std::mutex> lock(mDaiMtx); // Ensure thread safety if ad state is shared
1935+
1936+
// Log the action for audit/debug
1937+
AAMPLOG_INFO("[CDAI] PrivateCDAIObjectMPD::CancelReservation called: playingReservationId=%s, cancelAtReservationId=%s",
1938+
playingReservationId.c_str(), cancelAtReservationId.c_str());
1939+
1940+
// Identify the break currently being played based on the ads vector pointer
1941+
std::string currentBreakId;
1942+
if (mCurAds)
1943+
{
1944+
for (const auto &entry : mAdBreaks)
1945+
{
1946+
const AdBreakObject &abObj = entry.second;
1947+
if (abObj.ads && (abObj.ads.get() == mCurAds.get()))
1948+
{
1949+
currentBreakId = entry.first;
1950+
break;
1951+
}
1952+
}
1953+
}
1954+
1955+
// Validate that the request targets the currently playing reservation/break
1956+
if (!currentBreakId.empty() && (playingReservationId == currentBreakId) &&
1957+
mCurAds && mCurAdIdx >= 0 && mCurAdIdx < (int)mCurAds->size())
1958+
{
1959+
mCurAds->at(mCurAdIdx).cancelAtReservationId = cancelAtReservationId;
1960+
AAMPLOG_INFO("[CDAI] AD under reservationId=%s will be truncated at %s.",
1961+
playingReservationId.c_str(), cancelAtReservationId.c_str());
1962+
}
1963+
else
1964+
{
1965+
// Either not in an ad break or mismatched reservation; avoid mutating wrong state
1966+
AAMPLOG_WARN("[CDAI] CancelReservation ignored: currentBreakId=%s does not match playingReservationId=%s",
1967+
currentBreakId.c_str(), playingReservationId.c_str());
1968+
}
1969+
}

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)