2 * Copyright 2002 Michael Günnewig
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 #define COM_NO_WINDOWS_H
22 #include "extrachunk.h"
27 #include "wine/debug.h"
29 WINE_DEFAULT_DEBUG_CHANNEL(avifile
);
31 /* reads a chunk outof the extrachunk-structure */
32 HRESULT
ReadExtraChunk(LPEXTRACHUNKS extra
,FOURCC ckid
,LPVOID lpData
,
39 assert(extra
!= NULL
);
47 if (((FOURCC
*)lp
)[0] == ckid
) {
48 /* found correct chunk */
49 if (lpData
!= NULL
&& *size
> 0)
50 memcpy(lpData
, lp
+ 2 * sizeof(DWORD
), min(((LPDWORD
)lp
)[1],*size
));
52 *size
= ((LPDWORD
)lp
)[1];
56 /* skip to next chunk */
57 cb
-= ((LPDWORD
)lp
)[1] + 2 * sizeof(DWORD
);
58 lp
+= ((LPDWORD
)lp
)[1] + 2 * sizeof(DWORD
);
63 /* wanted chunk doesn't exist */
69 /* writes a chunk into the extrachunk-structure */
70 HRESULT
WriteExtraChunk(LPEXTRACHUNKS extra
,FOURCC ckid
,LPVOID lpData
,
76 assert(extra
!= NULL
);
77 assert(lpData
!= NULL
);
81 lp
= (LPDWORD
)GlobalReAllocPtr(extra
->lp
, extra
->cb
+ size
+ 2 * sizeof(DWORD
), GHND
);
83 lp
= (LPDWORD
)GlobalAllocPtr(GHND
, size
+ 2 * sizeof(DWORD
));
89 ((LPBYTE
)lp
) += extra
->cb
;
90 extra
->cb
+= size
+ 2 * sizeof(DWORD
);
92 /* insert chunk-header in block */
96 if (lpData
!= NULL
&& size
> 0)
97 memcpy(lp
+ 2, lpData
, size
);
102 /* reads a chunk fomr the HMMIO into the extrachunk-structure */
103 HRESULT
ReadChunkIntoExtra(LPEXTRACHUNKS extra
,HMMIO hmmio
,MMCKINFO
*lpck
)
109 assert(extra
!= NULL
);
110 assert(hmmio
!= NULL
);
111 assert(lpck
!= NULL
);
113 cb
= lpck
->cksize
+ 2 * sizeof(DWORD
);
116 if (extra
->lp
!= NULL
) {
117 lp
= (LPDWORD
)GlobalReAllocPtr(extra
->lp
, extra
->cb
+ cb
, GHND
);
119 lp
= (LPDWORD
)GlobalAllocPtr(GHND
, cb
);
122 return AVIERR_MEMORY
;
125 ((LPBYTE
)lp
) += extra
->cb
;
128 /* insert chunk-header in block */
130 lp
[1] = lpck
->cksize
;
132 if (lpck
->cksize
> 0) {
133 if (mmioSeek(hmmio
, lpck
->dwDataOffset
, SEEK_SET
) == -1)
134 return AVIERR_FILEREAD
;
135 if (mmioRead(hmmio
, (HPSTR
)&lp
[2], lpck
->cksize
) != lpck
->cksize
)
136 return AVIERR_FILEREAD
;
142 /* reads all non-junk chunks into the extrachunk-structure until it founds
143 * the given chunk or the optional parent-chunk is at the end */
144 HRESULT
FindChunkAndKeepExtras(LPEXTRACHUNKS extra
,HMMIO hmmio
,MMCKINFO
*lpck
,
145 MMCKINFO
*lpckParent
,UINT flags
)
152 assert(extra
!= NULL
);
153 assert(hmmio
!= NULL
);
154 assert(lpck
!= NULL
);
156 TRACE("({%p,%lu},%p,%p,%p,0x%X)\n", extra
->lp
, extra
->cb
, hmmio
, lpck
,
159 /* what chunk id and form/list type shoiuld we search? */
160 if (flags
& MMIO_FINDCHUNK
) {
163 } else if (flags
& MMIO_FINDLIST
) {
165 fccType
= lpck
->fccType
;
166 } else if (flags
& MMIO_FINDRIFF
) {
168 fccType
= lpck
->fccType
;
170 ckid
= fccType
= (FOURCC
)-1; /* collect everything into extra! */
172 TRACE(": find ckid=0x%08lX fccType=0x%08lX\n", ckid
, fccType
);
175 hr
= mmioDescend(hmmio
, lpck
, lpckParent
, 0);
177 /* No extra chunks infront of desired chunk? */
178 if (flags
== 0 && hr
== MMIOERR_CHUNKNOTFOUND
)
183 /* Have we found what we search for? */
184 if ((lpck
->ckid
== ckid
) &&
185 (fccType
== (FOURCC
)0 || lpck
->fccType
== fccType
))
188 /* Skip padding chunks, the others put into the extrachunk-structure */
189 if (lpck
->ckid
== ckidAVIPADDING
||
190 lpck
->ckid
== mmioFOURCC('p','a','d','d'))
191 hr
= mmioAscend(hmmio
, lpck
, 0);
193 hr
= ReadChunkIntoExtra(extra
, hmmio
, lpck
);