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