[svn] / trunk / xvidextra / src / apps / miniconvert / recompress.cpp Repository:
ViewVC logotype

Diff of /trunk/xvidextra/src/apps/miniconvert/recompress.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 2028, Fri Aug 19 16:20:17 2011 UTC revision 2029, Tue Sep 13 15:22:28 2011 UTC
# Line 159  Line 159 
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    
# Line 213  Line 215 
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();
# Line 302  Line 310 
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);
# Line 389  Line 377 
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        }        }
# Line 421  Line 409 
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;
# Line 433  Line 421 
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);
# Line 614  Line 602 
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) {
# Line 666  Line 655 
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();
# Line 679  Line 669 
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);
# Line 690  Line 686 
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
# Line 734  Line 746 
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      }      }
# Line 818  Line 831 
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 ;
# Line 834  Line 936 
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    
# Line 844  Line 962 
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 &&
# Line 864  Line 998 
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);
# Line 889  Line 1022 
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      }      }
# Line 899  Line 1032 
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;
# Line 920  Line 1054 
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();
# Line 938  Line 1072 
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);
# Line 959  Line 1093 
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);
# Line 1043  Line 1179 
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
# Line 1284  Line 1430 
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        }        }

Legend:
Removed from v.2028  
changed lines
  Added in v.2029

No admin address has been configured
ViewVC Help
Powered by ViewVC 1.0.4