xref: /rockchip-linux_mpp/utils/mpi_dec_utils.h (revision 437bfbeb9567cca9cd9080e3f6954aa9d6a94f18)
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