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