⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 video_file_creator.c

📁 最新MTK手机软件源码
💻 C
📖 第 1 页 / 共 4 页
字号:
        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 + -