Index: webkit/media/crypto/ppapi/fake_cdm_video_decoder.cc |
diff --git a/webkit/media/crypto/ppapi/fake_cdm_video_decoder.cc b/webkit/media/crypto/ppapi/fake_cdm_video_decoder.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..6effd9df5cfaa95792f4943f46120ab32417ccd0 |
--- /dev/null |
+++ b/webkit/media/crypto/ppapi/fake_cdm_video_decoder.cc |
@@ -0,0 +1,90 @@ |
+// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "webkit/media/crypto/ppapi/fake_cdm_video_decoder.h" |
+ |
+#include "base/logging.h" |
+#include "webkit/media/crypto/ppapi/content_decryption_module.h" |
+ |
+namespace webkit_media { |
+ |
+FakeCdmVideoDecoder::FakeCdmVideoDecoder(cdm::Allocator* allocator) |
+ : is_initialized_(false), |
+ allocator_(allocator) { |
+} |
+ |
+FakeCdmVideoDecoder::~FakeCdmVideoDecoder() { |
+ Deinitialize(); |
+} |
+ |
+bool FakeCdmVideoDecoder::Initialize(const cdm::VideoDecoderConfig& config) { |
+ DVLOG(1) << "Initialize()"; |
+ |
+ video_size_ = config.coded_size; |
+ is_initialized_ = true; |
+ return true; |
+} |
+ |
+void FakeCdmVideoDecoder::Deinitialize() { |
+ DVLOG(1) << "Deinitialize()"; |
+ is_initialized_ = false; |
+} |
+ |
+void FakeCdmVideoDecoder::Reset() { |
+ DVLOG(1) << "Reset()"; |
+} |
+ |
+// Creates a YV12 video frame. |
+cdm::Status FakeCdmVideoDecoder::DecodeFrame(const uint8_t* compressed_frame, |
+ int32_t compressed_frame_size, |
+ int64_t timestamp, |
+ cdm::VideoFrame* decoded_frame) { |
+ DVLOG(1) << "DecodeFrame()"; |
+ |
+ // The fake decoder does not buffer any frames internally. So if the input is |
+ // empty (EOS), just return kNeedMoreData. |
+ if (!decoded_frame) |
+ return cdm::kNeedMoreData; |
+ |
+ // 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_EQ(width % 2, 0); |
+ DCHECK_EQ(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; |
+ |
+ decoded_frame->set_format(cdm::kYv12); |
+ decoded_frame->set_size(video_size_); |
+ decoded_frame->set_frame_buffer(allocator_->Allocate(frame_size)); |
+ decoded_frame->set_plane_offset(cdm::VideoFrame::kYPlane, y_offset); |
+ decoded_frame->set_plane_offset(cdm::VideoFrame::kVPlane, v_offset); |
+ decoded_frame->set_plane_offset(cdm::VideoFrame::kUPlane, u_offset); |
+ decoded_frame->set_stride(cdm::VideoFrame::kYPlane, y_stride); |
+ decoded_frame->set_stride(cdm::VideoFrame::kVPlane, uv_stride); |
+ decoded_frame->set_stride(cdm::VideoFrame::kUPlane, uv_stride); |
+ decoded_frame->set_timestamp(timestamp); |
+ |
+ static unsigned char color = 0; |
+ color += 10; |
+ |
+ memset(reinterpret_cast<void*>(decoded_frame->frame_buffer()->data()), |
+ color, frame_size); |
+ |
+ return cdm::kSuccess; |
+} |
+ |
+} // namespace webkit_media |