预分配文件类型:
- 视频 (连续文件)
- 图片,音频 (独立文件)
- 报警事件,用户日志,系统日志 (独立文件,但是小size,若同2一种索引会浪费空间)
- 串口数据 (暂不明确)
- GPS数据 (固定格式)
对应保存在磁盘中的文件名为:
- CR00000x.mp4 - VIndex0x.bin
- CR00000x.pio - PIndex0x.bin
- CR00000x.log - LIndex0x.bin
- CR00000x.srl - SIndex0x.bin
- CR00000x.gps - GIndex0x.bin
类型 2 包含图片,音频两种文件,可在类型 2 的索引文件设置标志位区分,这点类型 3 类似。
需要设计 5 种不同类型的存储方案。
先完成类型 2 的文件预分配存储和读取
以图片为例。音频的存储和图片一样,只是在磁盘位置不同。
写入的函数接口:
int WritePic(__le8 chnnl, // in 通道
__le16 reason, // in 存储原因
void* picBuf, // in 要存储的数据
__le32 picBufLen, // in 存储数据的长度
__le8 flag, // in 标志位
__le32* ioContinueID // io 连续 ID
);
- 存储某一张图片时,可能一次性存完,也可能分好几次存完。
- 每当开始一个新的图片存储时,若一次性写完,标志应设置为 MPIC_FLAG_NEW_PIC_DATA。
- 若本次写不完,则需 MPIC_FLAG_NEW_PIC_DATA | MPIC_FLAG_CONTINUE_DATA 标志。
- 下一次的 continueData 如果不是最后一帧,则只需 MPIC_FLAG_CONTINUE_DATA 标志,如果是最后一帧,则需要 MPIC_FLAG_CONTINUE_DATA | MPIC_FLAG_PIC_DATA_FINISHED 标志。
如果 1 == flag & (MPIC_FLAG_NEW_PIC_DATA | MPIC_FLAG_CONTINUE_DATA)
,ioContinueID
会返回一个唯一标志,写下一帧 continueData 时,将其传入。这样是为了查询时,知道哪些 continueData 属于同一张图片。
若 0 == flag & MPIC_FLAG_CONTINUE_DATA
,则 ioContinueID
传入 0 即可。
#define MPIC_FLAG_NEW_PIC_DATA 0x01 // 新数据,并且一次就写完了
#define MPIC_FLAG_CONTINUE_DATA 0x02 // 接着之前写的数据
#define MPIC_FLAG_PIC_DATA_FINISHED 0x04 // 之前没写完,现在写完了。只有continueData,才与之搭配
#define MPIC_FLAG_RESET 0x08
查询接口:
typedef struct __MPIC_QUERY_REQUEST_INFO
{
__le32 startTime; // 起始时间
__le32 endTime; // 结束时间
__le16 expectedCnt; // 本次需要查询的期望数目,实际超过,则返回该值。不足则返回实际值。
__le16 fromPicID; // 从该 pic 文件开始开始
__le16 fromNum; // 从 fromNum 序号开始查询。
__le8 chnnl; // 通道
}MPIC_QUERY_REQUEST_INFO;
int ReleaseAllQueriedPicInfo(); // 释放所有已查到的信息
int QueryPicInfo(MPIC_QUERY_REQUEST_INFO* queryInfo, // in
__le32* outRealPicCnt, // out 实际查询到的图片数
__le16* outLastPicID, // out 结束查询时,查询到的 pic 文件ID
__le16* outLastPicSerialNum, // out 结束查询时的 序号
__le8* outIsEnd // out 是否完符合条件的图片
);
int GetOnePicBuf(void* outBuf, // out 返回的图片数据
__le32* outBufLen, // out 返回的图片数据长度
__le8* outIsEnd // out 是否获取完了
);
QueryPicInfo
函数查询到的结果存储在内存里,GetOnePicBuf
函数从内存中顺序读取一张图片的数据,读取后,该张图片的内存被释放。