* avi: clean up. Some standard file (ie with 1 RIFF chunk ) has OpenDML
[vlc.git] / modules / demux / avi / libavi.h
index 677eddb..f6d3f60 100644 (file)
@@ -2,7 +2,7 @@
  * libavi.h : LibAVI library 
  ******************************************************************************
  * Copyright (C) 2001 VideoLAN
- * $Id: libavi.h,v 1.3 2002/11/05 23:48:46 gbazin Exp $
+ * $Id: libavi.h,v 1.10 2003/04/27 13:55:51 fenrir Exp $
  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  * 
  * This program is free software; you can redistribute it and/or modify
@@ -46,6 +46,7 @@
 #define AVIFOURCC_LIST         VLC_FOURCC('L','I','S','T')
 #define AVIFOURCC_JUNK         VLC_FOURCC('J','U','N','K')
 #define AVIFOURCC_AVI          VLC_FOURCC('A','V','I',' ')
+#define AVIFOURCC_AVIX         VLC_FOURCC('A','V','I','X')
 #define AVIFOURCC_WAVE         VLC_FOURCC('W','A','V','E')
 #define AVIFOURCC_INFO         VLC_FOURCC('I','N','F','O')
 
@@ -58,6 +59,8 @@
 #define AVIFOURCC_strh         VLC_FOURCC('s','t','r','h')
 #define AVIFOURCC_strf         VLC_FOURCC('s','t','r','f')
 #define AVIFOURCC_strd         VLC_FOURCC('s','t','r','d')
+#define AVIFOURCC_strn         VLC_FOURCC('s','t','r','n')
+#define AVIFOURCC_indx         VLC_FOURCC('i','n','d','x')
 
 #define AVIFOURCC_rec          VLC_FOURCC('r','e','c',' ')
 #define AVIFOURCC_auds         VLC_FOURCC('a','u','d','s')
     /* AngelPotion stuff */
 #define FOURCC_AP41         VLC_FOURCC('A','P','4','1')
 
-    /* ?? */
+    /* 3IVX */
 #define FOURCC_3IV1         VLC_FOURCC('3','I','V','1')
+#define FOURCC_3iv1         VLC_FOURCC('2','i','v','1')
+#define FOURCC_3IV2         VLC_FOURCC('3','I','V','2')
+#define FOURCC_3iv2         VLC_FOURCC('3','i','v','2')
+#define FOURCC_3IVD         VLC_FOURCC('3','I','V','D')
+#define FOURCC_3ivd         VLC_FOURCC('3','i','v','d')
+#define FOURCC_3VID         VLC_FOURCC('3','V','I','D')
+#define FOURCC_3vid         VLC_FOURCC('3','v','i','d')
+
     /* H263 and H263i */
 #define FOURCC_H263         VLC_FOURCC('H','2','6','3')
 #define FOURCC_h263         VLC_FOURCC('h','2','6','3')
 
 
 #define AVI_CHUNK_COMMON            \
-    u32     i_chunk_fourcc;         \
-    u64     i_chunk_size;           \
-    u64     i_chunk_pos;            \
+    vlc_fourcc_t i_chunk_fourcc;    \
+    uint64_t i_chunk_size;          \
+    uint64_t i_chunk_pos;           \
     union  avi_chunk_u *p_next;    \
     union  avi_chunk_u *p_father;  \
     union  avi_chunk_u *p_first;   \
 typedef struct idx1_entry_s
 {
     vlc_fourcc_t i_fourcc;
-    u32 i_flags;
-    u32 i_pos;
-    u32 i_length;
+    uint32_t i_flags;
+    uint32_t i_pos;
+    uint32_t i_length;
 
 } idx1_entry_t;
 typedef struct avi_chunk_common_s
@@ -185,14 +196,14 @@ typedef struct avi_chunk_common_s
 typedef struct avi_chunk_list_s
 {
     AVI_CHUNK_COMMON
-    u32 i_type;
+    vlc_fourcc_t i_type;
 } avi_chunk_list_t;
 
 typedef struct avi_chunk_idx1_s
 {
     AVI_CHUNK_COMMON
-    int i_entry_count;
-    int i_entry_max;
+    unsigned int i_entry_count;
+    unsigned int i_entry_max;
     idx1_entry_t *entry;
 
 } avi_chunk_idx1_t;
