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

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: Rebased. 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
« no previous file with comments | « webkit/plugins/ppapi/ppapi_plugin_instance.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 if (format == media::VideoFrame::YV12)
404 return PP_DECRYPTEDFRAMEFORMAT_YV12;
405 else if (format == media::VideoFrame::I420)
406 return PP_DECRYPTEDFRAMEFORMAT_I420;
407 else if (format == media::VideoFrame::EMPTY)
408 return PP_DECRYPTEDFRAMEFORMAT_EMPTY;
409
410 return PP_DECRYPTEDFRAMEFORMAT_UNKNOWN;
411 }
412
384 } // namespace 413 } // namespace
385 414
386 // static 415 // static
387 PluginInstance* PluginInstance::Create(PluginDelegate* delegate, 416 PluginInstance* PluginInstance::Create(PluginDelegate* delegate,
388 PluginModule* module) { 417 PluginModule* module) {
389 base::Callback<const void*(const char*)> get_plugin_interface_func = 418 base::Callback<const void*(const char*)> get_plugin_interface_func =
390 base::Bind(&PluginModule::GetPluginInterface, module); 419 base::Bind(&PluginModule::GetPluginInterface, module);
391 PPP_Instance_Combined* ppp_instance_combined = 420 PPP_Instance_Combined* ppp_instance_combined =
392 PPP_Instance_Combined::Create(get_plugin_interface_func); 421 PPP_Instance_Combined::Create(get_plugin_interface_func);
393 if (!ppp_instance_combined) 422 if (!ppp_instance_combined)
(...skipping 1145 matching lines...) Expand 10 before | Expand all | Expand 10 after
1539 1568
1540 DCHECK(!ContainsKey(pending_decryption_cbs_, request_id)); 1569 DCHECK(!ContainsKey(pending_decryption_cbs_, request_id));
1541 pending_decryption_cbs_.insert(std::make_pair(request_id, decrypt_cb)); 1570 pending_decryption_cbs_.insert(std::make_pair(request_id, decrypt_cb));
1542 1571
1543 plugin_decryption_interface_->Decrypt(pp_instance(), 1572 plugin_decryption_interface_->Decrypt(pp_instance(),
1544 encrypted_resource, 1573 encrypted_resource,
1545 &block_info); 1574 &block_info);
1546 return true; 1575 return true;
1547 } 1576 }
1548 1577
1549 // Note: this method can be used with an unencrypted frame. 1578 bool PluginInstance::InitializeVideoDecoder(
1579 const media::VideoDecoderConfig& decoder_config,
1580 const media::Decryptor::DecryptCB& decrypt_cb) {
1581 PP_VideoDecoderConfig pp_decoder_config;
1582 pp_decoder_config.codec =
1583 MediaVideoCodecToPpVideoCodec(decoder_config.codec());
1584 pp_decoder_config.profile =
1585 MediaVideoCodecProfileToPpVideoCodecProfile(decoder_config.profile());
1586 pp_decoder_config.format =
1587 MediaVideoFormatToPpDecryptedFrameFormat(decoder_config.format());
1588 pp_decoder_config.width = decoder_config.coded_size().width();
1589 pp_decoder_config.height = decoder_config.coded_size().height();
1590 pp_decoder_config.request_id = next_decryption_request_id_++;
1591
1592 // TODO(xhwang): Use individual variables for decoder init request tracking.
1593 DCHECK(!ContainsKey(pending_decryption_cbs_, pp_decoder_config.request_id));
1594 pending_decryption_cbs_.insert(std::make_pair(pp_decoder_config.request_id,
1595 decrypt_cb));
1596
1597 ScopedPPResource extra_data_resource(
1598 ScopedPPResource::PassRef(),
1599 MakeBufferResource(pp_instance(),
1600 decoder_config.extra_data(),
1601 decoder_config.extra_data_size()));
1602
1603 plugin_decryption_interface_->InitializeVideoDecoder(pp_instance(),
1604 &pp_decoder_config,
1605 extra_data_resource);
1606 return true;
1607 }
1608
1550 bool PluginInstance::DecryptAndDecodeFrame( 1609 bool PluginInstance::DecryptAndDecodeFrame(
1551 const scoped_refptr<media::DecoderBuffer>& encrypted_frame, 1610 const scoped_refptr<media::DecoderBuffer>& encrypted_frame,
1552 const media::Decryptor::DecryptCB& decrypt_cb) { 1611 const media::Decryptor::DecryptCB& decrypt_cb) {
1553 if (!LoadContentDecryptorInterface()) 1612 if (!LoadContentDecryptorInterface())
1554 return false; 1613 return false;
1555 1614
1556 ScopedPPResource encrypted_resource(MakeBufferResource( 1615 ScopedPPResource encrypted_resource(MakeBufferResource(
1557 pp_instance(), 1616 pp_instance(),
1558 encrypted_frame->GetData(), 1617 encrypted_frame->GetData(),
1559 encrypted_frame->GetDataSize())); 1618 encrypted_frame->GetDataSize()));
(...skipping 712 matching lines...) Expand 10 before | Expand all | Expand 10 after
2272 } 2331 }
2273 2332
2274 DCHECK(decryptor_client_); 2333 DCHECK(decryptor_client_);
2275 decryptor_client_->KeyError( 2334 decryptor_client_->KeyError(
2276 key_system_string->value(), 2335 key_system_string->value(),
2277 session_id_string->value(), 2336 session_id_string->value(),
2278 static_cast<media::Decryptor::KeyError>(media_error), 2337 static_cast<media::Decryptor::KeyError>(media_error),
2279 system_code); 2338 system_code);
2280 } 2339 }
2281 2340
2341 void PluginInstance::DecoderInitialized(PP_Instance instance,
2342 PP_Bool success,
2343 uint32_t request_id) {
2344 // TODO(xhwang): Use individual variables for decoder init request tracking.
2345 DecryptionCBMap::iterator found = pending_decryption_cbs_.find(request_id);
2346 if (found == pending_decryption_cbs_.end())
2347 return;
2348 media::Decryptor::DecryptCB decrypt_cb = found->second;
2349 pending_decryption_cbs_.erase(found);
2350
2351 media::Decryptor::Status status =
2352 success == PP_TRUE ? media::Decryptor::kSuccess :
2353 media::Decryptor::kError;
2354 decrypt_cb.Run(status, NULL);
2355 }
2356
2282 void PluginInstance::DeliverBlock(PP_Instance instance, 2357 void PluginInstance::DeliverBlock(PP_Instance instance,
2283 PP_Resource decrypted_block, 2358 PP_Resource decrypted_block,
2284 const PP_DecryptedBlockInfo* block_info) { 2359 const PP_DecryptedBlockInfo* block_info) {
2285 DCHECK(block_info); 2360 DCHECK(block_info);
2286 DecryptionCBMap::iterator found = pending_decryption_cbs_.find( 2361 DecryptionCBMap::iterator found = pending_decryption_cbs_.find(
2287 block_info->tracking_info.request_id); 2362 block_info->tracking_info.request_id);
2288 if (found == pending_decryption_cbs_.end()) 2363 if (found == pending_decryption_cbs_.end())
2289 return; 2364 return;
2290 media::Decryptor::DecryptCB decrypt_cb = found->second; 2365 media::Decryptor::DecryptCB decrypt_cb = found->second;
2291 pending_decryption_cbs_.erase(found); 2366 pending_decryption_cbs_.erase(found);
(...skipping 422 matching lines...) Expand 10 before | Expand all | Expand 10 after
2714 screen_size_for_fullscreen_ = gfx::Size(); 2789 screen_size_for_fullscreen_ = gfx::Size();
2715 WebElement element = container_->element(); 2790 WebElement element = container_->element();
2716 element.setAttribute(WebString::fromUTF8(kWidth), width_before_fullscreen_); 2791 element.setAttribute(WebString::fromUTF8(kWidth), width_before_fullscreen_);
2717 element.setAttribute(WebString::fromUTF8(kHeight), height_before_fullscreen_); 2792 element.setAttribute(WebString::fromUTF8(kHeight), height_before_fullscreen_);
2718 element.setAttribute(WebString::fromUTF8(kBorder), border_before_fullscreen_); 2793 element.setAttribute(WebString::fromUTF8(kBorder), border_before_fullscreen_);
2719 element.setAttribute(WebString::fromUTF8(kStyle), style_before_fullscreen_); 2794 element.setAttribute(WebString::fromUTF8(kStyle), style_before_fullscreen_);
2720 } 2795 }
2721 2796
2722 } // namespace ppapi 2797 } // namespace ppapi
2723 } // namespace webkit 2798 } // namespace webkit
OLDNEW
« no previous file with comments | « 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