1*437bfbebSnyanmisakaMPP task design (2017.4.7) 2*437bfbebSnyanmisaka================================================================================ 3*437bfbebSnyanmisaka 4*437bfbebSnyanmisakaMpp task is the contain component for transaction with external user in advanced 5*437bfbebSnyanmisakamode. The target of advanced mode is to provide flexible, multiple input/output 6*437bfbebSnyanmisakacontent for extension. 7*437bfbebSnyanmisaka 8*437bfbebSnyanmisakaMpp task has mpp_meta as the rich content carrier. Mpp meta uses KEY and value 9*437bfbebSnyanmisakapair for extension. One task can carries multiple data into or out of mpp. 10*437bfbebSnyanmisakaThe typical case is encoder with OSD and motion detection. One task may contain 11*437bfbebSnyanmisakaOSD buffer, motion detection buffer, frame buffer and stream buffer as input and 12*437bfbebSnyanmisakaoutput stream buffer and motion detection buffer with data. And this case can 13*437bfbebSnyanmisakaalso be used on decoder if decoder wants to output some side information. 14*437bfbebSnyanmisaka 15*437bfbebSnyanmisaka 16*437bfbebSnyanmisakaMpp task transaction 17*437bfbebSnyanmisaka================================================================================ 18*437bfbebSnyanmisaka 19*437bfbebSnyanmisaka1. Mpp task queue 20*437bfbebSnyanmisakaMpp task queue is the manager of tasks. Due to user may incorrectly use the task 21*437bfbebSnyanmisakawe choose the design that hold all task inside mpp. Task queue will create and 22*437bfbebSnyanmisakarelease task. But task queue will not interact with user directly. We use port 23*437bfbebSnyanmisakaand task status to control the transaction. 24*437bfbebSnyanmisaka 25*437bfbebSnyanmisaka2. Mpp port 26*437bfbebSnyanmisakaMpp port is the transaction interface of task queue. External user and internal 27*437bfbebSnyanmisakaworker thread will use mpp_port_poll / mpp_port_dequeue / mpp_port_enqueue 28*437bfbebSnyanmisakainterface to poll / dequeue / enqueue the task task queue. Mpp advanced mode is 29*437bfbebSnyanmisakausing port to connect external user, interface storage and internal process 30*437bfbebSnyanmisakathread. Each task queue has two port: input port and output port. And from a 31*437bfbebSnyanmisakaglobal view the task will always flow from input port to output port. 32*437bfbebSnyanmisaka 33*437bfbebSnyanmisaka3. Mpp task status 34*437bfbebSnyanmisakaThere are four status for one task. Mpp use list_head to represent the status. 35*437bfbebSnyanmisaka 36*437bfbebSnyanmisakaINPUT_PORT : Initial status for input port user to dequeue. Or when output port 37*437bfbebSnyanmisaka successfully enqueue a task then the task is on this status. 38*437bfbebSnyanmisaka 39*437bfbebSnyanmisakaINPUT_HOLD : When input port user successfully dequeue a task then the task is 40*437bfbebSnyanmisaka on this status. 41*437bfbebSnyanmisaka 42*437bfbebSnyanmisakaOUTPUT_PORT: When input port user successfully enqueue a task then the task is 43*437bfbebSnyanmisaka on OUTPUT_PORT status. And this task is ready for dequeue from 44*437bfbebSnyanmisaka output port. 45*437bfbebSnyanmisaka 46*437bfbebSnyanmisakaOUTPUT_HOLD: When output port user successfully dequeue a task then the task is 47*437bfbebSnyanmisaka on this status. 48*437bfbebSnyanmisaka 49*437bfbebSnyanmisaka4. Mpp task / port transaction 50*437bfbebSnyanmisakaThere are three transaction functions on a port: poll / dequeue / enqueue. 51*437bfbebSnyanmisakaWhen port user call the transaction function task will be transfer from one 52*437bfbebSnyanmisakastatus to next status. The status transform flow is unidirectional from input 53*437bfbebSnyanmisakaport to output port. 54*437bfbebSnyanmisaka 55*437bfbebSnyanmisakaThe overall relationship graph of task / port / status is shown below. 56*437bfbebSnyanmisaka 57*437bfbebSnyanmisaka 1. task queue 58*437bfbebSnyanmisaka +------------------------------+ 59*437bfbebSnyanmisaka | | 60*437bfbebSnyanmisaka +----+----+ +--------------+ +----+----+ 61*437bfbebSnyanmisaka | 4 | | 3 | | 2.1 | 62*437bfbebSnyanmisaka +--------+ dequeue <--+ status <--+ enqueue <---------+ 63*437bfbebSnyanmisaka | | | | INPUT_PORT | | | | 64*437bfbebSnyanmisaka | +---------+ | | +---------+ | 65*437bfbebSnyanmisaka +------v-----+ | | +--------------+ | | +------+------+ 66*437bfbebSnyanmisaka | 3 | | 2 | | 2 | | 3 | 67*437bfbebSnyanmisaka | status | | input | | output | | status | 68*437bfbebSnyanmisaka | INPUT_HOLD | | port | | port | | OUTPUT_HOLD | 69*437bfbebSnyanmisaka | | | | | | | | 70*437bfbebSnyanmisaka +------+-----+ | | +--------------+ | | +------^------+ 71*437bfbebSnyanmisaka | +---------+ | 3 | +---------+ | 72*437bfbebSnyanmisaka | | 4 | | status | | 2.1 | | 73*437bfbebSnyanmisaka +--------> enqueue +--> INPUT_PORT +--> dequeue +---------+ 74*437bfbebSnyanmisaka | | | | | | 75*437bfbebSnyanmisaka +----+----+ +--------------+ -----+----+ 76*437bfbebSnyanmisaka | | 77*437bfbebSnyanmisaka +------------------------------+ 78*437bfbebSnyanmisaka 79*437bfbebSnyanmisaka 80*437bfbebSnyanmisakaMpp task transaction of a complete work flow 81*437bfbebSnyanmisaka================================================================================ 82*437bfbebSnyanmisaka 83*437bfbebSnyanmisakaOn advanced mode mpp uses two task queue: input task queue and output task 84*437bfbebSnyanmisakaqueue. 85*437bfbebSnyanmisakaInput task queue connects input side external user to internal worker thread. 86*437bfbebSnyanmisakaOutput task queue connects internal worker thread to output side external user. 87*437bfbebSnyanmisakaThen there will be three threads to parallelize internal process and external 88*437bfbebSnyanmisakatransation. This will maximize mpp efficiency. 89*437bfbebSnyanmisaka 90*437bfbebSnyanmisakaThe work flow is demonstrated as below graph. 91*437bfbebSnyanmisaka 92*437bfbebSnyanmisaka +-------------------+ +-------------------+ 93*437bfbebSnyanmisaka | input side user | | output side user | 94*437bfbebSnyanmisaka +----^---------+----+ +----^---------+----+ 95*437bfbebSnyanmisaka | | | | 96*437bfbebSnyanmisaka +----+----+----v----+ +----+----+----v----+ 97*437bfbebSnyanmisaka | dequeue | enqueue | | dequeue | enqueue | 98*437bfbebSnyanmisaka +----^----+----+----+ +----^----+----+----+ 99*437bfbebSnyanmisaka | | | | 100*437bfbebSnyanmisaka +----+---------+----+ MPP +----+---------v----+ 101*437bfbebSnyanmisaka +---+ input port +-----------+ output port +---+ 102*437bfbebSnyanmisaka | +-------------------+ +-------------------+ | 103*437bfbebSnyanmisaka | | input task queue | | output task queue | | 104*437bfbebSnyanmisaka | +-------------------+ +-------------------+ | 105*437bfbebSnyanmisaka | | output port | | input port | | 106*437bfbebSnyanmisaka | +----+---------^----+ +----+---------^----+ | 107*437bfbebSnyanmisaka | | | | | | 108*437bfbebSnyanmisaka | +----v----+----+----+ +----v----+----+----+ | 109*437bfbebSnyanmisaka | | dequeue | enqueue | | dequeue | enqueue | | 110*437bfbebSnyanmisaka | +----+----+----^----+ +----+----+----^----+ | 111*437bfbebSnyanmisaka | | | | | | 112*437bfbebSnyanmisaka | +----v---------+---------------------v---------+----+ | 113*437bfbebSnyanmisaka | | internal work thread | | 114*437bfbebSnyanmisaka | +---------------------------------------------------+ | 115*437bfbebSnyanmisaka | | 116*437bfbebSnyanmisaka +-----------------------------------------------------------+ 117*437bfbebSnyanmisaka 118