📄 vid_avi.c
字号:
/* Local Variables */
/*----------------------------------------------------------------*/
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
kal_prompt_trace(MOD_MED, "[MED AVI] med_avi_toggle_data_buffer()");
if (med_avi_p->act_data_buf_id == 0)
{
/* make sure next chunk buffer is clear - data has been flushed to fs */
ASSERT(med_avi_p->data_written[1] == 0);
med_avi_p->act_data_buf_id = 1;
}
else
{
/* make sure next chunk buffer is clear - data has been flushed to fs */
ASSERT(med_avi_p->data_written[0] == 0);
med_avi_p->act_data_buf_id = 0;
}
}
/*****************************************************************************
* FUNCTION
* med_avi_toggle_idx_buffer
* DESCRIPTION
*
* PARAMETERS
* void
* RETURNS
* void
*****************************************************************************/
void med_avi_toggle_idx_buffer(void)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
kal_prompt_trace(MOD_MED, "[MED AVI] med_avi_toggle_idx_buffer()");
if (med_avi_p->act_idx_buf_id == 0)
{
/* make sure next idx buffer is clear - data has been flushed to fs */
ASSERT(med_avi_p->idx_written[1] == 0);
med_avi_p->act_idx_buf_id = 1;
}
else
{
/* make sure next idx buffer is clear - data has been flushed to fs */
ASSERT(med_avi_p->idx_written[0] == 0);
med_avi_p->act_idx_buf_id = 0;
}
}
/*****************************************************************************
* FUNCTION
* med_avi_dump_data_buffer_to_file
* DESCRIPTION
*
* PARAMETERS
* void
* RETURNS
*
*****************************************************************************/
kal_int32 med_avi_dump_data_buffer_to_file(void)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
kal_uint32 written;
kal_int32 fs_ret;
kal_int32 idx;
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
kal_prompt_trace(MOD_MED, "[MED AVI] med_avi_dump_data_buffer_to_file()");
ASSERT(med_avi_p->data_h != 0);
if (med_avi_p->act_data_buf_id == 0)
{
idx = 1;
}
else
{
idx = 0;
}
fs_ret = FS_Write(med_avi_p->data_h, (void*)med_avi_p->data_buf_p[idx], med_avi_p->data_written[idx], &written);
if (fs_ret < 0) /* !FS_NO_ERROR */
{
kal_prompt_trace(MOD_MED, "[MED AVI] ret: MED_RES_ERROR");
kal_prompt_trace(MOD_MED, "[MED AVI] fs error: %d", fs_ret);
med_avi_p->data_written[idx] = 0;
return MED_RES_ERROR;
}
if (written != med_avi_p->data_written[idx])
{
kal_prompt_trace(MOD_MED, "[MED AVI] ret: MED_RES_NOT_ENOUGH_SPACE");
med_avi_p->data_written[idx] = 0;
return MED_RES_NOT_ENOUGH_SPACE;
}
kal_prompt_trace(MOD_MED, "[MED AVI] ret: MED_RES_OK");
med_avi_p->data_written[idx] = 0;
return MED_RES_OK;
}
/*****************************************************************************
* FUNCTION
* med_avi_dump_idx_buffer_to_file
* DESCRIPTION
*
* PARAMETERS
* void
* RETURNS
*
*****************************************************************************/
kal_int32 med_avi_dump_idx_buffer_to_file(void)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
kal_uint32 written;
kal_int32 fs_ret;
kal_int32 idx;
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
kal_prompt_trace(MOD_MED, "[MED AVI] med_avi_dump_idx_buffer_to_file()");
ASSERT(med_avi_p->idx_h != 0);
if (med_avi_p->act_idx_buf_id == 0)
{
idx = 1;
}
else
{
idx = 0;
}
fs_ret = FS_Write(med_avi_p->idx_h, (void*)med_avi_p->idx_buf_p[idx], med_avi_p->idx_written[idx], &written);
if (fs_ret < 0) /* !FS_NO_ERROR */
{
kal_prompt_trace(MOD_MED, "[MED AVI] ret: MED_RES_ERROR");
med_avi_p->idx_written[idx] = 0;
return MED_RES_ERROR;
}
if (written != med_avi_p->idx_written[idx])
{
kal_prompt_trace(MOD_MED, "[MED AVI] ret: MED_RES_NOT_ENOUGH_SPACE");
med_avi_p->idx_written[idx] = 0;
return MED_RES_NOT_ENOUGH_SPACE;
}
kal_prompt_trace(MOD_MED, "[MED AVI] ret: MED_RES_OK");
med_avi_p->idx_written[idx] = 0;
return MED_RES_OK;
}
/*****************************************************************************
* FUNCTION
* med_avi_is_active_data_buf_sufficient
* DESCRIPTION
*
* PARAMETERS
* req_size [IN]
* RETURNS
*
*****************************************************************************/
kal_int32 med_avi_is_active_data_buf_sufficient(kal_int32 req_size)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
kal_int32 remain_buf;
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
kal_prompt_trace(MOD_MED, "[MED AVI] med_avi_is_active_data_buf_sufficient()");
remain_buf = MED_AVI_WRITE_DATA_BUF_SIZE - med_avi_p->data_written[med_avi_p->act_data_buf_id];
/*
* when write data chunk, we will write 4 byte of 00db or 01wb
* and 4 byte of chunk size, so we need add 8 byte to req buffer size
*/
if (remain_buf <= (req_size+8))
{
kal_prompt_trace(MOD_MED, "[MED AVI] ret: MED_RES_BUFFER_INSUFFICIENT");
return MED_RES_BUFFER_INSUFFICIENT;
}
else
{
kal_prompt_trace(MOD_MED, "[MED AVI] ret: MED_RES_OK");
return MED_RES_OK;
}
}
/*****************************************************************************
* FUNCTION
* med_avi_is_active_idx_buf_sufficient
* DESCRIPTION
*
* PARAMETERS
* void
* RETURNS
*
*****************************************************************************/
kal_int32 med_avi_is_active_idx_buf_sufficient(void)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
kal_int32 remain_buf;
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
kal_prompt_trace(MOD_MED, "[MED AVI] med_avi_is_active_idx_buf_sufficient()");
remain_buf = MED_AVI_WRITE_IDX_BUF_SIZE - med_avi_p->idx_written[med_avi_p->act_idx_buf_id];
if (remain_buf <= sizeof(med_avi_index_struct))
{
kal_prompt_trace(MOD_MED, "[MED AVI] ret: MED_RES_BUFFER_INSUFFICIENT");
return MED_RES_BUFFER_INSUFFICIENT;
}
else
{
kal_prompt_trace(MOD_MED, "[MED AVI] ret: MED_RES_OK");
return MED_RES_OK;
}
}
/*****************************************************************************
* FUNCTION
* med_avi_write_video_frame
* DESCRIPTION
*
* PARAMETERS
* data_p [?]
* len [IN]
* RETURNS
*
*****************************************************************************/
kal_int32 med_avi_write_video_frame(kal_char *data_p, kal_uint32 len)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
kal_char *data_buf_p;
kal_char *idx_buf_p;
kal_uint32 size;
med_avi_index_struct idx_data;
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
kal_prompt_trace(MOD_MED, "[MED AVI] med_avi_write_video_frame()");
kal_prompt_trace(MOD_MED, "[MED AVI] write: %d", len);
/* video data */
/* 00db, size, raw data */
/* 4 4 ... */
size = len;
data_buf_p = med_avi_p->data_buf_p[med_avi_p->act_data_buf_id];
data_buf_p += med_avi_p->data_written[med_avi_p->act_data_buf_id];
memcpy(data_buf_p, &("00db"), 4);
data_buf_p += 4;
memcpy(data_buf_p, &size, 4);
data_buf_p += 4;
memcpy(data_buf_p, data_p, len);
/* write idx */
memcpy(&idx_data.chunk_id, &("00db"), 4);
idx_data.flag = 0;
idx_data.chunk_offset = med_avi_p->total_av_data_written + med_avi_p->av_data_offset;
idx_data.chunk_lenght = len;
idx_buf_p = med_avi_p->idx_buf_p[med_avi_p->act_idx_buf_id];
idx_buf_p += med_avi_p->idx_written[med_avi_p->act_idx_buf_id];
memcpy(idx_buf_p, &idx_data, sizeof(med_avi_index_struct));
med_avi_p->idx_written[med_avi_p->act_idx_buf_id] += sizeof(med_avi_index_struct);
/* calc next start pos */
med_avi_p->data_written[med_avi_p->act_data_buf_id] += len + 8; /* data witten in this act buf */
med_avi_p->total_av_data_written += len + 8; /* data written from data chunk start, no include movi tag */
med_avi_p->vid_frame_count++;
kal_prompt_trace(MOD_MED, "[MED AVI] ret: MED_RES_OK");
return MED_RES_OK;
}
/*****************************************************************************
* FUNCTION
* med_avi_write_audio_data
* DESCRIPTION
*
* PARAMETERS
* data_p [?]
* len [IN]
* RETURNS
*
*****************************************************************************/
kal_int32 med_avi_write_audio_data(kal_char *data_p, kal_uint32 len)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
kal_char *data_buf_p;
kal_char *idx_buf_p;
kal_uint32 size;
med_avi_index_struct idx_data;
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
kal_prompt_trace(MOD_MED, "[MED AVI] med_avi_write_audio_data()");
kal_prompt_trace(MOD_MED, "[MED AVI] write: %d)", len);
/* audio data */
/* 01wb, size, raw data */
/* 4 4 ... */
size = len;
data_buf_p = med_avi_p->data_buf_p[med_avi_p->act_data_buf_id];
data_buf_p += med_avi_p->data_written[med_avi_p->act_data_buf_id];
memcpy(data_buf_p, &("01wb"), 4);
data_buf_p += 4;
memcpy(data_buf_p, &size, 4);
data_buf_p += 4;
memcpy(data_buf_p, data_p, len);
/* write idx */
memcpy(&idx_data.chunk_id, &("01wb"), 4)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -