//==========================================================================; // // Copyright (c) Microsoft Corporation 1999-2000. // //--------------------------------------------------------------------------; // // MSVidFilePlayback.cpp : Implementation of CMSVidFilePlayback // #include "stdafx.h" #ifndef TUNING_MODEL_ONLY #include "atltmp.h" #include "MSVidCtl.h" #include "MSVidFilePlayback.h" #include #include #define FILE_BEGINNING 0 #define LOCAL_OATRUE -1 DEFINE_EXTERN_OBJECT_ENTRY(CLSID_MSVidFilePlaybackDevice, CMSVidFilePlayback) ///////////////////////////////////////////////////////////////////////////// // CMSVidFilePlayback STDMETHODIMP CMSVidFilePlayback::PostRun(){ if(m_fGraphInit){ InitGraph(); m_fGraphInit = false; } return IMSVidPBGraphSegmentImpl::PostRun(); } STDMETHODIMP CMSVidFilePlayback::put_Rate(double lRate){ HRESULT hr = S_OK; try{ /*** Checking args and init'ing interfaces ***/ if (!m_pGraph) { // graph not valid return Error(IDS_INVALID_STATE, __uuidof(IMSVidFilePlayback), HRESULT_FROM_WIN32(ERROR_INVALID_STATE)); } // Attempt to set the rate using IMediaSeeking DSFilter Reader = m_Filters[m_iReader]; PQMediaSeeking PQIMSeeking; if(Reader){ for(DSFilter::iterator iPin = Reader.begin(); iPin != Reader.end(); ++iPin){ PQIMSeeking = (*iPin); if(PQIMSeeking){ TRACELSM(TRACE_DETAIL, (dbgDump << "MSVidFilePlayback::put_Rate found Pin"), ""); break; } } } if(!PQIMSeeking){ TRACELSM(TRACE_DETAIL, (dbgDump << "MSVidFilePlayback::put_Rate using graph"), ""); PQIMSeeking = m_pGraph; } if(PQIMSeeking){ TRACELSM(TRACE_DETAIL, (dbgDump << "MSVidFilePlayback::put_Rate using Imediaseeking"), ""); return PQIMSeeking->SetRate(lRate); } // If IMediaSeeking FAILS try IMediaPostion PQMediaPosition PQIMPos(m_pGraph); if(PQIMPos){ // Change rate TRACELSM(TRACE_DETAIL, (dbgDump << "MSVidFilePlayback::put_Rate using Imediaposition"), ""); return PQIMPos->put_Rate((double)lRate); } // Could Not QI Either one set the error return Error(IDS_E_CANTQI , __uuidof(IMSVidFilePlayback), E_NOINTERFACE); } catch(HRESULT hrTmp){ // Something went bad, threw a HRESULT return Error(IDS_INVALID_STATE , __uuidof(IMSVidFilePlayback), hrTmp); } catch(...){ // Something went bad, dont know what it threw return E_UNEXPECTED; } } STDMETHODIMP CMSVidFilePlayback::get_Rate(double *lRate){ HRESULT hr = S_OK; try{ /*** Checking args and init'ing interfaces ***/ if (!m_pGraph) { // graph not valid return Error(IDS_INVALID_STATE, __uuidof(IMSVidFilePlayback), HRESULT_FROM_WIN32(ERROR_INVALID_STATE)); } // Attempt to set the rate using IMediaSeeking DSFilter Reader = m_Filters[m_iReader]; PQMediaSeeking PQIMSeeking; if(Reader){ for(DSFilter::iterator iPin = Reader.begin(); iPin != Reader.end(); ++iPin){ PQIMSeeking = (*iPin); if(PQIMSeeking){ break; } } } if(!PQIMSeeking){ PQIMSeeking = m_pGraph; } if(PQIMSeeking){ return PQIMSeeking->GetRate(lRate); } // If IMediaSeeking FAILS try IMediaPostion PQMediaPosition PQIMPos(m_pGraph); if(PQIMPos){ // Change rate return PQIMPos->get_Rate(lRate); } // Could Not QI Either one set the error return Error(IDS_E_CANTQI , __uuidof(IMSVidFilePlayback), E_NOINTERFACE); } catch(HRESULT hrTmp){ // Something went bad, threw a HRESULT return Error(IDS_INVALID_STATE , __uuidof(IMSVidFilePlayback), hrTmp); } catch(...){ // Something went bad, dont know what it threw return E_UNEXPECTED; } } STDMETHODIMP CMSVidFilePlayback::PreStop(){ TRACELSM(TRACE_DETAIL, (dbgDump << "MSVidFilePlayback::PreStop()"), ""); double curRate = 0; HRESULT hr = get_Rate(&curRate); if(SUCCEEDED(hr) && curRate != 1){ hr = IMSVidFilePlaybackImpl::put_Rate(1); if(FAILED(hr)){ TRACELSM(TRACE_ERROR, (dbgDump << "MSVidFilePlayback::PreStop() base put_Rate 1 failed"), ""); } hr = put_Rate(1); if(FAILED(hr)){ TRACELSM(TRACE_ERROR, (dbgDump << "MSVidFilePlayback::PreStop() put_Rate 1 failed"), ""); } } else{ TRACELSM(TRACE_ERROR, (dbgDump << "MSVidFilePlayback::PreStop() get_Rate failed"), ""); } return NOERROR; } STDMETHODIMP CMSVidFilePlayback::PostStop(){ HRESULT hr = S_OK; TRACELSM(TRACE_DETAIL, (dbgDump << "MSVidFilePlayback::PostStop()"), ""); try { #if 0 // If the graph is not is stopped state // we make sure it is if (!m_pGraph.IsStopped()) { HRESULT hr = PQVidCtl(m_pContainer)->Stop(); } #endif // If m_fEnableResetOnStop is true then we need to reset // the postion back to the beggining // else do nothing // If it fails file cannot be reset to beginning if(m_fEnableResetOnStop){ put_CurrentPosition(0); } } catch(HRESULT hrTmp){ hr = hrTmp; } catch(...){ hr = E_UNEXPECTED; } return hr; } STDMETHODIMP CMSVidFilePlayback::InterfaceSupportsErrorInfo(REFIID riid) { static const IID* arr[] = { &IID_IMSVidFilePlayback }; for (int i=0; i < sizeof(arr) / sizeof(arr[0]); i++) { if (InlineIsEqualGUID(*arr[i],riid)) return S_OK; } return S_FALSE; } STDMETHODIMP CMSVidFilePlayback::put_Container(IMSVidGraphSegmentContainer *pCtl) { try { if (!m_fInit) { return Error(IDS_OBJ_NO_INIT, __uuidof(IMSVidFilePlayback), CO_E_NOTINITIALIZED); } if (!pCtl) { return Unload(); } if (m_pContainer) { if (!m_pContainer.IsEqualObject(VWSegmentContainer(pCtl))) { return Error(IDS_OBJ_ALREADY_INIT, __uuidof(IMSVidFilePlayback), CO_E_ALREADYINITIALIZED); } else { return NO_ERROR; } } // DON'T addref the container. we're guaranteed nested lifetimes // and an addref creates circular refcounts so we never unload. m_pContainer.p = pCtl; m_pGraph = m_pContainer.GetGraph(); return NOERROR; } catch (ComException &e) { return e; } catch (...) { return E_UNEXPECTED; } } STDMETHODIMP CMSVidFilePlayback::Build() { if (!m_FileName) { return Error(IDS_INVALID_STATE, __uuidof(IMSVidFilePlayback), HRESULT_FROM_WIN32(ERROR_INVALID_STATE)); } if(m_Filters.size() > 0){ return NOERROR; } USES_CONVERSION; CString csName(_T("File Playback")); DSFilter pfr; HRESULT hr = pfr.CoCreateInstance(CLSID_WMAsfReader,0, CLSCTX_INPROC_SERVER); if(SUCCEEDED(hr)){ CComQIPtr pqFS(pfr); if(!!pqFS){ // set the target ASF filename hr = pqFS->Load(m_FileName, NULL); if(FAILED(hr)){ if(hr == (HRESULT)NS_E_LICENSE_REQUIRED){ CComQIPtr pq_DRMReader(pqFS); if(pq_DRMReader){ hr = pq_DRMReader->AcquireLicense(1); // 1 == attempt silently if(SUCCEEDED(hr)){ hr = pqFS->Load(m_FileName, NULL); } else{ TRACELSM(TRACE_ERROR, (dbgDump << "MSVidFilePlayback::Build() Could not acquire license"), ""); } } else{ TRACELSM(TRACE_ERROR, (dbgDump << "MSVidFilePlayback::Build() Could not qi for IWMDRMReader "), ""); } } } if(SUCCEEDED(hr)){ // add the ASF writer filter to the graph hr = m_pGraph->AddFilter(pfr, csName); if(SUCCEEDED(hr)){ TRACELSM(TRACE_ERROR, (dbgDump << "MSVidFilePlayback::Build() added WMV filter to graph hr = " << std::hex << hr), ""); } else{ TRACELSM(TRACE_ERROR, (dbgDump << "MSVidFilePlayback::Build() could not add filter to graph hr = " << std::hex << hr), ""); } } else{ TRACELSM(TRACE_ERROR, (dbgDump << "MSVidFilePlayback::Build() Could not set file name, hr = " << std::hex << hr), ""); } } else{ TRACELSM(TRACE_ERROR, (dbgDump << "MSVidFilePlayback::Build() Could not get IFileSourceFilter interface, hr = " << std::hex << hr), ""); } } else{ TRACELSM(TRACE_ERROR, (dbgDump << "MSVidFilePlayback::Build() CreateFilter AsfReader failed, hr = " << std::hex << hr), ""); } if (FAILED(hr)) { hr = m_pGraph->AddSourceFilter(m_FileName, csName, &pfr); if(FAILED(hr)){ TRACELSM(TRACE_ERROR, (dbgDump << "MSVidFilePlayback::Build() Add Source Filter Failed, hr = " << std::hex << hr), ""); return Error(IDS_CANT_PLAY_FILE, __uuidof(IMSVidFilePlayback), hr); } } m_Filters.clear(); m_Filters.push_back(pfr); m_iReader = m_Filters.size() - 1; return NOERROR; } STDMETHODIMP CMSVidFilePlayback::OnEventNotify(long lEvent, LONG_PTR lParam1, LONG_PTR lParam2) { return IMSVidPBGraphSegmentImpl::OnEventNotify(lEvent, lParam1, lParam2); } #endif //TUNING_MODEL_ONLY // end of file - MSVidFilePlayback.cpp