• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #ifndef MEDIA_CDM_PPAPI_CDM_HELPERS_H_
6 #define MEDIA_CDM_PPAPI_CDM_HELPERS_H_
7 
8 #include <map>
9 #include <utility>
10 
11 #include "base/basictypes.h"
12 #include "base/compiler_specific.h"
13 #include "build/build_config.h"
14 #include "media/cdm/ppapi/api/content_decryption_module.h"
15 #include "ppapi/c/pp_errors.h"
16 #include "ppapi/c/pp_stdint.h"
17 #include "ppapi/cpp/dev/buffer_dev.h"
18 #include "ppapi/cpp/instance.h"
19 #include "ppapi/cpp/logging.h"
20 
21 namespace media {
22 
23 // cdm::Buffer implementation that provides access to memory owned by a
24 // pp::Buffer_Dev.
25 // This class holds a reference to the Buffer_Dev throughout its lifetime.
26 // TODO(xhwang): Find a better name. It's confusing to have PpbBuffer,
27 // pp::Buffer_Dev and PPB_Buffer_Dev.
28 class PpbBuffer : public cdm::Buffer {
29  public:
Create(const pp::Buffer_Dev & buffer,uint32_t buffer_id)30   static PpbBuffer* Create(const pp::Buffer_Dev& buffer, uint32_t buffer_id) {
31     PP_DCHECK(buffer.data());
32     PP_DCHECK(buffer.size());
33     PP_DCHECK(buffer_id);
34     return new PpbBuffer(buffer, buffer_id);
35   }
36 
37   // cdm::Buffer implementation.
Destroy()38   virtual void Destroy() OVERRIDE { delete this; }
39 
Capacity()40   virtual uint32_t Capacity() const OVERRIDE { return buffer_.size(); }
41 
Data()42   virtual uint8_t* Data() OVERRIDE {
43     return static_cast<uint8_t*>(buffer_.data());
44   }
45 
SetSize(uint32_t size)46   virtual void SetSize(uint32_t size) OVERRIDE {
47     PP_DCHECK(size <= Capacity());
48     if (size > Capacity()) {
49       size_ = 0;
50       return;
51     }
52 
53     size_ = size;
54   }
55 
Size()56   virtual uint32_t Size() const OVERRIDE { return size_; }
57 
buffer_dev()58   pp::Buffer_Dev buffer_dev() const { return buffer_; }
59 
buffer_id()60   uint32_t buffer_id() const { return buffer_id_; }
61 
62  private:
PpbBuffer(pp::Buffer_Dev buffer,uint32_t buffer_id)63   PpbBuffer(pp::Buffer_Dev buffer, uint32_t buffer_id)
64       : buffer_(buffer),
65         buffer_id_(buffer_id),
66         size_(0) {}
~PpbBuffer()67   virtual ~PpbBuffer() {}
68 
69   pp::Buffer_Dev buffer_;
70   uint32_t buffer_id_;
71   uint32_t size_;
72 
73   DISALLOW_COPY_AND_ASSIGN(PpbBuffer);
74 };
75 
76 class PpbBufferAllocator {
77  public:
PpbBufferAllocator(pp::Instance * instance)78   explicit PpbBufferAllocator(pp::Instance* instance)
79       : instance_(instance),
80         next_buffer_id_(1) {}
~PpbBufferAllocator()81   ~PpbBufferAllocator() {}
82 
83   cdm::Buffer* Allocate(uint32_t capacity);
84 
85   // Releases the buffer with |buffer_id|. A buffer can be recycled after
86   // it is released.
87   void Release(uint32_t buffer_id);
88 
89  private:
90   typedef std::map<uint32_t, pp::Buffer_Dev> AllocatedBufferMap;
91   typedef std::multimap<uint32_t, std::pair<uint32_t, pp::Buffer_Dev> >
92       FreeBufferMap;
93 
94   pp::Buffer_Dev AllocateNewBuffer(uint32_t capacity);
95 
96   pp::Instance* const instance_;
97   uint32_t next_buffer_id_;
98   AllocatedBufferMap allocated_buffers_;
99   FreeBufferMap free_buffers_;
100 
101   DISALLOW_COPY_AND_ASSIGN(PpbBufferAllocator);
102 };
103 
104 class DecryptedBlockImpl : public cdm::DecryptedBlock {
105  public:
DecryptedBlockImpl()106   DecryptedBlockImpl() : buffer_(NULL), timestamp_(0) {}
~DecryptedBlockImpl()107   virtual ~DecryptedBlockImpl() { if (buffer_) buffer_->Destroy(); }
108 
SetDecryptedBuffer(cdm::Buffer * buffer)109   virtual void SetDecryptedBuffer(cdm::Buffer* buffer) OVERRIDE {
110     buffer_ = static_cast<PpbBuffer*>(buffer);
111   }
DecryptedBuffer()112   virtual cdm::Buffer* DecryptedBuffer() OVERRIDE { return buffer_; }
113 
SetTimestamp(int64_t timestamp)114   virtual void SetTimestamp(int64_t timestamp) OVERRIDE {
115     timestamp_ = timestamp;
116   }
Timestamp()117   virtual int64_t Timestamp() const OVERRIDE { return timestamp_; }
118 
119  private:
120   PpbBuffer* buffer_;
121   int64_t timestamp_;
122 
123   DISALLOW_COPY_AND_ASSIGN(DecryptedBlockImpl);
124 };
125 
126 class VideoFrameImpl : public cdm::VideoFrame {
127  public:
128   VideoFrameImpl();
129   virtual ~VideoFrameImpl();
130 
SetFormat(cdm::VideoFormat format)131   virtual void SetFormat(cdm::VideoFormat format) OVERRIDE {
132     format_ = format;
133   }
Format()134   virtual cdm::VideoFormat Format() const OVERRIDE { return format_; }
135 
SetSize(cdm::Size size)136   virtual void SetSize(cdm::Size size) OVERRIDE { size_ = size; }
Size()137   virtual cdm::Size Size() const OVERRIDE { return size_; }
138 
SetFrameBuffer(cdm::Buffer * frame_buffer)139   virtual void SetFrameBuffer(cdm::Buffer* frame_buffer) OVERRIDE {
140     frame_buffer_ = static_cast<PpbBuffer*>(frame_buffer);
141   }
FrameBuffer()142   virtual cdm::Buffer* FrameBuffer() OVERRIDE { return frame_buffer_; }
143 
SetPlaneOffset(cdm::VideoFrame::VideoPlane plane,uint32_t offset)144   virtual void SetPlaneOffset(cdm::VideoFrame::VideoPlane plane,
145                               uint32_t offset) OVERRIDE {
146     PP_DCHECK(plane < kMaxPlanes);
147     plane_offsets_[plane] = offset;
148   }
PlaneOffset(VideoPlane plane)149   virtual uint32_t PlaneOffset(VideoPlane plane) OVERRIDE {
150     PP_DCHECK(plane < kMaxPlanes);
151     return plane_offsets_[plane];
152   }
153 
SetStride(VideoPlane plane,uint32_t stride)154   virtual void SetStride(VideoPlane plane, uint32_t stride) OVERRIDE {
155     PP_DCHECK(plane < kMaxPlanes);
156     strides_[plane] = stride;
157   }
Stride(VideoPlane plane)158   virtual uint32_t Stride(VideoPlane plane) OVERRIDE {
159     PP_DCHECK(plane < kMaxPlanes);
160     return strides_[plane];
161   }
162 
SetTimestamp(int64_t timestamp)163   virtual void SetTimestamp(int64_t timestamp) OVERRIDE {
164     timestamp_ = timestamp;
165   }
Timestamp()166   virtual int64_t Timestamp() const OVERRIDE { return timestamp_; }
167 
168  private:
169   // The video buffer format.
170   cdm::VideoFormat format_;
171 
172   // Width and height of the video frame.
173   cdm::Size size_;
174 
175   // The video frame buffer.
176   PpbBuffer* frame_buffer_;
177 
178   // Array of data pointers to each plane in the video frame buffer.
179   uint32_t plane_offsets_[kMaxPlanes];
180 
181   // Array of strides for each plane, typically greater or equal to the width
182   // of the surface divided by the horizontal sampling period.  Note that
183   // strides can be negative.
184   uint32_t strides_[kMaxPlanes];
185 
186   // Presentation timestamp in microseconds.
187   int64_t timestamp_;
188 
189   DISALLOW_COPY_AND_ASSIGN(VideoFrameImpl);
190 };
191 
192 class AudioFramesImpl : public cdm::AudioFrames_1,
193                         public cdm::AudioFrames_2 {
194  public:
AudioFramesImpl()195   AudioFramesImpl() : buffer_(NULL), format_(cdm::kUnknownAudioFormat) {}
~AudioFramesImpl()196   virtual ~AudioFramesImpl() {
197     if (buffer_)
198       buffer_->Destroy();
199   }
200 
201   // AudioFrames implementation.
SetFrameBuffer(cdm::Buffer * buffer)202   virtual void SetFrameBuffer(cdm::Buffer* buffer) OVERRIDE {
203     buffer_ = static_cast<PpbBuffer*>(buffer);
204   }
FrameBuffer()205   virtual cdm::Buffer* FrameBuffer() OVERRIDE {
206     return buffer_;
207   }
SetFormat(cdm::AudioFormat format)208   virtual void SetFormat(cdm::AudioFormat format) OVERRIDE {
209     format_ = format;
210   }
Format()211   virtual cdm::AudioFormat Format() const OVERRIDE {
212     return format_;
213   }
214 
PassFrameBuffer()215   cdm::Buffer* PassFrameBuffer() {
216     PpbBuffer* temp_buffer = buffer_;
217     buffer_ = NULL;
218     return temp_buffer;
219   }
220 
221  private:
222   PpbBuffer* buffer_;
223   cdm::AudioFormat format_;
224 
225   DISALLOW_COPY_AND_ASSIGN(AudioFramesImpl);
226 };
227 
228 }  // namespace media
229 
230 #endif  // MEDIA_CDM_PPAPI_CDM_HELPERS_H_
231