- Fixed AVIStreamTimeToSample and AVIStreamSampleToTime methods to
stay in bounds and behave like the native ones. - Fallback to mmioOpenA if mmioOpenW doesn't work (when using Win9x DLLs). - Fixed a bug of using mmioDescend/mmioAscend (occured with native libs). - Silent a message which could be incorrect for non-video streams.
This commit is contained in:
parent
2429d51ff2
commit
4d37b6691b
|
@ -899,6 +899,7 @@ LONG WINAPI AVIStreamLength(PAVISTREAM pstream)
|
|||
LONG WINAPI AVIStreamSampleToTime(PAVISTREAM pstream, LONG lSample)
|
||||
{
|
||||
AVISTREAMINFOW asiw;
|
||||
LONG time;
|
||||
|
||||
TRACE("(%p,%ld)\n", pstream, lSample);
|
||||
|
||||
|
@ -910,7 +911,19 @@ LONG WINAPI AVIStreamSampleToTime(PAVISTREAM pstream, LONG lSample)
|
|||
if (asiw.dwRate == 0)
|
||||
return -1;
|
||||
|
||||
return (LONG)(((float)lSample * asiw.dwScale * 1000.0) / asiw.dwRate);
|
||||
/* limit to stream bounds */
|
||||
if (lSample < asiw.dwStart)
|
||||
lSample = asiw.dwStart;
|
||||
if (lSample > asiw.dwStart + asiw.dwLength)
|
||||
lSample = asiw.dwStart + asiw.dwLength;
|
||||
|
||||
if (asiw.dwRate / asiw.dwScale < 1000)
|
||||
time = (LONG)(((float)lSample * asiw.dwScale * 1000) / asiw.dwRate);
|
||||
else
|
||||
time = (LONG)(((float)lSample * asiw.dwScale * 1000 + (asiw.dwRate - 1)) / asiw.dwRate);
|
||||
|
||||
TRACE(" -> %ld\n",time);
|
||||
return time;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
|
@ -920,10 +933,11 @@ LONG WINAPI AVIStreamSampleToTime(PAVISTREAM pstream, LONG lSample)
|
|||
LONG WINAPI AVIStreamTimeToSample(PAVISTREAM pstream, LONG lTime)
|
||||
{
|
||||
AVISTREAMINFOW asiw;
|
||||
LONG sample;
|
||||
|
||||
TRACE("(%p,%ld)\n", pstream, lTime);
|
||||
|
||||
if (pstream == NULL)
|
||||
if (pstream == NULL || lTime < 0)
|
||||
return -1;
|
||||
|
||||
if (FAILED(IAVIStream_Info(pstream, &asiw, sizeof(asiw))))
|
||||
|
@ -931,7 +945,19 @@ LONG WINAPI AVIStreamTimeToSample(PAVISTREAM pstream, LONG lTime)
|
|||
if (asiw.dwScale == 0)
|
||||
return -1;
|
||||
|
||||
return (LONG)(((float)lTime * asiw.dwRate) / asiw.dwScale / 1000.0);
|
||||
if (asiw.dwRate / asiw.dwScale < 1000)
|
||||
sample = (LONG)((((float)asiw.dwRate * lTime) / (asiw.dwScale * 1000)));
|
||||
else
|
||||
sample = (LONG)(((float)asiw.dwRate * lTime + (asiw.dwScale * 1000 - 1)) / (asiw.dwScale * 1000));
|
||||
|
||||
/* limit to stream bounds */
|
||||
if (sample < asiw.dwStart)
|
||||
sample = asiw.dwStart;
|
||||
if (sample > asiw.dwStart + asiw.dwLength)
|
||||
sample = asiw.dwStart + asiw.dwLength;
|
||||
|
||||
TRACE(" -> %ld\n", sample);
|
||||
return sample;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
|
|
|
@ -635,8 +635,20 @@ static HRESULT WINAPI IPersistFile_fnLoad(IPersistFile *iface,
|
|||
/* try to open the file */
|
||||
This->paf->hmmio = mmioOpenW(This->paf->szFileName, NULL,
|
||||
MMIO_ALLOCBUF | dwMode);
|
||||
if (This->paf->hmmio == NULL)
|
||||
return AVIERR_FILEOPEN;
|
||||
if (This->paf->hmmio == NULL) {
|
||||
/* mmioOpenW not in native DLLs of Win9x -- try mmioOpenA */
|
||||
LPSTR szFileName = LocalAlloc(LPTR, len * sizeof(CHAR));
|
||||
if (szFileName == NULL)
|
||||
return AVIERR_MEMORY;
|
||||
|
||||
WideCharToMultiByte(CP_ACP, 0, This->paf->szFileName, -1, szFileName,
|
||||
len, NULL, NULL);
|
||||
|
||||
This->paf->hmmio = mmioOpenA(szFileName, NULL, MMIO_ALLOCBUF | dwMode);
|
||||
LocalFree((HLOCAL)szFileName);
|
||||
if (This->paf->hmmio == NULL)
|
||||
return AVIERR_FILEOPEN;
|
||||
}
|
||||
|
||||
/* should we create a new file? */
|
||||
if (dwMode & OF_CREATE) {
|
||||
|
@ -1792,9 +1804,9 @@ static HRESULT AVIFILE_LoadFile(IAVIFileImpl *This)
|
|||
hr = ReadChunkIntoExtra(&This->fileextra, This->hmmio, &ckLIST2);
|
||||
if (FAILED(hr))
|
||||
return hr;
|
||||
if (mmioAscend(This->hmmio, &ckLIST2, 0) != S_OK)
|
||||
return AVIERR_FILEREAD;
|
||||
}
|
||||
if (mmioAscend(This->hmmio, &ckLIST2, 0) != S_OK)
|
||||
return AVIERR_FILEREAD;
|
||||
}
|
||||
|
||||
/* read any extra headers in "LIST","hdrl" */
|
||||
|
@ -1936,7 +1948,8 @@ static HRESULT AVIFILE_LoadIndex(IAVIFileImpl *This, DWORD size, DWORD offset)
|
|||
for (n = 0; n < This->fInfo.dwStreams; n++) {
|
||||
IAVIStreamImpl *pStream = This->ppStreams[n];
|
||||
|
||||
if (pStream->sInfo.dwLength != pStream->lLastFrame+1)
|
||||
if (pStream->sInfo.dwSampleSize == 0 &&
|
||||
pStream->sInfo.dwLength != pStream->lLastFrame+1)
|
||||
ERR("stream %lu length mismatch: dwLength=%lu found=%ld\n",
|
||||
n, pStream->sInfo.dwLength, pStream->lLastFrame);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue