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.
5 #include "media/cdm/ppapi/cdm_helpers.h"
9 #include "base/basictypes.h"
10 #include "base/compiler_specific.h"
11 #include "build/build_config.h"
12 #include "media/cdm/ppapi/api/content_decryption_module.h"
13 #include "ppapi/c/pp_errors.h"
14 #include "ppapi/c/pp_stdint.h"
15 #include "ppapi/cpp/core.h"
16 #include "ppapi/cpp/dev/buffer_dev.h"
17 #include "ppapi/cpp/instance.h"
18 #include "ppapi/cpp/logging.h"
19 #include "ppapi/cpp/module.h"
23 cdm::Buffer
* PpbBufferAllocator::Allocate(uint32_t capacity
) {
24 PP_DCHECK(pp::Module::Get()->core()->IsMainThread());
29 pp::Buffer_Dev buffer
;
30 uint32_t buffer_id
= 0;
32 // Reuse a buffer in the free list if there is one that fits |capacity|.
33 // Otherwise, create a new one.
34 FreeBufferMap::iterator found
= free_buffers_
.lower_bound(capacity
);
35 if (found
== free_buffers_
.end()) {
36 // TODO(xhwang): Report statistics about how many new buffers are allocated.
37 buffer
= AllocateNewBuffer(capacity
);
40 buffer_id
= next_buffer_id_
++;
42 buffer
= found
->second
.second
;
43 buffer_id
= found
->second
.first
;
44 free_buffers_
.erase(found
);
47 allocated_buffers_
.insert(std::make_pair(buffer_id
, buffer
));
49 return PpbBuffer::Create(buffer
, buffer_id
);
52 void PpbBufferAllocator::Release(uint32_t buffer_id
) {
56 AllocatedBufferMap::iterator found
= allocated_buffers_
.find(buffer_id
);
57 if (found
== allocated_buffers_
.end())
60 pp::Buffer_Dev
& buffer
= found
->second
;
62 std::make_pair(buffer
.size(), std::make_pair(buffer_id
, buffer
)));
64 allocated_buffers_
.erase(found
);
67 pp::Buffer_Dev
PpbBufferAllocator::AllocateNewBuffer(uint32_t capacity
) {
68 // Always pad new allocated buffer so that we don't need to reallocate
69 // buffers frequently if requested sizes fluctuate slightly.
70 static const uint32_t kBufferPadding
= 512;
72 // Maximum number of free buffers we can keep when allocating new buffers.
73 static const uint32_t kFreeLimit
= 3;
75 // Destroy the smallest buffer before allocating a new bigger buffer if the
76 // number of free buffers exceeds a limit. This mechanism helps avoid ending
77 // up with too many small buffers, which could happen if the size to be
78 // allocated keeps increasing.
79 if (free_buffers_
.size() >= kFreeLimit
)
80 free_buffers_
.erase(free_buffers_
.begin());
82 // Creation of pp::Buffer_Dev is expensive! It involves synchronous IPC calls.
83 // That's why we try to avoid AllocateNewBuffer() as much as we can.
84 return pp::Buffer_Dev(instance_
, capacity
+ kBufferPadding
);
87 VideoFrameImpl::VideoFrameImpl()
88 : format_(cdm::kUnknownVideoFormat
),
91 for (uint32_t i
= 0; i
< kMaxPlanes
; ++i
) {
92 plane_offsets_
[i
] = 0;
97 VideoFrameImpl::~VideoFrameImpl() {
99 frame_buffer_
->Destroy();