0
0
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:
Uoti Urpala 2009-02-16 02:39:58 +02:00
commit 0bf2bd91ec
28 changed files with 6940 additions and 6527 deletions

17
AUTHORS
View File

@ -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

View File

@ -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 /.

View File

@ -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.

File diff suppressed because it is too large Load Diff

View File

@ -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.

View File

@ -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>

View File

@ -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 @@
большинство разработчиков &mdash; занятые люди, получающие огромное количество
писем. Поэтому, хотя Ваши отзывы необходимы для улучшения <application>MPlayer</application>'а, хотя
они очень приветствуются, пожалуйста поймите, что Вы должны предоставить
<emphasis role="bold">Всю</emphasis> требуемую нами информацию, поэтому точно
<emphasis role="bold">всю</emphasis> требуемую нами информацию, поэтому точно
следуйте инструкциям в этом документе.
</para>
@ -22,11 +22,11 @@
<title>Отчеты об ошибках безопасности</title>
<para>
В случае, если вы нашли уязвимость и хотите позволить нам исправить ее до того, как она будет
обнародована, мы будем рады получить ваше уведомление по адресу
В случае, если Вы нашли уязвимость и хотите позволить нам исправить ее до того, как она будет
обнародована, мы будем рады получить Ваше уведомление по адресу
<ulink url="mailto:&#115;&#101;&#99;&#117;&#114;&#105;&#116;&#121;&#64;&#109;&#112;&#108;&#97;&#121;&#101;&#114;&#104;&#113;&#46;&#104;&#117;">&#115;&#101;&#99;&#117;&#114;&#105;&#116;&#121;&#64;&#109;&#112;&#108;&#97;&#121;&#101;&#114;&#104;&#113;&#46;&#104;&#117;</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>
Для непрограммистов, читающих эту страницу, сообщим, то самый быстрый способ найти место
возникновения ошибки - использование бинарного поиска, т.е. поиск даты,
Для непрограммистов, читающих эту страницу, сообщим, то самый быстрый способ найти место
возникновения ошибки &mdash; использование бинарного поиска, т.е. поиск даты,
деля интервал поиска пополам раз за разом.
Например, если проблема возникла в 2003 году, начните с середины года и
выясните присутствует ли проблема. Если да, то переходите к проверке
начала Апреля, иначе - к началу Октября. Повторяйте этот процесс, уменьшая интервал
Например, если проблема возникла в 2003 году, начните с середины года и
выясните присутствует ли проблема. Если да, то переходите к проверке
начала Апреля, иначе &mdash; к началу Октября. Повторяйте этот процесс, уменьшая интервал
поиска вдвое, пока не выясните искомую дату.
</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>
Великолепное, отлично написанное руководство по задаванию вопросов
на общедоступных форумах &mdash; это
на общедоступных форумах &mdash; это
<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 почта и почему это &mdash; зло, прочтите
<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> &gt; mplayer.log 2&gt;&amp;1
mplayer -v <replaceable>опции</replaceable> <replaceable>имя-файла</replaceable> &gt; mplayer.log 2&gt;&amp;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=командный-файл &gt; mplaye
<para>
Если Вы создали правильное сообщение об ошибке так, как рассказано выше, и Вы
уверены, что это ошибка в <application>MPlayer</application>'е, а не ошибка компилятора или плохой файл,
Вы уже прочли всю документацию и не можете найти решение, ваши звуковые драйвера
Вы уже прочли всю документацию и не можете найти решение, Ваши звуковые драйвера
в порядке, тогда Вы можете подписаться на рассылку mplayer-advusers и прислать
сообщение об ошибке туда, чтобы получить более точный и быстрый ответ.
</para>

View File

@ -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 \

View File

@ -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}
};

View File

@ -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
View 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;
}

View File

@ -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 */

View File

@ -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"

View File

@ -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"\

View File

@ -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;

View File

@ -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;

View File

@ -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

View File

@ -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 */

View File

@ -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;

View File

@ -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;

View File

@ -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);
}

View File

@ -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)

View File

@ -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);

View File

@ -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,

View File

@ -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);
}
}

View File

@ -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);

View File

@ -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);
}
}

View File

@ -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 */