📄 vid_avi.c
字号:
{
/* skip unknow part */
GOTO_NEXT_CHUNK();
}
}
else if (IS_TAG_MATCH(&data_dword, MED_AVI_TAG_JUNK))
{
/* JUNK - skip */
FETCH_SIZE();
GOTO_NEXT_CHUNK();
}
else
{
/* unused chunk */
FETCH_SIZE();
GOTO_NEXT_CHUNK();
}
}
parse_finish:
kal_prompt_trace(MOD_MED, "[MED AVI] parse_finish");
if (med_avi_p->is_valid_aud)
{
avi_info_p->aud_format = MED_AVI_AUD_FORMAT_PCM;
if (med_avi_p->aud_total_frame != 0)
{
/* load first aud segment */
med_avi_p->aud_frame_idx = 0;
idx_p = (med_avi_index_struct*) & med_avi_p->aud_idx_list_buf_p[0];
med_avi_p->aud_remain_len = idx_p->chunk_lenght;
/* +8 skip xxwb (4 byte), size (4 byte) */
ret = FSAL_Seek(&med_avi_p->aud_fsal_cntx, idx_p->chunk_offset + 8);
}
avi_info_p->aud_sample_rate = med_avi_p->audio_format_header.sample_per_sec;
avi_info_p->aud_channel = med_avi_p->audio_format_header.channels;
avi_info_p->aud_bit_per_sample = med_avi_p->audio_format_header.bit_per_sample;
kal_prompt_trace(MOD_MED, "[MED AVI] aud_sample_rate: %d", avi_info_p->aud_sample_rate);
kal_prompt_trace(MOD_MED, "[MED AVI] aud_channel: %d", avi_info_p->aud_channel);
kal_prompt_trace(MOD_MED, "[MED AVI] aud_bit_per_sample: %d", avi_info_p->aud_bit_per_sample);
kal_prompt_trace(MOD_MED, "[MED AVI] aud_frame: %d", med_avi_p->aud_total_frame);
}
else
{
avi_info_p->aud_format = MED_AVI_AUD_FORMAT_NOT_SUPPORT;
}
/* avoid divie by 0 - will cause data abort */
if (med_avi_p->video_stream_header.rate == 0)
{
error_cause = MED_RES_BAD_FORMAT;
goto error;
}
if (med_avi_p->video_stream_header.scale == 0)
{
error_cause = MED_RES_BAD_FORMAT;
goto error;
}
/* duration farme_no/fps = frame_no*1000/(rate/scale) = frame_no*1000*scale/rate */
med_avi_p->vid_duration
= ((kal_uint64) med_avi_p->vid_total_frame)
* ((kal_uint64) med_avi_p->video_stream_header.scale)
* 1000 / ((kal_uint64) med_avi_p->video_stream_header.rate);
avi_info_p->vid_fps =
(kal_int32) (0.5 + med_avi_p->video_stream_header.rate / med_avi_p->video_stream_header.scale);
avi_info_p->vid_format = MED_AVI_VID_FORMAT_MJPEG;
avi_info_p->vid_width = med_avi_p->video_format_header.width;
avi_info_p->vid_height = med_avi_p->video_format_header.height;
avi_info_p->vid_duration_in_ms = med_avi_p->vid_duration;
avi_info_p->vid_rate = med_avi_p->video_stream_header.rate;
avi_info_p->vid_scale = med_avi_p->video_stream_header.scale;
kal_prompt_trace(MOD_MED, "[MED AVI] vid_fps: %d", avi_info_p->vid_fps);
kal_prompt_trace(MOD_MED, "[MED AVI] vid_width: %d", avi_info_p->vid_width);
kal_prompt_trace(MOD_MED, "[MED AVI] vid_height: %d", avi_info_p->vid_height);
kal_prompt_trace(MOD_MED, "[MED AVI] vid_duration_in_ms: %d", avi_info_p->vid_duration_in_ms);
kal_prompt_trace(MOD_MED, "[MED AVI] vid_rate: %d", avi_info_p->vid_rate);
kal_prompt_trace(MOD_MED, "[MED AVI] vid_scale: %d", avi_info_p->vid_scale);
kal_prompt_trace(MOD_MED, "[MED AVI] vid_frame: %d", med_avi_p->vid_total_frame);
kal_prompt_trace(MOD_MED, "[MED AVI] ret: MED_RES_OK");
return MED_RES_OK;
error:
if (is_file_opened)
{
FSAL_Close(&med_avi_p->vid_fsal_cntx);
FSAL_Close(&med_avi_p->aud_fsal_cntx);
}
/* open file failed */
med_free_ext_mem((void **)&med_avi_p->vid_fsal_buf_p);
med_free_ext_mem((void **)&med_avi_p->aud_fsal_buf_p);
med_free_ext_mem((void **)&med_avi_p->vid_idx_list_buf_p);
med_free_ext_mem((void **)&med_avi_p->aud_idx_list_buf_p);
med_avi_p->vid_fsal_buf_p = NULL;
med_avi_p->aud_fsal_buf_p = NULL;
med_avi_p->aud_idx_list_buf_p = NULL;
med_avi_p->vid_idx_list_buf_p = NULL;
kal_prompt_trace(MOD_MED, "[MED AVI] !error: %d", error_cause);
return error_cause;
}
/*****************************************************************************
* FUNCTION
* med_avi_close_play_internal
* DESCRIPTION
*
* PARAMETERS
* void
* RETURNS
*
*****************************************************************************/
static kal_int32 med_avi_close_play_internal(void)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
kal_prompt_trace(MOD_MED, "[MED AVI] med_avi_close_play_internal()");
ASSERT(med_avi_p->vid_fsal_buf_p != NULL);
FSAL_Close(&med_avi_p->vid_fsal_cntx);
FSAL_Close(&med_avi_p->aud_fsal_cntx);
/* open file failed */
med_free_ext_mem((void **)&med_avi_p->vid_fsal_buf_p);
med_free_ext_mem((void **)&med_avi_p->aud_fsal_buf_p);
med_free_ext_mem((void **)&med_avi_p->vid_idx_list_buf_p);
med_free_ext_mem((void **)&med_avi_p->aud_idx_list_buf_p);
med_avi_p->vid_fsal_buf_p = NULL;
med_avi_p->aud_fsal_buf_p = NULL;
med_avi_p->aud_idx_list_buf_p = NULL;
med_avi_p->vid_idx_list_buf_p = NULL;
return MED_RES_OK;
}
/*****************************************************************************
* FUNCTION
* med_avi_read_video_frame_move_next
* DESCRIPTION
*
* PARAMETERS
* data_p [?]
* len_p [?]
* RETURNS
*
*****************************************************************************/
kal_int32 med_avi_read_video_frame_move_next(kal_char *data_p, kal_uint32 *len_p)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
return med_avi_read_video_frame_internal(data_p, len_p, KAL_TRUE);
}
/*****************************************************************************
* FUNCTION
* med_avi_read_video_frame
* DESCRIPTION
*
* PARAMETERS
* data_p [?]
* len_p [?]
* RETURNS
*
*****************************************************************************/
kal_int32 med_avi_read_video_frame(kal_char *data_p, kal_uint32 *len_p)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
return med_avi_read_video_frame_internal(data_p, len_p, KAL_FALSE);
}
/*****************************************************************************
* FUNCTION
* med_avi_read_video_frame_internal
* DESCRIPTION
*
* PARAMETERS
* data_p [?]
* len_p [?]
* is_move_next [IN]
* RETURNS
*
*****************************************************************************/
static kal_int32 med_avi_read_video_frame_internal(kal_char *data_p, kal_uint32 *len_p, kal_bool is_move_next)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
med_avi_index_struct *idx_p;
kal_int32 ret;
kal_int32 error_cause;
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
kal_prompt_trace(MOD_MED, "[MED AVI] med_avi_read_video_frame_internal()");
kal_prompt_trace(MOD_MED, "[MED AVI] idx: %d, req: %d)", med_avi_p->vid_frame_idx, *len_p);
if (med_avi_p->vid_frame_idx >= med_avi_p->vid_total_frame)
{
kal_prompt_trace(MOD_MED, "[MED AVI] ret: MED_RES_VIDEO_END");
return MED_RES_VIDEO_END;
}
/* TODO: check frame within valid region */
idx_p = (med_avi_index_struct*) & med_avi_p->vid_idx_list_buf_p[med_avi_p->vid_frame_idx];
/* +8 skip xxdb (4 byte), size (4 byte) */
ret = FSAL_Seek(&med_avi_p->vid_fsal_cntx, idx_p->chunk_offset + 8);
FETCH_DATA(data_p, idx_p->chunk_lenght);
*len_p = idx_p->chunk_lenght;
if (is_move_next)
{
med_avi_p->vid_frame_idx++;
}
kal_prompt_trace(MOD_MED, "[MED AVI] read: %d)", *len_p);
kal_prompt_trace(MOD_MED, "[MED AVI] ret: MED_RES_OK");
return MED_RES_OK;
error:
kal_prompt_trace(MOD_MED, "[MED AVI] ret: MED_RES_VIDEO_ERROR");
return MED_RES_VIDEO_ERROR;
}
/*****************************************************************************
* FUNCTION
* med_avi_read_audio_data
* DESCRIPTION
*
* PARAMETERS
* data_p [?]
* len_p [?]
* RETURNS
*
*****************************************************************************/
kal_int32 med_avi_read_audio_data(kal_char *data_p, kal_uint32 *len_p)
{
/*----------------------------------------------------------------*/
/* Local Variables */
/*----------------------------------------------------------------*/
med_avi_index_struct *idx_p;
kal_int32 ret;
kal_int32 error_cause;
kal_int32 need_len;
/*----------------------------------------------------------------*/
/* Code Body */
/*----------------------------------------------------------------*/
kal_prompt_trace(MOD_MED, "[MED AVI] med_avi_read_audio_data()");
kal_prompt_trace(
MOD_MED,
"[MED AVI] idx: %d, remain: %d, req: %d",
med_avi_p->aud_frame_idx,
med_avi_p->aud_remain_len,
*len_p);
/* check if audio valid */
if (!med_avi_p->is_valid_aud)
{
*len_p = 0;
kal_prompt_trace(MOD_MED, "[MED AVI] ret: MED_RES_INVALID_FORMAT");
return MED_RES_AUDIO_ERROR;
}
need_len = *len_p;
*len_p = 0;
while (need_len)
{
if (med_avi_p->aud_remain_len == 0)
{
/* if remain all used, need move to next aud frame */
if (med_avi_p->aud_frame_idx + 1 >= med_avi_p->aud_total_frame)
{
/* terminate condition */
kal_prompt_trace(MOD_MED, "[MED AVI] ret: MED_RES_AUDIO_END");
return MED_RES_AUDIO_END;
}
med_avi_p->aud_frame_idx++;
idx_p = (med_avi_index_struct*) & med_avi_p->aud_idx_list_buf_p[med_avi_p->aud_frame_idx];
med_avi_p->aud_remain_len = idx_p->chunk_lenght;
/* +8 skip xxdb (4 byte), size (4 byte) */
ret = FSAL_Seek(&med_avi_p->aud_fsal_cntx, idx_p->chunk_offset + 8);
if (ret != FSAL_OK)
{
kal_prompt_trace(MOD_MED, "[MED AVI] ret: MED_RES_INVALID_FORMAT");
return MED_RES_AUDIO_ERROR;
}
}
if (need_len >= med_avi_p->aud_remain_len)
{
/* needed data more than this segment */
FETCH_AUD_DATA(data_p, med_avi_p->aud_remain_len);
*len_p += med_avi_p->aud_remain_len;
data_p += med_avi_p->aud_remain_len; /* shift point */
need_len -= med_avi_p->aud_remain_len;
med_avi_p->aud_remain_len = 0;
}
else
{
/* remain data can fullfil request */
FETCH_AUD_DATA(data_p, need_len);
*len_p += need_len;
med_avi_p->aud_remain_len -= need_len;
need_len = 0;
}
}
kal_prompt_trace(MOD_MED, "[MED AVI] ret: MED_RES_OK");
return MED_RES_OK;
error:
kal_prompt_trace(MOD_MED, "[MED AVI] ret: MED_RES_AUDIO_ERROR");
return MED_RES_AUDIO_ERROR;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -