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. MPlayer was initially written by Arpad Gereoffy.
See the AUTHORS file for a list of some of the many other contributors. See the AUTHORS file for a list of some of the many other contributors.
.PP .PP
MPlayer is (C) 2000\-2008 The MPlayer Team MPlayer is (C) 2000\-2009 The MPlayer Team
.PP .PP
This man page was written mainly by Gabucino, Jonas Jermann and Diego Biurrun. This man page was written mainly by Gabucino, Jonas Jermann and Diego Biurrun.
It is maintained by 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 .\" MPlayer (C) 2000-2009 MPlayer Team
.\" Ezt a man oldalt Gabucino, Diego Biurrun és Jonas Jermann készíti/készítette .\" Ezt a man oldalt Gabucino, Diego Biurrun és Jonas Jermann készíti/készítette
.\" Karbantartó: Gabrov .\" Karbantartó: Gabrov
@ -33,7 +33,7 @@
.\" Név .\" 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 .SH NÉV
mplayer \- film lejátszó mplayer \- film lejátszó
@ -1913,10 +1913,10 @@ L
Beállítja a tunert az <érték> csatornára. Beállítja a tunert az <érték> csatornára.
.IPs chanlist=<érték> .IPs chanlist=<érték>
elérhető: europe-east, europe-west, us-bcast, us-cable, stb. 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. Csatornák neveinek beállítása.
.I MEGJEGYZÉS: .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. a frekvenciatáblázatban szereplő csatornanév helyett.
.br .br
Használj _ jelet a szóköz helyett a nevekben (vagy játsz az idézőjelezéssel ;-). 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 .PD 1
. .
.TP .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) .B xvmc (csak X11 \-vc ffmpeg12mc kapcsolóval)
Videó kimeneti vezérlő ami az XFree86 4.x XvMC (X Video Motion Compensation) 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. 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. Az MPlayert eredetileg Gereöffy Árpád írta.
Lásd az AUTHORS fájlt a többi közreműködő listájához. Lásd az AUTHORS fájlt a többi közreműködő listájához.
.PP .PP
MPlayer (C) 2000\-2008 Az MPlayer Csapat MPlayer (C) 2000\-2009 Az MPlayer Csapat
.PP .PP
Ezt a man oldalt nagyrészt Gabucino, Jonas Jermann és Diego Biurrun írta. Ezt a man oldalt nagyrészt Gabucino, Jonas Jermann és Diego Biurrun írta.
A karbantartó Diego Biurrun. A karbantartó Diego Biurrun.

View File

@ -2,7 +2,7 @@
.\" This man page was/is done by Gabucino, Diego Biurrun, Jonas Jermann .\" This man page was/is done by Gabucino, Diego Biurrun, Jonas Jermann
.\" Translated by Vladimir Voroshilov <voroshil@gmail.com> .\" Translated by Vladimir Voroshilov <voroshil@gmail.com>
.\" Encoding: koi8-r .\" 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. MPlayer изначально был написан Arpad Gereoffy.
Смотрите файл AUTHORS, чтобы получить список некоторых из множества других разработчиков. Смотрите файл AUTHORS, чтобы получить список некоторых из множества других разработчиков.
.PP .PP
MPlayer is (C) 2000\-2008 The MPlayer Team MPlayer is (C) 2000\-2009 The MPlayer Team
.PP .PP
Оригинальная английская версия этого руководства в основном была написана Gabucino, Оригинальная английская версия этого руководства в основном была написана Gabucino,
Jonas Jermann и Diego Biurrun. Сейчас она поддерживается Diego Biurrun. Jonas Jermann и Diego Biurrun. Сейчас она поддерживается Diego Biurrun.

View File

