Maarten Lankhorst : quartz: Store the stream index in the avi stream for files that have them.
Alexandre Julliard
julliard at winehq.org
Thu Apr 17 07:38:35 CDT 2008
Module: wine
Branch: master
Commit: 162581711375fec58cc595ab75646235d31ee099
URL: http://source.winehq.org/git/wine.git/?a=commit;h=162581711375fec58cc595ab75646235d31ee099
Author: Maarten Lankhorst <m.b.lankhorst at gmail.com>
Date: Wed Apr 16 14:29:09 2008 -0700
quartz: Store the stream index in the avi stream for files that have them.
---
dlls/quartz/avisplit.c | 51 +++++++++++++++++++++++++++++++++++++++++++----
1 files changed, 46 insertions(+), 5 deletions(-)
diff --git a/dlls/quartz/avisplit.c b/dlls/quartz/avisplit.c
index 24f487c..19fc69d 100644
--- a/dlls/quartz/avisplit.c
+++ b/dlls/quartz/avisplit.c
@@ -360,12 +360,13 @@ static HRESULT AVISplitter_QueryAccept(LPVOID iface, const AM_MEDIA_TYPE * pmt)
return S_FALSE;
}
-static HRESULT AVISplitter_ProcessIndex(AVISplitterImpl *This, LONGLONG qwOffset, DWORD cb)
+static HRESULT AVISplitter_ProcessIndex(AVISplitterImpl *This, AVISTDINDEX **index, LONGLONG qwOffset, DWORD cb)
{
AVISTDINDEX *pIndex;
int x;
long rest;
+ *index = NULL;
if (cb < sizeof(AVISTDINDEX))
{
FIXME("size %u too small\n", cb);
@@ -410,7 +411,7 @@ static HRESULT AVISplitter_ProcessIndex(AVISplitterImpl *This, LONGLONG qwOffset
TRACE("Frame is a keyframe: %s\n", keyframe ? "yes" : "no");
}
- CoTaskMemFree(pIndex);
+ *index = pIndex;
return S_OK;
}
@@ -482,11 +483,15 @@ static HRESULT AVISplitter_ProcessStreamList(AVISplitterImpl * This, const BYTE
static const WCHAR wszStreamTemplate[] = {'S','t','r','e','a','m',' ','%','0','2','d',0};
StreamData *stream;
+ AVISUPERINDEX *superindex = NULL;
+ AVISTDINDEX **stdindex = NULL;
+ DWORD nstdindex = 0;
+
props.cbAlign = 1;
props.cbPrefix = 0;
props.cbBuffer = 0x20000;
props.cBuffers = 2;
-
+
ZeroMemory(&amt, sizeof(amt));
piOutput.dir = PINDIR_OUTPUT;
piOutput.pFilter = (IBaseFilter *)This;
@@ -598,6 +603,12 @@ static HRESULT AVISplitter_ProcessStreamList(AVISplitterImpl * This, const BYTE
break;
}
+ if (nstdindex > 0)
+ {
+ ERR("Stream %d got more then 1 superindex?\n", This->Parser.cStreams);
+ break;
+ }
+
TRACE("wLongsPerEntry: %hd\n", pIndex->wLongsPerEntry);
TRACE("bIndexSubType: %hd\n", pIndex->bIndexSubType);
TRACE("bIndexType: %hd\n", pIndex->bIndexType);
@@ -618,13 +629,24 @@ static HRESULT AVISplitter_ProcessStreamList(AVISplitterImpl * This, const BYTE
FIXME("Invalid index chunk encountered\n");
break;
}
+
+ superindex = CoTaskMemAlloc(pIndex->cb + sizeof(RIFFCHUNK));
+ if (!superindex)
+ {
+ WARN("Out of memory\n");
+ break;
+ }
+ memcpy(superindex, pIndex, pIndex->cb + sizeof(RIFFCHUNK));
+
for (x = 0; x < pIndex->nEntriesInUse; ++x)
{
TRACE("qwOffset: %x%08x\n", (DWORD)(pIndex->aIndex[x].qwOffset >> 32), (DWORD)pIndex->aIndex[x].qwOffset);
TRACE("dwSize: %u\n", pIndex->aIndex[x].dwSize);
- AVISplitter_ProcessIndex(This, pIndex->aIndex[x].qwOffset, pIndex->aIndex[x].dwSize);
-
TRACE("dwDuration: %u (unreliable)\n", pIndex->aIndex[x].dwDuration);
+
+ ++nstdindex;
+ stdindex = CoTaskMemRealloc(stdindex, sizeof(*stdindex) * nstdindex);
+ AVISplitter_ProcessIndex(This, &stdindex[nstdindex-1], pIndex->aIndex[x].qwOffset, pIndex->aIndex[x].dwSize);
}
break;
}
@@ -644,10 +666,14 @@ static HRESULT AVISplitter_ProcessStreamList(AVISplitterImpl * This, const BYTE
TRACE("dwSampleSize = %x\n", dwSampleSize);
TRACE("dwLength = %x\n", dwLength);
This->streams = CoTaskMemRealloc(This->streams, sizeof(StreamData) * (This->Parser.cStreams+1));
+
stream = This->streams + This->Parser.cStreams;
stream->fSamplesPerSec = fSamplesPerSec;
stream->dwSampleSize = dwSampleSize;
stream->dwLength = dwLength; /* TODO: Use this for mediaseeking */
+ stream->superindex = superindex;
+ stream->entries = nstdindex;
+ stream->stdindex = stdindex;
hr = Parser_AddPin(&(This->Parser), &piOutput, &props, &amt);
CoTaskMemFree(amt.pbFormat);
@@ -862,11 +888,26 @@ static HRESULT AVISplitter_Cleanup(LPVOID iface)
static HRESULT AVISplitter_Disconnect(LPVOID iface)
{
AVISplitterImpl *This = iface;
+ int x;
/* TODO: Remove other memory that's allocated during connect */
CoTaskMemFree(This->oldindex);
This->oldindex = NULL;
+ for (x = 0; x < This->Parser.cStreams; ++x)
+ {
+ int i;
+
+ StreamData *stream = &This->streams[x];
+
+ for (i = 0; i < stream->entries; ++i)
+ CoTaskMemFree(stream->stdindex[i]);
+
+ CoTaskMemFree(stream->stdindex);
+ CoTaskMemFree(stream->superindex);
+ }
+ CoTaskMemFree(This->streams);
+
return S_OK;
}
More information about the wine-cvs
mailing list