avi_def.h 5.6 KB

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