Clock consistency checks am: 1f32bef75b
am: d6b0ff208e
Change-Id: Ie9751ec03281cf98c0c87c29fc4a755d2b6fe80c
This commit is contained in:
@@ -160,6 +160,9 @@ class PolicyEngine {
|
|||||||
// expiry time changes.
|
// expiry time changes.
|
||||||
void NotifyExpirationUpdate(int64_t current_time);
|
void NotifyExpirationUpdate(int64_t current_time);
|
||||||
|
|
||||||
|
// Guard against clock rollbacks
|
||||||
|
int64_t GetCurrentTime();
|
||||||
|
|
||||||
// set_clock() is for testing only. It alters ownership of the
|
// set_clock() is for testing only. It alters ownership of the
|
||||||
// passed-in pointer.
|
// passed-in pointer.
|
||||||
void set_clock(Clock* clock);
|
void set_clock(Clock* clock);
|
||||||
@@ -191,6 +194,9 @@ class PolicyEngine {
|
|||||||
// calculate the time where renewal retries should occur.
|
// calculate the time where renewal retries should occur.
|
||||||
int64_t next_renewal_time_;
|
int64_t next_renewal_time_;
|
||||||
|
|
||||||
|
// to assist in clock rollback checks
|
||||||
|
int64_t last_recorded_current_time_;
|
||||||
|
|
||||||
// Used to dispatch CDM events.
|
// Used to dispatch CDM events.
|
||||||
CdmSessionId session_id_;
|
CdmSessionId session_id_;
|
||||||
WvCdmEventListener* event_listener_;
|
WvCdmEventListener* event_listener_;
|
||||||
|
|||||||
@@ -16,6 +16,8 @@ using video_widevine::License;
|
|||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
|
const int kCdmPolicyTimerDurationSeconds = 1;
|
||||||
|
const int kClockSkewDelta = 5; // seconds
|
||||||
const int64_t kHdcpCheckInterval = 10;
|
const int64_t kHdcpCheckInterval = 10;
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
@@ -34,6 +36,7 @@ PolicyEngine::PolicyEngine(CdmSessionId session_id,
|
|||||||
last_expiry_time_set_(false),
|
last_expiry_time_set_(false),
|
||||||
was_expired_on_load_(false),
|
was_expired_on_load_(false),
|
||||||
next_renewal_time_(0),
|
next_renewal_time_(0),
|
||||||
|
last_recorded_current_time_(0),
|
||||||
session_id_(session_id),
|
session_id_(session_id),
|
||||||
event_listener_(event_listener),
|
event_listener_(event_listener),
|
||||||
license_keys_(new LicenseKeys),
|
license_keys_(new LicenseKeys),
|
||||||
@@ -84,7 +87,8 @@ void PolicyEngine::CheckDevice(int64_t current_time) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void PolicyEngine::OnTimerEvent() {
|
void PolicyEngine::OnTimerEvent() {
|
||||||
int64_t current_time = clock_->GetCurrentTime();
|
last_recorded_current_time_ += kCdmPolicyTimerDurationSeconds;
|
||||||
|
int64_t current_time = GetCurrentTime();
|
||||||
|
|
||||||
// If we have passed the grace period, the expiration will update.
|
// If we have passed the grace period, the expiration will update.
|
||||||
if (grace_period_end_time_ == 0 && HasPlaybackStarted(current_time)) {
|
if (grace_period_end_time_ == 0 && HasPlaybackStarted(current_time)) {
|
||||||
@@ -191,7 +195,7 @@ void PolicyEngine::UpdateLicense(const License& license) {
|
|||||||
license_start_time_ = license.license_start_time();
|
license_start_time_ = license.license_start_time();
|
||||||
next_renewal_time_ = license_start_time_ + policy_.renewal_delay_seconds();
|
next_renewal_time_ = license_start_time_ + policy_.renewal_delay_seconds();
|
||||||
|
|
||||||
int64_t current_time = clock_->GetCurrentTime();
|
int64_t current_time = GetCurrentTime();
|
||||||
if (!policy_.can_play() ||
|
if (!policy_.can_play() ||
|
||||||
HasLicenseOrPlaybackDurationExpired(current_time)) {
|
HasLicenseOrPlaybackDurationExpired(current_time)) {
|
||||||
license_state_ = kLicenseStateExpired;
|
license_state_ = kLicenseStateExpired;
|
||||||
@@ -216,7 +220,7 @@ void PolicyEngine::BeginDecryption() {
|
|||||||
case kLicenseStateCanPlay:
|
case kLicenseStateCanPlay:
|
||||||
case kLicenseStateNeedRenewal:
|
case kLicenseStateNeedRenewal:
|
||||||
case kLicenseStateWaitingLicenseUpdate:
|
case kLicenseStateWaitingLicenseUpdate:
|
||||||
playback_start_time_ = clock_->GetCurrentTime();
|
playback_start_time_ = GetCurrentTime();
|
||||||
last_playback_time_ = playback_start_time_;
|
last_playback_time_ = playback_start_time_;
|
||||||
if (policy_.play_start_grace_period_seconds() == 0)
|
if (policy_.play_start_grace_period_seconds() == 0)
|
||||||
grace_period_end_time_ = playback_start_time_;
|
grace_period_end_time_ = playback_start_time_;
|
||||||
@@ -236,7 +240,7 @@ void PolicyEngine::BeginDecryption() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void PolicyEngine::DecryptionEvent() {
|
void PolicyEngine::DecryptionEvent() {
|
||||||
last_playback_time_ = clock_->GetCurrentTime();
|
last_playback_time_ = GetCurrentTime();
|
||||||
}
|
}
|
||||||
|
|
||||||
void PolicyEngine::NotifyResolution(uint32_t width, uint32_t height) {
|
void PolicyEngine::NotifyResolution(uint32_t width, uint32_t height) {
|
||||||
@@ -250,7 +254,7 @@ void PolicyEngine::NotifySessionExpiration() {
|
|||||||
|
|
||||||
CdmResponseType PolicyEngine::Query(CdmQueryMap* query_response) {
|
CdmResponseType PolicyEngine::Query(CdmQueryMap* query_response) {
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
int64_t current_time = clock_->GetCurrentTime();
|
int64_t current_time = GetCurrentTime();
|
||||||
|
|
||||||
if (license_state_ == kLicenseStateInitial) {
|
if (license_state_ == kLicenseStateInitial) {
|
||||||
query_response->clear();
|
query_response->clear();
|
||||||
@@ -291,7 +295,7 @@ CdmResponseType PolicyEngine::QueryKeyAllowedUsage(
|
|||||||
bool PolicyEngine::GetSecondsSinceStarted(int64_t* seconds_since_started) {
|
bool PolicyEngine::GetSecondsSinceStarted(int64_t* seconds_since_started) {
|
||||||
if (playback_start_time_ == 0) return false;
|
if (playback_start_time_ == 0) return false;
|
||||||
|
|
||||||
*seconds_since_started = clock_->GetCurrentTime() - playback_start_time_;
|
*seconds_since_started = GetCurrentTime() - playback_start_time_;
|
||||||
return (*seconds_since_started >= 0) ? true : false;
|
return (*seconds_since_started >= 0) ? true : false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -299,12 +303,12 @@ bool PolicyEngine::GetSecondsSinceLastPlayed(
|
|||||||
int64_t* seconds_since_last_played) {
|
int64_t* seconds_since_last_played) {
|
||||||
if (last_playback_time_ == 0) return false;
|
if (last_playback_time_ == 0) return false;
|
||||||
|
|
||||||
*seconds_since_last_played = clock_->GetCurrentTime() - last_playback_time_;
|
*seconds_since_last_played = GetCurrentTime() - last_playback_time_;
|
||||||
return (*seconds_since_last_played >= 0) ? true : false;
|
return (*seconds_since_last_played >= 0) ? true : false;
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t PolicyEngine::GetLicenseOrPlaybackDurationRemaining() {
|
int64_t PolicyEngine::GetLicenseOrPlaybackDurationRemaining() {
|
||||||
const int64_t current_time = clock_->GetCurrentTime();
|
const int64_t current_time = GetCurrentTime();
|
||||||
const int64_t expiry_time =
|
const int64_t expiry_time =
|
||||||
GetExpiryTime(current_time,
|
GetExpiryTime(current_time,
|
||||||
/* ignore_soft_enforce_playback_duration */ false);
|
/* ignore_soft_enforce_playback_duration */ false);
|
||||||
@@ -328,7 +332,7 @@ void PolicyEngine::RestorePlaybackTimes(int64_t playback_start_time,
|
|||||||
playback_start_time_ = grace_period_end_time;
|
playback_start_time_ = grace_period_end_time;
|
||||||
}
|
}
|
||||||
|
|
||||||
const int64_t current_time = clock_->GetCurrentTime();
|
const int64_t current_time = GetCurrentTime();
|
||||||
const int64_t expiry_time =
|
const int64_t expiry_time =
|
||||||
GetExpiryTime(current_time,
|
GetExpiryTime(current_time,
|
||||||
/* ignore_soft_enforce_playback_duration */ true);
|
/* ignore_soft_enforce_playback_duration */ true);
|
||||||
@@ -466,6 +470,15 @@ void PolicyEngine::NotifyExpirationUpdate(int64_t current_time) {
|
|||||||
last_expiry_time_set_ = true;
|
last_expiry_time_set_ = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int64_t PolicyEngine::GetCurrentTime() {
|
||||||
|
int64_t current_time = clock_->GetCurrentTime();
|
||||||
|
if (current_time + kClockSkewDelta < last_recorded_current_time_)
|
||||||
|
current_time = last_recorded_current_time_;
|
||||||
|
else
|
||||||
|
last_recorded_current_time_ = current_time;
|
||||||
|
return current_time;
|
||||||
|
}
|
||||||
|
|
||||||
void PolicyEngine::set_clock(Clock* clock) { clock_.reset(clock); }
|
void PolicyEngine::set_clock(Clock* clock) { clock_.reset(clock); }
|
||||||
|
|
||||||
} // namespace wvcdm
|
} // namespace wvcdm
|
||||||
|
|||||||
Reference in New Issue
Block a user