// // Run // STDMETHODIMP CDVBSub::Run( REFERENCE_TIME tStart ) { CAutoLock cObjectLock( m_pLock ); LogDebug( "CDVBSub::Run" ); m_startTimestamp = tStart; HRESULT hr = CBaseFilter::Run( tStart ); if( hr != S_OK ) { LogDebug( "CDVBSub::Run - BaseFilter returned %i", hr ); return hr; } // Get media seeking interface if missing if( !m_pIMediaSeeking ) { IFilterGraph *pGraph = GetFilterGraph(); if( pGraph ) { pGraph->QueryInterface( &m_pIMediaSeeking ); pGraph->Release(); } } LogDebug( "CDVBSub::Run - done" ); return hr; }
// // OnConnect // // Called when the property page connects to a filter // HRESULT CProgramProperties::OnConnect(IUnknown *pUnknown) { ASSERT(m_pProgram == NULL); CheckPointer(pUnknown,E_POINTER); HRESULT hr = pUnknown->QueryInterface(IID_IMpeg2PsiParser, (void **) &m_pProgram); if(FAILED(hr)) { return E_NOINTERFACE; } ASSERT(m_pProgram); IBaseFilter * pParserFilter ; hr = m_pProgram->QueryInterface(IID_IBaseFilter, (void **) &pParserFilter); RETURN_FALSE_IF_FAILED(TEXT("CProgramProperties::OnUpdate() QueryInterface() failed."), hr); FILTER_INFO Info; IFilterGraph * pGraph; hr = pParserFilter->QueryFilterInfo(&Info); RETURN_FALSE_IF_FAILED(TEXT("CProgramProperties::OnUpdate() QueryFilterInfo() failed."), hr); pGraph = Info.pGraph; pParserFilter->Release(); hr = pGraph->QueryInterface(IID_IGraphBuilder, (void **) & m_pGraphBuilder); RETURN_FALSE_IF_FAILED(TEXT("CProgramProperties::OnUpdate() QueryInterface() failed."), hr); // get demux filter hr = GetDemuxFilter(pGraph, &m_pDemux); RETURN_FALSE_IF_FAILED(TEXT("CProgramProperties::OnUpdate() GetDemuxFilter() failed."), hr); pGraph->Release(); // if there is no streaming, the following variables will not be initialized. if(m_pDemux != NULL && m_pGraphBuilder != NULL){ hr = m_pGraphBuilder->QueryInterface(IID_IMediaControl, (void **) & m_pMediaControl); RETURN_FALSE_IF_FAILED( TEXT(" CProgramProperties::OnUpdate():Failed to QI IMediaControl."), hr); // Get the initial Program value m_pProgram->GetTransportStreamId( &m_stream_id); m_pProgram->GetPatVersionNumber( &m_pat_version); m_pProgram->GetCountOfPrograms( &m_number_of_programs ); } if(!OnUpdate()) return FALSE; return NOERROR; }
void CSubtitlePin::LogCurrentPosition() { IFilterGraph* pGraph = m_pTsReaderFilter->GetFilterGraph(); IMediaSeeking* pMediaSeeking( NULL ); if( pGraph ) { pGraph->QueryInterface( &pMediaSeeking ); pGraph->Release(); } LONGLONG pos( 0 ); pMediaSeeking->GetCurrentPosition( &pos ); //pMediaSeeking->Release(); float fPos = (float)pos; fPos = ( ( fPos / 10000000 ) ); LogDebug("sub current position %f", fPos ); }
HRESULT fsPartMediaPlayer::Open(HANDLE hFile, UINT64 uMaxAvail) { HRESULT hr; Close (); m_stream.Attach (hFile, uMaxAvail); if (m_stream.Get_MediaType () == NULL) return E_FAIL; m_reader.Set_MediaType (m_stream.Get_MediaType ()); RIF (CoCreateInstance (CLSID_FilterGraph, NULL, CLSCTX_INPROC, IID_IGraphBuilder, (void**) &m_pGB)); IFilterGraph* pFG = NULL; RIF (m_pGB->QueryInterface (IID_IFilterGraph, (void**)&pFG)); RIF (pFG->AddFilter (&m_reader, NULL)); pFG->Release (); RIF (m_pGB->Render (m_reader.GetPin (0))); RIF (m_pGB->QueryInterface (IID_IMediaControl, (void**)&m_pMC)); RIF (m_pGB->QueryInterface (IID_IMediaEventEx, (void**)&m_pME)); RIF (m_pGB->QueryInterface (IID_IMediaSeeking, (void**)&m_pMS)); m_pGB->QueryInterface (IID_IVideoWindow, (void**)&m_pVW); m_pGB->QueryInterface (IID_IBasicAudio, (void**)&m_pBA); IBasicVideo* pBV = NULL; m_pGB->QueryInterface (IID_IBasicVideo, (void**) &pBV); if (pBV != NULL) { long nW, nH; pBV->get_VideoWidth (&nW); pBV->get_VideoHeight (&nH); m_fVideoRatio = (double)nW / nH; pBV->Release (); } else { m_fVideoRatio = 1; } if (m_pVW) { if (FAILED (m_pVW->put_MessageDrain ((OAHWND)m_hOutWnd))) { SAFE_RELEASE (m_pVW); } } RIF (m_pME->SetNotifyWindow ((OAHWND)m_hOutWnd, WM_VIDEONOTIFY, LONG(this))); if (m_pVW) { m_pVW->put_Visible (OAFALSE); m_pVW->put_WindowStyle (WS_CHILD); m_pVW->put_Owner ((OAHWND)m_hOutWnd); AutoSize (); m_pVW->put_Visible (OATRUE); m_pVW->SetWindowForeground (-1); } m_state = VFPS_STOPPED; return S_OK; }
DWORD WINAPI CBDReaderFilter::CommandThread() { SetThreadName(-1, "BDReader_COMMAND"); IFilterGraph* pGraph = NULL; pGraph = GetFilterGraph(); if (pGraph) { pGraph->QueryInterface(&m_pMediaSeeking); pGraph->Release(); } HANDLE handles[2]; handles[0] = m_hStopCommandThreadEvent; handles[1] = m_hCommandEvent; if (m_pMediaSeeking) { while(1) { //DWORD result = WaitForMultipleObjects(2, handles, false, 40); DWORD result = WaitForMultipleObjects(2, handles, false, INFINITE); if (result == WAIT_OBJECT_0) // exit event { LogDebug("CBDReaderFilter::Command thread: closing down"); return 0; } /* else if (result == WAIT_TIMEOUT) { LONGLONG pos = 0; HRESULT hr = m_pMediaSeeking->GetCurrentPosition(&pos); if (SUCCEEDED(hr)) { lib.ProvideUserInput(CONVERT_DS_90KHz(pos), BD_VK_NONE); } } */ else if (result == WAIT_OBJECT_0 + 1) // command in queue { LONGLONG posEnd = 0; LONGLONG zeroPos = 0; m_pMediaSeeking->GetDuration(&posEnd); ivecCommandQueue it; DS_CMD cmd; { // just fetch the command and release the lock CAutoLock lock(&m_csCommandQueue); it = m_commandQueue.begin(); cmd = (*it); m_commandQueue.erase(it); if (m_commandQueue.empty()) { ResetEvent(m_hCommandEvent); } } switch (cmd.id) { case REBUILD: { LogDebug("CBDReaderFilter::Command thread: issue rebuild!"); LONGLONG pos = 0; if (cmd.refTime.m_time < 0) { CAutoLock lock(&m_csClock); pos = m_rtCurrentTime; } else pos = cmd.refTime.m_time; m_eRebuild.Reset(); TriggerOnMediaChanged(); m_eRebuild.Wait(); if (m_bRebuildOngoing) { LogDebug("CBDReaderFilter::Command thread: graph rebuild has failed?"); return 0; } m_bUpdateStreamPositionOnly = true; LogDebug("CBDReaderFilter::Command thread: seek - pos: %06.3f (rebuild)", cmd.refTime.Millisecs() / 1000.0); m_pMediaSeeking->SetPositions(&pos, AM_SEEKING_AbsolutePositioning | AM_SEEKING_FakeSeek, &posEnd, AM_SEEKING_NoPositioning); m_eSeekDone.Wait(); m_eSeekDone.Reset(); m_demultiplexer.SetMediaChanging(false); m_demultiplexer.m_bRebuildOngoing = false; break; } case SEEK: m_bUpdateStreamPositionOnly = true; LogDebug("CBDReaderFilter::Command thread: seek requested - pos: %06.3f", cmd.refTime.Millisecs() / 1000.0); HRESULT hr = m_pMediaSeeking->SetPositions((LONGLONG*)&cmd.refTime.m_time, AM_SEEKING_AbsolutePositioning | AM_SEEKING_FakeSeek, &posEnd, AM_SEEKING_NoPositioning); m_eSeekDone.Wait(); m_eSeekDone.Reset(); break; } } else { DWORD error = GetLastError(); LogDebug("CBDReaderFilter::Command thread: WaitForMultipleObjects failed: %d", error); } } } return 0; }