[GEM-cvs] Gem/src/Pixes pix_videoDS.h, 1.5, 1.6 pix_videoDS.cpp, 1.11, 1.12 pix_movieDS.h, 1.1, 1.2
Brought to you by:
zmoelnig
From: IOhannes m z. <zmo...@us...> - 2006-08-22 07:41:32
|
Update of /cvsroot/pd-gem/Gem/src/Pixes In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv6927 Modified Files: pix_videoDS.h pix_videoDS.cpp pix_movieDS.h pix_movieDS.cpp Log Message: put the DirectShow code into #ifdef's to prevent it from bulding on other platforms; dos2unix Index: pix_movieDS.h =================================================================== RCS file: /cvsroot/pd-gem/Gem/src/Pixes/pix_movieDS.h,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** pix_movieDS.h 21 Aug 2006 21:16:51 -0000 1.1 --- pix_movieDS.h 22 Aug 2006 07:40:58 -0000 1.2 *************** *** 1,5 **** #ifndef INCLUDE_pix_movieDS_H_ ! #define INCLUDE_pix_movieDS_H_ ! #pragma warning (disable : 4251) --- 1,5 ---- #ifndef INCLUDE_pix_movieDS_H_ ! #define INCLUDE_pix_movieDS_H_ ! #pragma warning (disable : 4251) *************** *** 21,31 **** ////////// // Constructor ! pix_movieDS(t_symbol *filename); ! ! ! ~pix_movieDS(void); ! ! protected: ! ////////// // Do the rendering --- 21,29 ---- ////////// // Constructor ! pix_movieDS(t_symbol *filename); ! ~pix_movieDS(void); ! ! protected: ! ////////// // Do the rendering *************** *** 71,76 **** ////////// // Do the rendering ! virtual void getFrame(); ! virtual void MovRate(float rate); --- 69,74 ---- ////////// // Do the rendering ! virtual void getFrame(); ! virtual void MovRate(float rate); *************** *** 164,177 **** private: ! IBaseFilter *VideoFilter; // Base Filter for video ! IBaseFilter *SampleFilter; // Sample filter ! IBaseFilter *NullFilter; // Null render base Filter for video ! ISampleGrabber *SampleGrabber; // Sample grabber ! IGraphBuilder *FilterGraph; // Filter Graph for movie playback ! ISampleGrabber *VideoGrabber; // Video grabber ! IMediaControl *MediaControl; // MediaControl interface ! IMediaSeeking *MediaSeeking; // MediaSeeking interface ! IMediaPosition *MediaPosition; // MediaPosition interface ! LONGLONG m_Duration; // Duration of video LONGLONG m_LastFrame; // Last frame --- 162,175 ---- private: ! IBaseFilter *VideoFilter; // Base Filter for video ! IBaseFilter *SampleFilter; // Sample filter ! IBaseFilter *NullFilter; // Null render base Filter for video ! ISampleGrabber *SampleGrabber; // Sample grabber ! IGraphBuilder *FilterGraph; // Filter Graph for movie playback ! ISampleGrabber *VideoGrabber; // Video grabber ! IMediaControl *MediaControl; // MediaControl interface ! IMediaSeeking *MediaSeeking; // MediaSeeking interface ! IMediaPosition *MediaPosition; // MediaPosition interface ! LONGLONG m_Duration; // Duration of video LONGLONG m_LastFrame; // Last frame *************** *** 184,191 **** static void rateCallback(void *data, t_floatarg state); static void rectangleCallback(void *data, t_floatarg state); ! }; ! HRESULT movieGetPin(IBaseFilter *pFilter, PIN_DIRECTION PinDir, IPin **ppPin); HRESULT movieConnectFilters(IGraphBuilder *pGraph, IBaseFilter *pFirst, IBaseFilter *pSecond); ! #endif \ No newline at end of file --- 182,189 ---- static void rateCallback(void *data, t_floatarg state); static void rectangleCallback(void *data, t_floatarg state); ! }; ! HRESULT movieGetPin(IBaseFilter *pFilter, PIN_DIRECTION PinDir, IPin **ppPin); HRESULT movieConnectFilters(IGraphBuilder *pGraph, IBaseFilter *pFirst, IBaseFilter *pSecond); ! #endif Index: pix_movieDS.cpp =================================================================== RCS file: /cvsroot/pd-gem/Gem/src/Pixes/pix_movieDS.cpp,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** pix_movieDS.cpp 21 Aug 2006 21:16:40 -0000 1.1 --- pix_movieDS.cpp 22 Aug 2006 07:40:58 -0000 1.2 *************** *** 1,2 **** --- 1,6 ---- + #include "Base/config.h" + + #if defined(__WIN32__) && defined(HAVE_DIRECTSHOW) + #include <atlbase.h> #include <atlconv.h> *************** *** 6,26 **** #pragma comment(lib, "strmbase.lib") [...1477 lines suppressed...] ! ! // Attempt to connect the two pins. ! RetVal = pGraph->Connect(pOut, pIn); ! ! // A filter having audio and video will return a VFW_S_PARTIAL_RENDER when attempting ! // to connect to a filter only having video (ie. the SampleGrabber filter) ! if (VFW_S_PARTIAL_RENDER == RetVal) ! { ! return S_OK; ! } ! ! // Release the pins ! pIn->Release(); ! pOut->Release(); ! ! return RetVal; ! } ! ! ! #endif /* HAVE_DIRECTSHOW */ Index: pix_videoDS.cpp =================================================================== RCS file: /cvsroot/pd-gem/Gem/src/Pixes/pix_videoDS.cpp,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** pix_videoDS.cpp 21 Aug 2006 21:21:17 -0000 1.11 --- pix_videoDS.cpp 22 Aug 2006 07:40:58 -0000 1.12 *************** *** 44,48 **** HRESULT GetPin(IBaseFilter *, PIN_DIRECTION, IPin **); HRESULT AddGraphToRot(IUnknown *pUnkGraph, DWORD *pdwRegister); ! HRESULT SetAviOptions(IBaseFilter *ppf, InterleavingMode INTERLEAVE_MODE); void RemoveGraphFromRot(DWORD pdwRegister); --- 44,48 ---- HRESULT GetPin(IBaseFilter *, PIN_DIRECTION, IPin **); HRESULT AddGraphToRot(IUnknown *pUnkGraph, DWORD *pdwRegister); ! HRESULT SetAviOptions(IBaseFilter *ppf, InterleavingMode INTERLEAVE_MODE); void RemoveGraphFromRot(DWORD pdwRegister); *************** *** 136,140 **** { HRESULT hr; ! AM_MEDIA_TYPE MediaType; if (!m_bInitCOM) --- 136,140 ---- { HRESULT hr; ! AM_MEDIA_TYPE MediaType; if (!m_bInitCOM) *************** *** 178,222 **** } ! // Create the SampleGrabber filter ! hr = CoCreateInstance(CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER, ! IID_IBaseFilter, (void**)&SampleFilter); ! ! if (hr != S_OK || NULL == SampleFilter) ! { ! error("Unable to create SampleFilter interface %d", hr); ! ! return; ! } ! // Query for the SampleGrabber interface in the SampleGrabber filter ! // Needed to grab the buffer using GetCurrentBuffer() ! hr = SampleFilter->QueryInterface(IID_ISampleGrabber, (void **)&SampleGrabber); ! ! if (hr != S_OK || NULL == SampleGrabber) ! { ! error("Unable to create SampleGrabber interface %d", hr); ! ! return; ! } ! ! // Set the media type that the SampleGrabber wants. ! // MEDIATYPE_Video selects only video and not interleaved audio and video ! // MEDIASUBTYPE_RGB24 is the colorspace and format to deliver frames ! // MediaType.formattype is GUID_NULLsince it is handled later to get file info ! memset(&MediaType, 0, sizeof(AM_MEDIA_TYPE)); ! MediaType.majortype = MEDIATYPE_Video; ! MediaType.subtype = MEDIASUBTYPE_RGB24; ! MediaType.formattype = GUID_NULL; ! hr = SampleGrabber->SetMediaType(&MediaType); ! // Set the SampleGrabber to return continuous frames hr = SampleGrabber->SetOneShot(FALSE); ! if (hr != S_OK) ! { ! error("Unable to setup sample grabber %d", hr); ! ! return; ! } // Set the SampleGrabber to copy the data to a buffer. This only set to FALSE when a --- 178,222 ---- } ! // Create the SampleGrabber filter ! hr = CoCreateInstance(CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER, ! IID_IBaseFilter, (void**)&SampleFilter); ! ! if (hr != S_OK || NULL == SampleFilter) ! { ! error("Unable to create SampleFilter interface %d", hr); ! ! return; ! } ! // Query for the SampleGrabber interface in the SampleGrabber filter ! // Needed to grab the buffer using GetCurrentBuffer() ! hr = SampleFilter->QueryInterface(IID_ISampleGrabber, (void **)&SampleGrabber); ! ! if (hr != S_OK || NULL == SampleGrabber) ! { ! error("Unable to create SampleGrabber interface %d", hr); ! ! return; ! } ! ! // Set the media type that the SampleGrabber wants. ! // MEDIATYPE_Video selects only video and not interleaved audio and video ! // MEDIASUBTYPE_RGB24 is the colorspace and format to deliver frames ! // MediaType.formattype is GUID_NULLsince it is handled later to get file info ! memset(&MediaType, 0, sizeof(AM_MEDIA_TYPE)); ! MediaType.majortype = MEDIATYPE_Video; ! MediaType.subtype = MEDIASUBTYPE_RGB24; ! MediaType.formattype = GUID_NULL; ! hr = SampleGrabber->SetMediaType(&MediaType); ! // Set the SampleGrabber to return continuous frames hr = SampleGrabber->SetOneShot(FALSE); ! if (hr != S_OK) ! { ! error("Unable to setup sample grabber %d", hr); ! ! return; ! } // Set the SampleGrabber to copy the data to a buffer. This only set to FALSE when a *************** *** 224,245 **** hr = SampleGrabber->SetBufferSamples(TRUE); ! if (hr != S_OK) ! { ! error("Unable to setup sample grabber %d", hr); ! ! return; ! } - // Create the Null Renderer - hr = CoCreateInstance(CLSID_NullRenderer, NULL, CLSCTX_INPROC_SERVER, - IID_IBaseFilter, (void**)&NullFilter); - - if (hr != S_OK || NULL == NullFilter) - { - error("Unable to create NullFilter interface %d", hr); - - return; - } - // add the filters to the graph if (FAILED(hr = m_pGB->AddFilter(m_pCDbase, L"Capture Device")) || --- 224,245 ---- hr = SampleGrabber->SetBufferSamples(TRUE); ! if (hr != S_OK) ! { ! error("Unable to setup sample grabber %d", hr); ! ! return; ! } ! ! // Create the Null Renderer ! hr = CoCreateInstance(CLSID_NullRenderer, NULL, CLSCTX_INPROC_SERVER, ! IID_IBaseFilter, (void**)&NullFilter); ! ! if (hr != S_OK || NULL == NullFilter) ! { ! error("Unable to create NullFilter interface %d", hr); ! ! return; ! } // add the filters to the graph if (FAILED(hr = m_pGB->AddFilter(m_pCDbase, L"Capture Device")) || *************** *** 251,269 **** } ! // Automatically connect the Device filter to the NullFilter through the SampleFilter. ! // Additional filters may be added. ! // Try Interleaved Audio and Video first for DV input ! if (FAILED(hr = m_pCG->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Interleaved, ! m_pCDbase, SampleFilter, NullFilter))) ! { ! //try Video only for devices with no audio ! if (FAILED(hr = m_pCG->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, ! m_pCDbase, SampleFilter, NullFilter))) ! { error("Unable to connect to SampleGrabber."); return; } ! } // QueryInterface for DirectShow interfaces --- 251,269 ---- } ! // Automatically connect the Device filter to the NullFilter through the SampleFilter. ! // Additional filters may be added. ! // Try Interleaved Audio and Video first for DV input ! if (FAILED(hr = m_pCG->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Interleaved, ! m_pCDbase, SampleFilter, NullFilter))) ! { ! //try Video only for devices with no audio ! if (FAILED(hr = m_pCG->RenderStream(&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video, ! m_pCDbase, SampleFilter, NullFilter))) ! { error("Unable to connect to SampleGrabber."); return; } ! } // QueryInterface for DirectShow interfaces *************** *** 595,620 **** void pix_videoDS :: startCapture() { ! HRESULT hr; ! WCHAR WideFileName[MAXPDSTRING]; ! ! if (m_filename[0] == 0) ! { ! error("No filename passed"); ! return; ! } ! ! if (FALSE == m_recording && m_pCG != NULL && m_haveVideo) ! { ! // Convert filename to wide chars ! memset(&WideFileName, 0, MAXPDSTRING * 2); ! ! if (0 == MultiByteToWideChar(CP_ACP, 0, m_filename, strlen(m_filename), WideFileName, ! MAXPDSTRING)) ! { ! error("Unable to capture to %s", m_filename); ! ! return; ! } ! // Set filename of output AVI. Returns pointer to a File Writer filter. if (FAILED(hr = m_pCG->SetOutputFileName(&MEDIASUBTYPE_Avi, WideFileName, --- 595,620 ---- void pix_videoDS :: startCapture() { ! HRESULT hr; ! WCHAR WideFileName[MAXPDSTRING]; ! ! if (m_filename[0] == 0) ! { ! error("No filename passed"); ! return; ! } ! ! if (FALSE == m_recording && m_pCG != NULL && m_haveVideo) ! { ! // Convert filename to wide chars ! memset(&WideFileName, 0, MAXPDSTRING * 2); ! ! if (0 == MultiByteToWideChar(CP_ACP, 0, m_filename, strlen(m_filename), WideFileName, ! MAXPDSTRING)) ! { ! error("Unable to capture to %s", m_filename); ! ! return; ! } ! // Set filename of output AVI. Returns pointer to a File Writer filter. if (FAILED(hr = m_pCG->SetOutputFileName(&MEDIASUBTYPE_Avi, WideFileName, *************** *** 626,682 **** } ! // Set AVI output option for interleaving. ! if (FAILED(hr = SetAviOptions(FileFilter, INTERLEAVE_NONE))) ! { error("Unable to set avi options."); return; ! } ! ! // Connect the Capture Device filter to the File Writer filter. Try using ! // MEDIATYPE_Interleaved first, else default to MEDIATYPE_Video. ! if (FAILED(hr = m_pCG->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Interleaved, ! m_pCDbase, NULL, FileFilter))) ! { ! if (FAILED(hr = m_pCG->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, ! m_pCDbase, NULL, FileFilter))) ! { error("Unable to record to avi."); return; } ! } ! ! m_recording = TRUE; ! } } void pix_videoDS :: stopCapture() { ! HRESULT RetVal; ! ! if (TRUE == m_recording && m_haveVideo) ! { ! IBaseFilter *Filter; ! ! // Remove the File Writer filter, if available. ! //This is probably where DS releases the written AVI file ! RetVal = m_pGB->FindFilterByName(L"File Writer", &Filter); ! ! if (S_OK == RetVal) ! { ! m_pGB->RemoveFilter(Filter); ! } ! ! // Remove the AVI Mux filter, if available. ! RetVal = m_pGB->FindFilterByName(L"Mux", &Filter); ! ! if (S_OK == RetVal) ! { ! m_pGB->RemoveFilter(Filter); ! } ! ! m_recording = FALSE; ! } } ///////////////////////////////////////////////////////// --- 626,682 ---- } ! // Set AVI output option for interleaving. ! if (FAILED(hr = SetAviOptions(FileFilter, INTERLEAVE_NONE))) ! { error("Unable to set avi options."); return; ! } ! ! // Connect the Capture Device filter to the File Writer filter. Try using ! // MEDIATYPE_Interleaved first, else default to MEDIATYPE_Video. ! if (FAILED(hr = m_pCG->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Interleaved, ! m_pCDbase, NULL, FileFilter))) ! { ! if (FAILED(hr = m_pCG->RenderStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, ! m_pCDbase, NULL, FileFilter))) ! { error("Unable to record to avi."); return; } ! } ! ! m_recording = TRUE; ! } } void pix_videoDS :: stopCapture() { ! HRESULT RetVal; ! ! if (TRUE == m_recording && m_haveVideo) ! { ! IBaseFilter *Filter; ! ! // Remove the File Writer filter, if available. ! //This is probably where DS releases the written AVI file ! RetVal = m_pGB->FindFilterByName(L"File Writer", &Filter); ! ! if (S_OK == RetVal) ! { ! m_pGB->RemoveFilter(Filter); ! } ! ! // Remove the AVI Mux filter, if available. ! RetVal = m_pGB->FindFilterByName(L"Mux", &Filter); ! ! if (S_OK == RetVal) ! { ! m_pGB->RemoveFilter(Filter); ! } ! ! m_recording = FALSE; ! } } ///////////////////////////////////////////////////////// *************** *** 703,716 **** stopTransfer(); ! if (state) ! { ! startCapture(); ! } ! ! else ! { ! stopCapture(); ! } ! startTransfer(); } --- 703,716 ---- stopTransfer(); ! if (state) ! { ! startCapture(); ! } ! ! else ! { ! stopCapture(); ! } ! startTransfer(); } *************** *** 1462,1500 **** ! HRESULT SetAviOptions(IBaseFilter *ppf, InterleavingMode INTERLEAVE_MODE) ! { ! HRESULT hr; ! CComPtr<IConfigAviMux> pMux = NULL; ! CComPtr<IConfigInterleaving> pInterleaving = NULL; ! ! ASSERT(ppf); ! if (!ppf) ! return E_POINTER; ! ! // QI for interface AVI Muxer ! if (FAILED(hr = ppf->QueryInterface(IID_IConfigAviMux, reinterpret_cast<PVOID *>(&pMux)))) ! { ! error("IConfigAviMux failed."); ! } ! ! if (FAILED(hr = pMux->SetOutputCompatibilityIndex(TRUE))) ! { ! error("SetOutputCompatibilityIndex failed."); ! } ! ! // QI for interface Interleaving ! if (FAILED(hr = ppf->QueryInterface(IID_IConfigInterleaving, reinterpret_cast<PVOID *>(&pInterleaving)))) ! { ! error("IConfigInterleaving failed."); ! } ! ! // put the interleaving mode (full, none, half) ! if (FAILED(pInterleaving->put_Mode(INTERLEAVE_MODE))) ! { ! error("put_Mode failed."); ! } ! ! return hr; ! } HRESULT AddGraphToRot(IUnknown *pUnkGraph, DWORD *pdwRegister) --- 1462,1500 ---- ! HRESULT SetAviOptions(IBaseFilter *ppf, InterleavingMode INTERLEAVE_MODE) ! { ! HRESULT hr; ! CComPtr<IConfigAviMux> pMux = NULL; ! CComPtr<IConfigInterleaving> pInterleaving = NULL; ! ! ASSERT(ppf); ! if (!ppf) ! return E_POINTER; ! ! // QI for interface AVI Muxer ! if (FAILED(hr = ppf->QueryInterface(IID_IConfigAviMux, reinterpret_cast<PVOID *>(&pMux)))) ! { ! error("IConfigAviMux failed."); ! } ! ! if (FAILED(hr = pMux->SetOutputCompatibilityIndex(TRUE))) ! { ! error("SetOutputCompatibilityIndex failed."); ! } ! ! // QI for interface Interleaving ! if (FAILED(hr = ppf->QueryInterface(IID_IConfigInterleaving, reinterpret_cast<PVOID *>(&pInterleaving)))) ! { ! error("IConfigInterleaving failed."); ! } ! ! // put the interleaving mode (full, none, half) ! if (FAILED(pInterleaving->put_Mode(INTERLEAVE_MODE))) ! { ! error("put_Mode failed."); ! } ! ! return hr; ! } HRESULT AddGraphToRot(IUnknown *pUnkGraph, DWORD *pdwRegister) Index: pix_videoDS.h =================================================================== RCS file: /cvsroot/pd-gem/Gem/src/Pixes/pix_videoDS.h,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** pix_videoDS.h 21 Aug 2006 21:21:40 -0000 1.5 --- pix_videoDS.h 22 Aug 2006 07:40:58 -0000 1.6 *************** *** 178,185 **** IMediaSeeking* m_pMS; IMediaPosition* m_pMP; ! IBaseFilter *SampleFilter; // Sample filter ! IBaseFilter *NullFilter; // Null render base Filter for video ! IBaseFilter *FileFilter; // File filter for writing video ! ISampleGrabber *SampleGrabber; // Sample grabber #ifdef DIRECTSHOW_LOGGING HFILE LogFileHandle; --- 178,185 ---- IMediaSeeking* m_pMS; IMediaPosition* m_pMP; ! IBaseFilter *SampleFilter; // Sample filter ! IBaseFilter *NullFilter; // Null render base Filter for video ! IBaseFilter *FileFilter; // File filter for writing video ! ISampleGrabber *SampleGrabber; // Sample grabber #ifdef DIRECTSHOW_LOGGING HFILE LogFileHandle; |