Я ишо не видел чтоб эту феничку использовали в программах, но когда переберал зарегистрированные фильтра то заинтересовал Overlay Mixer. Присоединяю его к "графу", включаю рендрить тюннер и рендрить файл - всё работает (фильтр по пинам подлючается и микширует на один Renderer). А вот как задать параметры (размер, место нахождения, степень и цвет прозрачности) микширования, дупля не отстреливаю!
Также охота рендрить поверх оверлея текст, а незнаю как. Смотрел как ето делат DScaller, так не могу получить хендл оверлейного окна.
Кто чо знает про Overlay Mixer (или про другие фильтры суммирования видео потоков в DS) и вывод текста поверх видео помогите плиз.
Overlay Mixer в современных приложениях я бы не рекомендовал использовать. Вместо него и "старого" видеорендерера вставьте в граф Video Mixing Renderer 7 или Video Mixing Renderer 9, которые также поддерживают несколько видеопотоков. Подробности можно вычитать в DirectShow SDK, который сейчас является частью Platform SDK (располагается где-то на сайте Microsoft'а, поиском находится легко). У одного из них (вроде, VMR7, точно не помню) по умолчанию только один входной пин, но можно задать нужное число с помощью функции IVMRFilterConfig(9)::SetNumberOfStreams(DWORD dwMaxStreams).
При использовании VMR7/9 также элементарно рендерится текст поверх изображения. Примеры есть в SDK. Там же есть и примеры многопоточного рендеринга и перемещения окна вывода потока в пределах области вывода рендерера.
Если же есть желание использовать именно Overlay Mixer, то на его входных пинах имеется интерфейс IMixerPinConfig, функции которого позволяют задать область вывода потока в координатах окна вывода рендерера (Get/SetRelativePosition), прозрачность (Get/SetBlendingParameter и Get/SetStreamTransparent) и "цвет прозрачности", который на самом деле называется ключевым цветом (Get/SetColorKey). И не забудьте про функции Get/SetZOrder!
Спасибо за помощь. Поюзал Overlay Mixer через IMixerPinConfig действительно дохлый номер, на MEDIASUBTYPE_YUY2 второй и все последующие потоки глюкаво идут. А через Video Mixing Renderer 9 всё красиво смотрится (пины создаются и подключаются автоматом), даже без дополнительных настроек виден результат микширования. Жаль не прокатил интерфейс IMixerPinConfig на VMR9.
SDK эт канеш харашо, но там наверно размерчик не детский, если не сложно, то моно кинуть хоть пару намёков как управлять VMR9.
Полный вариант Platform SDK от февраля сего года весит 1,1Gb! Размерчик, действительно, не детский! Но работать без него крайне неудобно, по себе знаю. Имеется старая версия, DirectShow SDK, сколько весит - не помню (дома лежит), но сам файл справки не больше 10Mb. Если хотите, могу сжать и куда-нибуть выложить, например, на Рапидшару (RapidShare.de).
На VMR7/9 и его пинах нет интерфейса IMixerPinConfig. Для Ваших целей используется интерфейс IVMRMixerControl(9), предоставляемый рендерером.
Изменение положения окна видеопотока в окне вывода рендерера:
Структура описывает положение окна видеопотока. Если, к примеру, левую координату сделать больше правой, то изображение перевернётся относительно вертикальной линии.
По умолчанию окошки потоков располагаются по возрастающей в порядке создания, если нужно изменить этот порядок, используйте данную функцию.
Установка фонового цвета окна рендерера (полезно, если области вывода видеопотоков не покрывают всё окно):
HRESULT SetBackgroundClr(
COLORREF ClrBkg
);
Для всех функций Set есть, натурально, соответствующие функции Get.
добавлено спустя 19 мин.
Что касается вывода текста, то тут есть два варианта. Если используется аппаратный оверлей (Overlay Mixer или Video Mixing Renderer), то можно определить ключевой цвет оверлея и повесить над окном поле с фоном этого цвета и текстом другого цвета. Получится прозрачность. Но с VMR9 такой фокус не пройдёт, там нет оверлея, используются функции Direct3D видеокарточки. Здесь можно по-другому: создать битмап и наложить его на видеопоток. Этим заведует интерфейс IVMRMixerBitmap, предоставляемый рендерером. Но оба метода мне, почему-то, не нравятся. Я посмотрю на выходных, если время будет, можно ли выводить текст другим способом, но, думаю, лучше меня на этот вопрос ответят Vlafy и Sergey Andyk.
Ну всё, свершилось чудо! Таки наложыл два потока с нужной прозрачностью. Вначале у меня не запрашивался IVMRMixerControl, так как VMR у меня был под классом {51B4ABF3-748F-4E3B-A276-C828330E926A}, у меня в системе под таким класом VMR9 значится. Потом нашел, скачал и поставил новую библеотеку DShow в которой VMR под класом {B87BEB7B-8D29-423F-AE4D6582C10175AC} и всё заработало.
Пасиб DOC-5, что направил на путь истенный.
Накладывать текст через IVMRMixerBitmap очень даже подходит, та как охота с картинками и с разными там выпендрёсами накладывать.
Канеш попытаюсь сам разюзать IVMRMixerBitmap, но буду благодарен за готовый кусочек исходника, как использавать IVMRMixerBitmap.
Andre :
но буду благодарен за готовый кусочек исходника, как использавать IVMRMixerBitmap
А вот и нету у меня готового кусочка исходника... В своей программе ещё не сделал, только справку читал да какие-то попытки делал, а исходники грохнул. Я часто так делаю - для проверки пишу какое-нибудь тупое приложение, которое ничего делать не умеет, только проверяет какую-либо идею. Проверяю, понимаю что к чему и приложение выкидываю, даже создаю его во временном каталоге. Поэтому могу предложить только описание этого интерфейса.
[hr]
Итак, интерфейс IVMRMixerBitmap. Предоставляется фильтром Video Mixing Renderer. Для фильтра Video Mixing Renderer 9 следует использовать интерфейс IVMRMixerBitmap9. Интерфейс используется для смешивания статической картинки из битовой карты или поверхности DirectDraw с видеопотоком.
Картинки можно менять с желаемой частотой, но следует иметь в виду, что смена картинки несколько раз в секунду может оказывать воздействие на производительность и гладкость отображения видео. Новая картинка будет перемешана со всеми последующими кадрами видео, проходящими через VMR(9).
Внутренняя реализация VMR использует "Mixer-компонент" для смешивания, поэтому VMR должен быть корректно сконфигурирован до начала воспроизведения видео. Даже если присутствует только один видеопоток, приложение ДОЛЖНО вызвать метод IVMRFilterConfig::SetNumberOfStreams с параметром "1" чтобы VMR загрузил "Mixer" и "Compositor". В VMR9 "Mixer" по умолчанию присутствет, за исключением режима "renderless", когда само приложение выполняет рендеринг. Картинка может содержать внедрённую информацию об альфа-смешивании для каждого пикселя, что позволяет ей содержать прозрачные области. Прозрачные области также могут быть идентифицированы ключевым цветом. Изменения картинки будут показаны на экране только тогда, когда граф фильтров запущен.
Интерфейс IVMRMixerBitmap(9) порождён от интерфейса IUnknown и в дополнение к его методам содержит следующие три. (Первый в группе - для VMR, второй - для VMR9.)
Метод устанавливает новую картинку, а также размещение битовой карты и как и где она будет выведена в прямоугольнике назначения. Для удаления картинки в случае VMR установите флаг VMRBITMAP_DISABLE в структуре VMRALPHABITMAP, а в случае VMR9 - флаг VMR9AlphaBitmap_Disable в структуре VMR9AlphaBitmap и вызовите функцию вновь.
Метод меняет размещение битовой карты, размер и значение смешивания. Граф фильтров должен быть запущен, чтобы изменения проявились. Метод НЕ МЕНЯЕТ картинку! Если вы указали структуру-аргумент без назначения или без ключевого цвета, то картинка исчезнет. Такое поведение сделано для обратной совместимости и не может быть изменено.
[hr]
Теперь перейдём к описанию структур-аргументов указанных выше функций.
dwFlags Этот флаг указывает микшеру где искать битовую карту. Определены следующие значения: VMRBITMAP_DISABLE (0x00000001) Отключить битовую карту. VMRBITMAP_HDC (0x00000002) Получить битовую карту из HDC. VMRBITMAP_ENTIREDDS (0x00000004) Взять полностью поверхность DirectDraw surface. Если этот флаг установлен, rSrc игнорируется. VMRBITMAP_SRCCOLORKEY (0x00000008) Значение clrSrcKey действительно и должно быть использовано для смешивания. VMRBITMAP_SRCRECT (0x00000010) Показывает, что прямоугольник rSrc действителен и указывает под-прямоугольник оригинальной картинки для смешиванияa. Использование этого параметра задействует "Image Strips" (полосы). Флаг действителен только для метода UpdateAlphaBitmapParameters. Для метода SetAlphaBitmap, rSrc должен указывать на ВСЮ внутренность картинки.
hdc Указывает хэндл контекста устройства с битовой картой. Укажите NULL, если битовая карта размещена на поверхности DirectDraw.
pDDS Указатель на поверхность DirectDraw, содержащую битовую карту. Укажите NULL, если битовая карта получается из контекста устройства GDI.
rSrc Указывет прямоугольник источника для контекста устройства GDI или поверхности DirectDraw.
rDest Указывает прямоугольник назначения в пространстве композиции.
fAlpha Указывает значение прозрачности; должно быть не меньше 0.0 и не больше 1.0.
Здесь добавляется ещё один флаг. VMR9AlphaBitmap_FilterMode Показывает, что член структуры dwFilterMode действителен и должен быть использован для замещения метода фильтрации по умолчанию.
dwFilterMode Указывает флаги из перечисления VMRMixerPrefs, управляющие микшированием картинки.
[hr]
Всё, устал печатать! Остальное, наверное, сами поймёте. Если есть ещё вопросы - спрашивайте. Мне всё равно нужно в своей программе выводить OSD с картинками, поэтому отвечая на Ваши вопросы я ещё лучше разберусь в этой технологии. :)
DOC-5
Как раз недавно возникла необходимость отрендерить текст на видео. Но сделать ещё не успел, поэтому сразу сказать не могу, как это сделать попроще и поэффективнее. Наверное IVMRMixerBitmap не самый плохой метод.
Rumlin :
Ссылочка есть новую библитеку? Поэкспериментирую.
Пишу на делфях (но на с++ тож понимаю). Вот пару человеческих ссылок:
Пока нашол чють не кончился, писал на какихто самоделках, а там ошибок немеренно, то в праметрах функций Get* var или out забудут поставить, то вместо var поставят const, вобщем всплошные ошибки передачи параметров.
Начинал юзать VMR на бивлеотеке TMTdx90, а там VMR9 нету то пришлось юзать то что есть. Щя достал Clootie_DirectX92 с VMR9, а переделывать на него уже лень.
Но меньше с тем, процес идёт, и в нём наткнулся на несколько проблем:
1) IVMRMixerBitmap (запрашиваю от VMR или от IVMRWindowlessControl)
Вродибы делаю всё верно, записал структуру, вызвал метод и дело в шляпе:
2) IVMRVideoStreamControl (запрашиваю от пина VMR)
Хочу сделать вырезку (говоря языком видео монтажа) т.е. установить определённный цвет (а не всё картинку) прозрачным. Казалось бы тожа пустяковое дело, записал структуру и вызвал метод:
3) IVMRDeinterlaceControl (запрашиваю VMR)
Впринципе тема деинтерлейса сдесь подималась но почемуто развития не обрела. Так вот: я хочу себе деинтерлейс!!!!!!!! Немного програм могут похвастатся етим наворотом. Интересная вещ получается, фильтр интерлейса в системе я нашел (подключил поигрался с ним, все работает), а вот деинтерлеса нету (не нашел) - не порядок! Вот и приходется извращятся через VMR. Почемето добафленный (pFilterGraph.AddSourceFilter('DI_Bob.dll','ScalerBob',deint)) фильтр из DScaller'а не подлючается при рендере (добалять добаляется - висит в граве и не подключается). Но я попробывал пойти другим путём, через VMR:
Визуально вродибы расческа уменьшается, но всёравно ана есть.
Я так понимаю нада поставить нужный интерфейс и всё будет в шоколаде, но де его взять? Функция GetActualDeinterlaceMode ничо не возвращает. Заказал поиск деинтерлеса в реестре, нашол и оформил такие вещи:
Andre :
Так вот: я хочу себе деинтерлейс!!!!!!!! Немного програм могут похвастатся етим наворотом.
Это что, шутка такая? Тогда смешно. Я бы сказал, что не знаю программ, которые бы не умели делать деинтерлейс.
По поводу IVMRDeinterlaceControl. Он управляет аппаратным деинтерлейсом (которого может и не быть или он может быть плохо реализован). Поэтому любой софт для показа видео имеет свой программный деинтерлейс (DS-фильтр).
Фильтры от DSCaler'а могут не подключаться по разным причинам, например:
- это не фильтр в понимании DS;
- это фильтр, но он имеет защиту от запуска в стороннем софте (эта защита есть практически всегда, потому что мало кто хочет предоставлять свои разработки в пользование другим софтом);
- типы потока у входа фильтра и у выхода фильтра захвата не совместимы. Нужны промежуточные фильтры (надо делать явное соединение, а не надеяться, что Filter Graph Manager сделает это сам).
ЗЫ: у нас страна советов. Совет: скорректируйте лексику. Фразы типа "как его юзать дупля не отстреливаю" приберегите, пожалуйста, для Бобруйска. Спасибо.
Vlafy :Это что, шутка такая? Тогда смешно. Я бы сказал, что не знаю программ, которые бы не умели делать деинтерлейс.
Ниразу не видел чтоб родной софт к тюнеру делал деинтерлейс. Кроме как в DSCaler'а деинтерлейса нигде и не видел.
Насчёт IVMRVideoStreamControl, толкочто заметил что оно работает, но вырезает чётко указанный (в dwColorSpaceLowValue) цвет, а dwColorSpaceHighValue не учитывается. Такая настройка не очень красиво смотрится при шумяшем видео, и совсем не работает при рендринге bmp jpg gif. Придётся переходить на VMR9 и смотреть как там это реализованно.
А вот IVMRMixerBitmap ни как не поддаётся, функция SetAlphaBitmap возвращяет 0 но результата не видно.
Andre :
Ниразу не видел чтоб родной софт к тюнеру делал деинтерлейс. Кроме как в DScaler деинтерлейса нигде и не видел.
Практически любой тюнерный софт "делает деинтерлейс". Другое дело, что этот софт обычно использует для деинтерлейса либо DS-фильтры (часто свои собственные), либо плагины (как тот же DScaler), либо же использует аппаратный деинтерлейс видеокарты. Практически весь софт, который я видел, позволяет ВКЛЮЧИТЬ деинтерлейс.
Что касается IVMRMixerBitmap. Вы, видимо, неправильно инициализировали структуру. Во-первых, я бы рекомендовал для начала очистить все её поля, например, методом ZeroMemory(Var, sizeof(Var)). Далее, в приведённом Вами куске кода отсутствует инициализация параметра NORMALIZEDRECT rDest. Скорее всего, он у Вас нулевой (если была очистка памяти, если нет, то он может быть любым и, в частности, выходить за допустимые границы). Может быть, Вам это известно, может быть, нет (ну не знаю я уровня вашего образования в этой области, что делать... ), но NORMALIZEDRECT состоит из четырёх членов типа float, значения которых должны быть в отрезке [0.0, 1.0]. Также установите член fAlpha в требуемое значение (0 - непрозрачный, 1 - полная прозрачность).
IVMRVideoStreamControl. Немного не понял. Что Вы хотите сделать? Чтобы сквозь видео проглядывал рабочий стол? Поясните, пожалуйста.
добавлено спустя 13 мин.
Andre :
IID_IDeinterlaceFilter : TGUID = '{C8F209F8-480E-454C-94A4-5392D88EBA0F}';
Вы бы не использовали эту гадость! Это есть WMT DeInterlace Filter, ставящийся вместе с Movie Maker'ом из библиотеки C:\Program Files\Movie Maker\wmm2filt.dll. Его у меня даже в списке DS-фильтров нет!
Andre
Давайте конкретно - у тюнеров GotView родной софт основан на FlyDS. Поэтому в нём есть много разных методов деинтерлейса, в том числе с удвоением частоты и аппаратный. У тюнеров Behold родной софт основан на Fly2000TV - поэтому с деинтерлейсом всё то же самое. В софте тюнеров Авер деинтерлейс тоже есть. Это наверное около 85% всех тюнеров на рынке. Вот здесь приведены обзоры разных тюнеров: Почитайте если интересно, про деинтерлейс должно быть.
По IVMRMixerBitmap в Писании сказано:
DirectX SDK 9 :
Internally, the VMR uses its mixer component to perform the blending operation. Therefore the VMR must be configured correctly prior to commencing video playback. Even if only a single video stream is present, applications should call IVMRFilterConfig::SetNumberOfStreams with a value of "1" to cause the VMR to load the mixer and compositor.
Может быть вы этого не сделали и из-за этого не работает.
Даже если присутствует только один видеопоток, приложение ДОЛЖНО вызвать метод IVMRFilterConfig::SetNumberOfStreams с параметром "1" чтобы VMR загрузил "Mixer" и "Compositor".
У меня тоже всё получилось! Сижу сейчас и смотрю на творение рук своих - поверх фильма "Добрыня Никитич и Змей Горыныч" пришпандорена картинка с флажком и надписью "Microsoft WindowsXP Professional".
Andre тут просил готовый кусочек исходника, ну так вот он:
Огромное спасибо!!!! У меня тожа получилось вначале я брал хендл не канваса а целого битмепа, а потом не доглядел закоментированнную установку прозрачности. Еще раз большое спасибо за помощь.
DOC-5 :IVMRVideoStreamControl. Немного не понял. Что Вы хотите сделать? Чтобы сквозь видео проглядывал рабочий стол? Поясните, пожалуйста.
Хотел сделать прозрачный (черный) цвет ближнего (по оси Z) видео потока, так сказать жалкое подобие фильтра Chroma Keyer. Другими словами монотонный фот заменить на сзади лежащую картинку (видео поток). Всё получилось, но плохо смотрится из за того что нельзя указать (или может я не понял как указывать) диапазон цветов для установки их прозрачними, так как это делеется в Chroma Keyer (там помимо цвета еще указывается "Low threshold", "High threshold" и "Blur amoun").
Альтернативу настройкам прозрачности в IVMRVideoStreamControl нашол в рендринге анимацмонного гифа с спрозрачным цветом, всё красиво выглядит (просто нада было поверх видео наложить какой нибуть значок как значки телеканалов в углу).
Ктати насчёт текста в IVMRMixerBitmap то неплохоб былоб сделать ещё так: VMRBitmap.dwFlags = VMRBITMAP_HDC | VMRBITMAP_SRCCOLORKEY;
и установить прозрачный цвет, например черный VMRBitmap.clrSrcKey:=0;
Еше возникает вопрос: как управлять каждым потоком в отдельности? Например у меня в отном графе рендрятся: тюнер, гиф картинка и ави файл. Как мне перемотать или остановить ави файл без остановки (через медиаконтрол) всего графа. Я так понимаю нада запросить стреам контрол от самих источников и через него уже управлять?
Vlafy
А если для какого-либо фильтра использовать методы интерфейса IMediaFilter - Stop(), Pause(), Run(REFERENCE_TIME tStart)? Я так реализовал постановку видео на паузу при сохранении звука - ставил на паузу видеорендерер.
Vlafy :Остановить отдельно не получится. Перемотать можно, наверное, для этого надо брать свой IMediaSeeking для каждого фильтра-источника в графе.
Спасибо буду пробывать. Я так понимаю и МедиаЭвент тожа можно взять от фильтра-источника (просто смотрел в других исходниках их берут от всего графа, както и не подумал что можно их взять от источников).
По предварительным эксперементам Stop(), Pause(), Run(REFERENCE_TIME tStart) работают только на фильтрах декодеров (DivX и mp3 на ас3 почемуто не работает). Останавливается только вывод потока звука и изображения в отдельности, а а фильтр источника продолжает работать т.е. время проигрования движется. Пытался останавливать источник даже через цепочку (IFilterChain) фильтров, неа не хотит.
Нельзя ли установить в VMR размер вывота видео или хотябы соотношения сторон. Для этой реализации я ставлю на ренриг jpg кагдинку размером 768х576 и тогда все последующие потоки не меняют размера и соотношения, так как видео с большим размером я еще не видел.
Вывод у меня стоит через IVMRWindowlessControl с установкой режыма SetAspectRatioMode(VMR_ARMODE_LETTER_BOX);
Так вот, нельзя ли через какойто интерфейс установить AspectRatio значением 3/4 дабы не нагружать лишним потоком рендринга?
DOC-5 :
А если для какого-либо фильтра использовать методы интерфейса IMediaFilter - Stop(), Pause(), Run(REFERENCE_TIME tStart)
Хорошее предложение, однако Писание учит нас об IMediaFilter:
DirectX SDK 9 :Applications can use the SetSyncSource method to set the graph reference clock, and GetSyncSource to retrieve the clock. Applications should not call the other methods on this interface. Instead, use the corresponding methods on the IMediaControl interface.
Может быть, тем не менее, что-то и можно получить, используя этот метод. Но приостановка рендеринга и приостановка работы source-filter - это не одно и то же. Хотя надо проверять, может быть и на source сработает.
Andre
Соблюдение соотношения сторон я делал сам, через метод IVideoWindow::SetWindowPosition(left, top, right, bottom). Вывод видео был сделан не в своё окно рендерера, а в нужное мне окно (в Дельфи можно выводить на TPanel). И на Resize панели надо поставить вызов SetWindowPosition() с нужными размерами, чтобы получить требуемое соотношение сторон.
Vlafy
Читал я, что они не рекомендуют использовать IMediaFilter, предлагая взамен него IMediaControl, но ведь работает! Да и неизвестен мне другой способ "заморозить" картинку и оставить звук. Может быть известен Вам? Я на своём методе не настаиваю.
Vlafy :приостановка рендеринга и приостановка работы source-filter - это не одно и то же
Совершенно с Вами согласен! SourceFilter, можно сказать, главный в графе, все остальные обрабатывают поступающие с него данные, а рендерер - последний компонент в цепи и от того, что он не выведет кадр на экран графу "ни жарко, ни холодно".:)
Соотношение сторон у меня держится также на уровне видеоокна - написан соответствующий компонент для C++Builder, реализующий видеоокно с некоторыми улучшениями и специальными функциями, - а уже в него и выводится видео в режиме Windowless рендерера. При изменении размера и/или положения вызывается метод IVMRWindowlessControl::SetVideoPosition на клиентскую область окна.
P.S. Имеется поддержка и Overlay Mixer - видеоокошко заливается ключевым цветом, стандартное окно рендерера убирается, а область вывода принудительно держится в размерах и позиции моего окошка вызовом функции IMixerOCX::OnDraw.
DOC-5 :
Да и неизвестен мне другой способ "заморозить" картинку и оставить звук. Может быть известен Вам? Я на своём методе не настаиваю.
Понятно, что нерекомендуемый метод вполне может работать.
Но более грамотно было бы сделать простейший фильтр, который бы просто сохранял в себе копию текущего сэмпла и пропускал все сэмплы дальше. Когда надо остановить воспроизведение, то фильтр выдаёт сохранённый сэмпл и не перезаписывает его новыми. Получим стоп-кадр, хотя граф при этом будет работать. Этот способ более трудоёмкий, но уж точно правильный.
Других вариантов пока не могу придумать.
В процесе ряда эксперементов понял, что в DS данные не проталкиваются источниками, а запрашиваются рендерерами, т.е. ответственный за перемотку является рендерер. Отдельный поток можно останавливать (остановив фильтр рендерера этого потока) и мотать (устанавливать в нужную позицию) методами интерфейса IMediaPosition запросив его от рендерера этого потока. Проверенно, работает. Если IMediaPosition запросить от всего графа то канешно мотаются все потоки.
Есть еще интнрфейс IMediaSeeking, но с ним я еще не эксперементировал.
С простым видео рендерером IMediaPosition работает, а от VMR не запрашивается, да и нет смысла так он фактически содержит несколько рендеров. Попробую запросить IMediaPosition от пинов VMR.
Или есть другой способ выйти на отдельно взятые видео рендеры в VMR?
Насчет видео окна. Pеакция VMR на изменения размера и позиции окна у меня реолизованна. Детально опишу проблемму попоже.
Andre :
в DS данные не проталкиваются источниками, а запрашиваются рендерерами
Не уверен. Почитаю, как говорит Vlafy, Писание (то бишь DirectShow SDK). Сомнения одолевают по отношению к фильтрам-источникам в видеозахвате. Ещё на ум приходят Reference Clock...
добавлено спустя 9 мин.
Andre
Вы почитайте пример MultiVMR9 из последней Platform SDK. Там что-то есть про мультипоточный рендеринг. У самого, к сожалению, сейчас нет времени разбираться.
Пример выложил на RapidShare.
Ссылка: .
Размер: 599739 байт (~0,5Mb).
Доступен: в течении 30 дней.
Фильтры-источники используют две модели - push model и pull model. Вторая модель используется для воспроизведения файлов, в ней сэмплы вытягиваются из источника.
Про push model написано явно:
DirectX SDK :
A filter derived from CSource contains one or more output pins derived from the CSourceStream class. Each output pin creates a worker thread that pushes media samples downstream.
Andre
Извиняюсь, пример выложил не тот - отвлекали юзеры. В Platform SDK он какой-то урезанный. Увидел это только в воскресенье. Дико извиняюсь. Вытащил пример из старого DirectShow SDK. На этот раз вроде тот, что надо. Выложил на webfile.ru
[url]webfile.ru/977631[/url]
webfile.ru/977631
Имя файла - VMR(9)Multi.rar , размер 994 Кбайт. Файлу присвоен номер 977631, он будет доступен до 12.06.2006 10:12.
IVMRFilterConfig9 и IVMRMixerControl9 не оприделяет как интерфейсы?
Когда использую VideoMixingRenderer, как не стараюс, флип идёт только горизонтально или вертикально, но в любом случае 180 градусов. Может есть идеи, как сотварить чудо и сделать rotate на 90 градусов? Вот как я делаю: