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

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

Issue 11147032: Fake video decoder in clearkey CDM. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: oops, more fixes 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/media/crypto/ppapi/clear_key_cdm.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webkit/media/crypto/ppapi/clear_key_cdm.cc
diff --git a/webkit/media/crypto/ppapi/clear_key_cdm.cc b/webkit/media/crypto/ppapi/clear_key_cdm.cc
index 079d2fa94202c1ae8c55c0776d7d9dea99b2fafe..af526c962543540304045897c5e19f981f98fe2f 100644
--- a/webkit/media/crypto/ppapi/clear_key_cdm.cc
+++ b/webkit/media/crypto/ppapi/clear_key_cdm.cc
@@ -236,8 +236,13 @@ cdm::Status ClearKeyCdm::Decrypt(
cdm::Status ClearKeyCdm::InitializeVideoDecoder(
const cdm::VideoDecoderConfig& video_decoder_config) {
+#if !defined(CLEAR_KEY_CDM_USE_FAKE_VIDEO_DECODER)
NOTIMPLEMENTED();
return cdm::kSessionError;
+#else
+ video_size_ = video_decoder_config.coded_size;
+ return cdm::kSuccess;
+#endif // CLEAR_KEY_CDM_USE_FAKE_VIDEO_DECODER
}
void ClearKeyCdm::ResetDecoder(cdm::StreamType) {
@@ -251,8 +256,75 @@ void ClearKeyCdm::DeinitializeDecoder(cdm::StreamType) {
cdm::Status ClearKeyCdm::DecryptAndDecodeFrame(
const cdm::InputBuffer& encrypted_buffer,
cdm::VideoFrame* video_frame) {
+ if (!encrypted_buffer.data) {
+ video_frame->set_format(cdm::kEmptyVideoFrame);
+ return cdm::kSuccess;
+ }
+
+ scoped_refptr<media::DecoderBuffer> decoder_buffer =
+ CopyDecoderBufferFrom(encrypted_buffer);
+
+ // Callback is called synchronously, so we can use variables on the stack.
+ media::Decryptor::Status status;
+ scoped_refptr<media::DecoderBuffer> buffer;
+ decryptor_.Decrypt(decoder_buffer,
+ base::Bind(&CopyDecryptResults, &status, &buffer));
+
+ if (status == media::Decryptor::kError)
+ return cdm::kDecryptError;
+
+ if (status == media::Decryptor::kNoKey)
+ return cdm::kNoKey;
+
+#if !defined(CLEAR_KEY_CDM_USE_FAKE_VIDEO_DECODER)
NOTIMPLEMENTED();
- return cdm::kDecryptError;
+ return cdm::kDecodeError;
+#else
+ GenerateFakeVideoFrame(decoder_buffer->GetTimestamp(), video_frame);
+ return cdm::kSuccess;
+#endif // CLEAR_KEY_CDM_USE_FAKE_VIDEO_DECODER
+}
+
+#if defined(CLEAR_KEY_CDM_USE_FAKE_VIDEO_DECODER)
+void ClearKeyCdm::GenerateFakeVideoFrame(base::TimeDelta timestamp,
+ cdm::VideoFrame* video_frame) {
+ // Choose non-zero alignment and padding on purpose for testing.
+ const int kAlignment = 8;
+ const int kPadding = 16;
+ const int kPlanePadding = 128;
+
+ int width = video_size_.width;
+ int height = video_size_.height;
+ DCHECK(width % 2 == 0);
+ DCHECK(height % 2 == 0);
+
+ int y_stride = (width + kAlignment - 1) / kAlignment * kAlignment + kPadding;
+ int uv_stride =
+ (width / 2 + kAlignment - 1) / kAlignment * kAlignment + kPadding;
+ int y_rows = height;
+ int uv_rows = height / 2;
+ int y_offset = 0;
+ int v_offset = y_stride * y_rows + kPlanePadding;
+ int u_offset = v_offset + uv_stride * uv_rows + kPlanePadding;
+ int frame_size = u_offset + uv_stride * uv_rows + kPlanePadding;
+
+ video_frame->set_format(cdm::kYv12);
+ video_frame->set_size(video_size_);
+ video_frame->set_frame_buffer(allocator_->Allocate(frame_size));
+ video_frame->set_plane_offset(cdm::VideoFrame::kYPlane, y_offset);
+ video_frame->set_plane_offset(cdm::VideoFrame::kVPlane, v_offset);
+ video_frame->set_plane_offset(cdm::VideoFrame::kUPlane, u_offset);
+ video_frame->set_stride(cdm::VideoFrame::kYPlane, y_stride);
+ video_frame->set_stride(cdm::VideoFrame::kVPlane, uv_stride);
+ video_frame->set_stride(cdm::VideoFrame::kUPlane, uv_stride);
+ video_frame->set_timestamp(timestamp.InMicroseconds());
+
+ static unsigned char color = 0;
+ color += 10;
+
+ memset(reinterpret_cast<void*>(video_frame->frame_buffer()->data()),
+ color, frame_size);
}
+#endif // CLEAR_KEY_CDM_USE_FAKE_VIDEO_DECODER
} // namespace webkit_media
« no previous file with comments | « webkit/media/crypto/ppapi/clear_key_cdm.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698