VMR9 и наложение surface с разрешением desktop-а
От: newillusion  
Дата: 31.07.11 13:38
Оценка:
Здравствуйте!

У меня поверхность D3d9-surface (с управлялками и надписями, нарисованными в GDI++) накладывается на видео через VMR9, и, в результате, она становиться NativeVideoSize-размера. NativeVideoSize определяется как размер самого большого видео (в моем случае единственного) и от размера surface-а никак не зависит. При увеличении видеоокна изображение масштабируется (причём очень грубо) и качество surface-а теряется. Получается очень неприятная, неприемлимая пикселизация. Настройки метода интерполяции почему-то не влияют на результат, хотя они точно нормально выставляются, проверено. Нужно, что-бы surface попадала в разрешение desktop-a, или была хотя-бы близко к нему. Нашёл старый ответ на эту тему, однако, по нему есть вопросы:






От: Денис Евсеев
Дата: 18.05.06 11:25

Здравствуйте, dedivan, Вы писали:
D>Всем привет! В VMR битмап накладывается на видео, и при этом он становится того же размера что и видео — в результате при увеличении окна с видео происходит пикселизация и битмапа тоже. Как сделать так, чтобы размер бмп не зависел от размера видео? (титры к видео чтобы были качественными).

1 Простой способ: windowless mode, Ваш обработчки WndProc для видео окна, и IVMRMixerBitmap9::UpdateAlphaBitmapParameters на WM_SIZE и т.д.

2 Предпочтительный способ: не использовать для субтитр IVMRMixerBitmap9, а написать source filter, который производит A4R4G4B4 или AYUV d3d-поверхности, с выставленным А-каналом.

3 Еще один предпочтительный способ с меньшими затратами: написать свой custom allocator-presenter, в котором накладывать на видео опять же d3d-поверхность с субтитрами.






У меня сейчас реализован, по сути, способ 1, только в window-mode. Действительно ли перевод в windowless-mode поможет УСТРАНИТЬ уменьшение surface-а до NativeVideoSize? Не ошибся ли Денис, так как я находил ответы, которые утверждают, что ВСЕГДА происходит масштабирование до размеров видео-потоков? Не хотелось бы переписывать кучу кода, если нет уверенности, что метод сработает.

Что будет, если попробовать метод 1.5 — подсунуть дополнительный видео-источник на вход VMR9 с полностью прозрачным (пустым) видео с разрешением desktop-a (например, 1600х1200) и очень редким frame-rate? Насколько это сложно реализовать с точки зрения писанины и будет ли меньше загрузка процессора (так как не придётся переводить A8R8G8B8 в A4R4G4B4 или AYUV)?

P.S. Видео, кстати, тоже масштабируется (увеличивает) с большой пиксельной блочностью. Я пробовал ему выставлять BiLinear и другое сглаживание, однако, результаты не меняются. Но, например, Media Player Classic как-то заставляет VMR9 выполнять плавную интерполяцию. Причём, скорость не сильно падает. Как, интересно, он это делает?
vmr9 directshow
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.