1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "media/cdm/ppapi/fake_cdm_video_decoder.h" 6 7 #include "base/logging.h" 8 9 namespace media { 10 11 FakeCdmVideoDecoder::FakeCdmVideoDecoder(cdm::Host* host) 12 : is_initialized_(false), 13 host_(host) { 14 } 15 16 FakeCdmVideoDecoder::~FakeCdmVideoDecoder() { 17 Deinitialize(); 18 } 19 20 bool FakeCdmVideoDecoder::Initialize(const cdm::VideoDecoderConfig& config) { 21 DVLOG(1) << "Initialize()"; 22 23 video_size_ = config.coded_size; 24 is_initialized_ = true; 25 return true; 26 } 27 28 void FakeCdmVideoDecoder::Deinitialize() { 29 DVLOG(1) << "Deinitialize()"; 30 is_initialized_ = false; 31 } 32 33 void FakeCdmVideoDecoder::Reset() { 34 DVLOG(1) << "Reset()"; 35 } 36 37 // Creates a YV12 video frame. 38 cdm::Status FakeCdmVideoDecoder::DecodeFrame(const uint8_t* compressed_frame, 39 int32_t compressed_frame_size, 40 int64_t timestamp, 41 cdm::VideoFrame* decoded_frame) { 42 DVLOG(1) << "DecodeFrame()"; 43 44 // The fake decoder does not buffer any frames internally. So if the input is 45 // empty (EOS), just return kNeedMoreData. 46 if (!decoded_frame) 47 return cdm::kNeedMoreData; 48 49 // Choose non-zero alignment and padding on purpose for testing. 50 const int kAlignment = 8; 51 const int kPadding = 16; 52 const int kPlanePadding = 128; 53 54 int width = video_size_.width; 55 int height = video_size_.height; 56 DCHECK_EQ(width % 2, 0); 57 DCHECK_EQ(height % 2, 0); 58 59 int y_stride = (width + kAlignment - 1) / kAlignment * kAlignment + kPadding; 60 int uv_stride = 61 (width / 2 + kAlignment - 1) / kAlignment * kAlignment + kPadding; 62 int y_rows = height; 63 int uv_rows = height / 2; 64 int y_offset = 0; 65 int v_offset = y_stride * y_rows + kPlanePadding; 66 int u_offset = v_offset + uv_stride * uv_rows + kPlanePadding; 67 int frame_size = u_offset + uv_stride * uv_rows + kPlanePadding; 68 69 decoded_frame->SetFrameBuffer(host_->Allocate(frame_size)); 70 decoded_frame->FrameBuffer()->SetSize(frame_size); 71 72 decoded_frame->SetFormat(cdm::kYv12); 73 decoded_frame->SetSize(video_size_); 74 decoded_frame->SetPlaneOffset(cdm::VideoFrame::kYPlane, y_offset); 75 decoded_frame->SetPlaneOffset(cdm::VideoFrame::kVPlane, v_offset); 76 decoded_frame->SetPlaneOffset(cdm::VideoFrame::kUPlane, u_offset); 77 decoded_frame->SetStride(cdm::VideoFrame::kYPlane, y_stride); 78 decoded_frame->SetStride(cdm::VideoFrame::kVPlane, uv_stride); 79 decoded_frame->SetStride(cdm::VideoFrame::kUPlane, uv_stride); 80 decoded_frame->SetTimestamp(timestamp); 81 82 static unsigned char color = 0; 83 color += 10; 84 85 memset(reinterpret_cast<void*>(decoded_frame->FrameBuffer()->Data()), 86 color, frame_size); 87 88 return cdm::kSuccess; 89 } 90 91 } // namespace media 92