mirror of
https://github.com/mpv-player/mpv.git
synced 2024-09-20 12:02:23 +02:00
Merge svn changes up to r28610
This commit is contained in:
commit
0bf2bd91ec
17
AUTHORS
17
AUTHORS
@ -12,10 +12,9 @@ ___________________
|
||||
The MPlayer project
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
MPlayer was originally written by Árpád Gereöffy (for a more complete history
|
||||
see DOCS/HTML/en/history.html) and later extended by a bunch of other people,
|
||||
some of which are listed here in alphabetical order. If you think you are
|
||||
missing, feel free to send a patch.
|
||||
MPlayer was originally written by Árpád Gereöffy and later extended by
|
||||
a bunch of other people, some of whom are listed here in alphabetical
|
||||
order. If you think you are missing, feel free to send a patch.
|
||||
|
||||
Ackermann, Andreas (Acki) <asackerm@stud.informatik.uni-erlangen.de>
|
||||
* LIRC support
|
||||
@ -406,6 +405,7 @@ Jelveh, Reza (timebomb) <reza.jelveh@tu-harburg.de>
|
||||
* savage_vid VIDIX driver
|
||||
* miscellaneous small fixes and improvements
|
||||
* first musepack decoding patch
|
||||
* swscale AltiVec fixes
|
||||
|
||||
Jermann, Jonas (g0th) <jjermann@gmx.net>
|
||||
* manual page rewrite
|
||||
@ -699,6 +699,12 @@ Sanderson, Mark <mmp@kiora.ath.cx>
|
||||
Sauerbeck, Tilman <tsauerbeck@users.sourceforge.net>
|
||||
* TGA decoder (RLE/uncomp), -mf tga support
|
||||
|
||||
Savchenko, Andrew <bircoph@gmail.com>
|
||||
* build system enhancements
|
||||
* improvements in config/command line parser
|
||||
* Russian documentation translation
|
||||
* various bug fixes, testing
|
||||
|
||||
Scherthan, Frank <scherthan@uni-landau.de>
|
||||
* added OSD handling for live changing playback speed
|
||||
|
||||
@ -950,9 +956,6 @@ MPlayerPL - Polish MPlayer Translation Team (http://mplayerpl.emdej.com)
|
||||
* Marek Jarycki (Emdej) <emdej@emdej.com>
|
||||
* Leszek Kaplita (Flex) <flex@tenbit.pl>
|
||||
|
||||
Savchenko, Andrew <bircoph@list.ru>
|
||||
* Russian documentation translation
|
||||
|
||||
Zubimendi, Andoni <andoni@lpsat.net>.
|
||||
* Spanish documentation translation
|
||||
|
||||
|
@ -2856,7 +2856,7 @@ file if no DVB card is installed.
|
||||
.RSs
|
||||
.IPs card=<1\-4>
|
||||
DVB card to use if more than one card is present.
|
||||
If not specified mplayer will search the first usable card.
|
||||
If not specified MPlayer will search the first usable card.
|
||||
.IPs file=<filename>
|
||||
output filename
|
||||
.RE
|
||||
@ -3560,13 +3560,13 @@ Mac OS X CoreVideo video output driver
|
||||
.PD 0
|
||||
.RSs
|
||||
.IPs device_id=<number>
|
||||
Choose the display device to use for fullscreen or set it to \-1 to
|
||||
Choose the display device to use for fullscreen or set it to \-1 to
|
||||
always use the same screen the video window is on (default: \-1 \- auto).
|
||||
.IPs shared_buffer
|
||||
Write output to a shared memory buffer instead of displaying it and
|
||||
Write output to a shared memory buffer instead of displaying it and
|
||||
try to open an existing NSConnection for communication with a GUI.
|
||||
.IPs buffer_name=<name>
|
||||
Name of the shared buffer created with shm_open as well as the name of
|
||||
Name of the shared buffer created with shm_open as well as the name of
|
||||
the NSConnection MPlayer will try to open (default: "mplayerosx").
|
||||
Setting buffer_name implicitly enables shared_buffer.
|
||||
.RE
|
||||
@ -4086,7 +4086,7 @@ if no DVB card is installed.
|
||||
.IPs card=<1\-4>
|
||||
Specifies the device number to use if you have more than one DVB output card
|
||||
(V3 API only, such as 1.x.y series drivers).
|
||||
If not specified mplayer will search the first usable card.
|
||||
If not specified MPlayer will search the first usable card.
|
||||
.IPs <filename>
|
||||
output filename (default: ./grab.mpg)
|
||||
.RE
|
||||
@ -6615,7 +6615,7 @@ Depending on the source MPEG, you may be fine ignoring this advice, as
|
||||
long as you do not see lots of "Bottom-first field" warnings.
|
||||
With no options it does normal inverse telecine, and should be used
|
||||
together with mencoder \-fps 30000/1001 \-ofps 24000/1001.
|
||||
When this filter is used with mplayer, it will result in an uneven
|
||||
When this filter is used with MPlayer, it will result in an uneven
|
||||
framerate during playback, but it is still generally better than using
|
||||
pp=lb or no deinterlacing at all.
|
||||
Multiple options can be specified separated by /.
|
||||
|
@ -1,4 +1,4 @@
|
||||
.\" Synced with r28520
|
||||
.\" Synced with r28576
|
||||
.\" MPlayer (C) 2000-2009 MPlayer Team
|
||||
.\" Ezt a man oldalt Gabucino, Diego Biurrun és Jonas Jermann készíti/készítette
|
||||
.\" Karbantartó: Gabrov
|
||||
@ -33,7 +33,7 @@
|
||||
.\" Név
|
||||
.\" --------------------------------------------------------------------------
|
||||
.
|
||||
.TH MPlayer 1 "2009. 02. 12." "MPlayer Project" "A film lejátszó"
|
||||
.TH MPlayer 1 "2009. 02. 16." "MPlayer Project" "A film lejátszó"
|
||||
.
|
||||
.SH NÉV
|
||||
mplayer \- film lejátszó
|
||||
@ -2869,7 +2869,7 @@ f
|
||||
.RSs
|
||||
.IPs card=<1\-4>
|
||||
Használandó DVB kártya, ha több, mint egy kártya van.
|
||||
Ha nincs megadva, az mplayer megkeresi az első használható kártyát.
|
||||
Ha nincs megadva, az MPlayer megkeresi az első használható kártyát.
|
||||
.IPs file=<fájlnév>
|
||||
kimeneti fájl neve
|
||||
.RE
|
||||
@ -4117,7 +4117,7 @@ Kimeneti vide
|
||||
.IPs card=<1\-4>
|
||||
Megadja a használandó eszköz számát, ha több, mint egy kimeneti DVB kártya van
|
||||
(csak V3 API, mint pl. az 1.x.y sorozatú vezérlők).
|
||||
Ha nincs megadva, az mplayer megkeresi az első használható kártyát.
|
||||
Ha nincs megadva, az MPlayer megkeresi az első használható kártyát.
|
||||
.IPs <fájlnév>
|
||||
kimeneti fájl neve (alapértelmezett: ./grab.mpg).
|
||||
.RE
|
||||
@ -6645,7 +6645,7 @@ A forr
|
||||
tanácsot, amíg nem látsz sok "Bottom-first field" figyelmeztetést.
|
||||
Opció nélkül normális inverz telecine-t hajt végre és a mencoder
|
||||
\-fps 30000/1001 \-ofps 24000/1001 kapcsolóival együtt kell használni.
|
||||
Ha ezt a szűrőt mplayerrel használod, egyenletlen framerátát eredményez
|
||||
Ha ezt a szűrőt MPlayerrel használod, egyenletlen framerátát eredményez
|
||||
lejátszás közben, de általában még ez is jobb, mint a pp=lb vagy a
|
||||
deinterlacing mellőzése.
|
||||
Több opció is megadható / jellel elválasztva.
|
||||
|
11814
DOCS/man/ru/mplayer.1
11814
DOCS/man/ru/mplayer.1
File diff suppressed because it is too large
Load Diff
@ -129,7 +129,7 @@ This will allow you to easily find the exact patch that did it.
|
||||
If you find the patch that is the cause of the problem, you have almost won;
|
||||
report about it to the
|
||||
<ulink url="http://bugzilla.mplayerhq.hu/">MPlayer Bugzilla</ulink> or
|
||||
subscribe to
|
||||
subscribe to
|
||||
<ulink url="http://lists.mplayerhq.hu/mailman/listinfo/mplayer-users">MPlayer-users</ulink>
|
||||
and post it there.
|
||||
There is a chance that the author will jump in to suggest a fix.
|
||||
|
@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- synced with r28201 -->
|
||||
<!-- synced with r28593 -->
|
||||
<appendix id="bugreports">
|
||||
<title>Hogyan jelentsd a hibákat</title>
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- synced with r23225 -->
|
||||
<!-- synced with r28201 -->
|
||||
<appendix id="bugreports">
|
||||
<title>Как сообщать об ошибках</title>
|
||||
|
||||
@ -10,7 +10,7 @@
|
||||
большинство разработчиков — занятые люди, получающие огромное количество
|
||||
писем. Поэтому, хотя Ваши отзывы необходимы для улучшения <application>MPlayer</application>'а, хотя
|
||||
они очень приветствуются, пожалуйста поймите, что Вы должны предоставить
|
||||
<emphasis role="bold">Всю</emphasis> требуемую нами информацию, поэтому точно
|
||||
<emphasis role="bold">всю</emphasis> требуемую нами информацию, поэтому точно
|
||||
следуйте инструкциям в этом документе.
|
||||
</para>
|
||||
|
||||
@ -22,11 +22,11 @@
|
||||
<title>Отчеты об ошибках безопасности</title>
|
||||
|
||||
<para>
|
||||
В случае, если вы нашли уязвимость и хотите позволить нам исправить ее до того, как она будет
|
||||
обнародована, мы будем рады получить ваше уведомление по адресу
|
||||
В случае, если Вы нашли уязвимость и хотите позволить нам исправить ее до того, как она будет
|
||||
обнародована, мы будем рады получить Ваше уведомление по адресу
|
||||
<ulink url="mailto:security@mplayerhq.hu">security@mplayerhq.hu</ulink>.
|
||||
Пожалуйста добавьте [SECURITY] или [ADVISORY] к теме письма.
|
||||
Убедитесь, что ваш отчет содержит полный и подробный анализ ошибки.
|
||||
Убедитесь, что Ваш отчет содержит полный и подробный анализ ошибки.
|
||||
Желательно также прислать и исправление уязвимости.
|
||||
Пожалуйста, не откладывайте отчет для написания подтверждающего ошибку эксплойта.
|
||||
Вы можете отослать его позже другим письмом.
|
||||
@ -58,28 +58,28 @@
|
||||
<title>Как провести проверку на деградацию, используя Subversion</title>
|
||||
|
||||
<para>
|
||||
Иногда возникает проблема 'раньше это работало, а теперь - нет'. Здесь представлена
|
||||
Иногда возникает проблема 'раньше это работало, а теперь - нет'. Здесь представлена
|
||||
пошаговая процедура определения момента возникновения ошибки.
|
||||
Но она <emphasis role="bold">не для</emphasis> рядовых пользователей.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
Во-первых, вам нужно получить исходный код MPlayer из Subversion.
|
||||
Во-первых, Вам нужно получить исходный код MPlayer из Subversion.
|
||||
Инструкции могут быть найдены в
|
||||
<ulink url="http://www.mplayerhq.hu/design7/dload.html#svn">разделе Subversion
|
||||
страницы закачки</ulink>.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
После этого в каталоге mplayer/ вы будете иметь образ дерева Subversion.
|
||||
После этого в каталоге mplayer/ Вы будете иметь образ дерева Subversion.
|
||||
Теперь обновите этот образ на желаемую дату:
|
||||
<screen>
|
||||
cd mplayer/
|
||||
svn update -r {"2004-08-23"}
|
||||
</screen>
|
||||
Формат даты: YYYY-MM-DD HH:MM:SS.
|
||||
Использование этого формата, гарантирует, что вы сможете извлечь патчи по дате их
|
||||
внесения, которые указаны в
|
||||
Использование этого формата, гарантирует, что Вы сможете извлечь патчи по дате их
|
||||
внесения, которые указаны в
|
||||
<ulink url="http://lists.mplayerhq.hu/pipermail/mplayer-cvslog/">архиве MPlayer-cvslog</ulink>.
|
||||
</para>
|
||||
|
||||
@ -92,27 +92,27 @@ make
|
||||
</para>
|
||||
|
||||
<para>
|
||||
Для непрограммистов, читающих эту страницу, сообщим, то самый быстрый способ найти место
|
||||
возникновения ошибки - использование бинарного поиска, т.е. поиск даты,
|
||||
Для непрограммистов, читающих эту страницу, сообщим, то самый быстрый способ найти место
|
||||
возникновения ошибки — использование бинарного поиска, т.е. поиск даты,
|
||||
деля интервал поиска пополам раз за разом.
|
||||
Например, если проблема возникла в 2003 году, начните с середины года и
|
||||
выясните присутствует ли проблема. Если да, то переходите к проверке
|
||||
начала Апреля, иначе - к началу Октября. Повторяйте этот процесс, уменьшая интервал
|
||||
Например, если проблема возникла в 2003 году, начните с середины года и
|
||||
выясните присутствует ли проблема. Если да, то переходите к проверке
|
||||
начала Апреля, иначе — к началу Октября. Повторяйте этот процесс, уменьшая интервал
|
||||
поиска вдвое, пока не выясните искомую дату.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
Если у вас имеется достаточно свободного места на жестком диске (полная
|
||||
компиляция требует около 100Мб, или 300-350 если включена отладочная
|
||||
Если у Вас имеется достаточно свободного места на жестком диске (полная
|
||||
компиляция требует около 100Мб, или 300-350 если включена отладочная
|
||||
информация), скопируйте последнюю работающую версию перед обновлением,
|
||||
это сэкономит время при необходимости вернуться назад.
|
||||
(Как правило необходимо выполнять 'make distclean' до перекомпиляции
|
||||
более ранней версии, поэтому при отсутствии сохраненной копии
|
||||
вам придется перекомпилировать весь проект.)
|
||||
Вам придется перекомпилировать весь проект.)
|
||||
</para>
|
||||
|
||||
<para>
|
||||
Как только вы нашли дату, продолжайте поиск, используя архив mplayer-cvslog
|
||||
Как только Вы нашли дату, продолжайте поиск, используя архив mplayer-cvslog
|
||||
(отсортированный по дате) до получения более точного времени, включая
|
||||
час, минуту, секунду:
|
||||
<screen>
|
||||
@ -122,9 +122,9 @@ svn update -r {"2004-08-23 15:17:25"}
|
||||
</para>
|
||||
|
||||
<para>
|
||||
Если вы нашли нужный патч, то вы практически победили; сообщите о нем в
|
||||
Если Вы нашли нужный патч, то Вы практически победили; сообщите о нем в
|
||||
<ulink url="http://bugzilla.mplayerhq.hu/">MPlayer Bugzilla</ulink> или
|
||||
подпишитесь на
|
||||
подпишитесь на
|
||||
<ulink url="http://lists.mplayerhq.hu/mailman/listinfo/mplayer-users">MPlayer-users</ulink>
|
||||
и отправте сообщение туда.
|
||||
Есть шанс, что автор исправит ошибку.
|
||||
@ -140,15 +140,14 @@ svn update -r {"2004-08-23 15:17:25"}
|
||||
<title>Как сообщить об ошибке</title>
|
||||
<para>
|
||||
Прежде всего, пожалуйста, попробуйте использовать новейшую Subversion версию
|
||||
<application>MPlayer</application>'а, поскольку Ваша ошибка уже может быть исправлена.
|
||||
Разработка продвигается очень быстро, большинство проблем в официальных релизах
|
||||
сообщается в течение дней, и даже часов, после релиза, поэтому, пожалуйста, для
|
||||
сообщений об ошибках используйте <emphasis role="bold">только Subversion</emphasis>.
|
||||
Это включает и бинарные пакеты <application>MPlayer</application>'а. Вы найдёте
|
||||
<application>MPlayer</application>'а, поскольку Ваша ошибка уже может быть исправлена.
|
||||
Разработка продвигается очень быстро, большинство проблем в официальных релизах
|
||||
сообщается в течение дней, и даже часов, после релиза, поэтому, пожалуйста, для
|
||||
сообщений об ошибках используйте <emphasis role="bold">только Subversion</emphasis>.
|
||||
Это включает и бинарные пакеты <application>MPlayer</application>'а. Вы найдёте
|
||||
инструкции по Subversion внизу
|
||||
<ulink url="http://www.mplayerhq.hu/dload.html">этой страницы</ulink>
|
||||
или в README. Если это не помогло, пожалуйста, обратитесь к списку
|
||||
известных ошибок и остальной документации. Если
|
||||
или в README. Если это не помогло, пожалуйста, обратитесь к остальной документации. Если
|
||||
Ваша проблема не известна или не решается с помощью наших инструкций,
|
||||
пожалуйста, сообщите об ошибке.
|
||||
</para>
|
||||
@ -175,7 +174,7 @@ svn update -r {"2004-08-23 15:17:25"}
|
||||
|
||||
<para>
|
||||
Великолепное, отлично написанное руководство по задаванию вопросов
|
||||
на общедоступных форумах — это
|
||||
на общедоступных форумах — это
|
||||
<ulink url="http://www.catb.org/~esr/faqs/smart-questions.html">How To Ask
|
||||
Questions The Smart Way[Как Задавать Вопросы. Правильный Путь.]</ulink>,
|
||||
написанное <ulink url="http://www.catb.org/~esr/">Eric S. Raymond</ulink>.
|
||||
@ -237,7 +236,7 @@ HTML почта и почему это — зло, прочтите
|
||||
<ulink url="ftp://upload.mplayerhq.hu/MPlayer/incoming/">FTP сервер</ulink>
|
||||
в сжатом виде (предпочтительно gzip или bzip2) и включить в сообщение
|
||||
об ошибке только путь и имя файла. На наших рассылках стоит ограничение размера
|
||||
сообщения в 80Кб. Если у Вас что-то большее, то сожмите или загрузите это.
|
||||
сообщения в 80КБ. Если у Вас что-то большее, то сожмите или загрузите это.
|
||||
</para>
|
||||
|
||||
<!-- ********** -->
|
||||
@ -371,17 +370,17 @@ ld -v<!--
|
||||
<title>Проблемы при воспроизведении</title>
|
||||
<para>
|
||||
Пожалуйста, включите вывод <application>MPlayer</application>'а с уровнем
|
||||
"многословности" [verbose] 1, но запомните: <emphasis role="bold">не
|
||||
"избыточности" [verbose] 1, но запомните: <emphasis role="bold">не
|
||||
сокращайте вывод</emphasis>, когда Вы его вставляете в почту. Разработчикам
|
||||
понадобятся все сообщения, чтобы правильно диагностировать проблему. Вы можете
|
||||
направить вывод в файл, например так:
|
||||
<screen>
|
||||
mplayer -v <replaceable>options</replaceable> <replaceable>filename</replaceable> > mplayer.log 2>&1
|
||||
mplayer -v <replaceable>опции</replaceable> <replaceable>имя-файла</replaceable> > mplayer.log 2>&1
|
||||
</screen>
|
||||
</para>
|
||||
|
||||
<para>
|
||||
Если проблема специфична для одного или нескольких файлов,
|
||||
Если проблема специфична для одного или нескольких файлов,
|
||||
пожалуйста, загрузите проблемные файлы на:
|
||||
<ulink url="ftp://mplayerhq.hu/MPlayer/incoming/"/>
|
||||
</para>
|
||||
@ -389,20 +388,20 @@ mplayer -v <replaceable>options</replaceable> <replaceable>filename</replaceable
|
||||
<para>
|
||||
Также загрузите маленький текстовый файл с базовым именем как у Вашего файла и
|
||||
расширением <filename>.txt</filename>. Опишите проблему, возникающую у Вас
|
||||
с соответствующим файлом и включите ваш электронный адрес и вывод
|
||||
с соответствующим файлом и включите Ваш электронный адрес и вывод
|
||||
<application>MPlayer</application>'а
|
||||
с уровнем "многословности" 1. Куска файла размером 1-5 Мб обычно
|
||||
с уровнем "избыточности" 1. Обычно первых 1-5 МБ файла
|
||||
бывает достаточно, чтобы воспроизвести проблему, но чтобы быть уверенными,
|
||||
мы просим вас сделать:
|
||||
мы просим Вас сделать:
|
||||
<screen>
|
||||
dd if=<replaceable>yourfile</replaceable> of=<replaceable>smallfile</replaceable> bs=1024k count=5
|
||||
dd if=<replaceable>Ваш-файл</replaceable> of=<replaceable>малый-файл</replaceable> bs=1024k count=5
|
||||
</screen>
|
||||
Это запишет первые 5 Мб файла '<emphasis role="bold">your-file</emphasis>' и
|
||||
запишет в файл '<emphasis role="bold">small-file</emphasis>'. Теперь снова
|
||||
Это запишет первые 5 МБ '<emphasis role="bold">Вашего-файла</emphasis>'
|
||||
в файл '<emphasis role="bold">малый-файл</emphasis>'. Теперь снова
|
||||
попытайтесь с эти маленьким файлом, и если проблема все ещё проявляется,
|
||||
тогда этого примера будет достаточно для нас. Пожалуйста,
|
||||
<emphasis role="bold">никогда</emphasis> не отсылайте эти файлы по почте!
|
||||
Загрузите его и отошлите только путь/имя файла не FTP-сервере. Если файл
|
||||
Загрузите его и отошлите только путь/имя файла на FTP-сервере. Если файл
|
||||
доступен по сети, тогда просто пришлите <emphasis role="bold">точный</emphasis>
|
||||
URL, и этого будет достаточно.
|
||||
</para>
|
||||
@ -411,17 +410,17 @@ URL, и этого будет достаточно.
|
||||
<!-- ********** -->
|
||||
|
||||
<sect2 id="bugreports_crash">
|
||||
<title>Краши[crash]</title>
|
||||
<title>Падения</title>
|
||||
<para>
|
||||
Вы должны запустить <application>MPlayer</application> внутри <command>gdb</command>
|
||||
и прислать нам полный вывод, или , если у Вас есть <filename>core</filename>
|
||||
dump поломки, Вы можете извлечь необходимую полезную информацию из файла
|
||||
и прислать нам полный вывод, или , если у Вас есть дамп поломки
|
||||
<filename>core</filename>, Вы можете извлечь необходимую полезную информацию из файла
|
||||
core. Вот как:
|
||||
</para>
|
||||
|
||||
|
||||
<sect3 id="bugreports_debug">
|
||||
<title>Как сохранить информацию о воспроизводимом краше</title>
|
||||
<title>Как сохранить информацию о воспроизводимом падении</title>
|
||||
|
||||
<para>
|
||||
Перекомпилируйте <application>MPlayer</application> с включённым кодом отладки:
|
||||
@ -431,11 +430,11 @@ make
|
||||
</screen>
|
||||
и запустите <application>MPlayer</application> внутри gdb:
|
||||
<screen>gdb ./mplayer</screen>
|
||||
Теперь вы в gdb. Наберите:
|
||||
Теперь Вы в gdb. Наберите:
|
||||
<screen>
|
||||
run -v <replaceable>опции-для-mplayer</replaceable> <replaceable>имя-файла</replaceable>
|
||||
</screen>
|
||||
и воспроизведите краш. Как только Вы это сделаете, gdb вернёт Вас к приглашению
|
||||
и воспроизведите крах программы. Как только Вы это сделаете, gdb вернёт Вас к приглашению
|
||||
командной строки, где Вы должны набрать
|
||||
<screen>
|
||||
bt
|
||||
@ -447,7 +446,7 @@ info all-registers
|
||||
|
||||
|
||||
<sect3 id="bugreports_core">
|
||||
<title>Как извлечь полезную информацию из дампа [core dump]</title>
|
||||
<title>Как извлечь полезную информацию из дампа core</title>
|
||||
|
||||
<para>
|
||||
Создайте следующий командный файл:
|
||||
@ -474,7 +473,7 @@ gdb mplayer --core=core -batch --command=командный-файл > mplaye
|
||||
<para>
|
||||
Если Вы создали правильное сообщение об ошибке так, как рассказано выше, и Вы
|
||||
уверены, что это ошибка в <application>MPlayer</application>'е, а не ошибка компилятора или плохой файл,
|
||||
Вы уже прочли всю документацию и не можете найти решение, ваши звуковые драйвера
|
||||
Вы уже прочли всю документацию и не можете найти решение, Ваши звуковые драйвера
|
||||
в порядке, тогда Вы можете подписаться на рассылку mplayer-advusers и прислать
|
||||
сообщение об ошибке туда, чтобы получить более точный и быстрый ответ.
|
||||
</para>
|
||||
|
1
Makefile
1
Makefile
@ -39,6 +39,7 @@ SRCS_COMMON = asxparser.c \
|
||||
defaultopts.c \
|
||||
edl.c \
|
||||
find_sub.c \
|
||||
fmt-conversion.c \
|
||||
get_path.c \
|
||||
m_config.c \
|
||||
m_option.c \
|
||||
|
@ -184,6 +184,12 @@ static int add_to_format(char *s, char *alias,unsigned int *fourcc, unsigned int
|
||||
{"IDCT_MPEG2",IMGFMT_XVMC_IDCT_MPEG2},
|
||||
{"MOCO_MPEG2",IMGFMT_XVMC_MOCO_MPEG2},
|
||||
|
||||
{"VDPAU_MPEG1",IMGFMT_VDPAU_MPEG1},
|
||||
{"VDPAU_MPEG2",IMGFMT_VDPAU_MPEG2},
|
||||
{"VDPAU_H264",IMGFMT_VDPAU_H264},
|
||||
{"VDPAU_WMV3",IMGFMT_VDPAU_WMV3},
|
||||
{"VDPAU_VC1",IMGFMT_VDPAU_VC1},
|
||||
|
||||
{NULL, 0}
|
||||
};
|
||||
|
||||
|
@ -272,6 +272,42 @@ videocodec ffmpeg12mc
|
||||
out IDCT_MPEG2
|
||||
out MOCO_MPEG2
|
||||
|
||||
videocodec ffmpeg12vdpau
|
||||
info "FFmpeg MPEG-1/2 (VDPAU)"
|
||||
status working
|
||||
format 0x10000001 ; MPEG-1
|
||||
format 0x10000002 ; MPEG-2
|
||||
fourcc mpg1,mpg2,MPG2
|
||||
fourcc PIM1 ; Pinnacle hardware-MPEG-1
|
||||
fourcc PIM2 ; Pinnacle hardware-MPEG-2
|
||||
fourcc VCR2
|
||||
fourcc "DVR "
|
||||
fourcc hdv2
|
||||
fourcc MPEG
|
||||
fourcc hdv1
|
||||
fourcc hdv3 ; HDV 1080i50
|
||||
fourcc hdv5 ; HDV 720p25
|
||||
fourcc mx5p ; MPEG IMX 625/50 (50 Mb/s)
|
||||
fourcc MMES,mmes ; matrox mpeg2 in avi
|
||||
fourcc hdv6,hdv7,hdv8
|
||||
fourcc xdv1,xdv2,xdv3
|
||||
fourcc xdv4,xdv5,xdv6
|
||||
fourcc xdv7,xdv8,xdv9
|
||||
fourcc xdva,xdvb,xdvc
|
||||
fourcc xdvd,xdve,xdvf
|
||||
fourcc xd5a,xd5b,xd5c
|
||||
fourcc xd5d,xd5e,xd5f
|
||||
fourcc xd59
|
||||
fourcc mx5n,mx4n,mx4p
|
||||
fourcc mx3n,mx3p
|
||||
fourcc AVmp
|
||||
fourcc mp2v,mpgv
|
||||
fourcc LMP2 ; Lead mpeg2 in avi
|
||||
driver ffmpeg
|
||||
dll "mpegvideo_vdpau"
|
||||
out VDPAU_MPEG1
|
||||
out VDPAU_MPEG2
|
||||
|
||||
; we have only native open source codecs for these:
|
||||
|
||||
videocodec ffnuv
|
||||
@ -771,6 +807,14 @@ videocodec ffwmv3
|
||||
dll wmv3
|
||||
out YV12,I420,IYUV
|
||||
|
||||
videocodec ffwmv3vdpau
|
||||
info "FFmpeg WMV3/WMV9 (VDPAU)"
|
||||
status working
|
||||
fourcc WMV3,wmv3
|
||||
driver ffmpeg
|
||||
dll wmv3_vdpau
|
||||
out VDPAU_WMV3
|
||||
|
||||
videocodec ffvc1
|
||||
info "FFmpeg WVC1"
|
||||
status buggy
|
||||
@ -780,6 +824,15 @@ videocodec ffvc1
|
||||
dll vc1
|
||||
out YV12,I420,IYUV
|
||||
|
||||
videocodec ffvc1vdpau
|
||||
info "FFmpeg WVC1 (VDPAU)"
|
||||
status working
|
||||
fourcc WVC1,wvc1,WMVA
|
||||
fourcc vc-1,VC-1
|
||||
driver ffmpeg
|
||||
dll vc1_vdpau
|
||||
out VDPAU_VC1
|
||||
|
||||
videocodec ffh264
|
||||
info "FFmpeg H.264"
|
||||
status working
|
||||
@ -792,6 +845,18 @@ videocodec ffh264
|
||||
dll h264
|
||||
out YV12,I420,IYUV
|
||||
|
||||
videocodec ffh264vdpau
|
||||
info "FFmpeg H.264 (VDPAU)"
|
||||
status working
|
||||
fourcc H264,h264
|
||||
fourcc X264,x264
|
||||
fourcc avc1,AVC1
|
||||
fourcc davc,DAVC
|
||||
format 0x10000005
|
||||
driver ffmpeg
|
||||
dll h264_vdpau
|
||||
out VDPAU_H264
|
||||
|
||||
videocodec ffsvq3
|
||||
info "FFmpeg Sorenson Video v3 (SVQ3)"
|
||||
status working
|
||||
|
95
fmt-conversion.c
Normal file
95
fmt-conversion.c
Normal file
@ -0,0 +1,95 @@
|
||||
/*
|
||||
* This file is part of MPlayer.
|
||||
*
|
||||
* MPlayer is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* MPlayer is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with MPlayer; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*/
|
||||
|
||||
#include "mp_msg.h"
|
||||
#include "libavutil/avutil.h"
|
||||
#include "libmpcodecs/img_format.h"
|
||||
#include "fmt-conversion.h"
|
||||
|
||||
static const struct {
|
||||
int fmt;
|
||||
enum PixelFormat pix_fmt;
|
||||
} conversion_map[] = {
|
||||
{IMGFMT_BGR32, PIX_FMT_RGB32},
|
||||
{IMGFMT_BGR24, PIX_FMT_BGR24},
|
||||
{IMGFMT_BGR16, PIX_FMT_RGB565},
|
||||
{IMGFMT_BGR8, PIX_FMT_RGB8},
|
||||
{IMGFMT_BGR4, PIX_FMT_RGB4},
|
||||
{IMGFMT_BGR1, PIX_FMT_MONOBLACK},
|
||||
{IMGFMT_RGB1, PIX_FMT_MONOBLACK},
|
||||
{IMGFMT_RG4B, PIX_FMT_BGR4_BYTE},
|
||||
{IMGFMT_BG4B, PIX_FMT_RGB4_BYTE},
|
||||
{IMGFMT_RGB32, PIX_FMT_BGR32},
|
||||
{IMGFMT_RGB24, PIX_FMT_RGB24},
|
||||
{IMGFMT_RGB16, PIX_FMT_BGR565},
|
||||
{IMGFMT_RGB15, PIX_FMT_BGR555},
|
||||
{IMGFMT_RGB8, PIX_FMT_BGR8},
|
||||
{IMGFMT_RGB4, PIX_FMT_BGR4},
|
||||
{IMGFMT_BGR8, PIX_FMT_PAL8},
|
||||
{IMGFMT_YUY2, PIX_FMT_YUYV422},
|
||||
{IMGFMT_UYVY, PIX_FMT_UYVY422},
|
||||
{IMGFMT_NV12, PIX_FMT_NV12},
|
||||
{IMGFMT_NV21, PIX_FMT_NV21},
|
||||
{IMGFMT_Y800, PIX_FMT_GRAY8},
|
||||
{IMGFMT_Y8, PIX_FMT_GRAY8},
|
||||
{IMGFMT_YVU9, PIX_FMT_YUV410P},
|
||||
{IMGFMT_IF09, PIX_FMT_YUV410P},
|
||||
{IMGFMT_YV12, PIX_FMT_YUV420P},
|
||||
{IMGFMT_YV12, PIX_FMT_YUVJ420P},
|
||||
{IMGFMT_I420, PIX_FMT_YUV420P},
|
||||
{IMGFMT_IYUV, PIX_FMT_YUV420P},
|
||||
{IMGFMT_411P, PIX_FMT_YUV411P},
|
||||
{IMGFMT_422P, PIX_FMT_YUV422P},
|
||||
{IMGFMT_422P, PIX_FMT_YUVJ422P},
|
||||
{IMGFMT_444P, PIX_FMT_YUV444P},
|
||||
{IMGFMT_444P, PIX_FMT_YUVJ444P},
|
||||
{IMGFMT_XVMC_MOCO_MPEG2, PIX_FMT_XVMC_MPEG2_MC},
|
||||
{IMGFMT_XVMC_IDCT_MPEG2, PIX_FMT_XVMC_MPEG2_IDCT},
|
||||
{IMGFMT_VDPAU_MPEG1, PIX_FMT_VDPAU_MPEG1},
|
||||
{IMGFMT_VDPAU_MPEG2, PIX_FMT_VDPAU_MPEG2},
|
||||
{IMGFMT_VDPAU_H264, PIX_FMT_VDPAU_H264},
|
||||
{IMGFMT_VDPAU_WMV3, PIX_FMT_VDPAU_WMV3},
|
||||
{IMGFMT_VDPAU_VC1, PIX_FMT_VDPAU_VC1},
|
||||
{0, PIX_FMT_NONE}
|
||||
};
|
||||
|
||||
enum PixelFormat imgfmt2pixfmt(int fmt)
|
||||
{
|
||||
int i;
|
||||
enum PixelFormat pix_fmt;
|
||||
for (i = 0; conversion_map[i].fmt; i++)
|
||||
if (conversion_map[i].fmt == fmt)
|
||||
break;
|
||||
pix_fmt = conversion_map[i].pix_fmt;
|
||||
if (pix_fmt == PIX_FMT_NONE)
|
||||
mp_msg(MSGT_GLOBAL, MSGL_ERR, "Unsupported format %s\n", vo_format_name(fmt));
|
||||
return pix_fmt;
|
||||
}
|
||||
|
||||
int pixfmt2imgfmt(enum PixelFormat pix_fmt)
|
||||
{
|
||||
int i;
|
||||
int fmt;
|
||||
for (i = 0; conversion_map[i].pix_fmt != PIX_FMT_NONE; i++)
|
||||
if (conversion_map[i].pix_fmt == pix_fmt)
|
||||
break;
|
||||
fmt = conversion_map[i].fmt;
|
||||
if (!fmt)
|
||||
mp_msg(MSGT_GLOBAL, MSGL_ERR, "Unsupported PixelFormat %i\n", pix_fmt);
|
||||
return fmt;
|
||||
}
|
@ -1,73 +1,9 @@
|
||||
#ifndef MPLAYER_FMT_CONVERSION_H
|
||||
#define MPLAYER_FMT_CONVERSION_H
|
||||
|
||||
#include <stdio.h>
|
||||
#include "libavutil/avutil.h"
|
||||
#include "libmpcodecs/img_format.h"
|
||||
|
||||
enum PixelFormat imgfmt2pixfmt(int fmt)
|
||||
{
|
||||
switch (fmt) {
|
||||
case IMGFMT_BGR32:
|
||||
return PIX_FMT_RGB32;
|
||||
case IMGFMT_BGR24:
|
||||
return PIX_FMT_BGR24;
|
||||
case IMGFMT_BGR16:
|
||||
return PIX_FMT_RGB565;
|
||||
case IMGFMT_BGR15:
|
||||
return PIX_FMT_RGB555;
|
||||
case IMGFMT_BGR8:
|
||||
return PIX_FMT_RGB8;
|
||||
case IMGFMT_BGR4:
|
||||
return PIX_FMT_RGB4;
|
||||
case IMGFMT_BGR1:
|
||||
case IMGFMT_RGB1:
|
||||
return PIX_FMT_MONOBLACK;
|
||||
case IMGFMT_RG4B:
|
||||
return PIX_FMT_BGR4_BYTE;
|
||||
case IMGFMT_BG4B:
|
||||
return PIX_FMT_RGB4_BYTE;
|
||||
case IMGFMT_RGB32:
|
||||
return PIX_FMT_BGR32;
|
||||
case IMGFMT_RGB24:
|
||||
return PIX_FMT_RGB24;
|
||||
case IMGFMT_RGB16:
|
||||
return PIX_FMT_BGR565;
|
||||
case IMGFMT_RGB15:
|
||||
return PIX_FMT_BGR555;
|
||||
case IMGFMT_RGB8:
|
||||
return PIX_FMT_BGR8;
|
||||
case IMGFMT_RGB4:
|
||||
return PIX_FMT_BGR4;
|
||||
case IMGFMT_YUY2:
|
||||
return PIX_FMT_YUYV422;
|
||||
case IMGFMT_UYVY:
|
||||
return PIX_FMT_UYVY422;
|
||||
case IMGFMT_NV12:
|
||||
return PIX_FMT_NV12;
|
||||
case IMGFMT_NV21:
|
||||
return PIX_FMT_NV21;
|
||||
case IMGFMT_Y800:
|
||||
case IMGFMT_Y8:
|
||||
return PIX_FMT_GRAY8;
|
||||
case IMGFMT_IF09:
|
||||
case IMGFMT_YVU9:
|
||||
return PIX_FMT_YUV410P;
|
||||
case IMGFMT_I420:
|
||||
case IMGFMT_IYUV:
|
||||
case IMGFMT_YV12:
|
||||
return PIX_FMT_YUV420P;
|
||||
case IMGFMT_411P:
|
||||
return PIX_FMT_YUV411P;
|
||||
case IMGFMT_422P:
|
||||
return PIX_FMT_YUV422P;
|
||||
case IMGFMT_444P:
|
||||
return PIX_FMT_YUV444P;
|
||||
default:
|
||||
fprintf(stderr, "Unsupported format %s\n", vo_format_name(fmt));
|
||||
}
|
||||
|
||||
return PIX_FMT_NONE;
|
||||
}
|
||||
enum PixelFormat imgfmt2pixfmt(int fmt);
|
||||
int pixfmt2imgfmt(enum PixelFormat pix_fmt);
|
||||
|
||||
#endif /* MPLAYER_FMT_CONVERSION_H */
|
||||
|
@ -2,7 +2,7 @@
|
||||
// Dmitry Baryshkov <mitya@school.ioffe.ru>
|
||||
// Reworked by: Andrew Savchenko aka Bircoph <Bircoph[at]list[dot]ru>
|
||||
|
||||
// Synced with help_mp-en.h: r27967
|
||||
// Synced with help_mp-en.h: r28122
|
||||
|
||||
|
||||
// ========================= MPlayer help ===========================
|
||||
@ -568,7 +568,7 @@ static char help_text[]=
|
||||
#define MSGTR_UNKNOWNWINDOWTYPE "Найден неизвестный тип окна..."
|
||||
|
||||
// --- skin loader error messages
|
||||
#define MSGTR_SKIN_ERRORMESSAGE "[скин] ошибка в файле конфигурации шкуры на строке %d: %s"
|
||||
#define MSGTR_SKIN_ERRORMESSAGE "[скин] ошибка в файле конфигурации шкуры на строке %d: %s"
|
||||
#define MSGTR_SKIN_WARNING1 "[скин] предупреждение: в файле конфигурации шкуры на строке %d:\nэлемент GUI найден, но до этого не найдено \"section\" (%s)"
|
||||
#define MSGTR_SKIN_WARNING2 "[скин] предупреждение: в файле конфигурации шкуры на строке %d:\nэлемент GUI найден, но до этого не найдено \"subsection\" (%s)"
|
||||
#define MSGTR_SKIN_WARNING3 "[скин] предупреждение: в файле конфигурации шкуры на строке %d:\nэта подсекция не поддерживается этим элементом GUI (%s)"
|
||||
@ -784,7 +784,7 @@ static char help_text[]=
|
||||
// --- messagebox
|
||||
#define MSGTR_MSGBOX_LABEL_FatalError "Фатальная ошибка!"
|
||||
#define MSGTR_MSGBOX_LABEL_Error "Ошибка!"
|
||||
#define MSGTR_MSGBOX_LABEL_Warning "Предупреждение!"
|
||||
#define MSGTR_MSGBOX_LABEL_Warning "Предупреждение!"
|
||||
|
||||
// bitmap.c
|
||||
#define MSGTR_NotEnoughMemoryC32To1 "[c32to1] недостаточно памяти для изображения\n"
|
||||
|
@ -1,7 +1,9 @@
|
||||
/* Translated by: Volodymyr M. Lisivka <lvm@mystery.lviv.net>,
|
||||
Andriy Gritsenko <andrej@lucky.net>
|
||||
/* Translated by: Volodymyr M. Lisivka <lvm@mystery.lviv.net>,
|
||||
Andriy Gritsenko <andrej@lucky.net>
|
||||
sevenfourk <sevenfourk@gmail.com>
|
||||
Was synced with help_mp-en.h: rev 1.105
|
||||
========================= MPlayer help =========================== */
|
||||
|
||||
========================= MPlayer help =========================== */
|
||||
|
||||
#ifdef HELP_MP_DEFINE_STATIC
|
||||
static char help_text[]=
|
||||
@ -15,12 +17,10 @@ static char help_text[]=
|
||||
#endif
|
||||
#ifdef CONFIG_DVDREAD
|
||||
" dvd://<номер титрів> грати DVD титри/трек з пристрою замість файлу\n"
|
||||
" -alang/-slang вибрати мову DVD аудіо/субтитрів (двосимвольний код країни)\n"
|
||||
#endif
|
||||
" -alang/-slang вибрати мову DVD аудіо/субтитрів (двосимвольний код країни)\n"
|
||||
" -ss <час> переміститися на задану (секунди або ГГ:ХХ:СС) позицію\n"
|
||||
" -nosound без звуку\n"
|
||||
" -stereo <режим> вибір MPEG1 стерео виводу (0:стерео 1:лівий 2:правий)\n"
|
||||
" -channels <n> номер вихідних каналів звуку\n"
|
||||
" -fs -vm -zoom повноекранне програвання (повноекр.,зміна відео,масштабування\n"
|
||||
" -x <x> -y <y> маштабувати картинку до <x> * <y> [якщо -vo драйвер підтримує!]\n"
|
||||
" -sub <file> вказати файл субтитрів (див. також -subfps, -subdelay)\n"
|
||||
@ -28,9 +28,7 @@ static char help_text[]=
|
||||
" -vid x -aid y опції для вибору відео (x) і аудіо (y) потоку для програвання\n"
|
||||
" -fps x -srate y опції для зміни відео (x кадр/сек) і аудіо (y Hz) швидкості\n"
|
||||
" -pp <quality> дозволити фільтр (0-4 для DivX, 0-63 для mpegs)\n"
|
||||
" -nobps використовувати альтернативний метод синхронізації A-V для AVI файлів (може допомогти!)\n"
|
||||
" -framedrop дозволити втрату кадрів (для повільних машин)\n"
|
||||
" -wid <id вікна> використовувати існуюче вікно для відео виводу (корисно для plugger!)\n"
|
||||
"\n"
|
||||
"Клавіші:\n"
|
||||
" <- або -> перемотування вперед/назад на 10 секунд\n"
|
||||
@ -52,7 +50,6 @@ static char help_text[]=
|
||||
// ========================= MPlayer messages ===========================
|
||||
|
||||
// mplayer.c:
|
||||
|
||||
#define MSGTR_Exiting "\nВиходимо...\n"
|
||||
#define MSGTR_ExitingHow "\nВиходимо... (%s)\n"
|
||||
#define MSGTR_Exit_quit "Вихід"
|
||||
@ -67,12 +64,13 @@ static char help_text[]=
|
||||
#define MSGTR_CantLoadSub "Не можу завантажити субтитри: %s\n"
|
||||
#define MSGTR_DumpSelectedStreamMissing "dump: FATAL: обраний потік загублений!\n"
|
||||
#define MSGTR_CantOpenDumpfile "Не можу відкрити файл дампу!!!\n"
|
||||
#define MSGTR_CoreDumped "core dumped :)\n"
|
||||
#define MSGTR_FPSnotspecified "Кількість кадрів на секунду не вказано (або неприпустиме значення) у заголовку! Використовуйте ключ -fps!\n"
|
||||
#define MSGTR_CantFindAudioCodec "Не можу знайти кодек для аудіо формату 0x%X!\n"
|
||||
#define MSGTR_CoreDumped "Створено дамп ядра :)\n"
|
||||
#define MSGTR_FPSnotspecified "Не вказано чи невірна кількість кадрів, застосуйте опцію -fps.\n"
|
||||
#define MSGTR_TryForceAudioFmtStr "Намагаюсь форсувати групу аудіо кодеків %s...\n"
|
||||
#define MSGTR_CantFindVideoCodec "Не можу знайти кодек для відео формату 0x%X!\n"
|
||||
#define MSGTR_VOincompCodec "Вибачте, обраний video_out пристрій не сумісний з цим кодеком.\n"
|
||||
#define MSGTR_CannotInitVO "FATAL: Не можу ініціалізувати відео драйвер!\n"
|
||||
#define MSGTR_RTFMCodecs "Прочитайте DOCS/HTML/en/codecs.html!\n"
|
||||
#define MSGTR_TryForceVideoFmtStr "Намагаюсь форсувати групу відео кодеків %s...\n"
|
||||
#define MSGTR_CannotInitVO "ФАТАЛЬНО: Не можу ініціалізувати відео драйвер!\n"
|
||||
#define MSGTR_CannotInitAO "не можу відкрити/ініціалізувати аудіо пристрій -> ГРАЮ БЕЗ ЗВУКУ\n"
|
||||
#define MSGTR_StartPlaying "Початок програвання...\n"
|
||||
|
||||
@ -83,7 +81,7 @@ static char help_text[]=
|
||||
"!!! Можливі причини, проблеми, обхідні шляхи: \n"\
|
||||
"- Найбільш загальні: поганий/сирий _аудіо_ драйвер :\n"\
|
||||
" - спробуйте -ao sdl або використовуйте ALSA 0.5 або емуляцію oss на ALSA 0.9.\n"\
|
||||
" - Experiment with different values for -autosync, 30 is a good start.\n"\
|
||||
" - Експеримент з різними значеннями для -autosync, спробуйте 30 .\n"\
|
||||
"- Повільний відео вивід.\n"\
|
||||
" - спробуйте інший -vo драйвер (список: -vo help) або спробуйте з -framedrop!\n"\
|
||||
"- Повільний ЦП. Не намагайтеся відтворювати великі dvd/divx на повільних\n"\
|
||||
@ -120,23 +118,127 @@ static char help_text[]=
|
||||
#define MSGTR_Paused "\n ===== ПАУЗА =====\r"
|
||||
#define MSGTR_PlaylistLoadUnable "\nНеможливо завантажити playlist %s.\n"
|
||||
#define MSGTR_Exit_SIGILL_RTCpuSel \
|
||||
"- MPlayer crashed by an 'Illegal Instruction'.\n"\
|
||||
" It may be a bug in our new runtime CPU-detection code...\n"\
|
||||
" Please read DOCS/HTML/en/bugreports.html.\n"
|
||||
"- MPlayer зламався через 'Невірні інструкції'.\n"\
|
||||
" Може бути помилка у вашому новому коду визначення типу CPU...\n"\
|
||||
" Будь-ласка перегляньте DOCS/HTML/en/bugreports.html.\n"
|
||||
#define MSGTR_Exit_SIGILL \
|
||||
"- MPlayer crashed by an 'Illegal Instruction'.\n"\
|
||||
" It usually happens when you run it on a CPU different than the one it was\n"\
|
||||
" compiled/optimized for.\n Verify this!\n"
|
||||
"- MPlayer зламався через 'Невірні інструкції'.\n"\
|
||||
" Іноді таке трапляється під час запуску програвача на CPU що відрізняється від того, на якому він\n"\
|
||||
" був зібраний/оптимізований.\n Перевірте!\n"
|
||||
#define MSGTR_Exit_SIGSEGV_SIGFPE \
|
||||
"- MPlayer crashed by bad usage of CPU/FPU/RAM.\n"\
|
||||
" Recompile MPlayer with --enable-debug and make a 'gdb' backtrace and\n"\
|
||||
" disassembly. For details, see DOCS/HTML/en/bugreports_what.html#bugreports_crash\n"
|
||||
"- MPlayer зламався через невірне використання CPU/FPU/RAM.\n"\
|
||||
" Зберіть знову MPlayer з --enable-debug а зробіть 'gdb' backtrace та\n"\
|
||||
" дизасемблювання. Для довідок, перегляньте DOCS/HTML/en/bugreports_what.html#bugreports_crash\n"
|
||||
#define MSGTR_Exit_SIGCRASH \
|
||||
"- MPlayer crashed. This shouldn't happen.\n"\
|
||||
" It can be a bug in the MPlayer code _or_ in your drivers _or_ in your\n"\
|
||||
" gcc version. If you think it's MPlayer's fault, please read\n"\
|
||||
" DOCS/HTML/en/bugreports.html and follow the instructions there. We can't and\n"\
|
||||
" won't help unless you provide this information when reporting a possible bug.\n"
|
||||
"- MPlayer зламався. Цього не повинно було трапитися.\n"\
|
||||
" Може бути помилка у коді MPlayer _або_ ваших драйверах _або_ через\n"\
|
||||
" версію gcc. Якщо важаєте що, це помилка MPlayer, будь-ласка читайте\n"\
|
||||
" DOCS/HTML/en/bugreports.html та слідкуєте інструкціям. Ми можемо\n"\
|
||||
" допомогти лише у разі забезпечення інформація коли доповідаєте про помилку.\n"
|
||||
#define MSGTR_LoadingConfig "Завантаження конфігурації '%s'\n"
|
||||
#define MSGTR_LoadingProtocolProfile "Завантаження профілю для протоколу '%s'\n"
|
||||
#define MSGTR_LoadingExtensionProfile "Завантаження профілю для розширення '%s'\n"
|
||||
#define MSGTR_AddedSubtitleFile "СУБТИТРИ: Додано файл субтитрів (%d): %s\n"
|
||||
#define MSGTR_RemovedSubtitleFile "СУБТИТРИ: Видалено файл субтитрів (%d): %s\n"
|
||||
#define MSGTR_ErrorOpeningOutputFile "Помилка при відкритті файлу [%s] для запису!\n"
|
||||
#define MSGTR_CommandLine "Командний рядок:"
|
||||
#define MSGTR_RTCDeviceNotOpenable "Не можу відкрити %s: %s (користувач повинен мати права читання для файлу.)\n"
|
||||
#define MSGTR_LinuxRTCInitErrorIrqpSet "Помилка ініцілізації Linux RTC у ioctl (rtc_irqp_set %lu): %s\n"
|
||||
#define MSGTR_IncreaseRTCMaxUserFreq "Спробуйте додати \"echo %lu > /proc/sys/dev/rtc/max-user-freq\" до скриптів запуску системи.\n"
|
||||
#define MSGTR_LinuxRTCInitErrorPieOn "Помилка ініціалізації Linux RTC у ioctl (rtc_pie_on): %s\n"
|
||||
#define MSGTR_UsingTimingType "Використовую %s синхронізацію.\n"
|
||||
#define MSGTR_NoIdleAndGui "Опція -idle не викориcтовується в GMPlayer.\n"
|
||||
#define MSGTR_MenuInitialized "Меню ініціалізовано: %s\n"
|
||||
#define MSGTR_MenuInitFailed "Ініціалізація меню невдале.\n"
|
||||
#define MSGTR_Getch2InitializedTwice "ПОПЕРЕДЖЕННЯ: getch2_init визвано двічі!\n"
|
||||
#define MSGTR_DumpstreamFdUnavailable "Не можу створити дамп цього потоку - не має доступного дексриптору.\n"
|
||||
#define MSGTR_CantOpenLibmenuFilterWithThisRootMenu "Не можу відкрити відео фільтр libmenu з цим кореневим меню %s.\n"
|
||||
#define MSGTR_AudioFilterChainPreinitError "Помилка у ланці pre-init аудіо фільтру!\n"
|
||||
#define MSGTR_LinuxRTCReadError "Помилка читання Linux RTC: %s\n"
|
||||
#define MSGTR_SoftsleepUnderflow "Попередження! Недупустиме низьке значення затримки програми!\n"
|
||||
#define MSGTR_DvdnavNullEvent "Подія DVDNAV NULL?!\n"
|
||||
#define MSGTR_DvdnavHighlightEventBroken "Подія DVDNAV: Подія виділення зламана\n"
|
||||
#define MSGTR_DvdnavEvent "Подія DVDNAV: %s\n"
|
||||
#define MSGTR_DvdnavHighlightHide "Подія DVDNAV: Виділення сховано\n"
|
||||
#define MSGTR_DvdnavStillFrame "######################################## Подія DVDNAV: Стоп-кадр: %d сек\n"
|
||||
#define MSGTR_DvdnavNavStop "Подія DVDNAV: Зупинка Nav\n"
|
||||
#define MSGTR_DvdnavNavNOP "Подія DVDNAV: Nav NOP\n"
|
||||
#define MSGTR_DvdnavNavSpuStreamChangeVerbose "Подія DVDNAV: Зміна SPU потоку Nav: фізично: %d/%d/%d логічно: %d\n"
|
||||
#define MSGTR_DvdnavNavSpuStreamChange "Подія DVDNAV: Зміна SPU потоку Nav: фізично: %d логічно: %d\n"
|
||||
#define MSGTR_DvdnavNavAudioStreamChange "Подія DVDNAV: Зміна Аудіо потоку Nav: фізично: %d логічно: %d\n"
|
||||
#define MSGTR_DvdnavNavVTSChange "Подія DVDNAV: Зміна Nav VTS\n"
|
||||
#define MSGTR_DvdnavNavCellChange "Подія DVDNAV: Зміна Nav Cell\n"
|
||||
#define MSGTR_DvdnavNavSpuClutChange "Подія DVDNAV: Зміна Nav SPU CLUT\n"
|
||||
#define MSGTR_DvdnavNavSeekDone "Подія DVDNAV: Nav Seek зроблено\n"
|
||||
#define MSGTR_MenuCall "Виклик меню\n"
|
||||
|
||||
#define MSGTR_EdlOutOfMem "Не можу виділити достатньо пам'яті для збереження даних EDL.\n"
|
||||
#define MSGTR_EdlRecordsNo "Читання %d EDL дій.\n"
|
||||
#define MSGTR_EdlQueueEmpty "Немає дій EDL які треба виконати.\n"
|
||||
#define MSGTR_EdlCantOpenForWrite "Не може відкрити EDL файл [%s] для запису.\n"
|
||||
#define MSGTR_EdlCantOpenForRead "Не може відкрити EDL файл [%s] для читання.\n"
|
||||
#define MSGTR_EdlNOsh_video "Не можу використати EDL без відео, вимикаю.\n"
|
||||
#define MSGTR_EdlNOValidLine "Невірний рядок EDL: %s\n"
|
||||
#define MSGTR_EdlBadlyFormattedLine "Погано відформатований EDL рядок [%d], пропускаю.\n"
|
||||
#define MSGTR_EdlBadLineOverlap "Остання зупинка була [%f]; наступний старт [%f].\n"\
|
||||
"Записи повинні бути у хронологічному порядку, не можу перекрити. Пропускаю.\n"
|
||||
#define MSGTR_EdlBadLineBadStop "Час зупинки повинен бути після часу старту.\n"
|
||||
#define MSGTR_EdloutBadStop "Ігнорування EDL відмінено, останній start > stop\n"
|
||||
#define MSGTR_EdloutStartSkip "Старт EDL пропуску, натисніть 'i' знов, щоб завершити блок.\n"
|
||||
#define MSGTR_EdloutEndSkip "Кінець EDL пропуску, рядок записано.\n"
|
||||
#define MSGTR_MPEndposNoSizeBased "Опція -endpos у MPlayer ще не підтримує одиниці ромзіру.\n"
|
||||
|
||||
// mplayer.c OSD
|
||||
#define MSGTR_OSDenabled "увімкнено"
|
||||
#define MSGTR_OSDdisabled "вимкнено"
|
||||
#define MSGTR_OSDAudio "Аудіо: %s"
|
||||
#define MSGTR_OSDVideo "Відео: %s"
|
||||
#define MSGTR_OSDChannel "Канал: %s"
|
||||
#define MSGTR_OSDSubDelay "Затримка субтитрыв: %d мс"
|
||||
#define MSGTR_OSDSpeed "Швидкість: x %6.2f"
|
||||
#define MSGTR_OSDosd "OSD: %s"
|
||||
#define MSGTR_OSDChapter "Розділ: (%d) %s"
|
||||
#define MSGTR_OSDAngle "Кут: %d/%d"
|
||||
|
||||
// property values
|
||||
#define MSGTR_EnabledEdl "увімкнено (EDL)"
|
||||
#define MSGTR_Disabled "вимкнено"
|
||||
#define MSGTR_HardFrameDrop "інтенсивний"
|
||||
#define MSGTR_Unknown "невідомий"
|
||||
#define MSGTR_Bottom "низ"
|
||||
#define MSGTR_Center "центр"
|
||||
#define MSGTR_Top "верх"
|
||||
#define MSGTR_SubSourceFile "файл"
|
||||
#define MSGTR_SubSourceVobsub "vobsub"
|
||||
#define MSGTR_SubSourceDemux "вкладено"
|
||||
|
||||
// OSD bar names
|
||||
#define MSGTR_Volume "Гучність"
|
||||
#define MSGTR_Panscan "Зріз сторін"
|
||||
#define MSGTR_Gamma "Гамма"
|
||||
#define MSGTR_Brightness "Яскравість"
|
||||
#define MSGTR_Contrast "Контраст"
|
||||
#define MSGTR_Saturation "Насиченність"
|
||||
#define MSGTR_Hue "Колір"
|
||||
#define MSGTR_Balance "Баланс"
|
||||
|
||||
// property state
|
||||
#define MSGTR_LoopStatus "Повтор: %s"
|
||||
#define MSGTR_MuteStatus "Вимкнути звук: %s"
|
||||
#define MSGTR_AVDelayStatus "A-V затримка: %s"
|
||||
#define MSGTR_OnTopStatus "Звурху інших: %s"
|
||||
#define MSGTR_RootwinStatus "Вікно-root: %s"
|
||||
#define MSGTR_BorderStatus "Рамка: %s"
|
||||
#define MSGTR_FramedroppingStatus "Пропуск кадрів: %s"
|
||||
#define MSGTR_VSyncStatus "Вертикальна синхронізація: %s"
|
||||
#define MSGTR_SubSelectStatus "Субтитри: %s"
|
||||
#define MSGTR_SubSourceStatus "Субтитри з: %s"
|
||||
#define MSGTR_SubPosStatus "Позиція субтитрів: %s/100"
|
||||
#define MSGTR_SubAlignStatus "Вирівнювання субтитрів: %s"
|
||||
#define MSGTR_SubDelayStatus "Затримка субтитрів: %s"
|
||||
#define MSGTR_SubScale "Масштаб субтитрів: %s"
|
||||
#define MSGTR_SubVisibleStatus "Субтитри: %s"
|
||||
#define MSGTR_SubForcedOnlyStatus "Форсувати тільки субтитри: %s"
|
||||
|
||||
// mencoder.c:
|
||||
#define MSGTR_UsingPass3ControlFile "Використовую pass3 файл: %s\n"
|
||||
@ -147,13 +249,162 @@ static char help_text[]=
|
||||
#define MSGTR_NoVideoEncoderSelected "\nНе вибраний відео кодек (-ovc). Виберіть, спробуйте -ovc help!\n"
|
||||
#define MSGTR_CannotOpenOutputFile "Неможливо створити файл '%s'.\n"
|
||||
#define MSGTR_EncoderOpenFailed "Неможливо відкрити кодек.\n"
|
||||
#define MSGTR_MencoderWrongFormatAVI "\nПОПЕРЕДЖЕННЯ: ФОРМАТ ФАЙЛУ НА ВИХОДІ _AVI_. Погляньте -of help.\n"
|
||||
#define MSGTR_MencoderWrongFormatMPG "\nПОПЕРЕДЖЕННЯ: ФОРМАТ ФАЙЛУ НА ВИХОДІ _MPEG_. Погляньте -of help.\n"
|
||||
#define MSGTR_MissingOutputFilename "Не вказано файлу на виході, будь-ласка подивіться опцію -o."
|
||||
#define MSGTR_ForcingOutputFourcc "Встановлюю вихідний fourcc в %x [%.4s]\n"
|
||||
#define MSGTR_ForcingOutputAudiofmtTag "Форсую таг аудіо фармату на виході до 0x%x.\n"
|
||||
#define MSGTR_DuplicateFrames "\n%d повторних кадрів!\n"
|
||||
#define MSGTR_SkipFrame "\nКадр пропущено!\n"
|
||||
#define MSGTR_ResolutionDoesntMatch "\nНовий та попередній відео файл має різне розширення та кольорову гаму.\n"
|
||||
#define MSGTR_FrameCopyFileMismatch "\nУсі відео файли повинні мати однакові кадр/сек, розширення, та кодек для -ovc copy.\n"
|
||||
#define MSGTR_AudioCopyFileMismatch "\nУсі відео файли повинні мати однакові аудіо кодек та формат для -oac copy.\n"
|
||||
#define MSGTR_NoAudioFileMismatch "\nНе можу поєднати файли відео з файлами аудіо та відео. Спробуйте -nosound.\n"
|
||||
#define MSGTR_NoSpeedWithFrameCopy "ПОПЕРЕДЖЕННЯ: опція -speed не гарантує коректну роботу з -oac copy!\n"\
|
||||
"Ваше кодування може бути невдалим!\n"
|
||||
#define MSGTR_ErrorWritingFile "%s: Помилка запису файлу.\n"
|
||||
#define MSGTR_FlushingVideoFrames "\nЗкидую кадри відео.\n"
|
||||
#define MSGTR_FiltersHaveNotBeenConfiguredEmptyFile "Фільтри не було налаштовано! Порожній файл?\n"
|
||||
#define MSGTR_RecommendedVideoBitrate "Рекомендований бітрейт для %s CD: %d\n"
|
||||
#define MSGTR_VideoStreamResult "\nВідео потік: %8.3f kbit/s (%d Б/с) розмір: %"PRIu64" байт %5.3f секунд %d кадрів\n"
|
||||
#define MSGTR_AudioStreamResult "\nАудіо потік: %8.3f kbit/s (%d Б/с) розмір: %"PRIu64" байт %5.3f секунд\n"
|
||||
#define MSGTR_EdlSkipStartEndCurrent "EDL SKIP: Початок: %.2f Кінець: %.2f Поточна: V: %.2f A: %.2f \r"
|
||||
#define MSGTR_OpenedStream "вдало: формат: %d дані: 0x%X - 0x%x\n"
|
||||
#define MSGTR_VCodecFramecopy "відеокодек: копія кадрів (%dx%d %dbpp fourcc=%x)\n"
|
||||
#define MSGTR_ACodecFramecopy "аудіокодек: копія кадрів (формат=%x каналів=%d швидкість=%d бітів=%d Б/с=%d приклад-%d)\n"
|
||||
#define MSGTR_CBRPCMAudioSelected "Вибрано CBR PCM аудіо.\n"
|
||||
#define MSGTR_MP3AudioSelected "Вибрано MP3 аудіо.\n"
|
||||
#define MSGTR_CannotAllocateBytes "Не можу виділити пам'ять для %d байтів.\n"
|
||||
#define MSGTR_SettingAudioDelay "Встановлюю аудіо затримку у %5.3fс.\n"
|
||||
#define MSGTR_SettingVideoDelay "Встановлюю відео затримку у %5.3fс.\n"
|
||||
#define MSGTR_SettingAudioInputGain "Встановлюю підсилення вхідного сигналу аудіо потоку у %f.\n"
|
||||
#define MSGTR_LamePresetEquals "\npreset=%s\n\n"
|
||||
#define MSGTR_LimitingAudioPreload "Обмежити підвантаження аудіо до 0.4с.\n"
|
||||
#define MSGTR_IncreasingAudioDensity "Збільшую густину аудіо до 4.\n"
|
||||
#define MSGTR_ZeroingAudioPreloadAndMaxPtsCorrection "Форсую аудіо підвантаження до 0, максимальну корекцію pts у 0.\n"
|
||||
#define MSGTR_CBRAudioByterate "\n\nCBR аудіо: %d байтів/сек, %d байтів/блок\n"
|
||||
#define MSGTR_LameVersion "Версія LAME %s (%s)\n\n"
|
||||
#define MSGTR_InvalidBitrateForLamePreset "Помилка: Вказаний бітрейт не є вірним для даного встановлення.\n"\
|
||||
"\n"\
|
||||
"Використовуючи цей режим ви повинні ввести значення між \"8\" та \"320\".\n"\
|
||||
"\n"\
|
||||
"Для подальшої інформації спробуйте: \"-lameopts preset=help\"\n"
|
||||
#define MSGTR_InvalidLamePresetOptions "Помилка: Ви не ввели дійсний профайл та/чи опції з встановлення.\n"\
|
||||
"\n"\
|
||||
"Доступні профайли:\n"\
|
||||
"\n"\
|
||||
" <fast> standard\n"\
|
||||
" <fast> extreme\n"\
|
||||
" insane\n"\
|
||||
" <cbr> (Режим ABR) - Мається на увазі режим ABR. Для використання,\n"\
|
||||
" просто вкажіть бітрейт. Наприклад:\n"\
|
||||
" \"preset=185\" активує це\n"\
|
||||
" встановлення та використовує 185 як середнє значення кбіт/с.\n"\
|
||||
"\n"\
|
||||
" Декілька прикладів:\n"\
|
||||
"\n"\
|
||||
" \"-lameopts fast:preset=standard \"\n"\
|
||||
" or \"-lameopts cbr:preset=192 \"\n"\
|
||||
" or \"-lameopts preset=172 \"\n"\
|
||||
" or \"-lameopts preset=extreme \"\n"\
|
||||
"\n"\
|
||||
"Для подальшої інформації спробуйте: \"-lameopts preset=help\"\n"
|
||||
#define MSGTR_LamePresetsLongInfo "\n"\
|
||||
"Встановлення розроблені так, щоб отримати якнайкращу якість.\n"\
|
||||
"\n"\
|
||||
"Вони були розроблені та налаштовані у результаті ретельних тестів\n"\
|
||||
"тести подвійного прослуховування, щоб досягти цього результату.\n"\
|
||||
"\n"\
|
||||
"Ключі встановлень постійно поновлюються, щоб відповідати останнім розробленням.\n"\
|
||||
"в результаті чого ви повинні отримати практично найкращу якість\n"\
|
||||
"на даний момент можливо при використанні LAME.\n"\
|
||||
"\n"\
|
||||
"Щоб активувати ці встановлення:\n"\
|
||||
"\n"\
|
||||
" Для VBR режимів (найкраща якість звичайно):\n"\
|
||||
"\n"\
|
||||
" \"preset=standard\" Звичайно цього встановлення повинно бути достатньо\n"\
|
||||
" для більшості людей та більшості музики, та воно\n"\
|
||||
" являє собою досить високу якість.\n"\
|
||||
"\n"\
|
||||
" \"preset=extreme\" Якщо у вас хороший слух та добра музича апаратура,\n"\
|
||||
" це встановлення як правило забезпечить кращу якість\n"\
|
||||
" ніж режим \"standard\"\n"\
|
||||
" mode.\n"\
|
||||
"\n"\
|
||||
" Для CBR 320kbps (максимально можлива якість, яку можна тримати з встановлень):\n"\
|
||||
"\n"\
|
||||
" \"preset=insane\" Це встановлення звичайно буде занадто для більшості людей\n"\
|
||||
" та ситуацій, але якщо ви мусите отримати найкращу\n"\
|
||||
" максимально можливу якість, не дивлячись на\n"\
|
||||
" розмір файлу, це ваш вибір.\n"\
|
||||
"\n"\
|
||||
" Для ABR режимів (висока якість для заданого бітрейта, але така висока як VBR):\n"\
|
||||
"\n"\
|
||||
" \"preset=<kbps>\" Використовуючи це встановлення звичайно дає добру якість\n"\
|
||||
" для заданого бітрейта. Базуючись на введеному\n"\
|
||||
" бітрейті, це встановлення визначить оптимальні\n"\
|
||||
" налаштування для кожной конкретного випадку.\n"\
|
||||
" Не дивлячись на то, що цей підхід працює, він\n"\
|
||||
" далеко не такий гнучкий як VBR, та звичайно не досягає\n"\
|
||||
" такого рівня якості як VBR на високих бітрейтах.\n"\
|
||||
"\n"\
|
||||
"Наступні опції також доступні для існуючих профілей:\n"\
|
||||
"\n"\
|
||||
" <fast> standard\n"\
|
||||
" <fast> extreme\n"\
|
||||
" insane\n"\
|
||||
" <cbr> (Режим ABR) - Мається на увазі режим ABR. Для використання\n"\
|
||||
" просто вкажіть бітрейт. Наприклад:\n"\
|
||||
" \"preset=185\" активує це встановлення\n"\
|
||||
" та використая 185 як середнє значення кбіт/сек.\n"\
|
||||
"\n"\
|
||||
" \"fast\" - Вмикає новий швидкий VBR для конкретного профілю.\n"\
|
||||
" Недостатком цього ключа є те, що часто бітрейт буде\n"\
|
||||
" набагато більше ніж у нормальному режимі;\n"\
|
||||
" а якість може буте дещо гірше.\n"\
|
||||
"Попередження: У теперешній версії швидкі встановлення можуть привести до\n"\
|
||||
" високому бітрейту, у порівнянні з звичайними встановленнями.\n"\
|
||||
"\n"\
|
||||
" \"cbr\" - Якщо ви використовуєте режим ABR (див. вище) з бітрейтом кратним\n"\
|
||||
" 80, 96, 112, 128, 160, 192, 224, 256, 320,\n"\
|
||||
" ви можете застосувати опцію \"cbr\" щоб форсувати кодування у режимі\n"\
|
||||
" CBR замість стандартного режиму abr. ABR забезпечує кращу якість,\n"\
|
||||
" але CBR може бути корисним у таких ситуаціях,\n"\
|
||||
" як передача потоків mp3 через інтернет.\n"\
|
||||
"\n"\
|
||||
" Наприклад:\n"\
|
||||
"\n"\
|
||||
" \"-lameopts fast:preset=standard \"\n"\
|
||||
" or \"-lameopts cbr:preset=192 \"\n"\
|
||||
" or \"-lameopts preset=172 \"\n"\
|
||||
" or \"-lameopts preset=extreme \"\n"\
|
||||
"\n"\
|
||||
"\n"\
|
||||
"Декілька псевдонімів доступні для режима ABR:\n"\
|
||||
"phone => 16kbps/mono phon+/lw/mw-eu/sw => 24kbps/mono\n"\
|
||||
"mw-us => 40kbps/mono voice => 56kbps/mono\n"\
|
||||
"fm/radio/tape => 112kbps hifi => 160kbps\n"\
|
||||
"cd => 192kbps studio => 256kbps"
|
||||
#define MSGTR_LameCantInit \
|
||||
"Не можу встановити опції LAME, перевірте бітрейт/частому_дискретизації, деякі\n"\
|
||||
"дуже низькі бітрейти (<32) потребують менші частоти\nдискретизації(наприклад, -srate 8000).\n"\
|
||||
"Якщо все це не допоможе, спробуйте встановлення."
|
||||
#define MSGTR_ConfigFileError "помилка у файлі налаштувань"
|
||||
#define MSGTR_ErrorParsingCommandLine "помилка аналізу командного рядка"
|
||||
#define MSGTR_VideoStreamRequired "Вивід відео обов'язковий!\n"
|
||||
#define MSGTR_ForcingInputFPS "Вхідні кадри/сек будуть замінені на %5.3f.\n"
|
||||
#define MSGTR_RawvideoDoesNotSupportAudio "Вихідний формат файлу RAWVIDEO не підтримує аудіо - вимикаю відео.\n"
|
||||
#define MSGTR_DemuxerDoesntSupportNosound "Цей демультиплексор поки не підтримується -nosound.\n"
|
||||
#define MSGTR_MemAllocFailed "Не можу виділити пам'ять.\n"
|
||||
#define MSGTR_NoMatchingFilter "Не можу знайти потрібний фільтр/формат аудіовиводу!\n"
|
||||
#define MSGTR_MP3WaveFormatSizeNot30 "sizeof(MPEGLAYER3WAVEFORMAT)==%d!=30, можливо зламаний компілятор C?\n"
|
||||
#define MSGTR_NoLavcAudioCodecName "Аудіо LAVC, відсутнє назва кодека!\n"
|
||||
#define MSGTR_LavcAudioCodecNotFound "Аудіо LAVC, не можу знайти кодувальщик для кодека %s.\n"
|
||||
#define MSGTR_CouldntAllocateLavcContext "Аудіо LAVC, не можу розмістити контекст!\n"
|
||||
#define MSGTR_CouldntOpenCodec "Не можу відкрити кодек %s, br=%d.\n"
|
||||
#define MSGTR_CantCopyAudioFormat "Аудіо формат 0x%x не використовується з '-oac copy', спробуйте\n'-oac pcm' замість чи використайте '-fafmttag' для його перевизначення.\n"
|
||||
|
||||
#define MSGTR_VideoStreamResult "\nВідео потік: %8.3f кбіт/с (%d Б/с) розмір: %"PRIu64" байт %5.3f секунд %d кадрів\n"
|
||||
#define MSGTR_AudioStreamResult "\nАудіо потік: %8.3f кбіт/с (%d Б/с) розмір: %"PRIu64" байт %5.3f секунд\n"
|
||||
|
||||
// cfg-mencoder.h:
|
||||
#define MSGTR_MEncoderMP3LameHelp "\n\n"\
|
||||
|
@ -67,6 +67,11 @@ const char *vo_format_name(int format)
|
||||
case IMGFMT_ZRMJPEGIB: return "Zoran MJPEG bottom field first";
|
||||
case IMGFMT_XVMC_MOCO_MPEG2: return "MPEG1/2 Motion Compensation";
|
||||
case IMGFMT_XVMC_IDCT_MPEG2: return "MPEG1/2 Motion Compensation and IDCT";
|
||||
case IMGFMT_VDPAU_MPEG1: return "MPEG1 VDPAU acceleration";
|
||||
case IMGFMT_VDPAU_MPEG2: return "MPEG2 VDPAU acceleration";
|
||||
case IMGFMT_VDPAU_H264: return "H.264 VDPAU acceleration";
|
||||
case IMGFMT_VDPAU_WMV3: return "WMV3 VDPAU acceleration";
|
||||
case IMGFMT_VDPAU_VC1: return "VC1 VDPAU acceleration";
|
||||
}
|
||||
snprintf(unknown_format,20,"Unknown 0x%04x",format);
|
||||
return unknown_format;
|
||||
|
@ -107,6 +107,16 @@
|
||||
#define IMGFMT_XVMC_MOCO_MPEG2 (IMGFMT_XVMC|0x02)
|
||||
#define IMGFMT_XVMC_IDCT_MPEG2 (IMGFMT_XVMC|0x82)
|
||||
|
||||
// VDPAU specific format.
|
||||
#define IMGFMT_VDPAU 0x1DC80000
|
||||
#define IMGFMT_VDPAU_MASK 0xFFFF0000
|
||||
#define IMGFMT_IS_VDPAU(fmt) (((fmt)&IMGFMT_VDPAU_MASK)==IMGFMT_VDPAU)
|
||||
#define IMGFMT_VDPAU_MPEG1 (IMGFMT_VDPAU|0x01)
|
||||
#define IMGFMT_VDPAU_MPEG2 (IMGFMT_VDPAU|0x02)
|
||||
#define IMGFMT_VDPAU_H264 (IMGFMT_VDPAU|0x03)
|
||||
#define IMGFMT_VDPAU_WMV3 (IMGFMT_VDPAU|0x04)
|
||||
#define IMGFMT_VDPAU_VC1 (IMGFMT_VDPAU|0x05)
|
||||
|
||||
typedef struct {
|
||||
void* data;
|
||||
int size;
|
||||
|
@ -4,6 +4,7 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "mp_msg.h"
|
||||
|
||||
//--------- codec's requirements (filled by the codec/vf) ---------
|
||||
|
||||
@ -53,6 +54,8 @@
|
||||
|
||||
// buffer type was printed (do NOT set this flag - it's for INTERNAL USE!!!)
|
||||
#define MP_IMGFLAG_TYPE_DISPLAYED 0x8000
|
||||
// set if it can not be reused yet (for MP_IMGTYPE_NUMBERED)
|
||||
#define MP_IMGFLAG_IN_USE 0x10000
|
||||
|
||||
// codec doesn't support any form of direct rendering - it has own buffer
|
||||
// allocation. so we just export its buffer pointers:
|
||||
@ -65,6 +68,8 @@
|
||||
#define MP_IMGTYPE_IP 3
|
||||
// I+P+B type, requires 2+ independent static R/W and 1+ temp WO buffers
|
||||
#define MP_IMGTYPE_IPB 4
|
||||
// Upper 16 bits give desired buffer number, -1 means get next available
|
||||
#define MP_IMGTYPE_NUMBERED 5
|
||||
|
||||
#define MP_MAX_PLANES 4
|
||||
|
||||
@ -76,8 +81,9 @@
|
||||
#define MP_IMGFIELD_INTERLACED 0x20
|
||||
|
||||
typedef struct mp_image {
|
||||
unsigned short flags;
|
||||
unsigned int flags;
|
||||
unsigned char type;
|
||||
int number;
|
||||
unsigned char bpp; // bits/pixel. NOT depth! for RGB it will be n*8
|
||||
unsigned int imgfmt;
|
||||
int width,height; // stored dimensions
|
||||
@ -103,17 +109,10 @@ typedef struct mp_image {
|
||||
static inline void mp_image_setfmt(mp_image_t* mpi,unsigned int out_fmt){
|
||||
mpi->flags&=~(MP_IMGFLAG_PLANAR|MP_IMGFLAG_YUV|MP_IMGFLAG_SWAPPED);
|
||||
mpi->imgfmt=out_fmt;
|
||||
if(out_fmt == IMGFMT_MPEGPES){
|
||||
mpi->bpp=0;
|
||||
return;
|
||||
}
|
||||
if(out_fmt == IMGFMT_ZRMJPEGNI ||
|
||||
out_fmt == IMGFMT_ZRMJPEGIT ||
|
||||
out_fmt == IMGFMT_ZRMJPEGIB){
|
||||
mpi->bpp=0;
|
||||
return;
|
||||
}
|
||||
if(IMGFMT_IS_XVMC(out_fmt)){
|
||||
// compressed formats
|
||||
if(out_fmt == IMGFMT_MPEGPES ||
|
||||
out_fmt == IMGFMT_ZRMJPEGNI || out_fmt == IMGFMT_ZRMJPEGIT || out_fmt == IMGFMT_ZRMJPEGIB ||
|
||||
IMGFMT_IS_VDPAU(out_fmt) || IMGFMT_IS_XVMC(out_fmt)){
|
||||
mpi->bpp=0;
|
||||
return;
|
||||
}
|
||||
@ -206,7 +205,7 @@ static inline void mp_image_setfmt(mp_image_t* mpi,unsigned int out_fmt){
|
||||
mpi->chroma_y_shift=1;
|
||||
return;
|
||||
}
|
||||
fprintf(stderr,"mp_image: unknown out_fmt: 0x%X\n",out_fmt);
|
||||
mp_msg(MSGT_DECVIDEO,MSGL_WARN,"mp_image: unknown out_fmt: 0x%X\n",out_fmt);
|
||||
mpi->bpp=0;
|
||||
}
|
||||
#endif
|
||||
|
@ -12,15 +12,16 @@
|
||||
#include "libavutil/common.h"
|
||||
#include "libavutil/intreadwrite.h"
|
||||
#include "mpbswap.h"
|
||||
#include "fmt-conversion.h"
|
||||
|
||||
#include "vd_internal.h"
|
||||
|
||||
static const vd_info_t info = {
|
||||
"FFmpeg's libavcodec codec family",
|
||||
"ffmpeg",
|
||||
"A'rpi",
|
||||
"A'rpi, Michael, Alex",
|
||||
"native codecs"
|
||||
"FFmpeg's libavcodec codec family",
|
||||
"ffmpeg",
|
||||
"A'rpi",
|
||||
"A'rpi, Michael, Alex",
|
||||
"native codecs"
|
||||
};
|
||||
|
||||
LIBVD_EXTERN(ffmpeg)
|
||||
@ -28,7 +29,7 @@ LIBVD_EXTERN(ffmpeg)
|
||||
#include "libavcodec/avcodec.h"
|
||||
|
||||
#if CONFIG_XVMC
|
||||
#include "xvmc_render.h"
|
||||
#include "libavcodec/xvmc.h"
|
||||
#endif
|
||||
|
||||
int avcodec_initialized=0;
|
||||
@ -56,16 +57,11 @@ typedef struct {
|
||||
|
||||
static int get_buffer(AVCodecContext *avctx, AVFrame *pic);
|
||||
static void release_buffer(AVCodecContext *avctx, AVFrame *pic);
|
||||
static void draw_slice(struct AVCodecContext *s, const AVFrame *src,
|
||||
int offset[4], int y, int type, int height);
|
||||
|
||||
#if CONFIG_XVMC
|
||||
static enum PixelFormat get_format(struct AVCodecContext * avctx,
|
||||
const enum PixelFormat * pix_fmt);
|
||||
static int mc_get_buffer(AVCodecContext *avctx, AVFrame *pic);
|
||||
static void mc_release_buffer(AVCodecContext *avctx, AVFrame *pic);
|
||||
static void mc_render_slice(struct AVCodecContext *s,
|
||||
const AVFrame *src, int offset[4],
|
||||
int y, int type, int height);
|
||||
#endif
|
||||
static enum PixelFormat get_format(struct AVCodecContext *avctx,
|
||||
const enum PixelFormat *pix_fmt);
|
||||
|
||||
const m_option_t lavc_decode_opts_conf[]={
|
||||
OPT_INTRANGE("bug", lavc_param.workaround_bugs, 0, -1, 999999),
|
||||
@ -102,16 +98,16 @@ static enum AVDiscard str2AVDiscard(char *str) {
|
||||
}
|
||||
|
||||
// to set/get/query special features/parameters
|
||||
static int control(sh_video_t *sh,int cmd,void* arg,...){
|
||||
static int control(sh_video_t *sh, int cmd, void *arg, ...){
|
||||
vd_ffmpeg_ctx *ctx = sh->context;
|
||||
AVCodecContext *avctx = ctx->avctx;
|
||||
switch(cmd){
|
||||
case VDCTRL_QUERY_FORMAT:
|
||||
{
|
||||
int format =(*((int*)arg));
|
||||
if( format == ctx->best_csp ) return CONTROL_TRUE;//supported
|
||||
{
|
||||
int format =(*((int *)arg));
|
||||
if(format == ctx->best_csp) return CONTROL_TRUE;//supported
|
||||
// possible conversions:
|
||||
switch( format ){
|
||||
switch(format){
|
||||
case IMGFMT_YV12:
|
||||
case IMGFMT_IYUV:
|
||||
case IMGFMT_I420:
|
||||
@ -126,8 +122,7 @@ static int control(sh_video_t *sh,int cmd,void* arg,...){
|
||||
#endif
|
||||
}
|
||||
return CONTROL_FALSE;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case VDCTRL_RESYNC_STREAM:
|
||||
avcodec_flush_buffers(avctx);
|
||||
return CONTROL_TRUE;
|
||||
@ -137,10 +132,10 @@ static int control(sh_video_t *sh,int cmd,void* arg,...){
|
||||
return CONTROL_UNKNOWN;
|
||||
}
|
||||
|
||||
static void mp_msp_av_log_callback(void* ptr, int level, const char* fmt, va_list vl)
|
||||
static void mp_msp_av_log_callback(void *ptr, int level, const char *fmt, va_list vl)
|
||||
{
|
||||
static int print_prefix=1;
|
||||
AVClass* avc= ptr ? *(AVClass**)ptr : NULL;
|
||||
AVClass *avc= ptr ? *(AVClass **)ptr : NULL;
|
||||
int type= MSGT_FIXME;
|
||||
int mp_level;
|
||||
char buf[256];
|
||||
@ -156,7 +151,7 @@ static void mp_msp_av_log_callback(void* ptr, int level, const char* fmt, va_lis
|
||||
|
||||
if(ptr){
|
||||
if(!strcmp(avc->class_name, "AVCodecContext")){
|
||||
AVCodecContext * s= ptr;
|
||||
AVCodecContext *s= ptr;
|
||||
if(s->codec){
|
||||
if(s->codec->type == CODEC_TYPE_AUDIO){
|
||||
if(s->codec->decode)
|
||||
@ -168,8 +163,8 @@ static void mp_msp_av_log_callback(void* ptr, int level, const char* fmt, va_lis
|
||||
//FIXME subtitles, encoders (what msgt for them? there is no appropriate ...)
|
||||
}
|
||||
}else if(!strcmp(avc->class_name, "AVFormatContext")){
|
||||
#if 0 //needs libavformat include FIXME iam too lazy to do this cleanly,probably the whole should be moved out of this file ...
|
||||
AVFormatContext * s= ptr;
|
||||
#if 0 //needs libavformat include FIXME iam too lazy to do this cleanly, probably the whole should be moved out of this file ...
|
||||
AVFormatContext *s= ptr;
|
||||
if(s->iformat)
|
||||
type= MSGT_DEMUXER;
|
||||
else if(s->oformat)
|
||||
@ -197,10 +192,10 @@ static int init(sh_video_t *sh){
|
||||
int do_vis_debug= lavc_param->vismv || (lavc_param->debug&(FF_DEBUG_VIS_MB_TYPE|FF_DEBUG_VIS_QP));
|
||||
|
||||
if(!avcodec_initialized){
|
||||
avcodec_init();
|
||||
avcodec_register_all();
|
||||
avcodec_initialized=1;
|
||||
av_log_set_callback(mp_msp_av_log_callback);
|
||||
avcodec_init();
|
||||
avcodec_register_all();
|
||||
avcodec_initialized=1;
|
||||
av_log_set_callback(mp_msp_av_log_callback);
|
||||
}
|
||||
|
||||
ctx = sh->context = malloc(sizeof(vd_ffmpeg_ctx));
|
||||
@ -210,7 +205,7 @@ static int init(sh_video_t *sh){
|
||||
|
||||
lavc_codec = (AVCodec *)avcodec_find_decoder_by_name(sh->codec->dll);
|
||||
if(!lavc_codec){
|
||||
mp_msg(MSGT_DECVIDEO,MSGL_ERR,MSGTR_MissingLAVCcodec,sh->codec->dll);
|
||||
mp_msg(MSGT_DECVIDEO, MSGL_ERR, MSGTR_MissingLAVCcodec, sh->codec->dll);
|
||||
uninit(sh);
|
||||
return 0;
|
||||
}
|
||||
@ -233,13 +228,10 @@ static int init(sh_video_t *sh){
|
||||
mp_msg(MSGT_DECVIDEO, MSGL_INFO, MSGTR_MPCODECS_XVMCAcceleratedCodec);
|
||||
assert(ctx->do_dr1);//these are must to!
|
||||
assert(ctx->do_slices); //it is (vo_)ffmpeg bug if this fails
|
||||
avctx->flags|= CODEC_FLAG_EMU_EDGE;//do i need that??!!
|
||||
avctx->get_format= get_format;//for now only this decoder will use it
|
||||
avctx->get_buffer= mc_get_buffer;
|
||||
avctx->release_buffer= mc_release_buffer;
|
||||
avctx->draw_horiz_band = mc_render_slice;
|
||||
avctx->draw_horiz_band = draw_slice;
|
||||
avctx->slice_flags=SLICE_FLAG_CODED_ORDER|SLICE_FLAG_ALLOW_FIELD;
|
||||
}else
|
||||
}
|
||||
#endif /* CONFIG_XVMC */
|
||||
if(ctx->do_dr1){
|
||||
avctx->flags|= CODEC_FLAG_EMU_EDGE;
|
||||
@ -279,22 +271,22 @@ static int init(sh_video_t *sh){
|
||||
|
||||
if(lavc_param->avopt){
|
||||
if(parse_avopts(avctx, lavc_param->avopt) < 0){
|
||||
mp_msg(MSGT_DECVIDEO,MSGL_ERR, "Your options /%s/ look like gibberish to me pal\n", lavc_param->avopt);
|
||||
mp_msg(MSGT_DECVIDEO, MSGL_ERR, "Your options /%s/ look like gibberish to me pal\n", lavc_param->avopt);
|
||||
uninit(sh);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
mp_dbg(MSGT_DECVIDEO,MSGL_DBG2,"libavcodec.size: %d x %d\n",avctx->width,avctx->height);
|
||||
mp_dbg(MSGT_DECVIDEO, MSGL_DBG2, "libavcodec.size: %d x %d\n", avctx->width, avctx->height);
|
||||
switch (sh->format) {
|
||||
case mmioFOURCC('S','V','Q','3'):
|
||||
/* SVQ3 extradata can show up as sh->ImageDesc if demux_mov is used, or
|
||||
in the phony AVI header if demux_lavf is used. The first case is
|
||||
handled here; the second case falls through to the next section. */
|
||||
if (sh->ImageDesc) {
|
||||
avctx->extradata_size = (*(int*)sh->ImageDesc) - sizeof(int);
|
||||
avctx->extradata_size = (*(int *)sh->ImageDesc) - sizeof(int);
|
||||
avctx->extradata = av_mallocz(avctx->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
|
||||
memcpy(avctx->extradata, ((int*)sh->ImageDesc)+1, avctx->extradata_size);
|
||||
memcpy(avctx->extradata, ((int *)sh->ImageDesc)+1, avctx->extradata_size);
|
||||
break;
|
||||
}
|
||||
/* fallthrough */
|
||||
@ -317,8 +309,8 @@ static int init(sh_video_t *sh){
|
||||
uint8_t *p = avctx->extradata;
|
||||
|
||||
for (x=0; x<avctx->extradata_size; x++)
|
||||
mp_msg(MSGT_DECVIDEO, MSGL_INFO,"[%x] ", p[x]);
|
||||
mp_msg(MSGT_DECVIDEO, MSGL_INFO,"\n");
|
||||
mp_msg(MSGT_DECVIDEO, MSGL_INFO, "[%x] ", p[x]);
|
||||
mp_msg(MSGT_DECVIDEO, MSGL_INFO, "\n");
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
@ -332,8 +324,8 @@ static int init(sh_video_t *sh){
|
||||
/* only 1 packet per frame & sub_id from fourcc */
|
||||
avctx->extradata_size= 8;
|
||||
avctx->extradata = av_mallocz(avctx->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
|
||||
((uint32_t*)avctx->extradata)[0] = 0;
|
||||
((uint32_t*)avctx->extradata)[1] =
|
||||
((uint32_t *)avctx->extradata)[0] = 0;
|
||||
((uint32_t *)avctx->extradata)[1] =
|
||||
(sh->format == mmioFOURCC('R', 'V', '1', '3')) ? 0x10003001 : 0x10000000;
|
||||
} else {
|
||||
/* has extra slice header (demux_rm or rm->avi streamcopy) */
|
||||
@ -356,7 +348,7 @@ static int init(sh_video_t *sh){
|
||||
}
|
||||
/* Pass palette to codec */
|
||||
if (sh->bih && (sh->bih->biBitCount <= 8)) {
|
||||
avctx->palctrl = calloc(1,sizeof(AVPaletteControl));
|
||||
avctx->palctrl = calloc(1, sizeof(AVPaletteControl));
|
||||
avctx->palctrl->palette_changed = 1;
|
||||
if (sh->bih->biSize-sizeof(BITMAPINFOHEADER))
|
||||
/* Palette size in biSize */
|
||||
@ -375,12 +367,12 @@ static int init(sh_video_t *sh){
|
||||
avcodec_thread_init(avctx, lavc_param->threads);
|
||||
/* open it */
|
||||
if (avcodec_open(avctx, lavc_codec) < 0) {
|
||||
mp_msg(MSGT_DECVIDEO,MSGL_ERR, MSGTR_CantOpenCodec);
|
||||
mp_msg(MSGT_DECVIDEO, MSGL_ERR, MSGTR_CantOpenCodec);
|
||||
uninit(sh);
|
||||
return 0;
|
||||
}
|
||||
mp_msg(MSGT_DECVIDEO,MSGL_V,"INFO: libavcodec init OK!\n");
|
||||
return 1; //mpcodecs_config_vo(sh,sh->disp_w,sh->disp_h,IMGFMT_YV12);
|
||||
mp_msg(MSGT_DECVIDEO, MSGL_V, "INFO: libavcodec init OK!\n");
|
||||
return 1; //mpcodecs_config_vo(sh, sh->disp_w, sh->disp_h, IMGFMT_YV12);
|
||||
}
|
||||
|
||||
// uninit driver
|
||||
@ -391,9 +383,9 @@ static void uninit(sh_video_t *sh){
|
||||
if(sh->opts->lavc_param.vstats){
|
||||
int i;
|
||||
for(i=1; i<32; i++){
|
||||
mp_msg(MSGT_DECVIDEO, MSGL_INFO,"QP: %d, count: %d\n", i, ctx->qp_stat[i]);
|
||||
mp_msg(MSGT_DECVIDEO, MSGL_INFO, "QP: %d, count: %d\n", i, ctx->qp_stat[i]);
|
||||
}
|
||||
mp_msg(MSGT_DECVIDEO, MSGL_INFO,MSGTR_MPCODECS_ArithmeticMeanOfQP,
|
||||
mp_msg(MSGT_DECVIDEO, MSGL_INFO, MSGTR_MPCODECS_ArithmeticMeanOfQP,
|
||||
ctx->qp_sum / avctx->coded_frame->coded_picture_number,
|
||||
1.0/(ctx->inv_qp_sum / avctx->coded_frame->coded_picture_number)
|
||||
);
|
||||
@ -401,7 +393,7 @@ static void uninit(sh_video_t *sh){
|
||||
|
||||
if (avctx) {
|
||||
if (avctx->codec && avcodec_close(avctx) < 0)
|
||||
mp_msg(MSGT_DECVIDEO,MSGL_ERR, MSGTR_CantCloseCodec);
|
||||
mp_msg(MSGT_DECVIDEO, MSGL_ERR, MSGTR_CantCloseCodec);
|
||||
|
||||
av_freep(&avctx->extradata);
|
||||
av_freep(&avctx->palctrl);
|
||||
@ -417,7 +409,7 @@ static void uninit(sh_video_t *sh){
|
||||
static void draw_slice(struct AVCodecContext *s,
|
||||
const AVFrame *src, int offset[4],
|
||||
int y, int type, int height){
|
||||
sh_video_t * sh = s->opaque;
|
||||
sh_video_t *sh = s->opaque;
|
||||
uint8_t *source[3]= {src->data[0] + offset[0], src->data[1] + offset[1], src->data[2] + offset[2]};
|
||||
#if 0
|
||||
int start=0, i;
|
||||
@ -435,7 +427,7 @@ static void draw_slice(struct AVCodecContext *s,
|
||||
src[1] + start*8,
|
||||
src[2] + start*8};
|
||||
//printf("%2d-%2d x %d\n", start, i, y);
|
||||
mpcodecs_draw_slice (sh,src2, stride, (i-start)*16, height, start*16, y);
|
||||
mpcodecs_draw_slice (sh, src2, stride, (i-start)*16, height, start*16, y);
|
||||
start= i+1;
|
||||
}
|
||||
}
|
||||
@ -482,44 +474,18 @@ static int init_vo(sh_video_t *sh, enum PixelFormat pix_fmt){
|
||||
sh->disp_w = width;
|
||||
sh->disp_h = height;
|
||||
ctx->pix_fmt = pix_fmt;
|
||||
switch(pix_fmt){
|
||||
// YUVJ are YUV formats that use the full Y range and not just
|
||||
// 16 - 235 (see colorspaces.txt).
|
||||
// Currently they are all treated the same way.
|
||||
case PIX_FMT_YUV410P: ctx->best_csp=IMGFMT_YVU9;break; //svq1
|
||||
case PIX_FMT_YUVJ420P:
|
||||
case PIX_FMT_YUV420P: ctx->best_csp=IMGFMT_YV12;break; //mpegs
|
||||
case PIX_FMT_YUVJ422P:
|
||||
case PIX_FMT_YUV422P: ctx->best_csp=IMGFMT_422P;break; //mjpeg / huffyuv
|
||||
case PIX_FMT_YUVJ444P:
|
||||
case PIX_FMT_YUV444P: ctx->best_csp=IMGFMT_444P;break; //photo jpeg
|
||||
case PIX_FMT_YUV411P: ctx->best_csp=IMGFMT_411P;break; //dv ntsc
|
||||
case PIX_FMT_YUYV422: ctx->best_csp=IMGFMT_YUY2;break; //huffyuv perhaps in the future
|
||||
case PIX_FMT_RGB24 : ctx->best_csp=IMGFMT_RGB24;break; //qtrle
|
||||
case PIX_FMT_RGB32: ctx->best_csp=IMGFMT_BGR32;break; //huffyuv / mjpeg
|
||||
case PIX_FMT_BGR24 : ctx->best_csp=IMGFMT_BGR24;break; //8bps
|
||||
case PIX_FMT_RGB555: ctx->best_csp=IMGFMT_BGR15;break; //rpza,cram
|
||||
case PIX_FMT_RGB565: ctx->best_csp=IMGFMT_BGR16;break; //4xm
|
||||
case PIX_FMT_GRAY8: ctx->best_csp=IMGFMT_Y800;break; // gray jpeg
|
||||
case PIX_FMT_PAL8: ctx->best_csp=IMGFMT_BGR8;break; //8bps,mrle,cram
|
||||
#if CONFIG_XVMC
|
||||
case PIX_FMT_XVMC_MPEG2_MC:ctx->best_csp=IMGFMT_XVMC_MOCO_MPEG2;break;
|
||||
case PIX_FMT_XVMC_MPEG2_IDCT:ctx->best_csp=IMGFMT_XVMC_IDCT_MPEG2;break;
|
||||
#endif
|
||||
default:
|
||||
ctx->best_csp=0;
|
||||
}
|
||||
if (!mpcodecs_config_vo(sh,sh->disp_w,sh->disp_h, ctx->best_csp))
|
||||
return -1;
|
||||
ctx->best_csp = pixfmt2imgfmt(pix_fmt);
|
||||
if (!mpcodecs_config_vo(sh, sh->disp_w, sh->disp_h, ctx->best_csp))
|
||||
return -1;
|
||||
ctx->vo_initialized = 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_buffer(AVCodecContext *avctx, AVFrame *pic){
|
||||
sh_video_t * sh = avctx->opaque;
|
||||
sh_video_t *sh = avctx->opaque;
|
||||
vd_ffmpeg_ctx *ctx = sh->context;
|
||||
mp_image_t* mpi=NULL;
|
||||
mp_image_t *mpi=NULL;
|
||||
int flags= MP_IMGFLAG_ACCEPT_STRIDE | MP_IMGFLAG_PREFER_ALIGNED_STRIDE;
|
||||
int type= MP_IMGTYPE_IPB;
|
||||
int width= avctx->width;
|
||||
@ -529,71 +495,97 @@ static int get_buffer(AVCodecContext *avctx, AVFrame *pic){
|
||||
if(avctx->pix_fmt == PIX_FMT_YUV410P)
|
||||
align=63; //yes seriously, its really needed (16x16 chroma blocks in SVQ1 -> 64x64)
|
||||
|
||||
if (pic->buffer_hints) {
|
||||
mp_msg(MSGT_DECVIDEO,MSGL_DBG2, "Buffer hints: %u\n", pic->buffer_hints);
|
||||
type = MP_IMGTYPE_TEMP;
|
||||
if (pic->buffer_hints & FF_BUFFER_HINTS_READABLE)
|
||||
flags |= MP_IMGFLAG_READABLE;
|
||||
if (pic->buffer_hints & FF_BUFFER_HINTS_PRESERVE) {
|
||||
type = MP_IMGTYPE_STATIC;
|
||||
flags |= MP_IMGFLAG_PRESERVE;
|
||||
}
|
||||
if (pic->buffer_hints & FF_BUFFER_HINTS_REUSABLE) {
|
||||
type = MP_IMGTYPE_STATIC;
|
||||
flags |= MP_IMGFLAG_PRESERVE;
|
||||
}
|
||||
flags|=(!avctx->hurry_up && ctx->do_slices) ?
|
||||
MP_IMGFLAG_DRAW_CALLBACK:0;
|
||||
mp_msg(MSGT_DECVIDEO,MSGL_DBG2, type == MP_IMGTYPE_STATIC ? "using STATIC\n" : "using TEMP\n");
|
||||
} else {
|
||||
if(!pic->reference){
|
||||
ctx->b_count++;
|
||||
if (pic->buffer_hints) {
|
||||
mp_msg(MSGT_DECVIDEO, MSGL_DBG2, "Buffer hints: %u\n", pic->buffer_hints);
|
||||
type = MP_IMGTYPE_TEMP;
|
||||
if (pic->buffer_hints & FF_BUFFER_HINTS_READABLE)
|
||||
flags |= MP_IMGFLAG_READABLE;
|
||||
if (pic->buffer_hints & FF_BUFFER_HINTS_PRESERVE) {
|
||||
type = MP_IMGTYPE_STATIC;
|
||||
flags |= MP_IMGFLAG_PRESERVE;
|
||||
}
|
||||
if (pic->buffer_hints & FF_BUFFER_HINTS_REUSABLE) {
|
||||
type = MP_IMGTYPE_STATIC;
|
||||
flags |= MP_IMGFLAG_PRESERVE;
|
||||
}
|
||||
flags|=(!avctx->hurry_up && ctx->do_slices) ?
|
||||
MP_IMGFLAG_DRAW_CALLBACK:0;
|
||||
}else{
|
||||
ctx->ip_count++;
|
||||
flags|= MP_IMGFLAG_PRESERVE|MP_IMGFLAG_READABLE
|
||||
| (ctx->do_slices ? MP_IMGFLAG_DRAW_CALLBACK : 0);
|
||||
MP_IMGFLAG_DRAW_CALLBACK:0;
|
||||
mp_msg(MSGT_DECVIDEO, MSGL_DBG2, type == MP_IMGTYPE_STATIC ? "using STATIC\n" : "using TEMP\n");
|
||||
} else {
|
||||
if(!pic->reference){
|
||||
ctx->b_count++;
|
||||
flags|=(!avctx->hurry_up && ctx->do_slices) ?
|
||||
MP_IMGFLAG_DRAW_CALLBACK:0;
|
||||
}else{
|
||||
ctx->ip_count++;
|
||||
flags|= MP_IMGFLAG_PRESERVE|MP_IMGFLAG_READABLE
|
||||
| (ctx->do_slices ? MP_IMGFLAG_DRAW_CALLBACK : 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(init_vo(sh,avctx->pix_fmt) < 0){
|
||||
if(init_vo(sh, avctx->pix_fmt) < 0){
|
||||
avctx->release_buffer= avcodec_default_release_buffer;
|
||||
avctx->get_buffer= avcodec_default_get_buffer;
|
||||
return avctx->get_buffer(avctx, pic);
|
||||
}
|
||||
|
||||
if (!pic->buffer_hints) {
|
||||
if(ctx->b_count>1 || ctx->ip_count>2){
|
||||
mp_msg(MSGT_DECVIDEO, MSGL_WARN, MSGTR_MPCODECS_DRIFailure);
|
||||
if (IMGFMT_IS_XVMC(ctx->best_csp)) {
|
||||
type = MP_IMGTYPE_NUMBERED | (0xffff << 16);
|
||||
} else
|
||||
if (!pic->buffer_hints) {
|
||||
if(ctx->b_count>1 || ctx->ip_count>2){
|
||||
mp_msg(MSGT_DECVIDEO, MSGL_WARN, MSGTR_MPCODECS_DRIFailure);
|
||||
|
||||
ctx->do_dr1=0; //FIXME
|
||||
avctx->get_buffer= avcodec_default_get_buffer;
|
||||
return avctx->get_buffer(avctx, pic);
|
||||
ctx->do_dr1=0; //FIXME
|
||||
avctx->get_buffer= avcodec_default_get_buffer;
|
||||
return avctx->get_buffer(avctx, pic);
|
||||
}
|
||||
|
||||
if(avctx->has_b_frames){
|
||||
type= MP_IMGTYPE_IPB;
|
||||
}else{
|
||||
type= MP_IMGTYPE_IP;
|
||||
}
|
||||
mp_msg(MSGT_DECVIDEO, MSGL_DBG2, type== MP_IMGTYPE_IPB ? "using IPB\n" : "using IP\n");
|
||||
}
|
||||
|
||||
if(avctx->has_b_frames){
|
||||
type= MP_IMGTYPE_IPB;
|
||||
}else{
|
||||
type= MP_IMGTYPE_IP;
|
||||
}
|
||||
mp_msg(MSGT_DECVIDEO,MSGL_DBG2, type== MP_IMGTYPE_IPB ? "using IPB\n" : "using IP\n");
|
||||
}
|
||||
|
||||
mpi= mpcodecs_get_image(sh,type, flags,
|
||||
mpi= mpcodecs_get_image(sh, type, flags,
|
||||
(width+align)&(~align), (height+align)&(~align));
|
||||
|
||||
// ok, let's see what did we get:
|
||||
if( mpi->flags&MP_IMGFLAG_DRAW_CALLBACK &&
|
||||
if(mpi->flags&MP_IMGFLAG_DRAW_CALLBACK &&
|
||||
!(mpi->flags&MP_IMGFLAG_DIRECT)){
|
||||
// nice, filter/vo likes draw_callback :)
|
||||
avctx->draw_horiz_band= draw_slice;
|
||||
} else
|
||||
avctx->draw_horiz_band= NULL;
|
||||
#if CONFIG_XVMC
|
||||
if(IMGFMT_IS_XVMC(mpi->imgfmt)) {
|
||||
struct xvmc_pix_fmt *render = mpi->priv; //same as data[2]
|
||||
avctx->draw_horiz_band= draw_slice;
|
||||
if(!avctx->xvmc_acceleration) {
|
||||
mp_msg(MSGT_DECVIDEO, MSGL_INFO, MSGTR_MPCODECS_McGetBufferShouldWorkOnlyWithXVMC);
|
||||
assert(0);
|
||||
exit(1);
|
||||
// return -1;//!!fixme check error conditions in ffmpeg
|
||||
}
|
||||
if(!(mpi->flags & MP_IMGFLAG_DIRECT)) {
|
||||
mp_msg(MSGT_DECVIDEO, MSGL_ERR, MSGTR_MPCODECS_OnlyBuffersAllocatedByVoXvmcAllowed);
|
||||
assert(0);
|
||||
exit(1);
|
||||
// return -1;//!!fixme check error conditions in ffmpeg
|
||||
}
|
||||
if(mp_msg_test(MSGT_DECVIDEO, MSGL_DBG5))
|
||||
mp_msg(MSGT_DECVIDEO, MSGL_DBG5, "vd_ffmpeg::get_buffer (xvmc render=%p)\n", render);
|
||||
assert(render != 0);
|
||||
assert(render->xvmc_id == AV_XVMC_ID);
|
||||
render->state |= AV_XVMC_STATE_PREDICTION;
|
||||
}
|
||||
#endif
|
||||
|
||||
// Palette support: libavcodec copies palette to *data[1]
|
||||
if (mpi->bpp == 8)
|
||||
mpi->planes[1] = av_malloc(AVPALETTE_SIZE);
|
||||
// Palette support: libavcodec copies palette to *data[1]
|
||||
if (mpi->bpp == 8)
|
||||
mpi->planes[1] = av_malloc(AVPALETTE_SIZE);
|
||||
|
||||
pic->data[0]= mpi->planes[0];
|
||||
pic->data[1]= mpi->planes[1];
|
||||
@ -651,23 +643,37 @@ else
|
||||
}
|
||||
|
||||
static void release_buffer(struct AVCodecContext *avctx, AVFrame *pic){
|
||||
mp_image_t* mpi= pic->opaque;
|
||||
sh_video_t * sh = avctx->opaque;
|
||||
mp_image_t *mpi= pic->opaque;
|
||||
sh_video_t *sh = avctx->opaque;
|
||||
vd_ffmpeg_ctx *ctx = sh->context;
|
||||
int i;
|
||||
|
||||
//printf("release buffer %d %d %d\n", mpi ? mpi->flags&MP_IMGFLAG_PRESERVE : -99, ctx->ip_count, ctx->b_count);
|
||||
|
||||
if(ctx->ip_count <= 2 && ctx->b_count<=1){
|
||||
if(mpi->flags&MP_IMGFLAG_PRESERVE)
|
||||
ctx->ip_count--;
|
||||
else
|
||||
ctx->b_count--;
|
||||
}
|
||||
if(ctx->ip_count <= 2 && ctx->b_count<=1){
|
||||
if(mpi->flags&MP_IMGFLAG_PRESERVE)
|
||||
ctx->ip_count--;
|
||||
else
|
||||
ctx->b_count--;
|
||||
}
|
||||
|
||||
if (mpi) {
|
||||
// Palette support: free palette buffer allocated in get_buffer
|
||||
if ( mpi && (mpi->bpp == 8))
|
||||
av_freep(&mpi->planes[1]);
|
||||
if (mpi->bpp == 8)
|
||||
av_freep(&mpi->planes[1]);
|
||||
#if CONFIG_XVMC
|
||||
if (IMGFMT_IS_XVMC(mpi->imgfmt)) {
|
||||
struct xvmc_pix_fmt *render = (struct xvmc_pix_fmt*)pic->data[2]; //same as mpi->priv
|
||||
if(mp_msg_test(MSGT_DECVIDEO, MSGL_DBG5))
|
||||
mp_msg(MSGT_DECVIDEO, MSGL_DBG5, "vd_ffmpeg::release_buffer (xvmc render=%p)\n", render);
|
||||
assert(render!=NULL);
|
||||
assert(render->xvmc_id == AV_XVMC_ID);
|
||||
render->state&=~AV_XVMC_STATE_PREDICTION;
|
||||
}
|
||||
#endif
|
||||
// release mpi (in case MPI_IMGTYPE_NUMBERED is used, e.g. for VDPAU)
|
||||
mpi->flags &= ~MP_IMGFLAG_IN_USE;
|
||||
}
|
||||
|
||||
if(pic->type!=FF_BUFFER_TYPE_USER){
|
||||
avcodec_default_release_buffer(avctx, pic);
|
||||
@ -697,14 +703,14 @@ static void swap_palette(void *pal) {
|
||||
}
|
||||
|
||||
// decode a frame
|
||||
static mp_image_t* decode(sh_video_t *sh,void* data,int len,int flags){
|
||||
static mp_image_t *decode(sh_video_t *sh, void *data, int len, int flags){
|
||||
int got_picture=0;
|
||||
int ret;
|
||||
vd_ffmpeg_ctx *ctx = sh->context;
|
||||
AVFrame *pic= ctx->pic;
|
||||
AVCodecContext *avctx = ctx->avctx;
|
||||
struct lavc_param *lavc_param = &sh->opts->lavc_param;
|
||||
mp_image_t* mpi=NULL;
|
||||
mp_image_t *mpi=NULL;
|
||||
int dr1= ctx->do_dr1;
|
||||
|
||||
if(len<=0) return NULL; // skipped frame
|
||||
@ -731,7 +737,7 @@ static mp_image_t* decode(sh_video_t *sh,void* data,int len,int flags){
|
||||
&got_picture, data, len);
|
||||
|
||||
dr1= ctx->do_dr1;
|
||||
if(ret<0) mp_msg(MSGT_DECVIDEO,MSGL_WARN, "Error while decoding frame!\n");
|
||||
if(ret<0) mp_msg(MSGT_DECVIDEO, MSGL_WARN, "Error while decoding frame!\n");
|
||||
//printf("repeat: %d\n", pic->repeat_pict);
|
||||
//-- vstats generation
|
||||
while(lavc_param->vstats){ // always one time loop
|
||||
@ -750,7 +756,7 @@ static mp_image_t* decode(sh_video_t *sh,void* data,int len,int flags){
|
||||
today = localtime(&today2);
|
||||
sprintf(filename, "vstats_%02d%02d%02d.log", today->tm_hour,
|
||||
today->tm_min, today->tm_sec);
|
||||
fvstats = fopen(filename,"w");
|
||||
fvstats = fopen(filename, "w");
|
||||
if(!fvstats) {
|
||||
perror("fopen");
|
||||
lavc_param->vstats=0; // disable block
|
||||
@ -765,8 +771,8 @@ static mp_image_t* decode(sh_video_t *sh,void* data,int len,int flags){
|
||||
int w = ((avctx->width << ctx->lowres)+15) >> 4;
|
||||
int h = ((avctx->height << ctx->lowres)+15) >> 4;
|
||||
int8_t *q = pic->qscale_table;
|
||||
for( y = 0; y < h; y++ ) {
|
||||
for( x = 0; x < w; x++ )
|
||||
for(y = 0; y < h; y++) {
|
||||
for(x = 0; x < w; x++)
|
||||
quality += (double)*(q+x);
|
||||
q += pic->qstride;
|
||||
}
|
||||
@ -808,10 +814,10 @@ static mp_image_t* decode(sh_video_t *sh,void* data,int len,int flags){
|
||||
|
||||
if(!got_picture) return NULL; // skipped image
|
||||
|
||||
if(init_vo(sh,avctx->pix_fmt) < 0) return NULL;
|
||||
if(init_vo(sh, avctx->pix_fmt) < 0) return NULL;
|
||||
|
||||
if(dr1 && pic->opaque){
|
||||
mpi= (mp_image_t*)pic->opaque;
|
||||
mpi= (mp_image_t *)pic->opaque;
|
||||
}
|
||||
|
||||
if(!mpi)
|
||||
@ -859,163 +865,34 @@ static mp_image_t* decode(sh_video_t *sh,void* data,int len,int flags){
|
||||
}
|
||||
|
||||
#if CONFIG_XVMC
|
||||
static enum PixelFormat get_format(struct AVCodecContext * avctx,
|
||||
const enum PixelFormat * fmt){
|
||||
sh_video_t * sh = avctx->opaque;
|
||||
int i;
|
||||
static enum PixelFormat get_format(struct AVCodecContext *avctx,
|
||||
const enum PixelFormat *fmt){
|
||||
enum PixelFormat selected_format = fmt[0];
|
||||
int imgfmt;
|
||||
sh_video_t *sh = avctx->opaque;
|
||||
int i;
|
||||
|
||||
if(avctx->xvmc_acceleration){
|
||||
for(i=0;fmt[i]!=PIX_FMT_NONE;i++){
|
||||
imgfmt = pixfmt2imgfmt(fmt[i]);
|
||||
if(!IMGFMT_IS_XVMC(imgfmt)) continue;
|
||||
mp_msg(MSGT_DECVIDEO, MSGL_INFO, MSGTR_MPCODECS_TryingPixfmt, i);
|
||||
if(init_vo(sh, fmt[i]) >= 0) {
|
||||
selected_format = fmt[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
imgfmt = pixfmt2imgfmt(selected_format);
|
||||
if(IMGFMT_IS_XVMC(imgfmt)) {
|
||||
vd_ffmpeg_ctx *ctx = sh->context;
|
||||
avctx->get_buffer= mc_get_buffer;
|
||||
avctx->release_buffer= mc_release_buffer;
|
||||
avctx->draw_horiz_band = mc_render_slice;
|
||||
avctx->get_buffer= get_buffer;
|
||||
avctx->release_buffer= release_buffer;
|
||||
avctx->draw_horiz_band = draw_slice;
|
||||
mp_msg(MSGT_DECVIDEO, MSGL_INFO, MSGTR_MPCODECS_XVMCAcceleratedMPEG2);
|
||||
assert(ctx->do_dr1);//these are must to!
|
||||
assert(ctx->do_slices); //it is (vo_)ffmpeg bug if this fails
|
||||
avctx->flags|= CODEC_FLAG_EMU_EDGE;//do i need that??!!
|
||||
avctx->slice_flags=SLICE_FLAG_CODED_ORDER|SLICE_FLAG_ALLOW_FIELD;
|
||||
}
|
||||
for(i=0;fmt[i]!=-1;i++){
|
||||
mp_msg(MSGT_DECVIDEO, MSGL_INFO, MSGTR_MPCODECS_TryingPixfmt,i);
|
||||
if( init_vo(sh,fmt[i]) >= 0)
|
||||
return fmt[i];
|
||||
}
|
||||
return fmt[0];
|
||||
}
|
||||
|
||||
static int mc_get_buffer(AVCodecContext *avctx, AVFrame *pic){
|
||||
sh_video_t * sh = avctx->opaque;
|
||||
vd_ffmpeg_ctx *ctx = sh->context;
|
||||
mp_image_t* mpi=NULL;
|
||||
struct xvmc_render_state * render;
|
||||
int flags= MP_IMGFLAG_ACCEPT_STRIDE | MP_IMGFLAG_PREFER_ALIGNED_STRIDE|
|
||||
MP_IMGFLAG_DRAW_CALLBACK;
|
||||
|
||||
// printf("vd_ffmpeg::mc_get_buffer (xvmc) %d %d %d\n", pic->reference, ctx->ip_count, ctx->b_count);
|
||||
if(!avctx->xvmc_acceleration){
|
||||
mp_msg(MSGT_DECVIDEO, MSGL_INFO, MSGTR_MPCODECS_McGetBufferShouldWorkOnlyWithXVMC);
|
||||
assert(0);
|
||||
exit(1);
|
||||
// return -1;//!!fixme check error conditions
|
||||
}
|
||||
assert(avctx->draw_horiz_band == mc_render_slice);
|
||||
assert(avctx->release_buffer == mc_release_buffer);
|
||||
if( mp_msg_test(MSGT_DECVIDEO,MSGL_DBG5) )
|
||||
mp_msg(MSGT_DECVIDEO, MSGL_DBG5, "vd_ffmpeg::mc_get_buffer\n");
|
||||
|
||||
if(init_vo(sh,avctx->pix_fmt) < 0){
|
||||
mp_msg(MSGT_DECVIDEO, MSGL_WARN, MSGTR_MPCODECS_UnexpectedInitVoError);
|
||||
exit(1);
|
||||
// return -1;//!!fixme check error conditions
|
||||
}
|
||||
|
||||
|
||||
|
||||
if(!pic->reference){
|
||||
ctx->b_count++;
|
||||
}else{
|
||||
ctx->ip_count++;
|
||||
flags|= MP_IMGFLAG_PRESERVE|MP_IMGFLAG_READABLE;
|
||||
}
|
||||
|
||||
mpi= mpcodecs_get_image(sh, MP_IMGTYPE_IPB,flags ,
|
||||
avctx->width, avctx->height);
|
||||
if(mpi==NULL){
|
||||
mp_msg(MSGT_DECVIDEO, MSGL_ERR, MSGTR_MPCODECS_UnrecoverableErrorRenderBuffersNotTaken);
|
||||
assert(0);
|
||||
exit(1);
|
||||
// return -1;//!!fixme check error conditions in ffmpeg
|
||||
};
|
||||
|
||||
if( (mpi->flags & MP_IMGFLAG_DIRECT) == 0){
|
||||
mp_msg(MSGT_DECVIDEO, MSGL_ERR, MSGTR_MPCODECS_OnlyBuffersAllocatedByVoXvmcAllowed);
|
||||
assert(0);
|
||||
exit(1);
|
||||
// return -1;//!!fixme check error conditions in ffmpeg
|
||||
}
|
||||
|
||||
pic->data[0]= mpi->planes[0];
|
||||
pic->data[1]= mpi->planes[1];
|
||||
pic->data[2]= mpi->planes[2];
|
||||
|
||||
|
||||
/* Note, some (many) codecs in libavcodec must have stride1==stride2 && no changes between frames
|
||||
* lavc will check that and die with an error message, if its not true
|
||||
*/
|
||||
pic->linesize[0]= mpi->stride[0];
|
||||
pic->linesize[1]= mpi->stride[1];
|
||||
pic->linesize[2]= mpi->stride[2];
|
||||
|
||||
pic->opaque = mpi;
|
||||
|
||||
if(pic->reference){
|
||||
//I or P frame
|
||||
pic->age= ctx->ip_age[0];
|
||||
|
||||
ctx->ip_age[0]= ctx->ip_age[1]+1;
|
||||
ctx->ip_age[1]= 1;
|
||||
ctx->b_age++;
|
||||
}else{
|
||||
//B frame
|
||||
pic->age= ctx->b_age;
|
||||
|
||||
ctx->ip_age[0]++;
|
||||
ctx->ip_age[1]++;
|
||||
ctx->b_age=1;
|
||||
}
|
||||
|
||||
pic->type= FF_BUFFER_TYPE_USER;
|
||||
|
||||
render=(struct xvmc_render_state*)mpi->priv;//same as data[2]
|
||||
if( mp_msg_test(MSGT_DECVIDEO,MSGL_DBG5) )
|
||||
mp_msg(MSGT_DECVIDEO, MSGL_DBG5, "vd_ffmpeg::mc_get_buffer (render=%p)\n",render);
|
||||
assert(render != 0);
|
||||
assert(render->magic == MP_XVMC_RENDER_MAGIC);
|
||||
render->state |= MP_XVMC_STATE_PREDICTION;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static void mc_release_buffer(AVCodecContext *avctx, AVFrame *pic){
|
||||
mp_image_t* mpi= pic->opaque;
|
||||
sh_video_t * sh = avctx->opaque;
|
||||
vd_ffmpeg_ctx *ctx = sh->context;
|
||||
struct xvmc_render_state * render;
|
||||
int i;
|
||||
|
||||
|
||||
if(ctx->ip_count <= 2 && ctx->b_count<=1){
|
||||
if(mpi->flags&MP_IMGFLAG_PRESERVE)
|
||||
ctx->ip_count--;
|
||||
else
|
||||
ctx->b_count--;
|
||||
}
|
||||
|
||||
//printf("R%X %X\n", pic->linesize[0], pic->data[0]);
|
||||
//mark the surface as not requared for prediction
|
||||
render=(struct xvmc_render_state*)pic->data[2];//same as mpi->priv
|
||||
if( mp_msg_test(MSGT_DECVIDEO,MSGL_DBG5) )
|
||||
mp_msg(MSGT_DECVIDEO, MSGL_DBG5, "vd_ffmpeg::mc_release_buffer (render=%p)\n",render);
|
||||
assert(render!=NULL);
|
||||
assert(render->magic==MP_XVMC_RENDER_MAGIC);
|
||||
render->state&=~MP_XVMC_STATE_PREDICTION;
|
||||
for(i=0; i<4; i++){
|
||||
pic->data[i]= NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static void mc_render_slice(struct AVCodecContext *s,
|
||||
const AVFrame *src, int offset[4],
|
||||
int y, int type, int height){
|
||||
int width= s->width;
|
||||
sh_video_t * sh = s->opaque;
|
||||
uint8_t *source[3]= {src->data[0], src->data[1], src->data[2]};
|
||||
|
||||
assert(src->linesize[0]==0 && src->linesize[1]==0 && src->linesize[2]==0);
|
||||
assert(offset[0]==0 && offset[1]==0 && offset[2]==0);
|
||||
|
||||
mpcodecs_draw_slice (sh, source, src->linesize, width, height, 0, y);
|
||||
|
||||
return selected_format;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_XVMC */
|
||||
|
@ -252,6 +252,7 @@ void vf_mpi_clear(mp_image_t* mpi,int x0,int y0,int w,int h){
|
||||
mp_image_t* vf_get_image(vf_instance_t* vf, unsigned int outfmt, int mp_imgtype, int mp_imgflag, int w, int h){
|
||||
mp_image_t* mpi=NULL;
|
||||
int w2;
|
||||
int number = mp_imgtype >> 16;
|
||||
|
||||
#ifdef MP_DEBUG
|
||||
assert(w == -1 || w >= vf->w);
|
||||
@ -274,7 +275,7 @@ mp_image_t* vf_get_image(vf_instance_t* vf, unsigned int outfmt, int mp_imgtype,
|
||||
|
||||
// Note: we should call libvo first to check if it supports direct rendering
|
||||
// and if not, then fallback to software buffers:
|
||||
switch(mp_imgtype){
|
||||
switch(mp_imgtype & 0xff){
|
||||
case MP_IMGTYPE_EXPORT:
|
||||
if(!vf->imgctx.export_images[0]) vf->imgctx.export_images[0]=new_mp_image(w2,h);
|
||||
mpi=vf->imgctx.export_images[0];
|
||||
@ -298,6 +299,19 @@ mp_image_t* vf_get_image(vf_instance_t* vf, unsigned int outfmt, int mp_imgtype,
|
||||
mpi=vf->imgctx.static_images[vf->imgctx.static_idx];
|
||||
vf->imgctx.static_idx^=1;
|
||||
break;
|
||||
case MP_IMGTYPE_NUMBERED:
|
||||
if (number == -1) {
|
||||
int i;
|
||||
for (i = 0; i < NUM_NUMBERED_MPI; i++)
|
||||
if (!vf->imgctx.numbered_images[i] || !(vf->imgctx.numbered_images[i]->flags & MP_IMGFLAG_IN_USE))
|
||||
break;
|
||||
number = i;
|
||||
}
|
||||
if (number < 0 || number >= NUM_NUMBERED_MPI) return NULL;
|
||||
if (!vf->imgctx.numbered_images[number]) vf->imgctx.numbered_images[number] = new_mp_image(w2,h);
|
||||
mpi = vf->imgctx.numbered_images[number];
|
||||
mpi->number = number;
|
||||
break;
|
||||
}
|
||||
if(mpi){
|
||||
mpi->type=mp_imgtype;
|
||||
@ -305,6 +319,7 @@ mp_image_t* vf_get_image(vf_instance_t* vf, unsigned int outfmt, int mp_imgtype,
|
||||
// keep buffer allocation status & color flags only:
|
||||
// mpi->flags&=~(MP_IMGFLAG_PRESERVE|MP_IMGFLAG_READABLE|MP_IMGFLAG_DIRECT);
|
||||
mpi->flags&=MP_IMGFLAG_ALLOCATED|MP_IMGFLAG_TYPE_DISPLAYED|MP_IMGFLAGMASK_COLORS;
|
||||
mpi->flags |= MP_IMGFLAG_IN_USE;
|
||||
// accept restrictions & draw_slice flags only:
|
||||
mpi->flags|=mp_imgflag&(MP_IMGFLAGMASK_RESTRICTIONS|MP_IMGFLAG_DRAW_CALLBACK);
|
||||
if(!vf->draw_slice) mpi->flags&=~MP_IMGFLAG_DRAW_CALLBACK;
|
||||
|
@ -17,10 +17,13 @@ typedef struct vf_info_s {
|
||||
const void* opts;
|
||||
} vf_info_t;
|
||||
|
||||
#define NUM_NUMBERED_MPI 50
|
||||
|
||||
typedef struct vf_image_context_s {
|
||||
mp_image_t* static_images[2];
|
||||
mp_image_t* temp_images[1];
|
||||
mp_image_t* export_images[1];
|
||||
mp_image_t* numbered_images[NUM_NUMBERED_MPI];
|
||||
int static_idx;
|
||||
} vf_image_context_t;
|
||||
|
||||
|
@ -164,7 +164,11 @@ static int query_format(struct vf_instance* vf, unsigned int fmt){
|
||||
|
||||
static void get_image(struct vf_instance* vf,
|
||||
mp_image_t *mpi){
|
||||
if(vo_directrendering && video_out->config_ok)
|
||||
if (!video_out->config_ok)
|
||||
return;
|
||||
// GET_IMAGE is required for hardware-accelerated formats
|
||||
if(vo_directrendering ||
|
||||
IMGFMT_IS_XVMC(mpi->imgfmt) || IMGFMT_IS_VDPAU(mpi->imgfmt))
|
||||
vo_control(video_out, VOCTRL_GET_IMAGE, mpi);
|
||||
}
|
||||
|
||||
|
@ -96,8 +96,6 @@ typedef struct {
|
||||
int video_curpos; ///< Current file position for video demuxing
|
||||
int a_num_of_packets; ///< Number of audio packets
|
||||
int v_num_of_packets; ///< Number of video packets
|
||||
int a_idx_ptr; ///< Audio index position pointer
|
||||
int v_idx_ptr; ///< Video index position pointer
|
||||
int a_bitrate; ///< Audio bitrate
|
||||
int v_bitrate; ///< Video bitrate
|
||||
int stream_switch; ///< Flag used to switch audio/video demuxing
|
||||
@ -142,7 +140,7 @@ static void dump_index(demuxer_t *demuxer, int stream_id)
|
||||
real_index_table_t *index;
|
||||
int i, entries;
|
||||
|
||||
if ( mp_msg_test(MSGT_DEMUX,MSGL_V) )
|
||||
if (!mp_msg_test(MSGT_DEMUX,MSGL_V))
|
||||
return;
|
||||
|
||||
if ((unsigned)stream_id >= MAX_STREAMS)
|
||||
@ -583,9 +581,9 @@ static int demux_real_fill_buffer(demuxer_t *demuxer, demux_stream_t *dsds)
|
||||
|
||||
/* Handle audio/video demxing switch for multirate files (non-interleaved) */
|
||||
if (priv->is_multirate && priv->stream_switch) {
|
||||
if (priv->a_idx_ptr >= priv->index_table_size[demuxer->audio->id])
|
||||
if (priv->current_apacket >= priv->index_table_size[demuxer->audio->id])
|
||||
demuxer->audio->eof = 1;
|
||||
if (priv->v_idx_ptr >= priv->index_table_size[demuxer->video->id])
|
||||
if (priv->current_vpacket >= priv->index_table_size[demuxer->video->id])
|
||||
demuxer->video->eof = 1;
|
||||
if (demuxer->audio->eof && demuxer->video->eof)
|
||||
return 0;
|
||||
@ -593,8 +591,8 @@ static int demux_real_fill_buffer(demuxer_t *demuxer, demux_stream_t *dsds)
|
||||
stream_seek(demuxer->stream, priv->audio_curpos); // Get audio
|
||||
else if (demuxer->audio->eof && !demuxer->video->eof)
|
||||
stream_seek(demuxer->stream, priv->video_curpos); // Get video
|
||||
else if (priv->index_table[demuxer->audio->id][priv->a_idx_ptr].timestamp <
|
||||
priv->index_table[demuxer->video->id][priv->v_idx_ptr].timestamp)
|
||||
else if (priv->index_table[demuxer->audio->id][priv->current_apacket].timestamp <
|
||||
priv->index_table[demuxer->video->id][priv->current_vpacket].timestamp)
|
||||
stream_seek(demuxer->stream, priv->audio_curpos); // Get audio
|
||||
else
|
||||
stream_seek(demuxer->stream, priv->video_curpos); // Get video
|
||||
@ -829,18 +827,15 @@ got_audio:
|
||||
} // codec_id check, codec default case
|
||||
}
|
||||
// we will not use audio index if we use -idx and have a video
|
||||
if(!demuxer->video->sh && index_mode == 2 && (unsigned)demuxer->audio->id < MAX_STREAMS)
|
||||
if(((!demuxer->video->sh && index_mode == 2) || priv->is_multirate) && (unsigned)demuxer->audio->id < MAX_STREAMS) {
|
||||
while (priv->current_apacket + 1 < priv->index_table_size[demuxer->audio->id] &&
|
||||
timestamp > priv->index_table[demuxer->audio->id][priv->current_apacket].timestamp)
|
||||
timestamp > priv->index_table[demuxer->audio->id][priv->current_apacket].timestamp) {
|
||||
priv->current_apacket += 1;
|
||||
|
||||
if(priv->is_multirate)
|
||||
while (priv->a_idx_ptr + 1 < priv->index_table_size[demuxer->audio->id] &&
|
||||
timestamp > priv->index_table[demuxer->audio->id][priv->a_idx_ptr + 1].timestamp) {
|
||||
priv->a_idx_ptr++;
|
||||
priv->audio_curpos = stream_tell(demuxer->stream);
|
||||
priv->stream_switch = 1;
|
||||
}
|
||||
if (priv->stream_switch)
|
||||
priv->audio_curpos = stream_tell(demuxer->stream);
|
||||
}
|
||||
|
||||
// If we're reordering audio packets and we need more data get it
|
||||
if (audioreorder_getnextpk)
|
||||
@ -1029,19 +1024,16 @@ got_video:
|
||||
if(len>0) stream_skip(demuxer->stream, len);
|
||||
}
|
||||
}
|
||||
if ((unsigned)demuxer->video->id < MAX_STREAMS)
|
||||
if ((unsigned)demuxer->video->id < MAX_STREAMS) {
|
||||
while (priv->current_vpacket + 1 < priv->index_table_size[demuxer->video->id] &&
|
||||
timestamp > priv->index_table[demuxer->video->id][priv->current_vpacket + 1].timestamp)
|
||||
timestamp > priv->index_table[demuxer->video->id][priv->current_vpacket + 1].timestamp) {
|
||||
priv->current_vpacket += 1;
|
||||
|
||||
if(priv->is_multirate)
|
||||
while (priv->v_idx_ptr + 1 < priv->index_table_size[demuxer->video->id] &&
|
||||
timestamp > priv->index_table[demuxer->video->id][priv->v_idx_ptr + 1].timestamp) {
|
||||
priv->v_idx_ptr++;
|
||||
priv->video_curpos = stream_tell(demuxer->stream);
|
||||
priv->stream_switch = 1;
|
||||
}
|
||||
|
||||
if (priv->stream_switch)
|
||||
priv->video_curpos = stream_tell(demuxer->stream);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -1722,9 +1714,6 @@ header_end:
|
||||
break;
|
||||
}
|
||||
|
||||
if(priv->is_multirate)
|
||||
demuxer->seekable = 0; // No seeking yet for multirate streams
|
||||
|
||||
// detect streams:
|
||||
if(demuxer->video->id==-1 && v_streams>0){
|
||||
// find the valid video stream:
|
||||
@ -1826,7 +1815,7 @@ static void demux_seek_real(demuxer_t *demuxer, float rel_seek_secs, float audio
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (rel_seek_secs < 0)
|
||||
else if (rel_seek_secs < 0) {
|
||||
while ((cur_timestamp - priv->index_table[vid][priv->current_vpacket].timestamp) < - rel_seek_secs * 1000){
|
||||
priv->current_vpacket -= 1;
|
||||
if (priv->current_vpacket < 0) {
|
||||
@ -1834,12 +1823,16 @@ static void demux_seek_real(demuxer_t *demuxer, float rel_seek_secs, float audio
|
||||
break;
|
||||
}
|
||||
}
|
||||
next_offset = priv->index_table[vid][priv->current_vpacket].offset;
|
||||
priv->audio_need_keyframe = 1;
|
||||
}
|
||||
priv->video_curpos = priv->index_table[vid][priv->current_vpacket].offset;
|
||||
priv->audio_need_keyframe = !priv->is_multirate;
|
||||
priv->video_after_seek = 1;
|
||||
}
|
||||
else if (streams & 2) {
|
||||
cur_timestamp = priv->index_table[aid][priv->current_apacket].timestamp;
|
||||
if (streams & 2) {
|
||||
if (!(streams & 1)) {
|
||||
cur_timestamp =
|
||||
priv->index_table[aid][priv->current_apacket].timestamp;
|
||||
}
|
||||
if (rel_seek_secs > 0)
|
||||
while ((priv->index_table[aid][priv->current_apacket].timestamp - cur_timestamp) < rel_seek_secs * 1000){
|
||||
priv->current_apacket += 1;
|
||||
@ -1856,9 +1849,10 @@ static void demux_seek_real(demuxer_t *demuxer, float rel_seek_secs, float audio
|
||||
break;
|
||||
}
|
||||
}
|
||||
next_offset = priv->index_table[aid][priv->current_apacket].offset;
|
||||
priv->audio_curpos = priv->index_table[aid][priv->current_apacket].offset;
|
||||
}
|
||||
// }
|
||||
next_offset = streams & 1 ? priv->video_curpos : priv->audio_curpos;
|
||||
// printf("seek: pos: %d, current packets: a: %d, v: %d\n",
|
||||
// next_offset, priv->current_apacket, priv->current_vpacket);
|
||||
if (next_offset)
|
||||
|
@ -2396,6 +2396,7 @@ SwsContext *sws_getContext(int srcW, int srcH, enum PixelFormat srcFormat, int d
|
||||
|
||||
#ifdef COMPILE_ALTIVEC
|
||||
if ((c->flags & SWS_CPU_CAPS_ALTIVEC) &&
|
||||
!(c->flags & SWS_BITEXACT) &&
|
||||
srcFormat == PIX_FMT_YUV420P) {
|
||||
// unscaled YV12 -> packed YUV, we want speed
|
||||
if (dstFormat == PIX_FMT_YUYV422)
|
||||
@ -2879,8 +2880,8 @@ SwsFilter *sws_getDefaultFilter(float lumaGBlur, float chromaGBlur,
|
||||
sws_normalizeVec(filter->lumH, 1.0);
|
||||
sws_normalizeVec(filter->lumV, 1.0);
|
||||
|
||||
if (verbose) sws_printVec(filter->chrH);
|
||||
if (verbose) sws_printVec(filter->lumH);
|
||||
if (verbose) sws_printVec2(filter->chrH, NULL, AV_LOG_DEBUG);
|
||||
if (verbose) sws_printVec2(filter->lumH, NULL, AV_LOG_DEBUG);
|
||||
|
||||
return filter;
|
||||
}
|
||||
@ -3067,7 +3068,7 @@ SwsVector *sws_cloneVec(SwsVector *a){
|
||||
return vec;
|
||||
}
|
||||
|
||||
void sws_printVec(SwsVector *a){
|
||||
void sws_printVec2(SwsVector *a, AVClass *log_ctx, int log_level){
|
||||
int i;
|
||||
double max=0;
|
||||
double min=0;
|
||||
@ -3084,12 +3085,18 @@ void sws_printVec(SwsVector *a){
|
||||
for (i=0; i<a->length; i++)
|
||||
{
|
||||
int x= (int)((a->coeff[i]-min)*60.0/range +0.5);
|
||||
av_log(NULL, AV_LOG_DEBUG, "%1.3f ", a->coeff[i]);
|
||||
for (;x>0; x--) av_log(NULL, AV_LOG_DEBUG, " ");
|
||||
av_log(NULL, AV_LOG_DEBUG, "|\n");
|
||||
av_log(log_ctx, log_level, "%1.3f ", a->coeff[i]);
|
||||
for (;x>0; x--) av_log(log_ctx, log_level, " ");
|
||||
av_log(log_ctx, log_level, "|\n");
|
||||
}
|
||||
}
|
||||
|
||||
#if LIBSWSCALE_VERSION_MAJOR < 1
|
||||
void sws_printVec(SwsVector *a){
|
||||
sws_printVec2(a, NULL, AV_LOG_DEBUG);
|
||||
}
|
||||
#endif
|
||||
|
||||
void sws_freeVec(SwsVector *a){
|
||||
if (!a) return;
|
||||
av_freep(&a->coeff);
|
||||
|
@ -30,8 +30,8 @@
|
||||
#include "libavutil/avutil.h"
|
||||
|
||||
#define LIBSWSCALE_VERSION_MAJOR 0
|
||||
#define LIBSWSCALE_VERSION_MINOR 6
|
||||
#define LIBSWSCALE_VERSION_MICRO 2
|
||||
#define LIBSWSCALE_VERSION_MINOR 7
|
||||
#define LIBSWSCALE_VERSION_MICRO 0
|
||||
|
||||
#define LIBSWSCALE_VERSION_INT AV_VERSION_INT(LIBSWSCALE_VERSION_MAJOR, \
|
||||
LIBSWSCALE_VERSION_MINOR, \
|
||||
@ -165,6 +165,11 @@ SwsVector *sws_getIdentityVec(void);
|
||||
* Scales all the coefficients of \p a by the \p scalar value.
|
||||
*/
|
||||
void sws_scaleVec(SwsVector *a, double scalar);
|
||||
|
||||
/**
|
||||
* Scales all the coefficients of \p a so that their sum equals \p
|
||||
* height."
|
||||
*/
|
||||
void sws_normalizeVec(SwsVector *a, double height);
|
||||
void sws_convVec(SwsVector *a, SwsVector *b);
|
||||
void sws_addVec(SwsVector *a, SwsVector *b);
|
||||
@ -177,7 +182,19 @@ void sws_shiftVec(SwsVector *a, int shift);
|
||||
*/
|
||||
SwsVector *sws_cloneVec(SwsVector *a);
|
||||
|
||||
void sws_printVec(SwsVector *a);
|
||||
#if LIBSWSCALE_VERSION_MAJOR < 1
|
||||
/**
|
||||
* @deprecated Use sws_printVec2() instead.
|
||||
*/
|
||||
attribute_deprecated void sws_printVec(SwsVector *a);
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Prints with av_log() a textual representation of the vector \p a
|
||||
* if \p log_level <= av_log_level.
|
||||
*/
|
||||
void sws_printVec2(SwsVector *a, AVClass *log_ctx, int log_level);
|
||||
|
||||
void sws_freeVec(SwsVector *a);
|
||||
|
||||
SwsFilter *sws_getDefaultFilter(float lumaGBlur, float chromaGBlur,
|
||||
|
@ -220,7 +220,7 @@ static inline void hScale_altivec_real(int16_t *dst, int dstW, uint8_t *src, int
|
||||
for (j=0; j<filterSize; j++) {
|
||||
val += ((int)src[srcPos + j])*filter[filterSize*i + j];
|
||||
}
|
||||
dst[i] = av_clip(val>>7, 0, (1<<15)-1);
|
||||
dst[i] = FFMIN(val>>7, (1<<15)-1);
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -259,7 +259,7 @@ static inline void hScale_altivec_real(int16_t *dst, int dstW, uint8_t *src, int
|
||||
val_vEven = vec_mule(src_v, filter_v);
|
||||
val_s = vec_sums(val_vEven, vzero);
|
||||
vec_st(val_s, 0, tempo);
|
||||
dst[i] = av_clip(tempo[3]>>7, 0, (1<<15)-1);
|
||||
dst[i] = FFMIN(tempo[3]>>7, (1<<15)-1);
|
||||
}
|
||||
}
|
||||
break;
|
||||
@ -286,7 +286,7 @@ static inline void hScale_altivec_real(int16_t *dst, int dstW, uint8_t *src, int
|
||||
val_v = vec_msums(src_v, filter_v, (vector signed int)vzero);
|
||||
val_s = vec_sums(val_v, vzero);
|
||||
vec_st(val_s, 0, tempo);
|
||||
dst[i] = av_clip(tempo[3]>>7, 0, (1<<15)-1);
|
||||
dst[i] = FFMIN(tempo[3]>>7, (1<<15)-1);
|
||||
}
|
||||
}
|
||||
break;
|
||||
@ -315,7 +315,7 @@ static inline void hScale_altivec_real(int16_t *dst, int dstW, uint8_t *src, int
|
||||
vector signed int val_s = vec_sums(val_v, vzero);
|
||||
|
||||
vec_st(val_s, 0, tempo);
|
||||
dst[i] = av_clip(tempo[3]>>7, 0, (1<<15)-1);
|
||||
dst[i] = FFMIN(tempo[3]>>7, (1<<15)-1);
|
||||
}
|
||||
}
|
||||
break;
|
||||
@ -377,7 +377,7 @@ static inline void hScale_altivec_real(int16_t *dst, int dstW, uint8_t *src, int
|
||||
val_s = vec_sums(val_v, vzero);
|
||||
|
||||
vec_st(val_s, 0, tempo);
|
||||
dst[i] = av_clip(tempo[3]>>7, 0, (1<<15)-1);
|
||||
dst[i] = FFMIN(tempo[3]>>7, (1<<15)-1);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1136,9 +1136,10 @@ static inline void RENAME(yuv2packedX)(SwsContext *c, int16_t *lumFilter, int16_
|
||||
#if HAVE_ALTIVEC
|
||||
/* The following list of supported dstFormat values should
|
||||
match what's found in the body of altivec_yuv2packedX() */
|
||||
if (c->dstFormat==PIX_FMT_ABGR || c->dstFormat==PIX_FMT_BGRA ||
|
||||
if (!(c->flags & SWS_BITEXACT) &&
|
||||
(c->dstFormat==PIX_FMT_ABGR || c->dstFormat==PIX_FMT_BGRA ||
|
||||
c->dstFormat==PIX_FMT_BGR24 || c->dstFormat==PIX_FMT_RGB24 ||
|
||||
c->dstFormat==PIX_FMT_RGBA || c->dstFormat==PIX_FMT_ARGB)
|
||||
c->dstFormat==PIX_FMT_RGBA || c->dstFormat==PIX_FMT_ARGB))
|
||||
altivec_yuv2packedX (c, lumFilter, lumSrc, lumFilterSize,
|
||||
chrFilter, chrSrc, chrFilterSize,
|
||||
dest, dstW, dstY);
|
||||
|
230
libvo/vo_xvmc.c
230
libvo/vo_xvmc.c
@ -42,23 +42,20 @@
|
||||
#include <X11/extensions/XvMClib.h>
|
||||
|
||||
#include "x11_common.h"
|
||||
#include "xvmc_render.h"
|
||||
#include "libavcodec/xvmc.h"
|
||||
|
||||
#include "sub.h"
|
||||
#include "aspect.h"
|
||||
|
||||
#include "subopt-helper.h"
|
||||
|
||||
#ifdef CONFIG_GUI
|
||||
#include "gui/interface.h"
|
||||
#endif
|
||||
|
||||
#include "libavutil/common.h"
|
||||
|
||||
//no chance for xinerama to be supported in the near future
|
||||
#undef CONFIG_XINERAMA
|
||||
|
||||
#undef NDEBUG
|
||||
#undef NDEBUG
|
||||
#include <assert.h>
|
||||
|
||||
|
||||
@ -75,7 +72,7 @@ static int use_sleep;
|
||||
static int first_frame;//draw colorkey on first frame
|
||||
static int use_queue;
|
||||
static int xv_port_request = 0;
|
||||
static int xv_adaptor = -1;
|
||||
static int xv_adaptor = -1;
|
||||
static int bob_deinterlace;
|
||||
static int top_field_first;
|
||||
|
||||
@ -101,13 +98,13 @@ static XvMCMacroBlockArray mv_blocks;
|
||||
#define MAX_SURFACES 8
|
||||
static int number_of_surfaces=0;
|
||||
static XvMCSurface surface_array[MAX_SURFACES];
|
||||
static struct xvmc_render_state * surface_render;
|
||||
static struct xvmc_pix_fmt *surface_render;
|
||||
|
||||
static struct xvmc_render_state * p_render_surface_to_show=NULL;
|
||||
static struct xvmc_render_state * p_render_surface_visible=NULL;
|
||||
static struct xvmc_pix_fmt *p_render_surface_to_show = NULL;
|
||||
static struct xvmc_pix_fmt *p_render_surface_visible = NULL;
|
||||
|
||||
//display queue, kinda render ahead
|
||||
static struct xvmc_render_state * show_queue[MAX_SURFACES];
|
||||
static struct xvmc_pix_fmt *show_queue[MAX_SURFACES];
|
||||
static int free_element;
|
||||
|
||||
|
||||
@ -135,7 +132,7 @@ static const struct{
|
||||
static void xvmc_free(void);
|
||||
static void xvmc_clean_surfaces(void);
|
||||
static int count_free_surfaces(void);
|
||||
static struct xvmc_render_state * find_free_surface(void);
|
||||
static struct xvmc_pix_fmt *find_free_surface(void);
|
||||
|
||||
static const vo_info_t info = {
|
||||
"XVideo Motion Compensation",
|
||||
@ -169,7 +166,7 @@ static void allocate_xvimage(int xvimage_width,int xvimage_height,int xv_format)
|
||||
}
|
||||
if ( Shmem_Flag )
|
||||
{
|
||||
xvimage = (XvImage *) XvShmCreateImage(mDisplay, xv_port, xv_format,
|
||||
xvimage = (XvImage *) XvShmCreateImage(mDisplay, xv_port, xv_format,
|
||||
NULL, xvimage_width, xvimage_height, &Shminfo);
|
||||
|
||||
Shminfo.shmid = shmget(IPC_PRIVATE, xvimage->data_size, IPC_CREAT | 0777);
|
||||
@ -213,16 +210,16 @@ static void deallocate_xvimage(void)
|
||||
//end of vo_xv shm/xvimage code
|
||||
|
||||
static int xvmc_check_surface_format(uint32_t format, XvMCSurfaceInfo * surf_info){
|
||||
if ( format == IMGFMT_XVMC_IDCT_MPEG2 ){
|
||||
if ( format == IMGFMT_XVMC_IDCT_MPEG2 ){
|
||||
if( surf_info->mc_type != (XVMC_IDCT|XVMC_MPEG_2) ) return -1;
|
||||
if( surf_info->chroma_format != XVMC_CHROMA_FORMAT_420 ) return -1;
|
||||
return 0;
|
||||
}
|
||||
if ( format == IMGFMT_XVMC_MOCO_MPEG2 ){
|
||||
}
|
||||
if ( format == IMGFMT_XVMC_MOCO_MPEG2 ){
|
||||
if(surf_info->mc_type != XVMC_MPEG_2) return -1;
|
||||
if(surf_info->chroma_format != XVMC_CHROMA_FORMAT_420) return -1;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return -1;//fail
|
||||
}
|
||||
|
||||
@ -230,7 +227,7 @@ return -1;//fail
|
||||
static void print_xvimage_format_values(XvImageFormatValues *xifv){
|
||||
int i;
|
||||
printf("Format_ID = 0x%X\n",xifv->id);
|
||||
|
||||
|
||||
printf(" type = ");
|
||||
if(xifv->type == XvRGB) printf("RGB\n");
|
||||
else if(xifv->type == XvYUV) printf("YUV\n");
|
||||
@ -270,7 +267,7 @@ int i;
|
||||
|
||||
printf(" component_order = ");
|
||||
for(i=0;i<32;i++)
|
||||
if(xifv->component_order[i]>=32)
|
||||
if(xifv->component_order[i]>=32)
|
||||
printf("%c",xifv->component_order[i]);
|
||||
printf("\n");
|
||||
|
||||
@ -309,13 +306,13 @@ XvMCSurfaceInfo * mc_surf_list;
|
||||
{
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG3) ) {
|
||||
printf("vo_xvmc: probing port #%ld\n",p); }
|
||||
mc_surf_list = XvMCListSurfaceTypes(mDisplay,p,&mc_surf_num);
|
||||
if( mc_surf_list == NULL || mc_surf_num == 0){
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG3) ) {
|
||||
mc_surf_list = XvMCListSurfaceTypes(mDisplay,p,&mc_surf_num);
|
||||
if( mc_surf_list == NULL || mc_surf_num == 0){
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG3) ) {
|
||||
printf("vo_xvmc: No XvMC supported. \n"); }
|
||||
continue;
|
||||
}
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG3) ) {
|
||||
continue;
|
||||
}
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG3) ) {
|
||||
printf("vo_xvmc: XvMC list have %d surfaces\n",mc_surf_num); }
|
||||
//we have XvMC list!
|
||||
for(s=0; s<mc_surf_num; s++)
|
||||
@ -332,18 +329,18 @@ XvMCSurfaceInfo * mc_surf_list;
|
||||
|
||||
if(!query){
|
||||
rez = XvGrabPort(mDisplay,p,CurrentTime);
|
||||
if(rez != Success){
|
||||
if ( mp_msg_test(MSGT_VO,MSGL_DBG3) ) {
|
||||
if(rez != Success){
|
||||
if ( mp_msg_test(MSGT_VO,MSGL_DBG3) ) {
|
||||
printf("vo_xvmc: Fail to grab port %ld\n",p); }
|
||||
continue;
|
||||
}
|
||||
printf("vo_xvmc: Using Xv Adaptor #%d (%s)\n", i, ai[i].name);
|
||||
printf("vo_xvmc: Port %ld grabed\n",p);
|
||||
xv_port = p;
|
||||
}
|
||||
goto surface_found;
|
||||
}//for mc surf
|
||||
XFree(mc_surf_list);//if mc_surf_num==0 is list==NULL ?
|
||||
continue;
|
||||
}
|
||||
printf("vo_xvmc: Using Xv Adaptor #%d (%s)\n", i, ai[i].name);
|
||||
printf("vo_xvmc: Port %ld grabed\n",p);
|
||||
xv_port = p;
|
||||
}
|
||||
goto surface_found;
|
||||
}//for mc surf
|
||||
XFree(mc_surf_list);//if mc_surf_num==0 is list==NULL ?
|
||||
}//for ports
|
||||
}//for adaptors
|
||||
XvFreeAdaptorInfo(ai);
|
||||
@ -363,19 +360,19 @@ surface_found:
|
||||
}
|
||||
|
||||
static uint32_t xvmc_draw_image(mp_image_t *mpi){
|
||||
struct xvmc_render_state * rndr;
|
||||
struct xvmc_pix_fmt *rndr;
|
||||
|
||||
assert(mpi!=NULL);
|
||||
assert(mpi->flags &MP_IMGFLAG_DIRECT);
|
||||
// assert(mpi->flags &MP_IMGFLAGS_DRAWBACK);
|
||||
|
||||
rndr = (struct xvmc_render_state*)mpi->priv;//there is copy in plane[2]
|
||||
rndr = (struct xvmc_pix_fmt*)mpi->priv; //there is copy in plane[2]
|
||||
assert( rndr != NULL );
|
||||
assert( rndr->magic == MP_XVMC_RENDER_MAGIC );
|
||||
assert( rndr->xvmc_id == AV_XVMC_ID );
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG4) )
|
||||
printf("vo_xvmc: draw_image(show rndr=%p)\n",rndr);
|
||||
// the surface have passed vf system without been skiped, it will be displayed
|
||||
rndr->state |= MP_XVMC_STATE_DISPLAY_PENDING;
|
||||
rndr->state |= AV_XVMC_STATE_DISPLAY_PENDING;
|
||||
p_render_surface_to_show = rndr;
|
||||
top_field_first = mpi->fields & MP_IMGFIELD_TOP_FIRST;
|
||||
return VO_TRUE;
|
||||
@ -388,7 +385,7 @@ int mc_ver,mc_rev;
|
||||
strarg_t ck_src_arg = { 0, NULL };
|
||||
strarg_t ck_method_arg = { 0, NULL };
|
||||
opt_t subopts [] =
|
||||
{
|
||||
{
|
||||
/* name arg type arg var test */
|
||||
{ "port", OPT_ARG_INT, &xv_port_request, (opt_test_f)int_pos },
|
||||
{ "adaptor", OPT_ARG_INT, &xv_adaptor, (opt_test_f)int_non_neg },
|
||||
@ -406,22 +403,22 @@ opt_t subopts [] =
|
||||
|
||||
//XvMC is subdivision of XVideo
|
||||
if (Success != XvQueryExtension(mDisplay,&xv_version,&xv_release,&xv_request_base,
|
||||
&xv_event_base,&xv_error_base) ){
|
||||
&xv_event_base,&xv_error_base) ){
|
||||
mp_msg(MSGT_VO,MSGL_ERR,"Sorry, Xv(MC) not supported by this X11 version/driver\n");
|
||||
mp_msg(MSGT_VO,MSGL_ERR,"********** Try with -vo x11 or -vo sdl ***********\n");
|
||||
return -1;
|
||||
}
|
||||
printf("vo_xvmc: X-Video extension %d.%d\n",xv_version,xv_release);
|
||||
|
||||
if( True != XvMCQueryExtension(mDisplay,&mc_eventBase,&mc_errorBase) ){
|
||||
if( True != XvMCQueryExtension(mDisplay,&mc_eventBase,&mc_errorBase) ){
|
||||
printf("vo_xvmc: No X-Video MotionCompensation Extension on %s\n",
|
||||
XDisplayName(NULL));
|
||||
XDisplayName(NULL));
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(Success == XvMCQueryVersion(mDisplay, &mc_ver, &mc_rev) ){
|
||||
printf("vo_xvmc: X-Video MotionCompensation Extension version %i.%i\n",
|
||||
mc_ver,mc_rev);
|
||||
mc_ver,mc_rev);
|
||||
}
|
||||
else{
|
||||
printf("vo_xvmc: Error querying version info!\n");
|
||||
@ -431,7 +428,7 @@ opt_t subopts [] =
|
||||
xv_port = 0;
|
||||
number_of_surfaces = 0;
|
||||
subpicture_alloc = 0;
|
||||
|
||||
|
||||
benchmark = 0; //disable PutImageto allow faster display than screen refresh
|
||||
use_sleep = 0;
|
||||
use_queue = 0;
|
||||
@ -449,8 +446,8 @@ opt_t subopts [] =
|
||||
}
|
||||
|
||||
static int config(uint32_t width, uint32_t height,
|
||||
uint32_t d_width, uint32_t d_height,
|
||||
uint32_t flags, char *title, uint32_t format){
|
||||
uint32_t d_width, uint32_t d_height,
|
||||
uint32_t flags, char *title, uint32_t format){
|
||||
int i,mode_id,rez;
|
||||
int numblocks,blocks_per_macroblock;//bpmb we have 6,8,12
|
||||
|
||||
@ -521,21 +518,19 @@ int vm = flags & VOFLAG_MODESWITCHING;
|
||||
printf("vo_xvmc: mv_blocks allocated\n");
|
||||
|
||||
if(surface_render==NULL)
|
||||
surface_render=malloc(MAX_SURFACES*sizeof(struct xvmc_render_state));//easy mem debug
|
||||
memset(surface_render,0,MAX_SURFACES*sizeof(struct xvmc_render_state));
|
||||
surface_render = malloc(MAX_SURFACES * sizeof(struct xvmc_pix_fmt)); //easy mem debug
|
||||
memset(surface_render, 0, MAX_SURFACES * sizeof(struct xvmc_pix_fmt));
|
||||
|
||||
for(i=0; i<MAX_SURFACES; i++){
|
||||
rez=XvMCCreateSurface(mDisplay,&ctx,&surface_array[i]);
|
||||
if( rez != Success )
|
||||
break;
|
||||
surface_render[i].magic = MP_XVMC_RENDER_MAGIC;
|
||||
break;
|
||||
surface_render[i].xvmc_id = AV_XVMC_ID;
|
||||
surface_render[i].data_blocks = data_blocks.blocks;
|
||||
surface_render[i].mv_blocks = mv_blocks.macro_blocks;
|
||||
surface_render[i].total_number_of_mv_blocks = numblocks;
|
||||
surface_render[i].total_number_of_data_blocks = numblocks*blocks_per_macroblock;;
|
||||
surface_render[i].mc_type = surface_info.mc_type & (~XVMC_IDCT);
|
||||
surface_render[i].allocated_mv_blocks = numblocks;
|
||||
surface_render[i].allocated_data_blocks = numblocks*blocks_per_macroblock;;
|
||||
surface_render[i].idct = (surface_info.mc_type & XVMC_IDCT) == XVMC_IDCT;
|
||||
surface_render[i].chroma_format = surface_info.chroma_format;
|
||||
surface_render[i].unsigned_intra = (surface_info.flags & XVMC_INTRA_UNSIGNED) == XVMC_INTRA_UNSIGNED;
|
||||
surface_render[i].p_surface = &surface_array[i];
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG4) )
|
||||
@ -553,7 +548,7 @@ int vm = flags & VOFLAG_MODESWITCHING;
|
||||
//debug
|
||||
printf("vo_xvmc: idct=%d unsigned_intra=%d\n",
|
||||
(surface_info.mc_type & XVMC_IDCT) == XVMC_IDCT,
|
||||
(surface_info.flags & XVMC_INTRA_UNSIGNED) == XVMC_INTRA_UNSIGNED);
|
||||
(surface_info.flags & XVMC_INTRA_UNSIGNED) == XVMC_INTRA_UNSIGNED);
|
||||
|
||||
// Find way to display OSD & subtitle
|
||||
printf("vo_xvmc: looking for OSD support\n");
|
||||
@ -561,7 +556,7 @@ int vm = flags & VOFLAG_MODESWITCHING;
|
||||
if(surface_info.flags & XVMC_OVERLAID_SURFACE)
|
||||
subpicture_mode = OVERLAY_SUBPICTURE;
|
||||
|
||||
if(surface_info.subpicture_max_width != 0 &&
|
||||
if(surface_info.subpicture_max_width != 0 &&
|
||||
surface_info.subpicture_max_height != 0 ){
|
||||
int s,k,num_subpic;
|
||||
|
||||
@ -578,7 +573,7 @@ int vm = flags & VOFLAG_MODESWITCHING;
|
||||
for(s=0;s<num_subpic;s++){
|
||||
for(k=0;osd_render[k].draw_func_ptr!=NULL;k++){
|
||||
if(xvfmv[s].id == osd_render[k].id)
|
||||
{
|
||||
{
|
||||
init_osd_fnc = osd_render[k].init_func_ptr;
|
||||
draw_osd_fnc = osd_render[k].draw_func_ptr;
|
||||
clear_osd_fnc = osd_render[k].clear_func_ptr;
|
||||
@ -591,7 +586,7 @@ int vm = flags & VOFLAG_MODESWITCHING;
|
||||
}
|
||||
}
|
||||
found_subpic:
|
||||
XFree(xvfmv);
|
||||
XFree(xvfmv);
|
||||
}
|
||||
//Blend2 supicture is always possible, blend1 only at backend
|
||||
if( (subpicture_mode == BLEND_SUBPICTURE) &&
|
||||
@ -642,7 +637,7 @@ skip_surface_allocation:
|
||||
#ifdef CONFIG_XF86VM
|
||||
if ( vm )
|
||||
{
|
||||
vo_vm_switch();
|
||||
vo_vm_switch();
|
||||
}
|
||||
else
|
||||
#endif
|
||||
@ -685,9 +680,8 @@ skip_surface_allocation:
|
||||
free_element = 0;
|
||||
first_frame = 1;
|
||||
|
||||
vo_directrendering = 1;//ugly hack, coz xvmc works only with direct rendering
|
||||
image_format=format;
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int draw_frame(uint8_t *srcp[]){
|
||||
@ -719,7 +713,7 @@ static void init_osd_yuv_pal(void) {
|
||||
switch(subpicture.component_order[j]){
|
||||
case 'U': palette[i*seb+j] = U; break;
|
||||
case 'V': palette[i*seb+j] = V; break;
|
||||
case 'Y':
|
||||
case 'Y':
|
||||
default:
|
||||
palette[i*seb+j] = Y; break;
|
||||
}
|
||||
@ -766,7 +760,7 @@ int rez;
|
||||
osd_width = surface_info.subpicture_max_width;
|
||||
if(osd_height > surface_info.subpicture_max_height)
|
||||
osd_height = surface_info.subpicture_max_height;
|
||||
if(osd_width == 0 || osd_height == 0)
|
||||
if(osd_width == 0 || osd_height == 0)
|
||||
return;//if called before window size is known
|
||||
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG4) )
|
||||
@ -795,7 +789,7 @@ int rez;
|
||||
printf("%c", subpicture.component_order[i]);
|
||||
printf("\"\n");
|
||||
}
|
||||
|
||||
|
||||
//call init for the surface type
|
||||
init_osd_fnc();//init palete,clear color etc ...
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG4) )
|
||||
@ -846,7 +840,7 @@ int rez;
|
||||
}
|
||||
|
||||
static void draw_osd(void){
|
||||
struct xvmc_render_state * osd_rndr;
|
||||
struct xvmc_pix_fmt *osd_rndr;
|
||||
int osd_has_changed;
|
||||
int have_osd_to_draw;
|
||||
int rez;
|
||||
@ -855,17 +849,17 @@ int rez;
|
||||
printf("vo_xvmc: draw_osd ,OSD_mode=%d, surface_to_show=%p\n",
|
||||
subpicture_mode,p_render_surface_to_show);
|
||||
|
||||
if(subpicture_mode == BLEND_SUBPICTURE ||
|
||||
if(subpicture_mode == BLEND_SUBPICTURE ||
|
||||
subpicture_mode == BACKEND_SUBPICTURE ){
|
||||
|
||||
if(!subpicture_alloc) //allocate subpicture when dimensions are known
|
||||
OSD_init();
|
||||
if(!subpicture_alloc)
|
||||
if(!subpicture_alloc)
|
||||
return;//dimensions still unknown.
|
||||
|
||||
osd_has_changed = vo_update_osd(subpicture.width, subpicture.height);
|
||||
have_osd_to_draw = vo_osd_check_range_update(0, 0, subpicture.width,
|
||||
subpicture.height);
|
||||
have_osd_to_draw = vo_osd_check_range_update(0, 0, subpicture.width,
|
||||
subpicture.height);
|
||||
|
||||
if(!have_osd_to_draw)
|
||||
return;//nothing to draw,no subpic, no blend
|
||||
@ -879,7 +873,7 @@ int rez;
|
||||
|
||||
if(subpicture_mode == BLEND_SUBPICTURE){
|
||||
osd_rndr = find_free_surface();
|
||||
if(osd_rndr == NULL)
|
||||
if(osd_rndr == NULL)
|
||||
return;// no free surface to draw OSD in
|
||||
|
||||
rez = XvMCBlendSubpicture2(mDisplay,
|
||||
@ -896,15 +890,14 @@ int rez;
|
||||
|
||||
//When replaceing the surface with osd one, save the flags too!
|
||||
osd_rndr->picture_structure = p_render_surface_to_show->picture_structure;
|
||||
osd_rndr->display_flags = p_render_surface_to_show->display_flags;
|
||||
//add more if needed osd_rndr-> = p_render_surface_to_show->;
|
||||
|
||||
p_render_surface_to_show->state &= ~MP_XVMC_STATE_DISPLAY_PENDING;
|
||||
p_render_surface_to_show->state |= MP_XVMC_STATE_OSD_SOURCE;
|
||||
p_render_surface_to_show->state &= ~AV_XVMC_STATE_DISPLAY_PENDING;
|
||||
p_render_surface_to_show->state |= AV_XVMC_STATE_OSD_SOURCE;
|
||||
p_render_surface_to_show->p_osd_target_surface_render = osd_rndr;
|
||||
|
||||
p_render_surface_to_show = osd_rndr;
|
||||
p_render_surface_to_show->state = MP_XVMC_STATE_DISPLAY_PENDING;
|
||||
p_render_surface_to_show->state = AV_XVMC_STATE_DISPLAY_PENDING;
|
||||
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG4) )
|
||||
printf("vo_xvmc:draw_osd: surface_to_show changed to %p\n",osd_rndr);
|
||||
@ -917,7 +910,7 @@ int rez;
|
||||
0, 0, image_width, image_height);
|
||||
|
||||
}
|
||||
|
||||
|
||||
}//if(BLEND||BACKEND)
|
||||
}
|
||||
|
||||
@ -936,13 +929,13 @@ int status,rez;
|
||||
XvMCGetSurfaceStatus(mDisplay,srf,&status);
|
||||
} while (status & XVMC_RENDERING);
|
||||
return;//done
|
||||
}
|
||||
}
|
||||
|
||||
XvMCSyncSurface(mDisplay, srf);
|
||||
}
|
||||
|
||||
static void put_xvmc_image(struct xvmc_render_state * p_render_surface,
|
||||
int draw_ck){
|
||||
static void put_xvmc_image(struct xvmc_pix_fmt *p_render_surface,
|
||||
int draw_ck){
|
||||
int rez;
|
||||
struct vo_rect src_rect, dst_rect;
|
||||
int i;
|
||||
@ -951,7 +944,7 @@ int i;
|
||||
return;
|
||||
|
||||
calc_src_dst_rects(image_width, image_height, &src_rect, &dst_rect, NULL);
|
||||
|
||||
|
||||
if(draw_ck)
|
||||
vo_xv_draw_colorkey(dst_rect.left, dst_rect.top, dst_rect.width, dst_rect.height);
|
||||
|
||||
@ -960,12 +953,11 @@ int i;
|
||||
|
||||
for (i = 1; i <= bob_deinterlace + 1; i++) {
|
||||
int field = top_field_first ? i : i ^ 3;
|
||||
rez = XvMCPutSurface(mDisplay, p_render_surface->p_surface,
|
||||
rez = XvMCPutSurface(mDisplay, p_render_surface->p_surface,
|
||||
vo_window,
|
||||
src_rect.left, src_rect.top, src_rect.width, src_rect.height,
|
||||
dst_rect.left, dst_rect.top, dst_rect.width, dst_rect.height,
|
||||
bob_deinterlace ? field : 3);
|
||||
//p_render_surface_to_show->display_flags);
|
||||
if(rez != Success){
|
||||
printf("vo_xvmc: PutSurface failer, critical error %d!\n",rez);
|
||||
assert(0);
|
||||
@ -982,7 +974,7 @@ int i,cfs;
|
||||
printf("vo_xvmc: flip_page show(rndr=%p)\n\n",p_render_surface_to_show);
|
||||
|
||||
if(p_render_surface_to_show == NULL) return;
|
||||
assert( p_render_surface_to_show->magic == MP_XVMC_RENDER_MAGIC );
|
||||
assert( p_render_surface_to_show->xvmc_id == AV_XVMC_ID );
|
||||
//fixme assert( p_render_surface_to_show != p_render_surface_visible);
|
||||
|
||||
if(use_queue){
|
||||
@ -993,7 +985,7 @@ int i,cfs;
|
||||
if(cfs > 3){//well have 3 free surfaces after add queue
|
||||
if(free_element > 1)//a little voodoo magic
|
||||
xvmc_sync_surface(show_queue[0]->p_surface);
|
||||
return;
|
||||
return;
|
||||
}
|
||||
p_render_surface_to_show=show_queue[0];
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG5) )
|
||||
@ -1010,9 +1002,9 @@ int i,cfs;
|
||||
|
||||
//the visible surface won't be displayed anymore, mark it as free
|
||||
if(p_render_surface_visible != NULL)
|
||||
p_render_surface_visible->state &= ~MP_XVMC_STATE_DISPLAY_PENDING;
|
||||
p_render_surface_visible->state &= ~AV_XVMC_STATE_DISPLAY_PENDING;
|
||||
|
||||
//!!fixme assert(p_render_surface_to_show->state & MP_XVMC_STATE_DISPLAY_PENDING);
|
||||
//!!fixme assert(p_render_surface_to_show->state & AV_XVMC_STATE_DISPLAY_PENDING);
|
||||
|
||||
//show it, displaying is always vsynced, so skip it for benchmark
|
||||
put_xvmc_image(p_render_surface_to_show,first_frame);
|
||||
@ -1057,13 +1049,13 @@ int i;
|
||||
XvMCHideSurface(mDisplay,&surface_array[i]);//it doesn't hurt, I hope
|
||||
XvMCDestroySurface(mDisplay,&surface_array[i]);
|
||||
|
||||
if( (surface_render[i].state != 0) &&
|
||||
if( (surface_render[i].state != 0) &&
|
||||
(p_render_surface_visible != &surface_render[i]) )
|
||||
printf("vo_xvmc::uninit surface_render[%d].status=%d\n",i,
|
||||
surface_render[i].state);
|
||||
surface_render[i].state);
|
||||
}
|
||||
|
||||
memset(surface_render,0,MAX_SURFACES*sizeof(struct xvmc_render_state));//for debuging
|
||||
memset(surface_render, 0, MAX_SURFACES * sizeof(struct xvmc_pix_fmt)); //for debugging
|
||||
free(surface_render);surface_render=NULL;
|
||||
|
||||
XvMCDestroyContext(mDisplay,&ctx);
|
||||
@ -1108,7 +1100,7 @@ int mode_id;
|
||||
|
||||
flags = VFCAP_CSP_SUPPORTED |
|
||||
VFCAP_CSP_SUPPORTED_BY_HW |
|
||||
VFCAP_ACCEPT_STRIDE;
|
||||
VFCAP_ACCEPT_STRIDE;
|
||||
|
||||
if( (qsurface_info.subpicture_max_width != 0) &&
|
||||
(qsurface_info.subpicture_max_height != 0) )
|
||||
@ -1118,19 +1110,19 @@ int mode_id;
|
||||
|
||||
|
||||
static int draw_slice(uint8_t *image[], int stride[],
|
||||
int w, int h, int x, int y){
|
||||
struct xvmc_render_state * rndr;
|
||||
int w, int h, int x, int y){
|
||||
struct xvmc_pix_fmt *rndr;
|
||||
int rez;
|
||||
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG4) )
|
||||
printf("vo_xvmc: draw_slice y=%d\n",y);
|
||||
|
||||
rndr = (struct xvmc_render_state*)image[2];//this is copy of priv-ate
|
||||
rndr = (struct xvmc_pix_fmt*)image[2]; //this is copy of priv-ate
|
||||
assert( rndr != NULL );
|
||||
assert( rndr->magic == MP_XVMC_RENDER_MAGIC );
|
||||
assert( rndr->xvmc_id == AV_XVMC_ID );
|
||||
|
||||
rez = XvMCRenderSurface(mDisplay,&ctx,rndr->picture_structure,
|
||||
rndr->p_surface,
|
||||
rndr->p_surface,
|
||||
rndr->p_past_surface,
|
||||
rndr->p_future_surface,
|
||||
rndr->flags,
|
||||
@ -1152,14 +1144,14 @@ int rez;
|
||||
XvMCMacroBlock* testblock;
|
||||
testblock = &mv_blocks.macro_blocks[i];
|
||||
|
||||
printf("vo_xvmc::slice: mv_block - x=%d,y=%d,mb_type=0x%x,mv_type=0x%x,mv_field_select=%d\n",
|
||||
testblock->x,testblock->y,testblock->macroblock_type,
|
||||
testblock->motion_type,testblock->motion_vertical_field_select);
|
||||
printf("vo_xvmc::slice: mv_block - x=%d,y=%d,mb_type=0x%x,mv_type=0x%x,mv_field_select=%d\n",
|
||||
testblock->x,testblock->y,testblock->macroblock_type,
|
||||
testblock->motion_type,testblock->motion_vertical_field_select);
|
||||
printf("vo_xvmc::slice: dct_type=%d,data_index=0x%x,cbp=%d,pad0=%d\n",
|
||||
testblock->dct_type,testblock->index,testblock->coded_block_pattern,
|
||||
testblock->pad0);
|
||||
testblock->dct_type,testblock->index,testblock->coded_block_pattern,
|
||||
testblock->pad0);
|
||||
printf("vo_xvmc::slice: PMV[0][0][0/1]=(%d,%d)\n",
|
||||
testblock->PMV[0][0][0],testblock->PMV[0][0][1]);
|
||||
testblock->PMV[0][0][0],testblock->PMV[0][0][1]);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@ -1179,17 +1171,17 @@ int rez;
|
||||
|
||||
//XvMCHide hides the surface on next retrace, so
|
||||
//check if the surface is not still displaying
|
||||
static void check_osd_source(struct xvmc_render_state * src_rndr){
|
||||
struct xvmc_render_state * osd_rndr;
|
||||
static void check_osd_source(struct xvmc_pix_fmt *src_rndr) {
|
||||
struct xvmc_pix_fmt *osd_rndr;
|
||||
int stat;
|
||||
//If this is source surface, check does the OSD rendering is compleate
|
||||
if(src_rndr->state & MP_XVMC_STATE_OSD_SOURCE){
|
||||
if(src_rndr->state & AV_XVMC_STATE_OSD_SOURCE){
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG4) )
|
||||
printf("vo_xvmc: OSD surface=%p quering\n",src_rndr);
|
||||
osd_rndr = src_rndr->p_osd_target_surface_render;
|
||||
XvMCGetSurfaceStatus(mDisplay, osd_rndr->p_surface, &stat);
|
||||
if(!(stat & XVMC_RENDERING))
|
||||
src_rndr->state &= ~MP_XVMC_STATE_OSD_SOURCE;
|
||||
src_rndr->state &= ~AV_XVMC_STATE_OSD_SOURCE;
|
||||
}
|
||||
}
|
||||
static int count_free_surfaces(void) {
|
||||
@ -1203,10 +1195,10 @@ int i,num;
|
||||
return num;
|
||||
}
|
||||
|
||||
static struct xvmc_render_state * find_free_surface(void) {
|
||||
static struct xvmc_pix_fmt *find_free_surface(void) {
|
||||
int i,t;
|
||||
int stat;
|
||||
struct xvmc_render_state * visible_rndr;
|
||||
struct xvmc_pix_fmt *visible_rndr;
|
||||
|
||||
visible_rndr = NULL;
|
||||
for(i=0; i<number_of_surfaces; i++){
|
||||
@ -1214,7 +1206,7 @@ struct xvmc_render_state * visible_rndr;
|
||||
check_osd_source(&surface_render[i]);
|
||||
if( surface_render[i].state == 0){
|
||||
XvMCGetSurfaceStatus(mDisplay, surface_render[i].p_surface,&stat);
|
||||
if( (stat & XVMC_DISPLAYING) == 0 )
|
||||
if( (stat & XVMC_DISPLAYING) == 0 )
|
||||
return &surface_render[i];
|
||||
visible_rndr = &surface_render[i];// remember it, use as last resort
|
||||
}
|
||||
@ -1222,12 +1214,12 @@ struct xvmc_render_state * visible_rndr;
|
||||
|
||||
//all surfaces are busy, but there is one that will be free
|
||||
//on next monitor retrace, we just have to wait
|
||||
if(visible_rndr != NULL){
|
||||
if(visible_rndr != NULL){
|
||||
printf("vo_xvmc: waiting retrace\n");
|
||||
for(t=0;t<1000;t++){
|
||||
for(t=0;t<1000;t++){
|
||||
usec_sleep(1000);//1ms
|
||||
XvMCGetSurfaceStatus(mDisplay, visible_rndr->p_surface,&stat);
|
||||
if( (stat & XVMC_DISPLAYING) == 0 )
|
||||
if( (stat & XVMC_DISPLAYING) == 0 )
|
||||
return visible_rndr;
|
||||
}
|
||||
}
|
||||
@ -1243,8 +1235,8 @@ int i;
|
||||
|
||||
for(i=0; i<number_of_surfaces; i++){
|
||||
|
||||
surface_render[i].state&=!( MP_XVMC_STATE_DISPLAY_PENDING |
|
||||
MP_XVMC_STATE_OSD_SOURCE |
|
||||
surface_render[i].state&=!( AV_XVMC_STATE_DISPLAY_PENDING |
|
||||
AV_XVMC_STATE_OSD_SOURCE |
|
||||
0);
|
||||
surface_render[i].p_osd_target_surface_render=NULL;
|
||||
if(surface_render[i].state != 0){
|
||||
@ -1256,7 +1248,7 @@ int i;
|
||||
}
|
||||
|
||||
static uint32_t get_image(mp_image_t *mpi){
|
||||
struct xvmc_render_state * rndr;
|
||||
struct xvmc_pix_fmt *rndr;
|
||||
|
||||
rndr = find_free_surface();
|
||||
|
||||
@ -1277,7 +1269,7 @@ assert(rndr->next_free_data_block_num == 0);
|
||||
|
||||
// these are shared!! so watch out
|
||||
// do call RenderSurface before overwriting
|
||||
mpi->planes[0] = (char*)data_blocks.blocks;
|
||||
mpi->planes[0] = (char*)data_blocks.blocks;
|
||||
mpi->planes[1] = (char*)mv_blocks.macro_blocks;
|
||||
mpi->priv =
|
||||
mpi->planes[2] = (char*)rndr;
|
||||
@ -1292,7 +1284,7 @@ assert(rndr->next_free_data_block_num == 0);
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG4) )
|
||||
printf("vo_xvmc: get_image: rndr=%p (surface=%p) \n",
|
||||
rndr,rndr->p_surface);
|
||||
return VO_TRUE;
|
||||
return VO_TRUE;
|
||||
}
|
||||
|
||||
static int control(uint32_t request, void *data)
|
||||
@ -1309,13 +1301,13 @@ static int control(uint32_t request, void *data)
|
||||
case VOCTRL_DRAW_IMAGE:
|
||||
return xvmc_draw_image((mp_image_t *)data);
|
||||
case VOCTRL_GET_IMAGE:
|
||||
return get_image((mp_image_t *)data);
|
||||
return get_image((mp_image_t *)data);
|
||||
//vo_xv
|
||||
case VOCTRL_GUISUPPORT:
|
||||
return VO_TRUE;
|
||||
case VOCTRL_ONTOP:
|
||||
vo_x11_ontop();
|
||||
return VO_TRUE;
|
||||
return VO_TRUE;
|
||||
case VOCTRL_FULLSCREEN:
|
||||
vo_x11_fullscreen();
|
||||
// indended, fallthrough to update panscan on fullscreen/windowed switch
|
||||
@ -1327,7 +1319,7 @@ static int control(uint32_t request, void *data)
|
||||
|
||||
if(old_y != vo_panscan_y)
|
||||
{
|
||||
//this also draws the colorkey
|
||||
//this also draws the colorkey
|
||||
put_xvmc_image(p_render_surface_visible,1);
|
||||
}
|
||||
}
|
||||
|
@ -1,75 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2003 Ivan Kalvachev
|
||||
*
|
||||
* This file is part of FFmpeg.
|
||||
*
|
||||
* FFmpeg is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* FFmpeg is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with FFmpeg; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#ifndef AVCODEC_XVMC_RENDER_H
|
||||
#define AVCODEC_XVMC_RENDER_H
|
||||
|
||||
#include <X11/Xlib.h>
|
||||
#include <X11/Xutil.h>
|
||||
#include <X11/Xatom.h>
|
||||
#include <X11/extensions/Xv.h>
|
||||
#include <X11/extensions/Xvlib.h>
|
||||
#include <X11/extensions/XvMClib.h>
|
||||
|
||||
|
||||
//the surface should be shown, the video driver manipulates this
|
||||
#define MP_XVMC_STATE_DISPLAY_PENDING 1
|
||||
//the surface is needed for prediction, the codec manipulates this
|
||||
#define MP_XVMC_STATE_PREDICTION 2
|
||||
//this surface is needed for subpicture rendering
|
||||
#define MP_XVMC_STATE_OSD_SOURCE 4
|
||||
// 1337 IDCT MCo
|
||||
#define MP_XVMC_RENDER_MAGIC 0x1DC711C0
|
||||
|
||||
struct xvmc_render_state {
|
||||
//these are not changed by the decoder!
|
||||
int magic;
|
||||
|
||||
short * data_blocks;
|
||||
XvMCMacroBlock * mv_blocks;
|
||||
int total_number_of_mv_blocks;
|
||||
int total_number_of_data_blocks;
|
||||
int mc_type; //XVMC_MPEG1/2/4,XVMC_H263 without XVMC_IDCT
|
||||
int idct; //Do we use IDCT acceleration?
|
||||
int chroma_format; //420, 422, 444
|
||||
int unsigned_intra; //+-128 for intra pictures after clipping
|
||||
XvMCSurface* p_surface; //pointer to rendered surface, never changed
|
||||
|
||||
//these are changed by the decoder
|
||||
//used by the XvMCRenderSurface function
|
||||
XvMCSurface* p_past_surface; //pointer to the past surface
|
||||
XvMCSurface* p_future_surface; //pointer to the future prediction surface
|
||||
|
||||
unsigned int picture_structure; //top/bottom fields or frame!
|
||||
unsigned int flags; //XVMC_SECOND_FIELD - 1st or 2nd field in the sequence
|
||||
unsigned int display_flags; //1,2 or 1+2 fields for XvMCPutSurface
|
||||
|
||||
//these are for internal communication
|
||||
int state; //0 - free, 1 - waiting to display, 2 - waiting for prediction
|
||||
int start_mv_blocks_num; //offset in the array for the current slice, updated by vo
|
||||
int filled_mv_blocks_num; //processed mv block in this slice, changed by decoder
|
||||
|
||||
int next_free_data_block_num; //used in add_mv_block, pointer to next free block
|
||||
//extensions
|
||||
void * p_osd_target_surface_render; //pointer to the surface where subpicture is rendered
|
||||
|
||||
};
|
||||
|
||||
#endif /* AVCODEC_XVMC_RENDER_H */
|
Loading…
Reference in New Issue
Block a user