Line data Source code
1 : /*
2 : * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved.
3 : *
4 : * Use of this source code is governed by a BSD-style license
5 : * that can be found in the LICENSE file in the root of the source
6 : * tree. An additional intellectual property rights grant can be found
7 : * in the file PATENTS. All contributing project authors may
8 : * be found in the AUTHORS file in the root of the source tree.
9 : */
10 :
11 : #ifndef WEBRTC_COMMON_VIDEO_INCLUDE_I420_BUFFER_POOL_H_
12 : #define WEBRTC_COMMON_VIDEO_INCLUDE_I420_BUFFER_POOL_H_
13 :
14 : #include <list>
15 : #include <limits>
16 :
17 : #include "webrtc/api/video/i420_buffer.h"
18 : #include "webrtc/base/race_checker.h"
19 :
20 : namespace webrtc {
21 :
22 : // Simple buffer pool to avoid unnecessary allocations of I420Buffer objects.
23 : // The pool manages the memory of the I420Buffer returned from CreateBuffer.
24 : // When the I420Buffer is destructed, the memory is returned to the pool for use
25 : // by subsequent calls to CreateBuffer. If the resolution passed to CreateBuffer
26 : // changes, old buffers will be purged from the pool.
27 : // Note that CreateBuffer will crash if more than kMaxNumberOfFramesBeforeCrash
28 : // are created. This is to prevent memory leaks where frames are not returned.
29 0 : class I420BufferPool {
30 : public:
31 0 : I420BufferPool()
32 0 : : I420BufferPool(false) {}
33 0 : explicit I420BufferPool(bool zero_initialize)
34 0 : : I420BufferPool(zero_initialize, std::numeric_limits<size_t>::max()) {}
35 : I420BufferPool(bool zero_initialze, size_t max_number_of_buffers);
36 :
37 : // Returns a buffer from the pool. If no suitable buffer exist in the pool
38 : // and there are less than |max_number_of_buffers| pending, a buffer is
39 : // created. Returns null otherwise.
40 : rtc::scoped_refptr<I420Buffer> CreateBuffer(int width, int height);
41 : // Clears buffers_ and detaches the thread checker so that it can be reused
42 : // later from another thread.
43 : void Release();
44 :
45 : private:
46 : // Explicitly use a RefCountedObject to get access to HasOneRef,
47 : // needed by the pool to check exclusive access.
48 : using PooledI420Buffer = rtc::RefCountedObject<I420Buffer>;
49 :
50 : rtc::RaceChecker race_checker_;
51 : std::list<rtc::scoped_refptr<PooledI420Buffer>> buffers_;
52 : // If true, newly allocated buffers are zero-initialized. Note that recycled
53 : // buffers are not zero'd before reuse. This is required of buffers used by
54 : // FFmpeg according to http://crbug.com/390941, which only requires it for the
55 : // initial allocation (as shown by FFmpeg's own buffer allocation code). It
56 : // has to do with "Use-of-uninitialized-value" on "Linux_msan_chrome".
57 : const bool zero_initialize_;
58 : // Max number of buffers this pool can have pending.
59 : const size_t max_number_of_buffers_;
60 : };
61 :
62 : } // namespace webrtc
63 :
64 : #endif // WEBRTC_COMMON_VIDEO_INCLUDE_I420_BUFFER_POOL_H_
|