beatcracker: (Default)
Итак, сегодня я в очередной раз расскажу вам о чудесах современной софтостроительной индустрии. Обычно, для просмотра DVD я использую Media Player Classic, однако, у меня давно было желание попробовать InterVideo WinDVD (нынче купленный Corel) и посмотреть на его фирменную функцию Trimension DNM лицензированную у Philips (используется в ее 100 Гц телевизорах). Вкратце, при ее использовании плеер просчитывает промежуточные кадры, повышая их количество в секунду от стандартных 24 PAL и 25 NTSC до 50, 60 и 75 Гц и 48, 50, 60 и 72 Гц соответственно. Это дает гораздо более плавную картинку, однако расплачиваться приходиться дикой нагрузкой на процессор. У меня местами притормаживает, хотя сам эффект безусловно интересен и фильмы с ним смотрятся совсем по другому. Хотя, поначалу непривычно.
Наигравшись, с различными аудио и видео эффектами, я решил, что было бы неплохо сменить язык интерфейса плеера на английский, т.к. русский прямотой перевода не блистал, и тут началось самое интересное ...

Вот так это выглядело в оригинале:

WinDVD по-русски


Страшный зверь "Субтитр" и "Установка..." неизвестно чего вгоняют в уныние. Не говоря о не переведенном пункте меню ...


Погуляв по настройкам плеера, я к своему удивлению не нашел, как сменить язык. Странно. Может быть что-то в реестре? Недолгий поиск вывел меня на ветку HKEY_LOCAL_MACHINE\SOFTWARE\InterVideo\DVD8 одним из параметров в которой было следующее

LANGUAGE="RCRUS"

Меняю значение на "RCENU" и перезапускаем плеер. Никакого эффекта :( ... Бывает (с) ... Заглядываю в ветку-близнец в HKEY_CURRENT_USER\Software\InterVideo\DVD8 - ничего похожего, жаль. Однако, может быть я не угадал значение? Например, надо было вписать "RCENG", или что-то подобное. Чтобы не гадать лишний раз, ищем по всем файлам в каталоге WinDVD строку "RCRUS". Получаем кучу файлов. Наметанный глаз отметает все ocx и ax, т.к вряд-ли такие настройки будут вынесены в контролы реализованные, как COM-обьекты и DirectShow фильтры. Остаются два файла: "AppAIO.dll" и собственно "WinDVD.exe". "AppAIO.dll" занимает два мегабайта, против 700Кб в "WinDVD.exe", поэтому решено было начать с него. Открываем встроенным просмотрщиком TC и видим следующее (выделение красным - мое):

AppAIO.dll в Lister


Я был прав и писать надо было действительно "RCENU", но большой радости это не приносит, т.к не работает в любом случае. Тут у меня возникает глупая мысль, "а есть ли вобще в плеере англоязычные ресурсы?". Вполне возможно, что нет и я занимаюсь ерундой. Открываем тот-же "AppAIO.dll" в ResHacker:

AppAIO.dll в ResHacker


Отлично, ресурсы есть, значит дело в чем-то другом. По идее, если в exe присутствуют ресурсы для разных языков, Windows должен сам выбрать нужные ресурсы при запуске приложения, и зависит это от региональных настроек. Иду в панель управления, в "Языках и стандартах" меняю все на "Английский" и жму "Применить". Запускаю WinDVD - безрезультатно. Возможно, надо было перезагрузиться, однако, такой вариант меня не устраивает еще больше чем смена локали, поэтому будем искать другой способ.

Быстро поглядев несколько других файлов, в которых встречалась строка "RCRUS", заметил, что этот блок в них отличается от аналогичных, в "WinDVD.exe" и "AppAIO.dll". В этой парочке рядом со списком языков фигурирует еще загадочное "GetUserDefaultUILanguage". По виду очень напоминает api-функцию. Быстрый гугель подтверждает мои догадки. Дело за малым, засовываем "AppAIO.dll" в дизассемблер (в этот раз я не стал пользоваться IDA, а взял более легкий и простой HDasm, для моих целей его вполне достаточно). HDasm дизассемблирует практически мгновенно, и вот уже я просматриваю список импортируемых функций. Странно, но "GetUserDefaultUILanguage" там нет. Ищу ссылки на строки и нахожу нужный кусок кода. Оказывается, функция вызывается явно, через GetProcAdddress:

AppAIO.dll в HDasm


Однако интересно не это, а то, что идет выше, т.е. откуда вызывается эта функция. Вкратце логика такова: по адресу 1000BA40 вызывается кусок кода, вызывающий GetUserDefaultUILanguage, а затем это значение скармливается функции SetThreadLocale. Говорящее название, гуглим:

Sets the current locale of the calling thread.

BOOL SetThreadLocale (
LCID Locale
);

говорит нам MSDN. Попутно находим пост в блоге одного из разработчиков Майкрософт: Why I think the thread locale really stinks и What are these directories called 0409 and 1033? в The Old New Thing.

Отлично, выглядит как раз, как то, что нам нужно. Чтобы проверить свою догадку, открываю "AppAIO.dll" в HIEW и вбиваю по адресу 1000BA40 СС (int3). Запускаю WinDVD, всплывает OllyDbg, исправляю СС обратно на E8, прохожу вызов "GetUserDefaultUILanguage" и обнаруживаю в eax, как и ожидалось "419h". Это русская локаль (1049 в десятичной системе). Теперь попробуем поменять на английскую (409h=1033). Все проходит хорошо, однако интерфейс плеера все еще на русском. Вспоминаю, что видел такой-же код в "WinDVD.exe". Так и есть, по адресу 408BA0 находится код, абсолютно идентичный тому, что был в "AppAIO.dll". Делаем все по аналогии, и вуаля! После того, как я заменил в eax значение 419h на 409h и продолжил выполнение программы, я увидел почти родной английский язык :)!

Все бы хорошо, но мне нужно, чтобы английский включался без шаманства с отладчиком. А что, если не вызывать "GetUserDefaultUILanguage", а сразу занести в eax нужную нам локаль? Пробуем: открываем в HIEW "WinDVD.exe", и в режиме ассемблирования вписываю вместо call 408BB0 - mov eax, 409. Мне повезло и размер новой команды в точности такой же, как у предыдущей, так что мне не приходиться извращаться с прописыванием кода в незанятом месте и прыжками туда и обратно. Теперь код выглядит так:

00408BA0: B809040000 mov eax, 00000409
00408BA5: 0FB7C0 movzx eax, ax
00408BA8: 50 push eax
00408BA9: FF1504014200 call KERNEL32.SetThreadLocale
00408BAF: C3 ret


Запускаем ... Ура, работает!

WinDVD по-английски


На всякий случай, я оставил пропатченными "AppAIO.dll" и "WinDVD.exe", хотя на мой взгляд, вполне достаточно патча одного exe.

Однако, странный у разработчиков принудительно-добровольный подход к локализации, не находите? На самом деле, если внимательно посмотреть, то по адресу 41276A в "WinDVD.exe" есть ссылка на строковый ресурс "ChangeLanguage" и еще чуть ниже на диалог "IDD_NEC_RESOLUTION", который присутствует в exe. Однако способа добраться до них я не нашел (да и не особенно искал, мое решение меня вполне устраивает :).

P.S. Кстати, Trimension DNM, из-за которого собственно и разгорелся всеь сыр-бор как выяснилось не единственная в своем роде. Я нагуглил очень интересную разработку на compression.ru: AviSynth MSU Frame Rate Conversion Filter. Вот результаты его работы (из статьи по предыдущей ссылке):

фрагмент видео до FRC
Фрагмент последовательности "matrix" (2 кадра, 1,5 Mб)

фрагмент видео после FRC
После обработки фрагмента слева фильтром FRC,
частота кадров увеличилась в 4 раза (1,5Мб)



Выглядит впечатляюще. Обсуждение работы этого фильтра - здесь.

UPD. По просьбам трудящихся - патч

Date: 07/01/2008 17:02 (UTC)From: [identity profile] haired.livejournal.com
Заинтриговал. Ушёл качать WinDVD.
Забабахал бы патч-англификатор - мы б тебе спасибо сказали :)

Re: Done ...

Date: 08/01/2008 01:08 (UTC)From: [identity profile] haired.livejournal.com
Спасибо.
Буду тестить новую-чудо технологию - отпишусь :)

Sasami2k

Date: 07/01/2008 22:21 (UTC)From: [identity profile] iamnik.livejournal.com
Жду пост про сабж. Как там дела?

Re: Sasami2k

Date: 08/01/2008 13:49 (UTC)From: [identity profile] beatcracker.livejournal.com
Думаю на выходных, после пары рабочих дней. Я тебя еще насчет гаджета подергаю, расскажешь, как оно там :) ...

Date: 08/01/2008 04:21 (UTC)From: [identity profile] haired.livejournal.com
Подёргал. Не понравилось.
Тестил на лицензии Alien VS Predator. (больше под рукой ничего не было) Nvidia FX 5900XT, Pentium 4 2.80GHZ, Samsung SyncMaster 757DFX (ЭЛТ старенькая). Комп на работе.
Странное ощущение, что фильм идёт с ускорением, хотя всё движение нормальное. На некоторых местах (как правило, быстрое движение) заметны trails-артефакты. Это я ещё на BenQ FP202W не заводил - там, наверное, ещё хуже с артефактами будет. "Дикой" нагрузки на проц не заметил - на указанном конфиге не выше 50%. Естественно функция чисто программная – при попытке включить NVIDIA PureVideo - Trimension DNM просто становится недоступным.
Дома пользую ZoomPlayer с прикрученным к нему NVDVD3 и его Video PostProcessor, звук вывожу через SPDIF на X-Fi-евский встроенный декодер. Попробовал на работе прикрутить к плееру WinDVD – большая часть функций недоступна (Trimension DNM в том числе), при попытке обратиться к дополнительным вкладкам декодера – плеер рушится.

Date: 08/01/2008 13:48 (UTC)From: [identity profile] beatcracker.livejournal.com
Странное ощущение, что фильм идёт с ускорением, хотя всё движение нормальное. На некоторых местах (как правило, быстрое движение) заметны trails-артефакты

"Эффект мыльной оперы" :). вобще Trimension - на любителя. Я гонял на "Братстве Волка", там мне понравилось. Артефакты ... Ну куда без них, интерполяция, как ни крути.

Насчет "дикой нагрузки" - надо посмотреть ... Не тормозит говоришь ...

Попробовал на работе прикрутить к плееру WinDVD – большая часть функций недоступна (Trimension DNM в том числе), при попытке обратиться к дополнительным вкладкам декодера – плеер рушится.

Хех, я думал у меня одного оно падает. Вобще декодеры отдельно с Trimension от 6 версии поставить можно, они работают. Только я пока смысла не вижу. Вобще у меня гуляет мысль заthinstallить его. Чтобы запускать изредка, а иначе он своими декодерами и прочим хламом мне все загадил.

October 2017

M T W T F S S
      1
234 5 67 8
910 11 1213 1415
161718 19202122
23242526272829
3031     

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Monday, 23 October 2017 11:47
Powered by Dreamwidth Studios