Index: content/renderer/media/android/webmediaplayer_android.cc |
diff --git a/content/renderer/media/android/webmediaplayer_android.cc b/content/renderer/media/android/webmediaplayer_android.cc |
index adac35d3b26507b262168b02656f4c315f816cea..43f2cf564477bd4903d703a24e1b0a2b6aa36632 100644 |
--- a/content/renderer/media/android/webmediaplayer_android.cc |
+++ b/content/renderer/media/android/webmediaplayer_android.cc |
@@ -1090,14 +1090,20 @@ const gfx::RectF WebMediaPlayerAndroid::GetBoundaryRectangle() { |
// The following EME related code is copied from WebMediaPlayerImpl. |
// TODO(xhwang): Remove duplicate code between WebMediaPlayerAndroid and |
// WebMediaPlayerImpl. |
-// TODO(kjyoun): Update Google TV EME implementation to use IPC. |
+ |
+// Convert a WebString to ASCII, falling back on an empty string in the case |
+// of a non-ASCII string. |
+static std::string ToASCIIOrEmpty(const blink::WebString& string) { |
+ return IsStringASCII(string) ? UTF16ToASCII(string) : std::string(); |
+} |
// Helper functions to report media EME related stats to UMA. They follow the |
// convention of more commonly used macros UMA_HISTOGRAM_ENUMERATION and |
// UMA_HISTOGRAM_COUNTS. The reason that we cannot use those macros directly is |
// that UMA_* macros require the names to be constant throughout the process' |
// lifetime. |
-static void EmeUMAHistogramEnumeration(const blink::WebString& key_system, |
+ |
+static void EmeUMAHistogramEnumeration(const std::string& key_system, |
const std::string& method, |
int sample, |
int boundary_value) { |
@@ -1107,7 +1113,7 @@ static void EmeUMAHistogramEnumeration(const blink::WebString& key_system, |
base::Histogram::kUmaTargetedHistogramFlag)->Add(sample); |
} |
-static void EmeUMAHistogramCounts(const blink::WebString& key_system, |
+static void EmeUMAHistogramCounts(const std::string& key_system, |
const std::string& method, |
int sample) { |
// Use the same parameters as UMA_HISTOGRAM_COUNTS. |
@@ -1143,7 +1149,7 @@ static MediaKeyException MediaKeyExceptionForUMA( |
// values from above, for reporting to UMA. |
static void ReportMediaKeyExceptionToUMA( |
const std::string& method, |
- const WebString& key_system, |
+ const std::string& key_system, |
WebMediaPlayer::MediaKeyException e) { |
MediaKeyException result_id = MediaKeyExceptionForUMA(e); |
DCHECK_NE(result_id, kUnknownResultId) << e; |
@@ -1151,39 +1157,42 @@ static void ReportMediaKeyExceptionToUMA( |
key_system, method, result_id, kMaxMediaKeyException); |
} |
+bool WebMediaPlayerAndroid::IsKeySystemSupported( |
+ const std::string& key_system) { |
+ // On Android, EME only works with MSE. |
+ return player_type_ == MEDIA_PLAYER_TYPE_MEDIA_SOURCE && |
+ IsConcreteSupportedKeySystem(key_system); |
+} |
+ |
WebMediaPlayer::MediaKeyException WebMediaPlayerAndroid::generateKeyRequest( |
const WebString& key_system, |
const unsigned char* init_data, |
unsigned init_data_length) { |
+ DVLOG(1) << "generateKeyRequest: " << base::string16(key_system) << ": " |
+ << std::string(reinterpret_cast<const char*>(init_data), |
+ static_cast<size_t>(init_data_length)); |
+ |
+ std::string ascii_key_system = ToASCIIOrEmpty(key_system); |
+ |
WebMediaPlayer::MediaKeyException e = |
- GenerateKeyRequestInternal(key_system, init_data, init_data_length); |
- ReportMediaKeyExceptionToUMA("generateKeyRequest", key_system, e); |
+ GenerateKeyRequestInternal(ascii_key_system, init_data, init_data_length); |
+ ReportMediaKeyExceptionToUMA("generateKeyRequest", ascii_key_system, e); |
return e; |
} |
-bool WebMediaPlayerAndroid::IsKeySystemSupported(const WebString& key_system) { |
- // On Android, EME only works with MSE. |
- return player_type_ == MEDIA_PLAYER_TYPE_MEDIA_SOURCE && |
- IsConcreteSupportedKeySystem(key_system); |
-} |
- |
// TODO(xhwang): Report an error when there is encrypted stream but EME is |
// not enabled. Currently the player just doesn't start and waits for |
// ever. |
WebMediaPlayer::MediaKeyException |
WebMediaPlayerAndroid::GenerateKeyRequestInternal( |
- const WebString& key_system, |
+ const std::string& key_system, |
const unsigned char* init_data, |
unsigned init_data_length) { |
- DVLOG(1) << "generateKeyRequest: " << key_system.utf8().data() << ": " |
- << std::string(reinterpret_cast<const char*>(init_data), |
- static_cast<size_t>(init_data_length)); |
- |
if (!IsKeySystemSupported(key_system)) |
return WebMediaPlayer::MediaKeyExceptionKeySystemNotSupported; |
// We do not support run-time switching between key systems for now. |
- if (current_key_system_.isEmpty()) { |
+ if (current_key_system_.empty()) { |
if (!proxy_decryptor_) { |
proxy_decryptor_.reset(new ProxyDecryptor( |
#if defined(ENABLE_PEPPER_CDMS) |
@@ -1202,7 +1211,7 @@ WebMediaPlayerAndroid::GenerateKeyRequestInternal( |
weak_factory_.GetWeakPtr()))); |
} |
- if (!proxy_decryptor_->InitializeCDM(key_system.utf8(), |
+ if (!proxy_decryptor_->InitializeCDM(key_system, |
frame_->document().url())) { |
return WebMediaPlayer::MediaKeyExceptionKeySystemNotSupported; |
} |
@@ -1222,7 +1231,7 @@ WebMediaPlayerAndroid::GenerateKeyRequestInternal( |
// from the application. |
if (!proxy_decryptor_->GenerateKeyRequest( |
init_data_type_, init_data, init_data_length)) { |
- current_key_system_.reset(); |
+ current_key_system_.clear(); |
return WebMediaPlayer::MediaKeyExceptionKeySystemNotSupported; |
} |
@@ -1236,66 +1245,81 @@ WebMediaPlayer::MediaKeyException WebMediaPlayerAndroid::addKey( |
const unsigned char* init_data, |
unsigned init_data_length, |
const WebString& session_id) { |
- WebMediaPlayer::MediaKeyException e = AddKeyInternal( |
- key_system, key, key_length, init_data, init_data_length, session_id); |
- ReportMediaKeyExceptionToUMA("addKey", key_system, e); |
+ DVLOG(1) << "addKey: " << base::string16(key_system) << ": " |
+ << std::string(reinterpret_cast<const char*>(key), |
+ static_cast<size_t>(key_length)) << ", " |
+ << std::string(reinterpret_cast<const char*>(init_data), |
+ static_cast<size_t>(init_data_length)) |
+ << " [" << base::string16(session_id) << "]"; |
+ |
+ std::string ascii_key_system = ToASCIIOrEmpty(key_system); |
+ std::string ascii_session_id = ToASCIIOrEmpty(session_id); |
+ |
+ WebMediaPlayer::MediaKeyException e = AddKeyInternal(ascii_key_system, |
+ key, |
+ key_length, |
+ init_data, |
+ init_data_length, |
+ ascii_session_id); |
+ ReportMediaKeyExceptionToUMA("addKey", ascii_key_system, e); |
return e; |
} |
WebMediaPlayer::MediaKeyException WebMediaPlayerAndroid::AddKeyInternal( |
- const WebString& key_system, |
+ const std::string& key_system, |
const unsigned char* key, |
unsigned key_length, |
const unsigned char* init_data, |
unsigned init_data_length, |
- const WebString& session_id) { |
+ const std::string& session_id) { |
DCHECK(key); |
DCHECK_GT(key_length, 0u); |
- DVLOG(1) << "addKey: " << key_system.utf8().data() << ": " |
- << std::string(reinterpret_cast<const char*>(key), |
- static_cast<size_t>(key_length)) << ", " |
- << std::string(reinterpret_cast<const char*>(init_data), |
- static_cast<size_t>(init_data_length)) |
- << " [" << session_id.utf8().data() << "]"; |
if (!IsKeySystemSupported(key_system)) |
return WebMediaPlayer::MediaKeyExceptionKeySystemNotSupported; |
- if (current_key_system_.isEmpty() || key_system != current_key_system_) |
+ if (current_key_system_.empty() || key_system != current_key_system_) |
return WebMediaPlayer::MediaKeyExceptionInvalidPlayerState; |
proxy_decryptor_->AddKey( |
- key, key_length, init_data, init_data_length, session_id.utf8()); |
+ key, key_length, init_data, init_data_length, session_id); |
return WebMediaPlayer::MediaKeyExceptionNoError; |
} |
WebMediaPlayer::MediaKeyException WebMediaPlayerAndroid::cancelKeyRequest( |
const WebString& key_system, |
const WebString& session_id) { |
+ DVLOG(1) << "cancelKeyRequest: " << base::string16(key_system) << ": " |
+ << " [" << base::string16(session_id) << "]"; |
+ |
+ std::string ascii_key_system = ToASCIIOrEmpty(key_system); |
+ std::string ascii_session_id = ToASCIIOrEmpty(session_id); |
+ |
WebMediaPlayer::MediaKeyException e = |
- CancelKeyRequestInternal(key_system, session_id); |
- ReportMediaKeyExceptionToUMA("cancelKeyRequest", key_system, e); |
+ CancelKeyRequestInternal(ascii_key_system, ascii_session_id); |
+ ReportMediaKeyExceptionToUMA("cancelKeyRequest", ascii_key_system, e); |
return e; |
} |
WebMediaPlayer::MediaKeyException |
WebMediaPlayerAndroid::CancelKeyRequestInternal( |
- const WebString& key_system, |
- const WebString& session_id) { |
+ const std::string& key_system, |
+ const std::string& session_id) { |
if (!IsKeySystemSupported(key_system)) |
return WebMediaPlayer::MediaKeyExceptionKeySystemNotSupported; |
- if (current_key_system_.isEmpty() || key_system != current_key_system_) |
+ if (current_key_system_.empty() || key_system != current_key_system_) |
return WebMediaPlayer::MediaKeyExceptionInvalidPlayerState; |
- proxy_decryptor_->CancelKeyRequest(session_id.utf8()); |
+ proxy_decryptor_->CancelKeyRequest(session_id); |
return WebMediaPlayer::MediaKeyExceptionNoError; |
} |
void WebMediaPlayerAndroid::OnKeyAdded(const std::string& session_id) { |
EmeUMAHistogramCounts(current_key_system_, "KeyAdded", 1); |
- client_->keyAdded(current_key_system_, WebString::fromUTF8(session_id)); |
+ client_->keyAdded(WebString::fromUTF8(current_key_system_), |
+ WebString::fromUTF8(session_id)); |
} |
void WebMediaPlayerAndroid::OnKeyError(const std::string& session_id, |
@@ -1305,7 +1329,7 @@ void WebMediaPlayerAndroid::OnKeyError(const std::string& session_id, |
error_code, media::MediaKeys::kMaxKeyError); |
client_->keyError( |
- current_key_system_, |
+ WebString::fromUTF8(current_key_system_), |
WebString::fromUTF8(session_id), |
static_cast<blink::WebMediaPlayerClient::MediaKeyErrorCode>(error_code), |
system_code); |
@@ -1318,7 +1342,7 @@ void WebMediaPlayerAndroid::OnKeyMessage(const std::string& session_id, |
DLOG_IF(WARNING, !destination_url.empty() && !destination_url_gurl.is_valid()) |
<< "Invalid URL in destination_url: " << destination_url; |
- client_->keyMessage(current_key_system_, |
+ client_->keyMessage(WebString::fromUTF8(current_key_system_), |
WebString::fromUTF8(session_id), |
message.empty() ? NULL : &message[0], |
message.size(), |