[PATCH 3/5] quartz/parser: Don't store the sink pin in the "ppPins" array.

Zebediah Figura z.figura12 at gmail.com
Tue Jun 25 20:38:13 CDT 2019


Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
 dlls/quartz/avisplit.c   |  8 ++++----
 dlls/quartz/mpegsplit.c  |  4 ++--
 dlls/quartz/parser.c     | 38 +++++++++++++++++++-------------------
 dlls/quartz/waveparser.c | 10 +++++-----
 4 files changed, 30 insertions(+), 30 deletions(-)

diff --git a/dlls/quartz/avisplit.c b/dlls/quartz/avisplit.c
index 1fbaaf63ba3..aa43e0131e8 100644
--- a/dlls/quartz/avisplit.c
+++ b/dlls/quartz/avisplit.c
@@ -137,7 +137,7 @@ static HRESULT AVISplitter_SendEndOfFile(AVISplitterImpl *This, DWORD streamnumb
 
     TRACE("End of file reached\n");
 
-    hr = IPin_ConnectedTo(This->Parser.ppPins[streamnumber+1], &ppin);
+    hr = IPin_ConnectedTo(This->Parser.ppPins[streamnumber], &ppin);
     if (SUCCEEDED(hr))
     {
         hr = IPin_EndOfStream(ppin);
@@ -297,7 +297,7 @@ static HRESULT AVISplitter_next_request(AVISplitterImpl *This, DWORD streamnumbe
 
 static HRESULT AVISplitter_Receive(AVISplitterImpl *This, IMediaSample *sample, DWORD streamnumber)
 {
-    Parser_OutputPin *pin = unsafe_impl_Parser_OutputPin_from_IPin(This->Parser.ppPins[1+streamnumber]);
+    Parser_OutputPin *pin = unsafe_impl_Parser_OutputPin_from_IPin(This->Parser.ppPins[streamnumber]);
     HRESULT hr;
     LONGLONG start, stop, rtstart, rtstop;
     StreamData *stream = &This->streams[streamnumber];
@@ -571,7 +571,7 @@ static HRESULT AVISplitter_ProcessIndex(AVISplitterImpl *This, AVISTDINDEX **ind
     if (!pIndex)
         return E_OUTOFMEMORY;
 
-    IAsyncReader_SyncRead((impl_PullPin_from_IPin(This->Parser.ppPins[0]))->pReader, qwOffset, cb, (BYTE *)pIndex);
+    IAsyncReader_SyncRead(This->Parser.pInputPin->pReader, qwOffset, cb, (BYTE *)pIndex);
     rest = cb - sizeof(AVISUPERINDEX) + sizeof(RIFFCHUNK) + sizeof(pIndex->aIndex);
 
     TRACE("FOURCC: %s\n", debugstr_an((char *)&pIndex->fcc, 4));
@@ -1292,7 +1292,7 @@ static HRESULT WINAPI AVISplitter_seek(IMediaSeeking *iface)
     EnterCriticalSection(&This->Parser.filter.csFilter);
     for (x = 0; x < This->Parser.cStreams; ++x)
     {
-        Parser_OutputPin *pin = unsafe_impl_Parser_OutputPin_from_IPin(This->Parser.ppPins[1+x]);
+        Parser_OutputPin *pin = unsafe_impl_Parser_OutputPin_from_IPin(This->Parser.ppPins[x]);
         StreamData *stream = This->streams + x;
         LONGLONG wanted_frames;
         DWORD last_keyframe = 0, last_keyframeidx = 0, preroll = 0;
diff --git a/dlls/quartz/mpegsplit.c b/dlls/quartz/mpegsplit.c
index 80c714cec75..f80ab1cb210 100644
--- a/dlls/quartz/mpegsplit.c
+++ b/dlls/quartz/mpegsplit.c
@@ -168,7 +168,7 @@ static HRESULT parse_header(BYTE *header, LONGLONG *plen, LONGLONG *pduration)
 
 static HRESULT FillBuffer(MPEGSplitterImpl *This, IMediaSample *pCurrentSample)
 {
-    Parser_OutputPin * pOutputPin = unsafe_impl_Parser_OutputPin_from_IPin(This->Parser.ppPins[1]);
+    Parser_OutputPin * pOutputPin = unsafe_impl_Parser_OutputPin_from_IPin(This->Parser.ppPins[0]);
     LONGLONG length = 0;
     LONGLONG pos = BYTES_FROM_MEDIATIME(This->Parser.pInputPin->rtNext);
     LONGLONG time = This->position, rtstop, rtstart;
@@ -322,7 +322,7 @@ static HRESULT MPEGSplitter_process_sample(LPVOID iface, IMediaSample * pSample,
         {
             IPin* ppin;
 
-            hr = IPin_ConnectedTo(This->Parser.ppPins[i+1], &ppin);
+            hr = IPin_ConnectedTo(This->Parser.ppPins[i], &ppin);
             if (SUCCEEDED(hr))
             {
                 hr = IPin_EndOfStream(ppin);
diff --git a/dlls/quartz/parser.c b/dlls/quartz/parser.c
index 652d4109f41..6c8ddf80f47 100644
--- a/dlls/quartz/parser.c
+++ b/dlls/quartz/parser.c
@@ -66,8 +66,10 @@ IPin *parser_get_pin(BaseFilter *iface, unsigned int index)
 {
     ParserImpl *filter = impl_from_BaseFilter(iface);
 
-    if (index <= filter->cStreams)
-        return filter->ppPins[index];
+    if (!index)
+        return &filter->pInputPin->pin.IPin_iface;
+    else if (index <= filter->cStreams)
+        return filter->ppPins[index - 1];
     return NULL;
 }
 
@@ -87,7 +89,7 @@ HRESULT Parser_Create(ParserImpl *pParser, const IBaseFilterVtbl *vtbl, IUnknown
     pParser->fnDisconnect = fnDisconnect;
 
     pParser->cStreams = 0;
-    pParser->ppPins = CoTaskMemAlloc(1 * sizeof(IPin *));
+    pParser->ppPins = CoTaskMemAlloc(0 * sizeof(IPin *));
 
     /* construct input pin */
     piInput.dir = PINDIR_INPUT;
@@ -109,7 +111,6 @@ HRESULT Parser_Create(ParserImpl *pParser, const IBaseFilterVtbl *vtbl, IUnknown
 
     if (SUCCEEDED(hr))
     {
-        pParser->ppPins[0] = &pParser->pInputPin->pin.IPin_iface;
         pParser->pInputPin->fnPreConnect = fnPreConnect;
     }
     else
@@ -184,7 +185,7 @@ void Parser_Destroy(ParserImpl *This)
 HRESULT WINAPI Parser_Stop(IBaseFilter * iface)
 {
     ParserImpl *This = impl_from_IBaseFilter(iface);
-    PullPin *pin = impl_PullPin_from_IPin(This->ppPins[0]);
+    PullPin *pin = This->pInputPin;
     ULONG i;
 
     TRACE("%p->()\n", This);
@@ -204,7 +205,7 @@ HRESULT WINAPI Parser_Stop(IBaseFilter * iface)
 
     This->filter.state = State_Stopped;
 
-    for (i = 1; i < (This->cStreams + 1); i++)
+    for (i = 0; i < This->cStreams; ++i)
     {
         BaseOutputPinImpl_Inactive((BaseOutputPin *)This->ppPins[i]);
     }
@@ -223,7 +224,7 @@ HRESULT WINAPI Parser_Pause(IBaseFilter * iface)
 {
     HRESULT hr = S_OK;
     ParserImpl *This = impl_from_IBaseFilter(iface);
-    PullPin *pin = impl_PullPin_from_IPin(This->ppPins[0]);
+    PullPin *pin = This->pInputPin;
 
     TRACE("%p->()\n", This);
 
@@ -257,7 +258,7 @@ HRESULT WINAPI Parser_Run(IBaseFilter * iface, REFERENCE_TIME tStart)
 {
     HRESULT hr = S_OK;
     ParserImpl *This = impl_from_IBaseFilter(iface);
-    PullPin *pin = impl_PullPin_from_IPin(This->ppPins[0]);
+    PullPin *pin = This->pInputPin;
 
     ULONG i;
 
@@ -277,7 +278,7 @@ HRESULT WINAPI Parser_Run(IBaseFilter * iface, REFERENCE_TIME tStart)
             return S_OK;
         }
 
-        for (i = 1; i < (This->cStreams + 1); i++)
+        for (i = 0; i < This->cStreams; ++i)
         {
             hr = BaseOutputPinImpl_Active((BaseOutputPin *)This->ppPins[i]);
             if (SUCCEEDED(hr))
@@ -304,7 +305,7 @@ HRESULT WINAPI Parser_Run(IBaseFilter * iface, REFERENCE_TIME tStart)
 HRESULT WINAPI Parser_GetState(IBaseFilter * iface, DWORD dwMilliSecsTimeout, FILTER_STATE *pState)
 {
     ParserImpl *This = impl_from_IBaseFilter(iface);
-    PullPin *pin = impl_PullPin_from_IPin(This->ppPins[0]);
+    PullPin *pin = This->pInputPin;
     HRESULT hr = S_OK;
 
     TRACE("%p->(%d, %p)\n", This, dwMilliSecsTimeout, pState);
@@ -326,7 +327,7 @@ HRESULT WINAPI Parser_GetState(IBaseFilter * iface, DWORD dwMilliSecsTimeout, FI
 HRESULT WINAPI Parser_SetSyncSource(IBaseFilter * iface, IReferenceClock *pClock)
 {
     ParserImpl *This = impl_from_IBaseFilter(iface);
-    PullPin *pin = impl_PullPin_from_IPin(This->ppPins[0]);
+    PullPin *pin = This->pInputPin;
 
     TRACE("%p->(%p)\n", This, pClock);
 
@@ -354,14 +355,15 @@ HRESULT Parser_AddPin(ParserImpl * This, const PIN_INFO * piOutput, ALLOCATOR_PR
 
     ppOldPins = This->ppPins;
 
-    This->ppPins = CoTaskMemAlloc((This->cStreams + 2) * sizeof(IPin *));
-    memcpy(This->ppPins, ppOldPins, (This->cStreams + 1) * sizeof(IPin *));
+    This->ppPins = CoTaskMemAlloc((This->cStreams + 1) * sizeof(IPin *));
+    memcpy(This->ppPins, ppOldPins, This->cStreams * sizeof(IPin *));
 
-    hr = BaseOutputPin_Construct(&Parser_OutputPin_Vtbl, sizeof(Parser_OutputPin), piOutput, &output_BaseOutputFuncTable, &This->filter.csFilter, This->ppPins + (This->cStreams + 1));
+    hr = BaseOutputPin_Construct(&Parser_OutputPin_Vtbl, sizeof(Parser_OutputPin), piOutput,
+            &output_BaseOutputFuncTable, &This->filter.csFilter, &This->ppPins[This->cStreams]);
 
     if (SUCCEEDED(hr))
     {
-        IPin *pPin = This->ppPins[This->cStreams + 1];
+        IPin *pPin = This->ppPins[This->cStreams];
         Parser_OutputPin *pin = unsafe_impl_Parser_OutputPin_from_IPin(pPin);
         pin->pmt = CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE));
         CopyMediaType(pin->pmt, amt);
@@ -409,12 +411,10 @@ static HRESULT Parser_RemoveOutputPins(ParserImpl * This)
 
     TRACE("(%p)\n", This);
 
-    /* reduce the pin array down to 1 (just our input pin) */
-    This->ppPins = CoTaskMemAlloc(sizeof(IPin *) * 1);
-    memcpy(This->ppPins, ppOldPins, sizeof(IPin *) * 1);
+    This->ppPins = CoTaskMemAlloc(0);
 
     for (i = 0; i < This->cStreams; i++)
-        free_source_pin(ppOldPins[i + 1]);
+        free_source_pin(ppOldPins[i]);
 
     BaseFilterImpl_IncrementPinVersion(&This->filter);
     This->cStreams = 0;
diff --git a/dlls/quartz/waveparser.c b/dlls/quartz/waveparser.c
index 1767adf2352..5b2608ac88e 100644
--- a/dlls/quartz/waveparser.c
+++ b/dlls/quartz/waveparser.c
@@ -102,7 +102,7 @@ static HRESULT WAVEParser_Sample(LPVOID iface, IMediaSample * pSample, DWORD_PTR
         return S_OK;
     }
 
-    pOutputPin = unsafe_impl_Parser_OutputPin_from_IPin(This->Parser.ppPins[1]);
+    pOutputPin = unsafe_impl_Parser_OutputPin_from_IPin(This->Parser.ppPins[0]);
 
     if (SUCCEEDED(hr))
         hr = IMemAllocator_GetBuffer(pin->pAlloc, &newsample, NULL, NULL, 0);
@@ -161,7 +161,7 @@ static HRESULT WAVEParser_Sample(LPVOID iface, IMediaSample * pSample, DWORD_PTR
 
             TRACE("Send End Of Stream to output pin %u\n", i);
 
-            hr = IPin_ConnectedTo(This->Parser.ppPins[i+1], &ppin);
+            hr = IPin_ConnectedTo(This->Parser.ppPins[i], &ppin);
             if (SUCCEEDED(hr))
             {
                 hr = IPin_EndOfStream(ppin);
@@ -225,7 +225,7 @@ static HRESULT WINAPI WAVEParserImpl_seek(IMediaSeeking *iface)
 
     /* Make sure this is done while stopped, BeginFlush takes care of this */
     EnterCriticalSection(&This->Parser.filter.csFilter);
-    IPin_ConnectedTo(This->Parser.ppPins[1], &victim);
+    IPin_ConnectedTo(This->Parser.ppPins[0], &victim);
     if (victim)
     {
         IPin_NewSegment(victim, newpos, endpos, pPin->dRate);
@@ -233,7 +233,7 @@ static HRESULT WINAPI WAVEParserImpl_seek(IMediaSeeking *iface)
     }
 
     pPin->rtStart = pPin->rtCurrent = bytepos;
-    unsafe_impl_Parser_OutputPin_from_IPin(This->Parser.ppPins[1])->dwSamplesProcessed = 0;
+    unsafe_impl_Parser_OutputPin_from_IPin(This->Parser.ppPins[0])->dwSamplesProcessed = 0;
     LeaveCriticalSection(&This->Parser.filter.csFilter);
 
     TRACE("Done flushing\n");
@@ -364,7 +364,7 @@ static HRESULT WAVEParser_first_request(LPVOID iface)
         LONGLONG rtSampleStart = pin->rtNext;
         /* Add 4 for the next header, which should hopefully work */
         LONGLONG rtSampleStop = rtSampleStart + MEDIATIME_FROM_BYTES(IMediaSample_GetSize(sample));
-        Parser_OutputPin *outpin = unsafe_impl_Parser_OutputPin_from_IPin(This->Parser.ppPins[1]);
+        Parser_OutputPin *outpin = unsafe_impl_Parser_OutputPin_from_IPin(This->Parser.ppPins[0]);
 
         if (rtSampleStop > pin->rtStop)
             rtSampleStop = MEDIATIME_FROM_BYTES(ALIGNUP(BYTES_FROM_MEDIATIME(pin->rtStop), pin->cbAlign));
-- 
2.22.0




More information about the wine-devel mailing list