ReactOS 0.4.16-dev-334-g4d9f67c
tmpfile.c
Go to the documentation of this file.
1/*
2 * Copyright 2003 Michael Günnewig
3 *
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.
8 *
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.
13 *
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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17 */
18
19#include <stdarg.h>
20
21#include "windef.h"
22#include "winbase.h"
23#include "wingdi.h"
24#include "winuser.h"
25#include "winerror.h"
26#include "vfw.h"
27
28#include "avifile_private.h"
29#include "extrachunk.h"
30
31#include "wine/debug.h"
32
34
35/***********************************************************************/
36
37typedef struct _ITmpFileImpl {
40
44
46{
47 return CONTAINING_RECORD(iface, ITmpFileImpl, IAVIFile_iface);
48}
49
51 LPVOID *obj)
52{
54
55 TRACE("(%p,%s,%p)\n", This, debugstr_guid(refiid), obj);
56
57 if (IsEqualGUID(&IID_IUnknown, refiid) ||
58 IsEqualGUID(&IID_IAVIFile, refiid)) {
59 *obj = iface;
60 IAVIFile_AddRef(iface);
61
62 return S_OK;
63 }
64
65 return OLE_E_ENUM_NOMORE;
66}
67
69{
72
73 TRACE("(%p) -> %d\n", iface, ref);
74
75 return ref;
76}
77
79{
82
83 TRACE("(%p) -> %d\n", iface, ref);
84
85 if (!ref) {
86 unsigned int i;
87
88 for (i = 0; i < This->fInfo.dwStreams; i++) {
89 if (This->ppStreams[i] != NULL) {
90 AVIStreamRelease(This->ppStreams[i]);
91
92 This->ppStreams[i] = NULL;
93 }
94 }
95
97 }
98
99 return ref;
100}
101
103 AVIFILEINFOW *afi, LONG size)
104{
106
107 TRACE("(%p,%p,%d)\n",iface,afi,size);
108
109 if (afi == NULL)
110 return AVIERR_BADPARAM;
111 if (size < 0)
112 return AVIERR_BADSIZE;
113
114 memcpy(afi, &This->fInfo, min((DWORD)size, sizeof(This->fInfo)));
115
116 if ((DWORD)size < sizeof(This->fInfo))
118 return AVIERR_OK;
119}
120
122 DWORD fccType, LONG lParam)
123{
125
126 ULONG nStream = (ULONG)-1;
127
128 TRACE("(%p,%p,0x%08X,%d)\n", iface, avis, fccType, lParam);
129
130 if (avis == NULL || lParam < 0)
131 return AVIERR_BADPARAM;
132
133 if (fccType != streamtypeANY) {
134 /* search the number of the specified stream */
135 ULONG i;
136
137 for (i = 0; i < This->fInfo.dwStreams; i++) {
138 AVISTREAMINFOW sInfo;
139 HRESULT hr;
140
141 hr = AVIStreamInfoW(This->ppStreams[i], &sInfo, sizeof(sInfo));
142 if (FAILED(hr))
143 return hr;
144
145 if (sInfo.fccType == fccType) {
146 if (lParam == 0) {
147 nStream = i;
148 break;
149 } else
150 lParam--;
151 }
152 }
153 } else
154 nStream = lParam;
155
156 /* Does the requested stream exist ? */
157 if (nStream < This->fInfo.dwStreams && This->ppStreams[nStream] != NULL) {
158 *avis = This->ppStreams[nStream];
159 AVIStreamAddRef(*avis);
160
161 return AVIERR_OK;
162 }
163
164 /* Sorry, but the specified stream doesn't exist */
165 return AVIERR_NODATA;
166}
167
169 AVISTREAMINFOW *asi)
170{
171 TRACE("(%p,%p,%p)\n",iface,avis,asi);
172
173 return AVIERR_UNSUPPORTED;
174}
175
177 LPVOID lpData, LONG size)
178{
179 TRACE("(%p,0x%08X,%p,%d)\n", iface, ckid, lpData, size);
180
181 return AVIERR_UNSUPPORTED;
182}
183
185 LPVOID lpData, LONG *size)
186{
187 TRACE("(%p,0x%08X,%p,%p)\n", iface, ckid, lpData, size);
188
189 return AVIERR_UNSUPPORTED;
190}
191
193{
194 TRACE("(%p)\n",iface);
195
196 return AVIERR_OK;
197}
198
200 LONG lParam)
201{
202 TRACE("(%p,0x%08X,%d)\n", iface, fccType, lParam);
203
204 return AVIERR_UNSUPPORTED;
205}
206
207static const struct IAVIFileVtbl itmpft = {
218};
219
221{
222 ITmpFileImpl *tmpFile;
223 int i;
224
226 if (tmpFile == NULL)
227 return NULL;
228
229 tmpFile->IAVIFile_iface.lpVtbl = &itmpft;
230 tmpFile->ref = 1;
231 memset(&tmpFile->fInfo, 0, sizeof(tmpFile->fInfo));
232
233 tmpFile->fInfo.dwStreams = nStreams;
234 tmpFile->ppStreams = HeapAlloc(GetProcessHeap(), 0, nStreams * sizeof(PAVISTREAM));
235 if (tmpFile->ppStreams == NULL) {
236 HeapFree(GetProcessHeap(), 0, tmpFile);
237 return NULL;
238 }
239
240 for (i = 0; i < nStreams; i++) {
241 AVISTREAMINFOW sInfo;
242
243 tmpFile->ppStreams[i] = ppStreams[i];
244
245 AVIStreamAddRef(ppStreams[i]);
246 AVIStreamInfoW(ppStreams[i], &sInfo, sizeof(sInfo));
247 if (i == 0) {
248 tmpFile->fInfo.dwScale = sInfo.dwScale;
249 tmpFile->fInfo.dwRate = sInfo.dwRate;
250 if (!sInfo.dwScale || !sInfo.dwRate) {
251 tmpFile->fInfo.dwScale = 1;
252 tmpFile->fInfo.dwRate = 100;
253 }
254 }
255
258
259 {
260 DWORD tmp;
261
262 tmp = MulDiv(AVIStreamSampleToTime(ppStreams[i], sInfo.dwLength),
263 tmpFile->fInfo.dwScale, tmpFile->fInfo.dwRate * 1000);
264 if (tmpFile->fInfo.dwLength < tmp)
265 tmpFile->fInfo.dwLength = tmp;
266
267 tmp = sInfo.rcFrame.right - sInfo.rcFrame.left;
268 if (tmpFile->fInfo.dwWidth < tmp)
269 tmpFile->fInfo.dwWidth = tmp;
270 tmp = sInfo.rcFrame.bottom - sInfo.rcFrame.top;
271 if (tmpFile->fInfo.dwHeight < tmp)
272 tmpFile->fInfo.dwHeight = tmp;
273 }
274 }
275
276 return &tmpFile->IAVIFile_iface;
277}
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
static const WCHAR avifile[]
Definition: avisplitter.c:273
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
const GUID IID_IUnknown
LPARAM lParam
Definition: combotst.c:139
#define NULL
Definition: types.h:112
LONG WINAPI AVIStreamSampleToTime(PAVISTREAM pstream, LONG lSample)
Definition: api.c:894
ULONG WINAPI AVIStreamAddRef(PAVISTREAM pstream)
Definition: api.c:434
INT nStreams
Definition: api.c:60
HRESULT WINAPI AVIStreamInfoW(PAVISTREAM pstream, LPAVISTREAMINFOW asi, LONG size)
Definition: api.c:522
ULONG WINAPI AVIStreamRelease(PAVISTREAM pstream)
Definition: api.c:449
#define GetProcessHeap()
Definition: compat.h:736
#define HeapAlloc
Definition: compat.h:733
#define HeapFree(x, y, z)
Definition: compat.h:735
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
unsigned long DWORD
Definition: ntddk_ex.h:95
GLsizeiptr size
Definition: glext.h:5919
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define S_OK
Definition: intsafe.h:52
#define FAILED(hr)
Definition: intsafe.h:51
#define debugstr_guid
Definition: kernel32.h:35
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define min(a, b)
Definition: monoChain.cc:55
INT WINAPI MulDiv(INT nNumber, INT nNumerator, INT nDenominator)
Definition: muldiv.c:25
long LONG
Definition: pedump.c:60
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define REFIID
Definition: guiddef.h:118
#define memset(x, y, z)
Definition: compat.h:39
HRESULT hr
Definition: shlfolder.c:183
#define TRACE(s)
Definition: solgame.cpp:4
DWORD dwRate
Definition: avifil32.idl:78
DWORD dwWidth
Definition: avifil32.idl:75
DWORD dwStreams
Definition: avifil32.idl:73
DWORD dwSuggestedBufferSize
Definition: avifil32.idl:74
DWORD dwHeight
Definition: avifil32.idl:76
DWORD dwScale
Definition: avifil32.idl:77
DWORD dwLength
Definition: avifil32.idl:79
DWORD dwSuggestedBufferSize
Definition: avifil32.idl:40
LONG ref
Definition: tmpfile.c:39
IAVIFile IAVIFile_iface
Definition: tmpfile.c:38
AVIFILEINFOW fInfo
Definition: tmpfile.c:41
PAVISTREAM * ppStreams
Definition: tmpfile.c:42
Definition: send.c:48
LONG right
Definition: windef.h:308
LONG bottom
Definition: windef.h:309
LONG top
Definition: windef.h:307
LONG left
Definition: windef.h:306
static HRESULT WINAPI ITmpFile_fnCreateStream(IAVIFile *iface, PAVISTREAM *avis, AVISTREAMINFOW *asi)
Definition: tmpfile.c:168
static HRESULT WINAPI ITmpFile_fnDeleteStream(IAVIFile *iface, DWORD fccType, LONG lParam)
Definition: tmpfile.c:199
static HRESULT WINAPI ITmpFile_fnWriteData(IAVIFile *iface, DWORD ckid, LPVOID lpData, LONG size)
Definition: tmpfile.c:176
static HRESULT WINAPI ITmpFile_fnInfo(IAVIFile *iface, AVIFILEINFOW *afi, LONG size)
Definition: tmpfile.c:102
struct _ITmpFileImpl ITmpFileImpl
static HRESULT WINAPI ITmpFile_fnEndRecord(IAVIFile *iface)
Definition: tmpfile.c:192
static HRESULT WINAPI ITmpFile_fnReadData(IAVIFile *iface, DWORD ckid, LPVOID lpData, LONG *size)
Definition: tmpfile.c:184
static ULONG WINAPI ITmpFile_fnAddRef(IAVIFile *iface)
Definition: tmpfile.c:68
static ULONG WINAPI ITmpFile_fnRelease(IAVIFile *iface)
Definition: tmpfile.c:78
static ITmpFileImpl * impl_from_IAVIFile(IAVIFile *iface)
Definition: tmpfile.c:45
PAVIFILE AVIFILE_CreateAVITempFile(int nStreams, const PAVISTREAM *ppStreams)
Definition: tmpfile.c:220
static const struct IAVIFileVtbl itmpft
Definition: tmpfile.c:207
static HRESULT WINAPI ITmpFile_fnQueryInterface(IAVIFile *iface, REFIID refiid, LPVOID *obj)
Definition: tmpfile.c:50
static HRESULT WINAPI ITmpFile_fnGetStream(IAVIFile *iface, PAVISTREAM *avis, DWORD fccType, LONG lParam)
Definition: tmpfile.c:121
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
#define AVIERR_UNSUPPORTED
Definition: vfw.h:1743
#define AVIERR_BADSIZE
Definition: vfw.h:1749
#define streamtypeANY
Definition: vfw.h:903
#define AVIERR_OK
Definition: vfw.h:1740
#define IAVIFile_AddRef(p)
Definition: vfw.h:1603
#define AVIERR_BUFFERTOOSMALL
Definition: vfw.h:1758
#define AVIERR_NODATA
Definition: vfw.h:1757
#define AVIERR_BADPARAM
Definition: vfw.h:1748
#define WINAPI
Definition: msvc.h:6
#define OLE_E_ENUM_NOMORE
Definition: winerror.h:2616