Google






20:07 28.10.2014
О бедных зеркалках замолвите слово...
 Подробности ...
 
03:22 20.10.2014
Жёсткий диск в компьютере, SSD - в голове?
 Подробности ...
 
20:50 31.12.2013
С наступающим Новым Годом!
 Подробности ...
 
14:39 24.12.2013
Свежий драйвер AMD Catalyst для видеокарт на базе чипов AMD Radeon
 Подробности ...
 
23:30 23.12.2013
FBReader 1.9.4 для Android
 Подробности ...
 
Rambler's Top100 liveinternet.ru

Перенос нагрузки с CPU на видеокарту при декодировании видео
 
 
Обсудить на форуме Обсудить на форуме         Автор: VicoNT  
   страницы : << 1 >>  
Использование шейдерных функций для переноса нагрузки при проигрывания с процессора на видеокарту



Не открою Америки, если скажу, что гнаться за тем, чтобы у тебя на столе стояло только самое современное компьютерное "железо" - чрезвычайно дорогое занятие. Да, относительно современный "игровой" компьютер вполне можно купить за 30 тысяч рублей, но мы ведь говорим о работе с цифровым контентом, т.е .видео, фото и звуком, а для комфортной работы с ними Вам нужны и процессор помощнее, и места на жестких дисках (да, именно так, во множественном числе), и AC97 в качестве звукового решения не подойдет. Про видеокарту обычно забывают, так как если компьютер не используется для игр, или его владелец не играет в суперсовременные 3D-игры, то и видеокарты внутри стоит "средняя", зачастую встроенная в материнскую плату - обеспечивает нужное разрешение, не сильно "мылит" - да и ладно: И, увы, большинство людей даже не подозревают, что видеокарту можно тоже заставить трудиться, даже не в режиме игры или работы с CAD/CAM, а именно для работы с видео.
В целом, я планирую серию статей, посвященных именно роли видеокарт в работе с цифровым видео, с упором на то, чтобы прочитавший материал мог использовать уже стоящую в его десктопе или ноутбуке видеокарту, или, по крайней мере, при модернизации учитывать и данный фактор.

Текущая статья посвящена переносу части нагрузки с CPU на видеокарту при декодировании видео с помощью написания и исполнения простого шейдерного кода при проигрывании видео с помощью популярного плеера Media Player Classic (MPC)

MPEG-1/2



Я прекрасно помню времена, когда проиграть .MPG-файл на компьютере без использования внешней программы было невозможно. Программ было тоже мало, и каждая соревновалась с другой по части оптимизации под существующие слабые процессорные решения. Появление Video for Windows в качестве системного мультимедийного API частично упростило задачу, и появился интерес к тому, чтобы некоторые стандартизованные алгоритмы поддерживались в железе, например, видеокартами. Дальнейший переход на DirectShow-компоненты, входящие в состав DirectX, также способствовал этому. Постепенно на плечи GPU переложили 4 из 5 стадий декодирования MPEG-1/2 (о возможности выполнения всех пяти стадий - в одной из следующих статей), и сейчас только весьма древняя видеокарта не может похвастаться аппаратной поддержкой этого формата, более новые реализуют деинтерлейс и постпроцессинг также на аппаратном уровне, и последние два поколения (не без проблем у некоторых моделей) вполне успешно справляются с MPEG-2 высоких разрешений.
Так что в этом отношении особых проблем нет, достаточно иметь установленный в системе декодер, поддерживающий аппаратное ускорение декодирования MPEG-1/2 (либо от производителя Вашей видеокарты, либо от таких известных программных продуктов, как PowerDVD или WinDVD).
Однако и в этом случае иногда хочется "навернуть" поверх всего этого что-то свое, к примеру, Вас не устраивает способ деинтерлейса, который осуществляет Ваша видеокарта или изображение шумновато, и Вы хотите очистить его, и т.п. Вот как раз этот случай нам и интересен.
Также не забывайте, что некоторые программы, работающие с видеопотоком, могут неплохо использовать Вашу видеокарту для декодирования (с подбором соответствующего декодера), как это, к примеру, делает Sonic Scenarist.

"MPEG-4 like" кодеки



Отнесем к ним сонм кодеков, наиболее популярны из которых xVid, DivX, h.264 (имеющаяся бесплатная версия x.264 - весьма неплохой вариант), WMV, VP6, VP7 и прочие. До недавнего времени аппаратно декодировались только DivX на видеокартах ATI, начиная с Radeon 9500 и выше (можно для xVid выставить FourCC-код 'DIVX' и он тоже проиграется), но только с помощью отдельной программы от DivX Lab - DivX player, а также WMV, причем аппаратная поддержка декодирования последнего, точнее ее отсутствие вызывало, и вызывает до сих пор, немало отрицательных реплик в сторону NVIDIA. И все. Новые технологии от NVIDIA и ATI, PureVideo и AVIVO соответственно, пока предоставляют не так много возможностей для декодирования (о кодировании с использованием AVIVO поговорим позже, в другом материале), хотя подвижки уже есть - декодирование h.264 на последних моделях видеокарт.
Для всех вышеперечисленных форматов зачастую большую нагрузку на CPU накладывает не само декодирование, а постпроцессинг, включая деинтерлейс (если на входе - чересстрочный поток). Поэтому для них перенос части нагрузки на GPU видится весьма актуальным.

Итак, выполнение шейдерных процедур обработки видеопотока с использованием Media Player Classic



Подобный подход будет работать, начиная с шейдеров версии 1.3 (возможно, что и с версии 1.1, но владельцам GeForce 3 придется это проверить самостоятельно), т.е. на видеокартах, начиная с ATI Radeon 8500 и NVidia GeForce 4200 Вам обязательно придется поставить DirectX 9.0c, очень желательно, с версиями библиотек не ранее апреля 2005 г. Еще лучше, чтобы Ваша видеокарта поддерживала шейдеры версии 2.0 (начиная с ATI Radeon 9500 и NVidia GeForce 5200).
Итак, если видеокарта - подходящая, DirectX 9 установлен, то - вперед! Запускаем MPC (не забываем скачать последнюю версию!), идем в окно настроек (View/Options, вкладка Output):


Настройка Media Player Classic на работу с шейдерами

Настройка Media Player Classic на работу с шейдерами



Крайне рекомендую выставить VMR9(renderless) - именно в этом режиме у Вас будут работать субтитры, и только в этом случае возможен корректный вывод видео на ТВ из окна в режиме Театр (и аналогичный на GeForce) одновременно с работой шейдеров (в противном случае Вы рискуете увидеть на ТВ экран целиком, а не оверлей окна с фильмом). Какой режим вывода Вы выберете для RealVideo и QuickTime - решать Вам, замечу лишь, что шейдеры при проигрывании этих форматов будут использоваться только в том случае, если будет выставлен режим DirectX 9.
Ну, естественно, для работы с шейдерными функциями Вам понадобится включить использование 3D поверхностей для вывода (Use texture surfaces and render video in 3D). Не забудьте выбрать соответствующий метод ресайза (обратите внимание, что bicubic возможен только при поддержке видеокартой шейдеров 2.0):


Выбор метода ресайза видео

Выбор метода ресайза видео



Также я рекомендую включить режим VMR9 mixer mode - это даст доступ к большему количеству настроек и заодно, кстати, даст лучшую возможность распределения работы проигрывателя на несколько процессоров/ядер, если они имеются.

Все, MPC готов к опытам!

Теперь, открывая видеофайл на проигрывание, Вы можете заметить (если раньше не обращали внимания), что по нажатию правой кнопки мыши доступно меню с выбором готовых функций (у Вас их может быть меньше, и даже совсем может не быть):


Список шейдеров в MPC

Список шейдеров в MPC



Можете выбрать любой и посмотреть, что получится :) Кстати, Вас вполне могут устроить встроенные функции. Но мне, к примеру, встроенный деинтерлейс несколько не понравился, и я переписал функцию. К слову сказать, понадобилось мне все это во время Олимпиады-2006, когда у меня не было в системе двух процессоров, и когда тюнер отказывался качественно писать поток с поддержкой TimeShift, а на запись одного материала с полноценным просмотром другого не хватало процессорной мощности. Но материал, описывающий эти мучения пока все еще в доработке, а функции, написанные мной - ниже.

Итак, чтобы написать собственную функцию необходимо выбрать из меню элемент View/Shader Editor, вписать в левое поле название своей будущей функции (естественно, английское) и затем выбрать версию шейдеров:


Выбор версии шейдеров

Выбор версии шейдеров



Проигрыватель создаст Вам тело функции с необходимыми объявленными переменными. Далее можете добавлять собственный код или скопировать и вставить мой. Также Вы можете выбрать и отредактировать любую встроенную (или ранее написанную Вами) функцию:


Редактирование функции

Редактирование функции



Программировать несложно - пяти минут разбора других функций достаточно, чтобы самому писать сложные функции.
К сожалению, пока в MPC нет возможности обращаться к предыдущему кадру (для серьезных фильтров - я бы написал шейдерный аналог QSDeinterlace или темпорального фильтра), но вроде бы разработчики обещают вставить такую возможность... Будем напоминать им об этом вместе?

Пара готовых функций - копируйте и вставляйте



Итак, чтобы использовать нижеприведенный код, создайте, как было описано выше, свою функцию, и полностью (вместе с объявлениями переменной) замените код на приводимый ниже.

"адаптивный" деинтерлейс - его адаптивность, конечно, желает лучшего, но пока, без возможности обратиться к предыдущему кадру, придется оставаться с этим.


sampler s0 : register(s0);
float4 p0 : register(c0);
float4 p1 : register(c1);

#define width (p0[0])
#define height (p0[1])
#define counter (p0[2])
#define clock (p0[3])
#define one_over_width (p1[0])
#define one_over_height (p1[1])

#define PI acos(-1)

float4 main(float2 tex : TEXCOORD0) : COLOR
{
float dx = 4/width;
float dy = 4/height;

float4 c00 = tex2D(s0, tex);

float2 h = float2(0, 1/height);
float4 c01 = tex2D(s0, tex-h);
float4 c02 = tex2D(s0, tex+h);
float4 c03 = (c00*2+c01+c02)/4;

float4 c2 = tex2D(s0, tex + float2(0,-dy));
float4 c4 = tex2D(s0, tex + float2(-dx,0));
float4 c5 = tex2D(s0, tex + float2(0,0));
float4 c6 = tex2D(s0, tex + float2(dx,0));
float4 c8 = tex2D(s0, tex + float2(0,dy));

float4 c0 = (-c2-c4+c5*4-c6-c8);
if(length(c0) < 1.0) c0 = c03;
else c0 = c00;

return c0;
}


Некий аналог шумодава - простейший его вариант, с усреднением, Вы можете легко его усложнить. Варьируя в строке float4 c0 = (50*c11+10*(c01+c10+c21+c12)+2.5*(c00+c20+c22+c02))/100; параметры (в данном случае это 50, 10 и 2.5) и не забывая нормировать выражение, Вы будет менять силу фильтра.


sampler s0 : register(s0);
float4 p0 : register(c0);
float4 p1 : register(c1);

#define width (p0[0])
#define height (p0[1])
#define counter (p0[2])
#define clock (p0[3])
#define one_over_width (p1[0])
#define one_over_height (p1[1])

#define PI acos(-1)

float4 main(float2 tex : TEXCOORD0) : COLOR
{
float2 h =40*float2(0, 1/height);
float2 w = 40*float2(1/width, 0);
float2 hpluswplus =40* float2(1/width, 1/height);
float2 hpluswminus = 40*float2(-1/width, 1/height);

float4 c00 = tex2D(s0, tex-hpluswplus);
float4 c01 = tex2D(s0, tex-h);
float4 c02 = tex2D(s0, tex-hpluswminus);
float4 c10 = tex2D(s0, tex-w);
float4 c11 = tex2D(s0, tex);
float4 c12 = tex2D(s0, tex+w);
float4 c20 = tex2D(s0, tex+hpluswminus);
float4 c21 = tex2D(s0, tex+h);
float4 c22 = tex2D(s0, tex+hpluswplus);

float4 c0 = (50*c11+10*(c01+c10+c21+c12)+2.5*(c00+c20+c22+c02))/100;

return c0;
}


 
Обсудить на форуме Обсудить на форуме      страницы : << 1 >>  




codecs.mediatory.ru

drivers.mediatory.ru

hardware.mediatory.ru

mobile.mediatory.ru

photo.mediatory.ru

software.mediatory.ru

sound.mediatory.ru

video.mediatory.ru

Видео Гид

kanst.mediatory.ru

Новости фотомира, секреты фотографии и фотографов

Фотоновости от PhotoGenius.Ru


G+ © 1999-2014   Цитирование и перепечатка материалов - только со ссылкой на сайт и уведомлением авторов.