OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "media/filters/vpx_video_decoder.h" | 5 #include "media/filters/vpx_video_decoder.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <algorithm> | 10 #include <algorithm> |
| 11 #include <memory> |
11 #include <string> | 12 #include <string> |
12 #include <vector> | 13 #include <vector> |
13 | 14 |
14 #include "base/bind.h" | 15 #include "base/bind.h" |
15 #include "base/callback_helpers.h" | 16 #include "base/callback_helpers.h" |
16 #include "base/command_line.h" | 17 #include "base/command_line.h" |
17 #include "base/lazy_instance.h" | 18 #include "base/lazy_instance.h" |
18 #include "base/location.h" | 19 #include "base/location.h" |
19 #include "base/logging.h" | 20 #include "base/logging.h" |
20 #include "base/macros.h" | 21 #include "base/macros.h" |
| 22 #include "base/memory/ptr_util.h" |
21 #include "base/single_thread_task_runner.h" | 23 #include "base/single_thread_task_runner.h" |
22 #include "base/stl_util.h" | |
23 #include "base/strings/string_number_conversions.h" | 24 #include "base/strings/string_number_conversions.h" |
24 #include "base/sys_byteorder.h" | 25 #include "base/sys_byteorder.h" |
25 #include "base/sys_info.h" | 26 #include "base/sys_info.h" |
26 #include "base/threading/thread.h" | 27 #include "base/threading/thread.h" |
27 #include "base/trace_event/memory_allocator_dump.h" | 28 #include "base/trace_event/memory_allocator_dump.h" |
28 #include "base/trace_event/memory_dump_manager.h" | 29 #include "base/trace_event/memory_dump_manager.h" |
29 #include "base/trace_event/memory_dump_provider.h" | 30 #include "base/trace_event/memory_dump_provider.h" |
30 #include "base/trace_event/process_memory_dump.h" | 31 #include "base/trace_event/process_memory_dump.h" |
31 #include "base/trace_event/trace_event.h" | 32 #include "base/trace_event/trace_event.h" |
32 #include "media/base/bind_to_current_loop.h" | 33 #include "media/base/bind_to_current_loop.h" |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
216 ~MemoryPool() override; | 217 ~MemoryPool() override; |
217 | 218 |
218 // Gets the next available frame buffer for use by libvpx. | 219 // Gets the next available frame buffer for use by libvpx. |
219 VP9FrameBuffer* GetFreeFrameBuffer(size_t min_size); | 220 VP9FrameBuffer* GetFreeFrameBuffer(size_t min_size); |
220 | 221 |
221 // Method that gets called when a VideoFrame that references this pool gets | 222 // Method that gets called when a VideoFrame that references this pool gets |
222 // destroyed. | 223 // destroyed. |
223 void OnVideoFrameDestroyed(VP9FrameBuffer* frame_buffer); | 224 void OnVideoFrameDestroyed(VP9FrameBuffer* frame_buffer); |
224 | 225 |
225 // Frame buffers to be used by libvpx for VP9 Decoding. | 226 // Frame buffers to be used by libvpx for VP9 Decoding. |
226 std::vector<VP9FrameBuffer*> frame_buffers_; | 227 std::vector<std::unique_ptr<VP9FrameBuffer>> frame_buffers_; |
227 | 228 |
228 DISALLOW_COPY_AND_ASSIGN(MemoryPool); | 229 DISALLOW_COPY_AND_ASSIGN(MemoryPool); |
229 }; | 230 }; |
230 | 231 |
231 VpxVideoDecoder::MemoryPool::MemoryPool() { | 232 VpxVideoDecoder::MemoryPool::MemoryPool() { |
232 base::trace_event::MemoryDumpManager::GetInstance()->RegisterDumpProvider( | 233 base::trace_event::MemoryDumpManager::GetInstance()->RegisterDumpProvider( |
233 this, "VpxVideoDecoder", base::ThreadTaskRunnerHandle::Get()); | 234 this, "VpxVideoDecoder", base::ThreadTaskRunnerHandle::Get()); |
234 } | 235 } |
235 | 236 |
236 VpxVideoDecoder::MemoryPool::~MemoryPool() { | 237 VpxVideoDecoder::MemoryPool::~MemoryPool() { |
237 base::STLDeleteElements(&frame_buffers_); | |
238 base::trace_event::MemoryDumpManager::GetInstance()->UnregisterDumpProvider( | 238 base::trace_event::MemoryDumpManager::GetInstance()->UnregisterDumpProvider( |
239 this); | 239 this); |
240 } | 240 } |
241 | 241 |
242 VpxVideoDecoder::MemoryPool::VP9FrameBuffer* | 242 VpxVideoDecoder::MemoryPool::VP9FrameBuffer* |
243 VpxVideoDecoder::MemoryPool::GetFreeFrameBuffer(size_t min_size) { | 243 VpxVideoDecoder::MemoryPool::GetFreeFrameBuffer(size_t min_size) { |
244 // Check if a free frame buffer exists. | 244 // Check if a free frame buffer exists. |
245 size_t i = 0; | 245 size_t i = 0; |
246 for (; i < frame_buffers_.size(); ++i) { | 246 for (; i < frame_buffers_.size(); ++i) { |
247 if (frame_buffers_[i]->ref_cnt == 0) | 247 if (frame_buffers_[i]->ref_cnt == 0) |
248 break; | 248 break; |
249 } | 249 } |
250 | 250 |
251 if (i == frame_buffers_.size()) { | 251 if (i == frame_buffers_.size()) { |
252 // Create a new frame buffer. | 252 // Create a new frame buffer. |
253 frame_buffers_.push_back(new VP9FrameBuffer()); | 253 frame_buffers_.push_back(base::MakeUnique<VP9FrameBuffer>()); |
254 } | 254 } |
255 | 255 |
256 // Resize the frame buffer if necessary. | 256 // Resize the frame buffer if necessary. |
257 if (frame_buffers_[i]->data.size() < min_size) | 257 if (frame_buffers_[i]->data.size() < min_size) |
258 frame_buffers_[i]->data.resize(min_size); | 258 frame_buffers_[i]->data.resize(min_size); |
259 return frame_buffers_[i]; | 259 return frame_buffers_[i].get(); |
260 } | 260 } |
261 | 261 |
262 int32_t VpxVideoDecoder::MemoryPool::GetVP9FrameBuffer( | 262 int32_t VpxVideoDecoder::MemoryPool::GetVP9FrameBuffer( |
263 void* user_priv, | 263 void* user_priv, |
264 size_t min_size, | 264 size_t min_size, |
265 vpx_codec_frame_buffer* fb) { | 265 vpx_codec_frame_buffer* fb) { |
266 DCHECK(user_priv); | 266 DCHECK(user_priv); |
267 DCHECK(fb); | 267 DCHECK(fb); |
268 | 268 |
269 VpxVideoDecoder::MemoryPool* memory_pool = | 269 VpxVideoDecoder::MemoryPool* memory_pool = |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
310 base::trace_event::MemoryAllocatorDump* memory_dump = | 310 base::trace_event::MemoryAllocatorDump* memory_dump = |
311 pmd->CreateAllocatorDump("media/vpx/memory_pool"); | 311 pmd->CreateAllocatorDump("media/vpx/memory_pool"); |
312 base::trace_event::MemoryAllocatorDump* used_memory_dump = | 312 base::trace_event::MemoryAllocatorDump* used_memory_dump = |
313 pmd->CreateAllocatorDump("media/vpx/memory_pool/used"); | 313 pmd->CreateAllocatorDump("media/vpx/memory_pool/used"); |
314 | 314 |
315 pmd->AddSuballocation(memory_dump->guid(), | 315 pmd->AddSuballocation(memory_dump->guid(), |
316 base::trace_event::MemoryDumpManager::GetInstance() | 316 base::trace_event::MemoryDumpManager::GetInstance() |
317 ->system_allocator_pool_name()); | 317 ->system_allocator_pool_name()); |
318 size_t bytes_used = 0; | 318 size_t bytes_used = 0; |
319 size_t bytes_reserved = 0; | 319 size_t bytes_reserved = 0; |
320 for (const VP9FrameBuffer* frame_buffer : frame_buffers_) { | 320 for (const auto& frame_buffer : frame_buffers_) { |
321 if (frame_buffer->ref_cnt) | 321 if (frame_buffer->ref_cnt) |
322 bytes_used += frame_buffer->data.size(); | 322 bytes_used += frame_buffer->data.size(); |
323 bytes_reserved += frame_buffer->data.size(); | 323 bytes_reserved += frame_buffer->data.size(); |
324 } | 324 } |
325 | 325 |
326 memory_dump->AddScalar(base::trace_event::MemoryAllocatorDump::kNameSize, | 326 memory_dump->AddScalar(base::trace_event::MemoryAllocatorDump::kNameSize, |
327 base::trace_event::MemoryAllocatorDump::kUnitsBytes, | 327 base::trace_event::MemoryAllocatorDump::kUnitsBytes, |
328 bytes_reserved); | 328 bytes_reserved); |
329 used_memory_dump->AddScalar( | 329 used_memory_dump->AddScalar( |
330 base::trace_event::MemoryAllocatorDump::kNameSize, | 330 base::trace_event::MemoryAllocatorDump::kNameSize, |
(...skipping 495 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
826 (*video_frame)->visible_data(VideoFrame::kUPlane), | 826 (*video_frame)->visible_data(VideoFrame::kUPlane), |
827 (*video_frame)->stride(VideoFrame::kUPlane), | 827 (*video_frame)->stride(VideoFrame::kUPlane), |
828 (*video_frame)->visible_data(VideoFrame::kVPlane), | 828 (*video_frame)->visible_data(VideoFrame::kVPlane), |
829 (*video_frame)->stride(VideoFrame::kVPlane), coded_size.width(), | 829 (*video_frame)->stride(VideoFrame::kVPlane), coded_size.width(), |
830 coded_size.height()); | 830 coded_size.height()); |
831 | 831 |
832 return true; | 832 return true; |
833 } | 833 } |
834 | 834 |
835 } // namespace media | 835 } // namespace media |
OLD | NEW |