1 #ifndef _AVI_DEFINE_H_
2 #define _AVI_DEFINE_H_
3 
4 #include "stdint.h"
5 
6 /**
7  * reference links: https://www.cnblogs.com/songhe364826110/p/7619949.html
8  * AVIFileFormat: https://web.archive.org/web/20170411001412/http://www.alexander-noe.com/video/documentation/avi.pdf
9  * OpenDML AVI File Format Extensions: https://web.archive.org/web/20070112225112/http://www.the-labs.com/Video/odmlff2-avidef.pdf
10  */
11 typedef struct
12 {
13     uint32_t FourCC;
14     uint32_t size;   //块大小,等于之后数据的大小
15     /* 数据 uint8_t _data[size]; */
16 } AVI_CHUNK_HEAD;
17 
18 typedef struct
19 {
20     uint32_t List;   //固定为"LIST",如果是 RIFF List 则为 "RIFF"
21     uint32_t size;   //块大小,等于之后数据的大小
22     uint32_t FourCC;
23     /* 数据 uint8_t _data[size-4]; */
24 } AVI_LIST_HEAD;
25 
26 typedef struct
27 {
28     uint32_t FourCC;            //块ID,固定为avih
29     uint32_t size;              //块大小,等于struct avi_avih_chunk去掉id和size的大小
30     uint32_t us_per_frame;      //视频帧间隔时间(以微秒为单位)
31     uint32_t max_bytes_per_sec; //AVI文件的最大数据率
32     uint32_t padding;           //设为0即可
33     uint32_t flags;             //AVI文件全局属性,如是否含有索引块、音视频数据是否交叉存储等
34     uint32_t total_frames;      //总帧数
35     uint32_t init_frames;       //为交互格式指定初始帧数(非交互格式应该指定为0)
36     uint32_t streams;           //文件包含的流的个数,仅有视频流时为1
37     uint32_t suggest_buff_size; //指定读取本文件建议使用的缓冲区大小,通常为存储一桢图像以及同步声音所需的数据之和,不指定时设为0
38     uint32_t width;             //视频主窗口宽度(单位:像素)
39     uint32_t height;            //视频主窗口高度(单位:像素)
40     uint32_t reserved[4];       //保留值dwScale,dwRate,dwStart,dwLength
41 } AVI_AVIH_CHUNK;
42 
43 typedef struct
44 {
45     int16_t left;
46     int16_t top;
47     int16_t right;
48     int16_t bottom;
49 } AVI_RECT_FRAME;
50 
51 typedef struct
52 {
53     uint32_t FourCC;            //块ID,固定为strh
54     uint32_t size;              //块大小,等于struct avi_strh_chunk去掉id和size的大小
55     uint32_t fourcc_type;       //流的类型,vids表示视频流,auds表示音频流
56     uint32_t fourcc_codec;      //指定处理这个流需要的解码器,如JPEG
57     uint32_t flags;             //标记,如是否允许这个流输出、调色板是否变化等,一般设为0即可
58     uint16_t priority;          //流的优先级,视频流设为0即可
59     uint16_t language;          //音频语言代号,视频流设为0即可
60     uint32_t init_frames;       //为交互格式指定初始帧数(非交互格式应该指定为0)
61     uint32_t scale;             //
62     uint32_t rate;              //对于视频流,rate / scale = 帧率fps
63     uint32_t start;             //对于视频流,设为0即可
64     uint32_t length;            //对于视频流,length即总帧数
65     uint32_t suggest_buff_size; //读取这个流数据建议使用的缓冲区大小
66     uint32_t quality;           //流数据的质量指标
67     uint32_t sample_size;       //音频采样大小,视频流设为0即可
68     AVI_RECT_FRAME rcFrame;     //这个流在视频主窗口中的显示位置,设为{0,0,width,height}即可
69 } AVI_STRH_CHUNK;
70 
71 /*对于视频流,strf块结构如下*/
72 typedef struct
73 {
74     uint32_t FourCC;             //块ID,固定为strf
75     uint32_t size;               //块大小,等于struct avi_strf_chunk去掉id和size的大小
76     uint32_t size1;              //size1含义和值同size一样
77     uint32_t width;              //视频主窗口宽度(单位:像素)
78     uint32_t height;             //视频主窗口高度(单位:像素)
79     uint16_t planes;             //始终为1
80     uint16_t bitcount;           //每个像素占的位数,只能是1、4、8、16、24和32中的一个
81     uint32_t fourcc_compression; //视频流编码格式,如"JPEG"、"MJPG"等
82     uint32_t image_size;         //视频图像大小,等于width * height * bitcount / 8
83     uint32_t x_pixels_per_meter; //显示设备的水平分辨率,设为0即可
84     uint32_t y_pixels_per_meter; //显示设备的垂直分辨率,设为0即可
85     uint32_t num_colors;         //含义不清楚,设为0即可
86     uint32_t imp_colors;         //含义不清楚,设为0即可
87 } AVI_VIDS_STRF_CHUNK;
88 
89 /*对于音频流,strf块结构如下*/
90 typedef struct __attribute__((packed))
91 {
92     uint32_t FourCC;             //块ID,固定为strf
93     uint32_t size;               //块大小,等于struct avi_strf_chunk去掉id和size的大小
94     uint16_t format_tag;
95     uint16_t channels;
96     uint32_t samples_per_sec;
97     uint32_t avg_bytes_per_sec;
98     uint16_t block_align;
99     uint32_t bits_per_sample;
100 }
101 AVI_AUDS_STRF_CHUNK;
102 
103 typedef struct
104 {
105     AVI_LIST_HEAD strl;
106     AVI_STRH_CHUNK strh;
107     AVI_VIDS_STRF_CHUNK strf;
108 } AVI_STRL_LIST;
109 
110 typedef struct
111 {
112     AVI_LIST_HEAD hdrl;
113     AVI_AVIH_CHUNK avih;
114     AVI_STRL_LIST  strl;
115 } AVI_HDRL_LIST;
116 
117 typedef struct
118 {
119     uint32_t FourCC; //块ID,固定为 "idx1"
120     uint32_t flags;
121     uint32_t chunkoffset;
122     uint32_t chunklength;
123 } AVI_IDX1;
124 
125 /**
126 "db":未压缩的视频帧(RGB数据流);
127 "dc":压缩的视频帧;
128 "wb":音频未压缩数据(Wave数据流);
129 "wc":音频压缩数据(压缩的Wave数据流);
130 "pc":改用新的调色板。(新的调色板使用一个数据结构AVIPALCHANGE来定义。如果一个流的调色板中途可能改变,则应在这个流格式的描述中,也就是AVISTREAMHEADER结构的dwFlags中包含一个AVISF_VIDEO_PALCHANGES标记。)
131 */
132 
133 #endif
134