VCarContainer/tools/jetson_multimedia/include/video_codec/JpegDecode.h

88 lines
2.2 KiB
C++

#ifndef _JPEG_DECODE_H__
#define _JPEG_DECODE_H__
#include <fstream>
#include <queue>
#include <pthread.h>
#include "NvJpegDecoder.h"
#include "NvVideoConverter.h"
#include "FF_CircleQueue.h"
#include "VCCommon.h"
#define NUM_FILE_DECODE 10
typedef struct
{
NvVideoConverter *conv;
NvJPEGDecoder *jpegdec;
char *in_file_path[NUM_FILE_DECODE];
std::ifstream * in_file[NUM_FILE_DECODE];
uint64_t in_file_size;
unsigned char *in_buffer;
char *out_file_path[NUM_FILE_DECODE];
std::ofstream * out_file[NUM_FILE_DECODE];
int out_fd;
bool got_error;
bool use_fd;
bool perf;
int stress_test;
int num_files;
int current_file;
void* g_this;
pthread_t decode_thread; // Current thread, decoding stream.
uint32_t video_height;
uint32_t video_width;
uint32_t thread_num;
}jepg_context_t;
class JpegDecode
{
public:
JpegDecode(FF_CircleQueue<VideoQBuffer*>* _InBufQueue, FF_CircleQueue<VideoQBuffer*>* _outBufQueue);
~JpegDecode();
/**
* @brief 初始化通道
*/
int InitJpegDecode(int chn, uint32_t inWidth = 1920, uint32_t inHeight = 1080);
/** @brief 启动解码通道idx */
int RunJpegDecoderChn(int chn);
private:
void abort(jepg_context_t * ctx);
static bool conv_capture_dqbuf_thread_callback(struct v4l2_buffer *v4l2_buf,
NvBuffer * buffer, NvBuffer * shared_buffer, void *arg);
uint64_t get_file_size(ifstream * stream);
static void* jpeg_decode_proc(void *pctx);
int set_defaults(int chn, uint32_t inWidth, uint32_t inHeight);
int read_input_data_from_queue(uint32_t ch_num, unsigned char* inbuffer);
int write_video_frame_to_queue(int chn, NvBuffer &buffer);
private:
FF_CircleQueue<VideoQBuffer*>* ff_InBufQueue;
FF_CircleQueue<VideoQBuffer*>* ff_outBufQueue;
bool m_StopProcBlocking;
jepg_context_t m_JpegDec_Ctx;
FILE *pfile = NULL;
#define JPEG_TEST_ERROR(cond, str, label) if(cond) { \
cerr << str << endl; \
error = 1; \
goto label; }
};
#endif //_JPEG_DECODE_H__