1*437bfbebSnyanmisaka /* 2*437bfbebSnyanmisaka * Copyright 2015 Rockchip Electronics Co. LTD 3*437bfbebSnyanmisaka * 4*437bfbebSnyanmisaka * Licensed under the Apache License, Version 2.0 (the "License"); 5*437bfbebSnyanmisaka * you may not use this file except in compliance with the License. 6*437bfbebSnyanmisaka * You may obtain a copy of the License at 7*437bfbebSnyanmisaka * 8*437bfbebSnyanmisaka * http://www.apache.org/licenses/LICENSE-2.0 9*437bfbebSnyanmisaka * 10*437bfbebSnyanmisaka * Unless required by applicable law or agreed to in writing, software 11*437bfbebSnyanmisaka * distributed under the License is distributed on an "AS IS" BASIS, 12*437bfbebSnyanmisaka * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*437bfbebSnyanmisaka * See the License for the specific language governing permissions and 14*437bfbebSnyanmisaka * limitations under the License. 15*437bfbebSnyanmisaka */ 16*437bfbebSnyanmisaka 17*437bfbebSnyanmisaka #ifndef __MPP_TASK_H__ 18*437bfbebSnyanmisaka #define __MPP_TASK_H__ 19*437bfbebSnyanmisaka 20*437bfbebSnyanmisaka #include "mpp_meta.h" 21*437bfbebSnyanmisaka 22*437bfbebSnyanmisaka /* 23*437bfbebSnyanmisaka * Advanced task flow 24*437bfbebSnyanmisaka * Advanced task flow introduces three concepts: port, task and item 25*437bfbebSnyanmisaka * 26*437bfbebSnyanmisaka * Port is from OpenMAX 27*437bfbebSnyanmisaka * Port has two type: input port and output port which are all for data transaction. 28*437bfbebSnyanmisaka * Port work like a queue. task will be dequeue from or enqueue to one port. 29*437bfbebSnyanmisaka * On input side user will dequeue task from input port, setup task and enqueue task 30*437bfbebSnyanmisaka * back to input port. 31*437bfbebSnyanmisaka * On output side user will dequeue task from output port, get the information from 32*437bfbebSnyanmisaka * and then enqueue task back to output port. 33*437bfbebSnyanmisaka * 34*437bfbebSnyanmisaka * Task indicates one transaction on the port. 35*437bfbebSnyanmisaka * Task has two working mode: async mode and sync mode 36*437bfbebSnyanmisaka * If mpp is work in sync mode on task enqueue function return the task has been done 37*437bfbebSnyanmisaka * If mpp is work in async mode on task enqueue function return the task is just put 38*437bfbebSnyanmisaka * on the task queue for process. 39*437bfbebSnyanmisaka * Task can carry different items. Task just like a container of items 40*437bfbebSnyanmisaka * 41*437bfbebSnyanmisaka * Item indicates MppPacket or MppFrame which is contained in one task 42*437bfbebSnyanmisaka */ 43*437bfbebSnyanmisaka 44*437bfbebSnyanmisaka /* 45*437bfbebSnyanmisaka * One mpp task queue has two ports: input and output 46*437bfbebSnyanmisaka * 47*437bfbebSnyanmisaka * The whole picture is: 48*437bfbebSnyanmisaka * Top layer mpp has two ports: mpp_input_port and mpp_output_port 49*437bfbebSnyanmisaka * But internally these two ports belongs to two task queue. 50*437bfbebSnyanmisaka * The mpp_input_port is the mpp_input_task_queue's input port. 51*437bfbebSnyanmisaka * The mpp_output_port is the mpp_output_task_queue's output port. 52*437bfbebSnyanmisaka * 53*437bfbebSnyanmisaka * Each port uses its task queue to communication 54*437bfbebSnyanmisaka */ 55*437bfbebSnyanmisaka typedef enum { 56*437bfbebSnyanmisaka MPP_PORT_INPUT, 57*437bfbebSnyanmisaka MPP_PORT_OUTPUT, 58*437bfbebSnyanmisaka MPP_PORT_BUTT, 59*437bfbebSnyanmisaka } MppPortType; 60*437bfbebSnyanmisaka 61*437bfbebSnyanmisaka /* 62*437bfbebSnyanmisaka * Advance task work flow mode: 63*437bfbebSnyanmisaka ****************************************************************************** 64*437bfbebSnyanmisaka * 1. async mode (default_val) 65*437bfbebSnyanmisaka * 66*437bfbebSnyanmisaka * mpp_init(type, coding, MPP_WORK_ASYNC) 67*437bfbebSnyanmisaka * 68*437bfbebSnyanmisaka * input thread 69*437bfbebSnyanmisaka * a - poll(input) 70*437bfbebSnyanmisaka * b - dequeue(input, *task) 71*437bfbebSnyanmisaka * c - task_set_item(packet/frame) 72*437bfbebSnyanmisaka * d - enqueue(input, task) // when enqueue return the task is not done yet 73*437bfbebSnyanmisaka * 74*437bfbebSnyanmisaka * output thread 75*437bfbebSnyanmisaka * a - poll(output) 76*437bfbebSnyanmisaka * b - dequeue(output, *task) 77*437bfbebSnyanmisaka * c - task_get_item(frame/packet) 78*437bfbebSnyanmisaka * d - enqueue(output, task) 79*437bfbebSnyanmisaka ****************************************************************************** 80*437bfbebSnyanmisaka * 2. sync mode 81*437bfbebSnyanmisaka * 82*437bfbebSnyanmisaka * mpp_init(type, coding, MPP_WORK_SYNC) 83*437bfbebSnyanmisaka * 84*437bfbebSnyanmisaka * a - poll(input) 85*437bfbebSnyanmisaka * b - dequeue(input, *task) 86*437bfbebSnyanmisaka * c - task_set_item(packet/frame) 87*437bfbebSnyanmisaka * d - enqueue(task) // when enqueue return the task is finished 88*437bfbebSnyanmisaka ****************************************************************************** 89*437bfbebSnyanmisaka */ 90*437bfbebSnyanmisaka typedef enum { 91*437bfbebSnyanmisaka MPP_TASK_ASYNC, 92*437bfbebSnyanmisaka MPP_TASK_SYNC, 93*437bfbebSnyanmisaka MPP_TASK_WORK_MODE_BUTT, 94*437bfbebSnyanmisaka } MppTaskWorkMode; 95*437bfbebSnyanmisaka 96*437bfbebSnyanmisaka /* 97*437bfbebSnyanmisaka * Mpp port poll type 98*437bfbebSnyanmisaka * 99*437bfbebSnyanmisaka * MPP_POLL_BLOCK - for block poll 100*437bfbebSnyanmisaka * MPP_POLL_NON_BLOCK - for non-block poll 101*437bfbebSnyanmisaka * small than MPP_POLL_MAX - for poll with timeout in ms 102*437bfbebSnyanmisaka * small than MPP_POLL_BUTT or larger than MPP_POLL_MAX is invalid value 103*437bfbebSnyanmisaka */ 104*437bfbebSnyanmisaka typedef enum { 105*437bfbebSnyanmisaka MPP_POLL_BUTT = -2, 106*437bfbebSnyanmisaka MPP_POLL_BLOCK = -1, 107*437bfbebSnyanmisaka MPP_POLL_NON_BLOCK = 0, 108*437bfbebSnyanmisaka MPP_POLL_MAX = 8000, 109*437bfbebSnyanmisaka } MppPollType; 110*437bfbebSnyanmisaka 111*437bfbebSnyanmisaka /* 112*437bfbebSnyanmisaka * Mpp timeout define 113*437bfbebSnyanmisaka * MPP_TIMEOUT_BLOCK - for block poll 114*437bfbebSnyanmisaka * MPP_TIMEOUT_NON_BLOCK - for non-block poll 115*437bfbebSnyanmisaka * small than MPP_TIMEOUT_MAX - for poll with timeout in ms 116*437bfbebSnyanmisaka * small than MPP_TIMEOUT_BUTT or larger than MPP_TIMEOUT_MAX is invalid value 117*437bfbebSnyanmisaka */ 118*437bfbebSnyanmisaka #define MPP_TIMEOUT_BUTT (-2L) 119*437bfbebSnyanmisaka #define MPP_TIMEOUT_BLOCK (-1L) 120*437bfbebSnyanmisaka #define MPP_TIMEOUT_NON_BLOCK (0L) 121*437bfbebSnyanmisaka #define MPP_TIMEOUT_MAX (8000L) 122*437bfbebSnyanmisaka 123*437bfbebSnyanmisaka /* 124*437bfbebSnyanmisaka * MppTask is descriptor of a task which send to mpp for process 125*437bfbebSnyanmisaka * mpp can support different type of work mode, for example: 126*437bfbebSnyanmisaka * 127*437bfbebSnyanmisaka * decoder: 128*437bfbebSnyanmisaka * 129*437bfbebSnyanmisaka * 1. typical decoder mode: 130*437bfbebSnyanmisaka * input - MppPacket (normal cpu buffer, need cpu copy) 131*437bfbebSnyanmisaka * output - MppFrame (ion/drm buffer in external/internal mode) 132*437bfbebSnyanmisaka * 2. secure decoder mode: 133*437bfbebSnyanmisaka * input - MppPacket (externel ion/drm buffer, cpu can not access) 134*437bfbebSnyanmisaka * output - MppFrame (ion/drm buffer in external/internal mode, cpu can not access) 135*437bfbebSnyanmisaka * 136*437bfbebSnyanmisaka * interface usage: 137*437bfbebSnyanmisaka * 138*437bfbebSnyanmisaka * typical flow 139*437bfbebSnyanmisaka * input side: 140*437bfbebSnyanmisaka * task_dequeue(ctx, PORT_INPUT, &task); 141*437bfbebSnyanmisaka * task_put_item(task, MODE_INPUT, packet) 142*437bfbebSnyanmisaka * task_enqueue(ctx, PORT_INPUT, task); 143*437bfbebSnyanmisaka * output side: 144*437bfbebSnyanmisaka * task_dequeue(ctx, PORT_OUTPUT, &task); 145*437bfbebSnyanmisaka * task_get_item(task, MODE_OUTPUT, &frame) 146*437bfbebSnyanmisaka * task_enqueue(ctx, PORT_OUTPUT, task); 147*437bfbebSnyanmisaka * 148*437bfbebSnyanmisaka * secure flow 149*437bfbebSnyanmisaka * input side: 150*437bfbebSnyanmisaka * task_dequeue(ctx, PORT_INPUT, &task); 151*437bfbebSnyanmisaka * task_put_item(task, MODE_INPUT, packet) 152*437bfbebSnyanmisaka * task_put_item(task, MODE_OUTPUT, frame) // buffer will be specified here 153*437bfbebSnyanmisaka * task_enqueue(ctx, PORT_INPUT, task); 154*437bfbebSnyanmisaka * output side: 155*437bfbebSnyanmisaka * task_dequeue(ctx, PORT_OUTPUT, &task); 156*437bfbebSnyanmisaka * task_get_item(task, MODE_OUTPUT, &frame) 157*437bfbebSnyanmisaka * task_enqueue(ctx, PORT_OUTPUT, task); 158*437bfbebSnyanmisaka * 159*437bfbebSnyanmisaka * encoder: 160*437bfbebSnyanmisaka * 161*437bfbebSnyanmisaka * 1. typical encoder mode: 162*437bfbebSnyanmisaka * input - MppFrame (ion/drm buffer in external mode) 163*437bfbebSnyanmisaka * output - MppPacket (normal cpu buffer, need cpu copy) 164*437bfbebSnyanmisaka * 2. user input encoder mode: 165*437bfbebSnyanmisaka * input - MppFrame (normal cpu buffer, need to build hardware table for this buffer) 166*437bfbebSnyanmisaka * output - MppPacket (normal cpu buffer, need cpu copy) 167*437bfbebSnyanmisaka * 3. secure encoder mode: 168*437bfbebSnyanmisaka * input - MppFrame (ion/drm buffer in external mode, cpu can not access) 169*437bfbebSnyanmisaka * output - MppPacket (externel ion/drm buffer, cpu can not access) 170*437bfbebSnyanmisaka * 171*437bfbebSnyanmisaka * typical / user input flow 172*437bfbebSnyanmisaka * input side: 173*437bfbebSnyanmisaka * task_dequeue(ctx, PORT_INPUT, &task); 174*437bfbebSnyanmisaka * task_put_item(task, MODE_INPUT, frame) 175*437bfbebSnyanmisaka * task_enqueue(ctx, PORT_INPUT, task); 176*437bfbebSnyanmisaka * output side: 177*437bfbebSnyanmisaka * task_dequeue(ctx, PORT_OUTPUT, &task); 178*437bfbebSnyanmisaka * task_get_item(task, MODE_OUTPUT, &packet) 179*437bfbebSnyanmisaka * task_enqueue(ctx, PORT_OUTPUT, task); 180*437bfbebSnyanmisaka * 181*437bfbebSnyanmisaka * secure flow 182*437bfbebSnyanmisaka * input side: 183*437bfbebSnyanmisaka * task_dequeue(ctx, PORT_INPUT, &task); 184*437bfbebSnyanmisaka * task_put_item(task, MODE_OUTPUT, packet) // buffer will be specified here 185*437bfbebSnyanmisaka * task_put_item(task, MODE_INPUT, frame) 186*437bfbebSnyanmisaka * task_enqueue(ctx, PORT_INPUT, task); 187*437bfbebSnyanmisaka * output side: 188*437bfbebSnyanmisaka * task_dequeue(ctx, PORT_OUTPUT, &task); 189*437bfbebSnyanmisaka * task_get_item(task, MODE_OUTPUT, &packet) 190*437bfbebSnyanmisaka * task_get_item(task, MODE_OUTPUT, &frame) 191*437bfbebSnyanmisaka * task_enqueue(ctx, PORT_OUTPUT, task); 192*437bfbebSnyanmisaka * 193*437bfbebSnyanmisaka * NOTE: this flow can specify the output frame. User will setup both intput frame and output packet 194*437bfbebSnyanmisaka * buffer at the input side. Then at output side when user gets a finished task user can get the output 195*437bfbebSnyanmisaka * packet and corresponding released input frame. 196*437bfbebSnyanmisaka * 197*437bfbebSnyanmisaka * image processing 198*437bfbebSnyanmisaka * 199*437bfbebSnyanmisaka * 1. typical image process mode: 200*437bfbebSnyanmisaka * input - MppFrame (ion/drm buffer in external mode) 201*437bfbebSnyanmisaka * output - MppFrame (ion/drm buffer in external mode) 202*437bfbebSnyanmisaka * 203*437bfbebSnyanmisaka * typical / user input flow 204*437bfbebSnyanmisaka * input side: 205*437bfbebSnyanmisaka * task_dequeue(ctx, PORT_INPUT, &task); 206*437bfbebSnyanmisaka * task_put_item(task, MODE_INPUT, frame) 207*437bfbebSnyanmisaka * task_enqueue(ctx, PORT_INPUT, task); 208*437bfbebSnyanmisaka * output side: 209*437bfbebSnyanmisaka * task_dequeue(ctx, PORT_OUTPUT, &task); 210*437bfbebSnyanmisaka * task_get_item(task, MODE_OUTPUT, &frame) 211*437bfbebSnyanmisaka * task_enqueue(ctx, PORT_OUTPUT, task); 212*437bfbebSnyanmisaka */ 213*437bfbebSnyanmisaka /* NOTE: use index rather then handle to descripbe task */ 214*437bfbebSnyanmisaka 215*437bfbebSnyanmisaka #ifdef __cplusplus 216*437bfbebSnyanmisaka extern "C" { 217*437bfbebSnyanmisaka #endif 218*437bfbebSnyanmisaka 219*437bfbebSnyanmisaka MPP_RET mpp_task_meta_set_s32(MppTask task, MppMetaKey key, RK_S32 val); 220*437bfbebSnyanmisaka MPP_RET mpp_task_meta_set_s64(MppTask task, MppMetaKey key, RK_S64 val); 221*437bfbebSnyanmisaka MPP_RET mpp_task_meta_set_ptr(MppTask task, MppMetaKey key, void *val); 222*437bfbebSnyanmisaka MPP_RET mpp_task_meta_set_frame (MppTask task, MppMetaKey key, MppFrame frame); 223*437bfbebSnyanmisaka MPP_RET mpp_task_meta_set_packet(MppTask task, MppMetaKey key, MppPacket packet); 224*437bfbebSnyanmisaka MPP_RET mpp_task_meta_set_buffer(MppTask task, MppMetaKey key, MppBuffer buffer); 225*437bfbebSnyanmisaka 226*437bfbebSnyanmisaka MPP_RET mpp_task_meta_get_s32(MppTask task, MppMetaKey key, RK_S32 *val, RK_S32 default_val); 227*437bfbebSnyanmisaka MPP_RET mpp_task_meta_get_s64(MppTask task, MppMetaKey key, RK_S64 *val, RK_S64 default_val); 228*437bfbebSnyanmisaka MPP_RET mpp_task_meta_get_ptr(MppTask task, MppMetaKey key, void **val, void *default_val); 229*437bfbebSnyanmisaka MPP_RET mpp_task_meta_get_frame (MppTask task, MppMetaKey key, MppFrame *frame); 230*437bfbebSnyanmisaka MPP_RET mpp_task_meta_get_packet(MppTask task, MppMetaKey key, MppPacket *packet); 231*437bfbebSnyanmisaka MPP_RET mpp_task_meta_get_buffer(MppTask task, MppMetaKey key, MppBuffer *buffer); 232*437bfbebSnyanmisaka 233*437bfbebSnyanmisaka #ifdef __cplusplus 234*437bfbebSnyanmisaka } 235*437bfbebSnyanmisaka #endif 236*437bfbebSnyanmisaka 237*437bfbebSnyanmisaka #endif /*__MPP_QUEUE_H__*/ 238