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

📄 vid_avi.c

📁 最新MTK手机软件源码
💻 C
📖 第 1 页 / 共 5 页
字号:
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    kal_prompt_trace(MOD_MED, "[MED AVI] med_avi_toggle_data_buffer()");

    if (med_avi_p->act_data_buf_id == 0)
    {
        /* make sure next chunk buffer is clear - data has been flushed to fs */
        ASSERT(med_avi_p->data_written[1] == 0);

        med_avi_p->act_data_buf_id = 1;
    }
    else
    {
        /* make sure next chunk buffer is clear - data has been flushed to fs */
        ASSERT(med_avi_p->data_written[0] == 0);

        med_avi_p->act_data_buf_id = 0;
    }

}


/*****************************************************************************
 * FUNCTION
 *  med_avi_toggle_idx_buffer
 * DESCRIPTION
 *  
 * PARAMETERS
 *  void
 * RETURNS
 *  void
 *****************************************************************************/
void med_avi_toggle_idx_buffer(void)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    kal_prompt_trace(MOD_MED, "[MED AVI] med_avi_toggle_idx_buffer()");

    if (med_avi_p->act_idx_buf_id == 0)
    {
        /* make sure next idx buffer is clear - data has been flushed to fs */
        ASSERT(med_avi_p->idx_written[1] == 0);

        med_avi_p->act_idx_buf_id = 1;
    }
    else
    {
        /* make sure next idx buffer is clear - data has been flushed to fs */
        ASSERT(med_avi_p->idx_written[0] == 0);

        med_avi_p->act_idx_buf_id = 0;
    }
}


/*****************************************************************************
 * FUNCTION
 *  med_avi_dump_data_buffer_to_file
 * DESCRIPTION
 *  
 * PARAMETERS
 *  void
 * RETURNS
 *  
 *****************************************************************************/
kal_int32 med_avi_dump_data_buffer_to_file(void)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
    kal_uint32 written;
    kal_int32 fs_ret;
    kal_int32 idx;

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    kal_prompt_trace(MOD_MED, "[MED AVI] med_avi_dump_data_buffer_to_file()");
    ASSERT(med_avi_p->data_h != 0);

    if (med_avi_p->act_data_buf_id == 0)
    {
        idx = 1;
    }
    else
    {
        idx = 0;
    }

    fs_ret = FS_Write(med_avi_p->data_h, (void*)med_avi_p->data_buf_p[idx], med_avi_p->data_written[idx], &written);

    if (fs_ret < 0) /* !FS_NO_ERROR */
    {
        kal_prompt_trace(MOD_MED, "[MED AVI] ret: MED_RES_ERROR");
        kal_prompt_trace(MOD_MED, "[MED AVI] fs error: %d", fs_ret);        
        med_avi_p->data_written[idx] = 0;                
        return MED_RES_ERROR;
    }

    if (written != med_avi_p->data_written[idx])
    {
        kal_prompt_trace(MOD_MED, "[MED AVI] ret: MED_RES_NOT_ENOUGH_SPACE");
        med_avi_p->data_written[idx] = 0;        
        return MED_RES_NOT_ENOUGH_SPACE;
    }

    kal_prompt_trace(MOD_MED, "[MED AVI] ret: MED_RES_OK");
    med_avi_p->data_written[idx] = 0;    
    return MED_RES_OK;
}


/*****************************************************************************
 * FUNCTION
 *  med_avi_dump_idx_buffer_to_file
 * DESCRIPTION
 *  
 * PARAMETERS
 *  void
 * RETURNS
 *  
 *****************************************************************************/
kal_int32 med_avi_dump_idx_buffer_to_file(void)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
    kal_uint32 written;
    kal_int32 fs_ret;
    kal_int32 idx;

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    kal_prompt_trace(MOD_MED, "[MED AVI] med_avi_dump_idx_buffer_to_file()");
    ASSERT(med_avi_p->idx_h != 0);

    if (med_avi_p->act_idx_buf_id == 0)
    {
        idx = 1;
    }
    else
    {
        idx = 0;
    }

    fs_ret = FS_Write(med_avi_p->idx_h, (void*)med_avi_p->idx_buf_p[idx], med_avi_p->idx_written[idx], &written);

    if (fs_ret < 0) /* !FS_NO_ERROR */
    {
        kal_prompt_trace(MOD_MED, "[MED AVI] ret: MED_RES_ERROR");
        med_avi_p->idx_written[idx] = 0;            
        return MED_RES_ERROR;
    }

    if (written != med_avi_p->idx_written[idx])
    {
        kal_prompt_trace(MOD_MED, "[MED AVI] ret: MED_RES_NOT_ENOUGH_SPACE");
        med_avi_p->idx_written[idx] = 0;            
        return MED_RES_NOT_ENOUGH_SPACE;
    }

    kal_prompt_trace(MOD_MED, "[MED AVI] ret: MED_RES_OK");
    med_avi_p->idx_written[idx] = 0;    
    return MED_RES_OK;
}


/*****************************************************************************
 * FUNCTION
 *  med_avi_is_active_data_buf_sufficient
 * DESCRIPTION
 *  
 * PARAMETERS
 *  req_size        [IN]        
 * RETURNS
 *  
 *****************************************************************************/
kal_int32 med_avi_is_active_data_buf_sufficient(kal_int32 req_size)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
    kal_int32 remain_buf;

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    kal_prompt_trace(MOD_MED, "[MED AVI] med_avi_is_active_data_buf_sufficient()");

    remain_buf = MED_AVI_WRITE_DATA_BUF_SIZE - med_avi_p->data_written[med_avi_p->act_data_buf_id];

    /* 
     * when write data chunk, we will write 4 byte of 00db or 01wb 
     * and 4 byte of chunk size, so we need add 8 byte to  req buffer size 
     */
    
    if (remain_buf <= (req_size+8))
    {
        kal_prompt_trace(MOD_MED, "[MED AVI] ret: MED_RES_BUFFER_INSUFFICIENT");
        return MED_RES_BUFFER_INSUFFICIENT;
    }
    else
    {
        kal_prompt_trace(MOD_MED, "[MED AVI] ret: MED_RES_OK");
        return MED_RES_OK;
    }
}


/*****************************************************************************
 * FUNCTION
 *  med_avi_is_active_idx_buf_sufficient
 * DESCRIPTION
 *  
 * PARAMETERS
 *  void
 * RETURNS
 *  
 *****************************************************************************/
kal_int32 med_avi_is_active_idx_buf_sufficient(void)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
    kal_int32 remain_buf;

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    kal_prompt_trace(MOD_MED, "[MED AVI] med_avi_is_active_idx_buf_sufficient()");

    remain_buf = MED_AVI_WRITE_IDX_BUF_SIZE - med_avi_p->idx_written[med_avi_p->act_idx_buf_id];

    if (remain_buf <= sizeof(med_avi_index_struct))
    {
        kal_prompt_trace(MOD_MED, "[MED AVI] ret: MED_RES_BUFFER_INSUFFICIENT");
        return MED_RES_BUFFER_INSUFFICIENT;
    }
    else
    {
        kal_prompt_trace(MOD_MED, "[MED AVI] ret: MED_RES_OK");
        return MED_RES_OK;
    }
}


/*****************************************************************************
 * FUNCTION
 *  med_avi_write_video_frame
 * DESCRIPTION
 *  
 * PARAMETERS
 *  data_p      [?]         
 *  len         [IN]        
 * RETURNS
 *  
 *****************************************************************************/
kal_int32 med_avi_write_video_frame(kal_char *data_p, kal_uint32 len)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
    kal_char *data_buf_p;
    kal_char *idx_buf_p;
    kal_uint32 size;
    med_avi_index_struct idx_data;

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    kal_prompt_trace(MOD_MED, "[MED AVI] med_avi_write_video_frame()");
    kal_prompt_trace(MOD_MED, "[MED AVI] write: %d", len);

    /* video data */
    /* 00db, size, raw data */
    /* 4     4     ... */

    size = len;

    data_buf_p = med_avi_p->data_buf_p[med_avi_p->act_data_buf_id];
    data_buf_p += med_avi_p->data_written[med_avi_p->act_data_buf_id];
    memcpy(data_buf_p, &("00db"), 4);
    data_buf_p += 4;
    memcpy(data_buf_p, &size, 4);
    data_buf_p += 4;
    memcpy(data_buf_p, data_p, len);

    /* write idx */
    memcpy(&idx_data.chunk_id, &("00db"), 4);

    idx_data.flag = 0;
    idx_data.chunk_offset = med_avi_p->total_av_data_written + med_avi_p->av_data_offset;
    idx_data.chunk_lenght = len;

    idx_buf_p = med_avi_p->idx_buf_p[med_avi_p->act_idx_buf_id];
    idx_buf_p += med_avi_p->idx_written[med_avi_p->act_idx_buf_id];

    memcpy(idx_buf_p, &idx_data, sizeof(med_avi_index_struct));

    med_avi_p->idx_written[med_avi_p->act_idx_buf_id] += sizeof(med_avi_index_struct);

    /* calc next start pos */
    med_avi_p->data_written[med_avi_p->act_data_buf_id] += len + 8;     /* data witten in this act buf */
    med_avi_p->total_av_data_written += len + 8;    /* data written from data chunk start, no include movi tag */

    med_avi_p->vid_frame_count++;

    kal_prompt_trace(MOD_MED, "[MED AVI] ret: MED_RES_OK");
    return MED_RES_OK;
}


/*****************************************************************************
 * FUNCTION
 *  med_avi_write_audio_data
 * DESCRIPTION
 *  
 * PARAMETERS
 *  data_p      [?]         
 *  len         [IN]        
 * RETURNS
 *  
 *****************************************************************************/
kal_int32 med_avi_write_audio_data(kal_char *data_p, kal_uint32 len)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/
    kal_char *data_buf_p;
    kal_char *idx_buf_p;
    kal_uint32 size;
    med_avi_index_struct idx_data;

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    kal_prompt_trace(MOD_MED, "[MED AVI] med_avi_write_audio_data()");
    kal_prompt_trace(MOD_MED, "[MED AVI] write: %d)", len);

    /* audio data */
    /* 01wb, size, raw data */
    /* 4     4     ... */

    size = len;

    data_buf_p = med_avi_p->data_buf_p[med_avi_p->act_data_buf_id];
    data_buf_p += med_avi_p->data_written[med_avi_p->act_data_buf_id];
    memcpy(data_buf_p, &("01wb"), 4);
    data_buf_p += 4;
    memcpy(data_buf_p, &size, 4);
    data_buf_p += 4;
    memcpy(data_buf_p, data_p, len);

    /* write idx */
    memcpy(&idx_data.chunk_id, &("01wb"), 4)

⌨️ 快捷键说明

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