CVS: winex/dlls/quartz mpgparse.c,1.5,1.6
[email protected] 30 Mar 2007 21:31:14 -0000
Newsgroups
gmane.comp.emulators.winex.cvs
Message-ID
<[email protected] >
Subject: winex/dlls/quartz mpgparse.c,1.5,1.6Update of /var/lib/cvsd/cvsroot/winex/dlls/quartz
In directory agravaine:/tmp/cvs-serv24128/dlls/quartz
Modified Files:
mpgparse.c
Log Message:
The MPEG stream parser can now skip ID3 tags at the beginning of the file,
allowing tagged MP3 audio files to be recognized and streamed properly.
Index: mpgparse.c
===================================================================
RCS file: /var/lib/cvsd/cvsroot/winex/dlls/quartz/mpgparse.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- mpgparse.c 18 Feb 2004 22:27:42 -0000 1.5
+++ mpgparse.c 30 Mar 2007 21:31:11 -0000 1.6
@@ -87,6 +87,7 @@
struct CMPGParseImpl
{
+ LONGLONG llStart;
LONGLONG llLength;
LONGLONG llPosNext;
BOOL bRawPayload;
@@ -133,7 +134,7 @@
HRESULT hr;
DWORD n;
AM_MEDIA_TYPE mt;
- BYTE hdrbuf[8];
+ BYTE hdrbuf[10];
LONGLONG dummy;
TRACE("(%p,%p)\n",pImpl,pcStreams);
@@ -144,12 +145,31 @@
pImpl->m_pUserData = This;
ZeroMemory( This, sizeof(CMPGParseImpl) );
- hr = IAsyncReader_SyncRead( pImpl->m_pReader, 0, 8, hdrbuf );
+ hr = IAsyncReader_SyncRead( pImpl->m_pReader, This->llStart, 10, hdrbuf );
if ( FAILED(hr) )
return hr;
if ( hr != S_OK )
return E_FAIL;
+ if ( hdrbuf[0] == 'I' && hdrbuf[1] == 'D' &&
+ hdrbuf[2] == '3') {
+ /* BYTE flags = hdrbuf[5]; */
+ DWORD size =
+ ((hdrbuf[6] & 0x7f) << 21) |
+ ((hdrbuf[7] & 0x7f) << 14) |
+ ((hdrbuf[8] & 0x7f) << 7) |
+ ((hdrbuf[9] & 0x7f));
+ /* FIXME: if the tag is "unsynchronized" (bit 7 in flags is set),
+ * skipping the tag may be a little more complicated... */
+ This->llStart += 10 + size;
+
+ hr = IAsyncReader_SyncRead( pImpl->m_pReader, This->llStart, 8, hdrbuf );
+ if ( FAILED(hr) )
+ return hr;
+ if ( hr != S_OK )
+ return E_FAIL;
+ }
+
if ( hdrbuf[0] == 0x00 && hdrbuf[1] == 0x00 &&
hdrbuf[2] == 0x01 && hdrbuf[3] == 0xba )
{
@@ -164,7 +184,7 @@
hdrbuf[2] == 0x01 && hdrbuf[3] == 0xb3 )
{
TRACE( "mpeg/video payload\n" );
- This->llPosNext = 0;
+ This->llPosNext = This->llStart;
This->llLength = 0;
IAsyncReader_Length( pImpl->m_pReader, &This->llLength, &dummy );
This->bRawPayload = TRUE;
@@ -181,7 +201,7 @@
if ( hdrbuf[0] == 0xff && (hdrbuf[1]&0xf0) == 0xf0 )
{
TRACE( "mpeg/audio payload\n" );
- This->llPosNext = 0;
+ This->llPosNext = This->llStart;
This->llLength = 0;
IAsyncReader_Length( pImpl->m_pReader, &This->llLength, &dummy );
This->bRawPayload = TRUE;
@@ -289,7 +309,7 @@
{
case MPGPayload_Video:
hr = CMPGParseImpl_SyncReadPayload(
- pImpl, This, payloadtype, 0, 140+10, hdrbuf );
+ pImpl, This, payloadtype, This->llStart, 140+10, hdrbuf );
if ( FAILED(hr) )
return hr;
if ( hr != S_OK )
@@ -376,7 +396,7 @@
return S_OK;
case MPGPayload_Audio:
hr = CMPGParseImpl_SyncReadPayload(
- pImpl, This, payloadtype, 0, 4, hdrbuf );
+ pImpl, This, payloadtype, This->llStart, 4, hdrbuf );
if ( FAILED(hr) )
return hr;
if ( hr != S_OK )