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

Unified 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « webkit/plugins/ppapi/ppapi_plugin_instance.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webkit/plugins/ppapi/ppapi_plugin_instance.cc
diff --git a/webkit/plugins/ppapi/ppapi_plugin_instance.cc b/webkit/plugins/ppapi/ppapi_plugin_instance.cc
index d0b20fca2e48611fbb6ea62fdfea9bfe7f709164..90832004179f87884a8c3e1734d0a32411beddf6 100644
--- a/webkit/plugins/ppapi/ppapi_plugin_instance.cc
+++ b/webkit/plugins/ppapi/ppapi_plugin_instance.cc
@@ -16,6 +16,8 @@
#include "base/utf_string_conversions.h"
#include "media/base/decoder_buffer.h"
#include "media/base/decryptor_client.h"
+#include "media/base/video_decoder_config.h"
+#include "media/base/video_frame.h"
#include "ppapi/c/dev/ppb_find_dev.h"
#include "ppapi/c/dev/ppb_zoom_dev.h"
#include "ppapi/c/dev/ppp_find_dev.h"
@@ -381,6 +383,33 @@ bool MakeEncryptedBlockInfo(
return true;
}
+PP_VideoCodec MediaVideoCodecToPpVideoCodec(media::VideoCodec codec) {
+ if (codec == media::kCodecVP8)
+ return PP_VIDEOCODEC_VP8;
+
+ return PP_VIDEOCODEC_UNKNOWN;
+}
+
+PP_VideoCodecProfile MediaVideoCodecProfileToPpVideoCodecProfile(
+ media::VideoCodecProfile profile) {
+ if (profile == media::VP8PROFILE_MAIN)
+ return PP_VIDEOCODECPROFILE_VP8_MAIN;
+
+ return PP_VIDEOCODECPROFILE_UNKNOWN;
+}
+
+PP_DecryptedFrameFormat MediaVideoFormatToPpDecryptedFrameFormat(
+ media::VideoFrame::Format format) {
+ if (format == media::VideoFrame::YV12)
+ return PP_DECRYPTEDFRAMEFORMAT_YV12;
+ else if (format == media::VideoFrame::I420)
+ return PP_DECRYPTEDFRAMEFORMAT_I420;
+ else if (format == media::VideoFrame::EMPTY)
+ return PP_DECRYPTEDFRAMEFORMAT_EMPTY;
+
+ return PP_DECRYPTEDFRAMEFORMAT_UNKNOWN;
+}
+
} // namespace
// static
@@ -1546,7 +1575,37 @@ bool PluginInstance::Decrypt(
return true;
}
-// Note: this method can be used with an unencrypted frame.
+bool PluginInstance::InitializeVideoDecoder(
+ const media::VideoDecoderConfig& decoder_config,
+ const media::Decryptor::DecryptCB& decrypt_cb) {
+ PP_VideoDecoderConfig pp_decoder_config;
+ pp_decoder_config.codec =
+ MediaVideoCodecToPpVideoCodec(decoder_config.codec());
+ pp_decoder_config.profile =
+ MediaVideoCodecProfileToPpVideoCodecProfile(decoder_config.profile());
+ pp_decoder_config.format =
+ MediaVideoFormatToPpDecryptedFrameFormat(decoder_config.format());
+ pp_decoder_config.width = decoder_config.coded_size().width();
+ pp_decoder_config.height = decoder_config.coded_size().height();
+ pp_decoder_config.request_id = next_decryption_request_id_++;
+
+ // TODO(xhwang): Use individual variables for decoder init request tracking.
+ DCHECK(!ContainsKey(pending_decryption_cbs_, pp_decoder_config.request_id));
+ pending_decryption_cbs_.insert(std::make_pair(pp_decoder_config.request_id,
+ decrypt_cb));
+
+ ScopedPPResource extra_data_resource(
+ ScopedPPResource::PassRef(),
+ MakeBufferResource(pp_instance(),
+ decoder_config.extra_data(),
+ decoder_config.extra_data_size()));
+
+ plugin_decryption_interface_->InitializeVideoDecoder(pp_instance(),
+ &pp_decoder_config,
+ extra_data_resource);
+ return true;
+}
+
bool PluginInstance::DecryptAndDecodeFrame(
const scoped_refptr<media::DecoderBuffer>& encrypted_frame,
const media::Decryptor::DecryptCB& decrypt_cb) {
@@ -2279,6 +2338,22 @@ void PluginInstance::KeyError(PP_Instance instance,
system_code);
}
+void PluginInstance::DecoderInitialized(PP_Instance instance,
+ PP_Bool success,
+ uint32_t request_id) {
+ // TODO(xhwang): Use individual variables for decoder init request tracking.
+ DecryptionCBMap::iterator found = pending_decryption_cbs_.find(request_id);
+ if (found == pending_decryption_cbs_.end())
+ return;
+ media::Decryptor::DecryptCB decrypt_cb = found->second;
+ pending_decryption_cbs_.erase(found);
+
+ media::Decryptor::Status status =
+ success == PP_TRUE ? media::Decryptor::kSuccess :
+ media::Decryptor::kError;
+ decrypt_cb.Run(status, NULL);
+}
+
void PluginInstance::DeliverBlock(PP_Instance instance,
PP_Resource decrypted_block,
const PP_DecryptedBlockInfo* block_info) {
« 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