159 |
m_Bitrate = m_bFileCopy = 0; |
m_Bitrate = m_bFileCopy = 0; |
160 |
m_Width = m_Height = 0; |
m_Width = m_Height = 0; |
161 |
|
|
162 |
m_pVideoMeter = m_pSrcFilter = m_pXvidEncoder = 0; |
m_pVideoMeter = m_pSplitter = m_pSrcFilter = m_pXvidEncoder = 0; |
163 |
//m_pEmmsDummy = 0; |
//m_pEmmsDummy = 0; |
164 |
m_pMuxer = m_pFileWriter = m_pChgType = 0; |
m_pMuxer = m_pFileWriter = m_pChgType = 0; |
165 |
m_pXvidConfig = 0; |
m_pXvidConfig = 0; |
166 |
m_bBreakRequested = 0; |
m_bBreakRequested = 0; |
167 |
|
|
168 |
|
m_pEvent = 0; |
169 |
|
m_pControl = 0; |
170 |
m_elapsedSize = m_curSize = m_totalSize = 0; |
m_elapsedSize = m_curSize = m_totalSize = 0; |
171 |
} |
} |
172 |
|
|
215 |
m_pSrcFilter = 0; |
m_pSrcFilter = 0; |
216 |
} |
} |
217 |
|
|
218 |
|
if (m_pSplitter) { |
219 |
|
m_pGraph->RemoveFilter(m_pSplitter); |
220 |
|
m_pSplitter->Release(); |
221 |
|
m_pSplitter = 0; |
222 |
|
} |
223 |
|
|
224 |
if (m_pXvidEncoder) { |
if (m_pXvidEncoder) { |
225 |
m_pGraph->RemoveFilter(m_pXvidEncoder); |
m_pGraph->RemoveFilter(m_pXvidEncoder); |
226 |
m_pXvidEncoder->Release(); |
m_pXvidEncoder->Release(); |
310 |
IID_IGraphBuilder, (void **)&m_pGraph); |
IID_IGraphBuilder, (void **)&m_pGraph); |
311 |
|
|
312 |
if (hr == S_OK) hr = m_pBuilder->SetFiltergraph(m_pGraph); |
if (hr == S_OK) hr = m_pBuilder->SetFiltergraph(m_pGraph); |
313 |
|
m_bIsWMV = 0; |
314 |
if (hr == S_OK) hr = AddSourceFilter(m_szSourceFilePath); |
if (hr == S_OK) hr = AddSourceFilter(m_szSourceFilePath); |
315 |
|
|
|
m_bIsWM = 0; |
|
|
|
|
316 |
m_UsedStreamsCnt = 1; |
m_UsedStreamsCnt = 1; |
317 |
m_vDuration = 0; |
m_vDuration = 0; |
318 |
IMediaSeeking *pSeek = 0; |
IMediaSeeking *pSeek = 0; |
319 |
IPin *pOutVideoPin = 0; |
IPin *pOutVideoPin = 0; |
320 |
CMediaType vMt; |
CMediaType vMt; |
321 |
|
|
322 |
if (hr == S_OK) { |
if (hr == S_OK && m_bIsWMV) { |
323 |
if (GetFilterPin(m_pSrcFilter, PINDIR_OUTPUT, 0, &pOutVideoPin, |
if (GetFilterPin(m_pSrcFilter, PINDIR_OUTPUT, 0, &pOutVideoPin, |
324 |
MEDIATYPE_Video, GUID_NULL) == S_OK) |
MEDIATYPE_Video, GUID_NULL) == S_OK) { |
|
{ |
|
|
IServiceProvider *pSrcServiceProvider = 0; |
|
|
|
|
|
if (m_pSrcFilter->QueryInterface(IID_IServiceProvider, |
|
|
(void **)&pSrcServiceProvider) == S_OK) |
|
|
{ |
|
|
IWMReaderAdvanced2 *pRdrAdv2 = 0; |
|
|
|
|
|
if (pSrcServiceProvider->QueryInterface(IID_IWMReaderAdvanced2, |
|
|
(void **)&pRdrAdv2) == S_OK) |
|
|
{ |
|
|
m_bIsWM = 1; |
|
|
|
|
325 |
IEnumMediaTypes *pIEnumMediaTypes = 0; |
IEnumMediaTypes *pIEnumMediaTypes = 0; |
326 |
|
|
327 |
if (pOutVideoPin->EnumMediaTypes(&pIEnumMediaTypes) == S_OK) |
if (pOutVideoPin->EnumMediaTypes(&pIEnumMediaTypes) == S_OK) { |
|
{ |
|
328 |
AM_MEDIA_TYPE *ppMt; |
AM_MEDIA_TYPE *ppMt; |
329 |
|
|
330 |
if (pIEnumMediaTypes->Next(1, &ppMt, 0) == S_OK) |
if (pIEnumMediaTypes->Next(1, &ppMt, 0) == S_OK) { |
|
{ |
|
331 |
vMt = *ppMt; |
vMt = *ppMt; |
332 |
DeleteMediaType(ppMt); |
DeleteMediaType(ppMt); |
333 |
} |
} |
334 |
pIEnumMediaTypes->Release(); |
pIEnumMediaTypes->Release(); |
335 |
} |
} |
|
pRdrAdv2->Release(); |
|
|
} |
|
|
pSrcServiceProvider->Release(); |
|
|
} |
|
336 |
pOutVideoPin->QueryInterface(IID_IMediaSeeking, (void **)&pSeek); |
pOutVideoPin->QueryInterface(IID_IMediaSeeking, (void **)&pSeek); |
337 |
} |
} |
338 |
} |
} |
339 |
|
|
340 |
IPin* pVMeterInVideoPin = 0; |
IPin* pVMeterInVideoPin = 0; |
341 |
if ((hr == S_OK)) { |
if ((hr == S_OK)) { |
342 |
//if (!m_bIsWM && (hr == S_OK)) { |
//if (!m_bIsWMV && (hr == S_OK)) { |
343 |
CUnknown *pVidMeter = 0; |
CUnknown *pVidMeter = 0; |
344 |
|
|
345 |
if (hr == S_OK) pVidMeter = CProgressNotifyFilter::CreateInstance(0, &hr, 0); |
if (hr == S_OK) pVidMeter = CProgressNotifyFilter::CreateInstance(0, &hr, 0); |
377 |
if (hr == S_OK) { |
if (hr == S_OK) { |
378 |
m_TotalFrames = 0; |
m_TotalFrames = 0; |
379 |
|
|
380 |
if (hr == S_OK && !m_bIsWM) hr = pVMeterInVideoPin->ConnectionMediaType(&vMt); |
if (hr == S_OK && !m_bIsWMV) hr = pVMeterInVideoPin->ConnectionMediaType(&vMt); |
381 |
|
|
382 |
if (m_vDuration != 0) { |
if (m_vDuration != 0) { |
383 |
if (vMt.formattype != FORMAT_None) { |
if (vMt.formattype != FORMAT_None) { |
384 |
if (vMt.formattype == FORMAT_VideoInfo || vMt.formattype == FORMAT_MPEGVideo) { |
if (vMt.formattype == FORMAT_VideoInfo || vMt.formattype == FORMAT_MPEGVideo) { |
385 |
m_AvgTimeForFrame = (DWORD) ((VIDEOINFOHEADER *)vMt.pbFormat)->AvgTimePerFrame; |
m_AvgTimeForFrame = (DWORD) ((VIDEOINFOHEADER *)vMt.pbFormat)->AvgTimePerFrame; |
386 |
if (m_bIsWM) m_Bitrate = ((VIDEOINFOHEADER *)vMt.pbFormat)->dwBitRate; |
if (m_bIsWMV) m_Bitrate = ((VIDEOINFOHEADER *)vMt.pbFormat)->dwBitRate; |
387 |
} |
} |
388 |
else if (vMt.formattype == FORMAT_VideoInfo2 || vMt.formattype == FORMAT_MPEG2Video) { |
else if (vMt.formattype == FORMAT_VideoInfo2 || vMt.formattype == FORMAT_MPEG2Video) { |
389 |
m_AvgTimeForFrame = (DWORD) (((VIDEOINFOHEADER2 *)vMt.pbFormat)->AvgTimePerFrame); |
m_AvgTimeForFrame = (DWORD) (((VIDEOINFOHEADER2 *)vMt.pbFormat)->AvgTimePerFrame); |
390 |
if (m_bIsWM) m_Bitrate = ((VIDEOINFOHEADER2 *)vMt.pbFormat)->dwBitRate; |
if (m_bIsWMV) m_Bitrate = ((VIDEOINFOHEADER2 *)vMt.pbFormat)->dwBitRate; |
391 |
} |
} |
392 |
else return VFW_E_TYPE_NOT_ACCEPTED; |
else return VFW_E_TYPE_NOT_ACCEPTED; |
393 |
} |
} |
409 |
|| gSubtype == FOURCCMap('4PML') || gSubtype == FOURCCMap('4pml') |
|| gSubtype == FOURCCMap('4PML') || gSubtype == FOURCCMap('4pml') |
410 |
|| gSubtype == FOURCCMap('4PMS') || gSubtype == FOURCCMap('4pms')) |
|| gSubtype == FOURCCMap('4PMS') || gSubtype == FOURCCMap('4pms')) |
411 |
{ |
{ |
412 |
pCompressedVideoFilter = m_pVideoMeter ? m_pVideoMeter : m_pSrcFilter; |
pCompressedVideoFilter = m_pVideoMeter ? m_pVideoMeter : (m_pSplitter ? m_pSplitter : m_pSrcFilter); |
413 |
} |
} |
414 |
else { |
else { |
415 |
m_bFileCopy = 0; |
m_bFileCopy = 0; |
421 |
if (hr == S_OK) pCompressedVideoFilter = m_pXvidEncoder; |
if (hr == S_OK) pCompressedVideoFilter = m_pXvidEncoder; |
422 |
|
|
423 |
#if 0 |
#if 0 |
424 |
if (!m_bIsWM) { |
if (!m_bIsWMV) { |
425 |
// dummy filter - emms instruction only |
// dummy filter - emms instruction only |
426 |
CUnknown *pVidMeterEmms = 0; |
CUnknown *pVidMeterEmms = 0; |
427 |
if (hr == S_OK) pVidMeterEmms = CProgressNotifyFilter::CreateInstance(0, &hr, 0); |
if (hr == S_OK) pVidMeterEmms = CProgressNotifyFilter::CreateInstance(0, &hr, 0); |
602 |
if (pOutPin) pOutPin->Release(); |
if (pOutPin) pOutPin->Release(); |
603 |
if (pInPin) pInPin->Release(); |
if (pInPin) pInPin->Release(); |
604 |
} |
} |
605 |
} else hr = m_pSrcFilter->QueryInterface(IID_IBaseFilter, (void **)&PinInfo.pFilter); |
} else if (m_pSplitter) hr = m_pSplitter->QueryInterface(IID_IBaseFilter, (void **)&PinInfo.pFilter); |
606 |
|
else hr = m_pSrcFilter->QueryInterface(IID_IBaseFilter, (void **)&PinInfo.pFilter); |
607 |
|
|
608 |
IPin *pAudioPin = 0; |
IPin *pAudioPin = 0; |
609 |
if (check_only) { |
if (check_only) { |
655 |
bNeedsRecompression = 1; |
bNeedsRecompression = 1; |
656 |
m_bFileCopy = 0; // file copy strategy cannot be used on this input |
m_bFileCopy = 0; // file copy strategy cannot be used on this input |
657 |
} |
} |
658 |
else if (((MPEGLAYER3WAVEFORMAT *)paomt->pbFormat)->fdwFlags & 4) { // VBR |
else if ((paomt->subtype.Data1 == 0x55) && |
659 |
|
(((MPEGLAYER3WAVEFORMAT *)paomt->pbFormat)->fdwFlags != MPEGLAYER3_FLAG_PADDING_ON)){ // VBR |
660 |
bNeedsRecompression = 1; |
bNeedsRecompression = 1; |
661 |
} |
} |
662 |
if (pAmtEnum) pAmtEnum->Release(); |
if (pAmtEnum) pAmtEnum->Release(); |
669 |
hr = AddDirectXFilterByMoniker(CLSID_AudioCompressorCategory, "MPEG Layer-3", &pAudioCompressor, 0); |
hr = AddDirectXFilterByMoniker(CLSID_AudioCompressorCategory, "MPEG Layer-3", &pAudioCompressor, 0); |
670 |
if (hr == S_OK) hr = m_pGraph->AddFilter(pAudioCompressor, 0); |
if (hr == S_OK) hr = m_pGraph->AddFilter(pAudioCompressor, 0); |
671 |
|
|
672 |
if (hr == S_OK) hr = ConnectFilters(m_pGraph, pAudioPin, pAudioCompressor, MEDIATYPE_Audio, GUID_NULL, 0); |
IBaseFilter *pFFdA=0; |
673 |
|
if (hr == S_OK) AddFilterByCLSID((GUID *)&CLSID_FFDshowAudioDecoder, &pFFdA); |
674 |
|
|
675 |
|
if (hr == S_OK) hr = ConnectFilters(m_pGraph, pAudioPin, pAudioCompressor, GUID_NULL, GUID_NULL, 0); |
676 |
|
|
677 |
|
RemoveIfUnconnectedInput(pFFdA); |
678 |
|
if (pFFdA) pFFdA->Release(); |
679 |
|
|
680 |
IPin *pMp3Pin = 0; |
IPin *pMp3Pin = 0; |
681 |
if (hr == S_OK) hr = GetFilterPin(pAudioCompressor, PINDIR_OUTPUT, 0, &pMp3Pin, MEDIATYPE_Audio, GUID_NULL); |
if (hr == S_OK) hr = GetFilterPin(pAudioCompressor, PINDIR_OUTPUT, 0, &pMp3Pin, MEDIATYPE_Audio, GUID_NULL); |
686 |
int bConnected = 0; |
int bConnected = 0; |
687 |
|
|
688 |
if (hr == S_OK) { |
if (hr == S_OK) { |
689 |
while (!bConnected && (hr = pMp3MtEnum->Next(1, &pMp3mt, 0)) == S_OK) { |
DWORD UsedDataRate = 0, MaxDataRate=0; |
690 |
|
// Some files have mono track 8kHz, it's not possible to obtain 128kbps datarate |
691 |
|
while (UsedDataRate != 16000 && (pMp3MtEnum->Next(1, &pMp3mt, 0) == S_OK)) { |
692 |
MPEGLAYER3WAVEFORMAT *pMp3cb = (MPEGLAYER3WAVEFORMAT *)pMp3mt->pbFormat; |
MPEGLAYER3WAVEFORMAT *pMp3cb = (MPEGLAYER3WAVEFORMAT *)pMp3mt->pbFormat; |
693 |
if ( |
if ( |
694 |
//pMp3cb->nSamplesPerSec == 44100 && |
//pMp3cb->nSamplesPerSec == 44100 && |
695 |
pMp3cb->wfx.nAvgBytesPerSec == 16000) |
pMp3cb->wfx.nAvgBytesPerSec == 16000) { |
696 |
{ |
UsedDataRate = 16000; |
697 |
|
} |
698 |
|
if (MaxDataRate < pMp3cb->wfx.nAvgBytesPerSec) |
699 |
|
MaxDataRate = pMp3cb->wfx.nAvgBytesPerSec; |
700 |
|
DeleteMediaType(pMp3mt); |
701 |
|
} |
702 |
|
pMp3MtEnum->Reset(); |
703 |
|
if (UsedDataRate != 16000) UsedDataRate = MaxDataRate; |
704 |
|
|
705 |
|
while (!bConnected && (pMp3MtEnum->Next(1, &pMp3mt, 0) == S_OK)) { |
706 |
|
MPEGLAYER3WAVEFORMAT *pMp3cb = (MPEGLAYER3WAVEFORMAT *)pMp3mt->pbFormat; |
707 |
|
if ( |
708 |
|
//pMp3cb->nSamplesPerSec == 44100 && |
709 |
|
pMp3cb->wfx.nAvgBytesPerSec == UsedDataRate) { |
710 |
|
|
711 |
CUnknown *pMp3Normalizer = 0; |
CUnknown *pMp3Normalizer = 0; |
712 |
IBaseFilter *pIMp3Normalizer = 0; |
IBaseFilter *pIMp3Normalizer = 0; |
713 |
// Type 2 - only 16000 Bps = 128kbit audio |
// Type 2 - only 16000 Bps = 128kbit audio |
746 |
if (pIMp3Normalizer) pIMp3Normalizer->Release(); |
if (pIMp3Normalizer) pIMp3Normalizer->Release(); |
747 |
} |
} |
748 |
if (hr == S_OK && PinInfo.pFilter == m_pSrcFilter) m_UsedStreamsCnt++; |
if (hr == S_OK && PinInfo.pFilter == m_pSrcFilter) m_UsedStreamsCnt++; |
749 |
|
if (hr == S_OK && PinInfo.pFilter == m_pSplitter) m_UsedStreamsCnt++; |
750 |
} |
} |
751 |
pAudioPin->Release(); |
pAudioPin->Release(); |
752 |
} |
} |
831 |
wcsncpy(pwName, in_szFilePath, sLen+1); |
wcsncpy(pwName, in_szFilePath, sLen+1); |
832 |
#endif |
#endif |
833 |
|
|
834 |
HRESULT hr = m_pGraph->AddSourceFilter(pwName, L"Source filter", &m_pSrcFilter); |
HRESULT hr = TrySourceFilter(pwName, (GUID *)&CLSID_AsyncReader); |
835 |
|
// |
836 |
|
// AddFilterByCLSID((GUID *)&CLSID_AsyncReader, &m_pSrcFilter); |
837 |
|
//IFileSourceFilter* pSrc =0 ; |
838 |
|
//if (hr == S_OK) hr = m_pSrcFilter->QueryInterface(IID_IFileSourceFilter, (void **)(&pSrc)); |
839 |
|
//if (hr == S_OK) hr = pSrc->Load(in_szFilePath, 0);//&m_SrcFileMediaType); |
840 |
|
|
841 |
|
IPin* pOutSrcPin=0, *pVideoPin=0; |
842 |
|
if (hr == S_OK) hr = GetFilterPin(m_pSrcFilter, PINDIR_OUTPUT, 0, &pOutSrcPin, GUID_NULL, GUID_NULL); |
843 |
|
IEnumMediaTypes* pEnumSrcMediaTypes=0; |
844 |
|
if (hr == S_OK) hr = pOutSrcPin->EnumMediaTypes(&pEnumSrcMediaTypes); |
845 |
|
//if (hr == S_OK) hr = pEnumSrcMediaTypes->Reset(); |
846 |
|
AM_MEDIA_TYPE *pMt =0; |
847 |
|
if (hr == S_OK) do hr = pEnumSrcMediaTypes->Next(1, &pMt, 0); |
848 |
|
while (hr == S_OK && (pMt->majortype != MEDIATYPE_Stream || pMt->subtype == GUID_NULL)); |
849 |
|
if (hr == S_OK) m_SrcFileMediaType = *pMt; |
850 |
|
if (pMt) DeleteMediaType(pMt); |
851 |
|
if (pEnumSrcMediaTypes) pEnumSrcMediaTypes->Release(); |
852 |
|
if (hr == S_OK) { |
853 |
|
if (m_SrcFileMediaType.majortype == MEDIATYPE_Stream) { |
854 |
|
if (m_SrcFileMediaType.subtype == MEDIASUBTYPE_Asf || |
855 |
|
m_SrcFileMediaType.subtype == MEDIASUBTYPE_ASF) { |
856 |
|
m_bIsWMV = 1; |
857 |
|
} else if (m_SrcFileMediaType.subtype == MEDIASUBTYPE_Avi) |
858 |
|
hr = AddFilterByCLSID((GUID *)&CLSID_AviSplitter, &m_pSplitter); |
859 |
|
else {//if (m_SrcFileMediaType.subtype == MEDIASUBTYPE_MP4) |
860 |
|
hr = AddFilterByCLSID((GUID *)&CLSID_LAVSplitter, &m_pSplitter); |
861 |
|
if (hr == S_OK) { |
862 |
|
hr = ConnectFilters(m_pGraph, pOutSrcPin, m_pSplitter); |
863 |
|
if (hr == S_OK) hr = GetFilterPin(m_pSplitter, PINDIR_OUTPUT, 0, &pVideoPin, MEDIATYPE_Video, GUID_NULL); |
864 |
|
if (m_pSplitter || !pVideoPin) { |
865 |
|
m_pGraph->RemoveFilter(m_pSplitter); |
866 |
|
m_pSplitter->Release(); |
867 |
|
m_pSplitter = 0; |
868 |
|
} |
869 |
|
if (pVideoPin) {pVideoPin->Release(); pVideoPin = 0;} |
870 |
|
} |
871 |
|
if (!m_pSplitter) { |
872 |
|
hr = AddFilterByCLSID((GUID *)&CLSID_HaaliMediaSplitter_AR, &m_pSplitter); |
873 |
|
if (hr == S_OK) { |
874 |
|
hr = ConnectFilters(m_pGraph, pOutSrcPin, m_pSplitter); |
875 |
|
if (hr == S_OK) hr = GetFilterPin(m_pSplitter, PINDIR_OUTPUT, 0, &pVideoPin, MEDIATYPE_Video, GUID_NULL); |
876 |
|
if (m_pSplitter || !pVideoPin) { |
877 |
|
m_pGraph->RemoveFilter(m_pSplitter); |
878 |
|
m_pSplitter->Release(); |
879 |
|
m_pSplitter = 0; |
880 |
|
} |
881 |
|
if (pVideoPin) {pVideoPin->Release(); pVideoPin = 0;} |
882 |
|
} |
883 |
|
} |
884 |
|
} |
885 |
|
} else hr = VFW_E_TYPE_NOT_ACCEPTED; |
886 |
|
} |
887 |
|
|
888 |
|
if (m_bIsWMV || !m_pSplitter) { |
889 |
|
if (m_pSrcFilter) { |
890 |
|
m_pGraph->RemoveFilter(m_pSrcFilter); |
891 |
|
m_pSrcFilter->Release(); |
892 |
|
} |
893 |
|
m_pSrcFilter = 0; |
894 |
|
if (m_bIsWMV) hr = TrySourceFilter(pwName, (GUID *)&CLSID_WMAsfReader ); |
895 |
|
else { |
896 |
|
//if (m_SrcFileMediaType.majortype == MEDIATYPE_Stream && m_SrcFileMediaType.subtype != GUID_NULL) { |
897 |
|
hr = TrySourceFilter(pwName, (GUID *)&CLSID_LAVSource); |
898 |
|
if (hr == S_OK) hr = GetFilterPin(m_pSrcFilter, PINDIR_OUTPUT, 0, &pVideoPin, MEDIATYPE_Video, GUID_NULL); |
899 |
|
if (!m_pSrcFilter || !pVideoPin) { |
900 |
|
if (!pVideoPin && m_pSrcFilter) { |
901 |
|
m_pGraph->RemoveFilter(m_pSrcFilter); |
902 |
|
m_pSrcFilter->Release(); |
903 |
|
m_pSrcFilter = 0; |
904 |
|
} |
905 |
|
if (!m_pSrcFilter) TrySourceFilter(pwName, (GUID *)&CLSID_HaaliMediaSplitter); |
906 |
|
if (hr == S_OK) hr = GetFilterPin(m_pSrcFilter, PINDIR_OUTPUT, 0, &pVideoPin, MEDIATYPE_Video, GUID_NULL); |
907 |
|
if (!pVideoPin && m_pSrcFilter) { |
908 |
|
m_pGraph->RemoveFilter(m_pSrcFilter); |
909 |
|
m_pSrcFilter->Release(); |
910 |
|
m_pSrcFilter = 0; |
911 |
|
} |
912 |
|
} |
913 |
|
if (pVideoPin) { |
914 |
|
pVideoPin->Release(); |
915 |
|
pVideoPin = 0; |
916 |
|
} |
917 |
|
//} else { |
918 |
|
// hr = TrySourceFilter(in_szFilePath, (GUID *)&CLSID_HaaliMediaSplitter); |
919 |
|
// if (!m_pSrcFilter) TrySourceFilter(in_szFilePath, (GUID *)&CLSID_LAVSource); |
920 |
|
//} |
921 |
|
} |
922 |
|
if (!m_pSrcFilter) hr = m_pGraph->AddSourceFilter(pwName, 0, &m_pSrcFilter); |
923 |
|
} |
924 |
|
if (pOutSrcPin) pOutSrcPin->Release(); |
925 |
#if 0 |
#if 0 |
926 |
HRESULT hr = AddFilterByCLSID((GUID *)&CLSID_AsyncReader, &this->m_pSrcFilter); |
HRESULT hr = AddFilterByCLSID((GUID *)&CLSID_AsyncReader, &this->m_pSrcFilter); |
927 |
IFileSourceFilter* pSrc =0 ; |
IFileSourceFilter* pSrc =0 ; |
936 |
} |
} |
937 |
|
|
938 |
HRESULT |
HRESULT |
939 |
|
RecompressGraph::TrySourceFilter(LPCOLESTR pwName, GUID *in_Clsid) |
940 |
|
{ |
941 |
|
HRESULT hr = AddFilterByCLSID(in_Clsid, &m_pSrcFilter); |
942 |
|
IFileSourceFilter* pSrc =0 ; |
943 |
|
if (hr == S_OK) hr = m_pSrcFilter->QueryInterface(IID_IFileSourceFilter, (void **)(&pSrc)); |
944 |
|
if (hr == S_OK) hr = pSrc->Load(pwName, 0);//&m_SrcFileMediaType); |
945 |
|
if (pSrc) pSrc->Release(); |
946 |
|
if (hr != S_OK && m_pSrcFilter) { |
947 |
|
m_pGraph->RemoveFilter(m_pSrcFilter); |
948 |
|
m_pSrcFilter->Release(); |
949 |
|
m_pSrcFilter = 0; |
950 |
|
} |
951 |
|
return hr; |
952 |
|
} |
953 |
|
|
954 |
|
HRESULT |
955 |
RecompressGraph::SetProgress(int elapsedSize, int totalSize) |
RecompressGraph::SetProgress(int elapsedSize, int totalSize) |
956 |
{ |
{ |
957 |
|
|
962 |
} |
} |
963 |
|
|
964 |
HRESULT |
HRESULT |
965 |
|
RecompressGraph::WaitForCompletion(long *out_Evt) |
966 |
|
{ |
967 |
|
long Evt, P1, P2; |
968 |
|
TCHAR szErrorStr[150]; |
969 |
|
HRESULT hr = S_OK; |
970 |
|
do { |
971 |
|
hr = m_pEvent->GetEvent(&Evt, &P1, &P2, INFINITE); |
972 |
|
if (Evt == EC_ERRORABORT) { |
973 |
|
_stprintf(szErrorStr, _TEXT("Error ocurred\nCode=%08X, %08X\nContinue?"), P1, P2); |
974 |
|
if (MessageBox(ghDlg, szErrorStr, 0, MB_YESNO) == IDYES) Evt = 0; |
975 |
|
} |
976 |
|
} while (Evt != EC_COMPLETE && Evt != EC_STREAM_ERROR_STOPPED && Evt != EC_USERABORT && Evt != EC_ERRORABORT); |
977 |
|
*out_Evt = Evt; |
978 |
|
return S_OK; |
979 |
|
} |
980 |
|
|
981 |
|
HRESULT |
982 |
RecompressGraph::Recompress() |
RecompressGraph::Recompress() |
983 |
{ |
{ |
984 |
if (!m_pGraph) return E_UNEXPECTED; |
if (!m_pGraph) return E_UNEXPECTED; |
985 |
|
|
986 |
IMediaEvent *pEvent = 0; |
long E = 0; |
|
IMediaControl *pControl = 0; |
|
987 |
HRESULT hr = S_OK; |
HRESULT hr = S_OK; |
988 |
|
|
989 |
if (hr == S_OK && m_bFileCopy == 1 && |
if (hr == S_OK && m_bFileCopy == 1 && |
998 |
goto finish_recompress; |
goto finish_recompress; |
999 |
} |
} |
1000 |
|
|
1001 |
hr = m_pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl); |
hr = m_pGraph->QueryInterface(IID_IMediaControl, (void **)&m_pControl); |
1002 |
if (hr == S_OK) hr = m_pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent); |
if (hr == S_OK) hr = m_pGraph->QueryInterface(IID_IMediaEvent, (void **)&m_pEvent); |
1003 |
|
|
1004 |
IRecProgressNotify *pBitrateProgressNotify=0; |
IRecProgressNotify *pBitrateProgressNotify=0; |
1005 |
OAFilterState oas; |
OAFilterState oas; |
|
long E=0; |
|
1006 |
|
|
1007 |
if (hr == S_OK) hr = (m_pVideoMeter ? m_pVideoMeter : m_pChgType)->QueryInterface(IID_IRecProgressNotify, |
if (hr == S_OK) hr = (m_pVideoMeter ? m_pVideoMeter : m_pChgType)->QueryInterface(IID_IRecProgressNotify, |
1008 |
(void **)&pBitrateProgressNotify); |
(void **)&pBitrateProgressNotify); |
1022 |
m_pXvidConfig = 0; |
m_pXvidConfig = 0; |
1023 |
|
|
1024 |
if (hr == S_OK) { |
if (hr == S_OK) { |
1025 |
hr = pControl->Run(); |
hr = m_pControl->Run(); |
1026 |
if (hr == S_OK) { |
if (hr == S_OK) { |
1027 |
do hr = pControl->GetState(1000, &oas); |
do hr = m_pControl->GetState(1000, &oas); |
1028 |
while ((oas != State_Running && hr == S_OK ) || hr == VFW_S_STATE_INTERMEDIATE || hr == S_FALSE); |
while ((oas != State_Running && hr == S_OK ) || hr == VFW_S_STATE_INTERMEDIATE || hr == S_FALSE); |
1029 |
} |
} |
1030 |
} |
} |
1032 |
//long Evt, P1, P2; |
//long Evt, P1, P2; |
1033 |
//if (hr == S_OK) do hr = pEvent->GetEvent(&Evt, &P1, &P2, INFINITE); |
//if (hr == S_OK) do hr = pEvent->GetEvent(&Evt, &P1, &P2, INFINITE); |
1034 |
//while (Evt != EC_COMPLETE && Evt != 3 && Evt != 2); |
//while (Evt != EC_COMPLETE && Evt != 3 && Evt != 2); |
1035 |
if (hr == S_OK) hr = pEvent->WaitForCompletion(INFINITE, &E); |
//if (hr == S_OK) hr = m_pEvent->WaitForCompletion(INFINITE, &E); |
1036 |
|
hr = WaitForCompletion(&E); |
1037 |
|
|
1038 |
if (pControl) { |
if (m_pControl) { |
1039 |
HRESULT hrTmp; |
HRESULT hrTmp; |
1040 |
if (E == EC_USERABORT) m_pSrcFilter->Stop(); |
if (E == EC_USERABORT) m_pSrcFilter->Stop(); |
1041 |
hrTmp = pControl->Stop(); |
hrTmp = m_pControl->Stop(); |
1042 |
do hrTmp = pControl->GetState(1000, &oas); |
do hrTmp = m_pControl->GetState(1000, &oas); |
1043 |
while ((oas != State_Stopped && hrTmp == S_OK ) || |
while ((oas != State_Stopped && hrTmp == S_OK ) || |
1044 |
hrTmp == VFW_S_STATE_INTERMEDIATE || hrTmp == S_FALSE); |
hrTmp == VFW_S_STATE_INTERMEDIATE || hrTmp == S_FALSE); |
1045 |
if (hr == S_OK) hr = hrTmp; |
if (hr == S_OK) hr = hrTmp; |
1054 |
TCHAR *pSrcStr = _tcsdup(m_szSourceFilePath); |
TCHAR *pSrcStr = _tcsdup(m_szSourceFilePath); |
1055 |
TCHAR *pDstStr = _tcsdup(m_szDstFilePath); |
TCHAR *pDstStr = _tcsdup(m_szDstFilePath); |
1056 |
|
|
1057 |
pControl->Release(); |
m_pControl->Release(); |
1058 |
pEvent->Release(); |
m_pEvent->Release(); |
1059 |
pControl = 0; |
m_pControl = 0; |
1060 |
pEvent = 0; |
m_pEvent = 0; |
1061 |
int bBreakRequested = m_bBreakRequested; |
int bBreakRequested = m_bBreakRequested; |
1062 |
//if (hr == S_OK) |
//if (hr == S_OK) |
1063 |
CleanUp(); |
CleanUp(); |
1072 |
} |
} |
1073 |
|
|
1074 |
if (hr == S_OK) hr = CreateGraph(m_ProgressWnd, 2); |
if (hr == S_OK) hr = CreateGraph(m_ProgressWnd, 2); |
1075 |
if (hr == S_OK) hr = m_pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl); |
if (hr == S_OK) hr = m_pGraph->QueryInterface(IID_IMediaControl, (void **)&m_pControl); |
1076 |
if (hr == S_OK) hr = m_pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent); |
if (hr == S_OK) hr = m_pGraph->QueryInterface(IID_IMediaEvent, (void **)&m_pEvent); |
1077 |
|
|
1078 |
if (hr == S_OK) hr = (m_pVideoMeter ? m_pVideoMeter : m_pChgType)->QueryInterface(IID_IRecProgressNotify, |
if (hr == S_OK) hr = (m_pVideoMeter ? m_pVideoMeter : m_pChgType)->QueryInterface(IID_IRecProgressNotify, |
1079 |
(void **)&pBitrateProgressNotify); |
(void **)&pBitrateProgressNotify); |
1093 |
DeleteFile(m_szDstFilePath); |
DeleteFile(m_szDstFilePath); |
1094 |
|
|
1095 |
if (hr == S_OK) { |
if (hr == S_OK) { |
1096 |
hr = pControl->Run(); |
hr = m_pControl->Run(); |
1097 |
if (hr == S_OK) { |
if (hr == S_OK) { |
1098 |
do hr = pControl->GetState(1000, &oas); |
do hr = m_pControl->GetState(1000, &oas); |
1099 |
while ((oas != State_Running && hr == S_OK ) || hr == VFW_S_STATE_INTERMEDIATE || hr == S_FALSE); |
while ((oas != State_Running && hr == S_OK ) || hr == VFW_S_STATE_INTERMEDIATE || hr == S_FALSE); |
1100 |
} |
} |
1101 |
} |
} |
1102 |
|
|
1103 |
#if 0 |
//#if 0 |
1104 |
long Evt, P1, P2; |
// long Evt, P1, P2; |
1105 |
if (hr == S_OK) do hr = pEvent->GetEvent(&Evt, &P1, &P2, INFINITE); |
//if (hr == S_OK) do hr = m_pEvent->GetEvent(&Evt, &P1, &P2, INFINITE); |
1106 |
while (Evt != EC_COMPLETE && Evt != 3 && Evt != 2); |
//while (Evt != EC_COMPLETE && (Evt != 3 || P1 == 0xC00D002F) && Evt != 2); |
1107 |
|
|
1108 |
for (int iCnt=0; (iCnt < m_UsedStreamsCnt) && (hr == S_OK); iCnt++) { |
//for (int iCnt=0; (iCnt < m_UsedStreamsCnt) && (hr == S_OK); iCnt++) { |
1109 |
if (hr == S_OK) do hr = pEvent->WaitForCompletion(INFINITE, &E); |
// if (hr == S_OK) do hr = pEvent->WaitForCompletion(INFINITE, &E); |
1110 |
while (hr == S_OK && E != 1); |
// while (hr == S_OK && E != 1); |
1111 |
} |
//} |
1112 |
#endif |
//#endif |
1113 |
if (hr == S_OK) hr = pEvent->WaitForCompletion(INFINITE, &E); |
//if (hr == S_OK) hr = pEvent->WaitForCompletion(INFINITE, &E); |
1114 |
|
// long Evt; |
1115 |
|
if (hr == S_OK) hr = WaitForCompletion(&E); |
1116 |
|
|
1117 |
if (pControl) { |
if (m_pControl) { |
1118 |
if (E == EC_USERABORT) m_pSrcFilter->Stop(); |
if (E == EC_USERABORT) m_pSrcFilter->Stop(); |
1119 |
HRESULT hrTmp = pControl->Stop(); |
HRESULT hrTmp = m_pControl->Stop(); |
1120 |
do hrTmp = pControl->GetState(1000, &oas); |
do hrTmp = m_pControl->GetState(1000, &oas); |
1121 |
while ((oas != State_Stopped && hrTmp == S_OK ) || |
while ((oas != State_Stopped && hrTmp == S_OK ) || |
1122 |
hrTmp == VFW_S_STATE_INTERMEDIATE || hrTmp == S_FALSE); |
hrTmp == VFW_S_STATE_INTERMEDIATE || hrTmp == S_FALSE); |
1123 |
if (hr == S_OK) hr = hrTmp; |
if (hr == S_OK) hr = hrTmp; |
1124 |
} |
} |
1125 |
if (E == EC_ERRORABORT) hr = E_FAIL; |
if (E == EC_ERRORABORT) hr = E_FAIL; |
1126 |
|
|
1127 |
if (pControl) pControl->Release(); |
if (m_pControl) m_pControl->Release(); |
1128 |
if (pEvent) pEvent->Release(); |
if (m_pEvent) m_pEvent->Release(); |
1129 |
if (pBitrateProgressNotify) pBitrateProgressNotify->Release(); |
if (pBitrateProgressNotify) pBitrateProgressNotify->Release(); |
1130 |
|
|
1131 |
DeleteFile(Pass_FILE); |
DeleteFile(Pass_FILE); |
1179 |
} |
} |
1180 |
} |
} |
1181 |
|
|
1182 |
|
void |
1183 |
|
RecompressGraph::RemoveIfUnconnectedInput(IBaseFilter *in_pFilter) |
1184 |
|
{ |
1185 |
|
IPin *pPin; |
1186 |
|
HRESULT hr = GetFilterPin(in_pFilter, PINDIR_INPUT, 0, &pPin, GUID_NULL, GUID_NULL); |
1187 |
|
if (hr == S_OK && pPin) { |
1188 |
|
pPin->Release(); |
1189 |
|
m_pGraph->RemoveFilter(in_pFilter); |
1190 |
|
} |
1191 |
|
} |
1192 |
|
|
1193 |
//////////////////////////////////////////////////////////////////////////////// |
//////////////////////////////////////////////////////////////////////////////// |
1194 |
// main.cpp |
// main.cpp |
1430 |
break; |
break; |
1431 |
|
|
1432 |
case WM_COMMAND: |
case WM_COMMAND: |
1433 |
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { |
if (LOWORD(wParam) == IDCANCEL) { |
1434 |
EndDialog(hDlg, LOWORD(wParam)); |
EndDialog(hDlg, LOWORD(wParam)); |
1435 |
return TRUE; |
return TRUE; |
1436 |
} |
} |