summaryrefslogtreecommitdiff
path: root/chromium/media/filters/frame_buffer_pool.cc
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2018-08-28 15:28:34 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2018-08-28 13:54:51 +0000
commit2a19c63448c84c1805fb1a585c3651318bb86ca7 (patch)
treeeb17888e8531aa6ee5e85721bd553b832a7e5156 /chromium/media/filters/frame_buffer_pool.cc
parentb014812705fc80bff0a5c120dfcef88f349816dc (diff)
downloadqtwebengine-chromium-2a19c63448c84c1805fb1a585c3651318bb86ca7.tar.gz
BASELINE: Update Chromium to 69.0.3497.70
Change-Id: I2b7b56e4e7a8b26656930def0d4575dc32b900a0 Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'chromium/media/filters/frame_buffer_pool.cc')
-rw-r--r--chromium/media/filters/frame_buffer_pool.cc34
1 files changed, 24 insertions, 10 deletions
diff --git a/chromium/media/filters/frame_buffer_pool.cc b/chromium/media/filters/frame_buffer_pool.cc
index 84c09973a1d..1bcbc8df261 100644
--- a/chromium/media/filters/frame_buffer_pool.cc
+++ b/chromium/media/filters/frame_buffer_pool.cc
@@ -19,8 +19,12 @@
namespace media {
struct FrameBufferPool::FrameBuffer {
- std::vector<uint8_t> data;
- std::vector<uint8_t> alpha_data;
+ // Not using std::vector<uint8_t> as resize() calls take a really long time
+ // for large buffers.
+ std::unique_ptr<uint8_t[]> data;
+ size_t data_size = 0u;
+ std::unique_ptr<uint8_t[]> alpha_data;
+ size_t alpha_data_size = 0u;
bool held_by_library = false;
// Needs to be a counter since a frame buffer might be used multiple times.
int held_by_frame = 0;
@@ -63,12 +67,17 @@ uint8_t* FrameBufferPool::GetFrameBuffer(size_t min_size, void** fb_priv) {
// Resize the frame buffer if necessary.
frame_buffer->held_by_library = true;
- if (frame_buffer->data.size() < min_size)
- frame_buffer->data.resize(min_size);
+ if (frame_buffer->data_size < min_size) {
+ // Free the existing |data| first so that the memory can be reused,
+ // if possible. Note that the new array is purposely not initialized.
+ frame_buffer->data.reset();
+ frame_buffer->data.reset(new uint8_t[min_size]);
+ frame_buffer->data_size = min_size;
+ }
// Provide the client with a private identifier.
*fb_priv = frame_buffer.get();
- return frame_buffer->data.data();
+ return frame_buffer->data.get();
}
void FrameBufferPool::ReleaseFrameBuffer(void* fb_priv) {
@@ -89,9 +98,14 @@ uint8_t* FrameBufferPool::AllocateAlphaPlaneForFrameBuffer(size_t min_size,
auto* frame_buffer = static_cast<FrameBuffer*>(fb_priv);
DCHECK(IsUsed(frame_buffer));
- if (frame_buffer->alpha_data.size() < min_size)
- frame_buffer->alpha_data.resize(min_size);
- return frame_buffer->alpha_data.data();
+ if (frame_buffer->alpha_data_size < min_size) {
+ // Free the existing |alpha_data| first so that the memory can be reused,
+ // if possible. Note that the new array is purposely not initialized.
+ frame_buffer->alpha_data.reset();
+ frame_buffer->alpha_data.reset(new uint8_t[min_size]);
+ frame_buffer->alpha_data_size = min_size;
+ }
+ return frame_buffer->alpha_data.get();
}
base::Closure FrameBufferPool::CreateFrameCallback(void* fb_priv) {
@@ -121,8 +135,8 @@ bool FrameBufferPool::OnMemoryDump(
size_t bytes_reserved = 0;
for (const auto& frame_buffer : frame_buffers_) {
if (IsUsed(frame_buffer.get()))
- bytes_used += frame_buffer->data.size();
- bytes_reserved += frame_buffer->data.size();
+ bytes_used += frame_buffer->data_size + frame_buffer->alpha_data_size;
+ bytes_reserved += frame_buffer->data_size + frame_buffer->alpha_data_size;
}
memory_dump->AddScalar(base::trace_event::MemoryAllocatorDump::kNameSize,