Я делал это раньше. У вас есть два варианта.
Используйте возможности микшера VMR-7 или VMR-9. Я гарантирую, это будет выглядеть ужасно, потому что фильтры VMR вообще не могут выполнять альфа-смешивание. У вашего водяного знака будут неровные края.
Реализация класса фильтра, производного от CTransInPlaceFilter.
Вы реализуете следующие методы:
CheckMediaType (accept all RGB formats)
SetMediaType (accept all RGB formats)
Transform (this is where you do the overlay)
В конструкторе вашего фильтра (или в другом методе, который вызывается до запуска графика), загрузите ваш водяной знак из файла или ресурсов. Сохраните битовые биты файла изображения в буфере.
Когда вызывается Transform, взломайте переданный образец IMediaSample, получите доступ к его буферу и создайте цикл с двойным вложением для копирования каждого пикселя водяного знака в буфер изображения.
Одна из проблем со всем этим заключается в том, что ваш входной источник не может быть родным RGB. Например, большинство веб-камер являются источниками YUV (или, что еще хуже, MJPG). Ограничение фильтра на прием только типов RGB приведет к загрузке фильтров конвертера цвета DShow. Таким образом, дополнительные задержки могут быть добавлены к вашему графику. Что касается альфа-смешивания (если вы этого хотите), вы здесь сами по себе - исходный буфер, над которым вы блеете, скорее всего, будет RGB24 без альфа-канала.