CVS: winex/dlls/quartz mpgparse.c,1.5,1.6

[email protected]
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 )
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.