预分配文件类型:

预分配文件类型:

  1. 视频 (连续文件)
  2. 图片,音频 (独立文件)
  3. 报警事件,用户日志,系统日志 (独立文件,但是小size,若同2一种索引会浪费空间)
  4. 串口数据 (暂不明确)
  5. GPS数据 (固定格式)

对应保存在磁盘中的文件名为:

  1. CR00000x.mp4 - VIndex0x.bin
  2. CR00000x.pio - PIndex0x.bin
  3. CR00000x.log - LIndex0x.bin
  4. CR00000x.srl - SIndex0x.bin
  5. 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 函数从内存中顺序读取一张图片的数据,读取后,该张图片的内存被释放。

阅读更多:   杂谈
添加新评论

icon_redface.gificon_idea.gificon_cool.gif2016kuk.gificon_mrgreen.gif2016shuai.gif2016tp.gif2016db.gif2016ch.gificon_razz.gif2016zj.gificon_sad.gificon_cry.gif2016zhh.gificon_question.gif2016jk.gif2016bs.gificon_lol.gif2016qiao.gificon_surprised.gif2016fendou.gif2016ll.gif