1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Use of this source code is governed by a BSD-style license
5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  that can be found in the LICENSE file in the root of the source
6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  tree. An additional intellectual property rights grant can be found
7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  in the file PATENTS.  All contributing project authors may
8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
11b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Class for reading (x)or writing to an AVI file.
12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Note: the class cannot be used for reading and writing at the same time.
13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifndef WEBRTC_MODULES_MEDIA_FILE_SOURCE_AVI_FILE_H_
14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_MODULES_MEDIA_FILE_SOURCE_AVI_FILE_H_
15b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
16b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <stdio.h>
17083049f2945b2924203b25c8428300d40d994f35henrike@webrtc.org#include <list>
18b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
193eba48c58401b1b8421dd99d10abb47555e2f56cpbos@webrtc.org#include "webrtc/typedefs.h"
20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgnamespace webrtc {
22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass CriticalSectionWrapper;
23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgstruct AVISTREAMHEADER
25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    AVISTREAMHEADER();
27283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    uint32_t fcc;
28283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    uint32_t cb;
29283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    uint32_t fccType;
30283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    uint32_t fccHandler;
31283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    uint32_t dwFlags;
32283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    uint16_t wPriority;
33283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    uint16_t wLanguage;
34283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    uint32_t dwInitialFrames;
35283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    uint32_t dwScale;
36283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    uint32_t dwRate;
37283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    uint32_t dwStart;
38283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    uint32_t dwLength;
39283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    uint32_t dwSuggestedBufferSize;
40283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    uint32_t dwQuality;
41283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    uint32_t dwSampleSize;
42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    struct
43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
44283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org        int16_t left;
45283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org        int16_t top;
46283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org        int16_t right;
47283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org        int16_t bottom;
48b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    } rcFrame;
49b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
51b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgstruct BITMAPINFOHEADER
52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    BITMAPINFOHEADER();
54283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    uint32_t biSize;
55283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    uint32_t biWidth;
56283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    uint32_t biHeight;
57283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    uint16_t biPlanes;
58283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    uint16_t biBitCount;
59283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    uint32_t biCompression;
60283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    uint32_t biSizeImage;
61283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    uint32_t biXPelsPerMeter;
62283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    uint32_t biYPelsPerMeter;
63283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    uint32_t biClrUsed;
64283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    uint32_t biClrImportant;
65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgstruct WAVEFORMATEX
68b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    WAVEFORMATEX();
70283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    uint16_t wFormatTag;
71283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    uint16_t nChannels;
72283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    uint32_t nSamplesPerSec;
73283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    uint32_t nAvgBytesPerSec;
74283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    uint16_t nBlockAlign;
75283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    uint16_t wBitsPerSample;
76283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    uint16_t cbSize;
77b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgclass AviFile
80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgpublic:
82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    enum AVIStreamType
83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        AVI_AUDIO = 0,
85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        AVI_VIDEO = 1
86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    };
87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    // Unsigned, for comparison with must-be-unsigned types.
89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    static const unsigned int CODEC_CONFIG_LENGTH = 64;
90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    static const unsigned int STREAM_NAME_LENGTH  = 32;
91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    AviFile();
93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    ~AviFile();
94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
95283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    int32_t Open(AVIStreamType streamType, const char* fileName,
96283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org                 bool loop = false);
97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
98283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    int32_t CreateVideoStream(const AVISTREAMHEADER& videoStreamHeader,
99283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org                              const BITMAPINFOHEADER& bitMapInfoHeader,
100283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org                              const uint8_t* codecConfigParams,
101283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org                              int32_t codecConfigParamsLength);
102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
103283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    int32_t CreateAudioStream(const AVISTREAMHEADER& audioStreamHeader,
104283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org                              const WAVEFORMATEX& waveFormatHeader);
105283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    int32_t Create(const char* fileName);
106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
107283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    int32_t WriteAudio(const uint8_t* data, int32_t length);
108283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    int32_t WriteVideo(const uint8_t* data, int32_t length);
109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
110283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    int32_t GetVideoStreamInfo(AVISTREAMHEADER& videoStreamHeader,
111283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org                               BITMAPINFOHEADER& bitmapInfo,
112283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org                               char* codecConfigParameters,
113283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org                               int32_t& configLength);
114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
115283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    int32_t GetDuration(int32_t& durationMs);
116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
117283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    int32_t GetAudioStreamInfo(WAVEFORMATEX& waveHeader);
118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
119283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    int32_t ReadAudio(uint8_t* data, int32_t& length);
120283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    int32_t ReadVideo(uint8_t* data, int32_t& length);
121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
122283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    int32_t Close();
123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
124283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    static uint32_t MakeFourCc(uint8_t ch0, uint8_t ch1, uint8_t ch2,
125283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org                               uint8_t ch3);
126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgprivate:
128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    enum AVIFileMode
129b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        NotSet,
131b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        Read,
132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        Write
133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    };
134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    struct AVIINDEXENTRY
136b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
137283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org        AVIINDEXENTRY(uint32_t inckid, uint32_t indwFlags,
138283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org                      uint32_t indwChunkOffset,
139283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org                      uint32_t indwChunkLength);
140283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org        uint32_t ckid;
141283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org        uint32_t dwFlags;
142283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org        uint32_t dwChunkOffset;
143283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org        uint32_t dwChunkLength;
144b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    };
145b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
146283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    int32_t PrepareDataChunkHeaders();
147b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
148283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    int32_t ReadMoviSubChunk(uint8_t* data, int32_t& length, uint32_t tag1,
149283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org                             uint32_t tag2 = 0);
150b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
151283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    int32_t WriteRIFF();
152283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    int32_t WriteHeaders();
153283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    int32_t WriteAVIMainHeader();
154283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    int32_t WriteAVIStreamHeaders();
155283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    int32_t WriteAVIVideoStreamHeaders();
156283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    int32_t WriteAVIVideoStreamHeaderChunks();
157283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    int32_t WriteAVIAudioStreamHeaders();
158283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    int32_t WriteAVIAudioStreamHeaderChunks();
159b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
160283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    int32_t WriteMoviStart();
161b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
162283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    size_t PutByte(uint8_t byte);
163283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    size_t PutLE16(uint16_t word);
164283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    size_t PutLE32(uint32_t word);
165283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    size_t PutBuffer(const uint8_t* str, size_t size);
166b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    size_t PutBufferZ(const char* str);
167b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    long PutLE32LengthFromCurrent(long startPos);
168283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    void PutLE32AtPos(long pos, uint32_t word);
169b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
170283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    size_t GetByte(uint8_t& word);
171283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    size_t GetLE16(uint16_t& word);
172283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    size_t GetLE32(uint32_t& word);
173283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    size_t GetBuffer(uint8_t* str, size_t size);
174b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
175b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    void CloseRead();
176b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    void CloseWrite();
177b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
178b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    void ResetMembers();
179b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    void ResetComplexMembers();
180b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
181283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    int32_t ReadRIFF();
182283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    int32_t ReadHeaders();
183283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    int32_t ReadAVIMainHeader();
184283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    int32_t ReadAVIVideoStreamHeader(int32_t endpos);
185283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    int32_t ReadAVIAudioStreamHeader(int32_t endpos);
186b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
187283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    uint32_t StreamAndTwoCharCodeToTag(int32_t streamNum,
188283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org                                       const char* twoCharCode);
189b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
190b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    void ClearIndexList();
191283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    void AddChunkToIndexList(uint32_t inChunkId, uint32_t inFlags,
192283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org                             uint32_t inOffset,  uint32_t inSize);
193b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
194b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    void WriteIndex();
195b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
196b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgprivate:
197083049f2945b2924203b25c8428300d40d994f35henrike@webrtc.org    typedef std::list<AVIINDEXENTRY*> IndexList;
198b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    struct AVIMAINHEADER
199b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
200b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        AVIMAINHEADER();
201283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org        uint32_t fcc;
202283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org        uint32_t cb;
203283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org        uint32_t dwMicroSecPerFrame;
204283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org        uint32_t dwMaxBytesPerSec;
205283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org        uint32_t dwPaddingGranularity;
206283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org        uint32_t dwFlags;
207283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org        uint32_t dwTotalFrames;
208283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org        uint32_t dwInitialFrames;
209283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org        uint32_t dwStreams;
210283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org        uint32_t dwSuggestedBufferSize;
211283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org        uint32_t dwWidth;
212283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org        uint32_t dwHeight;
213283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org        uint32_t dwReserved[4];
214b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    };
215b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
216b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    struct AVIStream
217b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    {
218b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        AVIStreamType streamType;
219b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org        int           streamNumber;
220b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    };
221b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
222b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    CriticalSectionWrapper* _crit;
223b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    FILE*            _aviFile;
224b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    AVIMAINHEADER    _aviHeader;
225b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    AVISTREAMHEADER  _videoStreamHeader;
226b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    AVISTREAMHEADER  _audioStreamHeader;
227b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    BITMAPINFOHEADER _videoFormatHeader;
228b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    WAVEFORMATEX     _audioFormatHeader;
229b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
230283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    int8_t _videoConfigParameters[CODEC_CONFIG_LENGTH];
231283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    int32_t _videoConfigLength;
232283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    int8_t _videoStreamName[STREAM_NAME_LENGTH];
233283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    int8_t _audioConfigParameters[CODEC_CONFIG_LENGTH];
234283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    int8_t _audioStreamName[STREAM_NAME_LENGTH];
235b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
236b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    AVIStream _videoStream;
237b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    AVIStream _audioStream;
238b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
239283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    int32_t _nrStreams;
240283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    int32_t _aviLength;
241283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    int32_t _dataLength;
242b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    size_t        _bytesRead;
243b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    size_t        _dataStartByte;
244283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    int32_t _framesRead;
245283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    int32_t _videoFrames;
246283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    int32_t _audioFrames;
247b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
248b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    bool _reading;
249b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    AVIStreamType _openedAs;
250b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    bool _loop;
251b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    bool _writing;
252b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
253b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    size_t _bytesWritten;
254b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
255b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    size_t _riffSizeMark;
256b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    size_t _moviSizeMark;
257b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    size_t _totNumFramesMark;
258b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    size_t _videoStreamLengthMark;
259b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    size_t _audioStreamLengthMark;
260283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    int32_t _moviListOffset;
261b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
262b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    bool _writeAudioStream;
263b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    bool _writeVideoStream;
264b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
265b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    AVIFileMode _aviMode;
266283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    uint8_t* _videoCodecConfigParams;
267283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    int32_t _videoCodecConfigParamsLength;
268b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
269283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    uint32_t _videoStreamDataChunkPrefix;
270283c29a5c34c18c5ef6860a32d1b7ce2eeb0ab5epbos@webrtc.org    uint32_t _audioStreamDataChunkPrefix;
271b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org    bool _created;
272b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
273083049f2945b2924203b25c8428300d40d994f35henrike@webrtc.org    IndexList _indexList;
274b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org};
2753b89e10f31160da35b408fd00cb8f89d2b08862dpbos@webrtc.org}  // namespace webrtc
276b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
277b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif // WEBRTC_MODULES_MEDIA_FILE_SOURCE_AVI_FILE_H_
278