Commit 676754d1 authored by Aric Stewart's avatar Aric Stewart Committed by Alexandre Julliard

wineqtdecoder: Implement QTSplitter_ChangeStart.

parent d20c69c5
...@@ -166,6 +166,9 @@ typedef struct QTSplitter { ...@@ -166,6 +166,9 @@ typedef struct QTSplitter {
CRITICAL_SECTION csReceive; CRITICAL_SECTION csReceive;
SourceSeeking sourceSeeking; SourceSeeking sourceSeeking;
TimeValue movie_time;
TimeValue movie_start;
TimeScale movie_scale;
} QTSplitter; } QTSplitter;
static const IPinVtbl QT_OutputPin_Vtbl; static const IPinVtbl QT_OutputPin_Vtbl;
...@@ -468,7 +471,7 @@ static DWORD WINAPI QTSplitter_thread(LPVOID data) ...@@ -468,7 +471,7 @@ static DWORD WINAPI QTSplitter_thread(LPVOID data)
{ {
QTSplitter *This = (QTSplitter *)data; QTSplitter *This = (QTSplitter *)data;
HRESULT hr = S_OK; HRESULT hr = S_OK;
TimeValue movie_time=0, next_time; TimeValue next_time;
CVPixelBufferRef pixelBuffer = NULL; CVPixelBufferRef pixelBuffer = NULL;
OSStatus err; OSStatus err;
TimeRecord tr; TimeRecord tr;
...@@ -486,11 +489,13 @@ static DWORD WINAPI QTSplitter_thread(LPVOID data) ...@@ -486,11 +489,13 @@ static DWORD WINAPI QTSplitter_thread(LPVOID data)
WaitForSingleObject(This->runEvent, -1); WaitForSingleObject(This->runEvent, -1);
EnterCriticalSection(&This->csReceive);
This->state = State_Running; This->state = State_Running;
/* Prime the pump: Needed for MPEG streams */ /* Prime the pump: Needed for MPEG streams */
GetMovieNextInterestingTime(This->pQTMovie, nextTimeEdgeOK | nextTimeStep, 0, NULL, movie_time, 1, &next_time, NULL); GetMovieNextInterestingTime(This->pQTMovie, nextTimeEdgeOK | nextTimeStep, 0, NULL, This->movie_time, 1, &next_time, NULL);
GetMovieTime(This->pQTMovie, &tr); GetMovieTime(This->pQTMovie, &tr);
LeaveCriticalSection(&This->csReceive);
do do
{ {
LONGLONG tStart=0, tStop=0; LONGLONG tStart=0, tStop=0;
...@@ -498,7 +503,7 @@ static DWORD WINAPI QTSplitter_thread(LPVOID data) ...@@ -498,7 +503,7 @@ static DWORD WINAPI QTSplitter_thread(LPVOID data)
float time; float time;
EnterCriticalSection(&This->csReceive); EnterCriticalSection(&This->csReceive);
GetMovieNextInterestingTime(This->pQTMovie, nextTimeStep, 0, NULL, movie_time, 1, &next_time, NULL); GetMovieNextInterestingTime(This->pQTMovie, nextTimeStep, 0, NULL, This->movie_time, 1, &next_time, NULL);
if (next_time == -1) if (next_time == -1)
{ {
...@@ -512,15 +517,15 @@ static DWORD WINAPI QTSplitter_thread(LPVOID data) ...@@ -512,15 +517,15 @@ static DWORD WINAPI QTSplitter_thread(LPVOID data)
MoviesTask(This->pQTMovie,0); MoviesTask(This->pQTMovie,0);
QTVisualContextTask(This->vContext); QTVisualContextTask(This->vContext);
TRACE("In loop at time %ld\n",movie_time); TRACE("In loop at time %ld\n",This->movie_time);
TRACE("In Next time %ld\n",next_time); TRACE("In Next time %ld\n",next_time);
mStart = movie_time; mStart = This->movie_time;
mStop = next_time; mStop = next_time;
time = (float)movie_time / tr.scale; time = (float)(This->movie_time - This->movie_start) / This->movie_scale;
tStart = time * 10000000; tStart = time * 10000000;
time = (float)next_time / tr.scale; time = (float)(next_time - This->movie_start) / This->movie_scale;
tStop = time * 10000000; tStop = time * 10000000;
/* Deliver Audio */ /* Deliver Audio */
...@@ -552,8 +557,8 @@ static DWORD WINAPI QTSplitter_thread(LPVOID data) ...@@ -552,8 +557,8 @@ static DWORD WINAPI QTSplitter_thread(LPVOID data)
goto audio_error; goto audio_error;
} }
duration = (float)next_time / tr.scale; duration = (float)next_time / This->movie_scale;
time = (float)movie_time / tr.scale; time = (float)This->movie_time / This->movie_scale;
duration -= time; duration -= time;
frames = pvi->nSamplesPerSec * duration; frames = pvi->nSamplesPerSec * duration;
TRACE("Need audio for %f seconds (%li frames)\n",duration,frames); TRACE("Need audio for %f seconds (%li frames)\n",duration,frames);
...@@ -643,7 +648,7 @@ audio_error: ...@@ -643,7 +648,7 @@ audio_error:
else else
TRACE("No video to deliver\n"); TRACE("No video to deliver\n");
movie_time = next_time; This->movie_time = next_time;
LeaveCriticalSection(&This->csReceive); LeaveCriticalSection(&This->csReceive);
} while (hr == S_OK); } while (hr == S_OK);
...@@ -923,7 +928,6 @@ static HRESULT QT_Process_Movie(QTSplitter* filter) ...@@ -923,7 +928,6 @@ static HRESULT QT_Process_Movie(QTSplitter* filter)
DWORD tid; DWORD tid;
HANDLE thread; HANDLE thread;
LONGLONG time; LONGLONG time;
TimeScale scale;
TRACE("Trying movie connect\n"); TRACE("Trying movie connect\n");
...@@ -963,8 +967,8 @@ static HRESULT QT_Process_Movie(QTSplitter* filter) ...@@ -963,8 +967,8 @@ static HRESULT QT_Process_Movie(QTSplitter* filter)
hr = QT_Process_Audio_Track(filter, trk); hr = QT_Process_Audio_Track(filter, trk);
time = GetMovieDuration(filter->pQTMovie); time = GetMovieDuration(filter->pQTMovie);
scale = GetMovieTimeScale(filter->pQTMovie); filter->movie_scale = GetMovieTimeScale(filter->pQTMovie);
filter->sourceSeeking.llDuration = ((double)time / scale) * 10000000; filter->sourceSeeking.llDuration = ((double)time / filter->movie_scale) * 10000000;
filter->sourceSeeking.llStop = filter->sourceSeeking.llDuration; filter->sourceSeeking.llStop = filter->sourceSeeking.llDuration;
TRACE("Movie duration is %s\n",wine_dbgstr_longlong(filter->sourceSeeking.llDuration)); TRACE("Movie duration is %s\n",wine_dbgstr_longlong(filter->sourceSeeking.llDuration));
...@@ -1364,7 +1368,12 @@ static HRESULT QT_AddPin(QTSplitter *This, const PIN_INFO *piOutput, const AM_ME ...@@ -1364,7 +1368,12 @@ static HRESULT QT_AddPin(QTSplitter *This, const PIN_INFO *piOutput, const AM_ME
static HRESULT WINAPI QTSplitter_ChangeStart(IMediaSeeking *iface) static HRESULT WINAPI QTSplitter_ChangeStart(IMediaSeeking *iface)
{ {
FIXME("(%p) filter hasn't implemented start position change!\n", iface); QTSplitter *This = impl_from_IMediaSeeking(iface);
TRACE("(%p)\n", iface);
EnterCriticalSection(&This->csReceive);
This->movie_time = (This->sourceSeeking.llCurrent * This->movie_scale)/10000000;
This->movie_start = This->movie_time;
LeaveCriticalSection(&This->csReceive);
return S_OK; return S_OK;
} }
......
/*
* Copyright 2012 Jacek Caban for CodeWeavers
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
import "objidl.idl";
import "oleidl.idl";
import "shtypes.idl";
typedef struct _WINDOWDATA {
DWORD dwWindowID;
UINT uiCP;
PIDLIST_ABSOLUTE pidl;
[string] LPWSTR lpszUrl;
[string] LPWSTR lpszUrlLocation;
[string] LPWSTR lpszTitle;
} WINDOWDATA;
typedef WINDOWDATA *LPWINDOWDATA;
typedef const WINDOWDATA *LPCWINDOWDATA;
[
uuid(241c033e-e659-43da-aa4d-4086dbc4758d),
object
]
interface ITravelLogClient : IUnknown
{
HRESULT FindWindowByIndex(
[in] DWORD dwID,
[out] IUnknown **ppunk);
HRESULT GetWindowData(
[in] IStream *pStream,
[out] LPWINDOWDATA pWinData);
HRESULT LoadHistoryPosition(
[in] LPWSTR pszUrlLocation,
[in] DWORD dwPosition);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment