ReactOS  0.4.15-dev-2355-gaf9df93
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 
37 typedef struct _ITmpFileImpl {
40 
43 } ITmpFileImpl;
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))
117  return AVIERR_BUFFERTOOSMALL;
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 
207 static const struct IAVIFileVtbl itmpft = {
218 };
219 
221 {
222  ITmpFileImpl *tmpFile;
223  int i;
224 
225  tmpFile = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(ITmpFileImpl));
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 REFIID
Definition: guiddef.h:118
#define AVIERR_NODATA
Definition: vfw.h:1757
HRESULT hr
Definition: shlfolder.c:183
static HRESULT WINAPI ITmpFile_fnDeleteStream(IAVIFile *iface, DWORD fccType, LONG lParam)
Definition: tmpfile.c:199
DWORD dwSuggestedBufferSize
Definition: avifil32.idl:40
HRESULT WINAPI AVIStreamInfoW(PAVISTREAM pstream, LPAVISTREAMINFOW asi, LONG size)
Definition: api.c:522
LONG top
Definition: windef.h:307
LONG left
Definition: windef.h:306
PAVISTREAM * ppStreams
Definition: tmpfile.c:42
INT WINAPI MulDiv(INT nNumber, INT nNumerator, INT nDenominator)
Definition: muldiv.c:25
LONG WINAPI AVIStreamSampleToTime(PAVISTREAM pstream, LONG lSample)
Definition: api.c:894
static HRESULT WINAPI ITmpFile_fnGetStream(IAVIFile *iface, PAVISTREAM *avis, DWORD fccType, LONG lParam)
Definition: tmpfile.c:121
#define OLE_E_ENUM_NOMORE
Definition: winerror.h:2616
LONG right
Definition: windef.h:308
Definition: send.c:48
static const WCHAR avifile[]
Definition: avisplitter.c:273
#define IAVIFile_AddRef(p)
Definition: vfw.h:1603
struct _ITmpFileImpl ITmpFileImpl
static const struct IAVIFileVtbl itmpft
Definition: tmpfile.c:207
long LONG
Definition: pedump.c:60
GLenum GLint ref
Definition: glext.h:6028
ULONG WINAPI AVIStreamAddRef(PAVISTREAM pstream)
Definition: api.c:434
INT nStreams
Definition: api.c:60
#define debugstr_guid
Definition: kernel32.h:35
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
#define AVIERR_BUFFERTOOSMALL
Definition: vfw.h:1758
#define AVIERR_BADPARAM
Definition: vfw.h:1748
#define AVIERR_UNSUPPORTED
Definition: vfw.h:1743
#define TRACE(s)
Definition: solgame.cpp:4
GLsizeiptr size
Definition: glext.h:5919
#define GetProcessHeap()
Definition: compat.h:595
DWORD dwWidth
Definition: avifil32.idl:75
static ULONG WINAPI ITmpFile_fnAddRef(IAVIFile *iface)
Definition: tmpfile.c:68
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
LONG HRESULT
Definition: typedefs.h:79
PAVIFILE AVIFILE_CreateAVITempFile(int nStreams, const PAVISTREAM *ppStreams)
Definition: tmpfile.c:220
const GUID IID_IUnknown
#define AVIERR_BADSIZE
Definition: vfw.h:1749
DWORD dwLength
Definition: avifil32.idl:79
DWORD dwHeight
Definition: avifil32.idl:76
static ITmpFileImpl * impl_from_IAVIFile(IAVIFile *iface)
Definition: tmpfile.c:45
DWORD dwScale
Definition: avifil32.idl:77
#define WINAPI
Definition: msvc.h:6
unsigned long DWORD
Definition: ntddk_ex.h:95
ULONG WINAPI AVIStreamRelease(PAVISTREAM pstream)
Definition: api.c:449
LONG ref
Definition: tmpfile.c:39
DWORD dwSuggestedBufferSize
Definition: avifil32.idl:74
#define InterlockedDecrement
Definition: armddk.h:52
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
static HRESULT WINAPI ITmpFile_fnInfo(IAVIFile *iface, AVIFILEINFOW *afi, LONG size)
Definition: tmpfile.c:102
#define AVIERR_OK
Definition: vfw.h:1740
static HRESULT WINAPI ITmpFile_fnEndRecord(IAVIFile *iface)
Definition: tmpfile.c:192
#define S_OK
Definition: intsafe.h:51
#define InterlockedIncrement
Definition: armddk.h:53
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
DWORD dwRate
Definition: avifil32.idl:78
WINE_DEFAULT_DEBUG_CHANNEL(avifile)
DWORD dwStreams
Definition: avifil32.idl:73
#define min(a, b)
Definition: monoChain.cc:55
#define NULL
Definition: types.h:112
BOOL WINAPI IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
Definition: compobj.c:4112
#define HEAP_ZERO_MEMORY
Definition: compat.h:134
static HRESULT WINAPI ITmpFile_fnWriteData(IAVIFile *iface, DWORD ckid, LPVOID lpData, LONG size)
Definition: tmpfile.c:176
static ULONG WINAPI ITmpFile_fnRelease(IAVIFile *iface)
Definition: tmpfile.c:78
unsigned int ULONG
Definition: retypes.h:1
LONG bottom
Definition: windef.h:309
static HRESULT WINAPI ITmpFile_fnQueryInterface(IAVIFile *iface, REFIID refiid, LPVOID *obj)
Definition: tmpfile.c:50
static HRESULT WINAPI ITmpFile_fnCreateStream(IAVIFile *iface, PAVISTREAM *avis, AVISTREAMINFOW *asi)
Definition: tmpfile.c:168
#define memset(x, y, z)
Definition: compat.h:39
#define streamtypeANY
Definition: vfw.h:903
static HRESULT WINAPI ITmpFile_fnReadData(IAVIFile *iface, DWORD ckid, LPVOID lpData, LONG *size)
Definition: tmpfile.c:184
LPARAM lParam
Definition: combotst.c:139
#define HeapFree(x, y, z)
Definition: compat.h:594
AVIFILEINFOW fInfo
Definition: tmpfile.c:41
IAVIFile IAVIFile_iface
Definition: tmpfile.c:38