201 lines
7.7 KiB
C
201 lines
7.7 KiB
C
|
#ifdef __cplusplus
|
|||
|
extern "C" {
|
|||
|
#endif
|
|||
|
|
|||
|
#ifndef __TEXT_ENC_API_H__
|
|||
|
#define __TEXT_ENC_API_H__
|
|||
|
|
|||
|
|
|||
|
#define TEXTENC_PACKET_SIZE (0x10+sizeof(RMCINFO)) //(0xc0 + sizeof(GSENSOR_t)*60 + 2)
|
|||
|
//#define TEXTBUF_FIFO_LEVEL 10 // fifo length for input text buffer in 10s
|
|||
|
#define TEXTENC_PACKET_CNT 10 // enced OutFrame buf count for 10s
|
|||
|
|
|||
|
/* fifo length for input text data */
|
|||
|
#define FIFO_GPS_LEVEL 10 // cache cnt in 10s
|
|||
|
#define FIFO_GSENSOR_LEVEL 100 // bigger than gsensor_rate(video_fps=25/30/60)
|
|||
|
#define FIFO_ADAS_LEVEL 100 // bigger than adas_rate(video_fps=25/30/60)
|
|||
|
|
|||
|
/* input type which enter into TextSrc_Comp and text encoder */
|
|||
|
typedef enum __text_enc_input_type {
|
|||
|
TEXTENC_INPUT_TYPE_GPS = 0,
|
|||
|
TEXTENC_INPUT_TYPE_GSENSOR = 1,
|
|||
|
TEXTENC_INPUT_TYPE_ADAS = 2,
|
|||
|
TEXTENC_INPUT_TYPE_DRIVER_ID = 3,
|
|||
|
} __text_enc_input_type;
|
|||
|
|
|||
|
/* decide which type can be packed */
|
|||
|
#define TEXTENC_PACK_TYPE_GPS (1<<0)
|
|||
|
#define TEXTENC_PACK_TYPE_GSENSOR (1<<1)
|
|||
|
#define TEXTENC_PACK_TYPE_ADAS (1<<2)
|
|||
|
#define TEXTENC_PACK_TYPE_DRIVER_ID (1<<3)
|
|||
|
|
|||
|
|
|||
|
typedef struct gps_info_s
|
|||
|
{
|
|||
|
char IQVer[16];
|
|||
|
char IQBuildDate[16];
|
|||
|
unsigned int Hour; //gps信息里输出的小时
|
|||
|
unsigned int Minute; //gps信息里输出的分
|
|||
|
unsigned int Second; //gps信息里输出的秒
|
|||
|
unsigned int Year; //gps信息里输出的年
|
|||
|
unsigned int Month; //gps信息里输出的月
|
|||
|
unsigned int Day; //gps信息里输出的天
|
|||
|
|
|||
|
char Status; //gps信息里输出的状态
|
|||
|
char NSInd; //gps信息里输出的NSInd
|
|||
|
char EWInd; //gps信息里输出的EWInd
|
|||
|
char reserved; //gps信息里输出的reserved
|
|||
|
|
|||
|
double Latitude; //gps信息里输出的纬度,注意这是double型
|
|||
|
double Longitude; //gps信息里输出的经度,注意这是double型
|
|||
|
float Speed; //gps信息里输出的速度
|
|||
|
float Angle; //gps信息里输出的方向
|
|||
|
|
|||
|
char ID[20]; //这个ID是固化在每个相机设备的主控里的,一旦烧录就不永远不会变,每台设备的ID是不一样的。
|
|||
|
|
|||
|
unsigned int GsensorX; //gps信息里输出的重力加速X
|
|||
|
unsigned int GsensorY; //gps信息里输出的重力加速Y
|
|||
|
unsigned int GsensorZ; //gps信息里输出的重力加速Z
|
|||
|
|
|||
|
unsigned int MHour; //主控的时间小时 ,这个主要是用于显示在app上的相机当前时间,与gps时间不一样
|
|||
|
unsigned int MMinute; //主控的时间分,这个主要是用于显示在app上的相机当前时间,与gps时间不一样
|
|||
|
unsigned int MSecond; //主控的时间秒,这个主要是用于显示在app上的相机当前时间,与gps时间不一样
|
|||
|
unsigned int MYear; //主控的时间年,这个主要是用于显示在app上的相机当前时间,与gps时间不一样
|
|||
|
unsigned int MMonth; //主控的时间月,这个主要是用于显示在app上的相机当前时间,与gps时间不一样
|
|||
|
unsigned int MDay; //主控的时间天,这个主要是用于显示在app上的相机当前时间,与gps时间不一样
|
|||
|
}RMCINFO;
|
|||
|
|
|||
|
typedef struct GPS_t {
|
|||
|
char lat_dir; // latitude
|
|||
|
char lat_val[9];
|
|||
|
char long_dir; // longitude
|
|||
|
char long_val[10];
|
|||
|
char speed[5];
|
|||
|
} GPS_t;
|
|||
|
|
|||
|
typedef struct GSENSOR_t {
|
|||
|
float xa;
|
|||
|
float ya;
|
|||
|
float za;
|
|||
|
float ra; // for acc_sensor, it's redundant, buf for other_sensor, this may useful
|
|||
|
} GSENSOR_t;
|
|||
|
|
|||
|
typedef struct ADAS_t {
|
|||
|
int x;
|
|||
|
int y;
|
|||
|
} ADAS_t;
|
|||
|
|
|||
|
typedef struct DRIVER_ID_t {
|
|||
|
char driver_id[16]; // DRIVER_ID_LEN + 2
|
|||
|
} DRIVER_ID_t;
|
|||
|
|
|||
|
|
|||
|
typedef enum TEXT_ENCODER_TYPE
|
|||
|
{
|
|||
|
TEXT_ENCODER_GGAD,
|
|||
|
} TEXT_ENCODER_TYPE;
|
|||
|
|
|||
|
// ref to TEXTINFO_t
|
|||
|
typedef struct __text_enc_info_t {
|
|||
|
int enc_type_enable_flag; // bit0-gps; bit1-gsensor; bit2-adas; bit3-driver_id
|
|||
|
int text_enc_type; // CODEC_ID_GGAD
|
|||
|
int video_frame_rate;
|
|||
|
int gsensor_rate;
|
|||
|
int adas_rate; // n: one adas data for n video-frames
|
|||
|
} __text_enc_info_t;
|
|||
|
|
|||
|
typedef enum __text_enc_result_t {
|
|||
|
ERR_TEXT_ENC_UNKNOWN = -1,
|
|||
|
ERR_TEXT_ENC_NONE = 0, // encode successed, no error
|
|||
|
ERR_TEXT_ENC_TIME_NOT_REACH = 1, // 1s has not come
|
|||
|
|
|||
|
// input
|
|||
|
ERR_TEXT_ENC_INPUT_UNDERFLOW = 2, // input data not prepared, shoud 0.1s, then encode by force
|
|||
|
|
|||
|
// output
|
|||
|
ERR_TEXT_ENC_OUTFRM_UNDERFLOW = 3, // rid reach wid which means out_buf_packet_cnt == TEXTENC_PACKET_CNT
|
|||
|
} __text_enc_result_t;
|
|||
|
|
|||
|
|
|||
|
typedef struct EncPacket_tag
|
|||
|
{
|
|||
|
char out_data[TEXTENC_PACKET_SIZE];
|
|||
|
int buf_id;
|
|||
|
long long pts; //unit:us
|
|||
|
} EncPacket_t;
|
|||
|
|
|||
|
typedef struct OutFrameManager_tag
|
|||
|
{
|
|||
|
int total_packet_cnt; // enc packet count till now, keep increase for one file.
|
|||
|
|
|||
|
EncPacket_t out_pkt[TEXTENC_PACKET_CNT];
|
|||
|
int write_id;
|
|||
|
int read_id;
|
|||
|
int buf_used; // release cnt by ReleaseTextEncBuf, when it's full, InBuf cache text, NOT encode!
|
|||
|
int prefetch_cnt; // request cnt by RequestTextEncBuf
|
|||
|
} OutFrameManager_t;
|
|||
|
|
|||
|
|
|||
|
typedef struct TextPacket_tag // TextSrc_Comp's output to TextEnc_Comp's input port with this data struct
|
|||
|
{
|
|||
|
RMCINFO gps_data;
|
|||
|
// GPS_t gps_data;
|
|||
|
GSENSOR_t gsensor_data[FIFO_GSENSOR_LEVEL];
|
|||
|
ADAS_t adas_data[FIFO_ADAS_LEVEL];
|
|||
|
DRIVER_ID_t driver_id_data;
|
|||
|
long long pts; //unit:us
|
|||
|
} TextPacket_t;
|
|||
|
|
|||
|
typedef struct InFrameManager_tag
|
|||
|
{
|
|||
|
TextPacket_t in_pkt[TEXTENC_PACKET_CNT];
|
|||
|
volatile int write_id;
|
|||
|
volatile int read_id;
|
|||
|
volatile int buf_used;
|
|||
|
} InFrameManager_t;
|
|||
|
|
|||
|
typedef struct TextEncDataManager {
|
|||
|
__text_enc_info_t info;
|
|||
|
|
|||
|
// use fifo or var to manage input frame
|
|||
|
pthread_mutex_t in_buf_lock;
|
|||
|
InFrameManager_t in_buf_mgr;
|
|||
|
|
|||
|
long long base_pts;
|
|||
|
long long cur_pts;
|
|||
|
long long pts;
|
|||
|
|
|||
|
// use fifo to manage output frame
|
|||
|
pthread_mutex_t out_buf_lock;
|
|||
|
OutFrameManager_t out_buf_mgr;
|
|||
|
|
|||
|
int mForceEncodeFlag;
|
|||
|
} TextEncDataManager;
|
|||
|
|
|||
|
|
|||
|
typedef struct TEXTENCCONTENT_t {
|
|||
|
void *priv_data;
|
|||
|
|
|||
|
int (*ClearDataMgr)(void *handle); // clear data in TextEncDataManager after RecordDone -> NOT use
|
|||
|
int (*ShowTextEncMgrData)(void *handle); // for debug
|
|||
|
int (*ShowInFrameData)(void *handle); // for debug
|
|||
|
int (*ShowOutFrameData)(void *handle, int cur_rid, int pkt_pos); // for debug
|
|||
|
int (*RequestWriteBuf)(void *handle, void *pInbuf, int size, int64_t pts); // src_out_port -> enc_in_port
|
|||
|
int (*TextEncodePro)(void *handle); // enc_in_port -> enc_out_port
|
|||
|
int (*GetValidEncPktCnt)(void *handle); // packet cnt in fifo which need be sent to RecRender_Comp
|
|||
|
int (*GetEmptyOutFrameCnt)(void *handle); // out_buf_packet_unused = 0, OUTPUTUNDERFLOW
|
|||
|
int (*GetValidInputPktCnt)(void *handle); // when EncodePro failed with INPUTUNDERFLOW, check InBuf size
|
|||
|
int (*RequestTextEncBuf)(void *handle, void ** pOutbuf, unsigned int * outSize, long long * timeStamp, int* pbuf_id); // enc_out_port -> recrender_in_port
|
|||
|
int (*ReturnTextEncBuf)(void *handle, void* pOutbuf, unsigned int outSize, long long timeStamp, int nbuf_id); // enc_out_port <- recrender_in_port
|
|||
|
int (*ReleaseTextEncBuf)(void *handle, void* pOutbuf, unsigned int outSize, long long timeStamp, int nbuf_id); // enc_out_port <- recrender_in_port
|
|||
|
} TEXTENCCONTENT_t;
|
|||
|
|
|||
|
TEXTENCCONTENT_t *TextEncInit(__text_enc_info_t *pTEncInfo);
|
|||
|
void TextEncExit(void *handle);
|
|||
|
|
|||
|
#endif // TEXT_ENC_API_H
|
|||
|
|
|||
|
#ifdef __cplusplus
|
|||
|
}
|
|||
|
#endif
|