[PATCH 2/2] quartz: Use nAvgBytesPerSec to calculate length.
Andrew Eikum
aeikum at codeweavers.com
Wed Jun 21 07:34:14 CDT 2017
Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
On Mon, Jun 19, 2017 at 02:15:32PM -0500, Zebediah Figura wrote:
> The current method fails for formats which do not
> have a constant sample length, e.g. MPEG.
>
> Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
> ---
> dlls/quartz/dsoundrender.c | 6 +++---
> dlls/quartz/waveparser.c | 18 +++++++-----------
> 2 files changed, 10 insertions(+), 14 deletions(-)
>
> diff --git a/dlls/quartz/dsoundrender.c b/dlls/quartz/dsoundrender.c
> index 9e8f69c9fc2..79029554819 100644
> --- a/dlls/quartz/dsoundrender.c
> +++ b/dlls/quartz/dsoundrender.c
> @@ -115,9 +115,9 @@ static REFERENCE_TIME time_from_pos(DSoundRenderImpl *This, DWORD pos) {
> static DWORD pos_from_time(DSoundRenderImpl *This, REFERENCE_TIME time) {
> WAVEFORMATEX *wfx = (WAVEFORMATEX*)This->renderer.pInputPin->pin.mtCurrent.pbFormat;
> REFERENCE_TIME ret = time;
> - ret *= wfx->nSamplesPerSec;
> + ret *= wfx->nAvgBytesPerSec;
> ret /= 10000000;
> - ret *= wfx->nBlockAlign;
> + ret -= ret % wfx->nBlockAlign;
> return ret;
> }
>
> @@ -424,7 +424,7 @@ static HRESULT WINAPI DSoundRender_CheckMediaType(BaseRenderer *iface, const AM_
> TRACE("Format = %p\n", format);
> TRACE("wFormatTag = %x %x\n", format->wFormatTag, WAVE_FORMAT_PCM);
> TRACE("nChannels = %d\n", format->nChannels);
> - TRACE("nSamplesPerSec = %d\n", format->nAvgBytesPerSec);
> + TRACE("nSamplesPerSec = %d\n", format->nSamplesPerSec);
> TRACE("nAvgBytesPerSec = %d\n", format->nAvgBytesPerSec);
> TRACE("nBlockAlign = %d\n", format->nBlockAlign);
> TRACE("wBitsPerSample = %d\n", format->wBitsPerSample);
> diff --git a/dlls/quartz/waveparser.c b/dlls/quartz/waveparser.c
> index 6e8c6641e5a..f6bea2c7043 100644
> --- a/dlls/quartz/waveparser.c
> +++ b/dlls/quartz/waveparser.c
> @@ -43,9 +43,8 @@ typedef struct WAVEParserImpl
> ParserImpl Parser;
> LONGLONG StartOfFile; /* in media time */
> LONGLONG EndOfFile;
> - DWORD dwSampleSize;
> - DWORD nSamplesPerSec;
> - DWORD dwLength;
> + DWORD nAvgBytesPerSec;
> + DWORD nBlockAlign;
> } WAVEParserImpl;
>
> static inline WAVEParserImpl *impl_from_IMediaSeeking( IMediaSeeking *iface )
> @@ -62,7 +61,7 @@ static LONGLONG bytepos_to_duration(WAVEParserImpl *This, LONGLONG bytepos)
> {
> LONGLONG duration = BYTES_FROM_MEDIATIME(bytepos - This->StartOfFile);
> duration *= 10000000;
> - duration /= (This->dwSampleSize * This->nSamplesPerSec);
> + duration /= This->nAvgBytesPerSec;
>
> return duration;
> }
> @@ -71,11 +70,11 @@ static LONGLONG duration_to_bytepos(WAVEParserImpl *This, LONGLONG duration)
> {
> LONGLONG bytepos;
>
> - bytepos = (This->dwSampleSize * This->nSamplesPerSec);
> + bytepos = This->nAvgBytesPerSec;
> bytepos *= duration;
> bytepos /= 10000000;
> + bytepos -= bytepos % This->nBlockAlign;
> bytepos += BYTES_FROM_MEDIATIME(This->StartOfFile);
> - bytepos -= bytepos % This->dwSampleSize;
>
> return MEDIATIME_FROM_BYTES(bytepos);
> }
> @@ -252,7 +251,6 @@ static HRESULT WAVEParser_InputPin_PreConnect(IPin * iface, IPin * pConnectPin,
> PIN_INFO piOutput;
> AM_MEDIA_TYPE amt;
> WAVEParserImpl * pWAVEParser = impl_from_IBaseFilter(This->pin.pinInfo.pFilter);
> - LONGLONG length, avail;
>
> piOutput.dir = PINDIR_OUTPUT;
> piOutput.pFilter = &pWAVEParser->Parser.filter.IBaseFilter_iface;
> @@ -321,10 +319,8 @@ static HRESULT WAVEParser_InputPin_PreConnect(IPin * iface, IPin * pConnectPin,
> props->cbPrefix = 0;
> props->cbBuffer = 4096;
> props->cBuffers = 3;
> - pWAVEParser->dwSampleSize = ((WAVEFORMATEX*)amt.pbFormat)->nBlockAlign;
> - IAsyncReader_Length(This->pReader, &length, &avail);
> - pWAVEParser->dwLength = length / (ULONGLONG)pWAVEParser->dwSampleSize;
> - pWAVEParser->nSamplesPerSec = ((WAVEFORMATEX*)amt.pbFormat)->nSamplesPerSec;
> + pWAVEParser->nBlockAlign = ((WAVEFORMATEX*)amt.pbFormat)->nBlockAlign;
> + pWAVEParser->nAvgBytesPerSec = ((WAVEFORMATEX*)amt.pbFormat)->nAvgBytesPerSec;
> hr = Parser_AddPin(&(pWAVEParser->Parser), &piOutput, props, &amt);
> CoTaskMemFree(amt.pbFormat);
>
> --
> 2.13.1
>
>
>
More information about the wine-patches
mailing list