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