/*****************************************************************************
* Copyright	 : Video Surveillance Telecom Co. Ltd, Shenzhen R&D Center
* Version	   : 0.0.1
*
* File Name	 : fileheaders.h
* Description   : The defination of file headers
*
* Creation:	 : Cham Li, 04/04/2007
* Modification  :
*
******************************************************************************/



#ifndef __FILEHEADERS_H__
#define __FILEHEADERS_H__



#include "ssi.h"
#include "device_info.h"
#include "table_structs.h"



#define VS_FH_MAGIC_LEN 4



// stream types

#define VS_ST_YUNLIAN  VS_STREAM_TYPE_YUNLIAN
#define VS_ST_HIK	  VS_STREAM_TYPE_HIK
#define VS_ST_TS	   VS_STREAM_TYPE_TS
#define VS_ST_DAHUA	VS_STREAM_TYPE_DAHUA
#define VS_ST_TPSEE	VS_STREAM_TYPE_TPSEE

#define MAX_VIDEO_AUDIO_CODEC_LEN 32
//视频解码参数
typedef struct
{
	U32	stream_index;
	S8	video_encoder[MAX_VIDEO_AUDIO_CODEC_LEN];
	U32	width;
	U32	height;
	U32	framerate;
	U32	intraframerate;  //I frame interval
	U32	bitrate;
	S8	config[256]; //提交给解码器的第一个I帧前面必须加上config的数据
	int	config_len; //MPEG4 18字节VOL，H264 114字节
}VIDEO_PARAM;

//音频解码参数
typedef struct
{
	U32	stream_index;
	S8	audio_encoder[MAX_VIDEO_AUDIO_CODEC_LEN];
	U32	samplerate;
	U32	samplebitswitdh; //8 or 16
	U32	channels; //0: mono, 1: stero
	U32	bitrate;
	U32	framerate;
}AUDIO_PARAM;

// Video Surveillance VS video file header
#define VS_TP_MEDIATYPE_VIDEO		0x0001
#define VS_TP_MEDIATYPE_AUDIO		0x0100
#define VS_TP_MEDIATYPE_BOTH		0x0101

typedef struct
{
	unsigned long valid_flag;  //第一次写，0x00000000, 文件结束后，写0x51589158
	unsigned short head_size;  //根据每个文件保存时间不同而不同
	unsigned short media_type; //0x0001 视频 0x0100 音频 0x0101 音频视频 //？？请求流返回
	VIDEO_PARAM	video_param;
	AUDIO_PARAM	audo_param;
	int time_duration; //unit is second
} TVsVideoFileHead;
//	int *pVideo_keyframe_offset;//[time_duration]; //该时间点对应的最近的I帧在文件中的偏移量

//文件头长度
#define VS_INDEX_SECONDS(sliceSize) (sliceSize*70)	//每分钟60秒，预留一点空间给没来得及切片时的索引超限
#define VS_INDEX_SIZE(sliceSize) (sizeof(int)*VS_INDEX_SECONDS(sliceSize))		
#define VR_HEAD_SIZE(sliceSize) (sizeof(TVsVideoFileHead)+VS_INDEX_SIZE(sliceSize))

#define VR_FILE_REC_FLAG "000000.rec"
#define VR_FILE_REC_EXT ".rec"
#define VR_FILE_FINISH_EXT ".dat"
#define VR_FILE_PROTECT_EXT ".pre"

// video timing index file (*.idx) header

typedef struct
{
	U32 headLen;	 // length of the entire file header
	U32 granularity; // index granularity in milliseconds
} TVsIdxFileHead;


typedef struct 
{
	//如果为了方便接收方进行包重组，可以增加下面2个字段：
	//U32 frame_length; //此帧的总长度
	//U32 frame_offset; //此包在该帧内的偏移量
	U32 frame_timestamp; //此帧对应的时间戳，用于音视频同步，一帧中的不同包时间戳相同
	U32 keyframe_timestamp; //如果是非I帧，记录其前一I帧的timestamp，如果解码器没有收到前面那个I帧，所有非I帧丢掉丢包不解码
	U16 pack_seq; //包序号0-65535，到最大后从0开始
	U16 payload_size; //此包中包含有效数据的长度
	U8 pack_type; //0x01第一包，0x10最后一包, 0x11第一包也是最后一包，0x00中间包
	U8 frame_type;	 //帧类型1：I帧，0：非I帧
	U8 stream_type; //0: video, 1: audio，2：发送报告，3：接收报告，4：打洞包
	U8 stream_index; 
	U32 frame_index;
}STREAM_PACKET_HEADER;


#define VR_PRI_LINK_PATH	   "/mnt/vr/primary/"
#define VR_SEC_LINK_PATH	   "/mnt/vr/second/"
#define VR_DIR_ALARM		"alarm"		//告警录像子目录
#define VR_DIR_SCHED		"sched"		//计划录像子目录
#define VR_DIR_IPCUP		"ipcup"		//IPC告警上传录像子目录

#define VR_MNT_PATH	   "/mnt/vr/"	//用于VR mount路径
#define VR_PREFIX_PRI	   "primary_"		//用于VR mount路径
#define VR_PREFIX_SEC		"seccond_"		//用于VR mount路径

typedef struct
{
	S8 devId[VS_DEV_ID_LEN];
	S8 filePath[VS_FILE_PATH_LEN];	//录像目录，到DevId，如/mnt/vr/pri/860020002/
} vr_ctm_del_oldfile_struct;


#endif

