generated from zhangwei/Matrixai
			
		
			
				
	
	
		
			228 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			228 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			C++
		
	
	
	
| 
 | |
| #ifndef _H2645ENCODER_H__
 | |
| #define _H2645ENCODER_H__ 
 | |
| 
 | |
| #include <fstream>
 | |
| #include <stdint.h>
 | |
| #include <semaphore.h>
 | |
| #include <iostream>
 | |
| #include <linux/videodev2.h>
 | |
| #include <malloc.h>
 | |
| #include <sstream>
 | |
| #include <string.h>
 | |
| #include <fcntl.h>
 | |
| #include <poll.h>
 | |
| 
 | |
| #include "NvVideoEncoder.h"
 | |
| #include "nvbuf_utils.h"
 | |
| #include "nvosd.h"
 | |
| #include "NvUtils.h"
 | |
| 
 | |
| #include "FF_CircleQueue.h"
 | |
| #include "VCCommon.h"
 | |
| 
 | |
| 
 | |
| using namespace std;
 | |
| 
 | |
| #define CRC32_POLYNOMIAL  0xEDB88320L
 | |
| #define MAX_OUT_BUFFERS 32
 | |
| 
 | |
| typedef struct CrcRec
 | |
| {
 | |
|     unsigned int CRCTable[256];
 | |
|     unsigned int CrcValue;
 | |
| }Crc;
 | |
| 
 | |
| typedef struct
 | |
