201 lines
7.7 KiB
C
Executable File
201 lines
7.7 KiB
C
Executable File
#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
|