static HRESULT WINAPI IAVIFile_fnInfo(IAVIFile *iface, AVIFILEINFOW *afi, LONG size) { IAVIFileImpl *This = impl_from_IAVIFile(iface); TRACE("(%p,%p,%d)\n",iface,afi,size); if (afi == NULL) return AVIERR_BADPARAM; if (size < 0) return AVIERR_BADSIZE; /* update file info */ This->fInfo.dwFlags = 0; This->fInfo.dwCaps = AVIFILECAPS_CANREAD|AVIFILECAPS_CANWRITE; if (This->lpFormat != NULL) { assert(This->sInfo.dwScale != 0); This->fInfo.dwStreams = 1; This->fInfo.dwScale = This->sInfo.dwScale; This->fInfo.dwRate = This->sInfo.dwRate; This->fInfo.dwLength = This->sInfo.dwLength; This->fInfo.dwSuggestedBufferSize = This->ckData.cksize; This->fInfo.dwMaxBytesPerSec = MulDiv(This->sInfo.dwSampleSize,This->sInfo.dwRate,This->sInfo.dwScale); } memcpy(afi, &This->fInfo, min((DWORD)size, sizeof(This->fInfo))); if ((DWORD)size < sizeof(This->fInfo)) return AVIERR_BUFFERTOOSMALL; return AVIERR_OK; }
static HRESULT WINAPI IAVIFile_fnReadData(IAVIFile *iface, DWORD ckid, void *lpData, LONG *size) { IAVIFileImpl *This = impl_from_IAVIFile(iface); TRACE("(%p,0x%08X,%p,%p)\n", iface, ckid, lpData, size); return ReadExtraChunk(&This->extra, ckid, lpData, size); }
static ULONG WINAPI ITmpFile_fnAddRef(IAVIFile *iface) { ITmpFileImpl *This = impl_from_IAVIFile(iface); ULONG ref = InterlockedIncrement(&This->ref); TRACE("(%p) -> %d\n", iface, ref); return ref; }
static HRESULT WINAPI IAVIFile_fnCreateStream(IAVIFile *iface, IAVIStream **avis, AVISTREAMINFOW *asi) { IAVIFileImpl *This = impl_from_IAVIFile(iface); TRACE("(%p,%p,%p)\n", iface, avis, asi); /* check parameters */ if (avis == NULL || asi == NULL) return AVIERR_BADPARAM; *avis = NULL; /* We only support one audio stream */ if (This->fInfo.dwStreams != 0 || This->lpFormat != NULL) return AVIERR_UNSUPPORTED; if (asi->fccType != streamtypeAUDIO) return AVIERR_UNSUPPORTED; /* Does the user have write permission? */ if ((This->uMode & MMIO_RWMODE) == 0) return AVIERR_READONLY; This->cbFormat = 0; This->lpFormat = NULL; memcpy(&This->sInfo, asi, sizeof(This->sInfo)); /* make sure streaminfo if okay for us */ This->sInfo.fccHandler = 0; This->sInfo.dwFlags = 0; This->sInfo.dwCaps = AVIFILECAPS_CANREAD|AVIFILECAPS_CANWRITE; This->sInfo.dwStart = 0; This->sInfo.dwInitialFrames = 0; This->sInfo.dwFormatChangeCount = 0; memset(&This->sInfo.rcFrame, 0, sizeof(This->sInfo.rcFrame)); This->fInfo.dwStreams = 1; This->fInfo.dwScale = This->sInfo.dwScale; This->fInfo.dwRate = This->sInfo.dwRate; This->fInfo.dwLength = This->sInfo.dwLength; This->ckData.dwDataOffset = 0; This->ckData.cksize = 0; *avis = &This->IAVIStream_iface; IAVIFile_AddRef(*avis); return AVIERR_OK; }
static HRESULT WINAPI ITmpFile_fnQueryInterface(IAVIFile *iface, REFIID refiid, LPVOID *obj) { ITmpFileImpl *This = impl_from_IAVIFile(iface); TRACE("(%p,%s,%p)\n", This, debugstr_guid(refiid), obj); if (IsEqualGUID(&IID_IUnknown, refiid) || IsEqualGUID(&IID_IAVIFile, refiid)) { *obj = iface; IAVIFile_AddRef(iface); return S_OK; } return OLE_E_ENUM_NOMORE; }
static HRESULT WINAPI ITmpFile_fnGetStream(IAVIFile *iface, PAVISTREAM *avis, DWORD fccType, LONG lParam) { ITmpFileImpl *This = impl_from_IAVIFile(iface); ULONG nStream = (ULONG)-1; TRACE("(%p,%p,0x%08X,%d)\n", iface, avis, fccType, lParam); if (avis == NULL || lParam < 0) return AVIERR_BADPARAM; if (fccType != streamtypeANY) { /* search the number of the specified stream */ ULONG i; for (i = 0; i < This->fInfo.dwStreams; i++) { AVISTREAMINFOW sInfo; HRESULT hr; hr = AVIStreamInfoW(This->ppStreams[i], &sInfo, sizeof(sInfo)); if (FAILED(hr)) return hr; if (sInfo.fccType == fccType) { if (lParam == 0) { nStream = i; break; } else lParam--; } } } else nStream = lParam; /* Does the requested stream exist ? */ if (nStream < This->fInfo.dwStreams && This->ppStreams[nStream] != NULL) { *avis = This->ppStreams[nStream]; AVIStreamAddRef(*avis); return AVIERR_OK; } /* Sorry, but the specified stream doesn't exist */ return AVIERR_NODATA; }
static HRESULT WINAPI ITmpFile_fnInfo(IAVIFile *iface, AVIFILEINFOW *afi, LONG size) { ITmpFileImpl *This = impl_from_IAVIFile(iface); TRACE("(%p,%p,%d)\n",iface,afi,size); if (afi == NULL) return AVIERR_BADPARAM; if (size < 0) return AVIERR_BADSIZE; memcpy(afi, &This->fInfo, min((DWORD)size, sizeof(This->fInfo))); if ((DWORD)size < sizeof(This->fInfo)) return AVIERR_BUFFERTOOSMALL; return AVIERR_OK; }
static HRESULT WINAPI IAVIFile_fnWriteData(IAVIFile *iface, DWORD ckid, void *lpData, LONG size) { IAVIFileImpl *This = impl_from_IAVIFile(iface); TRACE("(%p,0x%08X,%p,%d)\n", iface, ckid, lpData, size); /* check parameters */ if (lpData == NULL) return AVIERR_BADPARAM; if (size < 0) return AVIERR_BADSIZE; /* Do we have write permission? */ if ((This->uMode & MMIO_RWMODE) == 0) return AVIERR_READONLY; This->fDirty = TRUE; return WriteExtraChunk(&This->extra, ckid, lpData, size); }
static HRESULT WINAPI IAVIFile_fnDeleteStream(IAVIFile *iface, DWORD fccType, LONG lParam) { IAVIFileImpl *This = impl_from_IAVIFile(iface); TRACE("(%p,0x%08X,%d)\n", iface, fccType, lParam); /* check parameter */ if (lParam < 0) return AVIERR_BADPARAM; /* Do we have our audio stream? */ if (lParam != 0 || This->fInfo.dwStreams == 0 || (fccType != 0 && fccType != streamtypeAUDIO)) return AVIERR_NODATA; /* Have user write permissions? */ if ((This->uMode & MMIO_RWMODE) == 0) return AVIERR_READONLY; HeapFree(GetProcessHeap(), 0, This->lpFormat); This->lpFormat = NULL; This->cbFormat = 0; /* update infos */ This->ckData.dwDataOffset = 0; This->ckData.cksize = 0; This->sInfo.dwScale = 0; This->sInfo.dwRate = 0; This->sInfo.dwLength = 0; This->sInfo.dwSuggestedBufferSize = 0; This->fInfo.dwStreams = 0; This->fInfo.dwEditCount++; This->fDirty = TRUE; return AVIERR_OK; }
static ULONG WINAPI ITmpFile_fnRelease(IAVIFile *iface) { ITmpFileImpl *This = impl_from_IAVIFile(iface); ULONG ref = InterlockedDecrement(&This->ref); TRACE("(%p) -> %d\n", iface, ref); if (!ref) { unsigned int i; for (i = 0; i < This->fInfo.dwStreams; i++) { if (This->ppStreams[i] != NULL) { AVIStreamRelease(This->ppStreams[i]); This->ppStreams[i] = NULL; } } HeapFree(GetProcessHeap(), 0, This); } return ref; }
static HRESULT WINAPI IAVIFile_fnGetStream(IAVIFile *iface, IAVIStream **avis, DWORD fccType, LONG lParam) { IAVIFileImpl *This = impl_from_IAVIFile(iface); TRACE("(%p,%p,0x%08X,%d)\n", iface, avis, fccType, lParam); /* check parameter */ if (avis == NULL) return AVIERR_BADPARAM; *avis = NULL; /* Does our stream exists? */ if (lParam != 0 || This->fInfo.dwStreams == 0) return AVIERR_NODATA; if (fccType != 0 && fccType != streamtypeAUDIO) return AVIERR_NODATA; *avis = &This->IAVIStream_iface; IAVIFile_AddRef(*avis); return AVIERR_OK; }
static ULONG WINAPI IAVIFile_fnRelease(IAVIFile *iface) { IAVIFileImpl *This = impl_from_IAVIFile(iface); return IUnknown_Release(This->outer_unk); }
static HRESULT WINAPI IAVIFile_fnQueryInterface(IAVIFile *iface, REFIID riid, void **ret_iface) { IAVIFileImpl *This = impl_from_IAVIFile(iface); return IUnknown_QueryInterface(This->outer_unk, riid, ret_iface); }