xref: /OK3568_Linux_fs/external/mpp/doc/design/3.mpp_buffer.txt (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593SmuzhiyunMpp buffer design (2016.10.12)
2*4882a593Smuzhiyun================================================================================
3*4882a593Smuzhiyun
4*4882a593SmuzhiyunMpp buffer is the warpper of the buffer used by hardware. Hardware usually can
5*4882a593Smuzhiyunnot use the buffer malloc by cpu. Then we design MppBuffer for different memory
6*4882a593Smuzhiyunallocator on different platform. Currently it is designed for ion buffer on
7*4882a593SmuzhiyunAndroid and drm buffer on Linux. Later may support vb2_buffer in v4l2 devices.
8*4882a593Smuzhiyun
9*4882a593SmuzhiyunIn order to manage buffer usage in different user mpp buffer module introduces
10*4882a593SmuzhiyunMppBufferGroup as bufffer manager. All MppBuffer will connect to its manager.
11*4882a593SmuzhiyunMppBufferGroup provides allocator service and buffer reuse ability.
12*4882a593Smuzhiyun
13*4882a593SmuzhiyunDifferent MppBufferGroup has different allocator. And besides normal malloc/free
14*4882a593Smuzhiyunfunction the allocator can also accept buffer from external file descriptor.
15*4882a593Smuzhiyun
16*4882a593SmuzhiyunMppBufferGroup has two lists, unused buffer list and used buffer list. When
17*4882a593Smuzhiyunbuffer is free buffer will not be released immediately. Buffer will be moved to
18*4882a593Smuzhiyununused list for later reuse. There is a good reason for doing so. When video
19*4882a593Smuzhiyunresolution comes to 4K the buffer size will be above 12M. It will take a long
20*4882a593Smuzhiyuntime to allocate buffer and generate map table for it. So reusing the buffer
21*4882a593Smuzhiyunwill save the allocate/free time.
22*4882a593Smuzhiyun
23*4882a593SmuzhiyunHere is the diagram of Mpp buffer status transaction.
24*4882a593Smuzhiyun
25*4882a593Smuzhiyun            +----------+     +---------+
26*4882a593Smuzhiyun            |  create  |     |  commit |
27*4882a593Smuzhiyun            +-----+----+     +----+----+
28*4882a593Smuzhiyun                  |               |
29*4882a593Smuzhiyun                  |               |
30*4882a593Smuzhiyun                  |          +----v----+
31*4882a593Smuzhiyun                  +----------+ unused  <-----------+
32*4882a593Smuzhiyun                  |          +---------+           |
33*4882a593Smuzhiyun                  |          |         |           |
34*4882a593Smuzhiyun                  |          |         |           |
35*4882a593Smuzhiyun            +-----v----+     |         |     +-----+----+
36*4882a593Smuzhiyun            |  malloc  |     |         |     |   free   |
37*4882a593Smuzhiyun            +----------+     |         |     +----------+
38*4882a593Smuzhiyun            | inc_ref  |     +---------+     |  dec_ref |
39*4882a593Smuzhiyun            +-----+----+                     +-----^----+
40*4882a593Smuzhiyun                  |                                |
41*4882a593Smuzhiyun                  |                                |
42*4882a593Smuzhiyun                  |          +---------+           |
43*4882a593Smuzhiyun                  +---------->  used   +-----------+
44*4882a593Smuzhiyun                             +---------+
45*4882a593Smuzhiyun                             |         |
46*4882a593Smuzhiyun                             |         |
47*4882a593Smuzhiyun                             |         |
48*4882a593Smuzhiyun                             |         |
49*4882a593Smuzhiyun                             |         |
50*4882a593Smuzhiyun                             +----^----+
51*4882a593Smuzhiyun                                  |
52*4882a593Smuzhiyun                                  |
53*4882a593Smuzhiyun                             +----+----+
54*4882a593Smuzhiyun                             | import  |
55*4882a593Smuzhiyun                             +---------+
56*4882a593Smuzhiyun
57*4882a593Smuzhiyun
58