142 lines
5.2 KiB
C
142 lines
5.2 KiB
C
|
|
#ifndef __AVI_H
|
|||
|
|
#define __AVI_H
|
|||
|
|
#include "typesdef.h"
|
|||
|
|
#include "stream_frame.h"
|
|||
|
|
typedef struct {
|
|||
|
|
uint32_t dwFourCC; // 必须为'avih'
|
|||
|
|
uint32_t dwSize; // 本数据结构的大小,不包括最初的8个字节(dwFourCC和dwSize两个字段)
|
|||
|
|
uint32_t dwMicroSecPerFrame; // 每帧的持续时间(以毫秒ms为单位),定义avi的显示速率
|
|||
|
|
uint32_t dwMaxBytesPerSec; // 最大的数据传输率
|
|||
|
|
uint32_t dwPaddingGranularity; // 数据填充的粒度
|
|||
|
|
uint32_t dwFlages; // AVI文件的特殊属性,如是否包含索引块,音视频数据是否交叉存储
|
|||
|
|
uint32_t dwTotalFrame; // 文件中的总帧数
|
|||
|
|
uint32_t dwInitialFrames; // 说明在开始播放前需要多少桢
|
|||
|
|
uint32_t dwStreams; // 文件中包含的数据流个数
|
|||
|
|
uint32_t dwSuggestedBufferSize; // 建议使用的缓冲区的大小,
|
|||
|
|
// 通常为存储一桢图像以及同步声音所需要的数据之和
|
|||
|
|
uint32_t dwWidth; // 图像宽
|
|||
|
|
uint32_t dwHeight; // 图像高
|
|||
|
|
uint32_t dwReserved[4]; // 保留值
|
|||
|
|
} AVIMainHeader;
|
|||
|
|
|
|||
|
|
|
|||
|
|
typedef struct {
|
|||
|
|
uint32_t fccType; // 4字节,表示数据流的种类,vids表示视频数据流,auds表示音频数据流
|
|||
|
|
uint32_t fccHandler; // 4字节 ,表示数据流解压缩的驱动程序代号
|
|||
|
|
uint32_t dwFlags; // 数据流属性
|
|||
|
|
uint16_t wPriority; // 此数据流的播放优先级
|
|||
|
|
uint16_t wLanguage; // 音频的语言代号
|
|||
|
|
uint32_t dwInitalFrames; // 说明在开始播放前需要多少桢
|
|||
|
|
uint32_t dwScale; // 数据量,视频每桢的大小或者音频的采样大小
|
|||
|
|
uint32_t dwRate; // dwScale/dwRate = 每秒的采样数
|
|||
|
|
uint32_t dwStart; // 数据流开始播放的位置,以dwScale为单位
|
|||
|
|
uint32_t dwLength; // 数据流的数据量,以dwScale为单位
|
|||
|
|
uint32_t dwSuggestedBufferSize; // 建议缓冲区的大小
|
|||
|
|
uint32_t dwQuality; // 解压缩质量参数,值越大,质量越好
|
|||
|
|
uint32_t dwSampleSize; // 音频的采样大小
|
|||
|
|
uint16_t rcFrame[4]; // 视频图像所占的矩形
|
|||
|
|
}AVIStreamHeader;
|
|||
|
|
|
|||
|
|
//实际标准后面可能还有信息,这里就不解析了
|
|||
|
|
typedef struct tWAVEFORMATEX {
|
|||
|
|
uint16_t wFormatTag;
|
|||
|
|
uint16_t nChannels;
|
|||
|
|
uint32_t nSamplesPerSec;
|
|||
|
|
uint32_t nAvgBytesPerSec;
|
|||
|
|
uint16_t nBlockAlign;
|
|||
|
|
uint16_t wBitsPerSample;
|
|||
|
|
uint16_t cbSize;
|
|||
|
|
} WAVEFORMATEX;
|
|||
|
|
|
|||
|
|
struct avi_list
|
|||
|
|
{
|
|||
|
|
uint32_t offset;
|
|||
|
|
uint32_t size;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
typedef struct avi_list avi_list_audio_s;
|
|||
|
|
typedef struct avi_list avi_list_photo_s;
|
|||
|
|
|
|||
|
|
struct idx1_s
|
|||
|
|
{
|
|||
|
|
uint32_t dwChunkId;
|
|||
|
|
uint32_t dwFlags;
|
|||
|
|
uint32_t dwOffset;
|
|||
|
|
uint32_t dwSize;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
//快速索引表
|
|||
|
|
struct fast_index_list
|
|||
|
|
{
|
|||
|
|
struct fast_index_list *next;
|
|||
|
|
struct fast_index_list *prev;
|
|||
|
|
uint32_t avi_index; //当前视频index的值,这个记录的是视频的帧数
|
|||
|
|
uint32_t audio_index; //当前音频index,这个记录的是音频的长度
|
|||
|
|
uint32_t offset; //当前的偏移值,读取的第一个index就是对应avi或者index
|
|||
|
|
};
|
|||
|
|
struct avi_msg_s
|
|||
|
|
{
|
|||
|
|
AVIMainHeader avi;
|
|||
|
|
void *fp;
|
|||
|
|
uint32_t fps;
|
|||
|
|
uint32_t sample;
|
|||
|
|
uint32_t movi_addr;
|
|||
|
|
uint32_t idx1_addr;
|
|||
|
|
uint32_t idx1_size;
|
|||
|
|
struct avi_read_msg_s *avi_read_msg;
|
|||
|
|
struct fast_index_list *fast_index;
|
|||
|
|
|
|||
|
|
//当前读取视频帧的buf
|
|||
|
|
uint32_t video_buf[512/4]; //当前读取视频帧的索引的缓冲区
|
|||
|
|
uint32_t video_file_addr; //当前读取视频帧的地址
|
|||
|
|
int32_t video_frame_num; //视频帧数
|
|||
|
|
uint32_t video_not_read_size; //剩余长度
|
|||
|
|
int32_t video_cache_remain; //缓存剩余长度
|
|||
|
|
struct idx1_s *video_idx1;
|
|||
|
|
|
|||
|
|
//当前读取音频帧的buf
|
|||
|
|
uint32_t audio_buf[512/4]; //当前读取音频帧的索引的缓冲区
|
|||
|
|
uint32_t audio_file_addr; //当前读取音频帧的地址
|
|||
|
|
int32_t audio_frame_num; //音频的读取偏移长度
|
|||
|
|
uint32_t audio_not_read_size; //剩余长度
|
|||
|
|
int32_t audio_cache_remain; //缓存剩余长度
|
|||
|
|
struct idx1_s *audio_idx1;
|
|||
|
|
uint8_t offset;
|
|||
|
|
uint32_t v_id,a_id;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
struct chunk_s
|
|||
|
|
{
|
|||
|
|
uint32_t dwFourCC;
|
|||
|
|
uint32_t size;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
struct avi_read_msg_s
|
|||
|
|
{
|
|||
|
|
uint32_t addr_offset;
|
|||
|
|
uint32_t avi_index;
|
|||
|
|
uint32_t audio_index;
|
|||
|
|
uint32_t remain_read_size;
|
|||
|
|
uint32_t buf[512/4];
|
|||
|
|
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
void *avi_read_init(const char *filename);
|
|||
|
|
void parse_idx1(char *buf,uint32_t size);
|
|||
|
|
void avi_deinit(struct avi_msg_s *avi_msg);
|
|||
|
|
struct avi_read_msg_s *read_msg_init(struct avi_msg_s *avi_msg);
|
|||
|
|
void gen_fast_index_list(struct avi_msg_s *avi_msg);
|
|||
|
|
void read_msg_deinit(struct avi_msg_s *avi_msg);
|
|||
|
|
void locate_avi_index(struct avi_msg_s *avi_msg,uint32_t index);
|
|||
|
|
void avi_read_next_index(struct avi_msg_s *avi_msg,uint32_t *offset,uint32_t *size,uint32_t *frame_num);
|
|||
|
|
void avi_read_next_audio_index(struct avi_msg_s *avi_msg,uint32_t *offset,uint32_t *size,uint32_t *frame_num);
|
|||
|
|
#endif
|