| {
 | |
|     NvVideoEncoder *enc;
 | |
|     uint32_t encoder_pixfmt;
 | |
|     uint32_t raw_pixfmt;
 | |
| 
 | |
|     char *in_file_path;
 | |
|     std::ifstream *in_file;
 | |
| 
 | |
|     uint32_t width;
 | |
|     uint32_t height;
 | |
| 
 | |
|     char *out_file_path;
 | |
|     std::ofstream *out_file;
 | |
| 
 | |
|     char *ROI_Param_file_path;
 | |
|     char *Recon_Ref_file_path;
 | |
|     char *RPS_Param_file_path;
 | |
|     char *hints_Param_file_path;
 | |
|     char *GDR_Param_file_path;
 | |
|     char *GDR_out_file_path;
 | |
|     std::ifstream *roi_Param_file;
 | |
|     std::ifstream *recon_Ref_file;
 | |
|     std::ifstream *rps_Param_file;
 | |
|     std::ifstream *hints_Param_file;
 | |
|     std::ifstream *gdr_Param_file;
 | |
|     std::ofstream *gdr_out_file;
 | |
| 
 | |
|     uint32_t bitrate;
 | |
|     uint32_t peak_bitrate;
 | |
|     uint32_t profile;
 | |
|     enum v4l2_mpeg_video_bitrate_mode ratecontrol;
 | |
|     uint32_t iframe_interval;
 | |
|     uint32_t idr_interval;
 | |
|     uint32_t level;
 | |
|     uint32_t fps_n;
 | |
|     uint32_t fps_d;
 | |
|     uint32_t gdr_start_frame_number; /* Frame number where GDR has to be started */
 | |
|     uint32_t gdr_num_frames; /* Number of frames where GDR to be applied */
 | |
|     uint32_t gdr_out_frame_number; /* Frames number from where encoded buffers are to be dumped */
 | |
|     enum v4l2_enc_temporal_tradeoff_level_type temporal_tradeoff_level;
 | |
|     enum v4l2_enc_hw_preset_type hw_preset_type;
 | |
|     v4l2_enc_slice_length_type slice_length_type;
 | |
|     uint32_t slice_length;
 | |
|     uint32_t virtual_buffer_size;
 | |
|     uint32_t num_reference_frames;
 | |
|     uint32_t slice_intrarefresh_interval;
 | |
|     uint32_t num_b_frames;
 | |
|     uint32_t nMinQpI;              /* Minimum QP value to use for index frames */
 | |
|     uint32_t nMaxQpI;              /* Maximum QP value to use for index frames */
 | |
|     uint32_t nMinQpP;              /* Minimum QP value to use for P frames */
 | |
|     uint32_t nMaxQpP;              /* Maximum QP value to use for P frames */
 | |
|     uint32_t nMinQpB;              /* Minimum QP value to use for B frames */
 | |
|     uint32_t nMaxQpB;              /* Maximum QP value to use for B frames */
 | |
|     uint32_t sMaxQp;               /* Session Maximum QP value */
 | |
|     int output_plane_fd[32];
 | |
|     bool insert_sps_pps_at_idr;
 | |
|     bool enable_slice_level_encode;
 | |
|     bool disable_cabac;
 | |
|     bool insert_vui;
 | |
|     bool enable_extended_colorformat;
 | |
|     bool insert_aud;
 | |
|     bool alliframes;
 | |
|     enum v4l2_memory output_memory_type;
 | |
|     enum v4l2_colorspace cs;
 | |
| 
 | |
|     bool report_metadata;
 | |
|     bool input_metadata;
 | |
|     bool copy_timestamp;
 | |
|     uint32_t start_ts;
 | |
|     bool dump_mv;
 | |
|     bool externalRPS;
 | |
|     bool enableGDR;
 | |
|     bool bGapsInFrameNumAllowed;
 | |
|     bool bnoIframe;
 | |
|     uint32_t nH264FrameNumBits;
 | |
|     uint32_t nH265PocLsbBits;
 | |
|     bool externalRCHints;
 | |
|     bool enableROI;
 | |
|     bool b_use_enc_cmd;
 | |
|     bool enableLossless;
 | |
|     bool got_eos;
 | |
| 
 | |
|     bool use_gold_crc;
 | |
|     char gold_crc[20];
 | |
|     Crc *pBitStreamCrc;
 | |
| 
 | |
|     bool bReconCrc;
 | |
|     uint32_t rl;                   /* Reconstructed surface Left cordinate */
 | |
|     uint32_t rt;                   /* Reconstructed surface Top cordinate */
 | |
|     uint32_t rw;                   /* Reconstructed surface width */
 | |
|     uint32_t rh;                   /* Reconstructed surface height */
 | |
| 
 | |
|     uint64_t timestamp;
 | |
|     uint64_t timestampincr;
 | |
| 
 | |
|     bool stats;
 | |
| 
 | |
|     std::stringstream *runtime_params_str;
 | |
|     uint32_t next_param_change_frame;
 | |
|     bool got_error;
 | |
|     int  stress_test;
 | |
|     uint32_t endofstream_capture;
 | |
|     uint32_t endofstream_output;
 | |
| 
 | |
|     uint32_t input_frames_queued_count;
 | |
|     uint32_t startf;
 | |
|     uint32_t endf;
 | |
|     uint32_t num_output_buffers;
 | |
|     int32_t num_frames_to_encode;
 | |
|     uint32_t poc_type;
 | |
| 
 | |
|     int max_perf;
 | |
|     int blocking_mode; //Set if running in blocking mode
 | |
|     sem_t pollthread_sema; // Polling thread waits on this to be signalled to issue Poll
 | |
|     sem_t encoderthread_sema; // Encoder thread waits on this to be signalled to continue q/dq loop
 | |
|     pthread_t   enc_pollthread; // Polling thread, created if running in non-blocking mode.
 | |
|     pthread_t enc_capture_loop; // Encoder capture thread
 | |
| 
 | |
|     pthread_t encode_thread; // Current thread, encoding stream
 | |
| 
 | |
|     void *g_this;
 | |
|     void *nvosd_context;
 | |
|     vector<NvOSD_RectParams> rectParams;
 | |
| } h2645enc_context_t;
 | |
| 
 | |
| class H2645Encoder
 | |
| {
 | |
| public:
 | |
|     H2645Encoder(FF_CircleQueue<VideoQBuffer*>* _InBufQueue, FF_CircleQueue<VideoQBuffer*>* _outBufQueue);
 | |
|     ~H2645Encoder();
 | |
| 
 | |
|     /** @brief 初始化 */
 | |
|     // int InitEncode(int chn, int width, int height);  //use libVideoCodec.so
 | |
|     int InitEncode(int chn, int width, int height, uint32_t bitrate = 4);   //libVideoCodecV2.so
 | |
| 
 | |
| 
 | |
|     /** @brief 启动编码通道 */
 | |
|     int RunEncoderChn(int chn);
 | |
|     
 | |
| private:
 | |
|     
 | |
|     //void set_defaults(h2645enc_context_t ** ctx);
 | |
|     void abort(h2645enc_context_t *ctx);
 | |
|     Crc* InitCrc(unsigned int CrcPolynomial);
 | |
|     void CalculateCrc(Crc *phCrc, unsigned char *buffer, uint32_t count);
 | |
|     void CloseCrc(Crc **phCrc);
 | |
|     int write_encoder_output_frame (ofstream * stream, NvBuffer * buffer);
 | |
|     static bool encoder_capture_plane_dq_callback(struct v4l2_buffer *v4l2_buf, NvBuffer * buffer,
 | |
|                                   NvBuffer * shared_buffer, void *arg);
 | |
|     int get_next_parsed_pair(h2645enc_context_t *ctx, char *id, uint32_t *value);
 | |
|     int set_runtime_params(h2645enc_context_t *ctx);
 | |
|     int get_next_runtime_param_change_frame(h2645enc_context_t *ctx);
 | |
|     void populate_roi_Param(std::ifstream * stream, v4l2_enc_frame_ROI_params *VEnc_ROI_params);
 | |
|     void populate_ext_rps_ctrl_Param (std::ifstream * stream, v4l2_enc_frame_ext_rps_ctrl_params *VEnc_ext_rps_ctrl_params);
 | |
|     int setup_output_dmabuf(h2645enc_context_t *ctx, uint32_t num_buffers );
 | |
|     void populate_ext_rate_ctrl_Param(std::ifstream * stream, v4l2_enc_frame_ext_rate_ctrl_params *VEnc_ext_rate_ctrl_params);
 | |
|     void populate_gdr_Param(std::ifstream * stream, uint32_t *start_frame_num, uint32_t *gdr_num_frames);
 | |
|     static void* encoder_pollthread_fcn(void *arg);
 | |
|     int encoder_proc_nonblocking(h2645enc_context_t &ctx, bool eos);
 | |
|     int encoder_proc_blocking(h2645enc_context_t &ctx, bool eos);
 | |
|     static void* encode_proc(void *p_ctx);
 | |
|     int set_defaults(int chn, int width, int height, uint32_t bitrate = 2);
 | |
|     int write_encoder_output_frame_to_queue (NvBuffer * buffer);
 | |
|     int read_video_frame_from_queue(NvBuffer & buffer);
 | |
| 
 | |
| 
 | |
|     FF_CircleQueue<VideoQBuffer*>* ff_InBufQueue;
 | |
|     FF_CircleQueue<VideoQBuffer*>* ff_outBufQueue;
 | |
| 
 | |
|     bool m_StopProcBlocking;
 | |
| 
 | |
|     h2645enc_context_t *m_H2645Enc_Ctx;
 | |
|     FILE *pfile  = NULL;
 | |
| 
 | |
| public:
 | |
| #define TEST_ERROR(cond, str, label) if(cond) { \
 | |
|                                         cerr << str << endl; \
 | |
|                                         error = 1; \
 | |
|                                         goto label; }
 | |
| 
 | |
| #define TEST_PARSE_ERROR(cond, label) if(cond) { \
 | |
|     cerr << "Error parsing runtime parameter changes string" << endl; \
 | |
|     goto label; }
 | |
| 
 | |
| #define IS_DIGIT(c) (c >= '0' && c <= '9')
 | |
| #define MICROSECOND_UNIT 1000000
 | |
| 
 | |
| };
 | |
| 
 | |
| #endif //_H2645ENCODER_H__
 | |
| 
 |