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

📄 vis_msg_handler.c

📁 最新MTK手机软件源码
💻 C
📖 第 1 页 / 共 5 页
字号:
    kal_bool video_real_meta_file_open = KAL_FALSE;
    kal_bool audio_file_open = KAL_FALSE;
    kal_bool audio_meta_file_open = KAL_FALSE;
    MP4_FILE_CREATE_STRUCT file_struct;
    kal_int16 result;
    MEDIA_STATUS_CODE status;
    kal_int32 attribute;
    FS_HANDLE file_handle;

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    vis_read_file_path(med_v_context_p->current_file_name);
    vis_read_file_path(med_v_context_p->storing_path);
    /* Jensen add */
    kal_mem_cpy(med_v_context_p->storing_path2, med_v_context_p->storing_path, MAX_FILE_NAME_LEN * 2);
    // If power off abnormal at the below procedure, med task can't recovery these conditions.
    // Therefore, delete "z:\\video_file.ini" first!!
    FS_Rename((kal_wchar*) VID_INIT_FILE, (kal_wchar*) VID_DUMMY_INIT_FILE);
    FS_Delete((kal_wchar*) VID_INIT_FILE);

    /* Log disc info for debugging */
    drive[0] = med_v_context_p->storing_path[0];
    FS_GetDiskInfo(drive, &disc_info, FS_DI_BASIC_INFO| FS_DI_FREE_SPACE);
    cluster_size = disc_info.BytesPerSector * disc_info.SectorsPerCluster;
    kal_prompt_trace(MOD_MED, "Free cluster=%d, cluster size= %d, line= %d", disc_info.FreeClusters, cluster_size,__LINE__);
    /* Open video file */
    med_remove_file_name(med_v_context_p->storing_path);
    kal_wstrcat(med_v_context_p->storing_path, VID_VISUAL_FILE);

    eFSALRet = FSAL_Open(&mp4_files.MEDIA_VIDEO_FILE, (void*)med_v_context_p->storing_path, FSAL_APPEND);
    if (eFSALRet != FSAL_OK)
    {
        result = vid_get_result_from_fsal_error(FSAL_GetLastError(&mp4_files.MEDIA_VIDEO_FILE));
        VID_FSAL_ERROR_TRACE(eFSALRet, __LINE__);
        goto merge_error;
    }
    video_file_open = KAL_TRUE;
    /* Open meta file */
    med_remove_file_name(med_v_context_p->storing_path);
    kal_wstrcat(med_v_context_p->storing_path, VID_VISUAL_META_FILE);
    eFSALRet = FSAL_Open(&mp4_files.MEDIA_META_FILE, (void*)med_v_context_p->storing_path, FSAL_APPEND);
    if (eFSALRet != FSAL_OK)
    {
        result = vid_get_result_from_fsal_error(FSAL_GetLastError(&mp4_files.MEDIA_META_FILE));
        VID_FSAL_ERROR_TRACE(eFSALRet, __LINE__);
        goto merge_error;
    }
    video_meta_file_open = KAL_TRUE;
    FSAL_SetBuffer(&mp4_files.MEDIA_META_FILE, (kal_uint32) sizeof(buffer_enc_tmp), (kal_uint8*) buffer_enc_tmp);

    /* Open Audio file */
    med_remove_file_name(med_v_context_p->storing_path);
    kal_wstrcat(med_v_context_p->storing_path, VID_AUDIO_FILE);
    eFSALRet = FSAL_Open(&fsalAudioFile, (void*)med_v_context_p->storing_path, FSAL_READ);
    if (eFSALRet == FSAL_OK)
    {
        audio_file_exist = KAL_TRUE;
        FSAL_Close(&fsalAudioFile);
    }
    else
    {
        audio_file_exist = KAL_FALSE;
    }

    /* check video real meta file exist */
    med_remove_file_name(med_v_context_p->storing_path);
    kal_wstrcat(med_v_context_p->storing_path, VID_VISUAL_REAL_META_FILE);
    eFSALRet = FSAL_Open(&mp4_files.REAL_META_FILE, (void*)med_v_context_p->storing_path, FSAL_READ);
    if (eFSALRet == FSAL_OK)
    {
        video_real_meta_file_exist = KAL_TRUE;
        FSAL_Close(&mp4_files.REAL_META_FILE);
    }
    else
    {
        video_real_meta_file_exist = KAL_FALSE;
    }

    /* Video video file/meta file ready */

    /* Create video real meta file */
    {
        t_rtc rtctime;

        file_struct.temp_video_size = 0;

        status = video_enc_get_timescale(&mp4_files.MEDIA_META_FILE, &file_struct.time_scale);
        if (status != MEDIA_STATUS_OK)
        {
            VID_VIS_ERROR_TRACE(status, __LINE__);
            result = vid_get_result_from_media_status(status);
            if (result == MED_RES_FSAL_ERROR)
            {
                result = vid_get_result_from_fsal_error(FSAL_GetLastError(&mp4_files.MEDIA_META_FILE));
            }
            goto merge_error;
        }
        status = video_enc_get_type(&mp4_files.MEDIA_META_FILE, &file_struct.short_header);
        if (status != MEDIA_STATUS_OK)
        {
            VID_VIS_ERROR_TRACE(status, __LINE__);
            result = vid_get_result_from_media_status(status);
            if (result == MED_RES_FSAL_ERROR)
            {
                result = vid_get_result_from_fsal_error(FSAL_GetLastError(&mp4_files.MEDIA_META_FILE));
            }
            goto merge_error;
        }
        RTC_GetTime(&rtctime);
        file_struct.create_time = mpeg4_cratetime_translate(&rtctime);
        file_struct.total_duration = 0;
        status = video_enc_get_frame_size(&mp4_files.MEDIA_META_FILE, &file_struct.frame_width, &file_struct.frame_height);
        if (status != MEDIA_STATUS_OK)
        {
            VID_VIS_ERROR_TRACE(status, __LINE__);
            result = vid_get_result_from_media_status(status);
            if (result == MED_RES_FSAL_ERROR)
            {
                result = vid_get_result_from_fsal_error(FSAL_GetLastError(&mp4_files.MEDIA_META_FILE));
            }
            goto merge_error;
        }
        status = video_enc_get_framerate(&mp4_files.MEDIA_META_FILE, &file_struct.frame_rate);
        if (status != MEDIA_STATUS_OK)
        {
            VID_VIS_ERROR_TRACE(status, __LINE__);
            result = vid_get_result_from_media_status(status);
            if (result == MED_RES_FSAL_ERROR)
            {
                result = vid_get_result_from_fsal_error(FSAL_GetLastError(&mp4_files.MEDIA_META_FILE));
            }
            goto merge_error;
        }
        status = video_enc_get_vos_length(&mp4_files.MEDIA_META_FILE, &file_struct.VOS_length);
        if (status != MEDIA_STATUS_OK)
        {
            VID_VIS_ERROR_TRACE(status, __LINE__);
            result = vid_get_result_from_media_status(status);
            if (result == MED_RES_FSAL_ERROR)
            {
                result = vid_get_result_from_fsal_error(FSAL_GetLastError(&mp4_files.MEDIA_META_FILE));
            }
            goto merge_error;
        }

        if (file_struct.short_header == 0)
        {
            ASSERT(file_struct.VOS_length <= 60);
            file_struct.VOS_ptr = test_vos_data;
            status = video_enc_get_vos_data(test_vos_data, file_struct.VOS_length, &mp4_files.MEDIA_META_FILE);
        }
        status = video_enc_get_totalframes(
                    &mp4_files.MEDIA_VIDEO_FILE,
                    &mp4_files.MEDIA_META_FILE,
                    &file_struct,
                    &file_struct.frame_number);
        if (status != MEDIA_STATUS_OK)
        {
            VID_VIS_ERROR_TRACE(status, __LINE__);
            result = vid_get_result_from_media_status(status);
            if (result == MED_RES_FSAL_ERROR)
            {
                result = vid_get_result_from_fsal_error(FSAL_GetLastError(&mp4_files.MEDIA_VIDEO_FILE));
            }
            goto merge_error;
        }

        eFSALRet = FSAL_GetFileSize(&mp4_files.MEDIA_VIDEO_FILE, &video_file_size);
        if (eFSALRet != FSAL_OK)
        {
            result = vid_get_result_from_fsal_error(FSAL_GetLastError(&mp4_files.MEDIA_VIDEO_FILE));
            VID_FSAL_ERROR_TRACE(eFSALRet, __LINE__);
            goto merge_error;
        }
        status = video_enc_get_mdatsz_pos(&mp4_files.MEDIA_META_FILE, &video_mdatsz_pos);
        if (status != MEDIA_STATUS_OK)
        {
            VID_VIS_ERROR_TRACE(status, __LINE__);
            result = vid_get_result_from_media_status(status);
            if (result == MED_RES_FSAL_ERROR)
            {
                result = vid_get_result_from_fsal_error(FSAL_GetLastError(&mp4_files.MEDIA_META_FILE));
            }
            goto merge_error;
        }

        if (audio_file_exist != KAL_TRUE && video_real_meta_file_exist == KAL_TRUE)
        {
            eFSALRet = FSAL_Seek(&mp4_files.MEDIA_VIDEO_FILE, video_mdatsz_pos);
            if (eFSALRet != FSAL_OK)
            {
                result = vid_get_result_from_fsal_error(FSAL_GetLastError(&mp4_files.MEDIA_VIDEO_FILE));
                VID_FSAL_ERROR_TRACE(eFSALRet, __LINE__);
                goto merge_error;
            }
            /* Maybe some wrong bitstream will be include, because the characteristics of PS_Merge. */
            eFSALRet = FSAL_Read_UINT(&mp4_files.MEDIA_VIDEO_FILE, &file_struct.temp_video_size);
            if (eFSALRet != FSAL_OK)
            {
                result = vid_get_result_from_fsal_error(FSAL_GetLastError(&mp4_files.MEDIA_VIDEO_FILE));
                VID_FSAL_ERROR_TRACE(eFSALRet, __LINE__);
                goto merge_error;
            }
            status = video_enc_get_totalframes(
                        &mp4_files.MEDIA_VIDEO_FILE,
                        &mp4_files.MEDIA_META_FILE,
                        &file_struct,
                        &file_struct.frame_number);
            if (status != MEDIA_STATUS_OK)
            {
                VID_VIS_ERROR_TRACE(status, __LINE__);
                result = vid_get_result_from_media_status(status);
                if (result == MED_RES_FSAL_ERROR)
                {
                    result = vid_get_result_from_fsal_error(FSAL_GetLastError(&mp4_files.MEDIA_VIDEO_FILE));
                }
                goto merge_error;
            }
        }

        if (vid_context_p->use_pseudo_merge)
        {
            video_file_size = ((video_file_size + cluster_size - 1) / cluster_size) * cluster_size;
            eFSALRet = FSAL_Write_UINT_AT(
                        &mp4_files.MEDIA_VIDEO_FILE,
                        video_file_size - video_mdatsz_pos,
                        video_mdatsz_pos);
        }
        else
        {
            eFSALRet = FSAL_Write_UINT_AT(
                        &mp4_files.MEDIA_VIDEO_FILE,
                        video_file_size - video_mdatsz_pos,
                        video_mdatsz_pos);
        }
        if (eFSALRet != FSAL_OK)
        {
            result = vid_get_result_from_fsal_error(FSAL_GetLastError(&mp4_files.MEDIA_VIDEO_FILE));
            VID_FSAL_ERROR_TRACE(eFSALRet, __LINE__);
            goto merge_error;
        }
        FS_Commit(mp4_files.MEDIA_VIDEO_FILE.hFile);

        /* Create REAL_META FILE */
        med_remove_file_name(med_v_context_p->storing_path);
        kal_wstrcat(med_v_context_p->storing_path, VID_VISUAL_REAL_META_FILE);

        if ((vid_context_p->file_handle = FS_Open(med_v_context_p->storing_path, VID_TEMP_FILE_ATTRIBUTES)) < 0)
        {
            if (vid_context_p->file_handle == FS_WRITE_PROTECTION)
            {
                result = MED_RES_WRITE_PROTECTION;
            }
            else
            {
                result = MED_RES_OPEN_FILE_FAIL;
            }
            goto merge_error;
        }
        video_real_meta_file_open = KAL_TRUE;
        eFSALRet = FSAL_Open_WithHandle(&mp4_files.REAL_META_FILE, (void*)vid_context_p->file_handle);
        if (eFSALRet != FSAL_OK)
        {
            result = vid_get_result_from_fsal_error(FSAL_GetLastError(&mp4_files.REAL_META_FILE));
            VID_FSAL_ERROR_TRACE(eFSALRet, __LINE__);
            goto merge_error;
        }
        FSAL_SetBuffer(
            &mp4_files.REAL_META_FILE,
            (kal_uint32) sizeof(buffer_enc_real_meta_tmp),
            (kal_uint8*) buffer_enc_real_meta_tmp);

        status = video_enc_generate_META_file(&file_struct, &mp4_files.REAL_META_FILE, &video_file_info);
        if (status != MEDIA_STATUS_OK)
        {
            VID_VIS_ERROR_TRACE(status, __LINE__);
            result = vid_get_result_from_media_status(status);
            if (result == MED_RES_FSAL_ERROR)
            {
                result = vid_get_result_from_fsal_error(FSAL_GetLastError(&mp4_files.REAL_META_FILE));
            }
            goto merge_error;
        }

        FSAL_Close(&mp4_files.MEDIA_VIDEO_FILE);
        video_file_open = KAL_FALSE;
    }

    if ((vid_context_p->use_pseudo_merge == KAL_FALSE) && (audio_file_exist == KAL_TRUE))
    {
        kal_uint32 result_bytes;
        MP4_Producer_Status AudioProducerStat;

        med_remove_file_name(med_v_context_p->storing_path);
        kal_wstrcat(med_v_context_p->storing_path, VID_AUDIO_FILE);

        eFSALRet = FSAL_Open(&fsalAudioFile, (void*)med_v_context_p->storing_path, FSAL_READ);
        if (eFSALRet != FSAL_OK)
        {
            result = vid_get_result_from_fsal_error(FSAL_GetLastError(&fsalAudioFile));
            VID_FSAL_ERROR_TRACE(eFSALRet, __LINE__);
            goto merge_error;
        }
        audio_file_open = KAL_TRUE;

        AudioProducerStat = MP4_Produce_CalculateLimitedAudioFileSize(
                                &fsalAudioFile,
                                (kal_uint32) video_file_size,
                                (kal_uint32) file_struct.total_duration,
                                0,  /* 0: AMR 1: WB-AMR */
                                &result_bytes);
        if (AudioProducerStat != MP4_PRODUCER_OK)
        {
            result = MED_RES_AUDIO_ERROR;
            VID_AUD_ERROR_TRACE(AudioProducerStat, __LINE__);
            goto merge_error;
        }

        eFSALRet = FSAL_Direct_Seek(&fsalAudioFile, result_bytes);
        if (eFSALRet != FSAL_OK)
        {
            result = vid_get_result_from_fsal_error(FSAL_GetLastError(&fsalAudioFile));
            VID_FSAL_ERROR_TRACE(eFSALRet, __LINE__);
            goto merge_error;
        }
        FS_Truncate(fsalAudioFile.hFile);
        FSAL_Close(&fsalAudioFile);
        audio_file_open = KAL_FALSE;
    }

    /* Create audio real meta file */
    if (audio_file_exist == KAL_TRUE)   /* Audio file exist */
    {
        kal_uint32 audio_sample_count;

        med_remove_file_name(med_v_context_p->storing_path);
        kal_wstrcat(med_v_context_p->storing_path, VID_AUDIO_FILE);
        eFSALRet = FSAL_Open(&fsalAudioFile, (void*)med_v_context_p->storing_path, FSAL_APPEND);
        if (eFSALRet != FSAL_OK)
        {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -