Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(340)

Side by Side Diff: media/cdm/ppapi/clear_key_cdm.cc

Issue 79903002: Add decrypt-only external clear key browser tests. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "media/cdm/ppapi/clear_key_cdm.h" 5 #include "media/cdm/ppapi/clear_key_cdm.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <sstream> 8 #include <sstream>
9 #include <string> 9 #include <string>
10 #include <vector> 10 #include <vector>
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
54 CHECK(PathService::Get(base::DIR_MODULE, &file_path)); 54 CHECK(PathService::Get(base::DIR_MODULE, &file_path));
55 CHECK(media::InitializeMediaLibrary(file_path)); 55 CHECK(media::InitializeMediaLibrary(file_path));
56 return true; 56 return true;
57 } 57 }
58 58
59 static bool g_ffmpeg_lib_initialized = InitializeFFmpegLibraries(); 59 static bool g_ffmpeg_lib_initialized = InitializeFFmpegLibraries();
60 #endif // CLEAR_KEY_CDM_USE_FFMPEG_DECODER 60 #endif // CLEAR_KEY_CDM_USE_FFMPEG_DECODER
61 61
62 const char kClearKeyCdmVersion[] = "0.1.0.1"; 62 const char kClearKeyCdmVersion[] = "0.1.0.1";
63 const char kExternalClearKeyKeySystem[] = "org.chromium.externalclearkey"; 63 const char kExternalClearKeyKeySystem[] = "org.chromium.externalclearkey";
64 const char kDecryptOnlyExternalClearKeyKeySystem[] =
65 "org.chromium.externalclearkey.decryptonly";
64 const int64 kSecondsPerMinute = 60; 66 const int64 kSecondsPerMinute = 60;
65 const int64 kMsPerSecond = 1000; 67 const int64 kMsPerSecond = 1000;
66 const int64 kInitialTimerDelayMs = 200; 68 const int64 kInitialTimerDelayMs = 200;
67 const int64 kMaxTimerDelayMs = 1 * kSecondsPerMinute * kMsPerSecond; 69 const int64 kMaxTimerDelayMs = 1 * kSecondsPerMinute * kMsPerSecond;
68 // Heart beat message header. If a key message starts with |kHeartBeatHeader|, 70 // Heart beat message header. If a key message starts with |kHeartBeatHeader|,
69 // it's a heart beat message. Otherwise, it's a key request. 71 // it's a heart beat message. Otherwise, it's a key request.
70 const char kHeartBeatHeader[] = "HEARTBEAT"; 72 const char kHeartBeatHeader[] = "HEARTBEAT";
71 73
72 // Copies |input_buffer| into a media::DecoderBuffer. If the |input_buffer| is 74 // Copies |input_buffer| into a media::DecoderBuffer. If the |input_buffer| is
73 // empty, an empty (end-of-stream) media::DecoderBuffer is returned. 75 // empty, an empty (end-of-stream) media::DecoderBuffer is returned.
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
118 void INITIALIZE_CDM_MODULE() { 120 void INITIALIZE_CDM_MODULE() {
119 #if defined(CLEAR_KEY_CDM_USE_FFMPEG_DECODER) 121 #if defined(CLEAR_KEY_CDM_USE_FFMPEG_DECODER)
120 DVLOG(2) << "FFmpeg libraries initialized: " << g_ffmpeg_lib_initialized; 122 DVLOG(2) << "FFmpeg libraries initialized: " << g_ffmpeg_lib_initialized;
121 av_register_all(); 123 av_register_all();
122 #endif // CLEAR_KEY_CDM_USE_FFMPEG_DECODER 124 #endif // CLEAR_KEY_CDM_USE_FFMPEG_DECODER
123 } 125 }
124 126
125 void DeinitializeCdmModule() { 127 void DeinitializeCdmModule() {
126 } 128 }
127 129
128 void* CreateCdmInstance( 130 void* CreateCdmInstance(int cdm_interface_version,
129 int cdm_interface_version, 131 const char* key_system, uint32_t key_system_size,
130 const char* key_system, uint32_t key_system_size, 132 GetCdmHostFunc get_cdm_host_func,
131 GetCdmHostFunc get_cdm_host_func, void* user_data) { 133 void* user_data) {
132 DVLOG(1) << "CreateCdmInstance()"; 134 DVLOG(1) << "CreateCdmInstance()";
133 135
134 if (std::string(key_system, key_system_size) != kExternalClearKeyKeySystem) { 136 std::string key_system_string(key_system, key_system_size);
137 if (key_system_string != kExternalClearKeyKeySystem &&
138 key_system_string != kDecryptOnlyExternalClearKeyKeySystem) {
135 DVLOG(1) << "Unsupported key system."; 139 DVLOG(1) << "Unsupported key system.";
ddorwin 2013/11/21 04:10:58 ...system: " << key_system_string;
xhwang 2013/11/22 01:47:36 Done.
136 return NULL; 140 return NULL;
137 } 141 }
138 142
139 if (cdm_interface_version != media::ClearKeyCdmInterface::kVersion) 143 if (cdm_interface_version != media::ClearKeyCdmInterface::kVersion)
140 return NULL; 144 return NULL;
141 145
142 media::ClearKeyCdmHost* host = static_cast<media::ClearKeyCdmHost*>( 146 media::ClearKeyCdmHost* host = static_cast<media::ClearKeyCdmHost*>(
143 get_cdm_host_func(media::ClearKeyCdmHost::kVersion, user_data)); 147 get_cdm_host_func(media::ClearKeyCdmHost::kVersion, user_data));
144 if (!host) 148 if (!host)
145 return NULL; 149 return NULL;
146 150
147 return new media::ClearKeyCdm(host); 151 return new media::ClearKeyCdm(
152 host, key_system_string == kDecryptOnlyExternalClearKeyKeySystem);
148 } 153 }
149 154
150 const char* GetCdmVersion() { 155 const char* GetCdmVersion() {
151 return kClearKeyCdmVersion; 156 return kClearKeyCdmVersion;
152 } 157 }
153 158
154 namespace media { 159 namespace media {
155 160
156 // Since all the calls to AesDecryptor are synchronous, pass a dummy value for 161 // Since all the calls to AesDecryptor are synchronous, pass a dummy value for
157 // reference_id that is never exposed outside this class. 162 // reference_id that is never exposed outside this class.
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
191 key_message_ = message; 196 key_message_ = message;
192 default_url_ = default_url; 197 default_url_ = default_url;
193 } 198 }
194 199
195 void ClearKeyCdm::Client::SetSessionId(uint32 reference_id, 200 void ClearKeyCdm::Client::SetSessionId(uint32 reference_id,
196 const std::string& session_id) { 201 const std::string& session_id) {
197 status_ = static_cast<Status>(status_ | kSetSessionId); 202 status_ = static_cast<Status>(status_ | kSetSessionId);
198 session_id_ = session_id; 203 session_id_ = session_id;
199 } 204 }
200 205
201 ClearKeyCdm::ClearKeyCdm(ClearKeyCdmHost* host) 206 ClearKeyCdm::ClearKeyCdm(ClearKeyCdmHost* host, bool decrypt_only)
202 : decryptor_(base::Bind(&Client::KeyAdded, base::Unretained(&client_)), 207 : decryptor_(base::Bind(&Client::KeyAdded, base::Unretained(&client_)),
203 base::Bind(&Client::KeyError, base::Unretained(&client_)), 208 base::Bind(&Client::KeyError, base::Unretained(&client_)),
204 base::Bind(&Client::KeyMessage, base::Unretained(&client_)), 209 base::Bind(&Client::KeyMessage, base::Unretained(&client_)),
205 base::Bind(&Client::SetSessionId, base::Unretained(&client_))), 210 base::Bind(&Client::SetSessionId, base::Unretained(&client_))),
206 host_(host), 211 host_(host),
212 decrypt_only_(decrypt_only),
207 timer_delay_ms_(kInitialTimerDelayMs), 213 timer_delay_ms_(kInitialTimerDelayMs),
208 timer_set_(false) { 214 timer_set_(false) {
209 #if defined(CLEAR_KEY_CDM_USE_FAKE_AUDIO_DECODER) 215 #if defined(CLEAR_KEY_CDM_USE_FAKE_AUDIO_DECODER)
210 channel_count_ = 0; 216 channel_count_ = 0;
211 bits_per_channel_ = 0; 217 bits_per_channel_ = 0;
212 samples_per_second_ = 0; 218 samples_per_second_ = 0;
213 output_timestamp_base_in_microseconds_ = kNoTimestamp; 219 output_timestamp_base_in_microseconds_ = kNoTimestamp;
214 total_samples_generated_ = 0; 220 total_samples_generated_ = 0;
215 #endif // CLEAR_KEY_CDM_USE_FAKE_AUDIO_DECODER 221 #endif // CLEAR_KEY_CDM_USE_FAKE_AUDIO_DECODER
216 } 222 }
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
345 buffer->data(), 351 buffer->data(),
346 buffer->data_size()); 352 buffer->data_size());
347 decrypted_block->DecryptedBuffer()->SetSize(buffer->data_size()); 353 decrypted_block->DecryptedBuffer()->SetSize(buffer->data_size());
348 decrypted_block->SetTimestamp(buffer->timestamp().InMicroseconds()); 354 decrypted_block->SetTimestamp(buffer->timestamp().InMicroseconds());
349 355
350 return cdm::kSuccess; 356 return cdm::kSuccess;
351 } 357 }
352 358
353 cdm::Status ClearKeyCdm::InitializeAudioDecoder( 359 cdm::Status ClearKeyCdm::InitializeAudioDecoder(
354 const cdm::AudioDecoderConfig& audio_decoder_config) { 360 const cdm::AudioDecoderConfig& audio_decoder_config) {
361 if (decrypt_only_)
362 return cdm::kSessionError;
363
355 #if defined(CLEAR_KEY_CDM_USE_FFMPEG_DECODER) 364 #if defined(CLEAR_KEY_CDM_USE_FFMPEG_DECODER)
356 if (!audio_decoder_) 365 if (!audio_decoder_)
357 audio_decoder_.reset(new media::FFmpegCdmAudioDecoder(host_)); 366 audio_decoder_.reset(new media::FFmpegCdmAudioDecoder(host_));
358 367
359 if (!audio_decoder_->Initialize(audio_decoder_config)) 368 if (!audio_decoder_->Initialize(audio_decoder_config))
360 return cdm::kSessionError; 369 return cdm::kSessionError;
361 370
362 return cdm::kSuccess; 371 return cdm::kSuccess;
363 #elif defined(CLEAR_KEY_CDM_USE_FAKE_AUDIO_DECODER) 372 #elif defined(CLEAR_KEY_CDM_USE_FAKE_AUDIO_DECODER)
364 channel_count_ = audio_decoder_config.channel_count; 373 channel_count_ = audio_decoder_config.channel_count;
365 bits_per_channel_ = audio_decoder_config.bits_per_channel; 374 bits_per_channel_ = audio_decoder_config.bits_per_channel;
366 samples_per_second_ = audio_decoder_config.samples_per_second; 375 samples_per_second_ = audio_decoder_config.samples_per_second;
367 return cdm::kSuccess; 376 return cdm::kSuccess;
368 #else 377 #else
369 NOTIMPLEMENTED(); 378 NOTIMPLEMENTED();
370 return cdm::kSessionError; 379 return cdm::kSessionError;
371 #endif // CLEAR_KEY_CDM_USE_FFMPEG_DECODER 380 #endif // CLEAR_KEY_CDM_USE_FFMPEG_DECODER
372 } 381 }
373 382
374 cdm::Status ClearKeyCdm::InitializeVideoDecoder( 383 cdm::Status ClearKeyCdm::InitializeVideoDecoder(
375 const cdm::VideoDecoderConfig& video_decoder_config) { 384 const cdm::VideoDecoderConfig& video_decoder_config) {
385 if (decrypt_only_)
386 return cdm::kSessionError;
387
376 if (video_decoder_ && video_decoder_->is_initialized()) { 388 if (video_decoder_ && video_decoder_->is_initialized()) {
377 DCHECK(!video_decoder_->is_initialized()); 389 DCHECK(!video_decoder_->is_initialized());
378 return cdm::kSessionError; 390 return cdm::kSessionError;
379 } 391 }
380 392
381 // Any uninitialized decoder will be replaced. 393 // Any uninitialized decoder will be replaced.
382 video_decoder_ = CreateVideoDecoder(host_, video_decoder_config); 394 video_decoder_ = CreateVideoDecoder(host_, video_decoder_config);
383 if (!video_decoder_) 395 if (!video_decoder_)
384 return cdm::kSessionError; 396 return cdm::kSessionError;
385 397
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after
598 int samples_generated = GenerateFakeAudioFramesFromDuration( 610 int samples_generated = GenerateFakeAudioFramesFromDuration(
599 timestamp_in_microseconds - CurrentTimeStampInMicroseconds(), 611 timestamp_in_microseconds - CurrentTimeStampInMicroseconds(),
600 audio_frames); 612 audio_frames);
601 total_samples_generated_ += samples_generated; 613 total_samples_generated_ += samples_generated;
602 614
603 return samples_generated == 0 ? cdm::kNeedMoreData : cdm::kSuccess; 615 return samples_generated == 0 ? cdm::kNeedMoreData : cdm::kSuccess;
604 } 616 }
605 #endif // CLEAR_KEY_CDM_USE_FAKE_AUDIO_DECODER 617 #endif // CLEAR_KEY_CDM_USE_FAKE_AUDIO_DECODER
606 618
607 } // namespace media 619 } // namespace media
OLDNEW
« media/cdm/ppapi/clear_key_cdm.h ('K') | « media/cdm/ppapi/clear_key_cdm.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698