xref: /OK3568_Linux_fs/external/rknpu2/examples/rknn_yolov5_demo/utils/mpp_encoder.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 #ifndef __MPP_ENCODER_H__
2 #define __MPP_ENCODER_H__
3 
4 #include "rockchip/mpp_frame.h"
5 #include "rockchip/rk_mpi.h"
6 #include <pthread.h>
7 #include <string.h>
8 
9 typedef void (*MppEncoderFrameCallback)(void* userdata, const char* data, int size);
10 
11 typedef struct
12 {
13     RK_U32 width;
14     RK_U32 height;
15     RK_U32 hor_stride;
16     RK_U32 ver_stride;
17     MppFrameFormat fmt;
18     MppCodingType type;
19 
20     RK_U32 osd_enable;
21     RK_U32 osd_mode;
22     RK_U32 split_mode;
23     RK_U32 split_arg;
24     RK_U32 split_out;
25 
26     RK_U32 user_data_enable;
27     RK_U32 roi_enable;
28 
29     // rate control runtime parameter
30     RK_S32 fps_in_flex;
31     RK_S32 fps_in_den;
32     RK_S32 fps_in_num;
33     RK_S32 fps_out_flex;
34     RK_S32 fps_out_den;
35     RK_S32 fps_out_num;
36     RK_S32 bps;
37     RK_S32 bps_max;
38     RK_S32 bps_min;
39     RK_S32 rc_mode;
40     RK_S32 gop_mode;
41     RK_S32 gop_len;
42     RK_S32 vi_len;
43 
44     /* general qp control */
45     RK_S32 qp_init;
46     RK_S32 qp_max;
47     RK_S32 qp_max_i;
48     RK_S32 qp_min;
49     RK_S32 qp_min_i;
50     RK_S32 qp_max_step; /* delta qp between each two P frame */
51     RK_S32 qp_delta_ip; /* delta qp between I and P */
52     RK_S32 qp_delta_vi; /* delta qp between vi and P */
53 
54     RK_U32 constraint_set;
55     RK_U32 rotation;
56     RK_U32 mirroring;
57     RK_U32 flip;
58 
59     MppEncHeaderMode header_mode;
60     MppEncSeiMode sei_mode;
61 } MppEncoderParams;
62 
63 class MppEncoder {
64   public:
65     MppEncoder();
66     ~MppEncoder();
67     int Init(MppEncoderParams& params, void* userdata);
68     int SetCallback(MppEncoderFrameCallback callback);
69     int Encode(void* mpp_buf, char* enc_buf, int max_size);
70     int GetHeader(char* enc_buf, int max_size);
71     int Reset();
72     void* ImportBuffer(int index, size_t size, int fd, int type);
73     size_t GetFrameSize();
74     void* GetInputFrameBuffer();
75     int GetInputFrameBufferFd(void* mpp_buffer);
76     void* GetInputFrameBufferAddr(void* mpp_buffer);
77   private:
78     int InitParams(MppEncoderParams& params);
79     int SetupEncCfg();
80 
81     MppCtx mpp_ctx = NULL;
82     MppApi* mpp_mpi = NULL;
83     RK_S32 chn = 0;
84 
85     MppEncoderFrameCallback callback = NULL;
86 
87     // global flow control flag
88     // RK_U32 frm_eos = 0;
89     // RK_U32 pkt_eos = 0;
90     // RK_U32 frm_pkt_cnt = 0;
91     // RK_S32 frame_num = 0;
92     // RK_S32 frame_count = 0;
93     // RK_U64 stream_size = 0;
94 
95     /* encoder config set */
96     MppEncCfg cfg = NULL;
97     MppEncPrepCfg prep_cfg;
98     MppEncRcCfg rc_cfg;
99     MppEncCodecCfg codec_cfg;
100     MppEncSliceSplit split_cfg;
101     MppEncOSDPltCfg osd_plt_cfg;
102     MppEncOSDPlt osd_plt;
103     MppEncOSDData osd_data;
104     // RoiRegionCfg    roi_region;
105     MppEncROICfg roi_cfg;
106 
107     // input / output
108     MppBufferGroup buf_grp = NULL;
109     MppBuffer frm_buf = NULL;
110     MppBuffer pkt_buf = NULL;
111     MppBuffer md_info = NULL;
112 
113     // MppEncRoiCtx roi_ctx;
114 
115     // resources
116     size_t header_size;
117     size_t frame_size;
118     size_t mdinfo_size;
119     /* NOTE: packet buffer may overflow */
120     size_t packet_size;
121 
122     MppEncoderParams enc_params;
123 
124     void* userdata = NULL;
125 };
126 
127 #endif  //__MPP_ENCODER_H__
128