13d0407baSopenharmony_ci/* 23d0407baSopenharmony_ci * Copyright 2015 Rockchip Electronics Co. LTD 33d0407baSopenharmony_ci * 43d0407baSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 53d0407baSopenharmony_ci * you may not use this file except in compliance with the License. 63d0407baSopenharmony_ci * You may obtain a copy of the License at 73d0407baSopenharmony_ci * 83d0407baSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 93d0407baSopenharmony_ci * 103d0407baSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 113d0407baSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 123d0407baSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133d0407baSopenharmony_ci * See the License for the specific language governing permissions and 143d0407baSopenharmony_ci * limitations under the License. 153d0407baSopenharmony_ci */ 163d0407baSopenharmony_ci 173d0407baSopenharmony_ci#ifndef __MPP_TASK_H__ 183d0407baSopenharmony_ci#define __MPP_TASK_H__ 193d0407baSopenharmony_ci 203d0407baSopenharmony_ci#include "mpp_meta.h" 213d0407baSopenharmony_ci 223d0407baSopenharmony_ci/* 233d0407baSopenharmony_ci * Advanced task flow 243d0407baSopenharmony_ci * Advanced task flow introduces three concepts: port, task and item 253d0407baSopenharmony_ci * 263d0407baSopenharmony_ci * Port is from OpenMAX 273d0407baSopenharmony_ci * Port has two type: input port and output port which are all for data transaction. 283d0407baSopenharmony_ci * Port work like a queue. task will be dequeue from or enqueue to one port. 293d0407baSopenharmony_ci * On input side user will dequeue task from input port, setup task and enqueue task 303d0407baSopenharmony_ci * back to input port. 313d0407baSopenharmony_ci * On output side user will dequeue task from output port, get the information from 323d0407baSopenharmony_ci * and then enqueue task back to output port. 333d0407baSopenharmony_ci * 343d0407baSopenharmony_ci * Task indicates one transaction on the port. 353d0407baSopenharmony_ci * Task has two working mode: async mode and sync mode 363d0407baSopenharmony_ci * If mpp is work in sync mode on task enqueue function return the task has been done 373d0407baSopenharmony_ci * If mpp is work in async mode on task enqueue function return the task is just put 383d0407baSopenharmony_ci * on the task queue for process. 393d0407baSopenharmony_ci * Task can carry different items. Task just like a container of items 403d0407baSopenharmony_ci * 413d0407baSopenharmony_ci * Item indicates MppPacket or MppFrame which is contained in one task 423d0407baSopenharmony_ci */ 433d0407baSopenharmony_ci 443d0407baSopenharmony_ci/* 453d0407baSopenharmony_ci * One mpp task queue has two ports: input and output 463d0407baSopenharmony_ci * 473d0407baSopenharmony_ci * The whole picture is: 483d0407baSopenharmony_ci * Top layer mpp has two ports: mpp_input_port and mpp_output_port 493d0407baSopenharmony_ci * But internally these two ports belongs to two task queue. 503d0407baSopenharmony_ci * The mpp_input_port is the mpp_input_task_queue's input port. 513d0407baSopenharmony_ci * The mpp_output_port is the mpp_output_task_queue's output port. 523d0407baSopenharmony_ci * 533d0407baSopenharmony_ci * Each port uses its task queue to communication 543d0407baSopenharmony_ci */ 553d0407baSopenharmony_citypedef enum { 563d0407baSopenharmony_ci MPP_PORT_INPUT, 573d0407baSopenharmony_ci MPP_PORT_OUTPUT, 583d0407baSopenharmony_ci MPP_PORT_BUTT, 593d0407baSopenharmony_ci} MppPortType; 603d0407baSopenharmony_ci 613d0407baSopenharmony_ci/* 623d0407baSopenharmony_ci * Advance task work flow mode: 633d0407baSopenharmony_ci ****************************************************************************** 643d0407baSopenharmony_ci * 1. async mode (default_val) 653d0407baSopenharmony_ci * 663d0407baSopenharmony_ci * mpp_init(type, coding, MPP_WORK_ASYNC) 673d0407baSopenharmony_ci * 683d0407baSopenharmony_ci * input thread 693d0407baSopenharmony_ci * a - poll(input) 703d0407baSopenharmony_ci * b - dequeue(input, *task) 713d0407baSopenharmony_ci * c - task_set_item(packet/frame) 723d0407baSopenharmony_ci * d - enqueue(input, task) // when enqueue return the task is not done yet 733d0407baSopenharmony_ci * 743d0407baSopenharmony_ci * output thread 753d0407baSopenharmony_ci * a - poll(output) 763d0407baSopenharmony_ci * b - dequeue(output, *task) 773d0407baSopenharmony_ci * c - task_get_item(frame/packet) 783d0407baSopenharmony_ci * d - enqueue(output, task) 793d0407baSopenharmony_ci ****************************************************************************** 803d0407baSopenharmony_ci * 2. sync mode 813d0407baSopenharmony_ci * 823d0407baSopenharmony_ci * mpp_init(type, coding, MPP_WORK_SYNC) 833d0407baSopenharmony_ci * 843d0407baSopenharmony_ci * a - poll(input) 853d0407baSopenharmony_ci * b - dequeue(input, *task) 863d0407baSopenharmony_ci * c - task_set_item(packet/frame) 873d0407baSopenharmony_ci * d - enqueue(task) // when enqueue return the task is finished 883d0407baSopenharmony_ci ****************************************************************************** 893d0407baSopenharmony_ci */ 903d0407baSopenharmony_citypedef enum { 913d0407baSopenharmony_ci MPP_TASK_ASYNC, 923d0407baSopenharmony_ci MPP_TASK_SYNC, 933d0407baSopenharmony_ci MPP_TASK_WORK_MODE_BUTT, 943d0407baSopenharmony_ci} MppTaskWorkMode; 953d0407baSopenharmony_ci 963d0407baSopenharmony_ci/* 973d0407baSopenharmony_ci * Mpp port poll type 983d0407baSopenharmony_ci * 993d0407baSopenharmony_ci * MPP_POLL_BLOCK - for block poll 1003d0407baSopenharmony_ci * MPP_POLL_NON_BLOCK - for non-block poll 1013d0407baSopenharmony_ci * small than MPP_POLL_MAX - for poll with timeout in ms 1023d0407baSopenharmony_ci * small than MPP_POLL_BUTT or larger than MPP_POLL_MAX is invalid value 1033d0407baSopenharmony_ci */ 1043d0407baSopenharmony_citypedef enum { 1053d0407baSopenharmony_ci MPP_POLL_BUTT = -2, 1063d0407baSopenharmony_ci MPP_POLL_BLOCK = -1, 1073d0407baSopenharmony_ci MPP_POLL_NON_BLOCK = 0, 1083d0407baSopenharmony_ci MPP_POLL_MAX = 8000, 1093d0407baSopenharmony_ci} MppPollType; 1103d0407baSopenharmony_ci 1113d0407baSopenharmony_ci/* 1123d0407baSopenharmony_ci * Mpp timeout define 1133d0407baSopenharmony_ci * MPP_TIMEOUT_BLOCK - for block poll 1143d0407baSopenharmony_ci * MPP_TIMEOUT_NON_BLOCK - for non-block poll 1153d0407baSopenharmony_ci * small than MPP_TIMEOUT_MAX - for poll with timeout in ms 1163d0407baSopenharmony_ci * small than MPP_TIMEOUT_BUTT or larger than MPP_TIMEOUT_MAX is invalid value 1173d0407baSopenharmony_ci */ 1183d0407baSopenharmony_ci#define MPP_TIMEOUT_BUTT (-2L) 1193d0407baSopenharmony_ci#define MPP_TIMEOUT_BLOCK (-1L) 1203d0407baSopenharmony_ci#define MPP_TIMEOUT_NON_BLOCK (0L) 1213d0407baSopenharmony_ci#define MPP_TIMEOUT_MAX (8000L) 1223d0407baSopenharmony_ci 1233d0407baSopenharmony_ci/* 1243d0407baSopenharmony_ci * MppTask is descriptor of a task which send to mpp for process 1253d0407baSopenharmony_ci * mpp can support different type of work mode, for example: 1263d0407baSopenharmony_ci * 1273d0407baSopenharmony_ci * decoder: 1283d0407baSopenharmony_ci * 1293d0407baSopenharmony_ci * 1. typical decoder mode: 1303d0407baSopenharmony_ci * input - MppPacket (normal cpu buffer, need cpu copy) 1313d0407baSopenharmony_ci * output - MppFrame (ion/drm buffer in external/internal mode) 1323d0407baSopenharmony_ci * 2. secure decoder mode: 1333d0407baSopenharmony_ci * input - MppPacket (externel ion/drm buffer, cpu can not access) 1343d0407baSopenharmony_ci * output - MppFrame (ion/drm buffer in external/internal mode, cpu can not access) 1353d0407baSopenharmony_ci * 1363d0407baSopenharmony_ci * interface usage: 1373d0407baSopenharmony_ci * 1383d0407baSopenharmony_ci * typical flow 1393d0407baSopenharmony_ci * input side: 1403d0407baSopenharmony_ci * task_dequeue(ctx, PORT_INPUT, &task); 1413d0407baSopenharmony_ci * task_put_item(task, MODE_INPUT, packet) 1423d0407baSopenharmony_ci * task_enqueue(ctx, PORT_INPUT, task); 1433d0407baSopenharmony_ci * output side: 1443d0407baSopenharmony_ci * task_dequeue(ctx, PORT_OUTPUT, &task); 1453d0407baSopenharmony_ci * task_get_item(task, MODE_OUTPUT, &frame) 1463d0407baSopenharmony_ci * task_enqueue(ctx, PORT_OUTPUT, task); 1473d0407baSopenharmony_ci * 1483d0407baSopenharmony_ci * secure flow 1493d0407baSopenharmony_ci * input side: 1503d0407baSopenharmony_ci * task_dequeue(ctx, PORT_INPUT, &task); 1513d0407baSopenharmony_ci * task_put_item(task, MODE_INPUT, packet) 1523d0407baSopenharmony_ci * task_put_item(task, MODE_OUTPUT, frame) // buffer will be specified here 1533d0407baSopenharmony_ci * task_enqueue(ctx, PORT_INPUT, task); 1543d0407baSopenharmony_ci * output side: 1553d0407baSopenharmony_ci * task_dequeue(ctx, PORT_OUTPUT, &task); 1563d0407baSopenharmony_ci * task_get_item(task, MODE_OUTPUT, &frame) 1573d0407baSopenharmony_ci * task_enqueue(ctx, PORT_OUTPUT, task); 1583d0407baSopenharmony_ci * 1593d0407baSopenharmony_ci * encoder: 1603d0407baSopenharmony_ci * 1613d0407baSopenharmony_ci * 1. typical encoder mode: 1623d0407baSopenharmony_ci * input - MppFrame (ion/drm buffer in external mode) 1633d0407baSopenharmony_ci * output - MppPacket (normal cpu buffer, need cpu copy) 1643d0407baSopenharmony_ci * 2. user input encoder mode: 1653d0407baSopenharmony_ci * input - MppFrame (normal cpu buffer, need to build hardware table for this buffer) 1663d0407baSopenharmony_ci * output - MppPacket (normal cpu buffer, need cpu copy) 1673d0407baSopenharmony_ci * 3. secure encoder mode: 1683d0407baSopenharmony_ci * input - MppFrame (ion/drm buffer in external mode, cpu can not access) 1693d0407baSopenharmony_ci * output - MppPacket (externel ion/drm buffer, cpu can not access) 1703d0407baSopenharmony_ci * 1713d0407baSopenharmony_ci * typical / user input flow 1723d0407baSopenharmony_ci * input side: 1733d0407baSopenharmony_ci * task_dequeue(ctx, PORT_INPUT, &task); 1743d0407baSopenharmony_ci * task_put_item(task, MODE_INPUT, frame) 1753d0407baSopenharmony_ci * task_enqueue(ctx, PORT_INPUT, task); 1763d0407baSopenharmony_ci * output side: 1773d0407baSopenharmony_ci * task_dequeue(ctx, PORT_OUTPUT, &task); 1783d0407baSopenharmony_ci * task_get_item(task, MODE_OUTPUT, &packet) 1793d0407baSopenharmony_ci * task_enqueue(ctx, PORT_OUTPUT, task); 1803d0407baSopenharmony_ci * 1813d0407baSopenharmony_ci * secure flow 1823d0407baSopenharmony_ci * input side: 1833d0407baSopenharmony_ci * task_dequeue(ctx, PORT_INPUT, &task); 1843d0407baSopenharmony_ci * task_put_item(task, MODE_OUTPUT, packet) // buffer will be specified here 1853d0407baSopenharmony_ci * task_put_item(task, MODE_INPUT, frame) 1863d0407baSopenharmony_ci * task_enqueue(ctx, PORT_INPUT, task); 1873d0407baSopenharmony_ci * output side: 1883d0407baSopenharmony_ci * task_dequeue(ctx, PORT_OUTPUT, &task); 1893d0407baSopenharmony_ci * task_get_item(task, MODE_OUTPUT, &packet) 1903d0407baSopenharmony_ci * task_get_item(task, MODE_OUTPUT, &frame) 1913d0407baSopenharmony_ci * task_enqueue(ctx, PORT_OUTPUT, task); 1923d0407baSopenharmony_ci * 1933d0407baSopenharmony_ci * NOTE: this flow can specify the output frame. User will setup both intput frame and output packet 1943d0407baSopenharmony_ci * buffer at the input side. Then at output side when user gets a finished task user can get the output 1953d0407baSopenharmony_ci * packet and corresponding released input frame. 1963d0407baSopenharmony_ci * 1973d0407baSopenharmony_ci * image processing 1983d0407baSopenharmony_ci * 1993d0407baSopenharmony_ci * 1. typical image process mode: 2003d0407baSopenharmony_ci * input - MppFrame (ion/drm buffer in external mode) 2013d0407baSopenharmony_ci * output - MppFrame (ion/drm buffer in external mode) 2023d0407baSopenharmony_ci * 2033d0407baSopenharmony_ci * typical / user input flow 2043d0407baSopenharmony_ci * input side: 2053d0407baSopenharmony_ci * task_dequeue(ctx, PORT_INPUT, &task); 2063d0407baSopenharmony_ci * task_put_item(task, MODE_INPUT, frame) 2073d0407baSopenharmony_ci * task_enqueue(ctx, PORT_INPUT, task); 2083d0407baSopenharmony_ci * output side: 2093d0407baSopenharmony_ci * task_dequeue(ctx, PORT_OUTPUT, &task); 2103d0407baSopenharmony_ci * task_get_item(task, MODE_OUTPUT, &frame) 2113d0407baSopenharmony_ci * task_enqueue(ctx, PORT_OUTPUT, task); 2123d0407baSopenharmony_ci */ 2133d0407baSopenharmony_ci/* NOTE: use index rather then handle to descripbe task */ 2143d0407baSopenharmony_ci 2153d0407baSopenharmony_ci#ifdef __cplusplus 2163d0407baSopenharmony_ciextern "C" { 2173d0407baSopenharmony_ci#endif 2183d0407baSopenharmony_ci 2193d0407baSopenharmony_ciMPP_RET mpp_task_meta_set_s32(MppTask task, MppMetaKey key, RK_S32 val); 2203d0407baSopenharmony_ciMPP_RET mpp_task_meta_set_s64(MppTask task, MppMetaKey key, RK_S64 val); 2213d0407baSopenharmony_ciMPP_RET mpp_task_meta_set_ptr(MppTask task, MppMetaKey key, void *val); 2223d0407baSopenharmony_ciMPP_RET mpp_task_meta_set_frame (MppTask task, MppMetaKey key, MppFrame frame); 2233d0407baSopenharmony_ciMPP_RET mpp_task_meta_set_packet(MppTask task, MppMetaKey key, MppPacket packet); 2243d0407baSopenharmony_ciMPP_RET mpp_task_meta_set_buffer(MppTask task, MppMetaKey key, MppBuffer buffer); 2253d0407baSopenharmony_ci 2263d0407baSopenharmony_ciMPP_RET mpp_task_meta_get_s32(MppTask task, MppMetaKey key, RK_S32 *val, RK_S32 default_val); 2273d0407baSopenharmony_ciMPP_RET mpp_task_meta_get_s64(MppTask task, MppMetaKey key, RK_S64 *val, RK_S64 default_val); 2283d0407baSopenharmony_ciMPP_RET mpp_task_meta_get_ptr(MppTask task, MppMetaKey key, void **val, void *default_val); 2293d0407baSopenharmony_ciMPP_RET mpp_task_meta_get_frame (MppTask task, MppMetaKey key, MppFrame *frame); 2303d0407baSopenharmony_ciMPP_RET mpp_task_meta_get_packet(MppTask task, MppMetaKey key, MppPacket *packet); 2313d0407baSopenharmony_ciMPP_RET mpp_task_meta_get_buffer(MppTask task, MppMetaKey key, MppBuffer *buffer); 2323d0407baSopenharmony_ci 2333d0407baSopenharmony_ci#ifdef __cplusplus 2343d0407baSopenharmony_ci} 2353d0407baSopenharmony_ci#endif 2363d0407baSopenharmony_ci 2373d0407baSopenharmony_ci#endif /*__MPP_QUEUE_H__*/ 238