diff --git a/dlls/avifil32/api.c b/dlls/avifil32/api.c index 332dbc451a8..382d1bf8d75 100644 --- a/dlls/avifil32/api.c +++ b/dlls/avifil32/api.c @@ -840,9 +840,22 @@ HRESULT WINAPI AVIStreamOpenFromFileW(PAVISTREAM *ppavi, LPCWSTR szFile, */ LONG WINAPI AVIStreamBeginStreaming(PAVISTREAM pavi, LONG lStart, LONG lEnd, LONG lRate) { - FIXME("(%p)->(%ld,%ld,%ld)\n", pavi, lStart, lEnd, lRate); + IAVIStreaming* pstream = NULL; + HRESULT hr; - return AVIERR_OK; + TRACE("(%p,%ld,%ld,%ld)\n", pavi, lStart, lEnd, lRate); + + if (pavi == NULL) + return AVIERR_BADHANDLE; + + hr = IAVIStream_QueryInterface(pavi, &IID_IAVIStreaming, (LPVOID*)&pstream); + if (SUCCEEDED(hr) && pstream != NULL) { + hr = IAVIStreaming_Begin(pstream, lStart, lEnd, lRate); + IAVIStreaming_Release(pstream); + } else + hr = AVIERR_OK; + + return hr; } /*********************************************************************** @@ -850,9 +863,18 @@ LONG WINAPI AVIStreamBeginStreaming(PAVISTREAM pavi, LONG lStart, LONG lEnd, LON */ LONG WINAPI AVIStreamEndStreaming(PAVISTREAM pavi) { - FIXME("(%p)\n", pavi); + IAVIStreaming* pstream = NULL; + HRESULT hr; - return AVIERR_OK; + TRACE("(%p)\n", pavi); + + hr = IAVIStream_QueryInterface(pavi, &IID_IAVIStreaming, (LPVOID*)&pstream); + if (SUCCEEDED(hr) && pstream != NULL) { + IAVIStreaming_End(pstream); + IAVIStreaming_Release(pstream); + } + + return AVIERR_OK; } /*********************************************************************** diff --git a/dlls/avifil32/avifile.c b/dlls/avifil32/avifile.c index f30edd67dac..084dadc96b4 100644 --- a/dlls/avifil32/avifile.c +++ b/dlls/avifil32/avifile.c @@ -1678,6 +1678,9 @@ static HRESULT AVIFILE_LoadFile(IAVIFileImpl *This) case ckidSTREAMFORMAT: if (pStream->lpFormat != NULL) return AVIERR_BADFORMAT; + if (ck.cksize == 0) + break; + pStream->lpFormat = GlobalAllocPtr(GMEM_DDESHARE|GMEM_MOVEABLE, ck.cksize); if (pStream->lpFormat == NULL) @@ -2388,9 +2391,6 @@ static HRESULT AVIFILE_SaveIndex(IAVIFileImpl *This) for (nStream = 0; nStream < This->fInfo.dwStreams; nStream++) { pStream = This->ppStreams[nStream]; - if (pStream->lLastFrame == -1) - pStream->lLastFrame = 0; - for (n = 0; n <= pStream->lLastFrame; n++) { if ((pStream->sInfo.dwFlags & AVISTREAMINFO_FORMATCHANGES) && (pStream->sInfo.dwFormatChangeCount != 0)) { diff --git a/dlls/avifil32/getframe.c b/dlls/avifil32/getframe.c index 95993c7f379..1eb9f42f838 100644 --- a/dlls/avifil32/getframe.c +++ b/dlls/avifil32/getframe.c @@ -1,5 +1,5 @@ /* - * Copyright 2002 Michael Günnewig + * Copyright 2002-2003 Michael Günnewig * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -227,9 +227,9 @@ static LPVOID WINAPI IGetFrame_fnGetFrame(IGetFrame *iface, LONG lPos) if (lNext == -1) return NULL; if (lNext <= This->lCurrentFrame && This->lCurrentFrame < lPos) - lNext++; + lNext = This->lCurrentFrame + 1; - for (; lNext < lPos; lNext++) { + for (; lNext <= lPos; lNext++) { /* new format for this frame? */ if (This->bFormatChanges) { AVIStreamReadFormat(This->pStream, lNext, This->lpInFormat, &This->cbInFormat); diff --git a/include/vfw.h b/include/vfw.h index 9b514719430..e2108ea0301 100644 --- a/include/vfw.h +++ b/include/vfw.h @@ -1118,6 +1118,7 @@ LONG WINAPI AVIStreamTimeToSample(PAVISTREAM pstream, LONG lTime); IUnknown_METHODS \ STDMETHOD(Begin)(IAVIStreaming*iface,LONG lStart,LONG lEnd,LONG lRate) PURE; \ STDMETHOD(End)(IAVIStreaming*iface) PURE; +ICOM_DEFINE(IAVIStreaming, IUnknown) #undef INTERFACE #ifdef COBJMACROS