1*437bfbebSnyanmisaka /* 2*437bfbebSnyanmisaka * Copyright 2020 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 __MPI_DEC_UTILS_H__ 18*437bfbebSnyanmisaka #define __MPI_DEC_UTILS_H__ 19*437bfbebSnyanmisaka 20*437bfbebSnyanmisaka #include <stdio.h> 21*437bfbebSnyanmisaka #include "utils.h" 22*437bfbebSnyanmisaka 23*437bfbebSnyanmisaka #define MAX_FILE_NAME_LENGTH 256 24*437bfbebSnyanmisaka #define MPI_DEC_STREAM_SIZE (SZ_4K) 25*437bfbebSnyanmisaka #define MPI_DEC_LOOP_COUNT 4 26*437bfbebSnyanmisaka 27*437bfbebSnyanmisaka /* 28*437bfbebSnyanmisaka * NOTE: We can choose decoder's buffer mode here. 29*437bfbebSnyanmisaka * There are three mode that decoder can support: 30*437bfbebSnyanmisaka * 31*437bfbebSnyanmisaka * Mode 1: Pure internal mode 32*437bfbebSnyanmisaka * In the mode user will NOT call MPP_DEC_SET_EXT_BUF_GROUP 33*437bfbebSnyanmisaka * control to decoder. Only call MPP_DEC_SET_INFO_CHANGE_READY 34*437bfbebSnyanmisaka * to let decoder go on. Then decoder will use create buffer 35*437bfbebSnyanmisaka * internally and user need to release each frame they get. 36*437bfbebSnyanmisaka * 37*437bfbebSnyanmisaka * Advantage: 38*437bfbebSnyanmisaka * Easy to use and get a demo quickly 39*437bfbebSnyanmisaka * Disadvantage: 40*437bfbebSnyanmisaka * 1. The buffer from decoder may not be return before 41*437bfbebSnyanmisaka * decoder is close. So memroy leak or crash may happen. 42*437bfbebSnyanmisaka * 2. The decoder memory usage can not be control. Decoder 43*437bfbebSnyanmisaka * is on a free-to-run status and consume all memory it can 44*437bfbebSnyanmisaka * get. 45*437bfbebSnyanmisaka * 3. Difficult to implement zero-copy display path. 46*437bfbebSnyanmisaka * 47*437bfbebSnyanmisaka * Mode 2: Half internal mode 48*437bfbebSnyanmisaka * This is the mode current test code using. User need to 49*437bfbebSnyanmisaka * create MppBufferGroup according to the returned info 50*437bfbebSnyanmisaka * change MppFrame. User can use mpp_buffer_group_limit_config 51*437bfbebSnyanmisaka * function to limit decoder memory usage. 52*437bfbebSnyanmisaka * 53*437bfbebSnyanmisaka * Advantage: 54*437bfbebSnyanmisaka * 1. Easy to use 55*437bfbebSnyanmisaka * 2. User can release MppBufferGroup after decoder is closed. 56*437bfbebSnyanmisaka * So memory can stay longer safely. 57*437bfbebSnyanmisaka * 3. Can limit the memory usage by mpp_buffer_group_limit_config 58*437bfbebSnyanmisaka * Disadvantage: 59*437bfbebSnyanmisaka * 1. The buffer limitation is still not accurate. Memory usage 60*437bfbebSnyanmisaka * is 100% fixed. 61*437bfbebSnyanmisaka * 2. Also difficult to implement zero-copy display path. 62*437bfbebSnyanmisaka * 63*437bfbebSnyanmisaka * Mode 3: Pure external mode 64*437bfbebSnyanmisaka * In this mode use need to create empty MppBufferGroup and 65*437bfbebSnyanmisaka * import memory from external allocator by file handle. 66*437bfbebSnyanmisaka * On Android surfaceflinger will create buffer. Then 67*437bfbebSnyanmisaka * mediaserver get the file handle from surfaceflinger and 68*437bfbebSnyanmisaka * commit to decoder's MppBufferGroup. 69*437bfbebSnyanmisaka * 70*437bfbebSnyanmisaka * Advantage: 71*437bfbebSnyanmisaka * 1. Most efficient way for zero-copy display 72*437bfbebSnyanmisaka * Disadvantage: 73*437bfbebSnyanmisaka * 1. Difficult to learn and use. 74*437bfbebSnyanmisaka * 2. Player work flow may limit this usage. 75*437bfbebSnyanmisaka * 3. May need a external parser to get the correct buffer 76*437bfbebSnyanmisaka * size for the external allocator. 77*437bfbebSnyanmisaka * 78*437bfbebSnyanmisaka * The required buffer size caculation: 79*437bfbebSnyanmisaka * hor_stride * ver_stride * 3 / 2 for pixel data 80*437bfbebSnyanmisaka * hor_stride * ver_stride / 2 for extra info 81*437bfbebSnyanmisaka * Total hor_stride * ver_stride * 2 will be enough. 82*437bfbebSnyanmisaka * 83*437bfbebSnyanmisaka * For H.264/H.265 20+ buffers will be enough. 84*437bfbebSnyanmisaka * For other codec 10 buffers will be enough. 85*437bfbebSnyanmisaka */ 86*437bfbebSnyanmisaka typedef enum MppDecBufMode_e { 87*437bfbebSnyanmisaka MPP_DEC_BUF_HALF_INT, 88*437bfbebSnyanmisaka MPP_DEC_BUF_INTERNAL, 89*437bfbebSnyanmisaka MPP_DEC_BUF_EXTERNAL, 90*437bfbebSnyanmisaka MPP_DEC_BUF_MODE_BUTT, 91*437bfbebSnyanmisaka } MppDecBufMode; 92*437bfbebSnyanmisaka 93*437bfbebSnyanmisaka typedef void* FileReader; 94*437bfbebSnyanmisaka typedef void* DecBufMgr; 95*437bfbebSnyanmisaka 96*437bfbebSnyanmisaka typedef struct FileBufSlot_t { 97*437bfbebSnyanmisaka RK_S32 index; 98*437bfbebSnyanmisaka MppBuffer buf; 99*437bfbebSnyanmisaka size_t size; 100*437bfbebSnyanmisaka RK_U32 eos; 101*437bfbebSnyanmisaka char *data; 102*437bfbebSnyanmisaka } FileBufSlot; 103*437bfbebSnyanmisaka 104*437bfbebSnyanmisaka /* For overall configure setup */ 105*437bfbebSnyanmisaka typedef struct MpiDecTestCmd_t { 106*437bfbebSnyanmisaka char file_input[MAX_FILE_NAME_LENGTH]; 107*437bfbebSnyanmisaka char file_output[MAX_FILE_NAME_LENGTH]; 108*437bfbebSnyanmisaka 109*437bfbebSnyanmisaka MppCodingType type; 110*437bfbebSnyanmisaka MppFrameFormat format; 111*437bfbebSnyanmisaka RK_U32 width; 112*437bfbebSnyanmisaka RK_U32 height; 113*437bfbebSnyanmisaka 114*437bfbebSnyanmisaka RK_U32 have_input; 115*437bfbebSnyanmisaka RK_U32 have_output; 116*437bfbebSnyanmisaka 117*437bfbebSnyanmisaka RK_U32 simple; 118*437bfbebSnyanmisaka RK_S32 timeout; 119*437bfbebSnyanmisaka RK_S32 frame_num; 120*437bfbebSnyanmisaka size_t pkt_size; 121*437bfbebSnyanmisaka MppDecBufMode buf_mode; 122*437bfbebSnyanmisaka 123*437bfbebSnyanmisaka /* use for mpi_dec_multi_test */ 124*437bfbebSnyanmisaka RK_S32 nthreads; 125*437bfbebSnyanmisaka // report information 126*437bfbebSnyanmisaka size_t max_usage; 127*437bfbebSnyanmisaka 128*437bfbebSnyanmisaka /* data for share */ 129*437bfbebSnyanmisaka FileReader reader; 130*437bfbebSnyanmisaka FpsCalc fps; 131*437bfbebSnyanmisaka 132*437bfbebSnyanmisaka /* runtime log flag */ 133*437bfbebSnyanmisaka RK_U32 quiet; 134*437bfbebSnyanmisaka RK_U32 trace_fps; 135*437bfbebSnyanmisaka char *file_slt; 136*437bfbebSnyanmisaka } MpiDecTestCmd; 137*437bfbebSnyanmisaka 138*437bfbebSnyanmisaka RK_S32 mpi_dec_test_cmd_init(MpiDecTestCmd* cmd, int argc, char **argv); 139*437bfbebSnyanmisaka RK_S32 mpi_dec_test_cmd_deinit(MpiDecTestCmd* cmd); 140*437bfbebSnyanmisaka void mpi_dec_test_cmd_options(MpiDecTestCmd* cmd); 141*437bfbebSnyanmisaka 142*437bfbebSnyanmisaka void reader_init(FileReader* reader, char* file_in, MppCodingType type); 143*437bfbebSnyanmisaka void reader_deinit(FileReader reader); 144*437bfbebSnyanmisaka 145*437bfbebSnyanmisaka void reader_start(FileReader reader); 146*437bfbebSnyanmisaka void reader_sync(FileReader reader); 147*437bfbebSnyanmisaka void reader_stop(FileReader reader); 148*437bfbebSnyanmisaka 149*437bfbebSnyanmisaka size_t reader_size(FileReader reader); 150*437bfbebSnyanmisaka MPP_RET reader_read(FileReader reader, FileBufSlot **buf); 151*437bfbebSnyanmisaka MPP_RET reader_index_read(FileReader reader, RK_S32 index, FileBufSlot **buf); 152*437bfbebSnyanmisaka void reader_rewind(FileReader reader); 153*437bfbebSnyanmisaka 154*437bfbebSnyanmisaka MPP_RET dec_buf_mgr_init(DecBufMgr *mgr); 155*437bfbebSnyanmisaka void dec_buf_mgr_deinit(DecBufMgr mgr); 156*437bfbebSnyanmisaka MppBufferGroup dec_buf_mgr_setup(DecBufMgr mgr, RK_U32 size, RK_U32 count, MppDecBufMode mode); 157*437bfbebSnyanmisaka 158*437bfbebSnyanmisaka void show_dec_fps(RK_S64 total_time, RK_S64 total_count, RK_S64 last_time, RK_S64 last_count); 159*437bfbebSnyanmisaka 160*437bfbebSnyanmisaka #endif