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

Side by Side Diff: webkit/plugins/ppapi/ppapi_plugin_instance.cc

Issue 11013052: Add PPAPI CDM video decoder initialization. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Comments addressed with the exceptions being some questions and TODOs. Created 8 years, 2 months 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 (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "webkit/plugins/ppapi/ppapi_plugin_instance.h" 5 #include "webkit/plugins/ppapi/ppapi_plugin_instance.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/debug/trace_event.h" 8 #include "base/debug/trace_event.h"
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/memory/linked_ptr.h" 10 #include "base/memory/linked_ptr.h"
11 #include "base/message_loop.h" 11 #include "base/message_loop.h"
12 #include "base/stl_util.h" 12 #include "base/stl_util.h"
13 #include "base/stringprintf.h" 13 #include "base/stringprintf.h"
14 #include "base/time.h" 14 #include "base/time.h"
15 #include "base/utf_offset_string_conversions.h" 15 #include "base/utf_offset_string_conversions.h"
16 #include "base/utf_string_conversions.h" 16 #include "base/utf_string_conversions.h"
17 #include "media/base/decoder_buffer.h" 17 #include "media/base/decoder_buffer.h"
18 #include "media/base/decryptor_client.h" 18 #include "media/base/decryptor_client.h"
19 #include "media/base/video_decoder_config.h"
20 #include "media/base/video_frame.h"
19 #include "ppapi/c/dev/ppb_find_dev.h" 21 #include "ppapi/c/dev/ppb_find_dev.h"
20 #include "ppapi/c/dev/ppb_zoom_dev.h" 22 #include "ppapi/c/dev/ppb_zoom_dev.h"
21 #include "ppapi/c/dev/ppp_find_dev.h" 23 #include "ppapi/c/dev/ppp_find_dev.h"
22 #include "ppapi/c/dev/ppp_selection_dev.h" 24 #include "ppapi/c/dev/ppp_selection_dev.h"
23 #include "ppapi/c/dev/ppp_text_input_dev.h" 25 #include "ppapi/c/dev/ppp_text_input_dev.h"
24 #include "ppapi/c/dev/ppp_zoom_dev.h" 26 #include "ppapi/c/dev/ppp_zoom_dev.h"
25 #include "ppapi/c/pp_rect.h" 27 #include "ppapi/c/pp_rect.h"
26 #include "ppapi/c/ppb_audio_config.h" 28 #include "ppapi/c/ppb_audio_config.h"
27 #include "ppapi/c/ppb_core.h" 29 #include "ppapi/c/ppb_core.h"
28 #include "ppapi/c/ppb_gamepad.h" 30 #include "ppapi/c/ppb_gamepad.h"
(...skipping 345 matching lines...) Expand 10 before | Expand all | Expand 10 after
374 for (uint32_t i = 0; i < block_info->num_subsamples; ++i) { 376 for (uint32_t i = 0; i < block_info->num_subsamples; ++i) {
375 block_info->subsamples[i].clear_bytes = 377 block_info->subsamples[i].clear_bytes =
376 decrypt_config.subsamples()[i].clear_bytes; 378 decrypt_config.subsamples()[i].clear_bytes;
377 block_info->subsamples[i].cipher_bytes = 379 block_info->subsamples[i].cipher_bytes =
378 decrypt_config.subsamples()[i].cypher_bytes; 380 decrypt_config.subsamples()[i].cypher_bytes;
379 } 381 }
380 382
381 return true; 383 return true;
382 } 384 }
383 385
386 PP_VideoCodec MediaVideoCodecToPpVideoCodec(media::VideoCodec codec) {
387 if (codec == media::kCodecVP8)
388 return PP_VIDEOCODEC_VP8;
389
390 return PP_VIDEOCODEC_UNKNOWN;
391 }
392
393 PP_VideoCodecProfile MediaVideoCodecProfileToPpVideoCodecProfile(
394 media::VideoCodecProfile profile) {
395 if (profile == media::VP8PROFILE_MAIN)
396 return PP_VIDEOCODECPROFILE_VP8_MAIN;
397
398 return PP_VIDEOCODECPROFILE_UNKNOWN;
399 }
400
401 PP_DecryptedFrameFormat MediaVideoFormatToPpDecryptedFrameFormat(
402 media::VideoFrame::Format format) {
403 switch (format) {
404 case media::VideoFrame::YV12:
405 return PP_DECRYPTEDFRAMEFORMAT_YV12;
406
407 case media::VideoFrame::I420:
408 return PP_DECRYPTEDFRAMEFORMAT_I420;
409
410 case media::VideoFrame::INVALID:
411 case media::VideoFrame::RGB32:
412 case media::VideoFrame::YV16:
413 case media::VideoFrame::EMPTY:
414 case media::VideoFrame::NATIVE_TEXTURE:
415 default:
416 NOTREACHED();
417 }
418 return PP_DECRYPTEDFRAMEFORMAT_UNKNOWN;
419 }
420
421
384 } // namespace 422 } // namespace
385 423
386 // static 424 // static
387 PluginInstance* PluginInstance::Create(PluginDelegate* delegate, 425 PluginInstance* PluginInstance::Create(PluginDelegate* delegate,
388 PluginModule* module) { 426 PluginModule* module) {
389 base::Callback<const void*(const char*)> get_plugin_interface_func = 427 base::Callback<const void*(const char*)> get_plugin_interface_func =
390 base::Bind(&PluginModule::GetPluginInterface, module); 428 base::Bind(&PluginModule::GetPluginInterface, module);
391 PPP_Instance_Combined* ppp_instance_combined = 429 PPP_Instance_Combined* ppp_instance_combined =
392 PPP_Instance_Combined::Create(get_plugin_interface_func); 430 PPP_Instance_Combined::Create(get_plugin_interface_func);
393 if (!ppp_instance_combined) 431 if (!ppp_instance_combined)
(...skipping 1145 matching lines...) Expand 10 before | Expand all | Expand 10 after
1539 1577
1540 DCHECK(!ContainsKey(pending_decryption_cbs_, request_id)); 1578 DCHECK(!ContainsKey(pending_decryption_cbs_, request_id));
1541 pending_decryption_cbs_.insert(std::make_pair(request_id, decrypt_cb)); 1579 pending_decryption_cbs_.insert(std::make_pair(request_id, decrypt_cb));
1542 1580
1543 plugin_decryption_interface_->Decrypt(pp_instance(), 1581 plugin_decryption_interface_->Decrypt(pp_instance(),
1544 encrypted_resource, 1582 encrypted_resource,
1545 &block_info); 1583 &block_info);
1546 return true; 1584 return true;
1547 } 1585 }
1548 1586
1549 // Note: this method can be used with an unencrypted frame. 1587 bool PluginInstance::InitializeVideoDecoder(
1588 const media::VideoDecoderConfig& decoder_config,
1589 const media::Decryptor::DecryptCB& decrypt_cb) {
1590 PP_VideoDecoderConfig pp_decoder_config;
1591 pp_decoder_config.codec =
1592 MediaVideoCodecToPpVideoCodec(decoder_config.codec());
1593 pp_decoder_config.profile =
1594 MediaVideoCodecProfileToPpVideoCodecProfile(decoder_config.profile());
1595 pp_decoder_config.format =
1596 MediaVideoFormatToPpDecryptedFrameFormat(decoder_config.format());
1597 pp_decoder_config.width = decoder_config.coded_size().width();
1598 pp_decoder_config.height = decoder_config.coded_size().height();
1599 pp_decoder_config.request_id = next_decryption_request_id_++;
1600
1601 // TODO(xhwang): Use individual variables for decoder init request tracking.
1602 DCHECK(!ContainsKey(pending_decryption_cbs_, pp_decoder_config.request_id));
1603 pending_decryption_cbs_.insert(std::make_pair(pp_decoder_config.request_id,
1604 decrypt_cb));
1605
1606 ScopedPPResource extra_data_resource(
1607 ScopedPPResource::PassRef(),
1608 MakeBufferResource(pp_instance(),
1609 decoder_config.extra_data(),
1610 decoder_config.extra_data_size()));
1611
1612 plugin_decryption_interface_->InitializeVideoDecoder(pp_instance(),
1613 &pp_decoder_config,
1614 extra_data_resource);
1615 return true;
1616 }
1617
1550 bool PluginInstance::DecryptAndDecodeFrame( 1618 bool PluginInstance::DecryptAndDecodeFrame(
1551 const scoped_refptr<media::DecoderBuffer>& encrypted_frame, 1619 const scoped_refptr<media::DecoderBuffer>& encrypted_frame,
1552 const media::Decryptor::DecryptCB& decrypt_cb) { 1620 const media::Decryptor::DecryptCB& decrypt_cb) {
1553 if (!LoadContentDecryptorInterface()) 1621 if (!LoadContentDecryptorInterface())
1554 return false; 1622 return false;
1555 1623
1556 ScopedPPResource encrypted_resource(MakeBufferResource( 1624 ScopedPPResource encrypted_resource(MakeBufferResource(
1557 pp_instance(), 1625 pp_instance(),
1558 encrypted_frame->GetData(), 1626 encrypted_frame->GetData(),
1559 encrypted_frame->GetDataSize())); 1627 encrypted_frame->GetDataSize()));
(...skipping 712 matching lines...) Expand 10 before | Expand all | Expand 10 after
2272 } 2340 }
2273 2341
2274 DCHECK(decryptor_client_); 2342 DCHECK(decryptor_client_);
2275 decryptor_client_->KeyError( 2343 decryptor_client_->KeyError(
2276 key_system_string->value(), 2344 key_system_string->value(),
2277 session_id_string->value(), 2345 session_id_string->value(),
2278 static_cast<media::Decryptor::KeyError>(media_error), 2346 static_cast<media::Decryptor::KeyError>(media_error),
2279 system_code); 2347 system_code);
2280 } 2348 }
2281 2349
2350 void PluginInstance::DecoderInitialized(PP_Instance instance,
2351 PP_Bool success,
2352 uint32_t request_id) {
2353 // TODO(xhwang): Use individual variables for decoder init request tracking.
2354 DecryptionCBMap::iterator found = pending_decryption_cbs_.find(request_id);
2355 if (found == pending_decryption_cbs_.end())
2356 return;
2357 media::Decryptor::DecryptCB decrypt_cb = found->second;
2358 pending_decryption_cbs_.erase(found);
2359
2360 media::Decryptor::Status status =
2361 success == PP_TRUE ? media::Decryptor::kSuccess :
2362 media::Decryptor::kError;
2363 decrypt_cb.Run(status, NULL);
2364 }
2365
2282 void PluginInstance::DeliverBlock(PP_Instance instance, 2366 void PluginInstance::DeliverBlock(PP_Instance instance,
2283 PP_Resource decrypted_block, 2367 PP_Resource decrypted_block,
2284 const PP_DecryptedBlockInfo* block_info) { 2368 const PP_DecryptedBlockInfo* block_info) {
2285 DCHECK(block_info); 2369 DCHECK(block_info);
2286 DecryptionCBMap::iterator found = pending_decryption_cbs_.find( 2370 DecryptionCBMap::iterator found = pending_decryption_cbs_.find(
2287 block_info->tracking_info.request_id); 2371 block_info->tracking_info.request_id);
2288 if (found == pending_decryption_cbs_.end()) 2372 if (found == pending_decryption_cbs_.end())
2289 return; 2373 return;
2290 media::Decryptor::DecryptCB decrypt_cb = found->second; 2374 media::Decryptor::DecryptCB decrypt_cb = found->second;
2291 pending_decryption_cbs_.erase(found); 2375 pending_decryption_cbs_.erase(found);
(...skipping 416 matching lines...) Expand 10 before | Expand all | Expand 10 after
2708 screen_size_for_fullscreen_ = gfx::Size(); 2792 screen_size_for_fullscreen_ = gfx::Size();
2709 WebElement element = container_->element(); 2793 WebElement element = container_->element();
2710 element.setAttribute(WebString::fromUTF8(kWidth), width_before_fullscreen_); 2794 element.setAttribute(WebString::fromUTF8(kWidth), width_before_fullscreen_);
2711 element.setAttribute(WebString::fromUTF8(kHeight), height_before_fullscreen_); 2795 element.setAttribute(WebString::fromUTF8(kHeight), height_before_fullscreen_);
2712 element.setAttribute(WebString::fromUTF8(kBorder), border_before_fullscreen_); 2796 element.setAttribute(WebString::fromUTF8(kBorder), border_before_fullscreen_);
2713 element.setAttribute(WebString::fromUTF8(kStyle), style_before_fullscreen_); 2797 element.setAttribute(WebString::fromUTF8(kStyle), style_before_fullscreen_);
2714 } 2798 }
2715 2799
2716 } // namespace ppapi 2800 } // namespace ppapi
2717 } // namespace webkit 2801 } // namespace webkit
OLDNEW
« webkit/media/crypto/ppapi/cdm_wrapper.cc ('K') | « webkit/plugins/ppapi/ppapi_plugin_instance.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698