📄 vid_avi.c
字号:
/*******************************************************************************
* Filename:
* ---------
* vid_avi.c
*
* Project:
* --------
* Maui
*
* Description:
* ------------
* This file includes avi related functions of camera module.
*
* Author:
* -------
* -------
*
*==============================================================================
* HISTORY
* Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
*------------------------------------------------------------------------------
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
* removed!
* removed!
* removed!
*
*------------------------------------------------------------------------------
* Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!!
*==============================================================================
*******************************************************************************/
/* system includes */
#include "kal_release.h"
#include "kal_trace.h"
#include "stack_common.h"
#include "stack_msgs.h"
#include "app_ltlcom.h" /* Task message communiction */
#include "syscomp_config.h"
#include "task_config.h" /* Task creation */
#include "app_buff_alloc.h" /* Declaration of buffer management API */
#include "stacklib.h" /* Basic type for dll, evshed, stacktimer */
#include "event_shed.h" /* Event scheduler */
#include "stack_timer.h" /* Stack timer */
#include "FSAL.h"
#include "med_main.h"
#include "med_global.h"
#include "med_struct.h"
#include "med_utility.h"
#include "vid_avi.h"
#include "vid_main.h"
/* player */
#define MED_AVI_VID_FSAL_BUF_SIZE (10*1024) /* 10k */
#define MED_AVI_AUD_FSAL_BUF_SIZE (1024) /* 1k */
#define MED_AVI_FSAL_IDX_BUF_SIZE (200*1024) /* 200K */
/* recorder */
#define MED_AVI_WRITE_DATA_BUF_SIZE (150*1024) /* 150k */
#define MED_AVI_WRITE_IDX_BUF_SIZE (5*1024) /* 5k */
#define MED_AVI_RECORD_TIME_LIMIT (60) /* 60 min */
#define MED_AVI_MAX_PARSING_TIME (1000) /* 1000*4.615ms~=4.6 sec */
typedef struct
{
/* parser */
STFSAL vid_fsal_cntx;
STFSAL aud_fsal_cntx;
kal_char *vid_fsal_buf_p;
kal_char *aud_fsal_buf_p;
kal_uint32 riff_size;
kal_uint32 file_header_size;
kal_uint32 video_meta_size;
kal_uint32 audio_meta_size;
kal_uint32 junk_size;
med_avi_file_header_struct file_header;
med_avi_stream_header_struct video_stream_header;
med_avi_stream_header_struct audio_stream_header;
med_avi_video_format_header_struct video_format_header;
med_avi_audio_format_header_struct audio_format_header;
med_avi_index_struct *aud_idx_list_buf_p;
med_avi_index_struct *vid_idx_list_buf_p;
/* player */
/* vid */
kal_uint32 vid_frame_idx;
kal_uint32 vid_total_frame;
kal_uint64 vid_duration;
/* aud */
kal_uint32 aud_frame_idx;
kal_uint32 aud_total_frame;
kal_uint32 aud_remain_len; /* remaing data in the segment */
kal_bool is_valid_aud;
/* recorder */
FS_HANDLE data_h;
FS_HANDLE idx_h;
kal_uint64 ms_per_frame;
kal_uint64 time_limit;
kal_uint8 act_data_buf_id; /* double buffe, 0 or 1 */
kal_uint8 act_idx_buf_id; /* double buffe, 0 or 1 */
kal_uint32 data_written[2];
kal_uint32 idx_written[2];
kal_char *data_buf_p[2];
kal_char *idx_buf_p[2];
kal_int32 total_av_data_written;
kal_int32 aud_len;
kal_int32 av_data_offset;
kal_uint32 vid_frame_count;
med_avi_rec_struct rec_data;
} med_avi_cntx_struct;
med_avi_cntx_struct g_med_avi_cntx;
med_avi_cntx_struct *med_avi_p = &g_med_avi_cntx;
#define FETCH_TAG(__buf_p__) \
do{ \
ret = FSAL_Read(&med_avi_p->vid_fsal_cntx, (kal_uint8*)__buf_p__, 4);\
if(ret != FSAL_OK) \
{ \
error_cause = MED_RES_OPEN_FILE_FAIL; \
goto error; \
} \
}while(0);
#define FETCH_AND_CHECK_TAG(__buf_p__,__TAG__) \
do{ \
ret = FSAL_Read(&med_avi_p->vid_fsal_cntx, (kal_uint8*)__buf_p__, 4);\
if(ret != FSAL_OK) \
{ \
error_cause = MED_RES_OPEN_FILE_FAIL; \
goto error; \
} \
if(strncmp((char*)__buf_p__, (char*)__TAG__, 4) != 0) \
{ \
error_cause = MED_RES_BAD_FORMAT; \
goto error; \
} \
}while(0);
#define FETCH_SIZE() \
do{ \
ret = FSAL_Read(&med_avi_p->vid_fsal_cntx, (kal_uint8*)&chunk_size, 4);\
if(ret != FSAL_OK) \
{ \
error_cause = MED_RES_OPEN_FILE_FAIL; \
goto error; \
} \
ret = FSAL_GetCurPos(&med_avi_p->vid_fsal_cntx, (kal_uint32*)&cur_pos);\
if(ret != FSAL_OK) \
{ \
error_cause = MED_RES_OPEN_FILE_FAIL; \
goto error; \
} \
}while(0);
#define FETCH_DATA(__buf_p__,__size__) \
do{ \
ret = FSAL_Read(&med_avi_p->vid_fsal_cntx, (kal_uint8*)__buf_p__, __size__);\
if(ret != FSAL_OK) \
{ \
error_cause = MED_RES_OPEN_FILE_FAIL; \
goto error; \
} \
}while(0);
#define GOTO_NEXT_CHUNK() \
do{ \
if(cur_pos+chunk_size >= file_size) \
{ \
goto parse_finish; \
} \
ret = FSAL_Seek(&med_avi_p->vid_fsal_cntx, cur_pos+chunk_size);\
if(ret != FSAL_OK) \
{ \
error_cause = MED_RES_OPEN_FILE_FAIL; \
goto error; \
} \
}while(0);
#define FETCH_AUD_DATA(__buf_p__,__size__) \
do{ \
ret = FSAL_Read(&med_avi_p->aud_fsal_cntx, (kal_uint8*)__buf_p__, __size__);\
if(ret != FSAL_OK) \
{ \
error_cause = MED_RES_OPEN_FILE_FAIL; \
goto error; \
} \
}while(0);
#define MAKE_UPPER(__buf_p__) \
do{ \
kal_char *byte_p; \
kal_int32 i; \
byte_p = (kal_char*)__buf_p__;\
for(i = 0; i < 4; i++) \
{ \
if (byte_p[i] >= 'a') \
{ \
byte_p[i] += 'A' - 'a';\
} \
} \
}while(0);
#define IS_TAG_MATCH(__buf_p__,__tag__)\
(strncmp((char*)__buf_p__, (char*)__tag__, 4) == 0)
#define IS_TAG_NOT_MATCH(__buf_p__,__tag__)\
(strncmp((char*)__buf_p__, (char*)__tag__, 4) != 0)
static kal_int32 med_avi_close_play_internal(void);
static kal_int32 med_avi_open_play_internal(
med_avi_info_struct *avi_info_p,
const kal_wchar *filename,
kal_char *data_p,
kal_int32 data_size);
static kal_int32 med_avi_read_video_frame_internal(kal_char *data_p, kal_uint32 *len_p, kal_bool is_move_next);
/*****************************************************************************
* FUNCTION
* med_avi_open_play_file
* DESCRIPTION
*
* PARAMETERS
* avi_info_p [?]
* filename [IN]
* RETURNS
*
*****************************************************************************/
kal_int32 med_avi_open_play_file(med_avi_info_struct *avi_info_p, const kal_wchar *filename)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
return med_avi_open_play_internal(avi_info_p, filename, NULL, 0);
}
/*****************************************************************************
* FUNCTION
* med_avi_open_play_array
* DESCRIPTION
*
* PARAMETERS
* avi_info_p [?]
* data_p [?]
* data_size [IN]
* RETURNS
*
*****************************************************************************/
kal_int32 med_avi_open_play_array(med_avi_info_struct *avi_info_p, kal_char *data_p, kal_int32 data_size)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
return med_avi_open_play_internal(avi_info_p, NULL, data_p, data_size);
}
/*****************************************************************************
* FUNCTION
* med_avi_close_play_file
* DESCRIPTION
*
* PARAMETERS
* void
* RETURNS
*
*****************************************************************************/
kal_int32 med_avi_close_play_file(void)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
return med_avi_close_play_internal();
}
/*****************************************************************************
* FUNCTION
* med_avi_close_play_array
* DESCRIPTION
*
* PARAMETERS
* void
* RETURNS
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -