| Index: webkit/media/webmediaplayer_impl.cc
|
| diff --git a/webkit/media/webmediaplayer_impl.cc b/webkit/media/webmediaplayer_impl.cc
|
| index bc7631d1b12b6e0945a768151271c09f10a2010b..588801c471b6b9aaee85eff263a6347216c3f71d 100644
|
| --- a/webkit/media/webmediaplayer_impl.cc
|
| +++ b/webkit/media/webmediaplayer_impl.cc
|
| @@ -6,6 +6,7 @@
|
|
|
| #include <limits>
|
| #include <string>
|
| +#include <vector>
|
|
|
| #include "base/bind.h"
|
| #include "base/callback.h"
|
| @@ -154,7 +155,7 @@ WebMediaPlayerImpl::WebMediaPlayerImpl(
|
| filter_collection_->AddAudioRenderer(
|
| new media::AudioRendererImpl(new media::NullAudioSink()));
|
|
|
| - decryptor_.reset(new media::AesDecryptor());
|
| + decryptor_.reset(new media::AesDecryptor(proxy_.get()));
|
| }
|
|
|
| WebMediaPlayerImpl::~WebMediaPlayerImpl() {
|
| @@ -690,7 +691,7 @@ void WebMediaPlayerImpl::sourceEndOfStream(
|
| DCHECK_EQ(main_loop_, MessageLoop::current());
|
| media::PipelineStatus pipeline_status = media::PIPELINE_OK;
|
|
|
| - switch(status) {
|
| + switch (status) {
|
| case WebMediaPlayer::EndOfStreamStatusNoError:
|
| break;
|
| case WebMediaPlayer::EndOfStreamStatusNetworkError:
|
| @@ -713,36 +714,12 @@ WebMediaPlayerImpl::generateKeyRequest(const WebString& key_system,
|
| if (!IsSupportedKeySystem(key_system))
|
| return WebKit::WebMediaPlayer::MediaKeyExceptionKeySystemNotSupported;
|
|
|
| - // Every request call creates a unique ID.
|
| - // TODO(ddorwin): Move this to the CDM implementations since the CDMs may
|
| - // create their own IDs and since CDMs supporting multiple renderer processes
|
| - // need globally unique IDs.
|
| - // Everything from here until the return should probably be handled by
|
| - // the decryptor - see http://crbug.com/123260.
|
| - static uint32_t next_available_session_id = 1;
|
| - uint32_t session_id = next_available_session_id++;
|
| -
|
| - WebString session_id_string(base::UintToString16(session_id));
|
| -
|
| DVLOG(1) << "generateKeyRequest: " << key_system.utf8().data() << ": "
|
| << std::string(reinterpret_cast<const char*>(init_data),
|
| - static_cast<size_t>(init_data_length))
|
| - << " [" << session_id_string.utf8().data() << "]";
|
| -
|
| - // TODO(ddorwin): Generate a key request in the decryptor and fire
|
| - // keyMessage when it completes.
|
| - // For now, just fire the event with the init_data as the request.
|
| - const unsigned char* message = init_data;
|
| - unsigned message_length = init_data_length;
|
| -
|
| - MessageLoop::current()->PostTask(FROM_HERE, base::Bind(
|
| - &WebKit::WebMediaPlayerClient::keyMessage,
|
| - base::Unretained(GetClient()),
|
| - key_system,
|
| - session_id_string,
|
| - message,
|
| - message_length));
|
| + static_cast<size_t>(init_data_length));
|
|
|
| + decryptor_->GenerateKeyRequest(key_system.utf8(),
|
| + init_data, init_data_length);
|
| return WebKit::WebMediaPlayer::MediaKeyExceptionNoError;
|
| }
|
|
|
| @@ -759,7 +736,6 @@ WebKit::WebMediaPlayer::MediaKeyException WebMediaPlayerImpl::addKey(
|
| if (!IsSupportedKeySystem(key_system))
|
| return WebKit::WebMediaPlayer::MediaKeyExceptionKeySystemNotSupported;
|
|
|
| -
|
| DVLOG(1) << "addKey: " << key_system.utf8().data() << ": "
|
| << std::string(reinterpret_cast<const char*>(key),
|
| static_cast<size_t>(key_length)) << ", "
|
| @@ -767,38 +743,8 @@ WebKit::WebMediaPlayer::MediaKeyException WebMediaPlayerImpl::addKey(
|
| static_cast<size_t>(init_data_length))
|
| << " [" << session_id.utf8().data() << "]";
|
|
|
| - // TODO(ddorwin): Everything from here until the return should probably be
|
| - // handled by the decryptor - see http://crbug.com/123260.
|
| - // Temporarily, fire an error for invalid key length so we can test the error
|
| - // event and fire the keyAdded event in all other cases.
|
| - const unsigned kSupportedKeyLength = 16; // 128-bit key.
|
| - if (key_length != kSupportedKeyLength) {
|
| - DLOG(ERROR) << "addKey: invalid key length: " << key_length;
|
| - MessageLoop::current()->PostTask(FROM_HERE, base::Bind(
|
| - &WebKit::WebMediaPlayerClient::keyError,
|
| - base::Unretained(GetClient()),
|
| - key_system,
|
| - session_id,
|
| - WebKit::WebMediaPlayerClient::MediaKeyErrorCodeUnknown,
|
| - 0));
|
| - } else {
|
| - // TODO(ddorwin): Fix the decryptor to accept no |init_data|. See
|
| - // http://crbug.com/123265. Until then, ensure a non-empty value is passed.
|
| - static const unsigned char kDummyInitData[1] = {0};
|
| - if (!init_data) {
|
| - init_data = kDummyInitData;
|
| - init_data_length = arraysize(kDummyInitData);
|
| - }
|
| -
|
| - decryptor_->AddKey(init_data, init_data_length, key, key_length);
|
| -
|
| - MessageLoop::current()->PostTask(FROM_HERE, base::Bind(
|
| - &WebKit::WebMediaPlayerClient::keyAdded,
|
| - base::Unretained(GetClient()),
|
| - key_system,
|
| - session_id));
|
| - }
|
| -
|
| + decryptor_->AddKey(key_system.utf8(), key, key_length,
|
| + init_data, init_data_length, session_id.utf8());
|
| return WebKit::WebMediaPlayer::MediaKeyExceptionNoError;
|
| }
|
|
|
| @@ -808,8 +754,7 @@ WebKit::WebMediaPlayer::MediaKeyException WebMediaPlayerImpl::cancelKeyRequest(
|
| if (!IsSupportedKeySystem(key_system))
|
| return WebKit::WebMediaPlayer::MediaKeyExceptionKeySystemNotSupported;
|
|
|
| - // TODO(ddorwin): Cancel the key request in the decryptor.
|
| -
|
| + decryptor_->CancelKeyRequest(key_system.utf8(), session_id.utf8());
|
| return WebKit::WebMediaPlayer::MediaKeyExceptionNoError;
|
| }
|
|
|
| @@ -926,11 +871,50 @@ void WebMediaPlayerImpl::OnDemuxerOpened() {
|
| GetClient()->sourceOpened();
|
| }
|
|
|
| -void WebMediaPlayerImpl::OnKeyNeeded(scoped_array<uint8> init_data,
|
| - int init_data_size) {
|
| +void WebMediaPlayerImpl::OnKeyAdded(const std::string& key_system,
|
| + const std::string& session_id) {
|
| + DCHECK_EQ(main_loop_, MessageLoop::current());
|
| +
|
| + GetClient()->keyAdded(WebString::fromUTF8(key_system),
|
| + WebString::fromUTF8(session_id));
|
| +}
|
| +
|
| +void WebMediaPlayerImpl::OnNeedKey(const std::string& key_system,
|
| + const std::string& session_id,
|
| + scoped_array<uint8> init_data,
|
| + int init_data_size) {
|
| + DCHECK_EQ(main_loop_, MessageLoop::current());
|
| +
|
| + GetClient()->keyNeeded(WebString::fromUTF8(key_system),
|
| + WebString::fromUTF8(session_id),
|
| + init_data.get(),
|
| + init_data_size);
|
| +}
|
| +
|
| +void WebMediaPlayerImpl::OnKeyError(const std::string& key_system,
|
| + const std::string& session_id,
|
| + media::AesDecryptor::KeyError error_code,
|
| + int system_code) {
|
| + DCHECK_EQ(main_loop_, MessageLoop::current());
|
| +
|
| + GetClient()->keyError(
|
| + WebString::fromUTF8(key_system),
|
| + WebString::fromUTF8(session_id),
|
| + static_cast<WebKit::WebMediaPlayerClient::MediaKeyErrorCode>(error_code),
|
| + system_code);
|
| +}
|
| +
|
| +void WebMediaPlayerImpl::OnKeyMessage(const std::string& key_system,
|
| + const std::string& session_id,
|
| + scoped_array<uint8> message,
|
| + int message_length,
|
| + const std::string& /* default_url */) {
|
| DCHECK_EQ(main_loop_, MessageLoop::current());
|
|
|
| - GetClient()->keyNeeded("", "", init_data.get(), init_data_size);
|
| + GetClient()->keyMessage(WebString::fromUTF8(key_system),
|
| + WebString::fromUTF8(session_id),
|
| + message.get(),
|
| + message_length);
|
| }
|
|
|
| void WebMediaPlayerImpl::SetOpaque(bool opaque) {
|
|
|