Merge svn changes up to r28690

This commit is contained in:
Uoti Urpala 2009-02-21 17:39:30 +02:00
commit ebb541c655
25 changed files with 1939 additions and 1909 deletions

View File

@ -11168,7 +11168,7 @@ explains how to create useful bug reports.
MPlayer was initially written by Arpad Gereoffy.
See the AUTHORS file for a list of some of the many other contributors.
.PP
MPlayer is (C) 2000\-2008 The MPlayer Team
MPlayer is (C) 2000\-2009 The MPlayer Team
.PP
This man page was written mainly by Gabucino, Jonas Jermann and Diego Biurrun.
It is maintained by Diego Biurrun.

View File

@ -1,4 +1,4 @@
.\" Synced with r28576
.\" Synced with r28670
.\" 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. 16." "MPlayer Project" "A film lejátszó"
.TH MPlayer 1 "2009. 02. 19." "MPlayer Project" "A film lejátszó"
.
.SH NÉV
mplayer \- film lejátszó
@ -1913,10 +1913,10 @@ L
Beállítja a tunert az <érték> csatornára.
.IPs chanlist=<érték>
elérhető: europe-east, europe-west, us-bcast, us-cable, stb.
.IPs channels=<csatorna>\-<név>[=<norma>],<csatorna>\-<név>[=<norma>],...
.IPs channels=<csat>\-<név>[=<norma>],<csat>\-<név>[=<norma>],...
Csatornák neveinek beállítása.
.I MEGJEGYZÉS:
Ha a <csatorna> 1000-nél nagyobb egész, frekvenciaként lesz értelmezve (kHz-ben)
Ha a <csat> 1000-nél nagyobb egész, frekvenciaként lesz értelmezve (kHz-ben)
a frekvenciatáblázatban szereplő csatornanév helyett.
.br
Használj _ jelet a szóköz helyett a nevekben (vagy játsz az idézőjelezéssel ;-).
@ -3436,6 +3436,11 @@ Vez
.PD 1
.
.TP
.B vdpau (\-vc ffmpeg12vdpau, ffwmv3vdpau, ffvc1vdpau vagy ffh264vdpau kapcsolókkal)
Videó kimenet, ami a VDPAU-t használja a videó hardveres dekódolásához.
Támogatja a szoftveresen dekódolt videó megjelenítését is.
.
.TP
.B xvmc (csak X11 \-vc ffmpeg12mc kapcsolóval)
Videó kimeneti vezérlő ami az XFree86 4.x XvMC (X Video Motion Compensation)
kiterjesztését használja az MPEG-1/2 és VCR2 dekódolás gyorsításához.
@ -11194,7 +11199,7 @@ le
Az MPlayert eredetileg Gereöffy Árpád írta.
Lásd az AUTHORS fájlt a többi közreműködő listájához.
.PP
MPlayer (C) 2000\-2008 Az MPlayer Csapat
MPlayer (C) 2000\-2009 Az MPlayer Csapat
.PP
Ezt a man oldalt nagyrészt Gabucino, Jonas Jermann és Diego Biurrun írta.
A karbantartó Diego Biurrun.

View File

@ -2,7 +2,7 @@
.\" This man page was/is done by Gabucino, Diego Biurrun, Jonas Jermann
.\" Translated by Vladimir Voroshilov <voroshil@gmail.com>
.\" Encoding: koi8-r
.\" synced with r28645
.\" synced with r28670
.
.\" --------------------------------------------------------------------------
.\" Определения макросов
@ -11485,7 +11485,7 @@ rar p test\-SVCD.rar | mencoder \-ovc lavc \-lavcopts vcodec=mpeg4:vbitrate=800
MPlayer изначально был написан Arpad Gereoffy.
Смотрите файл AUTHORS, чтобы получить список некоторых из множества других разработчиков.
.PP
MPlayer is (C) 2000\-2008 The MPlayer Team
MPlayer is (C) 2000\-2009 The MPlayer Team
.PP
Оригинальная английская версия этого руководства в основном была написана Gabucino,
Jonas Jermann и Diego Biurrun. Сейчас она поддерживается Diego Biurrun.

View File

@ -220,7 +220,7 @@ libao2 drivers:
* ao_oss.c - None
* ao_pcm.c - None
* ao_plugin.c - None
* ao_pulse.c - Reimar Döffinger
* ao_pulse.c - None
* ao_sdl.c - None
* ao_sgi.c - None
* ao_sun.c - None

View File

@ -6,6 +6,14 @@ Note: before start on this, read colorspaces.txt !
The constants for different pixelformats are defined in img_format.h,
their usage is mandatory.
WARNING: Please keep in mind that some of this information may be out-dated,
so if you are working on a new vo, consider submitting preliminary patches
very early on. Currently vo_gl is one of the more up-to-date VOs to use
as reference if you are unsure about something and do not want to ask on the
list.
vo_vdpau and vo_direct3d may be a good choice, too, they use different
approaches closer to the sometimes convoluted way DirectX works.
Each vo driver _has_ to implement these:
preinit():
@ -15,7 +23,9 @@ Each vo driver _has_ to implement these:
Uninit the whole system, this is on the same "level" as preinit.
control():
Current controls:
Current controls (VOCTRL_QUERY_FORMAT must be implemented,
VOCTRL_DRAW_IMAGE, VOCTRL_FULLSCREEN, VOCTRL_UPDATE_SCREENINFO
should be implemented):
VOCTRL_QUERY_FORMAT - queries if a given pixelformat is supported.
It also returns various flags decsirbing the capabilities
of the driver with teh given mode. for the flags, see
@ -64,7 +74,37 @@ Each vo driver _has_ to implement these:
by drivers which use X11, except SDL, as well as directx and
gl2 under Windows.
VOCTRL_BORDER
Makes the player window borderless. Only supported by directx.
Makes the player window borderless.
VOCTRL_FULLSCREEN
Switch from and to fullscreen mode
VOCTRL_GET_PANSCAN
VOCTRL_SET_PANSCAN
Needed to implement pan-scan support ('w' and 'e' keys during
playback in fullscreen mode)
VOCTRL_START_SLICE
Called before the first draw_slice of each frame, useful if
you need to do some set-up work.
VOCTRL_DRAW_EOSD
Required for EOSD (ASS subtitle) support. Provides all
information necessary to draw the EOSD for the current video
frame.
VOCTRL_GET_EOSD_RES
Required for EOSD (ASS subtitle) support. Informs the ASS
renderer about the properties of the drawing area (size,
borders).
VOCTRL_SET_DEINTERLACE
VOCTRL_GET_DEINTERLACE
Get or set deinterlacing status for VOs that support some kind
of deinterlacing.
VOCTRL_UPDATE_SCREENINFO
Should set the xinerama_x, xinerama_y, vo_screenwidth and
vo_screenheight appropriately for the currently used
monitor and -xineramascreen option.
Usually should simply call the w32_update_xinerama_info or
update_xinerama_info function.
By supporting this, the VO also requests the newer API
that sets vo_dx, vo_dy etc. appropriately before config()
is called.
config():
Set up the video system. You get the dimensions and flags.
@ -86,25 +126,22 @@ Each vo driver _has_ to implement these:
So, you can check for vo_config_count>0 in uninit() when freeing
resources allocated in config() to avoid crash!
You should call geometry() in config() to enable user defined
window size and position. The code should look as following:
---
set x,y,w,h to the values supplied by the caller or to those you deam
useful.
call geometry(&x, &y, &w, &h, screenw, screenh)
call aspect()
---
see libvo/geometry.c for further information
You should implement VOCTRL_UPDATE_SCREENINFO so that vo_dx, vo_dy,
vo_dwidth and vo_dheight are already pre-set to values that take
aspect and -geometry into account. It is also necessary to properly
support multi-monitor setups (if based on x11_common, w32_common).
draw_slice(): this displays YV12 pictures (3 planes, one full sized that
contains brightness (Y), and 2 quarter-sized which the colour-info
(U,V). MPEG codecs (libmpeg2, opendivx) use this. This doesn't have
to display the whole frame, only update small parts of it.
If this is not supported, it must be signaled in QUERY_FORMAT with
VOCAP_NOSLICES.
draw_frame(): this is the older interface, this displays only complete
frames, and can do only packed format (YUY2, RGB/BGR).
Win32 codecs use this (DivX, Indeo, etc).
If you implement VOCTRL_DRAW_IMAGE, you can left draw_frame.
If you implement VOCTRL_DRAW_IMAGE, you do not need to implement draw_frame.
draw_osd(): this displays subtitles and OSD.
It's a bit tricky to use it, since it's a callback-style stuff.
@ -113,11 +150,25 @@ Each vo driver _has_ to implement these:
The vo_draw_text() checks the characters to draw, and calls
draw_alpha() for each. As a help, osd.c contains draw_alpha for
each pixelformats, use this if possible!
Note that if you do not draw directly onto the video you should
use vo_draw_text_ext() which allows you to specify the border
values etc. needed to draw DVD menu highlights at the correct place.
If you do not want to implement this, you can still use -vf
expand=osd=1 to draw the OSD, or even implement code to insert
this filter automatically.
Make sure you set VFCAP_OSD depending on whether you implemented it
or not.
NOTE: This one will be obsolete soon! But it's still useful when
you want to do tricks, like rendering osd _after_ hardware scaling
(tdfxfb) or render subtitles under of the image (vo_mpegpes, sdl)
flip_page(): this is called after each frame, this diplays the buffer for
real. This is 'swapbuffers' when doublebuffering.
NOTE2: above NOTE is probably wrong, there are currently no plans to
obsolete draw_osd, though there is the more advanced EOSD support for
ASS subtitles.
flip_page(): this is called after each frame, this displays the buffer for
real. This is 'swapbuffers' when doublebuffering.
Try to do as little work here as possible, since that affect jitter/
A-V sync.

View File

@ -693,10 +693,10 @@ you have to use <option>-ao alsa:device=dmix</option>.
I have no sound when playing a video and get error messages similar to this one:
<screen>
AO: [oss] 44100Hz 2ch Signed 16-bit (Little-Endian)
audio_setup: Can't open audio device /dev/dsp: Device or resource busy
couldn't open/init audio device -> NOSOUND
Audio: no sound!!!
Start playing...
[AO OSS] audio_setup: Can't open audio device /dev/dsp: Device or resource busy
Could not open/initialize audio device -> no sound.
Audio: no sound
Starting playback...
</screen>
</para></question>
<answer><para>
@ -742,7 +742,7 @@ try to play a file which has 22050Hz audio. Try the
When I play this movie I get video-audio desync and/or
<application>MPlayer</application> crashes with the following message:
<screen>
DEMUXER: Too many (945 in 8390980 bytes) video packets in the buffer!
Too many (945 in 8390980 bytes) video packets in the buffer!
</screen>
</para></question>
<answer><para>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- synced with r28593 -->
<!-- synced with r28615 -->
<appendix id="bugreports">
<title>Hogyan jelentsd a hibákat</title>
@ -111,6 +111,8 @@ spórolsz, ha vissza kell lépned.
(Általában le kell futtatni a 'make distclean'-t egy régi verzió újrafordítása
előtt, így ha nem készítesz mentést az eredeti forrás fádról, újra kell fordítanod
mindent, ha visszajössz a jelenbe.)
Alternatívaként használhatod a <ulink url="http://ccache.samba.org/">ccache</ulink>-t
a fordítás felgyorsítására.
</para>
<para>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- synced with r28531 -->
<!-- synced with r28660 -->
<chapter id="faq" xreflabel="FAQ">
<title>Gyakran ismételt kérdések</title>
@ -692,10 +692,10 @@ használd a <option>-ao alsa:device=dmix</option> kapcsolót.
Nincs hang videó lejátszása közben, és egy ehhez hasonló üzenetet kapok:
<screen>
AO: [oss] 44100Hz 2ch Signed 16-bit (Little-Endian)
audio_setup: Can't open audio device /dev/dsp: Device or resource busy
couldn't open/init audio device -> NOSOUND
Audio: no sound!!!
Start playing...
[AO OSS] audio_setup: Can't open audio device /dev/dsp: Device or resource busy
Could not open/initialize audio device -> no sound.
Audio: no sound
Starting playback...
</screen>
</para></question>
<answer><para>
@ -743,7 +743,7 @@ Hibás hang kártyád/vezérlőd van. Legvalószínűbb, hogy rögzítve van 441
Amikor filmet játszok le, szétesik a videó-audió szinkron
és/vagy az <application>MPlayer</application> összeomlik ezzel az üzenettel:
<screen>
DEMUXER: Too many (945 in 8390980 bytes) video packets in the buffer!
Too many (945 in 8390980 bytes) video packets in the buffer!
</screen>
</para></question>
<answer><para>

View File

@ -39,7 +39,7 @@
</para>
<para>
Если используется эмуляция SCSI, вам следует применять настройки к реальному IDE
Если используется эмуляция SCSI, Вам следует применять настройки к реальному IDE
устройству, а не сэмулированному SCSI.
</para>
@ -157,14 +157,14 @@
Приводы, реализующие региональную защиту исключительно при помощи
программного обеспечения, известны как RPC-1 приводы, реализующие ее
аппаратно &mdash; RPC-2. RPC-2 приводы позволяют пять раз изменить код региона,
после чего он фиксируется навсегда. В Linux вы можете воспользоваться
после чего он фиксируется навсегда. В Linux Вы можете воспользоваться
утилитой <ulink url="http://linvdr.org/projects/regionset/">regionset</ulink>
для установки регионального кода вашего DVD привода.
для установки регионального кода Вашего DVD привода.
</para>
<para>
К счастью, возможна переделка RPC-2 приводов в RPC-1, через
обновление прошивки. Укажите модель вашего DVD привода в вашем любимом
обновление прошивки. Укажите модель Вашего DVD привода в Вашем любимом
поисковике или посмотрите на форуме и разделах загрузок на
<ulink url="http://www.rpc1.org/">"Странице прошивок"</ulink>.
Хотя обычные предостережения, касающиеся обновления прошивки, остаются в силе,

View File

@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- synced with r25566 -->
<!-- synced with r28266 -->
<bookinfo id="toc">
<title><application>MPlayer</application> - The Movie Player</title>
<title><application>MPlayer</application> - Медиа Проигрыватель</title>
<subtitle><ulink url="http://www.mplayerhq.hu"></ulink></subtitle>
<date>March 24, 2003</date>
<date>24 Марта, 2003</date>
<copyright>
<year>2000</year>
<year>2001</year>
@ -16,7 +16,7 @@
<year>2007</year>
<year>2008</year>
<year>2009</year>
<holder>команда MPlayer[MPlayer team]</holder>
<holder>MPlayer team</holder>
</copyright>
<legalnotice>
<title>License</title>
@ -42,18 +42,16 @@
<para>
Если Вы инсталлируете программу в первый раз, прочитайте все от начала до конца
в секции "Установка", и просматривайте ссылки, которые Вы обнаружите.
секции "Установка", и просматривайте ссылки, которые Вы обнаружите.
Если у Вас все ещё остались
вопросы, вернитесь к <link linkend="toc">Оглавлению</link> и поищите там,
прочтите <xref linkend="faq"/>, или попытайтесь про'grep'пить файлы.
На большую часть вопросов Вы найдёте ответы здесь, а остальные, наверное, уже
спрашивались в наших
<ulink url="http://www.mplayerhq.hu/design7/mailing_lists.html">рассылках</ulink>.
<!-- FIXME: This refers to nonexistent links
Проверьте
<ulink url="http://lists.mplayerhq.hu/cgi-bin/s-arch.cgi">по архивам</ulink>, в
<ulink url="https://lists.mplayerhq.hu/mailman/listinfo">по архивам</ulink>, в
которых можно найти много ценной информации.
-->
</para>
</preface>
@ -62,109 +60,106 @@
<title>Введение</title>
<para>
<application>MPlayer</application> - это проигрыватель фильмов для LINUX'а
(работает на многих других UNIX'ах и <emphasis role="bold">не-x86</emphasis>
<application>MPlayer</application> &mdash; это проигрыватель фильмов для LINUX'а
(работает на многих других UNIX'ах и не-x86
CPU, см. <xref linkend="ports"/>). Он проигрывает большинство MPEG, VOB, AVI,
OGG/OGM, VIVO, ASF/WMA/WMV, QT/MOV/MP4, FLI, RM, NuppelVideo, yuv4mpeg, FILM,
RoQ, PVA, Matroska файлов, опираясь на множество "родных", XAnim'овских, RealPlayer'овских, и
Win32 DLL кодеков. Вы также можете смотреть <emphasis role="bold">VideoCD, SVCD,
DVD, 3ivx, RealMedia, Sorenson, Theora</emphasis>, и
<emphasis role="bold">DivX</emphasis> фильмы. Другой важной особенностью
Ogg/OGM, VIVO, ASF/WMA/WMV, QT/MOV/MP4, FLI, RM, NuppelVideo, yuv4mpeg, FILM,
RoQ, PVA, Matroska файлов, опираясь на множество "родных", XAnim'овских,
RealPlayer'овских и Win32 DLL кодеков. Вы также можете смотреть VideoCD, SVCD,
DVD, 3ivx, RealMedia, Sorenson, Theora, и MPEG-4 (DivX) фильмы.
Другой важной особенностью
<application>MPlayer</application>'а является широкий спектр поддерживаемых
устройств вывода. Он работает с X11, Xv, DGA, OpenGL, SVGAlib,
fbdev, AAlib, libcaca, DirectFB, и кроме того Вы можете
использовать GGI and SDL (и таким образом все их драйверы) и также несколько
низкоуровневых драйверов для конкретных карт (для Matrox, 3Dfx and Radeon,
низкоуровневых драйверов для конкретных карт (для Matrox, 3Dfx и Radeon,
Mach64, Permedia3)! Большинство из них поддерживают программное или аппаратное
масштабирование, поэтому Вы можете насладиться просмотром фильма на полном
экране.<application>MPlayer</application> поддерживает некоторые аппаратные
MPEG декодеры, такие как <link linkend="dvb">DVB</link> и
<link linkend="dxr3">DXR3/Hollywood+</link>. А как насчёт славных больших
сглаженных затенённых субтитров (<emphasis role="bold">14 поддерживаемых
типов</emphasis>) с Европейскими/ISO 8859-1,2 (венгерский, английский, чешский,
и т. п.), кириллическими, корейскими шрифтами, и вывода информации на экран
сглаженных затенённых субтитров (14 поддерживаемых
типов) с Европейскими/ISO 8859-1,2 (венгерский, английский, чешский,
и т.п.), кириллическими, корейскими шрифтами и вывода информации на экран
[On Screen Display (OSD)]?
</para>
<para>
Плеер без проблем проигрывает повреждённые MPEG файлы (полезно для некоторых VCD),
плохие AVI файлы, которые не проигрываются известным
windows media player. Даже AVI файлы без индекса являются проигрываемыми.
Вы можете временно сделать индекс с помощью ключа <option>-idx</option>, или
<application>Windows Media Player</application>.
Даже AVI файлы без индекса являются проигрываемыми.
Вы можете временно сделать индекс с помощью ключа <option>-idx</option> или
перманентно с помощью <application>MEncoder</application>'а,
таким образом получив возможность перемещаться
по фильму! Как видите стабильность и качество - наиболее важные вещи,
но скорость также изумительна. Кроме того у него мощная
система плагинов для манипуляции видео.
по фильму! Как видите стабильность и качество &mdash; наиболее важные вещи,
но скорость также изумительна. Кроме того имеется мощная
система фильтров для манипуляции с видео и аудио.
</para>
<para>
<application>MEncoder</application> (Кодировщик фильмов <application>MPlayer
</application>'a [<application>MPlayer</application>'s Movie Encoder]) - это простой
</application>'a) &mdash; это простой
кодировщик фильмов предназначенный для кодирования фильмов, проигрываемых MPlayer'ом
(<emphasis role="bold">AVI/ASF/OGG/DVD/VCD/VOB/MPG/MOV/VIV/FLI/RM/NUV/NET/PVA</emphasis>) в другие
AVI/ASF/OGG/DVD/VCD/VOB/MPG/MOV/VIV/FLI/RM/NUV/NET/PVA в другие
проигрываемые <application>MPlayer</application>'ом форматы (см. ниже).
Он может кодировать такими разными кодеками, как
<emphasis role="bold">MPEG-4 (DivX4)</emphasis> (1 или 2 прохода),
MPEG-4 (DivX4) (1 или 2 прохода),
<systemitem class="library">libavcodec</systemitem>,
<emphasis role="bold">PCM/MP3/VBR MP3</emphasis> звук.
PCM/MP3/VBR MP3 звук.
</para>
<itemizedlist>
<title>Возможности <application>MEncoder</application>'а</title>
<listitem><para>
кодирование из широкого спектра форматов файлов и декодеров
Кодирование из широкого спектра форматов файлов и декодеров
<application>MPlayer'а</application>
</para></listitem>
<listitem><para>
кодирование во все кодеки FFmpeg'овской библиотеки
Кодирование во все кодеки FFmpeg'овской библиотеки
<systemitem class="library">libavcodec</systemitem>
</para></listitem>
<listitem><para>
кодирование видео с <emphasis role="bold">V4L совместимых TV тюнеров
</emphasis>
Кодирование видео с V4L совместимых TV тюнеров
</para></listitem>
<listitem><para>
кодирование/мультиплексирование в "слоёные"[interleaved] AVI файлы
Кодирование/мультиплексирование в "слоёные"[interleaved] AVI файлы
с соответствующим индексом
</para></listitem>
<listitem><para>
создание файлов с аудио потоком из внешнего файла
Создание файлов с аудио потоком из внешнего файла
</para></listitem>
<listitem><para>
кодирование в 1, 2 или 3 прохода
Кодирование в 1, 2 или 3 прохода
</para></listitem>
<listitem><para>
<emphasis role="bold">VBR</emphasis> MP3 аудио
<important><para>
VBR MP3 аудио не всегда хорошо проигрывается плеерами Windows!
</para></important>
</para></listitem>
<listitem><para>
PCM аудио
</para></listitem>
<listitem><para>
копирование потоков
Копирование потоков
</para></listitem>
<listitem><para>
входная A/V синхронизация (основана на PTS, может быть отключена с помощью
Входная A/V синхронизация (основана на PTS, может быть отключена с помощью
ключа <option>-mc 0</option> )
</para></listitem>
<listitem><para>
коррекция FPS[кадров/сек] ключом <option>-ofps</option> (полезно при кодировании
29.97fps VOB в 24fps AVI)
Коррекция FPS[кадров/сек] ключом <option>-ofps</option> (полезно при кодировании
30000/1001 fps VOB в 24000/1001 fps AVI)
</para></listitem>
<listitem><para>
использование нашей очень мощной системы плагинов (обрезание[crop],
Использование нашей очень мощной системы плагинов (обрезание[crop],
расширение[expand], отражение[flip], пост-обработка[postprocess],
поворот[rotate], масштабирование[scale], rgb/yuv преобразования)
поворот[rotate], масштабирование[scale], RGB/YUV преобразования)
</para></listitem>
<listitem><para>
может кодировать DVD/VOBsub <emphasis role="bold">И</emphasis> текстовые субтитры
Может кодировать DVD/VOBsub и текстовые субтитры
в один выходной файл
</para></listitem>
<listitem><para>
может извлекать DVD субтитры в VOBsub формат
Может извлекать DVD субтитры в VOBsub формат
</para></listitem>
</itemizedlist>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- synced with r24035 -->
<!-- synced with r28660 -->
<chapter id="faq" xreflabel="FAQ">
<title>Часто Задаваемые вопросы</title>
@ -13,7 +13,7 @@
Как создать правильный патч для <application>MPlayer</application>?
</para></question>
<answer><para>
Мы создали <ulink url="../../tech/patches.txt">краткий документ</ulink>
Мы создали <ulink url="../../tech/patches.txt">краткий документ</ulink> (англ.),
описывающий все необходимые детали. Пожалуйста, следуйте инструкциям.
</para></answer>
</qandaentry>
@ -24,7 +24,7 @@
</para></question>
<answer><para>
Прочитайте <ulink url="../../tech/translations.txt">HOWTO по переводу</ulink> (англ.),
там все описано. За дополнительной помощью вы можете обратиться в рассылку
там все описано. За дополнительной помощью Вы можете обратиться в рассылку
<ulink url="http://lists.mplayerhq.hu/mailman/listinfo/mplayer-translations">MPlayer-translations</ulink>.
</para></answer>
</qandaentry>
@ -48,16 +48,16 @@
<answer><para>
Мы всегда рады приветствовать людей, занимающихся написанием кода и документации.
Для начала прочтите <ulink url="../../tech/">техническую документацию</ulink> (англ.).
Затем вам следует подписаться на список рассылки
Затем Вам следует подписаться на список рассылки
<ulink url="http://lists.mplayerhq.hu/mailman/listinfo/mplayer-dev-eng">MPlayer-dev-eng</ulink>
и начать написание кода. Если вы хотите помочь с документацией, то подпишитесь на
и начать написание кода. Если Вы хотите помочь с документацией, то подпишитесь на
<ulink url="http://lists.mplayerhq.hu/mailman/listinfo/mplayer-docs">MPlayer-docs</ulink>.
</para></answer>
</qandaentry>
<qandaentry>
<question><para>
Почему вы не используете autoconf/automake?
Почему Вы не используете autoconf/automake?
</para></question>
<answer><para>
У нас есть модульная, написанная вручную система сборки. Она хорошо справляется
@ -141,7 +141,7 @@ Configure завершается с указанным сообщением, и
библиотеки X11. Я не понимаю, ведь X11 у меня <emphasis>установлен</emphasis>!?
</para></question>
<answer><para>
... но вы не имеете установленных пакетов разработки X11. Либо они установлены
... но Вы не имеете установленных пакетов разработки X11. Либо они установлены
некорректно. Они называются <filename>XFree86-devel*</filename> в Red Hat,
<filename>xlibs-dev</filename> в Debian Woody и
<filename>libx11-dev</filename> в Debian Sarge. Также проверьте существуют ли
@ -152,7 +152,7 @@ Configure завершается с указанным сообщением, и
<qandaentry>
<question><para>
Сборка в Mac OS 10.3 приводит к нескольким ошибкам линковки
Сборка в Mac OS 10.3 приводит к нескольким ошибкам линковки.
</para></question>
<answer>
<para>
@ -162,10 +162,10 @@ ld: Undefined symbols:
_LLCStyleInfoCheckForOpenTypeTables referenced from QuartzCore expected to be defined in ApplicationServices
_LLCStyleInfoGetUserRunFeatures referenced from QuartzCore expected to be defined in ApplicationServices
</screen>
Эта проблема - результат разработчиков Apple, использующих 10.4 для компиляции их программ и
Эта проблема &mdash; результат разработчиков Apple, использующих 10.4 для компиляции их программ и
распространяющих бинарники пользователям 10.3 через Software Update.
Неопределённые символы присутствуют в 10.4, но их нет в 10.3.
Одно из решений - откат QuickTime до версии 7.0.1, но есть и лучшее.
Одно из решений &mdash; откат QuickTime до версии 7.0.1, но есть и лучшее.
</para>
<para>
Загрузите
@ -180,12 +180,12 @@ _LLCStyleInfoGetUserRunFeatures referenced from QuartzCore expected to be define
В config.mak следует добавить
<systemitem>-F/path/to/where/you/extracted</systemitem>
к переменной <systemitem>OPTFLAGS</systemitem>.
При использвании <application>X-Code</application> вы можете просто выбрать эти фреймворки
При использовании <application>X-Code</application> Вы можете просто выбрать эти фреймворки
вместо системных.
</para>
<para>
Получившийся бинарный <application>MPlayer</application> будет использовать фреймворк,
установленный в вашей системе, используя динамические ссылки времени исполнения.
установленный в Вашей системе, используя динамические ссылки времени исполнения.
(Это можно проверить, запустив <systemitem>otool -l</systemitem>).
</para>
</answer>
@ -221,13 +221,15 @@ _LLCStyleInfoGetUserRunFeatures referenced from QuartzCore expected to be define
<qandaentry>
<question><para>
у меня проблемы с проигрыванием файлов ... кодеком. Можно ли его использовать?
У меня происходит дамп ядра при попытке создать дамп потоков, что
не так?
</para></question>
<answer><para>
Проверьте <ulink url="../../codecs-status.html">состояние кодеков</ulink>,
если его там нет, то прочтите
<ulink url="../../tech/win32-codec-howto">HOWTO по импортированию кодеков</ulink>, и
свяжитесь с нами.
Не паникуйте. Убедитесь, что знаете где Ваше полотенце.</para>
<para>
Серьёзно, обратите внимание на смайлик и ищите файлы,
оканчивающиеся на
<filename>.dump</filename>.
</para></answer>
</qandaentry>
@ -235,10 +237,10 @@ _LLCStyleInfoGetUserRunFeatures referenced from QuartzCore expected to be define
<question><para>
В начале воспроизведения появляется следующее сообщение, хотя все
вроде бы работает прекрасно:
<screen>Linux RTC init: ioctl (rtc_pie_on): Permission denied</screen>
<screen>Ошибка инициализации Linux RTC в ioctl (rtc_pie_on): Permission denied</screen>
</para></question>
<answer><para>
Чтобы использовать RTC тайминг, вам необходимо специально настроенное ядро.
Чтобы использовать RTC тайминг, Вам необходимо специально настроенное ядро.
Подробности ищите в разделе <link linkend="rtc">RTC</link>.
</para></answer>
</qandaentry>
@ -285,7 +287,7 @@ A: 2.1 V: 2.2 A-V: -0.167 ct: 0.042 57/57 41% 0% 2.6% 0 4 49% 1.00x
</varlistentry>
<varlistentry>
<term><systemitem>ct: 0.042</systemitem></term>
<listitem><para>сделано коррекций A-V синхронизации</para></listitem>
<listitem><para>итоговая выполненная коррекция A-V синхронизации</para></listitem>
</varlistentry>
<varlistentry>
<term><systemitem>57/57</systemitem></term>
@ -315,14 +317,14 @@ A: 2.1 V: 2.2 A-V: -0.167 ct: 0.042 57/57 41% 0% 2.6% 0 4 49% 1.00x
<varlistentry>
<term><systemitem>4</systemitem></term>
<listitem><para>
текущий уровень постпроцессинга (при использовании
текущий уровень постобработки (при использовании
<option>-autoq</option>)
</para></listitem>
</varlistentry>
<varlistentry>
<term><systemitem>49%</systemitem></term>
<listitem><para>
текущий уровень использования кеша. (нормальное значение - около 50%)
текущий уровень использования кеша. (нормальное значение &mdash; около 50%)
</para></listitem>
</varlistentry>
<varlistentry>
@ -335,8 +337,8 @@ A: 2.1 V: 2.2 A-V: -0.167 ct: 0.042 57/57 41% 0% 2.6% 0 4 49% 1.00x
Большинство из них используются для отладки, используйте опцию <option>-quiet</option>
чтобы их скрыть. Имейте ввиду, что для некоторых файлов использование CPU модулем video_out
равно нулю (0%). Дело в том, что иногда он вызывается непосредственно из кодека и не может
быть измерен отдельно. Если вы хотите узнать скорость video_out в этом случае сравните
разницу при воспроизведении с <option>-vo null</option> и вашим драйвером вывода видео.
быть измерен отдельно. Если Вы хотите узнать скорость video_out в этом случае, сравните
разницу при воспроизведении с <option>-vo null</option> и Вашим драйвером вывода видео.
</para></answer>
</qandaentry>
@ -357,7 +359,7 @@ A: 2.1 V: 2.2 A-V: -0.167 ct: 0.042 57/57 41% 0% 2.6% 0 4 49% 1.00x
для определенного файла, например <filename>movie.avi</filename>?
</para></question>
<answer><para>
Создайте файл с именем <filename>movie.avi.conf</filename> и вашими опциями в нем,
Создайте файл с именем <filename>movie.avi.conf</filename> и Вашими опциями в нем,
сохраните его в каталог <filename class="directory">~/.mplayer</filename>
или в один каталог с медиа-файлом.
</para></answer>
@ -378,28 +380,7 @@ A: 2.1 V: 2.2 A-V: -0.167 ct: 0.042 57/57 41% 0% 2.6% 0 4 49% 1.00x
<qandaentry>
<question><para>
Я не могу получить доступ к GUI меню. Я делаю щелчок правой кнопкой мыши, но пункты меню
отсутствуют.
</para></question>
<answer><para>
Используете FVWM? Попробуйте следующее:
<orderedlist>
<listitem><para>
<menuchoice><guimenu>Start</guimenu><guisubmenu>Settings</guisubmenu>
<guisubmenu>Configuration</guisubmenu>
<guimenuitem>Base Configuration</guimenuitem></menuchoice>
</para></listitem>
<listitem><para>
Установите <systemitem>Use Applications position hints</systemitem>
в <systemitem>Yes</systemitem>
</para></listitem>
</orderedlist>
</para></answer>
</qandaentry>
<qandaentry>
<question><para>
Как запустить <application>MPlayer</application> в фоновой режиме?
Как запустить <application>MPlayer</application> в фоновом режиме?
</para></question>
<answer><para>
Используйте:
@ -430,7 +411,7 @@ mplayer <replaceable>опции</replaceable> <replaceable>имя_файла</re
в новых версиях программы внесены несовместимые изменения.
При использовании неэкспертами, это верный путь к, на первый взгляд, случайным и
неподдающимся локализации крахам и проблемам воспроизведения.
Если этот файл присутствует где-либо в вашей системе, удалите его.
Если этот файл присутствует где-либо в Вашей системе, удалите его.
</para></answer>
</qandaentry>
@ -479,7 +460,7 @@ mplayer -vo null -ao null -frames 0 -v <replaceable>имя_файла</replaceab
Я загрузил фильм из P2P сети, но он не работает!
</para></question>
<answer><para>
У вас испорченный или поддельный файл. Если вы получили его от друзей, которые
У Вас испорченный или поддельный файл. Если Вы получили его от друзей, которые
утверждают, что он работает, проверьте контрольную сумму <application>md5sum</application>.
</para></answer>
</qandaentry>
@ -493,7 +474,7 @@ mplayer -vo null -ao null -frames 0 -v <replaceable>имя_файла</replaceab
<link linkend="fonts-osd">Шрифты и OSD</link> раздела, посвященного установке.
Если используете TrueType шрифты, проверьте, что установлена
библиотека <systemitem class="library">FreeType</systemitem>.
Стоит также проверить ваши субтитры при помощи текстового редактора или
Стоит также проверить Ваши субтитры при помощи текстового редактора или
стороннего проигрывателя. Попробуйте преобразовать их в другой формат.
</para></answer>
</qandaentry>
@ -514,11 +495,11 @@ Windows DLLs (таким как <application>MPlayer</application>).
Когда <application>MPlayer</application> пытается загрузить Windows DLL, он хочет
поместить ее по определенному адресу (0x400000). Если там уже находится важная
системная библиотека, <application>MPlayer</application> рухнет.
(Типичные симптомы - segmentation fault при попытке воспроизвести файлы
(Типичные симптомы &mdash; segmentation fault при попытке воспроизвести файлы
Windows Media 9.)
</para>
<para>
Если столкнулись с этой проблемой, то у вас есть два варианта:
Если столкнулись с этой проблемой, то у Вас есть два варианта:
<itemizedlist>
<listitem><para>
Подождать пару недель. Все может снова заработать.
@ -554,7 +535,7 @@ Windows Media 9.)
<qandaentry>
<question><para>
<application>MPlayer</application> умирает с сообщением:
<screen>MPlayer interrupted by signal 4 in module: decode_video</screen>
<screen>MPlayer прерван сигналом 4 в модуле: decode_video</screen>
</para></question>
<answer><para>
Не используйте <application>MPlayer</application> на процессоре, отличном от того,
@ -565,11 +546,11 @@ Windows Media 9.)
<qandaentry>
<question><para>
При попытке захвата с тюнера, все работает, но цвета - неправильные. С другими приложениями
При попытке захвата с тюнера, все работает, но цвета &mdash; неправильные. С другими приложениями
все в порядке.
</para></question>
<answer><para>
Ваша карта сообщает о некотором пространстве цветов как поддерживаемом, хотя на самом
Ваша карта, вероятно, сообщает о некотором пространстве цветов как поддерживаемом, хотя на самом
деле его не поддерживает. Попробуйте с YUY2 вместо YV12 по умолчанию (смотрите
секцию <link linkend="tv-input">TV</link>).
</para></answer>
@ -597,7 +578,7 @@ Windows Media 9.)
<answer><para>
Это тоже эффект системы управления энергопотреблением (смотрите выше).
Подсоедините разъем внешнего питания <emphasis role="bold">до</emphasis>
включения ноутбука лиюо используйте опцию <option>-nortc</option>.
включения ноутбука либо используйте опцию <option>-nortc</option>.
</para></answer>
</qandaentry>
@ -605,11 +586,11 @@ Windows Media 9.)
<question><para>
При воспроизведении фильма изображение вдруг начинает дергаться и появляется
следующее сообщение:
<screen>Badly interleaved AVI file detected - switching to -ni mode...</screen>
<screen>Обнаружен плохо 'слоёный' AVI файл - переключаюсь в -ni режим...</screen>
</para></question>
<answer><para>
Файлы с некорректным чередованием и опция
<option>-cache</option> вместе работают не очень хорошо..
<option>-cache</option> вместе работают не очень хорошо.
Попробуйте <option>-nocache</option>.
</para></answer>
</qandaentry>
@ -618,7 +599,7 @@ Windows Media 9.)
<!-- ********** -->
<qandadiv id="faq-driver">
<title>Проблемы драйверов вывода аудио/видео (ao/vo)</title>
<title>Проблемы драйверов вывода видео/аудио (vo/ao)</title>
<qandaentry>
<question><para>
@ -627,9 +608,9 @@ Windows Media 9.)
</para></question>
<answer><para>
Ваш драйвер вывода видео аппаратно не поддерживает масштабирование, и, поскольку
поблочное программное масштабирование может быть ужасно медленным,
программное масштабирование может быть ужасно медленным,
<application>MPlayer</application> не задействует его автоматически.
Скорее всего вы используете драйвер вывода <systemitem>x11</systemitem> вместо
Скорее всего Вы используете драйвер вывода <systemitem>x11</systemitem> вместо
<systemitem>xv</systemitem>.
Попробуйте указать <option>-vo xv</option> в командной строке или
прочтите <link linkend="video">раздел видео</link>, чтобы узнать о других
@ -642,7 +623,7 @@ Windows Media 9.)
<question><para>
Я только что установил <application>MPlayer</application>. Попытка открыть файл
приводит к фатальной ошибке:
<screen>Error opening/initializing the selected video_out (-vo) device.</screen>
<screen>Ошибка при открытии/инициализации выбранного устройства видеовывода (-vo).</screen>
Как решить проблему?
</para></question>
<answer><para>
@ -663,7 +644,7 @@ vo_driver = <replaceable>выбранный_драйвер</replaceable>
<qandaentry>
<question><para>
У меня проблемы с <replaceable>[ваш оконный менеджер]</replaceable> и
У меня проблемы с <replaceable>[Ваш оконный менеджер]</replaceable> и
полноэкранным режимом xv/xmga/sdl/x11 ...
</para></question>
<answer><para>
@ -684,17 +665,6 @@ vo_driver = <replaceable>выбранный_драйвер</replaceable>
</para></answer>
</qandaentry>
<qandaentry>
<question><para>
Мой компьютер проигрывает MS DivX AVI с разрешениями ~ 640x300 и MP3 стереозвуком
слишком медленно. Если указать опцию <option>-nosound</option>, все ОК (но без звука).
</para></question>
<answer><para>
Ваша машина слишком медленная либо драйвер звуковой карты неправильно работает.
Обратитесь к документации, чтобы узнать можно ли улучшить производительность.
</para></answer>
</qandaentry>
<qandaentry>
<question><para>
Как использовать <application>dmix</application> с
@ -712,19 +682,21 @@ vo_driver = <replaceable>выбранный_драйвер</replaceable>
Нет звука при воспроизведении видео и появляется ошибка подобная этой:
<screen>
AO: [oss] 44100Hz 2ch Signed 16-bit (Little-Endian)
audio_setup: Can't open audio device /dev/dsp: Device or resource busy
couldn't open/init audio device -> NOSOUND
Audio: no sound!!!
Start playing...
[AO OSS] инициализация аудио: Не могу открыть аудиоустройство /dev/dsp: Device or resource busy
Не могу открыть/инициализировать аудиоустройство -> без звука.
Аудио: без звука
Начало воспроизведения...
</screen>
</para></question>
<answer><para>
Используете KDE или GNOME со звуковыми службами aRts или ESD?
Попробуйте отключить службу звука или используйте <option>-ao arts</option> или
<option>-ao esd</option> опции, для указания <application>MPlayer</application>
использовать aRts или ESD. Также возможно, что вы используете ALSA без
эмуляции OSS, попробуйте загрузить ALSA OSS модули ядра или добавьте опцию
<option>-ao alsa</option> в командную строку, для использования ALSA напрямую.
использовать aRts или ESD.
Также возможно, что Вы используете ALSA без эмуляции OSS,
попробуйте загрузить ALSA OSS модули ядра или добавьте опцию
<option>-ao alsa</option> в командную строку, для использования
ALSA напрямую.
</para></answer>
</qandaentry>
@ -735,12 +707,12 @@ Start playing...
</para></question>
<answer><para>
aRts блокирует звуковое устройство. Либо подождите старта видео, либо
отключите службу aRts в центре управления. Если вы хотите использовать звук
отключите службу aRts в центре управления. Если Вы хотите использовать звук
через aRts, укажите вывод звука через встроенный звуковой драйвер aRts
(<option>-ao arts</option>). Если он не работает, либо
<application>MPlayer</application> собран без него, попробуйте SDL
(<option>-ao sdl</option>) и убедитесь, что SDL может работать со
звуком aRts. Ещё один вариант - запуск <application>MPlayer</application>
звуком aRts. Ещё один вариант &mdash; запуск <application>MPlayer</application>
с artsdsp.
</para></answer>
</qandaentry>
@ -748,11 +720,11 @@ aRts блокирует звуковое устройство. Либо подо
<qandaentry>
<question><para>
Проблема с синхронизацией A/V. Некоторые из моих AVI файлов проигрываются нормально, но
некоторые - с двойной скоростью!
некоторые &mdash; с двойной скоростью!
</para></question>
<answer><para>
У вас неверно работающая звуковая карта/драйвер. Скорее всего, поддерживается работа
только с 44100Hz, а вы пытаетесь проиграть файл с 22050Hz звуком. Попробуйте
У Вас неверно работающая звуковая карта/драйвер. Скорее всего, поддерживается работа
только с 44100Гц, а Вы пытаетесь проиграть файл с 22050Гц звуком. Попробуйте
звуковой фильтр <systemitem>resample</systemitem>.
</para></answer>
</qandaentry>
@ -761,7 +733,7 @@ aRts блокирует звуковое устройство. Либо подо
<question><para>
При проигрывании фильма происходит рассинхронизация звука и видео или
<application>MPlayer</application> рушится с ошибкой:
<screen>DEMUXER: Too many (945 in 8390980 bytes) video packets in the buffer!</screen>
<screen>Слишком много (945 в 8390980 байтах) видеопакетов в буфере!</screen>
</para></question>
<answer><para>
Причин может быть несколько.
@ -781,11 +753,11 @@ aRts блокирует звуковое устройство. Либо подо
<listitem><para>
Многие FLV файлы будут правильно воспроизводиться только с <option>-correct-pts</option>.
К сожалению, <application>MEncoder</application> такой опции не имеет,
но вы можете попробовать вручную указать правильное значение <option>-fps</option>,
если оно вам известно.
но Вы можете попробовать вручную указать правильное значение <option>-fps</option>,
если оно Вам известно.
</para></listitem>
<listitem><para>
У вас неверно работает звуковой драйвер.
У Вас неверно работает звуковой драйвер.
</para></listitem>
</itemizedlist>
</para></answer>
@ -813,28 +785,14 @@ aRts блокирует звуковое устройство. Либо подо
<answer><para>
<application>MPlayer</application> не поддерживает DVD меню в силу серьезных
архитектурных ограничений, которые мешают правильной обработке неподвижных
изображений и интерактивного содержимого. Если хотите модные меню, вам
изображений и интерактивного содержимого. Если хотите модные меню, Вам
придется использовать другой проигрыватель, например <application>xine</application>,
<application>vlc</application> или <application>Ogle</application>.
Если вы хотите получить DVD навигацию в <application>MPlayer</application>,
Если Вы хотите получить DVD навигацию в <application>MPlayer</application>,
реализуйте ее самостоятельно, но имейте ввиду, что это нелегкое и ответственное дело.
</para></answer>
</qandaentry>
<qandaentry>
<question><para>
Я не могу посмотреть некоторые новые DVD от Sony Pictures/BMG.
</para></question>
<answer><para>
Это нормально. Вас ободрали и продали намеренно испорченный диск. Единственный способ
просмотреть его - избежать воспроизведения плохих блоков, воспользовавшись DVDnav
вместо mpdvdkit2. Это можно сделать, собрав <application>MPlayer</application>
с поддержкой DVDnav, и заменив после этого dvd:// на dvdnav:// в командной строке.
DVDnav пока что настолько несовместим с mpdvdkit, что вам придется указать опцию
<option>--disable-mpdvdkit</option> скрипту configure.
</para></answer>
</qandaentry>
<qandaentry>
<question><para>
Как насчет субтитров? <application>MPlayer</application> умеет их отображать?
@ -869,7 +827,7 @@ DVD не проигрываются, MPlayer зависает или вывод
Нужны ли права root (setuid) для воспроизведения DVD?
</para></question>
<answer><para>
Нет. Конечно, вы должны иметь необходимые права на файл DVD устройства
Нет. Конечно, Вы должны иметь необходимые права на файл DVD устройства
<filename class="directory">/dev/</filename>).
</para></answer>
</qandaentry>
@ -974,7 +932,7 @@ mplayer dvd://5 -dumpstream -dumpfile <replaceable>dvd_dump.vob</replaceable>
</para></question>
<answer><para>
Попробуйте скрипт <filename>mencvcd.sh</filename> из каталога
<filename class="directory">TOOLS</filename>. С его помощью вы можете перекодировать
<filename class="directory">TOOLS</filename>. С его помощью Вы можете перекодировать
DVD или другие фильмы в VCD или SVCD формат и даже записывать их на CD.
</para></answer>
</qandaentry>
@ -1003,7 +961,7 @@ MPEG файлы могут быть объединены в один, если
<application>MEncoder</application>'а
работать с несколькими файлами сразу:
<screen>
mencoder -ovc copy -oac copy -o <replaceable>out.avi</replaceable> <replaceable>file1.avi</replaceable> <replaceable>file2.avi</replaceable>
mencoder -ovc copy -oac copy -o <replaceable>out.avi</replaceable> <replaceable>файл1.avi</replaceable> <replaceable>файл2.avi</replaceable>
</screen>
Это будет работать только если файлы имеют одинаковое разрешение и сжаты одинаковым
кодеком. Также попробуйте
@ -1046,7 +1004,7 @@ mencoder <replaceable>input.avi</replaceable> -ovc copy -oac copy -o <replaceabl
<qandaentry>
<question><para>
Как сделать копию/закодировать VOB файл с испорченным началом?
Как сделать копию и закодировать VOB файл с испорченным началом?
</para></question>
<answer><para>
Основная проблема при попытке кодировать испорченный VOB файл
@ -1055,7 +1013,8 @@ mencoder <replaceable>input.avi</replaceable> -ovc copy -oac copy -o <replaceabl
испорченное содержимое.
</para></footnote>
состоит в том, что будет трудно закодировать файл с хорошей
A/V синхронизацией. Один из способов заключается в отбрасывании испорченных данных
A/V синхронизацией.
Один из способов заключается в отбрасывании испорченных данных
и кодирования только корретной части. Сначала ищите начало корректных данных (меняя
параметр "колво_байтов_для_пропуска"):
<screen>
@ -1158,7 +1117,7 @@ Pos: 264.5s 6612f ( 2%) 7.12fps Trem: 576min 2856mb A-V:0.065 [2156:192]
Не могу перекодировать ASF файл в AVI/MPEG-4, потому что используется 1000fps.
</para></question>
<answer><para>
Поскольку ASF использует переменную частоту кадров, а AVI - фиксированную,
Поскольку ASF использует переменную частоту кадров, а AVI &mdash; фиксированную,
необходимо её установить вручную опцией <option>-ofps</option>.
</para></answer>
</qandaentry>
@ -1185,12 +1144,12 @@ Pos: 264.5s 6612f ( 2%) 7.12fps Trem: 576min 2856mb A-V:0.065 [2156:192]
<screen>
mkfifo encode
mplayer -ao pcm -aofile <replaceable>encode</replaceable> dvd://1 &amp;
lame <replaceable>ваши_опции</replaceable> <replaceable>encode</replaceable> <replaceable>music.mp3</replaceable>
lame <replaceable>Ваши_опции</replaceable> <replaceable>encode</replaceable> <replaceable>music.mp3</replaceable>
rm <replaceable>encode</replaceable>
</screen>
Это позволяет использовать любой кодер, не только
<application>LAME</application>,
просто замените <command>lame</command> на ваш предпочитаемый кодер.
просто замените <command>lame</command> на Ваш предпочитаемый кодер.
</para></answer>
</qandaentry>
@ -1202,14 +1161,14 @@ rm <replaceable>encode</replaceable>
<answer><para>
<systemitem class="library">libavcodec</systemitem>, родная библиотека
кодирования MPEG-4, обычно поставляемая с <application>MEncoder</application>,
устанавливала FourCC в 'DIVX' при сжатии MPEG-4 видео (FourCC -
устанавливала FourCC в 'DIVX' при сжатии MPEG-4 видео (FourCC &mdash;
это тэг AVI, указывающий нужную программу сжатия и декодирования видео,
т.е. кодек). Поэтому многие люди считают, что
<systemitem class="library">libavcodec</systemitem> была библиотекой
кодирования DivX, когда на самом деле это совершенно другая библиотека
кодирования MPEG-4, реализующая стандарт MPEG-4 значительно лучше, чем DivX.
Поэтому новый FourCC, по умолчанию используемый
<systemitem class="library">libavcodec</systemitem> -это 'FMP4', но вы
<systemitem class="library">libavcodec</systemitem> &mdash; это 'FMP4', но Вы
можете переопределить это поведение, используя опцию
<application>MEncoder</application>'а
<option>-ffourcc</option>.
@ -1219,14 +1178,15 @@ mencoder <replaceable>input.avi</replaceable> -o <replaceable>output.avi</replac
</screen>
Имейте ввиду, что этот пример устанавливает FourCC в XVID, а не DIVX.
Это рекомендуется, т.к. DIVX FourCC означает DivX4, очень простой MPEG-4
кодек, в то время как DX50 и XVID оба - полные MPEG-4 (ASP).
Таким образом, если вы установите FourCC в DIVX, некоторые плохие
кодек, в то время как DX50 и XVID оба &mdash; полные MPEG-4 (ASP).
Таким образом, если Вы установите FourCC в DIVX, некоторые плохие
программные или аппаратные проигрыватели могут быть в шоке от дополнительных
возможностей, которые
<systemitem class="library">libavcodec</systemitem> поддерживает , а DivX - нет;
<systemitem class="library">libavcodec</systemitem> поддерживает,
а DivX &mdash; нет;
с другой стороны <systemitem class="library">Xvid</systemitem>
по функциональности ближе к <systemitem class="library">libavcodec</systemitem>
и подерживается практически любыми приличными проигрывателями.
и поддерживается любыми приличными проигрывателями.
</para></answer>
</qandaentry>
@ -1237,7 +1197,7 @@ mencoder <replaceable>input.avi</replaceable> -o <replaceable>output.avi</replac
<answer><para>
Используйте <filename>aconvert.sh</filename> из подкаталога
<filename class="directory">TOOLS</filename>
дерева каталогов MPlayer.
дерева исходников MPlayer.
</para></answer>
</qandaentry>

View File

@ -1,6 +1,8 @@
#ifndef MPLAYER_CPUDETECT_H
#define MPLAYER_CPUDETECT_H
#include "config.h"
#define CPUTYPE_I386 3
#define CPUTYPE_I486 4
#define CPUTYPE_I586 5

View File

@ -50,14 +50,19 @@ static const struct {
{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},
// 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.
{IMGFMT_YV12, PIX_FMT_YUVJ420P},
{IMGFMT_422P, PIX_FMT_YUVJ422P},
{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},

View File

@ -75,7 +75,7 @@ static char help_text[]=
#define MSGTR_TryForceVideoFmtStr "Попытка форсировать семейство видеокодеков %s...\n"
#define MSGTR_CantFindVideoCodec "Не могу найти кодек для выбранного -vo и видеоформата 0x%X!\n"
#define MSGTR_CannotInitVO "ФАТАЛЬНАЯ ОШИБКА: Не могу инициализировать видеодрайвер!\n"
#define MSGTR_CannotInitAO "не могу открыть/инициализировать аудиоустройство -> БЕЗ ЗВУКА\n"
#define MSGTR_CannotInitAO "Не могу открыть/инициализировать аудиоустройство -> без звука.\n"
#define MSGTR_StartPlaying "Начало воспроизведения...\n"
#define MSGTR_SystemTooSlow "\n\n"\
@ -103,7 +103,7 @@ static char help_text[]=
#define MSGTR_NoGui "MPlayer был скомпилирован БЕЗ поддержки GUI!\n"
#define MSGTR_GuiNeedsX "GUI MPlayer необходим X11!\n"
#define MSGTR_Playing "\nВоспроизведение %s.\n"
#define MSGTR_NoSound "Аудио: без звука!!!\n"
#define MSGTR_NoSound "Аудио: без звука\n"
#define MSGTR_FPSforced "Кадры/сек форсированы в %5.3f (время кадра: %5.3f).\n"
#define MSGTR_CompiledWithRuntimeDetection "Скомпилировано для определения типа процессора во время выполнения.\n"
#define MSGTR_CompiledWithCPUExtensions "Скомпилировано для x86 CPU со следующими расширениями:"

View File

@ -52,6 +52,8 @@ static struct pa_threaded_mainloop *mainloop;
/** A temporary variable to store the current volume */
static pa_cvolume volume;
static int broken_pause;
LIBAO_EXTERN(pulse)
#define GENERIC_ERR_MSG(ctx, str) \
@ -138,6 +140,7 @@ static int init(int rate_hz, int channels, int format, int flags) {
char *devarg = NULL;
char *host = NULL;
char *sink = NULL;
char *version = pa_get_library_version();
if (ao_subdevice) {
devarg = strdup(ao_subdevice);
@ -146,6 +149,17 @@ static int init(int rate_hz, int channels, int format, int flags) {
if (devarg[0]) host = devarg;
}
broken_pause = 0;
// not sure which versions are affected, assume 0.9.1*
// known bad: 0.9.14, 0.9.13
// known good: 0.9.9, 0.9.10
// to test: pause, wait ca. 5 seconds framestep and see if MPlayer hangs somewhen
if (strncmp(version, "0.9.1", 5) == 0 && strncmp(version, "0.9.10", 6) != 0) {
mp_msg(MSGT_AO, MSGL_WARN, "[pulse] working around probably broken pause functionality,\n"
" see http://www.pulseaudio.org/ticket/440\n");
broken_pause = 1;
}
ss.channels = channels;
ss.rate = rate_hz;
@ -288,6 +302,10 @@ static void audio_pause(void) {
/** Resume the audio stream by uncorking it on the server */
static void audio_resume(void) {
// without this, certain versions will cause an infinite hang because
// pa_stream_writable_size returns 0 always.
// Note that this workaround causes A-V desync after pause
if (broken_pause) reset();
cork(0);
}

View File

@ -584,14 +584,7 @@ static int init(int rate,int channels,int format,int flags){
ao_data.bps = byte_per_sec = bytes_per_sample * ao_data.samplerate;
ao_data.outburst = byte_per_sec > 100000 ? 16384 : 8192;
AUDIO_INITINFO(&info);
info.play.samples = 0;
info.play.eof = 0;
info.play.error = 0;
ioctl (audio_fd, AUDIO_SETINFO, &info);
queued_bursts = 0;
queued_samples = 0;
reset();
return 1;
}
@ -608,7 +601,15 @@ static void uninit(int immed){
// stop playing and empty buffers (for seeking/pause)
static void reset(void){
audio_info_t info;
flush_audio(audio_fd);
AUDIO_INITINFO(&info);
info.play.samples = 0;
info.play.eof = 0;
info.play.error = 0;
ioctl(audio_fd, AUDIO_SETINFO, &info);
queued_bursts = 0;
queued_samples = 0;
}

View File

@ -879,7 +879,7 @@ static mp_image_t *decode(sh_video_t *sh, void *data, int len, int flags){
#if CONFIG_XVMC || CONFIG_VDPAU
static enum PixelFormat get_format(struct AVCodecContext *avctx,
const enum PixelFormat *fmt){
enum PixelFormat selected_format = fmt[0];
enum PixelFormat selected_format;
int imgfmt;
sh_video_t *sh = avctx->opaque;
int i;
@ -889,10 +889,10 @@ static enum PixelFormat get_format(struct AVCodecContext *avctx,
if(!IMGFMT_IS_XVMC(imgfmt) && !IMGFMT_IS_VDPAU(imgfmt)) continue;
mp_msg(MSGT_DECVIDEO, MSGL_INFO, MSGTR_MPCODECS_TryingPixfmt, i);
if(init_vo(sh, fmt[i]) >= 0) {
selected_format = fmt[i];
break;
}
}
selected_format = fmt[i];
imgfmt = pixfmt2imgfmt(selected_format);
if(IMGFMT_IS_XVMC(imgfmt) || IMGFMT_IS_VDPAU(imgfmt)) {
vd_ffmpeg_ctx *ctx = sh->context;

View File

@ -160,10 +160,6 @@ static int open(vf_instance_t *vf, char* args)
vf->priv->hue *= M_PI / 180.0;
process = process_C;
#if HAVE_MMXX
if(gCpuCaps.hasMMX) process = process_MMX;
#endif
return 1;
}

View File

@ -624,7 +624,15 @@ static int demux_real_fill_buffer(demuxer_t *demuxer, demux_stream_t *dsds)
if (len < 12){
mp_msg(MSGT_DEMUX, MSGL_V,"%08X: packet v%d len=%d \n",(int)demuxer->filepos,(int)version,(int)len);
mp_msg(MSGT_DEMUX, MSGL_WARN,"bad packet len (%d)\n", len);
stream_skip(demuxer->stream, len);
if ((unsigned)demuxer->video->id < MAX_STREAMS) {
if (priv->current_vpacket + 1 < priv->index_table_size[demuxer->video->id]) {
stream_seek(demuxer->stream, priv->index_table[demuxer->video->id][++priv->current_vpacket].offset);
}
} else if ((unsigned)demuxer->audio->id < MAX_STREAMS) {
if (priv->current_apacket + 1 < priv->index_table_size[demuxer->audio->id]) {
stream_seek(demuxer->stream, priv->index_table[demuxer->audio->id][++priv->current_apacket].offset);
}
}
continue; //goto loop;
}

View File

@ -206,7 +206,7 @@
"m" (lumSrc+lumFilterSize), "m" (chrSrc+chrFilterSize)
: "%eax", "%ebx", "%ecx", "%edx", "%esi"
*/
#define YSCALEYUV2PACKEDX \
#define YSCALEYUV2PACKEDX_UV \
__asm__ volatile(\
"xor %%"REG_a", %%"REG_a" \n\t"\
ASMALIGN(4)\
@ -229,8 +229,9 @@
"paddw %%mm5, %%mm4 \n\t"\
"test %%"REG_S", %%"REG_S" \n\t"\
" jnz 2b \n\t"\
\
"lea "LUM_MMX_FILTER_OFFSET"(%0), %%"REG_d" \n\t"\
#define YSCALEYUV2PACKEDX_YA(offset) \
"lea "offset"(%0), %%"REG_d" \n\t"\
"mov (%%"REG_d"), %%"REG_S" \n\t"\
"movq "VROUNDER_OFFSET"(%0), %%mm1 \n\t"\
"movq %%mm1, %%mm7 \n\t"\
@ -248,6 +249,10 @@
"test %%"REG_S", %%"REG_S" \n\t"\
" jnz 2b \n\t"\
#define YSCALEYUV2PACKEDX \
YSCALEYUV2PACKEDX_UV \
YSCALEYUV2PACKEDX_YA(LUM_MMX_FILTER_OFFSET) \
#define YSCALEYUV2PACKEDX_END \
:: "r" (&c->redDither), \
"m" (dummy), "m" (dummy), "m" (dummy),\
@ -255,7 +260,7 @@
: "%"REG_a, "%"REG_d, "%"REG_S \
);
#define YSCALEYUV2PACKEDX_ACCURATE \
#define YSCALEYUV2PACKEDX_ACCURATE_UV \
__asm__ volatile(\
"xor %%"REG_a", %%"REG_a" \n\t"\
ASMALIGN(4)\
@ -304,8 +309,9 @@
"paddw %%mm0, %%mm6 \n\t"\
"movq %%mm4, "U_TEMP"(%0) \n\t"\
"movq %%mm6, "V_TEMP"(%0) \n\t"\
\
"lea "LUM_MMX_FILTER_OFFSET"(%0), %%"REG_d" \n\t"\
#define YSCALEYUV2PACKEDX_ACCURATE_YA(offset) \
"lea "offset"(%0), %%"REG_d" \n\t"\
"mov (%%"REG_d"), %%"REG_S" \n\t"\
"pxor %%mm1, %%mm1 \n\t"\
"pxor %%mm5, %%mm5 \n\t"\
@ -349,6 +355,10 @@
"movq "U_TEMP"(%0), %%mm3 \n\t"\
"movq "V_TEMP"(%0), %%mm4 \n\t"\
#define YSCALEYUV2PACKEDX_ACCURATE \
YSCALEYUV2PACKEDX_ACCURATE_UV \
YSCALEYUV2PACKEDX_ACCURATE_YA(LUM_MMX_FILTER_OFFSET)
#define YSCALEYUV2RGBX \
"psubw "U_OFFSET"(%0), %%mm3 \n\t" /* (U-128)8*/\
"psubw "V_OFFSET"(%0), %%mm4 \n\t" /* (V-128)8*/\
@ -384,7 +394,6 @@
"packuswb %%mm0, %%mm2 \n\t"\
"packuswb %%mm6, %%mm5 \n\t"\
"packuswb %%mm3, %%mm4 \n\t"\
"pxor %%mm7, %%mm7 \n\t"
#define REAL_YSCALEYUV2PACKED(index, c) \
"movq "CHR_MMX_FILTER_OFFSET"+8("#c"), %%mm0 \n\t"\
@ -424,7 +433,7 @@
#define YSCALEYUV2PACKED(index, c) REAL_YSCALEYUV2PACKED(index, c)
#define REAL_YSCALEYUV2RGB(index, c) \
#define REAL_YSCALEYUV2RGB_UV(index, c) \
"xor "#index", "#index" \n\t"\
ASMALIGN(4)\
"1: \n\t"\
@ -448,6 +457,8 @@
"pmulhw "UG_COEFF"("#c"), %%mm3 \n\t"\
"pmulhw "VG_COEFF"("#c"), %%mm4 \n\t"\
/* mm2=(U-128)8, mm3=ug, mm4=vg mm5=(V-128)8 */\
#define REAL_YSCALEYUV2RGB_YA(index, c) \
"movq (%0, "#index", 2), %%mm0 \n\t" /*buf0[eax]*/\
"movq (%1, "#index", 2), %%mm1 \n\t" /*buf1[eax]*/\
"movq 8(%0, "#index", 2), %%mm6 \n\t" /*buf0[eax]*/\
@ -460,6 +471,8 @@
"psraw $4, %%mm7 \n\t" /* buf0[eax] - buf1[eax] >>4*/\
"paddw %%mm0, %%mm1 \n\t" /* buf0[eax]yalpha1 + buf1[eax](1-yalpha1) >>16*/\
"paddw %%mm6, %%mm7 \n\t" /* buf0[eax]yalpha1 + buf1[eax](1-yalpha1) >>16*/\
#define REAL_YSCALEYUV2RGB_COEFF(c) \
"pmulhw "UB_COEFF"("#c"), %%mm2 \n\t"\
"pmulhw "VR_COEFF"("#c"), %%mm5 \n\t"\
"psubw "Y_OFFSET"("#c"), %%mm1 \n\t" /* 8(Y-16)*/\
@ -487,8 +500,13 @@
"packuswb %%mm0, %%mm2 \n\t"\
"packuswb %%mm6, %%mm5 \n\t"\
"packuswb %%mm3, %%mm4 \n\t"\
"pxor %%mm7, %%mm7 \n\t"
#define YSCALEYUV2RGB(index, c) REAL_YSCALEYUV2RGB(index, c)
#define YSCALEYUV2RGB_YA(index, c) REAL_YSCALEYUV2RGB_YA(index, c)
#define YSCALEYUV2RGB(index, c) \
REAL_YSCALEYUV2RGB_UV(index, c) \
REAL_YSCALEYUV2RGB_YA(index, c) \
REAL_YSCALEYUV2RGB_COEFF(c)
#define REAL_YSCALEYUV2PACKED1(index, c) \
"xor "#index", "#index" \n\t"\
@ -551,7 +569,7 @@
"packuswb %%mm0, %%mm2 \n\t"\
"packuswb %%mm6, %%mm5 \n\t"\
"packuswb %%mm3, %%mm4 \n\t"\
"pxor %%mm7, %%mm7 \n\t"
#define YSCALEYUV2RGB1(index, c) REAL_YSCALEYUV2RGB1(index, c)
#define REAL_YSCALEYUV2PACKED1b(index, c) \
@ -623,33 +641,32 @@
"packuswb %%mm0, %%mm2 \n\t"\
"packuswb %%mm6, %%mm5 \n\t"\
"packuswb %%mm3, %%mm4 \n\t"\
"pxor %%mm7, %%mm7 \n\t"
#define YSCALEYUV2RGB1b(index, c) REAL_YSCALEYUV2RGB1b(index, c)
#define REAL_WRITEBGR32(dst, dstw, index) \
/* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */\
"movq %%mm2, %%mm1 \n\t" /* B */\
"movq %%mm5, %%mm6 \n\t" /* R */\
"punpcklbw %%mm4, %%mm2 \n\t" /* GBGBGBGB 0 */\
"punpcklbw %%mm7, %%mm5 \n\t" /* 0R0R0R0R 0 */\
"punpckhbw %%mm4, %%mm1 \n\t" /* GBGBGBGB 2 */\
"punpckhbw %%mm7, %%mm6 \n\t" /* 0R0R0R0R 2 */\
"movq %%mm2, %%mm0 \n\t" /* GBGBGBGB 0 */\
"movq %%mm1, %%mm3 \n\t" /* GBGBGBGB 2 */\
"punpcklwd %%mm5, %%mm0 \n\t" /* 0RGB0RGB 0 */\
"punpckhwd %%mm5, %%mm2 \n\t" /* 0RGB0RGB 1 */\
"punpcklwd %%mm6, %%mm1 \n\t" /* 0RGB0RGB 2 */\
"punpckhwd %%mm6, %%mm3 \n\t" /* 0RGB0RGB 3 */\
#define REAL_WRITEBGR32(dst, dstw, index, b, g, r, a, q0, q2, q3, t) \
"movq "#b", "#q2" \n\t" /* B */\
"movq "#r", "#t" \n\t" /* R */\
"punpcklbw "#g", "#b" \n\t" /* GBGBGBGB 0 */\
"punpcklbw "#a", "#r" \n\t" /* ARARARAR 0 */\
"punpckhbw "#g", "#q2" \n\t" /* GBGBGBGB 2 */\
"punpckhbw "#a", "#t" \n\t" /* ARARARAR 2 */\
"movq "#b", "#q0" \n\t" /* GBGBGBGB 0 */\
"movq "#q2", "#q3" \n\t" /* GBGBGBGB 2 */\
"punpcklwd "#r", "#q0" \n\t" /* ARGBARGB 0 */\
"punpckhwd "#r", "#b" \n\t" /* ARGBARGB 1 */\
"punpcklwd "#t", "#q2" \n\t" /* ARGBARGB 2 */\
"punpckhwd "#t", "#q3" \n\t" /* ARGBARGB 3 */\
\
MOVNTQ(%%mm0, (dst, index, 4))\
MOVNTQ(%%mm2, 8(dst, index, 4))\
MOVNTQ(%%mm1, 16(dst, index, 4))\
MOVNTQ(%%mm3, 24(dst, index, 4))\
MOVNTQ( q0, (dst, index, 4))\
MOVNTQ( b, 8(dst, index, 4))\
MOVNTQ( q2, 16(dst, index, 4))\
MOVNTQ( q3, 24(dst, index, 4))\
\
"add $8, "#index" \n\t"\
"cmp "#dstw", "#index" \n\t"\
" jb 1b \n\t"
#define WRITEBGR32(dst, dstw, index) REAL_WRITEBGR32(dst, dstw, index)
#define WRITEBGR32(dst, dstw, index, b, g, r, a, q0, q2, q3, t) REAL_WRITEBGR32(dst, dstw, index, b, g, r, a, q0, q2, q3, t)
#define REAL_WRITERGB16(dst, dstw, index) \
"pand "MANGLE(bF8)", %%mm2 \n\t" /* B */\
@ -1014,13 +1031,15 @@ static inline void RENAME(yuv2packedX)(SwsContext *c, int16_t *lumFilter, int16_
case PIX_FMT_RGB32:
YSCALEYUV2PACKEDX_ACCURATE
YSCALEYUV2RGBX
WRITEBGR32(%4, %5, %%REGa)
"pxor %%mm7, %%mm7 \n\t"
WRITEBGR32(%4, %5, %%REGa, %%mm2, %%mm4, %%mm5, %%mm7, %%mm0, %%mm1, %%mm3, %%mm6)
YSCALEYUV2PACKEDX_END
return;
case PIX_FMT_BGR24:
YSCALEYUV2PACKEDX_ACCURATE
YSCALEYUV2RGBX
"pxor %%mm7, %%mm7 \n\t"
"lea (%%"REG_a", %%"REG_a", 2), %%"REG_c"\n\t" //FIXME optimize
"add %4, %%"REG_c" \n\t"
WRITEBGR24(%%REGc, %5, %%REGa)
@ -1035,6 +1054,7 @@ static inline void RENAME(yuv2packedX)(SwsContext *c, int16_t *lumFilter, int16_
case PIX_FMT_RGB555:
YSCALEYUV2PACKEDX_ACCURATE
YSCALEYUV2RGBX
"pxor %%mm7, %%mm7 \n\t"
/* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */
#ifdef DITHER1XBPP
"paddusb "BLUE_DITHER"(%0), %%mm2\n\t"
@ -1048,6 +1068,7 @@ static inline void RENAME(yuv2packedX)(SwsContext *c, int16_t *lumFilter, int16_
case PIX_FMT_RGB565:
YSCALEYUV2PACKEDX_ACCURATE
YSCALEYUV2RGBX
"pxor %%mm7, %%mm7 \n\t"
/* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */
#ifdef DITHER1XBPP
"paddusb "BLUE_DITHER"(%0), %%mm2\n\t"
@ -1076,12 +1097,14 @@ static inline void RENAME(yuv2packedX)(SwsContext *c, int16_t *lumFilter, int16_
case PIX_FMT_RGB32:
YSCALEYUV2PACKEDX
YSCALEYUV2RGBX
WRITEBGR32(%4, %5, %%REGa)
"pxor %%mm7, %%mm7 \n\t"
WRITEBGR32(%4, %5, %%REGa, %%mm2, %%mm4, %%mm5, %%mm7, %%mm0, %%mm1, %%mm3, %%mm6)
YSCALEYUV2PACKEDX_END
return;
case PIX_FMT_BGR24:
YSCALEYUV2PACKEDX
YSCALEYUV2RGBX
"pxor %%mm7, %%mm7 \n\t"
"lea (%%"REG_a", %%"REG_a", 2), %%"REG_c" \n\t" //FIXME optimize
"add %4, %%"REG_c" \n\t"
WRITEBGR24(%%REGc, %5, %%REGa)
@ -1095,6 +1118,7 @@ static inline void RENAME(yuv2packedX)(SwsContext *c, int16_t *lumFilter, int16_
case PIX_FMT_RGB555:
YSCALEYUV2PACKEDX
YSCALEYUV2RGBX
"pxor %%mm7, %%mm7 \n\t"
/* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */
#ifdef DITHER1XBPP
"paddusb "BLUE_DITHER"(%0), %%mm2 \n\t"
@ -1108,6 +1132,7 @@ static inline void RENAME(yuv2packedX)(SwsContext *c, int16_t *lumFilter, int16_
case PIX_FMT_RGB565:
YSCALEYUV2PACKEDX
YSCALEYUV2RGBX
"pxor %%mm7, %%mm7 \n\t"
/* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */
#ifdef DITHER1XBPP
"paddusb "BLUE_DITHER"(%0), %%mm2 \n\t"
@ -1171,7 +1196,8 @@ static inline void RENAME(yuv2packed2)(SwsContext *c, uint16_t *buf0, uint16_t *
"mov %4, %%"REG_b" \n\t"
"push %%"REG_BP" \n\t"
YSCALEYUV2RGB(%%REGBP, %5)
WRITEBGR32(%%REGb, 8280(%5), %%REGBP)
"pxor %%mm7, %%mm7 \n\t"
WRITEBGR32(%%REGb, 8280(%5), %%REGBP, %%mm2, %%mm4, %%mm5, %%mm7, %%mm0, %%mm1, %%mm3, %%mm6)
"pop %%"REG_BP" \n\t"
"mov "ESP_OFFSET"(%5), %%"REG_b" \n\t"
@ -1185,6 +1211,7 @@ static inline void RENAME(yuv2packed2)(SwsContext *c, uint16_t *buf0, uint16_t *
"mov %4, %%"REG_b" \n\t"
"push %%"REG_BP" \n\t"
YSCALEYUV2RGB(%%REGBP, %5)
"pxor %%mm7, %%mm7 \n\t"
WRITEBGR24(%%REGb, 8280(%5), %%REGBP)
"pop %%"REG_BP" \n\t"
"mov "ESP_OFFSET"(%5), %%"REG_b" \n\t"
@ -1198,6 +1225,7 @@ static inline void RENAME(yuv2packed2)(SwsContext *c, uint16_t *buf0, uint16_t *
"mov %4, %%"REG_b" \n\t"
"push %%"REG_BP" \n\t"
YSCALEYUV2RGB(%%REGBP, %5)
"pxor %%mm7, %%mm7 \n\t"
/* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */
#ifdef DITHER1XBPP
"paddusb "BLUE_DITHER"(%5), %%mm2 \n\t"
@ -1219,6 +1247,7 @@ static inline void RENAME(yuv2packed2)(SwsContext *c, uint16_t *buf0, uint16_t *
"mov %4, %%"REG_b" \n\t"
"push %%"REG_BP" \n\t"
YSCALEYUV2RGB(%%REGBP, %5)
"pxor %%mm7, %%mm7 \n\t"
/* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */
#ifdef DITHER1XBPP
"paddusb "BLUE_DITHER"(%5), %%mm2 \n\t"
@ -1283,7 +1312,8 @@ static inline void RENAME(yuv2packed1)(SwsContext *c, uint16_t *buf0, uint16_t *
"mov %4, %%"REG_b" \n\t"
"push %%"REG_BP" \n\t"
YSCALEYUV2RGB1(%%REGBP, %5)
WRITEBGR32(%%REGb, 8280(%5), %%REGBP)
"pxor %%mm7, %%mm7 \n\t"
WRITEBGR32(%%REGb, 8280(%5), %%REGBP, %%mm2, %%mm4, %%mm5, %%mm7, %%mm0, %%mm1, %%mm3, %%mm6)
"pop %%"REG_BP" \n\t"
"mov "ESP_OFFSET"(%5), %%"REG_b" \n\t"
@ -1297,6 +1327,7 @@ static inline void RENAME(yuv2packed1)(SwsContext *c, uint16_t *buf0, uint16_t *
"mov %4, %%"REG_b" \n\t"
"push %%"REG_BP" \n\t"
YSCALEYUV2RGB1(%%REGBP, %5)
"pxor %%mm7, %%mm7 \n\t"
WRITEBGR24(%%REGb, 8280(%5), %%REGBP)
"pop %%"REG_BP" \n\t"
"mov "ESP_OFFSET"(%5), %%"REG_b" \n\t"
@ -1311,6 +1342,7 @@ static inline void RENAME(yuv2packed1)(SwsContext *c, uint16_t *buf0, uint16_t *
"mov %4, %%"REG_b" \n\t"
"push %%"REG_BP" \n\t"
YSCALEYUV2RGB1(%%REGBP, %5)
"pxor %%mm7, %%mm7 \n\t"
/* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */
#ifdef DITHER1XBPP
"paddusb "BLUE_DITHER"(%5), %%mm2 \n\t"
@ -1331,6 +1363,7 @@ static inline void RENAME(yuv2packed1)(SwsContext *c, uint16_t *buf0, uint16_t *
"mov %4, %%"REG_b" \n\t"
"push %%"REG_BP" \n\t"
YSCALEYUV2RGB1(%%REGBP, %5)
"pxor %%mm7, %%mm7 \n\t"
/* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */
#ifdef DITHER1XBPP
"paddusb "BLUE_DITHER"(%5), %%mm2 \n\t"
@ -1372,7 +1405,8 @@ static inline void RENAME(yuv2packed1)(SwsContext *c, uint16_t *buf0, uint16_t *
"mov %4, %%"REG_b" \n\t"
"push %%"REG_BP" \n\t"
YSCALEYUV2RGB1b(%%REGBP, %5)
WRITEBGR32(%%REGb, 8280(%5), %%REGBP)
"pxor %%mm7, %%mm7 \n\t"
WRITEBGR32(%%REGb, 8280(%5), %%REGBP, %%mm2, %%mm4, %%mm5, %%mm7, %%mm0, %%mm1, %%mm3, %%mm6)
"pop %%"REG_BP" \n\t"
"mov "ESP_OFFSET"(%5), %%"REG_b" \n\t"
@ -1386,6 +1420,7 @@ static inline void RENAME(yuv2packed1)(SwsContext *c, uint16_t *buf0, uint16_t *
"mov %4, %%"REG_b" \n\t"
"push %%"REG_BP" \n\t"
YSCALEYUV2RGB1b(%%REGBP, %5)
"pxor %%mm7, %%mm7 \n\t"
WRITEBGR24(%%REGb, 8280(%5), %%REGBP)
"pop %%"REG_BP" \n\t"
"mov "ESP_OFFSET"(%5), %%"REG_b" \n\t"
@ -1400,6 +1435,7 @@ static inline void RENAME(yuv2packed1)(SwsContext *c, uint16_t *buf0, uint16_t *
"mov %4, %%"REG_b" \n\t"
"push %%"REG_BP" \n\t"
YSCALEYUV2RGB1b(%%REGBP, %5)
"pxor %%mm7, %%mm7 \n\t"
/* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */
#ifdef DITHER1XBPP
"paddusb "BLUE_DITHER"(%5), %%mm2 \n\t"
@ -1420,6 +1456,7 @@ static inline void RENAME(yuv2packed1)(SwsContext *c, uint16_t *buf0, uint16_t *
"mov %4, %%"REG_b" \n\t"
"push %%"REG_BP" \n\t"
YSCALEYUV2RGB1b(%%REGBP, %5)
"pxor %%mm7, %%mm7 \n\t"
/* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */
#ifdef DITHER1XBPP
"paddusb "BLUE_DITHER"(%5), %%mm2 \n\t"

View File

@ -121,47 +121,68 @@
"punpcklbw %%mm5, %%mm2;" /* G7 G6 G5 G4 G3 G2 G1 G0 */\
#define YUV422_UNSHIFT \
if(c->srcFormat == PIX_FMT_YUV422P){ \
srcStride[1] *= 2; \
srcStride[2] *= 2; \
} \
#define YUV2RGB_LOOP(depth) \
h_size= (c->dstW+7)&~7; \
if(h_size*depth > FFABS(dstStride[0])) h_size-=8; \
\
__asm__ volatile ("pxor %mm4, %mm4;" /* zero mm4 */ ); \
for (y= 0; y<srcSliceH; y++ ) { \
uint8_t *image = dst[0] + (y+srcSliceY)*dstStride[0]; \
uint8_t *py = src[0] + y*srcStride[0]; \
uint8_t *pu = src[1] + (y>>1)*srcStride[1]; \
uint8_t *pv = src[2] + (y>>1)*srcStride[2]; \
long index= -h_size/2; \
#define YUV2RGB_INIT \
/* This MMX assembly code deals with a SINGLE scan line at a time, \
* it converts 8 pixels in each iteration. */ \
__asm__ volatile ( \
/* load data for start of next scan line */ \
"movd (%2, %0), %%mm0;" /* Load 4 Cb 00 00 00 00 u3 u2 u1 u0 */ \
"movd (%3, %0), %%mm1;" /* Load 4 Cr 00 00 00 00 v3 v2 v1 v0 */ \
"movq (%5, %0, 2), %%mm6;" /* Load 8 Y Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 */ \
/* \
".balign 16 \n\t" \
*/ \
"1: \n\t" \
/* No speed difference on my p3@500 with prefetch, \
* if it is faster for anyone with -benchmark then tell me. \
PREFETCH" 64(%0) \n\t" \
PREFETCH" 64(%1) \n\t" \
PREFETCH" 64(%2) \n\t" \
*/ \
#define YUV2RGB_ENDLOOP(depth) \
"add $"AV_STRINGIFY(depth*8)", %1 \n\t" \
"add $4, %0 \n\t" \
" js 1b \n\t" \
\
: "+r" (index), "+r" (image) \
: "r" (pu - index), "r" (pv - index), "r"(&c->redDither), "r" (py - 2*index) \
); \
} \
__asm__ volatile (EMMS); \
return srcSliceH; \
static inline int RENAME(yuv420_rgb16)(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY,
int srcSliceH, uint8_t* dst[], int dstStride[]){
int y, h_size;
if(c->srcFormat == PIX_FMT_YUV422P){
srcStride[1] *= 2;
srcStride[2] *= 2;
}
h_size= (c->dstW+7)&~7;
if(h_size*2 > FFABS(dstStride[0])) h_size-=8;
__asm__ volatile ("pxor %mm4, %mm4;" /* zero mm4 */ );
//printf("%X %X %X %X %X %X %X %X %X %X\n", (int)&c->redDither, (int)&c->blueDither, (int)src[0], (int)src[1], (int)src[2], (int)dst[0],
//srcStride[0],srcStride[1],srcStride[2],dstStride[0]);
for (y= 0; y<srcSliceH; y++ ) {
uint8_t *image = dst[0] + (y+srcSliceY)*dstStride[0];
uint8_t *py = src[0] + y*srcStride[0];
uint8_t *pu = src[1] + (y>>1)*srcStride[1];
uint8_t *pv = src[2] + (y>>1)*srcStride[2];
long index= -h_size/2;
YUV422_UNSHIFT
YUV2RGB_LOOP(2)
c->blueDither= ff_dither8[y&1];
c->greenDither= ff_dither4[y&1];
c->redDither= ff_dither8[(y+1)&1];
/* This MMX assembly code deals with a SINGLE scan line at a time,
* it converts 8 pixels in each iteration. */
__asm__ volatile (
/* load data for start of next scan line */
"movd (%2, %0), %%mm0;" /* Load 4 Cb 00 00 00 00 u3 u2 u1 u0 */
"movd (%3, %0), %%mm1;" /* Load 4 Cr 00 00 00 00 v3 v2 v1 v0 */
"movq (%5, %0, 2), %%mm6;" /* Load 8 Y Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 */
//".balign 16 \n\t"
"1: \n\t"
/* No speed difference on my p3@500 with prefetch,
* if it is faster for anyone with -benchmark then tell me.
PREFETCH" 64(%0) \n\t"
PREFETCH" 64(%1) \n\t"
PREFETCH" 64(%2) \n\t"
*/
YUV2RGB
YUV2RGB_INIT
YUV2RGB
#ifdef DITHER1XBPP
"paddusb "BLUE_DITHER"(%4), %%mm0;"
@ -201,55 +222,22 @@ YUV2RGB
MOVNTQ " %%mm5, 8 (%1);" /* store pixel 4-7 */
"add $16, %1 \n\t"
"add $4, %0 \n\t"
" js 1b \n\t"
: "+r" (index), "+r" (image)
: "r" (pu - index), "r" (pv - index), "r"(&c->redDither), "r" (py - 2*index)
);
}
__asm__ volatile (EMMS);
return srcSliceH;
YUV2RGB_ENDLOOP(2)
}
static inline int RENAME(yuv420_rgb15)(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY,
int srcSliceH, uint8_t* dst[], int dstStride[]){
int y, h_size;
if(c->srcFormat == PIX_FMT_YUV422P){
srcStride[1] *= 2;
srcStride[2] *= 2;
}
h_size= (c->dstW+7)&~7;
if(h_size*2 > FFABS(dstStride[0])) h_size-=8;
__asm__ volatile ("pxor %mm4, %mm4;" /* zero mm4 */ );
//printf("%X %X %X %X %X %X %X %X %X %X\n", (int)&c->redDither, (int)&c->blueDither, (int)src[0], (int)src[1], (int)src[2], (int)dst[0],
//srcStride[0],srcStride[1],srcStride[2],dstStride[0]);
for (y= 0; y<srcSliceH; y++ ) {
uint8_t *image = dst[0] + (y+srcSliceY)*dstStride[0];
uint8_t *py = src[0] + y*srcStride[0];
uint8_t *pu = src[1] + (y>>1)*srcStride[1];
uint8_t *pv = src[2] + (y>>1)*srcStride[2];
long index= -h_size/2;
YUV422_UNSHIFT
YUV2RGB_LOOP(2)
c->blueDither= ff_dither8[y&1];
c->greenDither= ff_dither8[y&1];
c->redDither= ff_dither8[(y+1)&1];
/* This MMX assembly code deals with a SINGLE scan line at a time,
* it converts 8 pixels in each iteration. */
__asm__ volatile (
/* load data for start of next scan line */
"movd (%2, %0), %%mm0;" /* Load 4 Cb 00 00 00 00 u3 u2 u1 u0 */
"movd (%3, %0), %%mm1;" /* Load 4 Cr 00 00 00 00 v3 v2 v1 v0 */
"movq (%5, %0, 2), %%mm6;" /* Load 8 Y Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 */
//".balign 16 \n\t"
"1: \n\t"
YUV2RGB
YUV2RGB_INIT
YUV2RGB
#ifdef DITHER1XBPP
"paddusb "BLUE_DITHER"(%4), %%mm0 \n\t"
@ -291,49 +279,18 @@ YUV2RGB
MOVNTQ " %%mm5, 8 (%1);" /* store pixel 4-7 */
"add $16, %1 \n\t"
"add $4, %0 \n\t"
" js 1b \n\t"
: "+r" (index), "+r" (image)
: "r" (pu - index), "r" (pv - index), "r"(&c->redDither), "r" (py - 2*index)
);
}
__asm__ volatile (EMMS);
return srcSliceH;
YUV2RGB_ENDLOOP(2)
}
static inline int RENAME(yuv420_rgb24)(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY,
int srcSliceH, uint8_t* dst[], int dstStride[]){
int y, h_size;
if(c->srcFormat == PIX_FMT_YUV422P){
srcStride[1] *= 2;
srcStride[2] *= 2;
}
YUV422_UNSHIFT
YUV2RGB_LOOP(3)
h_size= (c->dstW+7)&~7;
if(h_size*3 > FFABS(dstStride[0])) h_size-=8;
__asm__ volatile ("pxor %mm4, %mm4;" /* zero mm4 */ );
for (y= 0; y<srcSliceH; y++ ) {
uint8_t *image = dst[0] + (y+srcSliceY)*dstStride[0];
uint8_t *py = src[0] + y*srcStride[0];
uint8_t *pu = src[1] + (y>>1)*srcStride[1];
uint8_t *pv = src[2] + (y>>1)*srcStride[2];
long index= -h_size/2;
/* This MMX assembly code deals with a SINGLE scan line at a time,
* it converts 8 pixels in each iteration. */
__asm__ volatile (
/* load data for start of next scan line */
"movd (%2, %0), %%mm0;" /* Load 4 Cb 00 00 00 00 u3 u2 u1 u0 */
"movd (%3, %0), %%mm1;" /* Load 4 Cr 00 00 00 00 v3 v2 v1 v0 */
"movq (%5, %0, 2), %%mm6;" /* Load 8 Y Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 */
//".balign 16 \n\t"
"1: \n\t"
YUV2RGB
YUV2RGB_INIT
YUV2RGB
/* mm0=B, %%mm2=G, %%mm1=R */
#if HAVE_MMX2
"movq "MANGLE(ff_M24A)", %%mm4 \n\t"
@ -436,50 +393,18 @@ YUV2RGB
"pxor %%mm4, %%mm4 \n\t"
#endif
"add $24, %1 \n\t"
"add $4, %0 \n\t"
" js 1b \n\t"
: "+r" (index), "+r" (image)
: "r" (pu - index), "r" (pv - index), "r"(&c->redDither), "r" (py - 2*index)
);
}
__asm__ volatile (EMMS);
return srcSliceH;
YUV2RGB_ENDLOOP(3)
}
static inline int RENAME(yuv420_rgb32)(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY,
int srcSliceH, uint8_t* dst[], int dstStride[]){
int y, h_size;
if(c->srcFormat == PIX_FMT_YUV422P){
srcStride[1] *= 2;
srcStride[2] *= 2;
}
YUV422_UNSHIFT
YUV2RGB_LOOP(4)
h_size= (c->dstW+7)&~7;
if(h_size*4 > FFABS(dstStride[0])) h_size-=8;
__asm__ volatile ("pxor %mm4, %mm4;" /* zero mm4 */ );
for (y= 0; y<srcSliceH; y++ ) {
uint8_t *image = dst[0] + (y+srcSliceY)*dstStride[0];
uint8_t *py = src[0] + y*srcStride[0];
uint8_t *pu = src[1] + (y>>1)*srcStride[1];
uint8_t *pv = src[2] + (y>>1)*srcStride[2];
long index= -h_size/2;
/* This MMX assembly code deals with a SINGLE scan line at a time,
* it converts 8 pixels in each iteration. */
__asm__ volatile (
/* load data for start of next scan line */
"movd (%2, %0), %%mm0;" /* Load 4 Cb 00 00 00 00 u3 u2 u1 u0 */
"movd (%3, %0), %%mm1;" /* Load 4 Cr 00 00 00 00 v3 v2 v1 v0 */
"movq (%5, %0, 2), %%mm6;" /* Load 8 Y Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 */
//".balign 16 \n\t"
"1: \n\t"
YUV2RGB
YUV2RGB_INIT
YUV2RGB
/* convert RGB plane to RGB packed format,
mm0 -> B, mm1 -> R, mm2 -> G, mm3 -> 0,
mm4 -> GB, mm5 -> AR pixel 4-7,
@ -522,15 +447,5 @@ YUV2RGB
"pxor %%mm4, %%mm4;" /* zero mm4 */
"movq 8 (%5, %0, 2), %%mm6;" /* Load 8 Y Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 */
"add $32, %1 \n\t"
"add $4, %0 \n\t"
" js 1b \n\t"
: "+r" (index), "+r" (image)
: "r" (pu - index), "r" (pv - index), "r"(&c->redDither), "r" (py - 2*index)
);
}
__asm__ volatile (EMMS);
return srcSliceH;
YUV2RGB_ENDLOOP(4)
}

View File

@ -158,12 +158,12 @@ const struct vo_driver *video_out_drivers[] =
#ifdef CONFIG_3DFX
&video_out_3dfx,
#endif
#if CONFIG_VDPAU
&video_out_vdpau,
#endif
#ifdef CONFIG_XV
&video_out_xv,
#endif
#if CONFIG_VDPAU
&video_out_vdpau,
#endif
#ifdef CONFIG_X11
&video_out_x11,
&video_out_xover,

View File

@ -126,7 +126,7 @@ LIBVO_EXTERN(svga)
//return number of 1'st free page or -1 if no free one
static inline int page_find_free(void){
int i;
int i;
for(i=0;i<max_pages;i++)
if(PageStore[i].locks == PAGE_EMPTY) return i;
return -1;
@ -134,8 +134,8 @@ int i;
static int preinit(const char *arg)
{
int i,rez;
char s[64];
int i,rez;
char s[64];
getch2_disable();
memset(zerobuf,0,sizeof(zerobuf));
@ -188,7 +188,7 @@ char s[64];
force_vm=vga_getmodenumber(s);
if(force_vm>0) {
if( mp_msg_test(MSGT_VO,MSGL_V) ) mp_msg(MSGT_VO,MSGL_V, "vo_svga: Forcing mode %i\n",force_vm);
mp_msg(MSGT_VO,MSGL_V, "vo_svga: Forcing mode %i\n",force_vm);
}else{
force_vm = 0;
}
@ -206,11 +206,10 @@ char s[64];
}
static void svga_clear_box(int x,int y,int w,int h){
uint8_t * rgbplane;
int i;
uint8_t * rgbplane;
int i;
if (mode_capabilities&CAP_ACCEL_CLEAR){
if( mp_msg_test(MSGT_VO,MSGL_DBG3) )
mp_msg(MSGT_VO,MSGL_DBG3, "vo_svga: clearing box %d,%d - %d,%d with HW acceleration\n",
x,y,w,h);
if(mode_capabilities&CAP_ACCEL_BACKGR)
@ -220,7 +219,6 @@ int i;
return;
}
if (mode_capabilities & CAP_LINEAR){
if( mp_msg_test(MSGT_VO,MSGL_DBG3) )
mp_msg(MSGT_VO,MSGL_DBG3, "vo_svga: clearing box %d,%d - %d,%d with memset\n",x,y,w,h);
rgbplane=PageStore[0].vbase + (y*mode_stride) + (x*modeinfo->bytesperpixel);
for(i=0;i<h;i++){
@ -232,7 +230,6 @@ int i;
return;
}
//native
if( mp_msg_test(MSGT_VO,MSGL_DBG3) )
mp_msg(MSGT_VO,MSGL_DBG3, "vo_svga: clearing box %d,%d - %d,%d with native draw \n",x,y,w,h);
if(modeinfo->bytesperpixel!=0) w*=modeinfo->bytesperpixel;
for(i=0;i<h;i++){
@ -241,14 +238,13 @@ int i;
};
static uint32_t svga_draw_image(mp_image_t *mpi){
int i,x,y,w,h;
int stride;
uint8_t *rgbplane, *base;
int bytesperline;
int page;
int i,x,y,w,h;
int stride;
uint8_t *rgbplane, *base;
int bytesperline;
int page;
if(mpi->flags & MP_IMGFLAG_DIRECT){
if( mp_msg_test(MSGT_VO,MSGL_DBG3) )
mp_msg(MSGT_VO,MSGL_DBG3, "vo_svga: drawing direct rendered surface\n");
cpage=(uint32_t)mpi->priv;
assert((cpage>=0)&&(cpage<max_pages));
@ -278,7 +274,6 @@ int page;
(stride == mode_stride) ){ //only monolite image can be accelerated
w=(stride*8)/mpi->bpp;//we transfer pixels in the stride so the source
//ACCELERATE
if( mp_msg_test(MSGT_VO,MSGL_DBG3) )
mp_msg(MSGT_VO,MSGL_DBG3, "vo_svga: using HW PutImage (x=%d,y=%d,w=%d,h=%d)\n",x,y,w,h);
if(mode_capabilities & CAP_ACCEL_BACKGR)
vga_accel(ACCEL_SYNC);
@ -289,7 +284,6 @@ int page;
if( mode_capabilities&CAP_LINEAR){
//DIRECT
if( mp_msg_test(MSGT_VO,MSGL_DBG3) )
mp_msg(MSGT_VO,MSGL_DBG3, "vo_svga: using Direct memcpy (x=%d,y=%d,w=%d,h=%d)\n",x,y,w,h);
bytesperline=(w*mpi->bpp)/8;
base=PageStore[cpage].vbase + (y*mode_stride) + (x*mpi->bpp)/8;
@ -311,7 +305,6 @@ int page;
//one byte per pixel! svgalib innovation
if(mpi->imgfmt==IMGFMT_RG4B || mpi->imgfmt==IMGFMT_BG4B) length=w;
if( mp_msg_test(MSGT_VO,MSGL_DBG3) )
mp_msg(MSGT_VO,MSGL_DBG3, "vo_svga: using Native vga_draw(x=%d,y=%d,w=%d,h=%d)\n",x,y,w,h);
y+=PageStore[cpage].yoffset;//y position of the page beggining
for(i=0;i<h;i++){
@ -347,7 +340,6 @@ static int find_best_svga_mode(int req_w,int req_h, int req_bpp){
for(i=1;i<=lastmode;i++){
vminfo = vga_getmodeinfo(i);
if( vminfo == NULL ) continue;
if( mp_msg_test(MSGT_VO,MSGL_DBG4) )
mp_msg(MSGT_VO,MSGL_DBG4, "vo_svga: testing mode %d (%s)\n",i,vga_getmodename(i));
if( vga_hasmode(i) == 0 ) continue;
if( req_bpp != bpp_from_vminfo(vminfo) )continue;
@ -360,7 +352,6 @@ static int find_best_svga_mode(int req_w,int req_h, int req_bpp){
if( bestmode==0 || prev_badness >= badness ){//modeX etc...
prev_badness=badness;
bestmode=i;
if( mp_msg_test(MSGT_VO,MSGL_DBG4) )
mp_msg(MSGT_VO,MSGL_DBG4, "vo_svga: found good mode %d with badness %d\n",i,badness);
}
}
@ -398,7 +389,6 @@ static int config(uint32_t width, uint32_t height, uint32_t d_width,
int32_t req_bpp;
uint32_t accflags;
if( mp_msg_test(MSGT_VO,MSGL_V) )
mp_msg(MSGT_VO,MSGL_V, "vo_svga: config(%i, %i, %i, %i, %08x, %s, %08x)\n", width, height,
d_width, d_height, flags, title, format);
//Only RGB modes supported
@ -408,10 +398,8 @@ static int config(uint32_t width, uint32_t height, uint32_t d_width,
if( vo_dbpp!=0 && vo_dbpp!=req_bpp) {assert(0);return-1;}
if(!force_vm) {
if ( mp_msg_test(MSGT_VO,MSGL_V) ) {
mp_msg(MSGT_VO,MSGL_V, "vo_svga: Looking for the best resolution...\n");
mp_msg(MSGT_VO,MSGL_V, "vo_svga: req_w: %d, req_h: %d, bpp: %d\n",req_w,req_h,req_bpp);
}
vid_mode=find_best_svga_mode(req_w,req_h,req_bpp);
if(vid_mode==0)
return 1;
@ -571,23 +559,22 @@ static int config(uint32_t width, uint32_t height, uint32_t d_width,
static int draw_slice(uint8_t *image[],int stride[],
int w, int h, int x, int y) {
assert(0);
UNUSED(image);UNUSED(stride);
UNUSED(w);UNUSED(h);
UNUSED(x);UNUSED(y);
assert(0);
UNUSED(image);UNUSED(stride);
UNUSED(w);UNUSED(h);
UNUSED(x);UNUSED(y);
return VO_ERROR;//this is yv12 only -> vf_scale should do all transforms
}
static int draw_frame(uint8_t *src[]) {
assert(0);
UNUSED(src);
assert(0);
UNUSED(src);
return VO_ERROR;//this one should not be called
}
static void draw_osd(void)
{
if( mp_msg_test(MSGT_VO,MSGL_DBG4) )
mp_msg(MSGT_VO,MSGL_DBG4, "vo_svga: draw_osd()\n");
//only modes with bytesperpixel>0 can draw OSD
if(modeinfo->bytesperpixel==0) return;
@ -616,10 +603,9 @@ static void flip_page(void) {
PageStore[old_page].locks=PAGE_EMPTY;
PageStore[cpage].locks=PAGE_BUSY;
if( mp_msg_test(MSGT_VO,MSGL_DBG3) )
mp_msg(MSGT_VO,MSGL_DBG3, "vo_svga: viewing page %d\n",cpage);
if(sync_flip && old_page!=cpage){
if( mp_msg_test(MSGT_VO,MSGL_DBG3) ) mp_msg(MSGT_VO,MSGL_DBG3, "vo_svga:vga_waitretrace\n");
mp_msg(MSGT_VO,MSGL_DBG3, "vo_svga:vga_waitretrace\n");
vga_waitretrace();
}
vga_setdisplaystart(PageStore[cpage].doffset);
@ -640,11 +626,10 @@ static void uninit(void) {
/* --------------------------------------------------------------------- */
static int query_format(uint32_t format) {
int32_t req_bpp,flags;
int i,lastmode;
vga_modeinfo * vminfo;
int32_t req_bpp,flags;
int i,lastmode;
vga_modeinfo * vminfo;
if ( mp_msg_test(MSGT_VO,MSGL_DBG4) )
mp_msg(MSGT_VO,MSGL_DBG4, "vo_svga: query_format=%X \n",format);
//only RGB modes supported
if( (!IMGFMT_IS_RGB(format)) && (!IMGFMT_IS_BGR(format)) ) return 0;
@ -682,7 +667,6 @@ static void draw_alpha(int x0, int y0, int w, int h, unsigned char *src,
unsigned char *srca, int stride) {
char* base;
if( mp_msg_test(MSGT_VO,MSGL_DBG3) )
mp_msg(MSGT_VO,MSGL_DBG3, "vo_svga: draw_alpha(x0=%d,y0=%d,w=%d,h=%d,src=%p,srca=%p,stride=%d\n",
x0,y0,w,h,src,srca,stride);
if(!blackbar_osd) {
@ -691,7 +675,6 @@ static void draw_alpha(int x0, int y0, int w, int h, unsigned char *src,
y0+=y_pos;
}
if( mp_msg_test(MSGT_VO,MSGL_DBG4) )
mp_msg(MSGT_VO,MSGL_DBG4, "vo_svga: OSD draw in page %d\n",cpage);
base=PageStore[cpage].vbase + y0*mode_stride + x0*modeinfo->bytesperpixel;
switch (mode_bpp) {
@ -711,7 +694,7 @@ static void draw_alpha(int x0, int y0, int w, int h, unsigned char *src,
}
static uint32_t get_image(mp_image_t *mpi){
int page;
int page;
if(!IMGFMT_IS_BGR(mpi->imgfmt) && !IMGFMT_IS_RGB(mpi->imgfmt) ){
assert(0);//should never happen
@ -739,7 +722,6 @@ int page;
mpi->planes[0] = PageStore[page].vbase +
y_pos*mode_stride + (x_pos*mpi->bpp)/8;
mpi->priv=(void *)page;
if( mp_msg_test(MSGT_VO,MSGL_DBG3) )
mp_msg(MSGT_VO,MSGL_DBG3, "vo_svga: direct render allocated! page=%d\n",page);
return VO_TRUE;
}

View File

@ -42,6 +42,7 @@
#include "x11_common.h"
#include "aspect.h"
#include "sub.h"
#include "subopt-helper.h"
#include "libavcodec/vdpau.h"
@ -111,6 +112,8 @@ static VdpOutputSurfaceDestroy *vdp_output_surface_destroy;
static VdpVideoMixerCreate *vdp_video_mixer_create;
static VdpVideoMixerDestroy *vdp_video_mixer_destroy;
static VdpVideoMixerRender *vdp_video_mixer_render;
static VdpVideoMixerSetFeatureEnables *vdp_video_mixer_set_feature_enables;
static VdpVideoMixerSetAttributeValues *vdp_video_mixer_set_attribute_values;
static VdpPresentationQueueTargetDestroy *vdp_presentation_queue_target_destroy;
static VdpPresentationQueueCreate *vdp_presentation_queue_create;
@ -132,6 +135,10 @@ static VdpOutputSurface output_surfaces[NUM_OUTPUT_SURFACES];
static int output_surface_width, output_surface_height;
static VdpVideoMixer video_mixer;
static int deint;
static int pullup;
static float denoise;
static float sharpen;
static VdpDecoder decoder;
static int decoder_max_refs;
@ -171,6 +178,9 @@ static void video_to_output_surface(void)
&dummy);
CHECK_ST_WARNING("Error when calling vdp_presentation_queue_block_until_surface_idle")
// we would need to provide past and future frames to allow deinterlacing,
// which is not really possible currently. Deinterlacing is supposed to fall
// back to bob deinterlacing, but that seems not to work either.
vdp_st = vdp_video_mixer_render(video_mixer, VDP_INVALID_HANDLE, 0,
VDP_VIDEO_MIXER_PICTURE_STRUCTURE_FRAME,
0, NULL, surface_render[vid_surface_num].surface, 0, NULL, &src_rect_vid,
@ -254,6 +264,10 @@ static int win_x11_init_vdpau_procs(void)
{VDP_FUNC_ID_VIDEO_MIXER_CREATE, &vdp_video_mixer_create},
{VDP_FUNC_ID_VIDEO_MIXER_DESTROY, &vdp_video_mixer_destroy},
{VDP_FUNC_ID_VIDEO_MIXER_RENDER, &vdp_video_mixer_render},
{VDP_FUNC_ID_VIDEO_MIXER_SET_FEATURE_ENABLES,
&vdp_video_mixer_set_feature_enables},
{VDP_FUNC_ID_VIDEO_MIXER_SET_ATTRIBUTE_VALUES,
&vdp_video_mixer_set_attribute_values},
{VDP_FUNC_ID_PRESENTATION_QUEUE_TARGET_DESTROY,
&vdp_presentation_queue_target_destroy},
{VDP_FUNC_ID_PRESENTATION_QUEUE_CREATE, &vdp_presentation_queue_create},
@ -310,7 +324,16 @@ static int win_x11_init_vdpau_flip_queue(void)
static int create_vdp_mixer(VdpChromaType vdp_chroma_type) {
#define VDP_NUM_MIXER_PARAMETER 3
#define MAX_NUM_FEATURES 5
int i;
VdpStatus vdp_st;
int feature_count = 0;
VdpVideoMixerFeature features[MAX_NUM_FEATURES];
VdpBool feature_enables[MAX_NUM_FEATURES];
static const denoise_attrib[] = {VDP_VIDEO_MIXER_ATTRIBUTE_NOISE_REDUCTION_LEVEL};
const void * const denoise_value[] = {&denoise};
static const sharpen_attrib[] = {VDP_VIDEO_MIXER_ATTRIBUTE_SHARPNESS_LEVEL};
const void * const sharpen_value[] = {&sharpen};
static const VdpVideoMixerParameter parameters[VDP_NUM_MIXER_PARAMETER] = {
VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_WIDTH,
VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_HEIGHT,
@ -321,13 +344,31 @@ static int create_vdp_mixer(VdpChromaType vdp_chroma_type) {
&vid_height,
&vdp_chroma_type
};
if (deint == 1)
features[feature_count++] = VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL;
if (deint == 2)
features[feature_count++] = VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL_SPATIAL;
if (pullup)
features[feature_count++] = VDP_VIDEO_MIXER_FEATURE_INVERSE_TELECINE;
if (denoise)
features[feature_count++] = VDP_VIDEO_MIXER_FEATURE_NOISE_REDUCTION;
if (sharpen)
features[feature_count++] = VDP_VIDEO_MIXER_FEATURE_SHARPNESS;
vdp_st = vdp_video_mixer_create(vdp_device, 0, 0,
vdp_st = vdp_video_mixer_create(vdp_device, feature_count, features,
VDP_NUM_MIXER_PARAMETER,
parameters, parameter_values,
&video_mixer);
CHECK_ST_ERROR("Error when calling vdp_video_mixer_create")
for (i = 0; i < feature_count; i++) feature_enables[i] = VDP_TRUE;
if (feature_count)
vdp_video_mixer_set_feature_enables(video_mixer, feature_count, features, feature_enables);
if (denoise)
vdp_video_mixer_set_attribute_values(video_mixer, 1, denoise_attrib, denoise_value);
if (sharpen)
vdp_video_mixer_set_attribute_values(video_mixer, 1, sharpen_attrib, sharpen_value);
return 0;
}
@ -711,15 +752,43 @@ static void uninit(void)
dlclose(vdpau_lib_handle);
}
static opt_t subopts[] = {
{"deint", OPT_ARG_INT, &deint, (opt_test_f)int_non_neg},
{"pullup", OPT_ARG_BOOL, &pullup, NULL},
{"denoise", OPT_ARG_FLOAT, &denoise, NULL},
{"sharpen", OPT_ARG_FLOAT, &sharpen, NULL},
{NULL}
};
static const char help_msg[] =
"\n-vo vdpau command line help:\n"
"Example: mplayer -vo vdpau:deint=2\n"
"\nOptions:\n"
" deint\n"
" 0: no deinterlacing\n"
" 1: temporal deinterlacing (not yet working)\n"
" 2: temporal-spatial deinterlacing (not yet working)\n"
" pullup\n"
" Try to apply inverse-telecine (needs deinterlacing, not working)\n"
" denoise\n"
" Apply denoising, argument is strength from 0.0 to 1.0\n"
" sharpen\n"
" Apply sharpening or softening, argument is strength from -1.0 to 1.0\n"
;
static int preinit(const char *arg)
{
int i;
static const char *vdpaulibrary = "libvdpau.so.1";
static const char *vdpau_device_create = "vdp_device_create_x11";
if (arg) {
mp_msg(MSGT_VO, MSGL_ERR, "[vdpau] Unknown subdevice: %s\n", arg);
return ENOSYS;
deint = 0;
pullup = 0;
denoise = 0;
sharpen = 0;
if (subopt_parse(arg, subopts) != 0) {
mp_msg(MSGT_VO, MSGL_FATAL, help_msg);
return -1;
}
vdpau_lib_handle = dlopen(vdpaulibrary, RTLD_LAZY);

View File

@ -42,6 +42,7 @@
#include <X11/extensions/XvMClib.h>
#include "x11_common.h"
#include "libavcodec/avcodec.h"
#include "libavcodec/xvmc.h"
#include "sub.h"
@ -61,7 +62,6 @@
#define UNUSED(x) ((void)(x))
#include "libavcodec/avcodec.h"
#if LIBAVCODEC_BUILD < ((51<<16)+(40<<8)+2)
#error You need at least libavcodecs v51.40.2
#endif
@ -162,7 +162,7 @@ static void allocate_xvimage(int xvimage_width,int xvimage_height,int xv_format)
else
{
Shmem_Flag = 0;
mp_msg(MSGT_VO,MSGL_INFO, "Shared memory not supported\nReverting to normal Xv\n" );
mp_msg(MSGT_VO,MSGL_WARN, "Shared memory not supported\nReverting to normal Xv\n" );
}
if ( Shmem_Flag )
{
@ -225,95 +225,92 @@ return -1;//fail
//print all info needed to add new format
static void print_xvimage_format_values(XvImageFormatValues *xifv){
int i;
printf("Format_ID = 0x%X\n",xifv->id);
int i;
const msgl=MSGL_DBG4;
printf(" type = ");
if(xifv->type == XvRGB) printf("RGB\n");
else if(xifv->type == XvYUV) printf("YUV\n");
else printf("Unknown\n");
mp_msg(MSGT_VO,msgl,"Format_ID = 0x%X\n",xifv->id);
printf(" byte_order = ");
if(xifv->byte_order == LSBFirst) printf("LSB First\n");
else if(xifv->type == MSBFirst) printf("MSB First\n");
else printf("Unknown\n");//yes Linux support other types too
mp_msg(MSGT_VO,msgl," type = ");
if(xifv->type == XvRGB) mp_msg(MSGT_VO,msgl,"RGB\n");
else if(xifv->type == XvYUV) mp_msg(MSGT_VO,msgl,"YUV\n");
else mp_msg(MSGT_VO,msgl,"Unknown\n");
printf(" guid = ");
mp_msg(MSGT_VO,msgl," byte_order = ");
if(xifv->byte_order == LSBFirst) mp_msg(MSGT_VO,msgl,"LSB First\n");
else if(xifv->type == MSBFirst) mp_msg(MSGT_VO,msgl,"MSB First\n");
else mp_msg(MSGT_VO,msgl,"Unknown\n");//yes Linux support other types too
mp_msg(MSGT_VO,msgl," guid = ");
for(i=0;i<16;i++)
printf("%02X ",(unsigned char)xifv->guid[i]);
printf("\n");
mp_msg(MSGT_VO,msgl,"%02X ",(unsigned char)xifv->guid[i]);
mp_msg(MSGT_VO,msgl,"\n");
printf(" bits_per_pixel = %d\n",xifv->bits_per_pixel);
mp_msg(MSGT_VO,msgl," bits_per_pixel = %d\n",xifv->bits_per_pixel);
printf(" format = ");
if(xifv->format == XvPacked) printf("XvPacked\n");
else if(xifv->format == XvPlanar) printf("XvPlanar\n");
else printf("Unknown\n");
mp_msg(MSGT_VO,msgl," format = ");
if(xifv->format == XvPacked) mp_msg(MSGT_VO,msgl,"XvPacked\n");
else if(xifv->format == XvPlanar) mp_msg(MSGT_VO,msgl,"XvPlanar\n");
else mp_msg(MSGT_VO,msgl,"Unknown\n");
printf(" num_planes = %d\n",xifv->num_planes);
mp_msg(MSGT_VO,msgl," num_planes = %d\n",xifv->num_planes);
if(xifv->type == XvRGB){
printf(" red_mask = %0X\n", xifv->red_mask);
printf(" green_mask = %0X\n",xifv->green_mask);
printf(" blue_mask = %0X\n", xifv->blue_mask);
mp_msg(MSGT_VO,msgl," red_mask = %0X\n", xifv->red_mask);
mp_msg(MSGT_VO,msgl," green_mask = %0X\n",xifv->green_mask);
mp_msg(MSGT_VO,msgl," blue_mask = %0X\n", xifv->blue_mask);
}
if(xifv->type == XvYUV){
printf(" y_sample_bits = %d\n u_sample_bits = %d\n v_sample_bits = %d\n",
mp_msg(MSGT_VO,msgl," y_sample_bits = %d\n u_sample_bits = %d\n v_sample_bits = %d\n",
xifv->y_sample_bits,xifv->u_sample_bits,xifv->v_sample_bits);
printf(" horz_y_period = %d\n horz_u_period = %d\n horz_v_period = %d\n",
mp_msg(MSGT_VO,msgl," horz_y_period = %d\n horz_u_period = %d\n horz_v_period = %d\n",
xifv->horz_y_period,xifv->horz_u_period,xifv->horz_v_period);
printf(" vert_y_period = %d\n vert_u_period = %d\n vert_v_period = %d\n",
mp_msg(MSGT_VO,msgl," vert_y_period = %d\n vert_u_period = %d\n vert_v_period = %d\n",
xifv->vert_y_period,xifv->vert_u_period,xifv->vert_v_period);
printf(" component_order = ");
mp_msg(MSGT_VO,msgl," component_order = ");
for(i=0;i<32;i++)
if(xifv->component_order[i]>=32)
printf("%c",xifv->component_order[i]);
printf("\n");
mp_msg(MSGT_VO,msgl,"%c",xifv->component_order[i]);
mp_msg(MSGT_VO,msgl,"\n");
printf(" scanline = ");
if(xifv->scanline_order == XvTopToBottom) printf("XvTopToBottom\n");
else if(xifv->scanline_order == XvBottomToTop) printf("XvBottomToTop\n");
else printf("Unknown\n");
mp_msg(MSGT_VO,msgl," scanline = ");
if(xifv->scanline_order == XvTopToBottom) mp_msg(MSGT_VO,msgl,"XvTopToBottom\n");
else if(xifv->scanline_order == XvBottomToTop) mp_msg(MSGT_VO,msgl,"XvBottomToTop\n");
else mp_msg(MSGT_VO,msgl,"Unknown\n");
}
printf("\n");
mp_msg(MSGT_VO,msgl,"\n");
}
// WARNING This function may changes xv_port and surface_info!
static int xvmc_find_surface_by_format(int format,int width,int height,
XvMCSurfaceInfo * surf_info,int query){
int rez;
XvAdaptorInfo * ai;
int num_adaptors,i;
unsigned long p;
int s,mc_surf_num;
XvMCSurfaceInfo * mc_surf_list;
int rez;
XvAdaptorInfo * ai;
int num_adaptors,i;
unsigned long p;
int s,mc_surf_num;
XvMCSurfaceInfo * mc_surf_list;
rez = XvQueryAdaptors(mDisplay,DefaultRootWindow(mDisplay),&num_adaptors,&ai);
if( rez != Success ) return -1;
if( mp_msg_test(MSGT_VO,MSGL_DBG3) ) {
printf("vo_xvmc: Querying %d adaptors\n",num_adaptors); }
mp_msg(MSGT_VO,MSGL_DBG3,"vo_xvmc: Querying %d adaptors\n",num_adaptors);
for(i=0; i<num_adaptors; i++)
{
/* check if adaptor number has been specified */
if (xv_adaptor != -1 && xv_adaptor != i)
continue;
if( mp_msg_test(MSGT_VO,MSGL_DBG3) ) {
printf("vo_xvmc: Quering adaptor #%d\n",i); }
mp_msg(MSGT_VO,MSGL_DBG3,"vo_xvmc: Quering adaptor #%d\n",i);
if( ai[i].type == 0 ) continue;// we need at least dummy type!
//probing ports
for(p=ai[i].base_id; p<ai[i].base_id+ai[i].num_ports; p++)
{
if( mp_msg_test(MSGT_VO,MSGL_DBG3) ) {
printf("vo_xvmc: probing port #%ld\n",p); }
mp_msg(MSGT_VO,MSGL_DBG3,"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) ) {
printf("vo_xvmc: No XvMC supported. \n"); }
mp_msg(MSGT_VO,MSGL_DBG3,"vo_xvmc: No XvMC supported. \n");
continue;
}
if( mp_msg_test(MSGT_VO,MSGL_DBG3) ) {
printf("vo_xvmc: XvMC list have %d surfaces\n",mc_surf_num); }
mp_msg(MSGT_VO,MSGL_DBG3,"vo_xvmc: XvMC list have %d surfaces\n",mc_surf_num);
//we have XvMC list!
for(s=0; s<mc_surf_num; s++)
{
@ -330,12 +327,11 @@ XvMCSurfaceInfo * mc_surf_list;
if(!query){
rez = XvGrabPort(mDisplay,p,CurrentTime);
if(rez != Success){
if ( mp_msg_test(MSGT_VO,MSGL_DBG3) ) {
printf("vo_xvmc: Fail to grab port %ld\n",p); }
mp_msg(MSGT_VO,MSGL_DBG3,"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);
mp_msg(MSGT_VO,MSGL_INFO,"vo_xvmc: Using Xv Adaptor #%d (%s)\n", i, ai[i].name);
mp_msg(MSGT_VO,MSGL_INFO,"vo_xvmc: Port %ld grabed\n",p);
xv_port = p;
}
goto surface_found;
@ -345,7 +341,7 @@ XvMCSurfaceInfo * mc_surf_list;
}//for adaptors
XvFreeAdaptorInfo(ai);
if(!query) printf("vo_xvmc: Could not find free matching surface. Sorry.\n");
if(!query) mp_msg(MSGT_VO,MSGL_ERR,"vo_xvmc: Could not find free matching surface. Sorry.\n");
return 0;
// somebody know cleaner way to escape from 3 internal loops?
@ -353,8 +349,8 @@ surface_found:
XvFreeAdaptorInfo(ai);
memcpy(surf_info,&mc_surf_list[s],sizeof(XvMCSurfaceInfo));
if( mp_msg_test(MSGT_VO,MSGL_DBG3) || !query)
printf("vo_xvmc: Found matching surface with id=%X on %ld port at %d adapter\n",
mp_msg(MSGT_VO, query?MSGL_INFO:MSGL_DBG3,
"vo_xvmc: Found matching surface with id=%X on %ld port at %d adapter\n",
mc_surf_list[s].surface_type_id,p,i);
return mc_surf_list[s].surface_type_id;
}
@ -369,8 +365,7 @@ static uint32_t xvmc_draw_image(mp_image_t *mpi){
rndr = (struct xvmc_pix_fmt*)mpi->priv; //there is copy in plane[2]
assert( rndr != NULL );
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);
mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc: draw_image(show rndr=%p)\n",rndr);
// the surface have passed vf system without been skiped, it will be displayed
rndr->state |= AV_XVMC_STATE_DISPLAY_PENDING;
p_render_surface_to_show = rndr;
@ -379,13 +374,13 @@ static uint32_t xvmc_draw_image(mp_image_t *mpi){
}
static int preinit(const char *arg){
int xv_version,xv_release,xv_request_base,xv_event_base,xv_error_base;
int mc_eventBase,mc_errorBase;
int mc_ver,mc_rev;
strarg_t ck_src_arg = { 0, NULL };
strarg_t ck_method_arg = { 0, NULL };
opt_t subopts [] =
{
int xv_version,xv_release,xv_request_base,xv_event_base,xv_error_base;
int mc_eventBase,mc_errorBase;
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 },
@ -396,7 +391,7 @@ opt_t subopts [] =
{ "queue", OPT_ARG_BOOL, &use_queue, NULL },
{ "bobdeint", OPT_ARG_BOOL, &bob_deinterlace, NULL },
{ NULL }
};
};
//Obtain display handler
if (!vo_init()) return -1;//vo_xv
@ -408,20 +403,20 @@ opt_t subopts [] =
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);
mp_msg(MSGT_VO,MSGL_INFO,"vo_xvmc: X-Video extension %d.%d\n",xv_version,xv_release);
if( True != XvMCQueryExtension(mDisplay,&mc_eventBase,&mc_errorBase) ){
printf("vo_xvmc: No X-Video MotionCompensation Extension on %s\n",
mp_msg(MSGT_VO,MSGL_ERR,"vo_xvmc: No X-Video MotionCompensation Extension on %s\n",
XDisplayName(NULL));
return -1;
}
if(Success == XvMCQueryVersion(mDisplay, &mc_ver, &mc_rev) ){
printf("vo_xvmc: X-Video MotionCompensation Extension version %i.%i\n",
mp_msg(MSGT_VO,MSGL_INFO,"vo_xvmc: X-Video MotionCompensation Extension version %i.%i\n",
mc_ver,mc_rev);
}
else{
printf("vo_xvmc: Error querying version info!\n");
mp_msg(MSGT_VO,MSGL_ERR,"vo_xvmc: Error querying version info!\n");
return -1;
}
surface_render = NULL;
@ -448,17 +443,17 @@ 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){
int i,mode_id,rez;
int numblocks,blocks_per_macroblock;//bpmb we have 6,8,12
int i,mode_id,rez;
int numblocks,blocks_per_macroblock;//bpmb we have 6,8,12
//from vo_xv
XVisualInfo vinfo;
XSetWindowAttributes xswa;
XWindowAttributes attribs;
unsigned long xswamask;
int depth;
XVisualInfo vinfo;
XSetWindowAttributes xswa;
XWindowAttributes attribs;
unsigned long xswamask;
int depth;
#ifdef CONFIG_XF86VM
int vm = flags & VOFLAG_MODESWITCHING;
int vm = flags & VOFLAG_MODESWITCHING;
#endif
//end of vo_xv
@ -486,13 +481,13 @@ int vm = flags & VOFLAG_MODESWITCHING;
rez = XvMCCreateContext(mDisplay, xv_port,mode_id,width,height,XVMC_DIRECT,&ctx);
if( rez != Success ){
printf("vo_xvmc: XvMCCreateContext failed with error %d\n",rez);
mp_msg(MSGT_VO,MSGL_ERR,"vo_xvmc: XvMCCreateContext failed with error %d\n",rez);
return -1;
}
if( ctx.flags & XVMC_DIRECT ){
printf("vo_xvmc: Allocated Direct Context\n");
mp_msg(MSGT_VO,MSGL_INFO,"vo_xvmc: Allocated Direct Context\n");
}else{
printf("vo_xvmc: Allocated Indirect Context!\n");
mp_msg(MSGT_VO,MSGL_INFO,"vo_xvmc: Allocated Indirect Context!\n");
}
@ -507,7 +502,7 @@ int vm = flags & VOFLAG_MODESWITCHING;
XvMCDestroyContext(mDisplay,&ctx);
return -1;
}
printf("vo_xvmc: data_blocks allocated\n");
mp_msg(MSGT_VO,MSGL_INFO,"vo_xvmc: data_blocks allocated\n");
rez = XvMCCreateMacroBlocks(mDisplay,&ctx,numblocks,&mv_blocks);
if( rez != Success ){
@ -515,7 +510,7 @@ int vm = flags & VOFLAG_MODESWITCHING;
XvMCDestroyContext(mDisplay,&ctx);
return -1;
}
printf("vo_xvmc: mv_blocks allocated\n");
mp_msg(MSGT_VO,MSGL_INFO,"vo_xvmc: mv_blocks allocated\n");
if(surface_render==NULL)
surface_render = malloc(MAX_SURFACES * sizeof(struct xvmc_pix_fmt)); //easy mem debug
@ -533,25 +528,25 @@ int vm = flags & VOFLAG_MODESWITCHING;
surface_render[i].idct = (surface_info.mc_type & XVMC_IDCT) == XVMC_IDCT;
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) )
printf("vo_xvmc: surface[%d] = %p .rndr=%p\n",i,&surface_array[i], &surface_render[i]);
mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc: surface[%d] = %p .rndr=%p\n",
i,&surface_array[i], &surface_render[i]);
}
number_of_surfaces = i;
if( number_of_surfaces < 4 ){// +2 I or P and +2 for B (to avoid visible motion drawing)
printf("vo_xvmc: Unable to allocate at least 4 Surfaces\n");
mp_msg(MSGT_VO,MSGL_ERR,"vo_xvmc: Unable to allocate at least 4 Surfaces\n");
uninit();
return -1;
}
printf("vo_xvmc: Motion Compensation context allocated - %d surfaces\n",
mp_msg(MSGT_VO,MSGL_INFO,"vo_xvmc: Motion Compensation context allocated - %d surfaces\n",
number_of_surfaces);
//debug
printf("vo_xvmc: idct=%d unsigned_intra=%d\n",
mp_msg(MSGT_VO,MSGL_INFO,"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);
// Find way to display OSD & subtitle
printf("vo_xvmc: looking for OSD support\n");
mp_msg(MSGT_VO,MSGL_INFO,"vo_xvmc: looking for OSD support\n");
subpicture_mode = NO_SUBPICTURE;
if(surface_info.flags & XVMC_OVERLAID_SURFACE)
subpicture_mode = OVERLAY_SUBPICTURE;
@ -580,7 +575,7 @@ int vm = flags & VOFLAG_MODESWITCHING;
subpicture_mode = BLEND_SUBPICTURE;
subpicture_info = xvfmv[s];
printf(" Subpicture id 0x%08X\n",subpicture_info.id);
mp_msg(MSGT_VO,MSGL_INFO," Subpicture id 0x%08X\n",subpicture_info.id);
goto found_subpic;
}
}
@ -599,18 +594,18 @@ found_subpic:
switch(subpicture_mode){
case NO_SUBPICTURE:
printf("vo_xvmc: No OSD support for this mode\n");
mp_msg(MSGT_VO,MSGL_WARN,"vo_xvmc: No OSD support for this mode\n");
break;
case OVERLAY_SUBPICTURE:
printf("vo_xvmc: OSD support via color key tricks\n");
printf("vo_xvmc: not yet implemented:(\n");
mp_msg(MSGT_VO,MSGL_WARN,"vo_xvmc: OSD support via color key tricks\n");
mp_msg(MSGT_VO,MSGL_WARN,"vo_xvmc: not yet implemented:(\n");
break;
case BLEND_SUBPICTURE:
printf("vo_xvmc: OSD support by additional frontend rendering\n");
mp_msg(MSGT_VO,MSGL_INFO,"vo_xvmc: OSD support by additional frontend rendering\n");
break;
case BACKEND_SUBPICTURE:
printf("vo_xvmc: OSD support by backend rendering (fast)\n");
printf("vo_xvmc: Please send feedback to confirm that it works,otherwise send bugreport!\n");
mp_msg(MSGT_VO,MSGL_INFO,"vo_xvmc: OSD support by backend rendering (fast)\n");
mp_msg(MSGT_VO,MSGL_INFO,"vo_xvmc: Please send feedback to confirm that it works,otherwise send bugreport!\n");
break;
}
@ -639,7 +634,7 @@ skip_surface_allocation:
{
vo_vm_switch();
}
else
// else
#endif
XGetWindowAttributes(mDisplay, DefaultRootWindow(mDisplay), &attribs);
depth=attribs.depth;
@ -720,28 +715,28 @@ static void init_osd_yuv_pal(void) {
}
rez = XvMCSetSubpicturePalette(mDisplay, &subpicture, palette);
if(rez!=Success){
printf("vo_xvmc: Setting palette failed.\n");
mp_msg(MSGT_VO,MSGL_ERR,"vo_xvmc: Setting palette failed.\n");
}
free(palette);
}
}
static void clear_osd_subpic(int x0, int y0, int w, int h){
int rez;
int rez;
rez=XvMCClearSubpicture(mDisplay, &subpicture,
x0, y0, w,h,
subpicture_clear_color);
if(rez != Success)
printf("vo_xvmc: XvMCClearSubpicture failed!\n");
mp_msg(MSGT_VO,MSGL_ERR,"vo_xvmc: XvMCClearSubpicture failed!\n");
}
static void OSD_init(void) {
unsigned short osd_height, osd_width;
int rez;
unsigned short osd_height, osd_width;
int rez;
if(subpicture_alloc){
if( mp_msg_test(MSGT_VO,MSGL_DBG4) )
printf("vo_xvmc: destroying subpicture\n");
mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc: destroying subpicture\n");
XvMCDestroySubpicture(mDisplay,&subpicture);
deallocate_xvimage();
subpicture_alloc = 0;
@ -763,37 +758,35 @@ int rez;
if(osd_width == 0 || osd_height == 0)
return;//if called before window size is known
if( mp_msg_test(MSGT_VO,MSGL_DBG4) )
printf("vo_xvmc: creating subpicture (%d,%d) format %X\n",
mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc: creating subpicture (%d,%d) format %X\n",
osd_width,osd_height,subpicture_info.id);
rez = XvMCCreateSubpicture(mDisplay,&ctx,&subpicture,
osd_width,osd_height,subpicture_info.id);
if(rez != Success){
subpicture_mode = NO_SUBPICTURE;
printf("vo_xvmc: Create Subpicture failed, OSD disabled\n");
mp_msg(MSGT_VO,MSGL_WARN,"vo_xvmc: Create Subpicture failed, OSD disabled\n");
return;
}
if( mp_msg_test(MSGT_VO,MSGL_DBG4) ){
int i;
printf("vo_xvmc: Created Subpicture:\n");
printf(" xvimage_id=0x%X\n",subpicture.xvimage_id);
printf(" width=%d\n",subpicture.width);
printf(" height=%d\n",subpicture.height);
printf(" num_palette_entries=0x%X\n",subpicture.num_palette_entries);
printf(" entry_bytes=0x%X\n",subpicture.entry_bytes);
mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc: Created Subpicture:\n");
mp_msg(MSGT_VO,MSGL_DBG4," xvimage_id=0x%X\n",subpicture.xvimage_id);
mp_msg(MSGT_VO,MSGL_DBG4," width=%d\n",subpicture.width);
mp_msg(MSGT_VO,MSGL_DBG4," height=%d\n",subpicture.height);
mp_msg(MSGT_VO,MSGL_DBG4," num_palette_entries=0x%X\n",subpicture.num_palette_entries);
mp_msg(MSGT_VO,MSGL_DBG4," entry_bytes=0x%X\n",subpicture.entry_bytes);
printf(" component_order=\"");
mp_msg(MSGT_VO,MSGL_DBG4," component_order=\"");
for(i=0; i<4; i++)
if(subpicture.component_order[i] >= 32)
printf("%c", subpicture.component_order[i]);
printf("\"\n");
mp_msg(MSGT_VO,MSGL_DBG4,"%c", subpicture.component_order[i]);
mp_msg(MSGT_VO,MSGL_DBG4,"\"\n");
}
//call init for the surface type
init_osd_fnc();//init palete,clear color etc ...
if( mp_msg_test(MSGT_VO,MSGL_DBG4) )
printf("vo_xvmc: clearing subpicture\n");
mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc: clearing subpicture\n");
clear_osd_fnc(0, 0, subpicture.width, subpicture.height);
allocate_xvimage(subpicture.width, subpicture.height, subpicture_info.id);
@ -801,11 +794,10 @@ int rez;
}
static void draw_osd_IA44(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride){
int ox,oy;
int rez;
int ox,oy;
int rez;
if( mp_msg_test(MSGT_VO,MSGL_DBG4) )
printf("vo_xvmc:composite AI44 subpicture (%d,%d - %d,%d)\n",x0,y0,w,h);
mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc:composite AI44 subpicture (%d,%d - %d,%d)\n",x0,y0,w,h);
for(ox=0; ox<w; ox++){
for(oy=0; oy<h; oy++){
@ -815,16 +807,16 @@ int rez;
rez = XvMCCompositeSubpicture(mDisplay, &subpicture, xvimage, 0, 0,
w,h,x0,y0);
if(rez != Success){
printf("vo_xvmc: composite subpicture failed\n");
mp_msg(MSGT_VO,MSGL_WARN,"vo_xvmc: composite subpicture failed\n");
assert(0);
}
}
static void draw_osd_AI44(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride){
int ox,oy;
int rez;
if( mp_msg_test(MSGT_VO,MSGL_DBG4) )
printf("vo_xvmc:composite AI44 subpicture (%d,%d - %d,%d)\n",x0,y0,w,h);
int ox,oy;
int rez;
mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc:composite AI44 subpicture (%d,%d - %d,%d)\n",x0,y0,w,h);
for(ox=0; ox<w; ox++){
for(oy=0; oy<h; oy++){
@ -834,19 +826,18 @@ int rez;
rez = XvMCCompositeSubpicture(mDisplay, &subpicture, xvimage, 0, 0,
w,h,x0,y0);
if(rez != Success){
printf("vo_xvmc: composite subpicture failed\n");
mp_msg(MSGT_VO,MSGL_WARN,"vo_xvmc: composite subpicture failed\n");
assert(0);
}
}
static void draw_osd(void){
struct xvmc_pix_fmt *osd_rndr;
int osd_has_changed;
int have_osd_to_draw;
int rez;
struct xvmc_pix_fmt *osd_rndr;
int osd_has_changed;
int have_osd_to_draw;
int rez;
if( mp_msg_test(MSGT_VO,MSGL_DBG4) )
printf("vo_xvmc: draw_osd ,OSD_mode=%d, surface_to_show=%p\n",
mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc: draw_osd ,OSD_mode=%d, surface_to_show=%p\n",
subpicture_mode,p_render_surface_to_show);
if(subpicture_mode == BLEND_SUBPICTURE ||
@ -882,7 +873,7 @@ int rez;
0, 0, subpicture.width, subpicture.height,
0, 0, image_width, image_height);
if(rez!=Success){
printf("vo_xvmc: BlendSubpicture failed rez=%d\n",rez);
mp_msg(MSGT_VO,MSGL_WARN,"vo_xvmc: BlendSubpicture failed rez=%d\n",rez);
assert(0);
return;
}
@ -899,8 +890,7 @@ int rez;
p_render_surface_to_show = osd_rndr;
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);
mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc:draw_osd: surface_to_show changed to %p\n",osd_rndr);
}//endof if(BLEND)
if(subpicture_mode == BACKEND_SUBPICTURE){
rez = XvMCBlendSubpicture(mDisplay,
@ -915,7 +905,8 @@ int rez;
}
static void xvmc_sync_surface(XvMCSurface * srf){
int status,rez;
int status,rez;
rez = XvMCGetSurfaceStatus(mDisplay,srf,&status);
assert(rez==Success);
if((status & XVMC_RENDERING) == 0)
@ -936,9 +927,9 @@ int status,rez;
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;
int rez;
struct vo_rect src_rect, dst_rect;
int i;
if(p_render_surface == NULL)
return;
@ -959,7 +950,7 @@ int i;
dst_rect.left, dst_rect.top, dst_rect.width, dst_rect.height,
bob_deinterlace ? field : 3);
if(rez != Success){
printf("vo_xvmc: PutSurface failer, critical error %d!\n",rez);
mp_msg(MSGT_VO,MSGL_ERR,"vo_xvmc: PutSurface failer, critical error %d!\n",rez);
assert(0);
}
}
@ -967,11 +958,9 @@ int i;
}
static void flip_page(void){
int i,cfs;
int i,cfs;
if( mp_msg_test(MSGT_VO,MSGL_DBG4) )
printf("vo_xvmc: flip_page show(rndr=%p)\n\n",p_render_surface_to_show);
mp_msg(MSGT_VO,MSGL_DBG4,"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->xvmc_id == AV_XVMC_ID );
@ -988,8 +977,7 @@ int i,cfs;
return;
}
p_render_surface_to_show=show_queue[0];
if( mp_msg_test(MSGT_VO,MSGL_DBG5) )
printf("vo_xvmc: flip_queue free_element=%d\n",free_element);
mp_msg(MSGT_VO,MSGL_DBG5,"vo_xvmc: flip_queue free_element=%d\n",free_element);
free_element--;
for(i=0; i<free_element; i++){
show_queue[i] = show_queue[i+1];
@ -1015,7 +1003,8 @@ int i,cfs;
}
static void check_events(void){
int e=vo_x11_check_events(mDisplay);
int e=vo_x11_check_events(mDisplay);
if(e&VO_EVENT_RESIZE)
{
e |= VO_EVENT_EXPOSE;
@ -1027,7 +1016,8 @@ int e=vo_x11_check_events(mDisplay);
}
static void xvmc_free(void){
int i;
int i;
if( subpicture_alloc ){
XvMCDestroySubpicture(mDisplay,&subpicture);
@ -1035,8 +1025,7 @@ int i;
subpicture_alloc = 0;
if( mp_msg_test(MSGT_VO,MSGL_DBG4) )
printf("vo_xvmc: subpicture destroyed\n");
mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc: subpicture destroyed\n");
}
if( number_of_surfaces ){
@ -1051,7 +1040,7 @@ int i;
if( (surface_render[i].state != 0) &&
(p_render_surface_visible != &surface_render[i]) )
printf("vo_xvmc::uninit surface_render[%d].status=%d\n",i,
mp_msg(MSGT_VO,MSGL_INFO,"vo_xvmc::uninit surface_render[%d].status=%d\n",i,
surface_render[i].state);
}
@ -1061,22 +1050,19 @@ int i;
XvMCDestroyContext(mDisplay,&ctx);
number_of_surfaces = 0;
if( mp_msg_test(MSGT_VO,MSGL_DBG4) ) {
printf("vo_xvmc: Context sucessfuly freed\n"); }
mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc: Context sucessfuly freed\n");
}
if( xv_port !=0 ){
XvUngrabPort(mDisplay,xv_port,CurrentTime);
xv_port = 0;
if( mp_msg_test(MSGT_VO,MSGL_DBG4) ) {
printf("vo_xvmc: xv_port sucessfuly ungrabed\n"); }
mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc: xv_port sucessfuly ungrabed\n");
}
}
static void uninit(void){
if( mp_msg_test(MSGT_VO,MSGL_DBG4) ) {
printf("vo_xvmc: uninit called\n"); }
mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc: uninit called\n");
xvmc_free();
//from vo_xv
#ifdef CONFIG_XF86VM
@ -1086,12 +1072,11 @@ static void uninit(void){
}
static int query_format(uint32_t format){
uint32_t flags;
XvMCSurfaceInfo qsurface_info;
int mode_id;
uint32_t flags;
XvMCSurfaceInfo qsurface_info;
int mode_id;
if( mp_msg_test(MSGT_VO,MSGL_DBG4) )
printf("vo_xvmc: query_format=%X\n",format);
mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc: query_format=%X\n",format);
if(!IMGFMT_IS_XVMC(format)) return 0;// no caps supported
mode_id = xvmc_find_surface_by_format(format, 16, 16, &qsurface_info, 1);//true=1 - quering
@ -1111,11 +1096,10 @@ int mode_id;
static int draw_slice(uint8_t *image[], int stride[],
int w, int h, int x, int y){
struct xvmc_pix_fmt *rndr;
int rez;
struct xvmc_pix_fmt *rndr;
int rez;
if( mp_msg_test(MSGT_VO,MSGL_DBG4) )
printf("vo_xvmc: draw_slice y=%d\n",y);
mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc: draw_slice y=%d\n",y);
rndr = (struct xvmc_pix_fmt*)image[2]; //this is copy of priv-ate
assert( rndr != NULL );
@ -1132,31 +1116,31 @@ int rez;
if(rez != Success)
{
int i;
printf("vo_xvmc::slice: RenderSirface returned %d\n",rez);
mp_msg(MSGT_VO,MSGL_ERR,"vo_xvmc::slice: RenderSirface returned %d\n",rez);
printf("vo_xvmc::slice: pict=%d,flags=%x,start_blocks=%d,num_blocks=%d\n",
mp_msg(MSGT_VO,MSGL_ERR,"vo_xvmc::slice: pict=%d,flags=%x,start_blocks=%d,num_blocks=%d\n",
rndr->picture_structure,rndr->flags,rndr->start_mv_blocks_num,
rndr->filled_mv_blocks_num);
printf("vo_xvmc::slice: this_surf=%p, past_surf=%p, future_surf=%p\n",
mp_msg(MSGT_VO,MSGL_ERR,"vo_xvmc::slice: this_surf=%p, past_surf=%p, future_surf=%p\n",
rndr->p_surface,rndr->p_past_surface,rndr->p_future_surface);
for(i=0; i<rndr->filled_mv_blocks_num; i++){
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",
mp_msg(MSGT_VO,MSGL_ERR,"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",
mp_msg(MSGT_VO,MSGL_ERR,"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);
printf("vo_xvmc::slice: PMV[0][0][0/1]=(%d,%d)\n",
mp_msg(MSGT_VO,MSGL_ERR,"vo_xvmc::slice: PMV[0][0][0/1]=(%d,%d)\n",
testblock->PMV[0][0][0],testblock->PMV[0][0][1]);
}
}
#endif
assert(rez==Success);
if( mp_msg_test(MSGT_VO,MSGL_DBG4) ) printf("vo_xvmc: flush surface\n");
mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc: flush surface\n");
rez = XvMCFlushSurface(mDisplay, rndr->p_surface);
assert(rez==Success);
@ -1172,12 +1156,12 @@ 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_pix_fmt *src_rndr) {
struct xvmc_pix_fmt *osd_rndr;
int stat;
struct xvmc_pix_fmt *osd_rndr;
int stat;
//If this is source surface, check does the OSD rendering is compleate
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);
mp_msg(MSGT_VO,MSGL_DBG4,"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))
@ -1185,7 +1169,8 @@ int stat;
}
}
static int count_free_surfaces(void) {
int i,num;
int i,num;
num=0;
for(i=0; i<number_of_surfaces; i++){
check_osd_source(&surface_render[i]);
@ -1196,9 +1181,9 @@ int i,num;
}
static struct xvmc_pix_fmt *find_free_surface(void) {
int i,t;
int stat;
struct xvmc_pix_fmt *visible_rndr;
int i,t;
int stat;
struct xvmc_pix_fmt *visible_rndr;
visible_rndr = NULL;
for(i=0; i<number_of_surfaces; i++){
@ -1215,7 +1200,7 @@ struct xvmc_pix_fmt *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){
printf("vo_xvmc: waiting retrace\n");
mp_msg(MSGT_VO,MSGL_INFO,"vo_xvmc: waiting retrace\n");
for(t=0;t<1000;t++){
usec_sleep(1000);//1ms
XvMCGetSurfaceStatus(mDisplay, visible_rndr->p_surface,&stat);
@ -1224,14 +1209,14 @@ struct xvmc_pix_fmt *visible_rndr;
}
}
//todo remove when stable
printf("vo_xvmc: no free surfaces, this should not happen in g1\n");
mp_msg(MSGT_VO,MSGL_WARN,"vo_xvmc: no free surfaces, this should not happen in g1\n");
for(i=0;i<number_of_surfaces;i++)
printf("vo_xvmc: surface[%d].state=%d\n",i,surface_render[i].state);
mp_msg(MSGT_VO,MSGL_WARN,"vo_xvmc: surface[%d].state=%d\n",i,surface_render[i].state);
return NULL;
}
static void xvmc_clean_surfaces(void){
int i;
int i;
for(i=0; i<number_of_surfaces; i++){
@ -1253,7 +1238,7 @@ static uint32_t get_image(mp_image_t *mpi){
rndr = find_free_surface();
if(rndr == NULL){
printf("vo_xvmc: get_image failed\n");
mp_msg(MSGT_VO,MSGL_ERR,"vo_xvmc: get_image failed\n");
return VO_FALSE;
}
@ -1281,8 +1266,7 @@ assert(rndr->next_free_data_block_num == 0);
rndr->filled_mv_blocks_num = 0;
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",
mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc: get_image: rndr=%p (surface=%p) \n",
rndr,rndr->p_surface);
return VO_TRUE;
}
@ -1342,5 +1326,5 @@ static int control(uint32_t request, void *data)
update_xinerama_info();
return VO_TRUE;
}
return VO_NOTIMPL;
return VO_NOTIMPL;
}