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

📄 vid_avi.c

📁 最新MTK手机软件源码
💻 C
📖 第 1 页 / 共 5 页
字号:
/*******************************************************************************
 * Filename:
 * ---------
 *   vid_avi.c
 *
 * Project:
 * --------
 *   Maui
 *
 * Description:
 * ------------
 *   This file includes avi related functions of camera module.
 *
 * Author:
 * -------
 * -------
 *
 *==============================================================================
 *             HISTORY
 * Below this line, this part is controlled by PVCS VM. DO NOT MODIFY!! 
 *------------------------------------------------------------------------------
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 * removed!
 * removed!
 * removed!
 *
 *------------------------------------------------------------------------------
 * Upper this line, this part is controlled by PVCS VM. DO NOT MODIFY!! 
 *==============================================================================
 *******************************************************************************/

/* system includes */
#include "kal_release.h"
#include "kal_trace.h"
#include "stack_common.h"
#include "stack_msgs.h"
#include "app_ltlcom.h" /* Task message communiction */
#include "syscomp_config.h"
#include "task_config.h"        /* Task creation */
#include "app_buff_alloc.h"     /* Declaration of buffer management API */
#include "stacklib.h"   /* Basic type for dll, evshed, stacktimer */
#include "event_shed.h" /* Event scheduler */
#include "stack_timer.h"        /* Stack timer */
#include "FSAL.h"
#include "med_main.h"
#include "med_global.h"
#include "med_struct.h"
#include "med_utility.h"
#include "vid_avi.h"
#include "vid_main.h"


/* player */
#define MED_AVI_VID_FSAL_BUF_SIZE       (10*1024)     /* 10k */
#define MED_AVI_AUD_FSAL_BUF_SIZE       (1024)        /* 1k */
#define MED_AVI_FSAL_IDX_BUF_SIZE       (200*1024)    /* 200K */

/* recorder */
#define MED_AVI_WRITE_DATA_BUF_SIZE     (150*1024)    /* 150k */
#define MED_AVI_WRITE_IDX_BUF_SIZE      (5*1024)      /* 5k */
#define MED_AVI_RECORD_TIME_LIMIT       (60)          /* 60 min */
#define MED_AVI_MAX_PARSING_TIME        (1000)        /* 1000*4.615ms~=4.6 sec */


typedef struct
{
    /* parser */
    STFSAL vid_fsal_cntx;
    STFSAL aud_fsal_cntx;

    kal_char *vid_fsal_buf_p;
    kal_char *aud_fsal_buf_p;

    kal_uint32 riff_size;
    kal_uint32 file_header_size;
    kal_uint32 video_meta_size;
    kal_uint32 audio_meta_size;
    kal_uint32 junk_size;

    med_avi_file_header_struct file_header;
    med_avi_stream_header_struct video_stream_header;
    med_avi_stream_header_struct audio_stream_header;

    med_avi_video_format_header_struct video_format_header;
    med_avi_audio_format_header_struct audio_format_header;

    med_avi_index_struct *aud_idx_list_buf_p;
    med_avi_index_struct *vid_idx_list_buf_p;

    /* player */

    /* vid */
    kal_uint32 vid_frame_idx;
    kal_uint32 vid_total_frame;
    kal_uint64 vid_duration;

    /* aud */
    kal_uint32 aud_frame_idx;
    kal_uint32 aud_total_frame;
    kal_uint32 aud_remain_len;  /* remaing data in the segment */
    kal_bool is_valid_aud;

    /* recorder */
    FS_HANDLE data_h;
    FS_HANDLE idx_h;
    kal_uint64 ms_per_frame;
    kal_uint64 time_limit;

    kal_uint8 act_data_buf_id;  /* double buffe, 0 or 1 */
    kal_uint8 act_idx_buf_id;   /* double buffe, 0 or 1 */

    kal_uint32 data_written[2];
    kal_uint32 idx_written[2];

    kal_char *data_buf_p[2];
    kal_char *idx_buf_p[2];

    kal_int32 total_av_data_written;
    kal_int32 aud_len;
    kal_int32 av_data_offset;
    kal_uint32 vid_frame_count;
    
    med_avi_rec_struct rec_data;
} med_avi_cntx_struct;

med_avi_cntx_struct g_med_avi_cntx;
med_avi_cntx_struct *med_avi_p = &g_med_avi_cntx;


#define FETCH_TAG(__buf_p__)                                             \
do{                                                                      \
    ret = FSAL_Read(&med_avi_p->vid_fsal_cntx, (kal_uint8*)__buf_p__, 4);\
    if(ret != FSAL_OK)                                                   \
    {                                                                    \
        error_cause = MED_RES_OPEN_FILE_FAIL;                            \
        goto error;                                                      \
    }                                                                    \
}while(0);

#define FETCH_AND_CHECK_TAG(__buf_p__,__TAG__)                           \
do{                                                                      \
    ret = FSAL_Read(&med_avi_p->vid_fsal_cntx, (kal_uint8*)__buf_p__, 4);\
    if(ret != FSAL_OK)                                                   \
    {                                                                    \
        error_cause = MED_RES_OPEN_FILE_FAIL;                            \
        goto error;                                                      \
    }                                                                    \
    if(strncmp((char*)__buf_p__, (char*)__TAG__, 4) != 0)                \
    {                                                                    \
        error_cause = MED_RES_BAD_FORMAT;                                \
        goto error;                                                      \
    }                                                                    \
}while(0);

#define FETCH_SIZE()                                                       \
do{                                                                        \
    ret = FSAL_Read(&med_avi_p->vid_fsal_cntx, (kal_uint8*)&chunk_size, 4);\
    if(ret != FSAL_OK)                                                     \
    {                                                                      \
        error_cause = MED_RES_OPEN_FILE_FAIL;                              \
        goto error;                                                        \
    }                                                                      \
    ret = FSAL_GetCurPos(&med_avi_p->vid_fsal_cntx, (kal_uint32*)&cur_pos);\
    if(ret != FSAL_OK)                                                     \
    {                                                                      \
        error_cause = MED_RES_OPEN_FILE_FAIL;                              \
        goto error;                                                        \
    }                                                                      \
}while(0);

#define FETCH_DATA(__buf_p__,__size__)                                          \
do{                                                                             \
    ret = FSAL_Read(&med_avi_p->vid_fsal_cntx, (kal_uint8*)__buf_p__, __size__);\
    if(ret != FSAL_OK)                                                          \
    {                                                                           \
        error_cause = MED_RES_OPEN_FILE_FAIL;                                   \
        goto error;                                                             \
    }                                                                           \
}while(0);

#define GOTO_NEXT_CHUNK()                                          \
do{                                                                \
    if(cur_pos+chunk_size >= file_size)                            \
    {                                                              \
       goto parse_finish;                                          \
    }                                                              \
    ret = FSAL_Seek(&med_avi_p->vid_fsal_cntx, cur_pos+chunk_size);\
    if(ret != FSAL_OK)                                             \
    {                                                              \
        error_cause = MED_RES_OPEN_FILE_FAIL;                      \
        goto error;                                                \
    }                                                              \
}while(0);

#define FETCH_AUD_DATA(__buf_p__,__size__)                                      \
do{                                                                             \
    ret = FSAL_Read(&med_avi_p->aud_fsal_cntx, (kal_uint8*)__buf_p__, __size__);\
    if(ret != FSAL_OK)                                                          \
    {                                                                           \
        error_cause = MED_RES_OPEN_FILE_FAIL;                                   \
        goto error;                                                             \
    }                                                                           \
}while(0);

#define MAKE_UPPER(__buf_p__)     \
do{                               \
    kal_char *byte_p;             \
    kal_int32 i;                  \
    byte_p = (kal_char*)__buf_p__;\
    for(i = 0; i < 4; i++)        \
    {                             \
        if (byte_p[i] >= 'a')     \
        {                         \
           byte_p[i] += 'A' - 'a';\
        }                         \
    }                             \
}while(0);

#define IS_TAG_MATCH(__buf_p__,__tag__)\
    (strncmp((char*)__buf_p__, (char*)__tag__, 4) == 0)

#define IS_TAG_NOT_MATCH(__buf_p__,__tag__)\
    (strncmp((char*)__buf_p__, (char*)__tag__, 4) != 0)

static kal_int32 med_avi_close_play_internal(void);
static kal_int32 med_avi_open_play_internal(
                    med_avi_info_struct *avi_info_p,
                    const kal_wchar *filename,
                    kal_char *data_p,
                    kal_int32 data_size);

static kal_int32 med_avi_read_video_frame_internal(kal_char *data_p, kal_uint32 *len_p, kal_bool is_move_next);


/*****************************************************************************
 * FUNCTION
 *  med_avi_open_play_file
 * DESCRIPTION
 *  
 * PARAMETERS
 *  avi_info_p      [?]         
 *  filename        [IN]        
 * RETURNS
 *  
 *****************************************************************************/
kal_int32 med_avi_open_play_file(med_avi_info_struct *avi_info_p, const kal_wchar *filename)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    return med_avi_open_play_internal(avi_info_p, filename, NULL, 0);
}


/*****************************************************************************
 * FUNCTION
 *  med_avi_open_play_array
 * DESCRIPTION
 *  
 * PARAMETERS
 *  avi_info_p      [?]         
 *  data_p          [?]         
 *  data_size       [IN]        
 * RETURNS
 *  
 *****************************************************************************/
kal_int32 med_avi_open_play_array(med_avi_info_struct *avi_info_p, kal_char *data_p, kal_int32 data_size)
{
    /*----------------------------------------------------------------*/
    /* Local Variables                                                */
    /*----------------------------------------------------------------*/

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    return med_avi_open_play_internal(avi_info_p, NULL, data_p, data_size);
}


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

    /*----------------------------------------------------------------*/
    /* Code Body                                                      */
    /*----------------------------------------------------------------*/
    return med_avi_close_play_internal();
}


/*****************************************************************************
 * FUNCTION
 *  med_avi_close_play_array
 * DESCRIPTION
 *  
 * PARAMETERS
 *  void
 * RETURNS

⌨️ 快捷键说明

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