@ -220,7 +220,7 @@ libao2 drivers:
* ao_oss.c - None * ao_oss.c - None
* ao_pcm.c - None * ao_pcm.c - None
* ao_plugin.c - None * ao_plugin.c - None
* ao_pulse.c - Reimar Döffinger * ao_pulse.c - None
* ao_sdl.c - None * ao_sdl.c - None
* ao_sgi.c - None * ao_sgi.c - None
* ao_sun.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, The constants for different pixelformats are defined in img_format.h,
their usage is mandatory. 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: Each vo driver _has_ to implement these:
preinit(): preinit():
@ -15,7 +23,9 @@ Each vo driver _has_ to implement these:
Uninit the whole system, this is on the same "level" as preinit. Uninit the whole system, this is on the same "level" as preinit.
control(): 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. VOCTRL_QUERY_FORMAT - queries if a given pixelformat is supported.
It also returns various flags decsirbing the capabilities It also returns various flags decsirbing the capabilities
of the driver with teh given mode. for the flags, see 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 by drivers which use X11, except SDL, as well as directx and
gl2 under Windows. gl2 under Windows.
VOCTRL_BORDER 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(): config():
Set up the video system. You get the dimensions and flags. 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 So, you can check for vo_config_count>0 in uninit() when freeing
resources allocated in config() to avoid crash! resources allocated in config() to avoid crash!
You should call geometry() in config() to enable user defined You should implement VOCTRL_UPDATE_SCREENINFO so that vo_dx, vo_dy,
window size and position. The code should look as following: vo_dwidth and vo_dheight are already pre-set to values that take
--- aspect and -geometry into account. It is also necessary to properly
set x,y,w,h to the values supplied by the caller or to those you deam support multi-monitor setups (if based on x11_common, w32_common).
useful.
call geometry(&x, &y, &w, &h, screenw, screenh)
call aspect()
---
see libvo/geometry.c for further information
draw_slice(): this displays YV12 pictures (3 planes, one full sized that draw_slice(): this displays YV12 pictures (3 planes, one full sized that
contains brightness (Y), and 2 quarter-sized which the colour-info contains brightness (Y), and 2 quarter-sized which the colour-info
(U,V). MPEG codecs (libmpeg2, opendivx) use this. This doesn't have (U,V). MPEG codecs (libmpeg2, opendivx) use this. This doesn't have
to display the whole frame, only update small parts of it. 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 draw_frame(): this is the older interface, this displays only complete
frames, and can do only packed format (YUY2, RGB/BGR). frames, and can do only packed format (YUY2, RGB/BGR).
Win32 codecs use this (DivX, Indeo, etc). 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. draw_osd(): this displays subtitles and OSD.
It's a bit tricky to use it, since it's a callback-style stuff. 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 The vo_draw_text() checks the characters to draw, and calls
draw_alpha() for each. As a help, osd.c contains draw_alpha for draw_alpha() for each. As a help, osd.c contains draw_alpha for
each pixelformats, use this if possible! 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 NOTE: This one will be obsolete soon! But it's still useful when
you want to do tricks, like rendering osd _after_ hardware scaling you want to do tricks, like rendering osd _after_ hardware scaling
(tdfxfb) or render subtitles under of the image (vo_mpegpes, sdl) (tdfxfb) or render subtitles under of the image (vo_mpegpes, sdl)
flip_page(): this is called after each frame, this diplays the buffer for NOTE2: above NOTE is probably wrong, there are currently no plans to
real. This is 'swapbuffers' when doublebuffering. 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: I have no sound when playing a video and get error messages similar to this one:
<screen> <screen>
AO: [oss] 44100Hz 2ch Signed 16-bit (Little-Endian) AO: [oss] 44100Hz 2ch Signed 16-bit (Little-Endian)
audio_setup: Can't open audio device /dev/dsp: Device or resource busy [AO OSS] audio_setup: Can't open audio device /dev/dsp: Device or resource busy
couldn't open/init audio device -> NOSOUND Could not open/initialize audio device -> no sound.
Audio: no sound!!! Audio: no sound
Start playing... Starting playback...
</screen> </screen>
</para></question> </para></question>
<answer><para> <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 When I play this movie I get video-audio desync and/or
<application>MPlayer</application> crashes with the following message: <application>MPlayer</application> crashes with the following message:
<screen> <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> </screen>
</para></question> </para></question>
<answer><para> <answer><para>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!-- synced with r28593 --> <!-- synced with r28615 -->
<appendix id="bugreports"> <appendix id="bugreports">
<title>Hogyan jelentsd a hibákat</title> <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 (Á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 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.) 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>
<para> <para>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!-- synced with r28531 --> <!-- synced with r28660 -->
<chapter id="faq" xreflabel="FAQ"> <chapter id="faq" xreflabel="FAQ">
<title>Gyakran ismételt kérdések</title> <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: Nincs hang videó lejátszása közben, és egy ehhez hasonló üzenetet kapok:
<screen> <screen>
AO: [oss] 44100Hz 2ch Signed 16-bit (Little-Endian) AO: [oss] 44100Hz 2ch Signed 16-bit (Little-Endian)
audio_setup: Can't open audio device /dev/dsp: Device or resource busy [AO OSS] audio_setup: Can't open audio device /dev/dsp: Device or resource busy
couldn't open/init audio device -> NOSOUND Could not open/initialize audio device -> no sound.
Audio: no sound!!! Audio: no sound
Start playing... Starting playback...
</screen> </screen>
</para></question> </para></question>
<answer><para> <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 Amikor filmet játszok le, szétesik a videó-audió szinkron
és/vagy az <application>MPlayer</application> összeomlik ezzel az üzenettel: és/vagy az <application>MPlayer</application> összeomlik ezzel az üzenettel:
<screen> <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> </screen>
</para></question> </para></question>
<answer><para> <answer><para>

View File

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

View File

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

View File

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

View File

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

View File

@ -50,14 +50,19 @@ static const struct {
{IMGFMT_YVU9, PIX_FMT_YUV410P}, {IMGFMT_YVU9, PIX_FMT_YUV410P},
{IMGFMT_IF09, PIX_FMT_YUV410P}, {IMGFMT_IF09, PIX_FMT_YUV410P},
{IMGFMT_YV12, PIX_FMT_YUV420P}, {IMGFMT_YV12, PIX_FMT_YUV420P},
{IMGFMT_YV12, PIX_FMT_YUVJ420P},
{IMGFMT_I420, PIX_FMT_YUV420P}, {IMGFMT_I420, PIX_FMT_YUV420P},
{IMGFMT_IYUV, PIX_FMT_YUV420P}, {IMGFMT_IYUV, PIX_FMT_YUV420P},
{IMGFMT_411P, PIX_FMT_YUV411P}, {IMGFMT_411P, PIX_FMT_YUV411P},
{IMGFMT_422P, PIX_FMT_YUV422P}, {IMGFMT_422P, PIX_FMT_YUV422P},
{IMGFMT_422P, PIX_FMT_YUVJ422P},
{IMGFMT_444P, PIX_FMT_YUV444P}, {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_444P, PIX_FMT_YUVJ444P},
{IMGFMT_XVMC_MOCO_MPEG2, PIX_FMT_XVMC_MPEG2_MC}, {IMGFMT_XVMC_MOCO_MPEG2, PIX_FMT_XVMC_MPEG2_MC},
{IMGFMT_XVMC_IDCT_MPEG2, PIX_FMT_XVMC_MPEG2_IDCT}, {IMGFMT_XVMC_IDCT_MPEG2, PIX_FMT_XVMC_MPEG2_IDCT},
{IMGFMT_VDPAU_MPEG1, PIX_FMT_VDPAU_MPEG1}, {IMGFMT_VDPAU_MPEG1, PIX_FMT_VDPAU_MPEG1},

View File

@ -75,7 +75,7 @@ static char help_text[]=
#define MSGTR_TryForceVideoFmtStr "Попытка форсировать семейство видеокодеков %s...\n" #define MSGTR_TryForceVideoFmtStr "Попытка форсировать семейство видеокодеков %s...\n"
#define MSGTR_CantFindVideoCodec "Не могу найти кодек для выбранного -vo и видеоформата 0x%X!\n" #define MSGTR_CantFindVideoCodec "Не могу найти кодек для выбранного -vo и видеоформата 0x%X!\n"
#define MSGTR_CannotInitVO "ФАТАЛЬНАЯ ОШИБКА: Не могу инициализировать видеодрайвер!\n" #define MSGTR_CannotInitVO "ФАТАЛЬНАЯ ОШИБКА: Не могу инициализировать видеодрайвер!\n"
#define MSGTR_CannotInitAO "не могу открыть/инициализировать аудиоустройство -> БЕЗ ЗВУКА\n" #define MSGTR_CannotInitAO "Не могу открыть/инициализировать аудиоустройство -> без звука.\n"
#define MSGTR_StartPlaying "Начало воспроизведения...\n" #define MSGTR_StartPlaying "Начало воспроизведения...\n"
#define MSGTR_SystemTooSlow "\n\n"\ #define MSGTR_SystemTooSlow "\n\n"\
@ -103,7 +103,7 @@ static char help_text[]=
#define MSGTR_NoGui "MPlayer был скомпилирован БЕЗ поддержки GUI!\n" #define MSGTR_NoGui "MPlayer был скомпилирован БЕЗ поддержки GUI!\n"
#define MSGTR_GuiNeedsX "GUI MPlayer необходим X11!\n" #define MSGTR_GuiNeedsX "GUI MPlayer необходим X11!\n"
#define MSGTR_Playing "\nВоспроизведение %s.\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_FPSforced "Кадры/сек форсированы в %5.3f (время кадра: %5.3f).\n"
#define MSGTR_CompiledWithRuntimeDetection "Скомпилировано для определения типа процессора во время выполнения.\n" #define MSGTR_CompiledWithRuntimeDetection "Скомпилировано для определения типа процессора во время выполнения.\n"
#define MSGTR_CompiledWithCPUExtensions "Скомпилировано для x86 CPU со следующими расширениями:" #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 */ /** A temporary variable to store the current volume */
static pa_cvolume volume; static pa_cvolume volume;
static int broken_pause;
LIBAO_EXTERN(pulse) LIBAO_EXTERN(pulse)
#define GENERIC_ERR_MSG(ctx, str) \ #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 *devarg = NULL;
char *host = NULL; char *host = NULL;
char *sink = NULL; char *sink = NULL;
char *version = pa_get_library_version();
if (ao_subdevice) { if (ao_subdevice) {
devarg = strdup(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; 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.channels = channels;
ss.rate = rate_hz; ss.rate = rate_hz;
@ -288,6 +302,10 @@ static void audio_pause(void) {
/** Resume the audio stream by uncorking it on the server */ /** Resume the audio stream by uncorking it on the server */
static void audio_resume(void) { 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); 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.bps = byte_per_sec = bytes_per_sample * ao_data.samplerate;
ao_data.outburst = byte_per_sec > 100000 ? 16384 : 8192; ao_data.outburst = byte_per_sec > 100000 ? 16384 : 8192;
AUDIO_INITINFO(&info); reset();
info.play.samples = 0;
info.play.eof = 0;
info.play.error = 0;
ioctl (audio_fd, AUDIO_SETINFO, &info);
queued_bursts = 0;
queued_samples = 0;
return 1; return 1;
} }
@ -608,7 +601,15 @@ static void uninit(int immed){
// stop playing and empty buffers (for seeking/pause) // stop playing and empty buffers (for seeking/pause)
static void reset(void){ static void reset(void){
audio_info_t info;
flush_audio(audio_fd); 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_bursts = 0;
queued_samples = 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 #if CONFIG_XVMC || CONFIG_VDPAU
static enum PixelFormat get_format(struct AVCodecContext *avctx, static enum PixelFormat get_format(struct AVCodecContext *avctx,
const enum PixelFormat *fmt){ const enum PixelFormat *fmt){
enum PixelFormat selected_format = fmt[0]; enum PixelFormat selected_format;
int imgfmt; int imgfmt;
sh_video_t *sh = avctx->opaque; sh_video_t *sh = avctx->opaque;
int i; int i;
@ -889,10 +889,10 @@ static enum PixelFormat get_format(struct AVCodecContext *avctx,
if(!IMGFMT_IS_XVMC(imgfmt) && !IMGFMT_IS_VDPAU(imgfmt)) continue; if(!IMGFMT_IS_XVMC(imgfmt) && !IMGFMT_IS_VDPAU(imgfmt)) continue;
mp_msg(MSGT_DECVIDEO, MSGL_INFO, MSGTR_MPCODECS_TryingPixfmt, i); mp_msg(MSGT_DECVIDEO, MSGL_INFO, MSGTR_MPCODECS_TryingPixfmt, i);
if(init_vo(sh, fmt[i]) >= 0) { if(init_vo(sh, fmt[i]) >= 0) {
selected_format = fmt[i];
break; break;
} }
} }
selected_format = fmt[i];
imgfmt = pixfmt2imgfmt(selected_format); imgfmt = pixfmt2imgfmt(selected_format);
if(IMGFMT_IS_XVMC(imgfmt) || IMGFMT_IS_VDPAU(imgfmt)) { if(IMGFMT_IS_XVMC(imgfmt) || IMGFMT_IS_VDPAU(imgfmt)) {
vd_ffmpeg_ctx *ctx = sh->context; 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; vf->priv->hue *= M_PI / 180.0;
process = process_C; process = process_C;
#if HAVE_MMXX
if(gCpuCaps.hasMMX) process = process_MMX;
#endif
return 1; return 1;
} }

View File

@ -624,7 +624,15 @@ static int demux_real_fill_buffer(demuxer_t *demuxer, demux_stream_t *dsds)
if (len < 12){ 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_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); 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; continue; //goto loop;
} }

View File

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

View File

@ -121,47 +121,68 @@
"punpcklbw %%mm5, %%mm2;" /* G7 G6 G5 G4 G3 G2 G1 G0 */\ "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, static inline int RENAME(yuv420_rgb16)(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY,
int srcSliceH, uint8_t* dst[], int dstStride[]){ int srcSliceH, uint8_t* dst[], int dstStride[]){
int y, h_size; int y, h_size;
if(c->srcFormat == PIX_FMT_YUV422P){ YUV422_UNSHIFT
srcStride[1] *= 2; YUV2RGB_LOOP(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;
c->blueDither= ff_dither8[y&1]; c->blueDither= ff_dither8[y&1];
c->greenDither= ff_dither4[y&1]; c->greenDither= ff_dither4[y&1];
c->redDither= ff_dither8[(y+1)&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. */ YUV2RGB_INIT
__asm__ volatile ( YUV2RGB
/* 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
#ifdef DITHER1XBPP #ifdef DITHER1XBPP
"paddusb "BLUE_DITHER"(%4), %%mm0;" "paddusb "BLUE_DITHER"(%4), %%mm0;"
@ -201,55 +222,22 @@ YUV2RGB
MOVNTQ " %%mm5, 8 (%1);" /* store pixel 4-7 */ MOVNTQ " %%mm5, 8 (%1);" /* store pixel 4-7 */
"add $16, %1 \n\t" YUV2RGB_ENDLOOP(2)
"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_rgb15)(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, static inline int RENAME(yuv420_rgb15)(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY,
int srcSliceH, uint8_t* dst[], int dstStride[]){ int srcSliceH, uint8_t* dst[], int dstStride[]){
int y, h_size; int y, h_size;
if(c->srcFormat == PIX_FMT_YUV422P){ YUV422_UNSHIFT
srcStride[1] *= 2; YUV2RGB_LOOP(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;
c->blueDither= ff_dither8[y&1]; c->blueDither= ff_dither8[y&1];
c->greenDither= ff_dither8[y&1]; c->greenDither= ff_dither8[y&1];
c->redDither= ff_dither8[(y+1)&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. */ YUV2RGB_INIT
__asm__ volatile ( YUV2RGB
/* 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
#ifdef DITHER1XBPP #ifdef DITHER1XBPP
"paddusb "BLUE_DITHER"(%4), %%mm0 \n\t" "paddusb "BLUE_DITHER"(%4), %%mm0 \n\t"
@ -291,49 +279,18 @@ YUV2RGB
MOVNTQ " %%mm5, 8 (%1);" /* store pixel 4-7 */ MOVNTQ " %%mm5, 8 (%1);" /* store pixel 4-7 */
"add $16, %1 \n\t" YUV2RGB_ENDLOOP(2)
"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_rgb24)(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, static inline int RENAME(yuv420_rgb24)(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY,
int srcSliceH, uint8_t* dst[], int dstStride[]){ int srcSliceH, uint8_t* dst[], int dstStride[]){
int y, h_size; int y, h_size;
if(c->srcFormat == PIX_FMT_YUV422P){ YUV422_UNSHIFT
srcStride[1] *= 2; YUV2RGB_LOOP(3)
srcStride[2] *= 2;
}
h_size= (c->dstW+7)&~7; YUV2RGB_INIT
if(h_size*3 > FFABS(dstStride[0])) h_size-=8; YUV2RGB
__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
/* mm0=B, %%mm2=G, %%mm1=R */ /* mm0=B, %%mm2=G, %%mm1=R */
#if HAVE_MMX2 #if HAVE_MMX2
"movq "MANGLE(ff_M24A)", %%mm4 \n\t" "movq "MANGLE(ff_M24A)", %%mm4 \n\t"
@ -436,50 +393,18 @@ YUV2RGB
"pxor %%mm4, %%mm4 \n\t" "pxor %%mm4, %%mm4 \n\t"
#endif #endif
"add $24, %1 \n\t" YUV2RGB_ENDLOOP(3)
"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_rgb32)(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, static inline int RENAME(yuv420_rgb32)(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY,
int srcSliceH, uint8_t* dst[], int dstStride[]){ int srcSliceH, uint8_t* dst[], int dstStride[]){
int y, h_size; int y, h_size;
if(c->srcFormat == PIX_FMT_YUV422P){ YUV422_UNSHIFT
srcStride[1] *= 2; YUV2RGB_LOOP(4)
srcStride[2] *= 2;
}
h_size= (c->dstW+7)&~7; YUV2RGB_INIT
if(h_size*4 > FFABS(dstStride[0])) h_size-=8; YUV2RGB
__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
/* convert RGB plane to RGB packed format, /* convert RGB plane to RGB packed format,
mm0 -> B, mm1 -> R, mm2 -> G, mm3 -> 0, mm0 -> B, mm1 -> R, mm2 -> G, mm3 -> 0,
mm4 -> GB, mm5 -> AR pixel 4-7, mm4 -> GB, mm5 -> AR pixel 4-7,
@ -522,15 +447,5 @@ YUV2RGB
"pxor %%mm4, %%mm4;" /* zero mm4 */ "pxor %%mm4, %%mm4;" /* zero mm4 */
"movq 8 (%5, %0, 2), %%mm6;" /* Load 8 Y Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 */ "movq 8 (%5, %0, 2), %%mm6;" /* Load 8 Y Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 */
"add $32, %1 \n\t" YUV2RGB_ENDLOOP(4)
"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;
} }

View File

@ -158,12 +158,12 @@ const struct vo_driver *video_out_drivers[] =
#ifdef CONFIG_3DFX #ifdef CONFIG_3DFX
&video_out_3dfx, &video_out_3dfx,
#endif #endif
#if CONFIG_VDPAU
&video_out_vdpau,
#endif
#ifdef CONFIG_XV #ifdef CONFIG_XV
&video_out_xv, &video_out_xv,
#endif #endif
#if CONFIG_VDPAU
&video_out_vdpau,
#endif
#ifdef CONFIG_X11 #ifdef CONFIG_X11
&video_out_x11, &video_out_x11,
&video_out_xover, &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 //return number of 1'st free page or -1 if no free one
static inline int page_find_free(void){ static inline int page_find_free(void){
int i; int i;
for(i=0;i<max_pages;i++) for(i=0;i<max_pages;i++)
if(PageStore[i].locks == PAGE_EMPTY) return i; if(PageStore[i].locks == PAGE_EMPTY) return i;
return -1; return -1;
@ -134,8 +134,8 @@ int i;
static int preinit(const char *arg) static int preinit(const char *arg)
{ {
int i,rez; int i,rez;
char s[64]; char s[64];
getch2_disable(); getch2_disable();
memset(zerobuf,0,sizeof(zerobuf)); memset(zerobuf,0,sizeof(zerobuf));
@ -188,7 +188,7 @@ char s[64];
force_vm=vga_getmodenumber(s); force_vm=vga_getmodenumber(s);
if(force_vm>0) { 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{ }else{
force_vm = 0; force_vm = 0;
} }
@ -206,11 +206,10 @@ char s[64];
} }
static void svga_clear_box(int x,int y,int w,int h){ static void svga_clear_box(int x,int y,int w,int h){
uint8_t * rgbplane; uint8_t * rgbplane;
int i; int i;
if (mode_capabilities&CAP_ACCEL_CLEAR){ 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", mp_msg(MSGT_VO,MSGL_DBG3, "vo_svga: clearing box %d,%d - %d,%d with HW acceleration\n",
x,y,w,h); x,y,w,h);
if(mode_capabilities&CAP_ACCEL_BACKGR) if(mode_capabilities&CAP_ACCEL_BACKGR)
@ -220,7 +219,6 @@ int i;
return; return;
} }
if (mode_capabilities & CAP_LINEAR){ 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); 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); rgbplane=PageStore[0].vbase + (y*mode_stride) + (x*modeinfo->bytesperpixel);
for(i=0;i<h;i++){ for(i=0;i<h;i++){
@ -232,7 +230,6 @@ int i;
return; return;
} }
//native //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); 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; if(modeinfo->bytesperpixel!=0) w*=modeinfo->bytesperpixel;
for(i=0;i<h;i++){ for(i=0;i<h;i++){
@ -241,14 +238,13 @@ int i;
}; };
static uint32_t svga_draw_image(mp_image_t *mpi){ static uint32_t svga_draw_image(mp_image_t *mpi){
int i,x,y,w,h; int i,x,y,w,h;
int stride; int stride;
uint8_t *rgbplane, *base; uint8_t *rgbplane, *base;
int bytesperline; int bytesperline;
int page; int page;
if(mpi->flags & MP_IMGFLAG_DIRECT){ 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"); mp_msg(MSGT_VO,MSGL_DBG3, "vo_svga: drawing direct rendered surface\n");
cpage=(uint32_t)mpi->priv; cpage=(uint32_t)mpi->priv;
assert((cpage>=0)&&(cpage<max_pages)); assert((cpage>=0)&&(cpage<max_pages));
@ -278,7 +274,6 @@ int page;
(stride == mode_stride) ){ //only monolite image can be accelerated (stride == mode_stride) ){ //only monolite image can be accelerated
w=(stride*8)/mpi->bpp;//we transfer pixels in the stride so the source w=(stride*8)/mpi->bpp;//we transfer pixels in the stride so the source
//ACCELERATE //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); 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) if(mode_capabilities & CAP_ACCEL_BACKGR)
vga_accel(ACCEL_SYNC); vga_accel(ACCEL_SYNC);
@ -289,7 +284,6 @@ int page;
if( mode_capabilities&CAP_LINEAR){ if( mode_capabilities&CAP_LINEAR){
//DIRECT //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); 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; bytesperline=(w*mpi->bpp)/8;
base=PageStore[cpage].vbase + (y*mode_stride) + (x*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 //one byte per pixel! svgalib innovation
if(mpi->imgfmt==IMGFMT_RG4B || mpi->imgfmt==IMGFMT_BG4B) length=w; 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); 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 y+=PageStore[cpage].yoffset;//y position of the page beggining
for(i=0;i<h;i++){ 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++){ for(i=1;i<=lastmode;i++){
vminfo = vga_getmodeinfo(i); vminfo = vga_getmodeinfo(i);
if( vminfo == NULL ) continue; 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)); mp_msg(MSGT_VO,MSGL_DBG4, "vo_svga: testing mode %d (%s)\n",i,vga_getmodename(i));
if( vga_hasmode(i) == 0 ) continue; if( vga_hasmode(i) == 0 ) continue;
if( req_bpp != bpp_from_vminfo(vminfo) )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... if( bestmode==0 || prev_badness >= badness ){//modeX etc...
prev_badness=badness; prev_badness=badness;
bestmode=i; 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); 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; int32_t req_bpp;
uint32_t accflags; 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, 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); d_width, d_height, flags, title, format);
//Only RGB modes supported //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( vo_dbpp!=0 && vo_dbpp!=req_bpp) {assert(0);return-1;}
if(!force_vm) { 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: 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); 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); vid_mode=find_best_svga_mode(req_w,req_h,req_bpp);
if(vid_mode==0) if(vid_mode==0)
return 1; 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[], static int draw_slice(uint8_t *image[],int stride[],
int w, int h, int x, int y) { int w, int h, int x, int y) {
assert(0); assert(0);
UNUSED(image);UNUSED(stride); UNUSED(image);UNUSED(stride);
UNUSED(w);UNUSED(h); UNUSED(w);UNUSED(h);
UNUSED(x);UNUSED(y); UNUSED(x);UNUSED(y);
return VO_ERROR;//this is yv12 only -> vf_scale should do all transforms return VO_ERROR;//this is yv12 only -> vf_scale should do all transforms
} }
static int draw_frame(uint8_t *src[]) { static int draw_frame(uint8_t *src[]) {
assert(0); assert(0);
UNUSED(src); UNUSED(src);
return VO_ERROR;//this one should not be called return VO_ERROR;//this one should not be called
} }
static void draw_osd(void) static void draw_osd(void)
{ {
if( mp_msg_test(MSGT_VO,MSGL_DBG4) )
mp_msg(MSGT_VO,MSGL_DBG4, "vo_svga: draw_osd()\n"); mp_msg(MSGT_VO,MSGL_DBG4, "vo_svga: draw_osd()\n");
//only modes with bytesperpixel>0 can draw OSD //only modes with bytesperpixel>0 can draw OSD
if(modeinfo->bytesperpixel==0) return; if(modeinfo->bytesperpixel==0) return;
@ -616,10 +603,9 @@ static void flip_page(void) {
PageStore[old_page].locks=PAGE_EMPTY; PageStore[old_page].locks=PAGE_EMPTY;
PageStore[cpage].locks=PAGE_BUSY; 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); mp_msg(MSGT_VO,MSGL_DBG3, "vo_svga: viewing page %d\n",cpage);
if(sync_flip && old_page!=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_waitretrace();
} }
vga_setdisplaystart(PageStore[cpage].doffset); vga_setdisplaystart(PageStore[cpage].doffset);
@ -640,11 +626,10 @@ static void uninit(void) {
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */
static int query_format(uint32_t format) { static int query_format(uint32_t format) {
int32_t req_bpp,flags; int32_t req_bpp,flags;
int i,lastmode; int i,lastmode;
vga_modeinfo * vminfo; vga_modeinfo * vminfo;
if ( mp_msg_test(MSGT_VO,MSGL_DBG4) )
mp_msg(MSGT_VO,MSGL_DBG4, "vo_svga: query_format=%X \n",format); mp_msg(MSGT_VO,MSGL_DBG4, "vo_svga: query_format=%X \n",format);
//only RGB modes supported //only RGB modes supported
if( (!IMGFMT_IS_RGB(format)) && (!IMGFMT_IS_BGR(format)) ) return 0; 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) { unsigned char *srca, int stride) {
char* base; 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", 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); x0,y0,w,h,src,srca,stride);
if(!blackbar_osd) { 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; 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); 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; base=PageStore[cpage].vbase + y0*mode_stride + x0*modeinfo->bytesperpixel;
switch (mode_bpp) { 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){ static uint32_t get_image(mp_image_t *mpi){
int page; int page;
if(!IMGFMT_IS_BGR(mpi->imgfmt) && !IMGFMT_IS_RGB(mpi->imgfmt) ){ if(!IMGFMT_IS_BGR(mpi->imgfmt) && !IMGFMT_IS_RGB(mpi->imgfmt) ){
assert(0);//should never happen assert(0);//should never happen
@ -739,7 +722,6 @@ int page;
mpi->planes[0] = PageStore[page].vbase + mpi->planes[0] = PageStore[page].vbase +
y_pos*mode_stride + (x_pos*mpi->bpp)/8; y_pos*mode_stride + (x_pos*mpi->bpp)/8;
mpi->priv=(void *)page; 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); mp_msg(MSGT_VO,MSGL_DBG3, "vo_svga: direct render allocated! page=%d\n",page);
return VO_TRUE; return VO_TRUE;
} }

View File

@ -42,6 +42,7 @@
#include "x11_common.h" #include "x11_common.h"
#include "aspect.h" #include "aspect.h"
#include "sub.h" #include "sub.h"
#include "subopt-helper.h"
#include "libavcodec/vdpau.h" #include "libavcodec/vdpau.h"
@ -111,6 +112,8 @@ static VdpOutputSurfaceDestroy *vdp_output_surface_destroy;
static VdpVideoMixerCreate *vdp_video_mixer_create; static VdpVideoMixerCreate *vdp_video_mixer_create;
static VdpVideoMixerDestroy *vdp_video_mixer_destroy; static VdpVideoMixerDestroy *vdp_video_mixer_destroy;
static VdpVideoMixerRender *vdp_video_mixer_render; 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 VdpPresentationQueueTargetDestroy *vdp_presentation_queue_target_destroy;
static VdpPresentationQueueCreate *vdp_presentation_queue_create; 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 int output_surface_width, output_surface_height;
static VdpVideoMixer video_mixer; static VdpVideoMixer video_mixer;
static int deint;
static int pullup;
static float denoise;
static float sharpen;
static VdpDecoder decoder; static VdpDecoder decoder;
static int decoder_max_refs; static int decoder_max_refs;
@ -171,6 +178,9 @@ static void video_to_output_surface(void)
&dummy); &dummy);
CHECK_ST_WARNING("Error when calling vdp_presentation_queue_block_until_surface_idle") 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_st = vdp_video_mixer_render(video_mixer, VDP_INVALID_HANDLE, 0,
VDP_VIDEO_MIXER_PICTURE_STRUCTURE_FRAME, VDP_VIDEO_MIXER_PICTURE_STRUCTURE_FRAME,
0, NULL, surface_render[vid_surface_num].surface, 0, NULL, &src_rect_vid, 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_CREATE, &vdp_video_mixer_create},
{VDP_FUNC_ID_VIDEO_MIXER_DESTROY, &vdp_video_mixer_destroy}, {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_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_FUNC_ID_PRESENTATION_QUEUE_TARGET_DESTROY,
&vdp_presentation_queue_target_destroy}, &vdp_presentation_queue_target_destroy},
{VDP_FUNC_ID_PRESENTATION_QUEUE_CREATE, &vdp_presentation_queue_create}, {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) { static int create_vdp_mixer(VdpChromaType vdp_chroma_type) {
#define VDP_NUM_MIXER_PARAMETER 3 #define VDP_NUM_MIXER_PARAMETER 3
#define MAX_NUM_FEATURES 5
int i;
VdpStatus vdp_st; 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] = { static const VdpVideoMixerParameter parameters[VDP_NUM_MIXER_PARAMETER] = {
VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_WIDTH, VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_WIDTH,
VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_HEIGHT, VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_HEIGHT,
@ -321,13 +344,31 @@ static int create_vdp_mixer(VdpChromaType vdp_chroma_type) {
&vid_height, &vid_height,
&vdp_chroma_type &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, VDP_NUM_MIXER_PARAMETER,
parameters, parameter_values, parameters, parameter_values,
&video_mixer); &video_mixer);
CHECK_ST_ERROR("Error when calling vdp_video_mixer_create") 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; return 0;
} }
@ -711,15 +752,43 @@ static void uninit(void)
dlclose(vdpau_lib_handle); 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) static int preinit(const char *arg)
{ {
int i; int i;
static const char *vdpaulibrary = "libvdpau.so.1"; static const char *vdpaulibrary = "libvdpau.so.1";
static const char *vdpau_device_create = "vdp_device_create_x11"; static const char *vdpau_device_create = "vdp_device_create_x11";
if (arg) { deint = 0;
mp_msg(MSGT_VO, MSGL_ERR, "[vdpau] Unknown subdevice: %s\n", arg); pullup = 0;
return ENOSYS; 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); vdpau_lib_handle = dlopen(vdpaulibrary, RTLD_LAZY);

View File

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