@@ -200,58 +211,51 @@ typedef struct avi_chunk_idx1_s
 typedef struct avi_chunk_avih_s
 {
     AVI_CHUNK_COMMON
-    u32 i_microsecperframe;
-    u32 i_maxbytespersec;
-    u32 i_reserved1; /* dwPaddingGranularity;    pad to multiples of this
-                         size; normally 2K */
-    u32 i_flags;
-    u32 i_totalframes;
-    u32 i_initialframes;
-    u32 i_streams;
-    u32 i_suggestedbuffersize;
-    u32 i_width;
-    u32 i_height;
-    u32 i_scale;
-    u32 i_rate;
-    u32 i_start;
-    u32 i_length;
+    uint32_t i_microsecperframe;
+    uint32_t i_maxbytespersec;
+    uint32_t i_reserved1; /* dwPaddingGranularity;    pad to multiples of this
+                             size; normally 2K */
+    uint32_t i_flags;
+    uint32_t i_totalframes;
+    uint32_t i_initialframes;
+    uint32_t i_streams;
+    uint32_t i_suggestedbuffersize;
+    uint32_t i_width;
+    uint32_t i_height;
+    uint32_t i_scale;
+    uint32_t i_rate;
+    uint32_t i_start;
+    uint32_t i_length;
 } avi_chunk_avih_t;
 
 typedef struct avi_chunk_strh_s
 {
     AVI_CHUNK_COMMON
-    u32 i_type;
-    u32 i_handler;
-    u32 i_flags;
-    u32 i_reserved1;    /* wPriority wLanguage */
-    u32 i_initialframes;
-    u32 i_scale;
-    u32 i_rate;
-    u32 i_start;
-    u32 i_length;       /* In units above... */
-    u32 i_suggestedbuffersize;
-    u32 i_quality;
-    u32 i_samplesize;
+    vlc_fourcc_t i_type;
+    uint32_t i_handler;
+    uint32_t i_flags;
+    uint32_t i_reserved1;    /* wPriority wLanguage */
+    uint32_t i_initialframes;
+    uint32_t i_scale;
+    uint32_t i_rate;
+    uint32_t i_start;
+    uint32_t i_length;       /* In units above... */
+    uint32_t i_suggestedbuffersize;
+    uint32_t i_quality;
+    uint32_t i_samplesize;
 } avi_chunk_strh_t;
 
 typedef struct avi_chunk_strf_auds_s
 {
     AVI_CHUNK_COMMON
-    void *p_wfx;    //  waveformatex_t loaded from file
-
-    u16 i_formattag;        // + 0x00
-    u16 i_channels;         // + 0x02
-    u32 i_samplespersec;    // + 0x04
-    u32 i_avgbytespersec;   // + 0x08
-    u16 i_blockalign;       // + 0x0c
-    u16 i_bitspersample;    // + 0x0e
-    u16 i_size; /* the extra size in bytes */
-    u8  *p_data;
+    int             i_cat;
+    WAVEFORMATEX    *p_wf;
 } avi_chunk_strf_auds_t;
 
 typedef struct avi_chunk_strf_vids_s
 {
     AVI_CHUNK_COMMON
+    int              i_cat;
     BITMAPINFOHEADER *p_bih;
 } avi_chunk_strf_vids_t;
 
@@ -259,14 +263,64 @@ typedef union avi_chunk_strf_u
 {
     avi_chunk_strf_auds_t   auds;
     avi_chunk_strf_vids_t   vids;
+    struct
+    {
+        AVI_CHUNK_COMMON
+        int i_cat;
+    }                       common;
 } avi_chunk_strf_t;
 
 typedef struct avi_chunk_strd_s
 {
     AVI_CHUNK_COMMON
-    u8  *p_data;
+    uint8_t  *p_data;
 } avi_chunk_strd_t;
 
+
+#define AVI_INDEX_OF_INDEXES    0x00
+#define AVI_INDEX_OF_CHUNKS     0x01
+#define AVI_INDEX_IS_DATA       0x80
+
+#define AVI_INDEX_2FIELD        0x01
+typedef struct
+{
+    uint32_t i_offset;
+    uint32_t i_size;
+} indx_std_entry_t;
+
+typedef struct
+{
+    uint32_t i_offset;
+    uint32_t i_size;
+    uint32_t i_offsetfield2;
+} indx_field_entry_t;
+
+typedef struct
+{
+    uint64_t i_offset;
+    uint32_t i_size;
+    uint32_t i_duration;
+} indx_super_entry_t;
+
+typedef struct avi_chunk_indx_s
+{
+    AVI_CHUNK_COMMON
+    int16_t i_longsperentry;
+    int8_t  i_indexsubtype;
+    int8_t  i_indextype;
+    int32_t i_entriesinuse;
+    vlc_fourcc_t i_id;
+
+    int64_t i_baseoffset;
+
+    union
+    {
+        indx_std_entry_t    *std;
+        indx_field_entry_t  *field;
+        indx_super_entry_t  *super;
+    } idx;
+} avi_chunk_indx_t;
+
 typedef struct avi_chunk_STRING_s
 {
     AVI_CHUNK_COMMON
@@ -283,6 +337,7 @@ typedef union avi_chunk_u
     avi_chunk_strh_t    strh;
     avi_chunk_strf_t    strf;
     avi_chunk_strd_t    strd;
+    avi_chunk_indx_t    indx;
     avi_chunk_STRING_t  strz;
 } avi_chunk_t;
 
@@ -292,17 +347,17 @@ typedef union avi_chunk_u
 int     AVI_TestFile( input_thread_t *p_input );
 
 /****************************************************************************
- * Stream(input) acces function
+ * Stream(input) access functions
  ****************************************************************************/
 off_t   AVI_TellAbsolute( input_thread_t *p_input );
 int     AVI_SeekAbsolute( input_thread_t *p_input, off_t i_pos);
-int     AVI_ReadData( input_thread_t *p_input, u8 *p_buff, int i_size );
-int     AVI_SkipBytes( input_thread_t *p_input, int i_count );
+int     AVI_ReadData( input_thread_t *p_input, uint8_t *p_buff, int i_size );
+int     AVI_SkipBytes( input_thread_t *p_input, int64_t i_count );
 
 int     _AVI_ChunkRead( input_thread_t *p_input,
                         avi_chunk_t *p_chk,
                         avi_chunk_t *p_father,
-                        int b_seekable );
+                        vlc_bool_t b_seekable );
 void    _AVI_ChunkFree( input_thread_t *p_input,
                          avi_chunk_t *p_chk );
 int     _AVI_ChunkGoto( input_thread_t *p_input,
@@ -310,12 +365,12 @@ int     _AVI_ChunkGoto( input_thread_t *p_input,
 void    _AVI_ChunkDumpDebug( input_thread_t *p_input,
                              avi_chunk_t  *p_chk );
 
-int     _AVI_ChunkCount( avi_chunk_t *p_chk, u32 i_fourcc );
-avi_chunk_t *_AVI_ChunkFind( avi_chunk_t *p_chk, u32 i_fourcc, int i_number );
+int     _AVI_ChunkCount( avi_chunk_t *, vlc_fourcc_t );
+avi_chunk_t *_AVI_ChunkFind( avi_chunk_t *, vlc_fourcc_t, int );
 
 int     AVI_ChunkReadRoot( input_thread_t *p_input,
                            avi_chunk_t *p_root,
-                           int b_seekable );
+                           vlc_bool_t b_seekable );
 void    AVI_ChunkFreeRoot( input_thread_t *p_input,
                            avi_chunk_t  *p_chk );
 #define AVI_ChunkRead( p_input, p_chk, p_father, b_seekable ) \