// IMediaControl STDMETHODIMP CRealMediaGraph::Run() { if(m_pRMP->m_pPlayer->IsDone()) RenderFile(m_fn, NULL); m_pRMP->m_UserState = State_Running; return (PNR_OK == m_pRMP->m_pPlayer->Begin()) ? S_OK : E_FAIL; }
bool CDXGraph::QueryInterfaces(void) { if (mGraph) { HRESULT hr = NOERROR; hr |= mGraph->QueryInterface(IID_IMediaControl, (void **)&mMediaControl); hr |= mGraph->QueryInterface(IID_IMediaEventEx, (void **)&mEvent); hr |= mGraph->QueryInterface(IID_IBasicVideo, (void **)&mBasicVideo); hr |= mGraph->QueryInterface(IID_IBasicAudio, (void **)&mBasicAudio); hr |= mGraph->QueryInterface(IID_IVideoWindow, (void **)&mVideoWindow); hr |= mGraph->QueryInterface(IID_IMediaSeeking, (void **)&mSeeking); //查询数据流位置接口 hr |= mGraph->QueryInterface(IID_IMediaPosition, (void**) &pmp); hr |= CoCreateInstance(CLSID_SampleGrabber,NULL, CLSCTX_INPROC_SERVER, IID_ISampleGrabber, (void **)&m_pGrabber); hr |= m_pGrabber->QueryInterface(IID_IBaseFilter,(void **)&m_pGrabberFilter); AM_MEDIA_TYPE mt; ZeroMemory(&mt, sizeof(AM_MEDIA_TYPE)); mt.majortype = MEDIATYPE_Video; mt.subtype = MEDIASUBTYPE_RGB32; hr = m_pGrabber->SetMediaType(&mt); hr = mGraph->AddFilter(m_pGrabberFilter, L"Sample Grabber"); m_pGrabberCB = new CSampleGrabberCB_np(); RenderFile(m_strSourceFile); hr = pmp->get_Duration(&tLength); hr = m_pGrabber->GetConnectedMediaType( &mt ); VIDEOINFOHEADER * vih = (VIDEOINFOHEADER*) mt.pbFormat; m_pGrabberCB->Width = vih->bmiHeader.biWidth; m_pGrabberCB->Height = vih->bmiHeader.biHeight; m_pGrabberCB->mFramePerSecond = (10000000.0)/vih->AvgTimePerFrame + 0.5; m_pGrabberCB->mdwBitRate = vih->dwBitRate; m_pGrabber->SetCallback(m_pGrabberCB,1); mSeeking->GetDuration(&g_rtTotalTime); m_pGrabberCB->SetBitmapHeader(); if (mSeeking) { mSeeking->SetTimeFormat(&TIME_FORMAT_MEDIA_TIME); } return SUCCEEDED(hr); } return false; }
//================================================================== void RibRendToy::MenuFunc( int id ) { switch ( id ) { case MENUID_DBG_PICK_BUCKET: mHiderParams.mDbgShowBuckets = !mHiderParams.mDbgShowBuckets; RenderFile( true ); RebuildMenu(); glutPostRedisplay(); return; case MENUID_DBG_COLOR_CODE_GRIDS: mHiderParams.mDbgColorCodedGrids = !mHiderParams.mDbgColorCodedGrids; RenderFile( true ); RebuildMenu(); glutPostRedisplay(); return; case MENUID_DBG_RASTERIZE_VERTS: mHiderParams.mDbgRasterizeVerts = !mHiderParams.mDbgRasterizeVerts; RenderFile( true ); RebuildMenu(); glutPostRedisplay(); return; } if ( id >= MENUID_FILES ) { strcpy_s( mFileToRender, mExePath ); strcat_s( mFileToRender, "/" ); strcat_s( mFileToRender, mTestRibFilesPaths[id - MENUID_FILES].c_str() ); strcat_s( mFileToRender, "/" ); strcat_s( mFileToRender, mTestRibFiles[id - MENUID_FILES].c_str() ); printf( "Render File: %s\n", mFileToRender ); } }
//================================================================== void RibRendToy::MouseFunc( int button, int butState, int mx, int my ) { if ( button == 0 ) { if ( butState == GLUT_DOWN ) { if ( mHiderParams.mDbgShowBuckets ) { mHiderParams.mDbgOnlyBucketAtX = mx; mHiderParams.mDbgOnlyBucketAtY = my; RenderFile( true ); glutPostRedisplay(); mHiderParams.mDbgOnlyBucketAtX = -1; mHiderParams.mDbgOnlyBucketAtY = -1; } } } }
STDMETHODIMP CBaseGraph::AddSourceFilter(LPCWSTR lpcwstrFileName, LPCWSTR lpcwstrFilterName, IBaseFilter** ppFilter) { *ppFilter = nullptr; return RenderFile(lpcwstrFileName, nullptr); }//E_NOTIMPL;}
BOOL CDXVideoGrabber::PlayFile(const char* inFile, HWND hWnd) { RemoveAllFilters(); HRESULT hr = m_pGrabber.CoCreateInstance( CLSID_SampleGrabber ); if( !m_pGrabber ) return FALSE; CComQIPtr< IBaseFilter, &IID_IBaseFilter > pGrabBase( m_pGrabber ); // force it to connect to video, 24 bit // CMediaType VideoType; VideoType.SetType( &MEDIATYPE_Video ); VideoType.SetSubtype( &MEDIASUBTYPE_RGB24 ); hr = m_pGrabber->SetMediaType( &VideoType ); // shouldn't fail if( FAILED( hr ) ) return FALSE; // add the grabber to the graph // hr = m_pIGraphBuilder->AddFilter( pGrabBase, L"Grabber" ); if( FAILED( hr ) ) return FALSE; RenderFile(inFile); AM_MEDIA_TYPE mt; hr = m_pGrabber->GetConnectedMediaType( &mt ); if ( FAILED( hr) ) { return FALSE; } VIDEOINFOHEADER * vih = (VIDEOINFOHEADER*) mt.pbFormat; if(m_pSGCB) { // m_pSGCB->SetOwner(GetParent(hWnd)); m_pSGCB->SetWidth(vih->bmiHeader.biWidth); m_pSGCB->SetHeight(vih->bmiHeader.biHeight); } FreeMediaType( mt ); // don't buffer the samples as they pass through // hr = m_pGrabber->SetBufferSamples( FALSE ); // only grab one at a time, stop stream after // grabbing one sample // hr = m_pGrabber->SetOneShot( FALSE ); // set the callback, so we can grab the one sample // hr = m_pGrabber->SetCallback( m_pSGCB, 1 ); if(!SetDisplayWindow(hWnd)) { return FALSE; } return Run(); }