1 /***************************************************************************** 2 * libavi.h : LibAVI library 3 ****************************************************************************** 4 * Copyright (C) 2001-2003 VLC authors and VideoLAN 5 * $Id: 868d97bb92cdfb434ca55bc3388dfa8db5c63b6e $ 6 * Authors: Laurent Aimar <fenrir@via.ecp.fr> 7 * 8 * This program is free software; you can redistribute it and/or modify it 9 * under the terms of the GNU Lesser General Public License as published by 10 * the Free Software Foundation; either version 2.1 of the License, or 11 * (at your option) any later version. 12 * 13 * This program is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 * GNU Lesser General Public License for more details. 17 * 18 * You should have received a copy of the GNU Lesser General Public License 19 * along with this program; if not, write to the Free Software Foundation, 20 * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. 21 *****************************************************************************/ 22 23 /* biCompression / Others are FourCC */ 24 #define BI_RGB 0x0000 25 #define BI_RLE8 0x0001 26 #define BI_RLE4 0x0002 27 #define BI_BITFIELDS 0x0003 28 #define BI_JPEG 0x0004 29 #define BI_PNG 0x0005 30 #define BI_CMYK 0x000B 31 #define BI_CMYKRLE8 0x000C 32 #define BI_CMYKRLE4 0x000D 33 34 /* flags for use in <dwFlags> in AVIFileHdr */ 35 #define AVIF_HASINDEX 0x00000010 /* Index at end of file? */ 36 #define AVIF_MUSTUSEINDEX 0x00000020 37 #define AVIF_ISINTERLEAVED 0x00000100 38 #define AVIF_TRUSTCKTYPE 0x00000800 /* Use CKType to find key frames? */ 39 #define AVIF_WASCAPTUREFILE 0x00010000 40 #define AVIF_COPYRIGHTED 0x00020000 41 42 /* Flags for index */ 43 #define AVIIF_LIST 0x00000001L /* chunk is a 'LIST' */ 44 #define AVIIF_KEYFRAME 0x00000010L /* this frame is a key frame.*/ 45 #define AVIIF_NOTIME 0x00000100L /* this frame doesn't take any time */ 46 #define AVIIF_COMPUSE 0x0FFF0000L /* these bits are for compressor use */ 47 48 #define AVIIF_FIXKEYFRAME 0x00001000L /* invented; used to say that */ 49 /* the keyframe flag isn't a true flag */ 50 /* but have to be verified */ 51 52 #define AVI_CHUNK_COMMON \ 53 vlc_fourcc_t i_chunk_fourcc; \ 54 uint64_t i_chunk_size; \ 55 uint64_t i_chunk_pos; \ 56 union avi_chunk_u *p_next; \ 57 union avi_chunk_u *p_father; \ 58 union avi_chunk_u *p_first; 59 60 #define AVI_CHUNK( p_chk ) (avi_chunk_t*)(p_chk) 61 62 typedef struct idx1_entry_s 63 { 64 vlc_fourcc_t i_fourcc; 65 uint32_t i_flags; 66 uint32_t i_pos; 67 uint32_t i_length; 68 69 } idx1_entry_t; 70 71 typedef struct avi_chunk_common_s 72 { 73 AVI_CHUNK_COMMON 74 } avi_chunk_common_t; 75 76 typedef struct avi_chunk_list_s 77 { 78 AVI_CHUNK_COMMON 79 vlc_fourcc_t i_type; 80 } avi_chunk_list_t; 81 82 typedef struct avi_chunk_idx1_s 83 { 84 AVI_CHUNK_COMMON 85 unsigned int i_entry_count; 86 unsigned int i_entry_max; 87 idx1_entry_t *entry; 88 89 } avi_chunk_idx1_t; 90 91 typedef struct avi_chunk_avih_s 92 { 93 AVI_CHUNK_COMMON 94 uint32_t i_microsecperframe; 95 uint32_t i_maxbytespersec; 96 uint32_t i_reserved1; /* dwPaddingGranularity; pad to multiples of this 97 size; normally 2K */ 98 uint32_t i_flags; 99 uint32_t i_totalframes; 100 uint32_t i_initialframes; 101 uint32_t i_streams; 102 uint32_t i_suggestedbuffersize; 103 uint32_t i_width; 104 uint32_t i_height; 105 uint32_t i_scale; 106 uint32_t i_rate; 107 uint32_t i_start; 108 uint32_t i_length; 109 } avi_chunk_avih_t; 110 111 typedef struct avi_chunk_strh_s 112 { 113 AVI_CHUNK_COMMON 114 vlc_fourcc_t i_type; 115 uint32_t i_handler; 116 uint32_t i_flags; 117 uint32_t i_reserved1; /* wPriority wLanguage */ 118 uint32_t i_initialframes; 119 uint32_t i_scale; 120 uint32_t i_rate; 121 uint32_t i_start; 122 uint32_t i_length; /* In units above... */ 123 uint32_t i_suggestedbuffersize; 124 uint32_t i_quality; 125 uint32_t i_samplesize; 126 } avi_chunk_strh_t; 127 128 typedef struct 129 { 130 AVI_CHUNK_COMMON 131 int i_cat; 132 union 133 { 134 VLC_BITMAPINFOHEADER *p_bih; 135 WAVEFORMATEX *p_wf; 136 } u; 137 } avi_chunk_strf_t; 138 139 typedef struct avi_chunk_strd_s 140 { 141 AVI_CHUNK_COMMON 142 uint8_t *p_data; 143 } avi_chunk_strd_t; 144 145 typedef struct avi_chunk_vprp_s 146 { 147 AVI_CHUNK_COMMON 148 uint32_t i_video_format_token; 149 uint32_t i_video_standard; 150 uint32_t i_vertical_refresh; 151 uint32_t i_h_total_in_t; 152 uint32_t i_v_total_in_lines; 153 uint32_t i_frame_aspect_ratio; 154 uint32_t i_frame_width_in_pixels; 155 uint32_t i_frame_height_in_pixels; 156 uint32_t i_nb_fields_per_frame; 157 struct 158 { 159 uint32_t i_compressed_bm_height; 160 uint32_t i_compressed_bm_width; 161 uint32_t i_valid_bm_height; 162 uint32_t i_valid_bm_width; 163 uint32_t i_valid_bm_x_offset; 164 uint32_t i_valid_bm_y_offset; 165 uint32_t i_video_x_offset_in_t; 166 uint32_t i_video_y_valid_start_line; 167 } field_info[2]; 168 169 } avi_chunk_vprp_t; 170 171 typedef struct avi_chunk_dmlh_s 172 { 173 AVI_CHUNK_COMMON 174 uint32_t dwTotalFrames; 175 } avi_chunk_dmlh_t; 176 177 #define AVI_ZEROSIZED_CHUNK 0xFF 178 #define AVI_ZERO_FOURCC 0xFE 179 180 #define AVI_INDEX_OF_INDEXES 0x00 181 #define AVI_INDEX_OF_CHUNKS 0x01 182 #define AVI_INDEX_IS_DATA 0x80 183 184 #define AVI_INDEX_2FIELD 0x01 185 typedef struct 186 { 187 uint32_t i_offset; 188 uint32_t i_size; 189 } indx_std_entry_t; 190 191 typedef struct 192 { 193 uint32_t i_offset; 194 uint32_t i_size; 195 uint32_t i_offsetfield2; 196 } indx_field_entry_t; 197 198 typedef struct 199 { 200 uint64_t i_offset; 201 uint32_t i_size; 202 uint32_t i_duration; 203 } indx_super_entry_t; 204 205 typedef struct avi_chunk_indx_s 206 { 207 AVI_CHUNK_COMMON 208 int16_t i_longsperentry; 209 int8_t i_indexsubtype; 210 int8_t i_indextype; 211 uint32_t i_entriesinuse; 212 vlc_fourcc_t i_id; 213 214 uint64_t i_baseoffset; 215 216 union 217 { 218 indx_std_entry_t *std; 219 indx_field_entry_t *field; 220 indx_super_entry_t *super; 221 } idx; 222 } avi_chunk_indx_t; 223 224 typedef struct avi_chunk_STRING_s 225 { 226 AVI_CHUNK_COMMON 227 char *p_type; 228 char *p_str; 229 } avi_chunk_STRING_t; 230 231 typedef union avi_chunk_u 232 { 233 avi_chunk_common_t common; 234 avi_chunk_list_t list; 235 avi_chunk_idx1_t idx1; 236 avi_chunk_avih_t avih; 237 avi_chunk_strh_t strh; 238 avi_chunk_strf_t strf; 239 avi_chunk_strd_t strd; 240 avi_chunk_vprp_t vprp; 241 avi_chunk_indx_t indx; 242 avi_chunk_STRING_t strz; 243 } avi_chunk_t; 244 245 /**************************************************************************** 246 * Stream(input) access functions 247 ****************************************************************************/ 248 int AVI_ChunkRead( stream_t *, 249 avi_chunk_t *p_chk, 250 avi_chunk_t *p_father ); 251 void AVI_ChunkClean( stream_t *, avi_chunk_t * ); 252 253 int AVI_ChunkCount_( avi_chunk_t *, vlc_fourcc_t, bool ); 254 void *AVI_ChunkFind_ ( avi_chunk_t *, vlc_fourcc_t, int, bool ); 255 256 int AVI_ChunkReadRoot( stream_t *, avi_chunk_t *p_root ); 257 void AVI_ChunkFreeRoot( stream_t *, avi_chunk_t *p_chk ); 258 int AVI_ChunkFetchIndexes( stream_t *, avi_chunk_t *p_riff ); 259 260 #define AVI_ChunkCount( p_chk, i_fourcc, b_list ) \ 261 AVI_ChunkCount_( AVI_CHUNK(p_chk), i_fourcc, b_list ) 262 #define AVI_ChunkFind( p_chk, i_fourcc, i_number, b_list ) \ 263 AVI_ChunkFind_( AVI_CHUNK(p_chk), i_fourcc, i_number, b_list ) 264 265 /* *** avi stuff *** */ 266 267 #define AVIFOURCC_RIFF VLC_FOURCC('R','I','F','F') 268 #define AVIFOURCC_ON2 VLC_FOURCC('O','N','2',' ') 269 #define AVIFOURCC_LIST VLC_FOURCC('L','I','S','T') 270 #define AVIFOURCC_JUNK VLC_FOURCC('J','U','N','K') 271 #define AVIFOURCC_AVI VLC_FOURCC('A','V','I',' ') 272 #define AVIFOURCC_AVIX VLC_FOURCC('A','V','I','X') 273 #define AVIFOURCC_ON2f VLC_FOURCC('O','N','2','f') 274 #define AVIFOURCC_WAVE VLC_FOURCC('W','A','V','E') 275 #define AVIFOURCC_INFO VLC_FOURCC('I','N','F','O') 276 277 #define AVIFOURCC_avih VLC_FOURCC('a','v','i','h') 278 #define AVIFOURCC_ON2h VLC_FOURCC('O','N','2','h') 279 #define AVIFOURCC_hdrl VLC_FOURCC('h','d','r','l') 280 #define AVIFOURCC_movi VLC_FOURCC('m','o','v','i') 281 #define AVIFOURCC_idx1 VLC_FOURCC('i','d','x','1') 282 283 #define AVIFOURCC_strl VLC_FOURCC('s','t','r','l') 284 #define AVIFOURCC_strh VLC_FOURCC('s','t','r','h') 285 #define AVIFOURCC_strf VLC_FOURCC('s','t','r','f') 286 #define AVIFOURCC_strd VLC_FOURCC('s','t','r','d') 287 #define AVIFOURCC_strn VLC_FOURCC('s','t','r','n') 288 #define AVIFOURCC_indx VLC_FOURCC('i','n','d','x') 289 #define AVIFOURCC_vprp VLC_FOURCC('v','p','r','p') 290 #define AVIFOURCC_dmlh VLC_FOURCC('d','m','l','h') 291 292 #define AVIFOURCC_rec VLC_FOURCC('r','e','c',' ') 293 #define AVIFOURCC_auds VLC_FOURCC('a','u','d','s') 294 #define AVIFOURCC_vids VLC_FOURCC('v','i','d','s') 295 #define AVIFOURCC_txts VLC_FOURCC('t','x','t','s') 296 #define AVIFOURCC_mids VLC_FOURCC('m','i','d','s') 297 #define AVIFOURCC_iavs VLC_FOURCC('i','a','v','s') 298 #define AVIFOURCC_ivas VLC_FOURCC('i','v','a','s') 299 300 #define AVIFOURCC_IARL VLC_FOURCC('I','A','R','L') 301 #define AVIFOURCC_IART VLC_FOURCC('I','A','R','T') 302 #define AVIFOURCC_ICMS VLC_FOURCC('I','C','M','S') 303 #define AVIFOURCC_ICMT VLC_FOURCC('I','C','M','T') 304 #define AVIFOURCC_ICOP VLC_FOURCC('I','C','O','P') 305 #define AVIFOURCC_ICRD VLC_FOURCC('I','C','R','D') 306 #define AVIFOURCC_ICRP VLC_FOURCC('I','C','R','P') 307 #define AVIFOURCC_IDIM VLC_FOURCC('I','D','I','M') 308 #define AVIFOURCC_IDPI VLC_FOURCC('I','D','P','I') 309 #define AVIFOURCC_IENG VLC_FOURCC('I','E','N','G') 310 #define AVIFOURCC_IGNR VLC_FOURCC('I','G','N','R') 311 #define AVIFOURCC_ISGN VLC_FOURCC('I','S','G','N') 312 #define AVIFOURCC_IKEY VLC_FOURCC('I','K','E','Y') 313 #define AVIFOURCC_ILGT VLC_FOURCC('I','L','G','T') 314 #define AVIFOURCC_IMED VLC_FOURCC('I','M','E','D') 315 #define AVIFOURCC_INAM VLC_FOURCC('I','N','A','M') 316 #define AVIFOURCC_IPLT VLC_FOURCC('I','P','L','T') 317 #define AVIFOURCC_IPRD VLC_FOURCC('I','P','R','D') 318 #define AVIFOURCC_ISBJ VLC_FOURCC('I','S','B','J') 319 #define AVIFOURCC_ISFT VLC_FOURCC('I','S','F','T') 320 #define AVIFOURCC_ISHP VLC_FOURCC('I','S','H','P') 321 #define AVIFOURCC_ISRC VLC_FOURCC('I','S','R','C') 322 #define AVIFOURCC_ISRF VLC_FOURCC('I','S','R','F') 323 #define AVIFOURCC_ITCH VLC_FOURCC('I','T','C','H') 324 #define AVIFOURCC_ISMP VLC_FOURCC('I','S','M','P') 325 #define AVIFOURCC_IDIT VLC_FOURCC('I','D','I','T') 326 #define AVIFOURCC_ILNG VLC_FOURCC('I','L','N','G') 327 #define AVIFOURCC_IRTD VLC_FOURCC('I','R','T','D') 328 #define AVIFOURCC_IWEB VLC_FOURCC('I','W','E','B') 329 #define AVIFOURCC_IPRT VLC_FOURCC('I','P','R','T') 330 #define AVIFOURCC_IWRI VLC_FOURCC('I','W','R','I') 331 #define AVIFOURCC_IPRO VLC_FOURCC('I','P','R','O') 332 #define AVIFOURCC_ICNM VLC_FOURCC('I','C','N','M') 333 #define AVIFOURCC_IPDS VLC_FOURCC('I','P','D','S') 334 #define AVIFOURCC_IEDT VLC_FOURCC('I','E','D','T') 335 #define AVIFOURCC_ICDS VLC_FOURCC('I','C','D','S') 336 #define AVIFOURCC_IMUS VLC_FOURCC('I','M','U','S') 337 #define AVIFOURCC_ISTD VLC_FOURCC('I','S','T','D') 338 #define AVIFOURCC_IDST VLC_FOURCC('I','D','S','T') 339 #define AVIFOURCC_ICNT VLC_FOURCC('I','C','N','T') 340 #define AVIFOURCC_ISTR VLC_FOURCC('I','S','T','R') 341 #define AVIFOURCC_IFRM VLC_FOURCC('I','F','R','M') 342 343 #define AVIFOURCC_IAS1 VLC_FOURCC('I','A','S','1') 344 #define AVIFOURCC_IAS2 VLC_FOURCC('I','A','S','2') 345 #define AVIFOURCC_IAS3 VLC_FOURCC('I','A','S','3') 346 #define AVIFOURCC_IAS4 VLC_FOURCC('I','A','S','4') 347 #define AVIFOURCC_IAS5 VLC_FOURCC('I','A','S','5') 348 #define AVIFOURCC_IAS6 VLC_FOURCC('I','A','S','6') 349 #define AVIFOURCC_IAS7 VLC_FOURCC('I','A','S','7') 350 #define AVIFOURCC_IAS8 VLC_FOURCC('I','A','S','8') 351 #define AVIFOURCC_IAS9 VLC_FOURCC('I','A','S','9') 352 353 #define AVITWOCC_wb VLC_TWOCC('w','b') 354 #define AVITWOCC_db VLC_TWOCC('d','b') 355 #define AVITWOCC_dc VLC_TWOCC('d','c') 356 #define AVITWOCC_pc VLC_TWOCC('p','c') 357 #define AVITWOCC_AC VLC_TWOCC('A','C') 358 #define AVITWOCC_tx VLC_TWOCC('t','x') 359 #define AVITWOCC_sb VLC_TWOCC('s','b') 360 361 /* *** codex stuff *** */ 362 363 /* DV */ 364 #define FOURCC_dvsd VLC_FOURCC('d','v','s','d') 365 #define FOURCC_dvhd VLC_FOURCC('d','v','h','d') 366 #define FOURCC_dvsl VLC_FOURCC('d','v','s','l') 367 #define FOURCC_dv25 VLC_FOURCC('d','v','2','5') 368 #define FOURCC_dv50 VLC_FOURCC('d','v','5','0') 369