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

📄 vid_avi.c

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