📄 video_file_creator.c
字号:
MEDIA_STATUS_CODE video_enc_get_type(STFSAL * meta_file, kal_uint32 * type)
{
g_video_enc_status.FSAL_STATUS = FSAL_Seek(meta_file, file_create_pos_is_short_header);
if (g_video_enc_status.FSAL_STATUS != FSAL_OK)
{
VIDEO_ASSERT(0);
g_video_enc_status.FSAL_ERROR_FILE = meta_file;
return FSAL_ERROR;
}
g_video_enc_status.FSAL_STATUS = FSAL_Read(meta_file, (kal_uint8 *)type, 4);
if (g_video_enc_status.FSAL_STATUS != FSAL_OK)
{
VIDEO_ASSERT(0);
g_video_enc_status.FSAL_ERROR_FILE = meta_file;
return FSAL_ERROR;
}
return MEDIA_STATUS_OK;
}
MEDIA_STATUS_CODE video_enc_get_framerate(STFSAL * meta_file, kal_uint32 * frame_rate)
{
g_video_enc_status.FSAL_STATUS = FSAL_Seek(meta_file, file_create_pos_average_frame_rate);
if (g_video_enc_status.FSAL_STATUS != FSAL_OK)
{
VIDEO_ASSERT(0);
g_video_enc_status.FSAL_ERROR_FILE = meta_file;
return FSAL_ERROR;
}
g_video_enc_status.FSAL_STATUS = FSAL_Read(meta_file, (kal_uint8 *)frame_rate, 4);
if (g_video_enc_status.FSAL_STATUS != FSAL_OK)
{
VIDEO_ASSERT(0);
g_video_enc_status.FSAL_ERROR_FILE = meta_file;
return FSAL_ERROR;
}
return MEDIA_STATUS_OK;
}
MEDIA_STATUS_CODE video_enc_get_timescale(STFSAL * meta_file, kal_uint32 * timescale)
{
g_video_enc_status.FSAL_STATUS = FSAL_Seek(meta_file, file_create_pos_time_scale);
if (g_video_enc_status.FSAL_STATUS != FSAL_OK)
{
VIDEO_ASSERT(0);
g_video_enc_status.FSAL_ERROR_FILE = meta_file;
return FSAL_ERROR;
}
g_video_enc_status.FSAL_STATUS = FSAL_Read(meta_file, (kal_uint8 *)timescale, 4);
if (g_video_enc_status.FSAL_STATUS != FSAL_OK)
{
VIDEO_ASSERT(0);
g_video_enc_status.FSAL_ERROR_FILE = meta_file;
return FSAL_ERROR;
}
return MEDIA_STATUS_OK;
}
MEDIA_STATUS_CODE video_enc_get_frame_size(STFSAL * meta_file, kal_uint32 * width, kal_uint32 * height)
{
g_video_enc_status.FSAL_STATUS = FSAL_Seek(meta_file, file_create_pos_frame_width);
if (g_video_enc_status.FSAL_STATUS != FSAL_OK)
{
VIDEO_ASSERT(0);
g_video_enc_status.FSAL_ERROR_FILE = meta_file;
return FSAL_ERROR;
}
g_video_enc_status.FSAL_STATUS = FSAL_Read(meta_file, (kal_uint8 *)width, 4);
if (g_video_enc_status.FSAL_STATUS != FSAL_OK)
{
VIDEO_ASSERT(0);
g_video_enc_status.FSAL_ERROR_FILE = meta_file;
return FSAL_ERROR;
}
g_video_enc_status.FSAL_STATUS = FSAL_Read(meta_file, (kal_uint8 *)height, 4);
if (g_video_enc_status.FSAL_STATUS != FSAL_OK)
{
VIDEO_ASSERT(0);
g_video_enc_status.FSAL_ERROR_FILE = meta_file;
return FSAL_ERROR;
}
return MEDIA_STATUS_OK;
}
MEDIA_STATUS_CODE video_enc_get_vos_length(STFSAL * meta_file, kal_uint32 * length)
{
g_video_enc_status.FSAL_STATUS = FSAL_Seek(meta_file, file_create_pos_vos_length);
if (g_video_enc_status.FSAL_STATUS != FSAL_OK)
{
VIDEO_ASSERT(0);
g_video_enc_status.FSAL_ERROR_FILE = meta_file;
return FSAL_ERROR;
}
g_video_enc_status.FSAL_STATUS = FSAL_Read(meta_file, (kal_uint8 *)length, 4);
if (g_video_enc_status.FSAL_STATUS != FSAL_OK)
{
VIDEO_ASSERT(0);
g_video_enc_status.FSAL_ERROR_FILE = meta_file;
return FSAL_ERROR;
}
return MEDIA_STATUS_OK;
}
MEDIA_STATUS_CODE video_enc_get_vos_data(kal_uint8 * vos, kal_uint32 length, STFSAL * meta_file)
{
g_video_enc_status.FSAL_STATUS = FSAL_Seek(meta_file, file_create_pos_vos_data);
if (g_video_enc_status.FSAL_STATUS != FSAL_OK)
{
VIDEO_ASSERT(0);
g_video_enc_status.FSAL_ERROR_FILE = meta_file;
return FSAL_ERROR;
}
g_video_enc_status.FSAL_STATUS = FSAL_Read(meta_file, (kal_uint8 *)vos, length);
if (g_video_enc_status.FSAL_STATUS != FSAL_OK)
{
VIDEO_ASSERT(0);
g_video_enc_status.FSAL_ERROR_FILE = meta_file;
return FSAL_ERROR;
}
return MEDIA_STATUS_OK;
}
MEDIA_STATUS_CODE video_enc_get_mdatsz_pos(STFSAL * meta_file, kal_uint32 * pos)
{
g_video_enc_status.FSAL_STATUS = FSAL_Seek(meta_file, file_create_pos_video_mdatsz_pos);
if (g_video_enc_status.FSAL_STATUS != FSAL_OK)
{
VIDEO_ASSERT(0);
g_video_enc_status.FSAL_ERROR_FILE = meta_file;
return FSAL_ERROR;
}
g_video_enc_status.FSAL_STATUS = FSAL_Read(meta_file, (kal_uint8 *)pos, 4);
if (g_video_enc_status.FSAL_STATUS != FSAL_OK)
{
VIDEO_ASSERT(0);
g_video_enc_status.FSAL_ERROR_FILE = meta_file;
return FSAL_ERROR;
}
return MEDIA_STATUS_OK;
}
MEDIA_STATUS_CODE mpeg4_get_frame_timestamp_from_meta_file(kal_uint32 frame_number, kal_uint32 vos_length, kal_uint32 * result)
{
kal_uint32 length_pos;
length_pos = (((file_create_pos_vos_data + vos_length + 3) / 4) * 4) + (8 * frame_number);
g_video_enc_status.FSAL_STATUS = FSAL_Seek(&mp4_files.MEDIA_META_FILE, length_pos);
if (g_video_enc_status.FSAL_STATUS != FSAL_OK)
{
VIDEO_ASSERT(0);
g_video_enc_status.FSAL_ERROR_FILE = &mp4_files.MEDIA_META_FILE;
return FSAL_ERROR;
}
g_video_enc_status.FSAL_STATUS = FSAL_Read(&mp4_files.MEDIA_META_FILE, (kal_uint8 *)result, 4);
if (g_video_enc_status.FSAL_STATUS != FSAL_OK)
{
VIDEO_ASSERT(0);
g_video_enc_status.FSAL_ERROR_FILE = &mp4_files.MEDIA_META_FILE;
return FSAL_ERROR;
}
return MEDIA_STATUS_OK;
}
MEDIA_STATUS_CODE mpeg4_get_frame_length_from_meta_file(kal_uint32 frame_number, kal_uint32 vos_length, kal_uint32 * result)
{
kal_uint32 length_pos;
length_pos = (((file_create_pos_vos_data + vos_length + 3) / 4) * 4) + (8 * frame_number) + 4;
g_video_enc_status.FSAL_STATUS = FSAL_Seek(&mp4_files.MEDIA_META_FILE, length_pos);
if (g_video_enc_status.FSAL_STATUS != FSAL_OK)
{
VIDEO_ASSERT(0);
g_video_enc_status.FSAL_ERROR_FILE = &mp4_files.MEDIA_META_FILE;
return FSAL_ERROR;
}
g_video_enc_status.FSAL_STATUS = FSAL_Read(&mp4_files.MEDIA_META_FILE, (kal_uint8 *)result, 4);
if (g_video_enc_status.FSAL_STATUS != FSAL_OK)
{
VIDEO_ASSERT(0);
g_video_enc_status.FSAL_ERROR_FILE = &mp4_files.MEDIA_META_FILE;
return FSAL_ERROR;
}
return MEDIA_STATUS_OK;
}
MEDIA_STATUS_CODE mpeg4_generate_max_buffer_and_frame(kal_uint32 * total_frame_length, kal_uint32 * avg_frame, kal_uint32 * max_frame, kal_uint32 frame_number, kal_uint32 frame_rate, kal_uint32 vos_length)
{
kal_uint32 i;
kal_uint32 total;
kal_uint32 total1;
kal_uint32 frame_length_i;
MEDIA_STATUS_CODE result;
result = mpeg4_get_frame_length_from_meta_file(0, vos_length, &total1);
if (result != MEDIA_STATUS_OK)
{
VIDEO_ASSERT(0);
return result;
}
total = total1;
*total_frame_length = 0;
*max_frame = total1;
for (i = 1; i < frame_number; i++)
{
result = mpeg4_get_frame_length_from_meta_file(i, vos_length, &frame_length_i);
if (result != MEDIA_STATUS_OK)
{
VIDEO_ASSERT(0);
return result;
}
if (*max_frame<frame_length_i)
*max_frame = frame_length_i;
total += frame_length_i;
total1 += frame_length_i;
if ((i + 1) % (frame_rate) == 0)
{
if (*total_frame_length<total1)
*total_frame_length = total1;
total1 = 0;
}
}
if (*total_frame_length<total1)
*total_frame_length = total1;
*total_frame_length = *total_frame_length * 8; //bits
total = total * 8; //bits
*avg_frame = total *(frame_rate / frame_number);
return MEDIA_STATUS_OK;
}
MEDIA_STATUS_CODE mpeg4_generate_avg_buffer_and_frame(kal_uint32 * total_frame_length, kal_uint32 * max_frame, kal_uint32 frame_number, kal_uint32 frame_rate, kal_uint32 vos_length)
{
kal_uint32 total;
kal_uint32 i;
kal_uint32 temp;
MEDIA_STATUS_CODE result;
total = 0;
for (i = 0; i < frame_number; i++)
{
result = mpeg4_get_frame_length_from_meta_file(i, vos_length, &temp);
if (result != MEDIA_STATUS_OK)
{
VIDEO_ASSERT(0);
return result;
}
total += temp;
}
total *= 8;
//if( frame_number > (int)(frame_rate));
total = total * (int)(frame_rate / ((int)frame_number));
return MEDIA_STATUS_OK;
}
MEDIA_STATUS_CODE video_enc_get_total_duration(MP4_FILE_CREATE_STRUCT * file_creat_struct, kal_uint32 * duration)
{
kal_uint32 i;
kal_uint32 temp_prev;
kal_uint32 temp;
MEDIA_STATUS_CODE result;
kal_uint32 vos_length;
kal_uint32 pre_duration = 0;
kal_uint32 stts_time;
*duration = 0;
temp_prev = 0;
if (file_creat_struct->frame_number == 1)
{
*duration = 500;
}
else
{
g_video_enc_status.FSAL_STATUS = FSAL_Seek(&mp4_files.MEDIA_META_FILE, file_create_pos_vos_length);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -