MPP task design (2017.4.7)
|
================================================================================
|
|
Mpp task is the contain component for transaction with external user in advanced
|
mode. The target of advanced mode is to provide flexible, multiple input/output
|
content for extension.
|
|
Mpp task has mpp_meta as the rich content carrier. Mpp meta uses KEY and value
|
pair for extension. One task can carries multiple data into or out of mpp.
|
The typical case is encoder with OSD and motion detection. One task may contain
|
OSD buffer, motion detection buffer, frame buffer and stream buffer as input and
|
output stream buffer and motion detection buffer with data. And this case can
|
also be used on decoder if decoder wants to output some side information.
|
|
|
Mpp task transaction
|
================================================================================
|
|
1. Mpp task queue
|
Mpp task queue is the manager of tasks. Due to user may incorrectly use the task
|
we choose the design that hold all task inside mpp. Task queue will create and
|
release task. But task queue will not interact with user directly. We use port
|
and task status to control the transaction.
|
|
2. Mpp port
|
Mpp port is the transaction interface of task queue. External user and internal
|
worker thread will use mpp_port_poll / mpp_port_dequeue / mpp_port_enqueue
|
interface to poll / dequeue / enqueue the task task queue. Mpp advanced mode is
|
using port to connect external user, interface storage and internal process
|
thread. Each task queue has two port: input port and output port. And from a
|
global view the task will always flow from input port to output port.
|
|
3. Mpp task status
|
There are four status for one task. Mpp use list_head to represent the status.
|
|
INPUT_PORT : Initial status for input port user to dequeue. Or when output port
|
successfully enqueue a task then the task is on this status.
|
|
INPUT_HOLD : When input port user successfully dequeue a task then the task is
|
on this status.
|
|
OUTPUT_PORT: When input port user successfully enqueue a task then the task is
|
on OUTPUT_PORT status. And this task is ready for dequeue from
|
output port.
|
|
OUTPUT_HOLD: When output port user successfully dequeue a task then the task is
|
on this status.
|
|
4. Mpp task / port transaction
|
There are three transaction functions on a port: poll / dequeue / enqueue.
|
When port user call the transaction function task will be transfer from one
|
status to next status. The status transform flow is unidirectional from input
|
port to output port.
|
|
The overall relationship graph of task / port / status is shown below.
|
|
1. task queue
|
+------------------------------+
|
| |
|
+----+----+ +--------------+ +----+----+
|
| 4 | | 3 | | 2.1 |
|
+--------+ dequeue <--+ status <--+ enqueue <---------+
|
| | | | INPUT_PORT | | | |
|
| +---------+ | | +---------+ |
|
+------v-----+ | | +--------------+ | | +------+------+
|
| 3 | | 2 | | 2 | | 3 |
|
| status | | input | | output | | status |
|
| INPUT_HOLD | | port | | port | | OUTPUT_HOLD |
|
| | | | | | | |
|
+------+-----+ | | +--------------+ | | +------^------+
|
| +---------+ | 3 | +---------+ |
|
| | 4 | | status | | 2.1 | |
|
+--------> enqueue +--> INPUT_PORT +--> dequeue +---------+
|
| | | | | |
|
+----+----+ +--------------+ -----+----+
|
| |
|
+------------------------------+
|
|
|
Mpp task transaction of a complete work flow
|
================================================================================
|
|
On advanced mode mpp uses two task queue: input task queue and output task
|
queue.
|
Input task queue connects input side external user to internal worker thread.
|
Output task queue connects internal worker thread to output side external user.
|
Then there will be three threads to parallelize internal process and external
|
transation. This will maximize mpp efficiency.
|
|
The work flow is demonstrated as below graph.
|
|
+-------------------+ +-------------------+
|
| input side user | | output side user |
|
+----^---------+----+ +----^---------+----+
|
| | | |
|
+----+----+----v----+ +----+----+----v----+
|
| dequeue | enqueue | | dequeue | enqueue |
|
+----^----+----+----+ +----^----+----+----+
|
| | | |
|
+----+---------+----+ MPP +----+---------v----+
|
+---+ input port +-----------+ output port +---+
|
| +-------------------+ +-------------------+ |
|
| | input task queue | | output task queue | |
|
| +-------------------+ +-------------------+ |
|
| | output port | | input port | |
|
| +----+---------^----+ +----+---------^----+ |
|
| | | | | |
|
| +----v----+----+----+ +----v----+----+----+ |
|
| | dequeue | enqueue | | dequeue | enqueue | |
|
| +----+----+----^----+ +----+----+----^----+ |
|
| | | | | |
|
| +----v---------+---------------------v---------+----+ |
|
| | internal work thread | |
|
| +---------------------------------------------------+ |
|
| |
|
+-----------------------------------------------------------+
|