memcopy этого буфера занимает 20!!! миллисекунд, что катастрофически долго, насколько я понял вся проблема что он лежит где то в видеопамяти которая быстро пишется но медленно читается, нельзя ли его оттуда какой то функцией все таки быстро скопировать?
заранее спасибо
Радость от нахождения ошибки часто омрачаеться осознанием собственой глупости.
Re: Очень медленное чтение IMediaSample в transform фильтре
Здравствуйте, Aleksey Skurihin, Вы писали:
AS>В фильтре необходимо работать с данными получаемыми как
AS>transform(IMediaSample* aSample) AS>{ AS>hr = aSample->GetPointer(&origBuffer);
Попробуйте написать не TransInPlace, а Transform фильтр. Вы получите лишнее копирование и проблемы с динамическим измнением формата, зато избавитесь от чтения из видеопамяти.
Второй вариант -- не используйте VMR и выводите изображение через старый Video Renderer.
Re: Очень медленное чтение IMediaSample в transform фильтре
Здравствуйте, Денис Майдыковский, Вы писали:
ДМ>Здравствуйте, Aleksey Skurihin, Вы писали:
AS>>В фильтре необходимо работать с данными получаемыми как
AS>>transform(IMediaSample* aSample) AS>>{ AS>>hr = aSample->GetPointer(&origBuffer);
ДМ>Попробуйте написать не TransInPlace, а Transform фильтр. Вы получите лишнее копирование и проблемы с динамическим измнением формата, зато избавитесь от чтения из видеопамяти.
вообще я так думал что у меня и есть transform фильтр, а в чем разница?
ДМ>Второй вариант -- не используйте VMR и выводите изображение через старый Video Renderer.
ага сенкс, а почему так?
Радость от нахождения ошибки часто омрачаеться осознанием собственой глупости.
Re[3]: Очень медленное чтение IMediaSample в transform фильт
Здравствуйте, Aleksey Skurihin, Вы писали:
AS>вообще я так думал что у меня и есть transform фильтр, а в чем разница?
Разница в том что TransInPlace фильтр обычно не использует свои аллокаторы, а соеденяет аллокаторы вышележащего и нижележащего фильтров. VMR предоставляет аллокатор на видеопамяти, поэтому чтение из неё получается медленным.
Общий совет -- никогда не читать данные из выходного сэмпла, только писать.
ДМ>>Второй вариант -- не используйте VMR и выводите изображение через старый Video Renderer.
Video Renderer использует обычный GDI, а VMR работает напрямую с видеопамятью.
Re[2]: Очень медленное чтение IMediaSample в transform фильт
Здравствуйте, D. Mon, Вы писали:
DM>А как примерно граф выглядит? Интересно, как данные в видеопамять попали.
Запросто, если обсуждаемый фильтр TransInPlace, а рендерер -- VMR.
VMR строит свои аллокаторы непосредственно на поверхностях видеопамяти, при удачном стечении обстоятельств внутри выходного сэмпла может оказаться указатель на участок видеопамяти.
Re[4]: Очень медленное чтение IMediaSample в transform фильт
Здравствуйте, Денис Майдыковский, Вы писали:
ДМ>Здравствуйте, Aleksey Skurihin, Вы писали:
AS>>вообще я так думал что у меня и есть transform фильтр, а в чем разница?
ДМ>Разница в том что TransInPlace фильтр обычно не использует свои аллокаторы, а соеденяет аллокаторы вышележащего и нижележащего фильтров. VMR предоставляет аллокатор на видеопамяти, поэтому чтение из неё получается медленным.
ага спасибо буду думать. Т.е в моем случае DivX пишет в аллокатор данный VMR, а я читаю? а надо сделать чтоб DivX писал куда то внутрь меня, а я сам потом писал уже в аллокатор VMR?
ДМ>Общий совет -- никогда не читать данные из выходного сэмпла, только писать.
Так мне нужно обрабатывать данные... я анализирую каждый кадр видео и ищу на нем заданные обьекты, при этом данные на моем входном пине медленные (поступают они от декодера DivX)
ДМ>>>Второй вариант -- не используйте VMR и выводите изображение через старый Video Renderer.
ДМ>Video Renderer использует обычный GDI, а VMR работает напрямую с видеопамятью.
ага
а можно использовать какое то поблочное копирование через DMA чтобы быстро перенести из видеопамяти в основную? И если можно то как? Пока ничего не нашел.
Радость от нахождения ошибки часто омрачаеться осознанием собственой глупости.
Re[5]: Очень медленное чтение IMediaSample в transform фильт
Здравствуйте, Aleksey Skurihin, Вы писали:
AS>ага спасибо буду думать. Т.е в моем случае DivX пишет в аллокатор данный VMR, а я читаю? а надо сделать чтоб DivX писал куда то внутрь меня, а я сам потом писал уже в аллокатор VMR?
Да. Это нормальный режим работы. Если вы вставляете TransInPlace фильтр и анализируете содержимое буффера, то неявно производите чтение из видеопамяти. Решение -- использование Transform фильтра. Можно так же попробовать указать параметр bModifiesData = true в конструкторе CTransInPlaceFilter.
AS>а можно использовать какое то поблочное копирование через DMA чтобы быстро перенести из видеопамяти в основную? И если можно то как? Пока ничего не нашел.
Не знаю, скорее всего нет.
Re[5]: Очень медленное чтение IMediaSample в transform фильт
AS>а можно использовать какое то поблочное копирование через DMA чтобы быстро перенести из видеопамяти в основную?
Нет смысла. Лучше сделать как посоветовали с Transform — выдавать DivX'у свой аллокатор в обычной памяти. Тогда чтения из видеопамяти не понадобится вообще, только запись.
Re[2]: Очень медленное чтение IMediaSample в transform фильт
Здравствуйте, Денис Майдыковский, Вы писали:
ДМ>Здравствуйте, Aleksey Skurihin, Вы писали:
AS>>В фильтре необходимо работать с данными получаемыми как
AS>>transform(IMediaSample* aSample) AS>>{ AS>>hr = aSample->GetPointer(&origBuffer);
ДМ>Попробуйте написать не TransInPlace, а Transform фильтр. Вы получите лишнее копирование и проблемы с динамическим измнением формата, зато избавитесь от чтения из видеопамяти.
ДМ>Второй вариант -- не используйте VMR и выводите изображение через старый Video Renderer.
Это зависит от вида сорса, и то несильно, не должны данные хранится в видеопямяти )
Ну проблема я думаю не в том, что что-либо лежит в видео памяти, в логике проблемы, ты опиши что за фильтр и пре пост фильтры которые используеш, вид синхронизации, используемый сорс, ну и смысл использования твоего трансинплейс фильтра
... << RSDN@Home 1.2.0 alpha rev. 685>>
Re[6]: Очень медленное чтение IMediaSample в transform фильт
Здравствуйте, Денис Майдыковский, Вы писали:
ДМ>Здравствуйте, Aleksey Skurihin, Вы писали:
AS>>ага спасибо буду думать. Т.е в моем случае DivX пишет в аллокатор данный VMR, а я читаю? а надо сделать чтоб DivX писал куда то внутрь меня, а я сам потом писал уже в аллокатор VMR?
ДМ>Да. Это нормальный режим работы. Если вы вставляете TransInPlace фильтр и анализируете содержимое буффера, то неявно производите чтение из видеопамяти. Решение -- использование Transform фильтра.
А можете дать ссылку или исходники простенького правильного аллокатора? Что оно такое и с чем едят. А то погряз совсем, как обычно полно работы, а тут у человека проблемы, пришлось срочно его заменить (мной), выручайте кто может.
Можно так же попробовать указать параметр bModifiesData = true в конструкторе CTransInPlaceFilter.
У меня все от IBaseFIlter наследуется, тут куча чужих исходников сижу разбираюсь. Но такого флага не вижу.
Всем спасибо
Радость от нахождения ошибки часто омрачаеться осознанием собственой глупости.
Re[3]: Очень медленное чтение IMediaSample в transform фильт
W>Это зависит от вида сорса, и то несильно, не должны данные хранится в видеопямяти )
W>Ну проблема я думаю не в том, что что-либо лежит в видео памяти, в логике проблемы, ты опиши что за фильтр и пре пост фильтры которые используеш, вид синхронизации, используемый сорс, ну и смысл использования твоего трансинплейс фильтра
видео — сплиттер — divx — myFilter — vmr9
мой фильтр анализирует изображения
Радость от нахождения ошибки часто омрачаеться осознанием собственой глупости.
Re[7]: Очень медленное чтение IMediaSample в transform фильт
Здравствуйте, Aleksey Skurihin, Вы писали:
AS>А можете дать ссылку или исходники простенького правильного аллокатора? Что оно такое и с чем едят. А то погряз совсем, как обычно полно работы, а тут у человека проблемы, пришлось срочно его заменить (мной), выручайте кто может.
А чем стандартные аллокаторы не устраивают? Вам нужно подключится к VMR? VMR допускает соедениее только при условии использования своего аллокатора, в противном случае соеденение отвергается. Выбор аллокатора производится в методе CBaseOutputPin::DecideAllocator.
Здравствуйте, Денис Майдыковский, Вы писали:
ДМ>Здравствуйте, Aleksey Skurihin, Вы писали:
AS>>А можете дать ссылку или исходники простенького правильного аллокатора? Что оно такое и с чем едят. А то погряз совсем, как обычно полно работы, а тут у человека проблемы, пришлось срочно его заменить (мной), выручайте кто может.
ДМ>А чем стандартные аллокаторы не устраивают? Вам нужно подключится к VMR? VMR допускает соедениее только при условии использования своего аллокатора, в противном случае соеденение отвергается. Выбор аллокатора производится в методе CBaseOutputPin::DecideAllocator.
А откуда мне взять аллоктаор который требует DivX?
И вопрос кто вызывает функцию receive входного пина? Я смотрю в примерах функция трансформ T CMyTransform::Transform(
IMediaSample *pSource, IMediaSample *pDest) принимает два медиасемпла, а у меня только один, откуда мне взять второй?
Радость от нахождения ошибки часто омрачаеться осознанием собственой глупости.
Re[9]: Очень медленное чтение IMediaSample в transform фильт
Здравствуйте, Aleksey Skurihin, Вы писали:
AS>А откуда мне взять аллоктаор который требует DivX?
Базовые реализации пинов (СBaseInputPin, CBaseOutputPin, CTransformInputPin, CTransformOutputPin) уже имеют всю необходимую поддержку для аллокторов. Если эта реализация вас не устраивает, можете воспотзоваться классом CMemAllocator.
AS>И вопрос кто вызывает функцию receive входного пина? Я смотрю в примерах функция трансформ T CMyTransform::Transform( AS> IMediaSample *pSource, IMediaSample *pDest) принимает два медиасемпла, а у меня только один, откуда мне взять второй?
Вы должны самостотельно скорировать данные из входного медисэмпла в выходной. В этом суть transform фильра. Наряду с копированием можно произвести весь требуемый анализ.
Re[10]: Очень медленное чтение IMediaSample в transform филь
Здравствуйте, Aleksey Skurihin, Вы писали:
AS>видео идет но раз в 100 быстрее чем надо и вверх ногами
Про "вверх ногами" надо самостоятельно обрабаотывать динамическое измненение формата. В примере этого нет. Описание здесь http://msdn2.microsoft.com/en-us/library/ms867156.aspx#dynformat_queryacceptupstream Увы, простым копированием данных не обойтись, придётся делать анализ ориентации DIB-ов и в некоторых случаях выполнять построчное копирование.
По скорость. Смотрите что с временами. Обратитите внимание что IMediaSample::GetTime() может вернуть значение VFW_S_NO_STOP_TIME, это значит что время старта сэмпла всё-же нужно установить.