DirectShow: построение графа фильтров (вопрос)
От: Toha_  
Дата: 13.12.05 12:50
Оценка:
Всем добрый день.

Пытаюсь открыть видео файл путем добовление желаемых фильтров в граф фильтров и дальнейшего соединения пинов первого и последнего фильтра. Но функция IGraphBuilder::Connect возвращает VFW_E_NOT_IN_GRAPH. В хелпе по DirectX SDK эта ошибка говорит о том, что в графе фильтров не достает, по крайне мере, одного фильтра. Хотя там же, в описании IGraphBuilder::Connect, говорится, что при соединение пинов, граф достраевается сам.

Вопрос: что делаю не так и как это сделать правильно.

Код:
{
  HRESULT hr;
  CComPtr<IGraphBuilder> m_comGB;
  CComPtr<IPin> m_comSourcePin, m_comNullPin;

  hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, 
                        IID_IGraphBuilder, (void **)&m_comGB);

  if( SUCCEEDED(hr) )
  {
    BaseFilter comBF_FileSource;

    hr = m_comGB->AddSourceFilter(L"intro_s.avi", L"MP: Filter Source", &comBF_FileSource);

    if ( SUCCEEDED(hr) )
    {
      CComPtr<IEnumPins> comEnumPin;

      hr = comBF_FileSource->EnumPins(&comEnumPin);

      if ( SUCCEEDED(hr) )
      {
        ULONG cFetched;

        while ( comEnumPin->Next(1, &m_comSourcePin, &cFetched) == S_OK )
        {
          PIN_DIRECTION pd;

          m_comSourcePin->QueryDirection(&pd);

          if ( pd == PINDIR_OUTPUT )
            break;
          else
            m_comSourcePin = 0;
        }
      }
    }
    else return false;

    BaseFilter comBF_SampleGrab;

    hr = CoCreateInstance(CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER,
                          IID_IBaseFilter, (void**)&comBF_SampleGrab);

    if ( SUCCEEDED(hr) )
    {
      hr = m_comGB->AddFilter(comBF_FileSource, L"MP: SampleGrab");

      // Configure the Sample Grabber.
      CComPtr<ISampleGrabber> pSG;

      hr = comBF_SampleGrab->QueryInterface(IID_ISampleGrabber, (void**)&pSG);

      if ( SUCCEEDED(hr) )
      {
        AM_MEDIA_TYPE mt;
        ZeroMemory(&mt, sizeof(AM_MEDIA_TYPE));
        mt.majortype = MEDIATYPE_Video;
        mt.subtype   = MEDIASUBTYPE_RGB24;
        hr = pSG->SetMediaType(&mt);

        pSG->SetOneShot(FALSE);
        pSG->SetBufferSamples(TRUE);

        m_pThisPtr.push_back(this);
        pSG->SetCallback(this, 1); // 0 = Use the SampleCB callback method.
      }
    }
    else return false;

    BaseFilter comBF_NullRender;

    hr = CoCreateInstance(CLSID_NullRenderer, NULL, CLSCTX_INPROC_SERVER,
                          IID_IBaseFilter, (void**)&comBF_NullRender);

    if ( SUCCEEDED(hr) )
    {
      hr = m_comGB->AddFilter(comBF_FileSource, L"MP: NullRender");

      CComPtr<IEnumPins> comEnumPin;

      hr = comBF_NullRender->EnumPins(&comEnumPin);

      if ( SUCCEEDED(hr) )
      {
        ULONG cFetched;
        while ( comEnumPin->Next(1, &m_comNullPin, &cFetched) == S_OK )
        {
          PIN_DIRECTION pd;

          m_comNullPin->QueryDirection(&pd);

          if ( pd == PINDIR_INPUT )
            break;
          else
            m_comNullPin = 0;
        }
      }
    }
    else return false;

    if ( m_comSourcePin != 0 && m_comNullPin != 0 )
    {// Вот тут возвращается VFW_E_NOT_IN_GRAPH
      hr = m_comGB->Connect(m_comSourcePin, m_comNullPin);

      const char *szErr = DXGetErrorString9(hr);

      if ( FAILED(hr) )
        return false;
    }
    else return false;
  }

  return false;
}
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Re: DirectShow: построение графа фильтров (вопрос)
От: romson  
Дата: 13.12.05 15:02
Оценка:
Здравствуйте, Toha_, Вы писали:

T_>Вопрос: что делаю не так и как это сделать правильно.


Ответ: посмотреть внимательно на эти две строчки:

T_> hr = m_comGB->AddFilter(comBF_FileSource, L"MP: SampleGrab");


T_> hr = m_comGB->AddFilter(comBF_FileSource, L"MP: NullRender");
Re[2]: DirectShow: построение графа фильтров (вопрос)
От: Toha_  
Дата: 19.12.05 09:52
Оценка:
Здравствуйте, romson, Вы писали:

R>Здравствуйте, Toha_, Вы писали:


T_>>Вопрос: что делаю не так и как это сделать правильно.


R>Ответ: посмотреть внимательно на эти две строчки:


T_>> hr = m_comGB->AddFilter(comBF_FileSource, L"MP: SampleGrab");


T_>> hr = m_comGB->AddFilter(comBF_FileSource, L"MP: NullRender");


Да, незаметил.

Но все равно не хочет, работать. Теперь возвращает VFW_S_PARTIAL_RENDER, в чем теперь касяк?
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Re[3]: DirectShow: построение графа фильтров (вопрос)
От: romson  
Дата: 19.12.05 11:07
Оценка:
Здравствуйте, Toha_, Вы писали:

T_>Но все равно не хочет, работать. Теперь возвращает VFW_S_PARTIAL_RENDER, в чем теперь касяк?


Так это, вроде как, и не ошибка вовсе.
Re[4]: DirectShow: построение графа фильтров (вопрос)
От: Toha_  
Дата: 19.12.05 11:19
Оценка:
Здравствуйте, romson, Вы писали:

R>Здравствуйте, Toha_, Вы писали:


T_>>Но все равно не хочет, работать. Теперь возвращает VFW_S_PARTIAL_RENDER, в чем теперь касяк?


R>Так это, вроде как, и не ошибка вовсе.


В каком смысле?

Граф то не был построен до конца и невозможно получить IMediaControl.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Re[5]: DirectShow: построение графа фильтров (вопрос)
От: romson  
Дата: 19.12.05 11:50
Оценка:
Здравствуйте, Toha_, Вы писали:

T_>Граф то не был построен до конца и невозможно получить IMediaControl.


А в GraphEdit'е те же самые фильтры соединяются нормально?
Re[6]: DirectShow: построение графа фильтров (вопрос)
От: Toha_  
Дата: 19.12.05 12:15
Оценка:
Здравствуйте, romson, Вы писали:

R>Здравствуйте, Toha_, Вы писали:


T_>>Граф то не был построен до конца и невозможно получить IMediaControl.


R>А в GraphEdit'е те же самые фильтры соединяются нормально?


Там все ОК...
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Re[7]: DirectShow: построение графа фильтров (вопрос)
От: romson  
Дата: 19.12.05 13:11
Оценка:
Здравствуйте, Toha_, Вы писали:

T_>Там все ОК...


Попробуй соединять источник с граббером и граббер с рендерером отдельно.
Re[8]: DirectShow: построение графа фильтров (вопрос)
От: Toha_  
Дата: 19.12.05 14:14
Оценка:
Здравствуйте, romson, Вы писали:

R>Здравствуйте, Toha_, Вы писали:


T_>>Там все ОК...


R>Попробуй соединять источник с граббером и граббер с рендерером отдельно.


Хм... В ручную все фильтры соеденить удалось. Но это не удобно, т.к. надо знать какой сплитер ставить и декодер видео.

Прийдется рендерить стандартным и менять фильтры. Если получится.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Re[9]: DirectShow: построение графа фильтров (вопрос)
От: romson  
Дата: 19.12.05 15:01
Оценка:
Здравствуйте, Toha_, Вы писали:

T_>Хм... В ручную все фильтры соеденить удалось. Но это не удобно, т.к. надо знать какой сплитер ставить и декодер видео.


T_>Прийдется рендерить стандартным и менять фильтры. Если получится.


А разве при соединении источника с граббером сплиттер и декодер не вставляются автоматически?
Re[10]: DirectShow: построение графа фильтров (вопрос)
От: Toha_  
Дата: 19.12.05 15:14
Оценка:
Здравствуйте, romson, Вы писали:

R>Здравствуйте, Toha_, Вы писали:


T_>>Хм... В ручную все фильтры соеденить удалось. Но это не удобно, т.к. надо знать какой сплитер ставить и декодер видео.


T_>>Прийдется рендерить стандартным и менять фильтры. Если получится.


R>А разве при соединении источника с граббером сплиттер и декодер не вставляются автоматически?


В GraphEdit вставляется (но почему то только сплитер), а у меня нет. Он без сплитера вообще соеденить не может.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Re[2]: DirectShow: построение графа фильтров (вопрос)
От: fuzzz Беларусь  
Дата: 07.06.07 13:43
Оценка:
Здравствуйте, romson, Вы писали:

R>Здравствуйте, Toha_, Вы писали:


T_>>Вопрос: что делаю не так и как это сделать правильно.


R>Ответ: посмотреть внимательно на эти две строчки:


T_>> hr = m_comGB->AddFilter(comBF_FileSource, L"MP: SampleGrab");


T_>> hr = m_comGB->AddFilter(comBF_FileSource, L"MP: NullRender");


Вы не могли бы описать подробнее, в чём здесь проблема?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.