Sample Grabber + YUV формат????
От: Аноним  
Дата: 26.08.03 08:09
Оценка:
Всем привет!
Я бодался с DShow несколько дней и обнаружил, что Sample Grabber filter не поддерживает цветоразностные форматы (YV12 и т.п.) ...
Короче, вопрос: как культурно выдрать себе картинку в память, используя стандартные средства DX? Или придется фильтр писать/искать??? Нужна именно Y компонента.
Re: Sample Grabber + YUV формат????
От: B_A_D Израиль  
Дата: 26.08.03 08:31
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Всем привет!

А>Я бодался с DShow несколько дней и обнаружил, что Sample Grabber filter не поддерживает цветоразностные форматы (YV12 и т.п.) ...
А>Короче, вопрос: как культурно выдрать себе картинку в память, используя стандартные средства DX? Или придется фильтр писать/искать??? Нужна именно Y компонента.


Да все он поддерживает. Опиши по-подробнее, откуда грабишь картинку, если с камеры, то убедись, что Capture Pin имеет в
списке поддерживаемых Media Types YV12 формат.
Re[2]: Sample Grabber + YUV формат????
От: Аноним  
Дата: 26.08.03 10:41
Оценка:
Здравствуйте, B_A_D, Вы писали:

B_A>Да все он поддерживает. Опиши по-подробнее, откуда грабишь картинку, если с камеры, то убедись, что Capture Pin имеет в

B_A>списке поддерживаемых Media Types YV12 формат.

Грабим картинку с TV-тюнера. Дрова — WHQL, так что дело в SampleGrabber.

Я в GraphEdit пытался все делать. Pin имеет YV12 формат, и VideoRenderer его прекрасно рисует. Как только присоединяем SampleGrabber, так сразу начинаются вопли (ош. 0х80040217). Ставим RGB формат — соединяется на ура.

Вообще, в MSDN сказано, it rejects any video type where the surface stride does not match the video width. Я вот ща пытаюсь понять, этот ли случай я имею???
Re[3]: Sample Grabber + YUV формат????
От: B_A_D Израиль  
Дата: 26.08.03 10:55
Оценка:
Здравствуйте, Аноним, Вы писали:

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


B_A>>Да все он поддерживает. Опиши по-подробнее, откуда грабишь картинку, если с камеры, то убедись, что Capture Pin имеет в

B_A>>списке поддерживаемых Media Types YV12 формат.

А>Грабим картинку с TV-тюнера. Дрова — WHQL, так что дело в SampleGrabber.


А>Я в GraphEdit пытался все делать. Pin имеет YV12 формат, и VideoRenderer его прекрасно рисует. Как только присоединяем SampleGrabber, так сразу начинаются вопли (ош. 0х80040217). Ставим RGB формат — соединяется на ура.


А>Вообще, в MSDN сказано, it rejects any video type where the surface stride does not match the video width. Я вот ща пытаюсь понять, этот ли случай я имею???


А что на выходе SampleGrabberа у тебя подключено ? Не NullRenderer ?
И вообще , нарисуй схему твоего графа.
Re[4]: Sample Grabber + YUV формат????
От: Аноним  
Дата: 26.08.03 11:15
Оценка:
Здравствуйте, B_A_D, Вы писали:

B_A>А что на выходе SampleGrabberа у тебя подключено ? Не NullRenderer ?

B_A>И вообще , нарисуй схему твоего графа

Граф: CrossBar->WDM Video Capture->SampleGrabber->NullRenderer
Соединяем слева направо по очереди; если пытаемся менять формат на YUV на пине WDM Capture после коннекта — пишет, что "This format is not currently available", если до — то не соединяется.
Re[5]: Sample Grabber + YUV формат????
От: CyberDemon Россия  
Дата: 27.08.03 06:47
Оценка:
Здравствуйте, Аноним, Вы писали:

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


B_A>>А что на выходе SampleGrabberа у тебя подключено ? Не NullRenderer ?

B_A>>И вообще , нарисуй схему твоего графа

А>Граф: CrossBar->WDM Video Capture->SampleGrabber->NullRenderer

А>Соединяем слева направо по очереди; если пытаемся менять формат на YUV на пине WDM Capture после коннекта — пишет, что "This format is not currently available", если до — то не соединяется.

Ну, во первых, для изменения формата надо остановить граф и отDisconnect-ить capture out pin.
Во-вторых, Sample grabber может прекрасно существовать и без коннекта к графу основному. То есть, цепочка VideoCapture->NullRenderer, а Sample Grabber тоже в графе, но ни к чему не прицеплен — может, потожет ?
Да, и еще, если в RGB все "соединяется на ура", то почему его не поюзать ? Какие-то рассовые предрассудки или я что не понял ?
Re[6]: Sample Grabber + YUV формат????
От: B_A_D Израиль  
Дата: 27.08.03 10:41
Оценка:
Здравствуйте, CyberDemon, Вы писали:

CD>Ну, во первых, для изменения формата надо остановить граф и отDisconnect-ить capture out pin.


Само собой, медиа формат пина задается до его(пина) подключения.

CD>Во-вторых, Sample grabber может прекрасно существовать и без коннекта к графу основному. То есть, цепочка VideoCapture->NullRenderer, а CD>Sample Grabber тоже в графе, но ни к чему не прицеплен — может, потожет ?


Что, прямо так неподключенный в графе и болтается ? И при этом умудряется получать приходящие сэмплы ?

CD>Да, и еще, если в RGB все "соединяется на ура", то почему его не поюзать ? Какие-то рассовые предрассудки или я что не понял ?


Логично, только может он с двойной переконвертацией не хочет связываться.
Re[7]: Sample Grabber + YUV формат????
От: Edge  
Дата: 27.08.03 11:24
Оценка:
Здравствуйте, B_A_D, Вы писали:

B_A>Само собой, медиа формат пина задается до его(пина) подключения.


Гмм... Действительно...

CD>>Во-вторых, Sample grabber может прекрасно существовать и без коннекта к графу основному. То есть, цепочка VideoCapture->NullRenderer, а CD>Sample Grabber тоже в графе, но ни к чему не прицеплен — может, потожет ?

B_A>Что, прямо так неподключенный в графе и болтается ? И при этом умудряется получать приходящие сэмплы ?



CD>>Да, и еще, если в RGB все "соединяется на ура", то почему его не поюзать ? Какие-то рассовые предрассудки или я что не понял ?

B_A>Логично, только может он с двойной переконвертацией не хочет связываться.

Именно так... Но, видимо, придется... Хотя нет: наверно я переведу камеру в ч.б. режим и буду в каждом канале иметь Y компоненту

Короче, трабл был прост и незатейлив: в формате изображения, оказывается, biHeight был отрицательным... А в MSDN сказано, что The filter does not support video types with top-down orientation (negative biHeight)...

Вот такой вот облом... Короче, всем спасибо .
Re[8]: Sample Grabber + YUV формат????
От: Lostar Россия  
Дата: 27.08.03 19:26
Оценка:
Здравствуйте, Edge, Вы писали:

E>Вот такой вот облом... Короче, всем спасибо .


а вдобавок к спасибо можно человеку и оценочку соответств. поставить
... << RSDN@Home 1.1 beta 1 >>
С уважением, Николай.
Re[7]: Sample Grabber + YUV формат????
От: CyberDemon Россия  
Дата: 27.08.03 19:42
Оценка:
Здравствуйте, B_A_D, Вы писали:

CD>>Во-вторых, Sample grabber может прекрасно существовать и без коннекта к графу основному. То есть, цепочка VideoCapture->NullRenderer, а CD>Sample Grabber тоже в графе, но ни к чему не прицеплен — может, потожет ?


B_A>Что, прямо так неподключенный в графе и болтается ? И при этом умудряется получать приходящие сэмплы ?



CComPtr<ISampleGrabber> m_Grabber;

hr = m_Grabber.CoCreateInstance(CLSID_SampleGrabber);
CComQIPtr < IBaseFilter, &IID_IBaseFilter > pGrabBase (m_Grabber);

// connect to video
CMediaType VideoType;
VideoType.SetType(&MEDIATYPE_Video);
VideoType.SetSubtype(&MEDIASUBTYPE_RGB24);

hr = m_Grabber->SetMediaType(&VideoType);

hr = pGraph->AddFilter(pGrabBase, L"VideoCapture");

[...skipped...]

m_Grabber->SetBufferSamples(false);
m_Grabber->SetOneShot(false);
m_Grabber->SetCallback( this, 1 );


Где this —

class VideoCapture:
    public ISampleGrabberCB


Вот таким образом SampleGrabber замечательно работает, будучи не включенным в цепочку фильтров, однако в графе он есть
Re[8]: Sample Grabber + YUV формат????
От: B_A_D Израиль  
Дата: 28.08.03 06:52
Оценка:
Здравствуйте, CyberDemon, Вы писали:

CD>Вот таким образом SampleGrabber замечательно работает, будучи не включенным в цепочку фильтров, однако в графе он есть


Угу , а после всего этого в конце вызываешь что-то типа


  m_pCaptureGB->RenderStream(...); ///ICaptureGraphBuilder2 *m_pCaptureGB ;


И при рендеринге графа этот SampleGrabber подключается между Capture Device и Video Renderer.
Проверь после запуска графа, к чему подключены входной и выходной пины этого SampleGrabber.
Или все-таки они из воздуха информацию черпают...
Re[9]: Sample Grabber + YUV формат????
От: CyberDemon Россия  
Дата: 28.08.03 07:23
Оценка:
Здравствуйте, B_A_D, Вы писали:

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


B_A>Угу , а после всего этого в конце вызываешь что-то типа



B_A>И при рендеринге графа этот SampleGrabber подключается между Capture Device и Video Renderer.

B_A>Проверь после запуска графа, к чему подключены входной и выходной пины этого SampleGrabber.
B_A>Или все-таки они из воздуха информацию черпают...

Ну, во-первых, ICaptureGraphBuilder2 я не создаю, все делается через IGraphBuilder.
Во-вторых, понятное дело, RenderStream не вызывается, а просто делается запуск графа — Run().
Ну и в третьих, есть такая утилитка GraphEdit, в ней можно прицепиться к удаленному графу. (Справедливости ради надо сказать, что к своему я прицепиться не смог ). Так вот, есть у меня программа одна, которая капчурит видео. Структура проста и там тоже используется SampleGrabber. Каково же было мое удивление, когда я увидел, что он в графе есть, но ни с чем явно не соединен !!! После этого я у себя попробовал туже ерунду — выход девайса зацепил на вход рендера и система продолжала работать — граббер получал свой "паек" так же, как и раньше...

Вот такие вот дела. Знаете ли, практика иногда преподносит сюрпризы
Re: Sample Grabber + YUV формат????
От: Edge  
Дата: 28.08.03 07:41
Оценка:
Ура!!! Глюк побежден культурно и окончательно! Я скачал новые драйвера, и там уже нет такого плохого понятия, как отрицательная высота!!
Re[10]: Sample Grabber + YUV формат????
От: Edge  
Дата: 28.08.03 07:49
Оценка:
Здравствуйте, CyberDemon, Вы писали:

CD>Ну и в третьих, есть такая утилитка GraphEdit, в ней можно прицепиться к удаленному графу. (Справедливости ради надо сказать, что к своему я прицепиться не смог ).


Ходи сюда, если еще не был: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/directx9_c/directx/htm/loadingagraphfromanexternalprocess.asp
У меня все работает, единственный минус — когда в отладчике стоишь, graphedit подвисает и ни на что не реагирует, правда, после выхода из break'а все начинает работать.

CD>Вот такие вот дела. Знаете ли, практика иногда преподносит сюрпризы


Хмм... Ща проверим... Не верю я этому.
Re[10]: Sample Grabber + YUV формат????
От: Edge  
Дата: 28.08.03 07:54
Оценка:
Здравствуйте, CyberDemon, Вы писали:


CD>Ну, во-первых, ICaptureGraphBuilder2 я не создаю, все делается через IGraphBuilder.

CD>Во-вторых, понятное дело, RenderStream не вызывается, а просто делается запуск графа — Run().

Блин, совсем забыл! Предлагаю вам вынести ваш код в студию А мы его заценим
Re[11]: Sample Grabber + YUV формат????
От: CyberDemon Россия  
Дата: 28.08.03 07:58
Оценка:
Здравствуйте, Edge, Вы писали:

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



CD>>Ну, во-первых, ICaptureGraphBuilder2 я не создаю, все делается через IGraphBuilder.

CD>>Во-вторых, понятное дело, RenderStream не вызывается, а просто делается запуск графа — Run().

E>Блин, совсем забыл! Предлагаю вам вынести ваш код в студию А мы его заценим


Часть его я уже вынес. Вторую сегодня вечерком — он у меня дома, а добуквенно я его по памяти не помню
Re[11]: Sample Grabber + YUV формат????
От: CyberDemon Россия  
Дата: 28.08.03 08:02
Оценка:
Здравствуйте, Edge, Вы писали:

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


E>Ходи сюда, если еще не был: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/directx9_c/directx/htm/loadingagraphfromanexternalprocess.asp


Спасибо за ссылочку

E>Хмм... Ща проверим... Не верю я этому.

Выходы и входы SampleGrabber-а не проверял — только по исходным текстам и показаниям GraphEdit-а... может, он врет все ?
Re[11]: Sample Grabber + YUV формат????
От: Edge  
Дата: 28.08.03 16:33
Оценка:
E>Хмм... Ща проверим... Не верю я этому.

Че-то странное... По идее, на вызов GetCurrentBuffer нам должно вываливаться VFW_E_NOT_CONNECTED, если мы не присоединили граф. Но мне вываливается VFW_E_WRONG_STATE Граф находится в состоянии Run.
Пишем так:
Добавляем все нужные фильтры в граф.
Затем соединяем все это хозяйство:
    hr = ptr.pCaptureBuilder->RenderStream(&PIN_CATEGORY_PREVIEW, 
        &MEDIATYPE_Video, 
        ptr.pVideoSource, /*ptr.pGrabberFilter*/ NULL, ptr.pNullRenderer);


В результате далее в прграмме имеем ошибки при вызове GetCurrentBuffer (VFW_E_WRONG_STATE) Раскомментируем /*ptr.pGrabberFilter*/ — все замечательно.
Re[12]: Sample Grabber + YUV формат????
От: CyberDemon Россия  
Дата: 28.08.03 18:00
Оценка:
Здравствуйте, Edge, Вы писали:


Значится, так:


class VideoCapture:
    public ISampleGrabberCB
{
    long lWidth;
    long lHeight;
    long lBufSize;
    BYTE *pBuffer;

    IGraphBuilder *pGraph;
public:
    VideoCapture(void);
    ~VideoCapture(void);

    CComPtr<ISampleGrabber>            m_Grabber;
    IBaseFilter                        *pCap;    // video capture filter

[...skipped...]

    // we don't implement this interface for this example
    //
    STDMETHODIMP SampleCB( double SampleTime, IMediaSample * pSample )
    {
        return 0;
    }

    // fake out any COM ref counting
    //
    STDMETHODIMP_(ULONG) AddRef() { return 2; }
    STDMETHODIMP_(ULONG) Release() { return 1; }

    // fake out any COM QI'ing
    //
    STDMETHODIMP QueryInterface(REFIID riid, void ** ppv)
    {
        if( riid == IID_ISampleGrabberCB || riid == IID_IUnknown ) 
        {
            *ppv = (void *) static_cast<ISampleGrabberCB*> ( this );
            return NOERROR;
        }    
        return E_NOINTERFACE;
    }

    STDMETHODIMP BufferCB( double dblSampleTime, BYTE * lpBuffer, long lBufferSize );


    HRESULT                Create(IGraphBuilder *pGraph);
    static void            EnumDevices();
    static void            Free();


};



HRESULT VideoCapture::Create(IGraphBuilder *pGraph)
{
    HRESULT hr = E_FAIL;

    this->pGraph = pGraph;

    hr = m_Grabber.CoCreateInstance(CLSID_SampleGrabber);
    if (FAILED(hr))
        return hr;

    CComQIPtr < IBaseFilter, &IID_IBaseFilter > pGrabBase (m_Grabber);

    // connect to video
    CMediaType VideoType;
    VideoType.SetType(&MEDIATYPE_Video);
    VideoType.SetSubtype(&MEDIASUBTYPE_RGB24);

    hr = m_Grabber->SetMediaType(&VideoType);
    if (FAILED(hr))
        return hr;

    hr = pGraph->AddFilter(pGrabBase, L"VideoCapture");
    if (FAILED(hr))
        return hr;


/*
 *
 *    Как оказывается, работает все без далее закомментареного блока...
 *
 */

    // find pins & connect them
    ASSERT(pCap);
    IPin * pCapOut = GetOutPin(pCap, 0);
/*    IPin * pGrabIn  = GetInPin (pGrabBase, 0);
    hr = pGraph->Connect(pCapOut, pGrabIn);
    if (FAILED(hr))
        return hr;

    // get preview window
    IPin *pGrabOut = GetOutPin(pGrabBase, 0);
    hr = pGraph->Render(pGrabOut);
    if (FAILED(hr))
        return hr;
*/

        hr = pGraph->Render(pCapOut); // это замена предыдущего блока...

[...skipped...]

    m_Grabber->SetBufferSamples(false);
    m_Grabber->SetOneShot(false);
    m_Grabber->SetCallback( this, 1 );

    return hr;
}


Так вот, метод BufferCB исправно получает данные

Да, кстати, pCap — это IBaseFilter, получается путем enum-ерации video capture device-ов.
Re[13]: Sample Grabber + YUV формат????
От: B_A_D Израиль  
Дата: 28.08.03 18:11
Оценка:
Здравствуйте, CyberDemon, Вы писали:


CD>/*

CD> *
CD> * Как оказывается, работает все без далее закомментареного блока...
CD> *
CD> */

CD> // find pins & connect them

CD> ASSERT(pCap);
CD> IPin * pCapOut = GetOutPin(pCap, 0);
CD>/* IPin * pGrabIn = GetInPin (pGrabBase, 0);
CD> hr = pGraph->Connect(pCapOut, pGrabIn);
CD> if (FAILED(hr))
CD> return hr;

CD> // get preview window

CD> IPin *pGrabOut = GetOutPin(pGrabBase, 0);
CD> hr = pGraph->Render(pGrabOut);
CD> if (FAILED(hr))
CD> return hr;
CD>*/

CD> hr = pGraph->Render(pCapOut); // это замена предыдущего блока...


CD>[...skipped...]


CD> m_Grabber->SetBufferSamples(false);

CD> m_Grabber->SetOneShot(false);
CD> m_Grabber->SetCallback( this, 1 );

CD> return hr;

CD>}
CD>[/ccode]

CD>Так вот, метод BufferCB исправно получает данные


CD>Да, кстати, pCap — это IBaseFilter, получается путем enum-ерации video capture device-ов.



Логично , вот именно то , что и требовалось, вместо ручного соединения пинов
они соединяются автоматом:

hr = pGraph->Render(pCapOut); // это замена предыдущего блока...


Если теперь провести небольшой тест

  IPin *pGrabOut = GetOutPin(pGrabBase, 0);
  IPin *pGrabIn  = GetInPin(pGrabBase, 0);

  IPin *pPinIn,*pPinOut;
  pGrabOut->ConnectedTo(&pPinOut); //<--- вот здесь проверь, 
  pGrabIn->ConnectedTo(&pPinIn);   //<--- к чему он подключен и все станет ясно 



то выяснится, к чему этот граббер подключается при рендеринге.
А чтоб в воздухе висел ......
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.