📄 video_file_creator.c
字号:
mp4_crt_write_int(mp4_file_pos, 0x0, real_meta_file); /* */
mp4_crt_write_int(mp4_file_pos, 0x1, real_meta_file); /* array*/
mp4_crt_write_zero_group(mp4_file_pos, 16, real_meta_file);
mp4_crt_write_short(mp4_file_pos, ((kal_uint16)file_creat_struct->frame_width), real_meta_file);
mp4_crt_write_short(mp4_file_pos, ((kal_uint16)file_creat_struct->frame_height), real_meta_file);
mp4_crt_write_int(mp4_file_pos, 0x480000, real_meta_file);
mp4_crt_write_int(mp4_file_pos, 0x480000, real_meta_file);
mp4_crt_write_int(mp4_file_pos, 0x0, real_meta_file);
mp4_crt_write_short(mp4_file_pos, 0x1, real_meta_file);
mp4_crt_write_zero_group(mp4_file_pos, 32, real_meta_file);
mp4_crt_write_short(mp4_file_pos, 24, real_meta_file);
mp4_crt_write_short(mp4_file_pos, 0xFFFF, real_meta_file);
mp4_crt_write_int(mp4_file_pos, (49 + file_creat_struct->VOS_length), real_meta_file);
mp4_crt_write_char_group(mp4_file_pos, "esds", 4, real_meta_file);
mp4_crt_write_int(mp4_file_pos, 0x0, real_meta_file);
mp4_crt_write_int(mp4_file_pos, 0x03808080, real_meta_file); //DESC 3
mp4_crt_write_char(mp4_file_pos, (file_creat_struct->VOS_length + 32), real_meta_file); //length
mp4_crt_write_short(mp4_file_pos, 0x01, real_meta_file); //content
mp4_crt_write_char(mp4_file_pos, 0x0, real_meta_file); //content
mp4_crt_write_int(mp4_file_pos, 0x04808080, real_meta_file); //DESC 4
mp4_crt_write_char(mp4_file_pos, (file_creat_struct->VOS_length + 18), real_meta_file); //length
result = mpeg4_generate_max_buffer_and_frame(&frame_length_sum_per_second, &avg_frame_lentgh, &max_frame_length, file_creat_struct->frame_number, file_creat_struct->frame_rate, file_creat_struct->VOS_length);
if (result != MEDIA_STATUS_OK)
{
VIDEO_ASSERT(0);
return result;
}
mp4_crt_write_short(mp4_file_pos, 0x2011, real_meta_file);
mp4_crt_write_char(mp4_file_pos, ((max_frame_length & 0xff0000) >> 16), real_meta_file);
mp4_crt_write_short(mp4_file_pos, ((kal_uint16)(max_frame_length & 0xffff)), real_meta_file);
mp4_crt_write_int(mp4_file_pos, frame_length_sum_per_second, real_meta_file); //maxBitrate
mp4_crt_write_int(mp4_file_pos, avg_frame_lentgh, real_meta_file); //avgBitrate
mp4_crt_write_int(mp4_file_pos, 0x05808080, real_meta_file); //DESC 5
mp4_crt_write_char(mp4_file_pos, file_creat_struct->VOS_length, real_meta_file);
if (((file_creat_struct->VOS_ptr[0] << 24) + (file_creat_struct->VOS_ptr[1] << 16) + (file_creat_struct->VOS_ptr[2] << 8) + file_creat_struct->VOS_ptr[3]) == 0x1b0)
{
mp4_crt_write(mp4_file_pos, (kal_uint8 *)file_creat_struct->VOS_ptr, file_creat_struct->VOS_length, real_meta_file);
//mp4_file_pos += file_creat_struct->VOS_length;
}
else
{
mp4_crt_write_int(mp4_file_pos, 0x000001B0, real_meta_file);
mp4_crt_write_int(mp4_file_pos, 0x01000001, real_meta_file);
mp4_crt_write_short(mp4_file_pos, 0xB509, real_meta_file);
mp4_crt_write(mp4_file_pos, (kal_uint8 *)file_creat_struct->VOS_ptr, (file_creat_struct->VOS_length - 10), real_meta_file);
//mp4_file_pos += (file_creat_struct->VOS_length-10);
}
mp4_crt_write_int(mp4_file_pos, 0x06808080, real_meta_file); //DESC 6
mp4_crt_write_char(mp4_file_pos, 0x01, real_meta_file); //length
mp4_crt_write_char(mp4_file_pos, 0x02, real_meta_file);
video_file_info->FC_ATOM[mp4v].size = mp4_file_pos - video_file_info->FC_ATOM[mp4v].pos;
}
else
{
video_file_info->FC_ATOM[mp4v].pos = 0xffffffff;
video_file_info->FC_ATOM[s263].pos = mp4_file_pos;
mp4_crt_write_int(mp4_file_pos, 0, real_meta_file); //<==position??
mp4_crt_write_char_group(mp4_file_pos, "s263", 4, real_meta_file);
mp4_crt_write_int(mp4_file_pos, 0x0, real_meta_file);
mp4_crt_write_int(mp4_file_pos, 0x1, real_meta_file);
mp4_crt_write_zero_group(mp4_file_pos, 16, real_meta_file);
mp4_crt_write_short(mp4_file_pos, ((kal_uint16)file_creat_struct->frame_width), real_meta_file);
mp4_crt_write_short(mp4_file_pos, ((kal_uint16)file_creat_struct->frame_height), real_meta_file);
mp4_crt_write_int(mp4_file_pos, 0x480000, real_meta_file);
mp4_crt_write_int(mp4_file_pos, 0x480000, real_meta_file);
mp4_crt_write_int(mp4_file_pos, 0x0, real_meta_file);
mp4_crt_write_short(mp4_file_pos, 0x1, real_meta_file);
mp4_crt_write_zero_group(mp4_file_pos, 32, real_meta_file);
mp4_crt_write_short(mp4_file_pos, 24, real_meta_file);
mp4_crt_write_short(mp4_file_pos, 0xFFFF, real_meta_file);
mp4_crt_write_int(mp4_file_pos, 0xF, real_meta_file);
mp4_crt_write_char_group(mp4_file_pos, "d263MTK ", 8, real_meta_file);
mp4_crt_write_short(mp4_file_pos, 0x0a, real_meta_file);
mp4_crt_write_char(mp4_file_pos, 0x0, real_meta_file);
video_file_info->FC_ATOM[s263].size = mp4_file_pos - video_file_info->FC_ATOM[s263].pos;
}
video_file_info->FC_ATOM[stsd].size = mp4_file_pos - video_file_info->FC_ATOM[stsd].pos;
/** stts **/
video_file_info->FC_ATOM[stts].pos = mp4_file_pos;
mp4_crt_write_int(mp4_file_pos, 0x0, real_meta_file); //<==position??
mp4_crt_write_char_group(mp4_file_pos, "stts", 4, real_meta_file);
mp4_crt_write_int(mp4_file_pos, 0x0, real_meta_file); //version, flags
stts_entry_addr = mp4_file_pos;
mp4_crt_write_int(mp4_file_pos, file_creat_struct->frame_number - 1, real_meta_file); //number of entries
result = mpeg4_get_frame_timestamp_from_meta_file(0, file_creat_struct->VOS_length, &temp);
if (result != MEDIA_STATUS_OK)
{
VIDEO_ASSERT(0);
return result;
}
#if 0 //Jensen's comment, it is unnecessary in MT6228 environment.
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
#endif
temp_prev = temp;
stts_time = 0;
stts_count = 0;
stts_entry_count = 0;
pre_duration = 0;
if (file_creat_struct->frame_number == 1)
{
stts_entry_count++;
mp4_crt_write_int(mp4_file_pos, file_creat_struct->frame_number, real_meta_file); /*tricky for special case*/
mp4_crt_write_int(mp4_file_pos, 500, real_meta_file);
}
else
{
for (i = 0; i < file_creat_struct->frame_number - 1; i++)
{
result = mpeg4_get_frame_timestamp_from_meta_file(i + 1, file_creat_struct->VOS_length, &temp);
if (result != MEDIA_STATUS_OK)
{
VIDEO_ASSERT(0);
return result;
}
#if 1
stts_time = temp - temp_prev;
if ((stts_time & 0xf0000000) != 0) /*impossible happen, if happen, fix tricky bug,*/
stts_time = pre_duration;
if (i < file_creat_struct->frame_number - 2)
{
if (stts_time == pre_duration)
stts_count++;
else
{
if (i != 0)
{
stts_entry_count++;
mp4_crt_write_int(mp4_file_pos, (stts_count + 1), real_meta_file);
mp4_crt_write_int(mp4_file_pos, pre_duration, real_meta_file);
stts_count = 0;
}
}
}
else
{
if (file_creat_struct->frame_number > 2)
{
stts_entry_count += 2;
mp4_crt_write_int(mp4_file_pos, (stts_count + 1), real_meta_file);
mp4_crt_write_int(mp4_file_pos, pre_duration, real_meta_file);
mp4_crt_write_int(mp4_file_pos, 2, real_meta_file);
mp4_crt_write_int(mp4_file_pos, stts_time, real_meta_file);
stts_count = 0;
}
else
{
stts_entry_count++;
mp4_crt_write_int(mp4_file_pos, file_creat_struct->frame_number, real_meta_file); /*tricky for special case*/
mp4_crt_write_int(mp4_file_pos, stts_time, real_meta_file);
break;
}
}
pre_duration = stts_time;
#else
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
#endif
temp_prev = temp;
}
}
video_file_info->FC_ATOM[stts].size = mp4_file_pos - video_file_info->FC_ATOM[stts].pos;
/** stsc **/
video_file_info->FC_ATOM[stsc].pos = mp4_file_pos;
mp4_crt_write_int(mp4_file_pos, 0x0, real_meta_file); //<==position??
mp4_crt_write_char_group(mp4_file_pos, "stsc", 4, real_meta_file);
mp4_crt_write_int(mp4_file_pos, 0x0, real_meta_file); //version, flag
if (((file_creat_struct->frame_number % file_creat_struct->frame_rate) != 0) && (file_creat_struct->frame_number > file_creat_struct->frame_rate))
{
kal_uint32 div;
mp4_crt_write_int(mp4_file_pos, 2, real_meta_file); /* number of entries */
mp4_crt_write_int(mp4_file_pos, 1, real_meta_file);
mp4_crt_write_int(mp4_file_pos, file_creat_struct->frame_rate, real_meta_file);
mp4_crt_write_int(mp4_file_pos, 1, real_meta_file);
div = (file_creat_struct->frame_number / file_creat_struct->frame_rate);
mp4_crt_write_int(mp4_file_pos, (div + 1), real_meta_file);
mp4_crt_write_int(mp4_file_pos, (file_creat_struct->frame_number - file_creat_struct->frame_rate * div), real_meta_file);
mp4_crt_write_int(mp4_file_pos, 1, real_meta_file);
}
else
{
mp4_crt_write_int(mp4_file_pos, 1, real_meta_file);
mp4_crt_write_int(mp4_file_pos, 1, real_meta_file);
mp4_crt_write_int(mp4_file_pos, file_creat_struct->frame_rate, real_meta_file);
mp4_crt_write_int(mp4_file_pos, 1, real_meta_file);
}
video_file_info->FC_ATOM[stsc].size = mp4_file_pos - video_file_info->FC_ATOM[stsc].pos;
/** stsz **/
mp4_crt_write_int(mp4_file_pos, (file_creat_struct->frame_number * 4) + 20, real_meta_file);
mp4_crt_write_char_group(mp4_file_pos, "stsz", 4, real_meta_file);
mp4_crt_write_zero_group(mp4_file_pos, 8, real_meta_file); /* version, sample size ? */
mp4_crt_write_int(mp4_file_pos, file_creat_struct->frame_number, real_meta_file);
for (i = 0; i < file_creat_struct->frame_number; i++)
{
result = mpeg4_get_frame_length_from_meta_file(i, file_creat_struct->VOS_length, &length_tmp);
if (result != MEDIA_STATUS_OK)
{
VIDEO_ASSERT(0);
return result;
}
mp4_crt_write_int(mp4_file_pos, length_tmp, real_meta_file);
}
/** stco **/
temp = (file_creat_struct->frame_number / file_creat_struct->frame_rate);
if (file_creat_struct->frame_number % file_creat_struct->frame_rate)
temp++;
mp4_crt_write_int(mp4_file_pos, (temp * 4 + 16), real_meta_file);
mp4_crt_write_char_group(mp4_file_pos, "stco", 4, real_meta_file);
mp4_crt_write_int(mp4_file_pos, 0, real_meta_file); /* version,flags */
if (file_creat_struct->frame_number % file_creat_struct->frame_rate)
{
mp4_crt_write_int(mp4_file_pos, (file_creat_struct->frame_number / file_creat_struct->frame_rate) + 1, real_meta_file); //chunk number
}
else
{
mp4_crt_write_int(mp4_file_pos, (file_creat_struct->frame_number / file_creat_struct->frame_rate), real_meta_file);
}
temp = 0x020;
for (i = 0; i < file_creat_struct->frame_number; i++)
{
if (i % ((int)file_creat_struct->frame_rate) == 0)
{
mp4_crt_write_int(mp4_file_pos, temp, real_meta_file);
}
result = mpeg4_get_frame_length_from_meta_file(i, file_creat_struct->VOS_length, &length_tmp);
if (result != MEDIA_STATUS_OK)
{
VIDEO_ASSERT(0);
return result;
}
temp += length_tmp;
}
/** stss **/
temp = (file_creat_struct->frame_number / Video_Enc_IntraPeriod);
if (temp == 0)
temp = 1;
#if 0
/* under construction !*/
/* under construction !*/
#endif
mp4_crt_write_int(mp4_file_pos, (temp * 4 + 16), real_meta_file);
mp4_crt_write_char_group(mp4_file_pos, "stss", 4, real_meta_file);
mp4_crt_write_int(mp4_file_pos, 0, real_meta_file); /* version,flags */
mp4_crt_write_int(mp4_file_pos, temp, real_meta_file); /* number of entries */
for (i = 0; i < temp; i++)
{
mp4_crt_write_int(mp4_file_pos, i * Video_Enc_IntraPeriod + 1, real_meta_file);
}
#if 0
/* under construction !*/
/* under construction !*/
#endif
g_video_enc_status.FSAL_STATUS = FSAL_Write_UINT_AT(real_meta_file, stts_entry_count, stts_entry_addr);
if (g_video_enc_status.FSAL_STATUS != FSAL_OK)
{
VIDEO_ASSERT(0);
g_video_enc_status.FSAL_ERROR_FILE = real_meta_file;
return FSAL_ERROR;
}
video_file_info->FC_ATOM[stbl].size = mp4_file_pos - video_file_info->FC_ATOM[stbl].pos;
video_file_info->FC_ATOM[minf].size = mp4_file_pos - video_file_info->FC_ATOM[minf].pos;
video_file_info->FC_ATOM[mdia].size = mp4_file_pos - video_file_info->FC_ATOM[mdia].pos;
video_file_info->FC_ATOM[trak].size = mp4_file_pos - video_file_info->FC_ATOM[trak].pos;
//Only video trak size
video_file_info->FC_ATOM[moov].size = mp4_file_pos - video_file_info->FC_ATOM[moov].pos;
// FSAL_Direct_SetRamFileSize(real_meta_file, mp4_file_pos);
temp = mp4_file_pos;
for (i = 0; i < MAX_ATOM_TYPE_NUMBER; i++)
{
if (video_file_info->FC_ATOM[i].pos != 0xffffffff)
{
g_video_enc_status.FSAL_STATUS = FSAL_Write_UINT_AT(real_meta_file, video_file_info->FC_ATOM[i].size, video_file_info->FC_ATOM[i].pos);
if (g_video_enc_status.FSAL_STATUS != FSAL_OK)
{
VIDEO_ASSERT(0);
g_video_enc_status.FSAL_ERROR_FILE = real_meta_file;
return FSAL_ERROR;
}
}
}
return MEDIA_STATUS_OK;
}
#else /*!MP4_CODEC*/
#include "drv_comm.h"
#endif /*MP4_CODEC*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -