Торренты   
 
 


Стереоплеер: Free 3d player by Kostasoft

Выдалось немного свободного времени. Внес некоторые изменения в работе моего стереоплеера, основанного на технологии 3D Vision от Nvidia.
Просьба, протестировать его на разном железе (В режиме анаглифа или QuadBuffers должно работать и на видеокарточках от ATI/AMD).
Скачать с официальной страницы проекта
Что изменено:
1. Сделал ручное переключение исходных режимов стереоролика (цифровыми клавишами). Поддержка форматов: Over/Under, Side-by-Side (обычные и анаморфные режимы)
2. Сделал декодирование видео только в UV12 (для ускорения декодирования на слабых машинах, в связи с уменьшением потока в 2.6 раза по сравнению с RGBA) и вывод на экран этого цветового подпространства за счет использования Pixel Shader 2.0 (опять же для ускорения распаковки кадров, т.к. вся работа ведется в GPU видеокарты).
Что ухудшилось:
1. Не включается режим стерео на встроенных видеокартах (у меня ноутбук Dell XPS 13 с двумя видеокартами. На встроенной не включается, на дискретной - работает). Неизбежное зло при переходе на новый способ вывода видео через шейдеры.
Просьба, по возможности, отписаться о работе данного сабжа в сравнении с другими плеерами (скорость работы, баги). Особенно интересует мнение владельцев компьютеров со слабым процессором (и более-менее шустрой видеокартой), у которых наблюдались тормоза при воспроизведении "тяжелого" видео.
Комментарии:

Пред.  1, 2, 3 ... , 15, 16, 17  След.






Субтитры:
по прежнему не запускается аватар с UTF-8;
ПОзже буду разбираться с субтитрами, пока сделал заплатку: если отключить показ субтитров, то аватар пойдет.
Версия 12.4.18.0
Про пропорции зума помню. Сохранение пусть будет, настройте просто фильм под фуллскрин режим. Не так часто фильмы смотрите в оконном режиме, да и не так много фильмов, требующих коррекции.
 

Как-то странно получается... Начал переделывать свою программу для просмотра фото на цветовое пространство HSY. Если делать по формулам http://www.quasimondo.com/archives/000696.php , значение hue на выходе получается нелинейным (регуляторы для желто-зеленых и фиолетовых оттенков "тянут" за собой и соседние цвета - т.е. регулятор для одной строки в тестовом изображении влияет и на цвета строк выше и ниже от рассматриваемой - в плеере такого нет). Если после конвертации RGB=>YUV значение U увеличить в 1.5 раза, то hue получается линейным во всем диапазоне (каждый регулятор цветовой коррекции воздействует только на свой оттенок), но перед обратным преобразованием YUV=>RGB необходимо U обратно уменьшить в 1.5 раза, иначе цвета на выходе искажаются...
 

HLS

type TRGBColor = record
R,G,B: byte;
end;
type THLSColor = record
H,S,L: real;
end;
function RGBtoHLSf (x:TRGBColor):THLSColor;
{ Standard Foley + van Dam }
{ G.Hoffmann, Tutorial version }
{ rb,gb,bb: 0..255; H: 0..360, L: 0..1, S: 0..1; }
Var R,G,B,sum,dif,max,min: Integer; dsf,H,L,S : Single;
Const r510:Single=1/510;
Begin
S:=0; H:=0;
R:=x.R; G:=x.G; B:=x.B;
max:=R; If G>max Then max:=G; If B>max Then max:=B;
min:=R; If G<min Then min:=G; If B<min Then min:=B;
sum:=max+min;
dif:=max-min;
L:=sum*r510;
If dif>0 Then
Begin
If L<=0.5 Then S:=dif/sum Else S:=dif/(510-sum);
dsf:=60/dif;
If R=max Then H:= (G-B)*dsf Else
If G=max Then H:=120+(B-R)*dsf Else
H:=240+(R-G)*dsf;
If H<0 Then H:=H+360;
End;
RGBtoHLSf.H:=H;
RGBtoHLSf.S:=S;
RGBtoHLSf.L:=L;
End;
function HLStoRGBf (x:THLSColor):TRGBColor;
{ Standard Foley + van Dam }
{ G.Hoffmann, Tutorial version }
{ H: 0..360, L: 0..1, S: 0..1; rb,gb,bb: 0..255; }
Var
H,L,S, min,max,mmm,hue,col : Single;
rb,gb,bb: Byte;
Begin
H:=x.H;
L:=x.L;
S:=x.S;
While H>360.0 Do H:=H-360.0;
While H<0.0 Do H:=H+360.0;
If S<0 Then S:=0 Else If S>1 Then S:=1;
If L<0 Then L:=0 Else If L>1 Then L:=1;
If L<=0.5 Then max:=L*(1.0+S) Else max:=L+S-L*S;
min:=2*L-max; mmm:=(max-min)/60;
hue:=H+120.0;
If hue>360.0 Then hue:=hue-360.0;
If hue< 60.0 Then col:=min+mmm*hue
Else If hue<180.0 Then col:=max
Else If hue<240.0 Then col:=min+mmm*(240.0-hue)
Else col:=min;
rb:=Round(255.0*col);
hue:=H;
If hue< 60.0 Then col:=min+mmm*hue
Else If hue<180.0 Then col:=max
Else If hue<240.0 Then col:=min+mmm*(240.0-hue)
Else col:=min;
gb:=Round(255.0*col);
hue:=H-120.0;
If hue<0.0 Then hue:=hue+360.0;
If hue< 60.0 Then col:=min+mmm*hue
Else If hue<180.0 Then col:=max
Else If hue<240.0 Then col:=min+mmm*(240.0-hue)
Else col:=min;
bb:=Round(255.0*col);
HLStoRGBf.R:=rb;
HLStoRGBf.G:=gb;
HLStoRGBf.B:=bb;
End;
 

Посетила тут меня мысля неблагодарная, а может вместо того, чтоб целый плеер делать и отлаживать, проще было бы просто шейдеры соответствующие для Daum Pot Player переписать? Там с кодеками, субтитрами и всевозможными регулировками уже все в порядке...
 

Pinnhate
плеер уже есть! и наверное нет смысла спрашивать автора зачем он свой плеер делает - это все равно что сказать "зачем firefox делаете? ведь есть internet explorer!" анаглиф режим всего лишь опция в данном плеере! и ни кто не станет отрицать, что наличие качественного продукта, аналогичного stereoscopic player, но при этом бесплатного и имеющего какие-то свои уникальные "фишки" просто необходимо. а главное, что такого на данный момент просто нет! (за исключением плеера от kostasoft) - поэтому автор и занимается этим, и будет разбираться с кодеками, субтитрами, перемоткой и т.д. не зависимо от того, что где-то в других плеерах с этим "все нормально"
Добавлено:
Попытка реализовать мой алгоритм преобразования в анаглиф на шейдере и прикрутить шейдер к одному из существующих плеером мной предпринималась неоднократно. К сожалению, не смог избавиться от многочисленных ошибок в шейдере (возможно из-за кривости рук). Даже если бы и сделал, то вариант с плеером kostasoft считаю более предпочтительным! Дело в том, что пришлось бы делать разные шейдеры под каждый тип анаглифа, плюс под каждый источник (горизонтальная или вертикальная стереопара, анаморф или нет и т.д.). И все коэффициенты прописывать пользователю руками в текстах шейдеров, и объяснять пользователю как "прикрутить" шейдер к плееру - короче геморой полный. Другое дело, когда вся настройка анаглиф-режима доступна пользователю через интерфейс плеера и применяется к входным источникам разного типа сама по себе.
 

boss-master
Извини, но мне альтернативные формулы не нужны! В плеере использованы именно эти http://www.quasimondo.com/archives/000696.php формулы (из-за того, что исходные данные в YUV, а не в RGB). Я просто хочу привести в соответствие свой фото-вьювер и в большей степени плагин для ависинта к тем формулам, что используются в плеере. Так, чтобы настроив регуляторы в плеере, можно было сконвертировать видео через плагин в анаглиф с теми же значениями коэффициентов и получить тот же результат что и через плеер. Т.е. функция конвертирования нужна, функция просмотра уже реализована.
Мой вопрос в большей степени носит теоретический характер: почему указанные выше формулы перевода RGB в YUV дают сжатое в 1,5 раза по координате U выходное пространство???
 

Как-то странно получается... Начал переделывать свою программу для просмотра фото на цветовое пространство HSY. Если делать по формулам http://www.quasimondo.com/archives/000696.php , значение hue на выходе получается нелинейным (регуляторы для желто-зеленых и фиолетовых оттенков "тянут" за собой и соседние цвета - т.е. регулятор для одной строки в тестовом изображении влияет и на цвета строк выше и ниже от рассматриваемой - в плеере такого нет). Если после конвертации RGB=>YUV значение U увеличить в 1.5 раза, то hue получается линейным во всем диапазоне (каждый регулятор цветовой коррекции воздействует только на свой оттенок), но перед обратным преобразованием YUV=>RGB необходимо U обратно уменьшить в 1.5 раза, иначе цвета на выходе искажаются...
В общем, нашел ответ на свой вопрос сам! Посмотрите, что пишут в английской википедии по этому поводу:
Defining the following constants:

Y'UV is computed from RGB as follows:

Т.е. максимальные значения U и V меньше единицы! Причем, Umax<Vmax как раз в 1,5 раза! (точнее, в 0.615/0.436=1.41 раза - корень из двух). Для формул перевода из YUV в HSY использующих sin и cos необходимо, чтобы Umax=Vmax.
 

И все равно у меня полного соответствия не получилось((((((((
Вот, что у меня в программе при всех нулевых коэффициентах:

А это в видео-плеере при тех же нулевых коэффициентах:
 

photoreal3d
Вот как происходит в у меня шейдере:
Код:
y = 1.1643 * (y - 0.0625);
v -= 0.5;
u -= 0.5;
//Преобразование YUV -> HSV
   float hue = atan(v,u);
   float sat = sqrt(u*u + v*v);
//адаптивная цветокоррекция
   int h = int((hue+3.1415926539)*180.0/3.1415926539);
   if (h>=360) h -=360;
   int j = int(h/30);
   float kss = adapt[j]+(adapt[j+1]-adapt[j])*float(h/30-j);
   sat = ((1.0-kss)*(0.7-sat)+kss)*sat;
   y = ((1.0-brightness)*(1.0-y*y)+brightness)*y;
//Преобразование HSV -> YUV
   u = cos( hue ) * sat;
   v = sin( hue ) * sat;
//Преобразование YUV -> RGB
resultColor.r = y + 1.5958 * v;
resultColor.g = y - 0.39173 * u - 0.81290 * v;
resultColor.b = y + 2.017 * u;
resultColor.a = 1.0;
Прошу обратить внимание на первичное приведение сигналов YUV к определенному уровню в начале! И формулы перевода YUV->RGB у меня используются другие, чем у Марио Клингеманн!
 

kostasoft
Если использовать формулы перевода YUV->RGB от Марио Клингеманн выходные значения RGB получаются абсолютно равными входным, если использовать твои формулы, то на выходе в RGB на светлых и темных получаются значения >255 и <0 соответственно...
Зато, я разобрался почему тебе приходится делать коррекцию:
Код:
v -= 0.5;
u -= 0.5;
В пространстве YUV компоненты U и V изменяются в диапазоне -0.5...+0.5, в шейдере входные значения 0..1 поэтому и приходится 0.5 вычитать!
 

Если использовать формулы перевода YUV->RGB от Марио Клингеманн выходные значения RGB получаются абсолютно равными входным, если использовать твои формулы, то на выходе в RGB на светлых и темных получаются значения >255 и <0 соответственно...
Весь фокус в том, что у меня YUV это входные данные, а ты получаешь их из RGB. А вот по каким формулам ты их получаешь?
Понятно, что формулы Марио Клингеманн обратимы, но вот правильно ли они переводят, вот в чем вопрос!
Как я уже сказал, мне не нужно переводить RGB->YUV, только наоборот, так вот "моя" формула мне показалась более правдивой, чем формула YUV->RGB от Марио Клингеманн.
Кстати, формулы перевода RGB->YUV обратной "моей" я не знаю. И если бы ее тебе использовать, то и в этом случае RGB входные и выходные были бы одинаковыми.
 

Спасибо, я уже разобрался с этим. И те и другие формулы "правильные". Твои формулы рассчитаны на входные данные в диапазоне 16..235 (именно по этому тебе приходиться коррекцию Y делать), формулы Марио рассчитаны на диапазон 0..255 только и всего.
Добавлено:
Я когда про клипинг говорил не имел ввиду что твои формулы не правильные, а хотел сказать, что в случае когда входные данные в RGB они не подходят.
 

kostasoft
Давно не скачивал новых версий плеера. Обновился....((( Теперь во всех режимах показывает демку в виде вертикальной стереопары!
Вопрос снимается. Жмем "1" и все в порядке. Просто раньше этого не требовалось...
 

kostasoft
Возможно ли сделать для 3D Vision тоже что-то подобное, как компенсация гхоста для анаглифа?
И ещё может можно сделать какую-нибудь фишку, типа динамическая яркость/контрастность?
 

samfednik
Для режима 3d vision компенсация гхоста получиться еще лучше чем для анаглифа (проверено мной лично на статических изображениях) - это связанно с тем, что появляется возможность манипулировать с тремя компонентами RGB, только объем вычислений увеличивается и возможно в реал-тайме не потянет, надо пробовать если конечно kostasoft с этим возиться захочет...
 

В оконном режиме плеер всегда поверх остальных окон - сделать бы выбор, а то неудобно.
ПОзже буду разбираться с субтитрами, пока сделал заплатку: если отключить показ субтитров, то аватар пойдет.
Пока можно отключить использование внутренних декодеров и задействовать субтитры, звуковые дорожки и метки глав через ffdshow.
Кстати субтитры из этого Аватара коряво идут и через ffdshow. Может не в плеерах\декодерах дело?
 

kostasoft
Вот теперь могу совершенно точно сказать, что в твоих преобразованиях что-то не так. Провел такой эксперимент: выставил все регуляторы в нулевые значения и сделал принтскрины из плеера и из фото-вьювера, из принтскринов взял только центральный столбец, соответствующий чистым максимально насыщенным цветам и промерил их пипеткой в графическом редакторе. Вот что получилось:

В таблице столбцы RI,GI,BI,YI содержат значения для исходных цветов до коррекции (т.е. как бы эталон).Голубым выделены ячейки полученные измерениями пипеткой. Значения Y U V S рассчитанны по измеренным. В низу таблицы разница соответствующих значений между двумя принтскринами.
Выявленные расхождения:
1) Поскольку яркость в нашем алгоритме не меняется (коэффициент яркости стоял на 100%) логично предположить, что яркость цветов после коррекции должна равняться яркости исходных цветов. YI - исходная яркость, Y - яркость на выходе, dY - разница. Для моих формул она получается нулевой. По твоим формулам смотри сам (выделено желтым).
Комментарий: на выходе коррекции преобразуем YUV=>RGB и в формулах преобразования содержатся компоненты y,u,v если y=const то значит u,v не совсем правильные!
2) Обрати внимание разницу в значениях Н (выделено оранжевым).
3) Разница в остальных компонентах (U,V,S) уже вторична и фактически повторяет характер различий в Y и H.
Разница во всех компонентах изменяется строго синусоидально от величины Н. Сгенерировал синусоиду (столбец К) и скорректировал свои значения YUV, получил столбцы Y'U'V' (Y'=Y+K*0,06 остальные аналогично). Зеленым выделена разница между скорректированными моими значениями и твоими. Видно, что разница практически исчезла.
Выводы: Поскольку я пробовал изменять в своей программе формулы конвертации YUV=>RGB на твои, добавлять коррекцию Y как у тебя в самом начале вместе и по отдельности и "волновой" эффект различий оставался практичеки не изменным - делаю вывод о том, что "неправильные" исходные YUV, которые у тебя в плеере на выходе кодека получаются. Все цвета с S=const в координатах UV должны описывать окружность с радиусом S. Если провести вектор из центра координат в любую из точек этой окружности, то угол между вектором и осью V будет давать значение H, а проекции на оси U и V значения UV. Волновой характер зависимости яркости,насыщенности от H возникнет в случае, когда вместо окружности имеем элипс, или окружность смещенную относительно центра координат. Скорее всего, так и есть. Т.е. входная коррекция в шейдере:
u=u-0.5
v=v-0.5
должна быть сложнее, типа:
u=(u-a)*ku
v=(v-b)*kv
т.е. выравниваем центр окружности и масштабируем полуоси элипса до получения окружности. Другое дело, что определить значения a b ku kv подбором практически нереально! Если конечно не сделать 4 регулятора для них и подбирать их положение а потом зашить значения в код и убрать регуляторы. Поэтому, оставим все как есть.
 

kostasoft
Есть предложение изменить алгоритм шейдера адаптивной коррекции цвета. Новый алгоритм полностью работает в пространстве YUV. Вот как будет для режима Red-Cyan:
Код:
//Коррекция входных значений
    y = 1.1643 * (y - 0.0625);
    v -= 0.5;
    u -= 0.5;
//Настройка яркости и гаммы
    y = ((1.0-brightness)*(1.0-y*y)+brightness)*y;
    y = power(y,1/gamma);
//Адаптивная коррекция цвета
    float kss = abs(1.98006182*v+0.3409803044*u);
    if (kss>1) kss = 1.0;
    kss = kss*(smax-smin)+smin;
    u = (1-kss)*u;
    v = (1-kss)*v;
//Преобразование YUV -> RGB
    resultColor.r = y + 1.5958 * v;
    resultColor.g = y - 0.39173 * u - 0.81290 * v;
    resultColor.b = y + 2.017 * u;
    resultColor.a = 1.0;
где:
brightness - регулятор "Динамический диапазон" в окне настройки коррекции цвета (диапазон: 0..1, по умолчанию = 1)
gamma - регулятор "Гамма-коррекция" в окне настройки коррекции цвета (диапазон: 1..2, по умолчанию = 1)
smax - регулятор "Коррекция цвета (max)" в окне настройки коррекции цвета (диапазон: 0..1, по умолчанию = 0.7)
smin - регулятор "Коррекция цвета (min)" в окне настройки коррекции цвета (диапазон: 0..1, по умолчанию = 0.2)
Для Green-Magenta:
Код:
kss = abs(1.961876*v+1.35487941*u);
Для Amber-Blue:
Код:
kss = abs(0.0954572212*v+2.2755418*u);
Примечание:
Теоретически,значение kss не должно получиться больше 1, но поскольку мы точно не знаем диапазона входных u и v, лучше проверку kss>1 все-таки делать. И еще один момент: может сделать настройку яркости и гаммы отключаемой (checkbox) - если это будет давать эффект в повышении производительности шейдера в случаях когда brightness=1 gamma=1?
 

samfednik
УРА!!! Я "починил" 3D Vision, по-крайней мере у меня обе видяхи на ноуте на полном экране отрабатывают картинку в стерео! У кого стереокартинка не складывалась, проверяйте!
kostasoft
Ура!!! Заработало!!! Круто!!! А что было-то? Почему не работало? Странно, что только я один отписался по этому вопросу, видимо у всех работало.
Константин, нашёл баг режима 3D Vision, при изменении частоты кадров в дровах на 100Гц или 110Гц - плеер отображает две картинки анаморфOverUnder в 3Д режиме. Правильно работает только при установке 120Гц.
Вы ещё занимаетесь плеером?
 

у меня проблема с анаглиф demo идёт нормально а вот когда загружаю фильм какая то проблема с паралаксом
 

Страница 16 из 17

Пред.  1, 2, 3 ... , 15, 16, 17  След.