Mercurial > mplayer.hg
annotate libmpdemux/aviheader.h @ 12270:24c13ef4f42b
Escape urls (needed for urls in playlists)
Based on an idea by adland
author | rtognimp |
---|---|
date | Sat, 24 Apr 2004 13:22:05 +0000 |
parents | cf68f8b514b0 |
children | 0db4a3a5b01d |
rev | line source |
---|---|
1343 | 1 #ifndef _aviheader_h |
2 #define _aviheader_h | |
3 | |
1485
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1343
diff
changeset
|
4 //#include "config.h" /* get correct definition WORDS_BIGENDIAN */ |
1343 | 5 #include "bswap.h" |
6 | |
12036 | 7 typedef struct _avisuperindex_entry { |
8 uint64_t qwOffset; // absolute file offset | |
9 uint32_t dwSize; // size of index chunk at this offset | |
10 uint32_t dwDuration; // time span in stream ticks | |
11 } avisuperindex_entry; | |
12 | |
13 typedef struct _avistdindex_entry { | |
14 uint32_t dwOffset; // qwBaseOffset + this is absolute file offset | |
15 uint32_t dwSize; // bit 31 is set if this is NOT a keyframe | |
16 } avistdindex_entry; | |
17 | |
18 // Standard index | |
19 typedef struct _avistdindex_chunk { | |
20 char fcc[4]; // ix## | |
21 uint32_t dwSize; // size of this chunk | |
22 uint16_t wLongsPerEntry; // must be sizeof(aIndex[0])/sizeof(DWORD) | |
23 uint8_t bIndexSubType; // must be 0 | |
24 uint8_t bIndexType; // must be AVI_INDEX_OF_CHUNKS | |
25 uint32_t nEntriesInUse; // first unused entry | |
26 char dwChunkId[4]; // '##dc' or '##db' or '##wb' etc.. | |
27 uint64_t qwBaseOffset; // all dwOffsets in aIndex array are relative to this | |
28 uint32_t dwReserved3; // must be 0 | |
29 avistdindex_entry *aIndex; // the actual frames | |
30 } avistdindex_chunk; | |
31 | |
32 | |
33 // Base Index Form 'indx' | |
34 typedef struct _avisuperindex_chunk { | |
35 char fcc[4]; | |
36 uint32_t dwSize; // size of this chunk | |
37 uint16_t wLongsPerEntry; // size of each entry in aIndex array (must be 4*4 for us) | |
38 uint8_t bIndexSubType; // future use. must be 0 | |
39 uint8_t bIndexType; // one of AVI_INDEX_* codes | |
40 uint32_t nEntriesInUse; // index of first unused member in aIndex array | |
41 char dwChunkId[4]; // fcc of what is indexed | |
42 uint32_t dwReserved[3]; // meaning differs for each index type/subtype. | |
43 // 0 if unused | |
44 avisuperindex_entry *aIndex; // position of ix## chunks | |
45 avistdindex_chunk *stdidx; // the actual std indices | |
46 } avisuperindex_chunk; | |
47 | |
48 typedef struct { | |
49 uint32_t CompressedBMHeight; | |
50 uint32_t CompressedBMWidth; | |
51 uint32_t ValidBMHeight; | |
52 uint32_t ValidBMWidth; | |
53 uint32_t ValidBMXOffset; | |
54 uint32_t ValidBMYOffset; | |
55 uint32_t VideoXOffsetInT; | |
56 uint32_t VideoYValidStartLine; | |
57 } VIDEO_FIELD_DESC; | |
58 | |
59 typedef struct { | |
60 uint32_t VideoFormatToken; | |
61 uint32_t VideoStandard; | |
62 uint32_t dwVerticalRefreshRate; | |
63 uint32_t dwHTotalInT; | |
64 uint32_t dwVTotalInLines; | |
65 uint32_t dwFrameAspectRatio; | |
66 uint32_t dwFrameWidthInPixels; | |
67 uint32_t dwFrameHeightInLines; | |
68 uint32_t nbFieldPerFrame; | |
69 VIDEO_FIELD_DESC FieldInfo[2]; | |
70 } VideoPropHeader; | |
71 | |
72 enum { | |
73 FORMAT_UNKNOWN, | |
74 FORMAT_PAL_SQUARE, | |
75 FORMAT_PAL_CCIR_601, | |
76 FORMAT_NTSC_SQUARE, | |
77 FORMAT_NTSC_CCIR_601, | |
78 } VIDEO_FORMAT; | |
79 | |
80 enum { | |
81 STANDARD_UNKNOWN, | |
82 STANDARD_PAL, | |
83 STANDARD_NTSC, | |
84 STANDARD_SECAM | |
85 } VIDEO_STANDARD; | |
86 | |
87 #define MAKE_AVI_ASPECT(a, b) (((a)<<16)|(b)) | |
88 #define GET_AVI_ASPECT(a) ((float)((a)>>16)/(float)((a)&0xffff)) | |
89 | |
1343 | 90 /* |
91 * Some macros to swap little endian structures read from an AVI file | |
92 * into machine endian format | |
93 */ | |
94 #ifdef WORDS_BIGENDIAN | |
95 #define le2me_MainAVIHeader(h) { \ | |
96 (h)->dwMicroSecPerFrame = le2me_32((h)->dwMicroSecPerFrame); \ | |
97 (h)->dwMaxBytesPerSec = le2me_32((h)->dwMaxBytesPerSec); \ | |
98 (h)->dwPaddingGranularity = le2me_32((h)->dwPaddingGranularity); \ | |
99 (h)->dwFlags = le2me_32((h)->dwFlags); \ | |
100 (h)->dwTotalFrames = le2me_32((h)->dwTotalFrames); \ | |
101 (h)->dwInitialFrames = le2me_32((h)->dwInitialFrames); \ | |
102 (h)->dwStreams = le2me_32((h)->dwStreams); \ | |
103 (h)->dwSuggestedBufferSize = le2me_32((h)->dwSuggestedBufferSize); \ | |
104 (h)->dwWidth = le2me_32((h)->dwWidth); \ | |
105 (h)->dwHeight = le2me_32((h)->dwHeight); \ | |
106 } | |
107 | |
108 #define le2me_AVIStreamHeader(h) { \ | |
109 (h)->fccType = le2me_32((h)->fccType); \ | |
110 (h)->fccHandler = le2me_32((h)->fccHandler); \ | |
111 (h)->dwFlags = le2me_32((h)->dwFlags); \ | |
112 (h)->wPriority = le2me_16((h)->wPriority); \ | |
113 (h)->wLanguage = le2me_16((h)->wLanguage); \ | |
114 (h)->dwInitialFrames = le2me_32((h)->dwInitialFrames); \ | |
115 (h)->dwScale = le2me_32((h)->dwScale); \ | |
116 (h)->dwRate = le2me_32((h)->dwRate); \ | |
117 (h)->dwStart = le2me_32((h)->dwStart); \ | |
118 (h)->dwLength = le2me_32((h)->dwLength); \ | |
119 (h)->dwSuggestedBufferSize = le2me_32((h)->dwSuggestedBufferSize); \ | |
120 (h)->dwQuality = le2me_32((h)->dwQuality); \ | |
121 (h)->dwSampleSize = le2me_32((h)->dwSampleSize); \ | |
122 le2me_RECT(&(h)->rcFrame); \ | |
123 } | |
124 #define le2me_RECT(h) { \ | |
125 (h)->left = le2me_16((h)->left); \ | |
126 (h)->top = le2me_16((h)->top); \ | |
127 (h)->right = le2me_16((h)->right); \ | |
128 (h)->bottom = le2me_16((h)->bottom); \ | |
129 } | |
130 #define le2me_BITMAPINFOHEADER(h) { \ | |
131 (h)->biSize = le2me_32((h)->biSize); \ | |
132 (h)->biWidth = le2me_32((h)->biWidth); \ | |
133 (h)->biHeight = le2me_32((h)->biHeight); \ | |
134 (h)->biPlanes = le2me_16((h)->biPlanes); \ | |
135 (h)->biBitCount = le2me_16((h)->biBitCount); \ | |
136 (h)->biCompression = le2me_32((h)->biCompression); \ | |
137 (h)->biSizeImage = le2me_32((h)->biSizeImage); \ | |
138 (h)->biXPelsPerMeter = le2me_32((h)->biXPelsPerMeter); \ | |
139 (h)->biYPelsPerMeter = le2me_32((h)->biYPelsPerMeter); \ | |
140 (h)->biClrUsed = le2me_32((h)->biClrUsed); \ | |
141 (h)->biClrImportant = le2me_32((h)->biClrImportant); \ | |
142 } | |
143 #define le2me_WAVEFORMATEX(h) { \ | |
144 (h)->wFormatTag = le2me_16((h)->wFormatTag); \ | |
145 (h)->nChannels = le2me_16((h)->nChannels); \ | |
146 (h)->nSamplesPerSec = le2me_32((h)->nSamplesPerSec); \ | |
147 (h)->nAvgBytesPerSec = le2me_32((h)->nAvgBytesPerSec); \ | |
148 (h)->nBlockAlign = le2me_16((h)->nBlockAlign); \ | |
149 (h)->wBitsPerSample = le2me_16((h)->wBitsPerSample); \ | |
150 (h)->cbSize = le2me_16((h)->cbSize); \ | |
151 } | |
152 #define le2me_AVIINDEXENTRY(h) { \ | |
153 (h)->ckid = le2me_32((h)->ckid); \ | |
154 (h)->dwFlags = le2me_32((h)->dwFlags); \ | |
155 (h)->dwChunkOffset = le2me_32((h)->dwChunkOffset); \ | |
156 (h)->dwChunkLength = le2me_32((h)->dwChunkLength); \ | |
157 } | |
12036 | 158 #define le2me_AVISTDIDXCHUNK(h) {\ |
159 char c; \ | |
160 c = (h)->fcc[0]; (h)->fcc[0] = (h)->fcc[3]; (h)->fcc[3] = c; \ | |
161 c = (h)->fcc[1]; (h)->fcc[1] = (h)->fcc[2]; (h)->fcc[2] = c; \ | |
162 (h)->dwSize = le2me_32((h)->dwSize); \ | |
163 (h)->wLongsPerEntry = le2me_16((h)->wLongsPerEntry); \ | |
164 (h)->nEntriesInUse = le2me_32((h)->nEntriesInUse); \ | |
165 c = (h)->dwChunkId[0]; (h)->dwChunkId[0] = (h)->dwChunkId[3]; (h)->dwChunkId[3] = c; \ | |
166 c = (h)->dwChunkId[1]; (h)->dwChunkId[1] = (h)->dwChunkId[2]; (h)->dwChunkId[2] = c; \ | |
167 (h)->qwBaseOffset = le2me_64((h)->qwBaseOffset); \ | |
168 (h)->dwReserved3 = le2me_32((h)->dwReserved3); \ | |
169 } | |
170 #define le2me_AVISTDIDXENTRY(h) {\ | |
171 (h)->dwOffset = le2me_32((h)->dwOffset); \ | |
172 (h)->dwSize = le2me_32((h)->dwSize); \ | |
173 } | |
174 #define le2me_VideoPropHeader(h) { \ | |
12046 | 175 (h)->VideoFormatToken = le2me_32((h)->VideoFormatToken); \ |
176 (h)->VideoStandard = le2me_32((h)->VideoStandard); \ | |
177 (h)->dwVerticalRefreshRate = le2me_32((h)->dwVerticalRefreshRate); \ | |
178 (h)->dwHTotalInT = le2me_32((h)->dwHTotalInT); \ | |
179 (h)->dwVTotalInLines = le2me_32((h)->dwVTotalInLines); \ | |
180 (h)->dwFrameAspectRatio = le2me_32((h)->dwFrameAspectRatio); \ | |
181 (h)->dwFrameWidthInPixels = le2me_32((h)->dwFrameWidthInPixels); \ | |
182 (h)->dwFrameHeightInLines = le2me_32((h)->dwFrameHeightInLines); \ | |
183 (h)->nbFieldPerFrame = le2me_32((h)->nbFieldPerFrame); \ | |
12036 | 184 } |
185 #define le2me_VIDEO_FIELD_DESC(h) { \ | |
12046 | 186 (h)->CompressedBMHeight = le2me_32((h)->CompressedBMHeight); \ |
187 (h)->CompressedBMWidth = le2me_32((h)->CompressedBMWidth); \ | |
188 (h)->ValidBMHeight = le2me_32((h)->ValidBMHeight); \ | |
189 (h)->ValidBMWidth = le2me_32((h)->ValidBMWidth); \ | |
190 (h)->ValidBMXOffset = le2me_32((h)->ValidBMXOffset); \ | |
191 (h)->ValidBMYOffset = le2me_32((h)->ValidBMYOffset); \ | |
192 (h)->VideoXOffsetInT = le2me_32((h)->VideoXOffsetInT); \ | |
193 (h)->VideoYValidStartLine = le2me_32((h)->VideoYValidStartLine); \ | |
12036 | 194 } |
195 | |
1343 | 196 #else |
197 #define le2me_MainAVIHeader(h) /**/ | |
198 #define le2me_AVIStreamHeader(h) /**/ | |
199 #define le2me_RECT(h) /**/ | |
200 #define le2me_BITMAPINFOHEADER(h) /**/ | |
201 #define le2me_WAVEFORMATEX(h) /**/ | |
202 #define le2me_AVIINDEXENTRY(h) /**/ | |
12036 | 203 #define le2me_AVISTDIDXCHUNK(h) /**/ |
204 #define le2me_AVISTDIDXENTRY(h) /**/ | |
205 #define le2me_VideoPropHeader(h) /**/ | |
206 #define le2me_VIDEO_FIELD_DESC(h) /**/ | |
1343 | 207 #endif |
208 | |
1485
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1343
diff
changeset
|
209 typedef struct { |
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1343
diff
changeset
|
210 // index stuff: |
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1343
diff
changeset
|
211 void* idx; |
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1343
diff
changeset
|
212 int idx_size; |
6056
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
2330
diff
changeset
|
213 off_t idx_pos; |
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
2330
diff
changeset
|
214 off_t idx_pos_a; |
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
2330
diff
changeset
|
215 off_t idx_pos_v; |
f980563afdbc
big (>2GB) AVI files support - patch by Wolfram Gloger <wg@malloc.de>
arpi
parents:
2330
diff
changeset
|
216 off_t idx_offset; // ennyit kell hozzaadni az index offset ertekekhez |
8030
2b39ff3860b7
cleanup of .AVI timestamp calculation (ugly hack from mplayer.c removed,
arpi
parents:
6056
diff
changeset
|
217 // bps-based PTS stuff: |
2b39ff3860b7
cleanup of .AVI timestamp calculation (ugly hack from mplayer.c removed,
arpi
parents:
6056
diff
changeset
|
218 int video_pack_no; |
2b39ff3860b7
cleanup of .AVI timestamp calculation (ugly hack from mplayer.c removed,
arpi
parents:
6056
diff
changeset
|
219 int audio_block_size; |
2b39ff3860b7
cleanup of .AVI timestamp calculation (ugly hack from mplayer.c removed,
arpi
parents:
6056
diff
changeset
|
220 off_t audio_block_no; |
1485
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1343
diff
changeset
|
221 // interleaved PTS stuff: |
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1343
diff
changeset
|
222 int skip_video_frames; |
2330 | 223 int audio_streams; |
1485
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1343
diff
changeset
|
224 float avi_audio_pts; |
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1343
diff
changeset
|
225 float avi_video_pts; |
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1343
diff
changeset
|
226 float pts_correction; |
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1343
diff
changeset
|
227 unsigned int pts_corr_bytes; |
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1343
diff
changeset
|
228 unsigned char pts_corrected; |
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1343
diff
changeset
|
229 unsigned char pts_has_video; |
8208
ae5a2ae1c349
demuxer_control(), percent position and time length query implemented in
arpi
parents:
8030
diff
changeset
|
230 unsigned int numberofframes; |
12036 | 231 avisuperindex_chunk *suidx; |
232 int suidx_size; | |
233 int isodml; | |
1485
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1343
diff
changeset
|
234 } avi_priv_t; |
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1343
diff
changeset
|
235 |
b895f95e7657
AVI demuxer cleanups, fileformat-dependent stuff moved to priv_t
arpi
parents:
1343
diff
changeset
|
236 #define AVI_PRIV ((avi_priv_t*)(demuxer->priv)) |
12036 | 237 |
238 #define AVI_IDX_OFFSET(x) ((((uint64_t)(x)->dwFlags&0xffff0000)<<16)+(x)->dwChunkOffset) | |
239 | |
240 #endif /* _aviheader_h */ |