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

Unified Diff: webkit/media/crypto/ppapi/cdm_wrapper.cc

Issue 11189082: Update PluginInstance for audio support for content decryption. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix tests 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 | « media/filters/decrypting_audio_decoder_unittest.cc ('k') | webkit/media/crypto/ppapi/clear_key_cdm.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webkit/media/crypto/ppapi/cdm_wrapper.cc
diff --git a/webkit/media/crypto/ppapi/cdm_wrapper.cc b/webkit/media/crypto/ppapi/cdm_wrapper.cc
index 77c2248e257cb11395a1f725028b09e2af85289a..592ac1ed29e96e2fb05013139a23c8f549983242 100644
--- a/webkit/media/crypto/ppapi/cdm_wrapper.cc
+++ b/webkit/media/crypto/ppapi/cdm_wrapper.cc
@@ -441,6 +441,28 @@ int64_t VideoFrameImpl::timestamp() const {
return timestamp_;
}
+class AudioFramesImpl : public cdm::AudioFrames {
+ public:
+ AudioFramesImpl() : buffer_(NULL) {}
+ virtual ~AudioFramesImpl() {
+ if (buffer_)
+ buffer_->Destroy();
+ }
+
+ // AudioFrames implementation.
+ virtual void set_buffer(cdm::Buffer* buffer) OVERRIDE {
+ buffer_ = static_cast<PpbBuffer*>(buffer);
+ }
+ virtual cdm::Buffer* buffer() OVERRIDE {
+ return buffer_;
+ }
+
+ private:
+ PpbBuffer* buffer_;
+
+ DISALLOW_COPY_AND_ASSIGN(AudioFramesImpl);
+};
+
// A wrapper class for abstracting away PPAPI interaction and threading for a
// Content Decryption Module (CDM).
class CdmWrapper : public pp::Instance,
@@ -488,6 +510,7 @@ class CdmWrapper : public pp::Instance,
typedef linked_ptr<DecryptedBlockImpl> LinkedDecryptedBlock;
typedef linked_ptr<KeyMessageImpl> LinkedKeyMessage;
typedef linked_ptr<VideoFrameImpl> LinkedVideoFrame;
+ typedef linked_ptr<AudioFramesImpl> LinkedAudioFrames;
// <code>PPB_ContentDecryptor_Private</code> dispatchers. These are passed to
// <code>callback_factory_</code> to ensure that calls into
@@ -513,6 +536,10 @@ class CdmWrapper : public pp::Instance,
const cdm::Status& status,
const LinkedVideoFrame& video_frame,
const PP_DecryptTrackingInfo& tracking_info);
+ void DeliverSamples(int32_t result,
+ const cdm::Status& status,
+ const LinkedAudioFrames& audio_frames,
+ const PP_DecryptTrackingInfo& tracking_info);
// Helper for SetTimer().
void TimerExpired(int32 result);
@@ -714,8 +741,6 @@ void CdmWrapper::DecryptAndDecode(
PP_DecryptorStreamType decoder_type,
pp::Buffer_Dev encrypted_buffer,
const PP_EncryptedBlockInfo& encrypted_block_info) {
- // TODO(tomfinegan): Remove this check when audio decoding is added.
- PP_DCHECK(decoder_type == PP_DECRYPTORSTREAMTYPE_VIDEO);
PP_DCHECK(cdm_);
cdm::InputBuffer input_buffer;
@@ -727,14 +752,34 @@ void CdmWrapper::DecryptAndDecode(
&input_buffer);
}
- LinkedVideoFrame video_frame(new VideoFrameImpl());
- cdm::Status status = cdm_->DecryptAndDecodeFrame(input_buffer,
- video_frame.get());
- CallOnMain(callback_factory_.NewCallback(
- &CdmWrapper::DeliverFrame,
- status,
- video_frame,
- encrypted_block_info.tracking_info));
+ cdm::Status status = cdm::kDecodeError;
+ switch (decoder_type) {
+ case PP_DECRYPTORSTREAMTYPE_VIDEO: {
+ LinkedVideoFrame video_frame(new VideoFrameImpl());
+ status = cdm_->DecryptAndDecodeFrame(input_buffer, video_frame.get());
+ CallOnMain(callback_factory_.NewCallback(
+ &CdmWrapper::DeliverFrame,
+ status,
+ video_frame,
+ encrypted_block_info.tracking_info));
+ return;
+ }
+
+ case PP_DECRYPTORSTREAMTYPE_AUDIO: {
+ LinkedAudioFrames audio_frames(new AudioFramesImpl());
+ status = cdm_->DecryptAndDecodeSamples(input_buffer, audio_frames.get());
+ CallOnMain(callback_factory_.NewCallback(
+ &CdmWrapper::DeliverSamples,
+ status,
+ audio_frames,
+ encrypted_block_info.tracking_info));
+ return;
+ }
+
+ default:
+ PP_NOTREACHED();
+ return;
+ }
}
void CdmWrapper::SetTimer(int64 delay_ms) {
@@ -808,6 +853,7 @@ void CdmWrapper::DeliverBlock(int32_t result,
if (decrypted_block_info.result == PP_DECRYPTRESULT_SUCCESS) {
PP_DCHECK(decrypted_block.get() && decrypted_block->buffer());
if (!decrypted_block.get() || !decrypted_block->buffer()) {
+ PP_NOTREACHED();
decrypted_block_info.result = PP_DECRYPTRESULT_DECRYPT_ERROR;
} else {
buffer = static_cast<PpbBuffer*>(decrypted_block->buffer())->buffer_dev();
@@ -864,6 +910,7 @@ void CdmWrapper::DeliverFrame(
!video_frame->frame_buffer() ||
(decrypted_frame_info.format != PP_DECRYPTEDFRAMEFORMAT_YV12 &&
decrypted_frame_info.format != PP_DECRYPTEDFRAMEFORMAT_I420)) {
+ PP_NOTREACHED();
decrypted_frame_info.result = PP_DECRYPTRESULT_DECODE_ERROR;
} else {
buffer = static_cast<PpbBuffer*>(
@@ -888,6 +935,33 @@ void CdmWrapper::DeliverFrame(
pp::ContentDecryptor_Private::DeliverFrame(buffer, decrypted_frame_info);
}
+void CdmWrapper::DeliverSamples(int32_t result,
+ const cdm::Status& status,
+ const LinkedAudioFrames& audio_frames,
+ const PP_DecryptTrackingInfo& tracking_info) {
+ PP_DCHECK(result == PP_OK);
+ // TODO(tomfinegan): Add PP_DecryptedSamplesInfo (or better name) for
+ // cdm::AudioFrames.
+ PP_DecryptedBlockInfo decrypted_block_info;
+ decrypted_block_info.tracking_info = tracking_info;
+ // TODO(tomfinegan): Remove this after PP_DecryptedSamplesInfo is added.
+ decrypted_block_info.tracking_info.timestamp = 0;
+ decrypted_block_info.result = CdmStatusToPpDecryptResult(status);
+
+ pp::Buffer_Dev buffer;
+
+ if (decrypted_block_info.result == PP_DECRYPTRESULT_SUCCESS) {
+ PP_DCHECK(audio_frames.get() && audio_frames->buffer());
+ if (!audio_frames.get() || !audio_frames->buffer()) {
+ PP_NOTREACHED();
+ decrypted_block_info.result = PP_DECRYPTRESULT_DECRYPT_ERROR;
+ } else {
+ buffer = static_cast<PpbBuffer*>(audio_frames->buffer())->buffer_dev();
+ }
+ }
+
+ pp::ContentDecryptor_Private::DeliverSamples(buffer, decrypted_block_info);
+}
// This object is the global object representing this plugin library as long
// as it is loaded.
« no previous file with comments | « media/filters/decrypting_audio_decoder_unittest.cc ('k') | webkit/media/crypto/ppapi/clear_key_cdm.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698