mirror of https://github.com/mpv-player/mpv
Merge svn changes up to r28690
This commit is contained in:
commit
ebb541c655
|
@ -11168,7 +11168,7 @@ explains how to create useful bug reports.
|
|||
MPlayer was initially written by Arpad Gereoffy.
|
||||
See the AUTHORS file for a list of some of the many other contributors.
|
||||
.PP
|
||||
MPlayer is (C) 2000\-2008 The MPlayer Team
|
||||
MPlayer is (C) 2000\-2009 The MPlayer Team
|
||||
.PP
|
||||
This man page was written mainly by Gabucino, Jonas Jermann and Diego Biurrun.
|
||||
It is maintained by Diego Biurrun.
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
.\" Synced with r28576
|
||||
.\" Synced with r28670
|
||||
.\" MPlayer (C) 2000-2009 MPlayer Team
|
||||
.\" Ezt a man oldalt Gabucino, Diego Biurrun és Jonas Jermann készíti/készítette
|
||||
.\" Karbantartó: Gabrov
|
||||
|
@ -33,7 +33,7 @@
|
|||
.\" Név
|
||||
.\" --------------------------------------------------------------------------
|
||||
.
|
||||
.TH MPlayer 1 "2009. 02. 16." "MPlayer Project" "A film lejátszó"
|
||||
.TH MPlayer 1 "2009. 02. 19." "MPlayer Project" "A film lejátszó"
|
||||
.
|
||||
.SH NÉV
|
||||
mplayer \- film lejátszó
|
||||
|
@ -1913,10 +1913,10 @@ L
|
|||
Beállítja a tunert az <érték> csatornára.
|
||||
.IPs chanlist=<érték>
|
||||
elérhető: europe-east, europe-west, us-bcast, us-cable, stb.
|
||||
.IPs channels=<csatorna>\-<név>[=<norma>],<csatorna>\-<név>[=<norma>],...
|
||||
.IPs channels=<csat>\-<név>[=<norma>],<csat>\-<név>[=<norma>],...
|
||||
Csatornák neveinek beállítása.
|
||||
.I MEGJEGYZÉS:
|
||||
Ha a <csatorna> 1000-nél nagyobb egész, frekvenciaként lesz értelmezve (kHz-ben)
|
||||
Ha a <csat> 1000-nél nagyobb egész, frekvenciaként lesz értelmezve (kHz-ben)
|
||||
a frekvenciatáblázatban szereplő csatornanév helyett.
|
||||
.br
|
||||
Használj _ jelet a szóköz helyett a nevekben (vagy játsz az idézőjelezéssel ;-).
|
||||
|
@ -3436,6 +3436,11 @@ Vez
|
|||
.PD 1
|
||||
.
|
||||
.TP
|
||||
.B vdpau (\-vc ffmpeg12vdpau, ffwmv3vdpau, ffvc1vdpau vagy ffh264vdpau kapcsolókkal)
|
||||
Videó kimenet, ami a VDPAU-t használja a videó hardveres dekódolásához.
|
||||
Támogatja a szoftveresen dekódolt videó megjelenítését is.
|
||||
.
|
||||
.TP
|
||||
.B xvmc (csak X11 \-vc ffmpeg12mc kapcsolóval)
|
||||
Videó kimeneti vezérlő ami az XFree86 4.x XvMC (X Video Motion Compensation)
|
||||
kiterjesztését használja az MPEG-1/2 és VCR2 dekódolás gyorsításához.
|
||||
|
@ -11194,7 +11199,7 @@ le
|
|||
Az MPlayert eredetileg Gereöffy Árpád írta.
|
||||
Lásd az AUTHORS fájlt a többi közreműködő listájához.
|
||||
.PP
|
||||
MPlayer (C) 2000\-2008 Az MPlayer Csapat
|
||||
MPlayer (C) 2000\-2009 Az MPlayer Csapat
|
||||
.PP
|
||||
Ezt a man oldalt nagyrészt Gabucino, Jonas Jermann és Diego Biurrun írta.
|
||||
A karbantartó Diego Biurrun.
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
.\" This man page was/is done by Gabucino, Diego Biurrun, Jonas Jermann
|
||||
.\" Translated by Vladimir Voroshilov <voroshil@gmail.com>
|
||||
.\" Encoding: koi8-r
|
||||
.\" synced with r28645
|
||||
.\" synced with r28670
|
||||
.
|
||||
.\" --------------------------------------------------------------------------
|
||||
.\" Определения макросов
|
||||
|
@ -11485,7 +11485,7 @@ rar p test\-SVCD.rar | mencoder \-ovc lavc \-lavcopts vcodec=mpeg4:vbitrate=800
|
|||
MPlayer изначально был написан Arpad Gereoffy.
|
||||
Смотрите файл AUTHORS, чтобы получить список некоторых из множества других разработчиков.
|
||||
.PP
|
||||
MPlayer is (C) 2000\-2008 The MPlayer Team
|
||||
MPlayer is (C) 2000\-2009 The MPlayer Team
|
||||
.PP
|
||||
Оригинальная английская версия этого руководства в основном была написана Gabucino,
|
||||
Jonas Jermann и Diego Biurrun. Сейчас она поддерживается Diego Biurrun.
|
||||
|
|
|
@ -220,7 +220,7 @@ libao2 drivers:
|
|||
* ao_oss.c - None
|
||||
* ao_pcm.c - None
|
||||
* ao_plugin.c - None
|
||||
* ao_pulse.c - Reimar Döffinger
|
||||
* ao_pulse.c - None
|
||||
* ao_sdl.c - None
|
||||
* ao_sgi.c - None
|
||||
* ao_sun.c - None
|
||||
|
|
|
@ -6,6 +6,14 @@ Note: before start on this, read colorspaces.txt !
|
|||
The constants for different pixelformats are defined in img_format.h,
|
||||
their usage is mandatory.
|
||||
|
||||
WARNING: Please keep in mind that some of this information may be out-dated,
|
||||
so if you are working on a new vo, consider submitting preliminary patches
|
||||
very early on. Currently vo_gl is one of the more up-to-date VOs to use
|
||||
as reference if you are unsure about something and do not want to ask on the
|
||||
list.
|
||||
vo_vdpau and vo_direct3d may be a good choice, too, they use different
|
||||
approaches closer to the sometimes convoluted way DirectX works.
|
||||
|
||||
Each vo driver _has_ to implement these:
|
||||
|
||||
preinit():
|
||||
|
@ -15,7 +23,9 @@ Each vo driver _has_ to implement these:
|
|||
Uninit the whole system, this is on the same "level" as preinit.
|
||||
|
||||
control():
|
||||
Current controls:
|
||||
Current controls (VOCTRL_QUERY_FORMAT must be implemented,
|
||||
VOCTRL_DRAW_IMAGE, VOCTRL_FULLSCREEN, VOCTRL_UPDATE_SCREENINFO
|
||||
should be implemented):
|
||||
VOCTRL_QUERY_FORMAT - queries if a given pixelformat is supported.
|
||||
It also returns various flags decsirbing the capabilities
|
||||
of the driver with teh given mode. for the flags, see
|
||||
|
@ -64,7 +74,37 @@ Each vo driver _has_ to implement these:
|
|||
by drivers which use X11, except SDL, as well as directx and
|
||||
gl2 under Windows.
|
||||
VOCTRL_BORDER
|
||||
Makes the player window borderless. Only supported by directx.
|
||||
Makes the player window borderless.
|
||||
VOCTRL_FULLSCREEN
|
||||
Switch from and to fullscreen mode
|
||||
VOCTRL_GET_PANSCAN
|
||||
VOCTRL_SET_PANSCAN
|
||||
Needed to implement pan-scan support ('w' and 'e' keys during
|
||||
playback in fullscreen mode)
|
||||
VOCTRL_START_SLICE
|
||||
Called before the first draw_slice of each frame, useful if
|
||||
you need to do some set-up work.
|
||||
VOCTRL_DRAW_EOSD
|
||||
Required for EOSD (ASS subtitle) support. Provides all
|
||||
information necessary to draw the EOSD for the current video
|
||||
frame.
|
||||
VOCTRL_GET_EOSD_RES
|
||||
Required for EOSD (ASS subtitle) support. Informs the ASS
|
||||
renderer about the properties of the drawing area (size,
|
||||
borders).
|
||||
VOCTRL_SET_DEINTERLACE
|
||||
VOCTRL_GET_DEINTERLACE
|
||||
Get or set deinterlacing status for VOs that support some kind
|
||||
of deinterlacing.
|
||||
VOCTRL_UPDATE_SCREENINFO
|
||||
Should set the xinerama_x, xinerama_y, vo_screenwidth and
|
||||
vo_screenheight appropriately for the currently used
|
||||
monitor and -xineramascreen option.
|
||||
Usually should simply call the w32_update_xinerama_info or
|
||||
update_xinerama_info function.
|
||||
By supporting this, the VO also requests the newer API
|
||||
that sets vo_dx, vo_dy etc. appropriately before config()
|
||||
is called.
|
||||
|
||||
config():
|
||||
Set up the video system. You get the dimensions and flags.
|
||||
|
@ -86,25 +126,22 @@ Each vo driver _has_ to implement these:
|
|||
So, you can check for vo_config_count>0 in uninit() when freeing
|
||||
resources allocated in config() to avoid crash!
|
||||
|
||||
You should call geometry() in config() to enable user defined
|
||||
window size and position. The code should look as following:
|
||||
---
|
||||
set x,y,w,h to the values supplied by the caller or to those you deam
|
||||
useful.
|
||||
call geometry(&x, &y, &w, &h, screenw, screenh)
|
||||
call aspect()
|
||||
---
|
||||
see libvo/geometry.c for further information
|
||||
You should implement VOCTRL_UPDATE_SCREENINFO so that vo_dx, vo_dy,
|
||||
vo_dwidth and vo_dheight are already pre-set to values that take
|
||||
aspect and -geometry into account. It is also necessary to properly
|
||||
support multi-monitor setups (if based on x11_common, w32_common).
|
||||
|
||||
draw_slice(): this displays YV12 pictures (3 planes, one full sized that
|
||||
contains brightness (Y), and 2 quarter-sized which the colour-info
|
||||
(U,V). MPEG codecs (libmpeg2, opendivx) use this. This doesn't have
|
||||
to display the whole frame, only update small parts of it.
|
||||
If this is not supported, it must be signaled in QUERY_FORMAT with
|
||||
VOCAP_NOSLICES.
|
||||
|
||||
draw_frame(): this is the older interface, this displays only complete
|
||||
frames, and can do only packed format (YUY2, RGB/BGR).
|
||||
Win32 codecs use this (DivX, Indeo, etc).
|
||||
If you implement VOCTRL_DRAW_IMAGE, you can left draw_frame.
|
||||
If you implement VOCTRL_DRAW_IMAGE, you do not need to implement draw_frame.
|
||||
|
||||
draw_osd(): this displays subtitles and OSD.
|
||||
It's a bit tricky to use it, since it's a callback-style stuff.
|
||||
|
@ -113,11 +150,25 @@ Each vo driver _has_ to implement these:
|
|||
The vo_draw_text() checks the characters to draw, and calls
|
||||
draw_alpha() for each. As a help, osd.c contains draw_alpha for
|
||||
each pixelformats, use this if possible!
|
||||
Note that if you do not draw directly onto the video you should
|
||||
use vo_draw_text_ext() which allows you to specify the border
|
||||
values etc. needed to draw DVD menu highlights at the correct place.
|
||||
If you do not want to implement this, you can still use -vf
|
||||
expand=osd=1 to draw the OSD, or even implement code to insert
|
||||
this filter automatically.
|
||||
Make sure you set VFCAP_OSD depending on whether you implemented it
|
||||
or not.
|
||||
|
||||
NOTE: This one will be obsolete soon! But it's still useful when
|
||||
you want to do tricks, like rendering osd _after_ hardware scaling
|
||||
(tdfxfb) or render subtitles under of the image (vo_mpegpes, sdl)
|
||||
|
||||
flip_page(): this is called after each frame, this diplays the buffer for
|
||||
real. This is 'swapbuffers' when doublebuffering.
|
||||
NOTE2: above NOTE is probably wrong, there are currently no plans to
|
||||
obsolete draw_osd, though there is the more advanced EOSD support for
|
||||
ASS subtitles.
|
||||
|
||||
flip_page(): this is called after each frame, this displays the buffer for
|
||||
real. This is 'swapbuffers' when doublebuffering.
|
||||
Try to do as little work here as possible, since that affect jitter/
|
||||
A-V sync.
|
||||
|
||||
|
|
|
@ -693,10 +693,10 @@ you have to use <option>-ao alsa:device=dmix</option>.
|
|||
I have no sound when playing a video and get error messages similar to this one:
|
||||
<screen>
|
||||
AO: [oss] 44100Hz 2ch Signed 16-bit (Little-Endian)
|
||||
audio_setup: Can't open audio device /dev/dsp: Device or resource busy
|
||||
couldn't open/init audio device -> NOSOUND
|
||||
Audio: no sound!!!
|
||||
Start playing...
|
||||
[AO OSS] audio_setup: Can't open audio device /dev/dsp: Device or resource busy
|
||||
Could not open/initialize audio device -> no sound.
|
||||
Audio: no sound
|
||||
Starting playback...
|
||||
</screen>
|
||||
</para></question>
|
||||
<answer><para>
|
||||
|
@ -742,7 +742,7 @@ try to play a file which has 22050Hz audio. Try the
|
|||
When I play this movie I get video-audio desync and/or
|
||||
<application>MPlayer</application> crashes with the following message:
|
||||
<screen>
|
||||
DEMUXER: Too many (945 in 8390980 bytes) video packets in the buffer!
|
||||
Too many (945 in 8390980 bytes) video packets in the buffer!
|
||||
</screen>
|
||||
</para></question>
|
||||
<answer><para>
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- synced with r28593 -->
|
||||
<!-- synced with r28615 -->
|
||||
<appendix id="bugreports">
|
||||
<title>Hogyan jelentsd a hibákat</title>
|
||||
|
||||
|
@ -111,6 +111,8 @@ spórolsz, ha vissza kell lépned.
|
|||
(Általában le kell futtatni a 'make distclean'-t egy régi verzió újrafordítása
|
||||
előtt, így ha nem készítesz mentést az eredeti forrás fádról, újra kell fordítanod
|
||||
mindent, ha visszajössz a jelenbe.)
|
||||
Alternatívaként használhatod a <ulink url="http://ccache.samba.org/">ccache</ulink>-t
|
||||
a fordítás felgyorsítására.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- synced with r28531 -->
|
||||
<!-- synced with r28660 -->
|
||||
<chapter id="faq" xreflabel="FAQ">
|
||||
<title>Gyakran ismételt kérdések</title>
|
||||
|
||||
|
@ -692,10 +692,10 @@ használd a <option>-ao alsa:device=dmix</option> kapcsolót.
|
|||
Nincs hang videó lejátszása közben, és egy ehhez hasonló üzenetet kapok:
|
||||
<screen>
|
||||
AO: [oss] 44100Hz 2ch Signed 16-bit (Little-Endian)
|
||||
audio_setup: Can't open audio device /dev/dsp: Device or resource busy
|
||||
couldn't open/init audio device -> NOSOUND
|
||||
Audio: no sound!!!
|
||||
Start playing...
|
||||
[AO OSS] audio_setup: Can't open audio device /dev/dsp: Device or resource busy
|
||||
Could not open/initialize audio device -> no sound.
|
||||
Audio: no sound
|
||||
Starting playback...
|
||||
</screen>
|
||||
</para></question>
|
||||
<answer><para>
|
||||
|
@ -743,7 +743,7 @@ Hibás hang kártyád/vezérlőd van. Legvalószínűbb, hogy rögzítve van 441
|
|||
Amikor filmet játszok le, szétesik a videó-audió szinkron
|
||||
és/vagy az <application>MPlayer</application> összeomlik ezzel az üzenettel:
|
||||
<screen>
|
||||
DEMUXER: Too many (945 in 8390980 bytes) video packets in the buffer!
|
||||
Too many (945 in 8390980 bytes) video packets in the buffer!
|
||||
</screen>
|
||||
</para></question>
|
||||
<answer><para>
|
||||
|
|
|
@ -39,7 +39,7 @@
|
|||
</para>
|
||||
|
||||
<para>
|
||||
Если используется эмуляция SCSI, вам следует применять настройки к реальному IDE
|
||||
Если используется эмуляция SCSI, Вам следует применять настройки к реальному IDE
|
||||
устройству, а не сэмулированному SCSI.
|
||||
</para>
|
||||
|
||||
|
@ -157,14 +157,14 @@
|
|||
Приводы, реализующие региональную защиту исключительно при помощи
|
||||
программного обеспечения, известны как RPC-1 приводы, реализующие ее
|
||||
аппаратно — RPC-2. RPC-2 приводы позволяют пять раз изменить код региона,
|
||||
после чего он фиксируется навсегда. В Linux вы можете воспользоваться
|
||||
после чего он фиксируется навсегда. В Linux Вы можете воспользоваться
|
||||
утилитой <ulink url="http://linvdr.org/projects/regionset/">regionset</ulink>
|
||||
для установки регионального кода вашего DVD привода.
|
||||
для установки регионального кода Вашего DVD привода.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
К счастью, возможна переделка RPC-2 приводов в RPC-1, через
|
||||
обновление прошивки. Укажите модель вашего DVD привода в вашем любимом
|
||||
обновление прошивки. Укажите модель Вашего DVD привода в Вашем любимом
|
||||
поисковике или посмотрите на форуме и разделах загрузок на
|
||||
<ulink url="http://www.rpc1.org/">"Странице прошивок"</ulink>.
|
||||
Хотя обычные предостережения, касающиеся обновления прошивки, остаются в силе,
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- synced with r25566 -->
|
||||
<!-- synced with r28266 -->
|
||||
|
||||
<bookinfo id="toc">
|
||||
<title><application>MPlayer</application> - The Movie Player</title>
|
||||
<title><application>MPlayer</application> - Медиа Проигрыватель</title>
|
||||
<subtitle><ulink url="http://www.mplayerhq.hu"></ulink></subtitle>
|
||||
<date>March 24, 2003</date>
|
||||
<date>24 Марта, 2003</date>
|
||||
<copyright>
|
||||
<year>2000</year>
|
||||
<year>2001</year>
|
||||
|
@ -16,7 +16,7 @@
|
|||
<year>2007</year>
|
||||
<year>2008</year>
|
||||
<year>2009</year>
|
||||
<holder>команда MPlayer[MPlayer team]</holder>
|
||||
<holder>MPlayer team</holder>
|
||||
</copyright>
|
||||
<legalnotice>
|
||||
<title>License</title>
|
||||
|
@ -42,18 +42,16 @@
|
|||
|
||||
<para>
|
||||
Если Вы инсталлируете программу в первый раз, прочитайте все от начала до конца
|
||||
в секции "Установка", и просматривайте ссылки, которые Вы обнаружите.
|
||||
секции "Установка", и просматривайте ссылки, которые Вы обнаружите.
|
||||
Если у Вас все ещё остались
|
||||
вопросы, вернитесь к <link linkend="toc">Оглавлению</link> и поищите там,
|
||||
прочтите <xref linkend="faq"/>, или попытайтесь про'grep'пить файлы.
|
||||
На большую часть вопросов Вы найдёте ответы здесь, а остальные, наверное, уже
|
||||
спрашивались в наших
|
||||
<ulink url="http://www.mplayerhq.hu/design7/mailing_lists.html">рассылках</ulink>.
|
||||
<!-- FIXME: This refers to nonexistent links
|
||||
Проверьте
|
||||
<ulink url="http://lists.mplayerhq.hu/cgi-bin/s-arch.cgi">по архивам</ulink>, в
|
||||
<ulink url="https://lists.mplayerhq.hu/mailman/listinfo">по архивам</ulink>, в
|
||||
которых можно найти много ценной информации.
|
||||
-->
|
||||
</para>
|
||||
</preface>
|
||||
|
||||
|
@ -62,109 +60,106 @@
|
|||
<title>Введение</title>
|
||||
|
||||
<para>
|
||||
<application>MPlayer</application> - это проигрыватель фильмов для LINUX'а
|
||||
(работает на многих других UNIX'ах и <emphasis role="bold">не-x86</emphasis>
|
||||
<application>MPlayer</application> — это проигрыватель фильмов для LINUX'а
|
||||
(работает на многих других UNIX'ах и не-x86
|
||||
CPU, см. <xref linkend="ports"/>). Он проигрывает большинство MPEG, VOB, AVI,
|
||||
OGG/OGM, VIVO, ASF/WMA/WMV, QT/MOV/MP4, FLI, RM, NuppelVideo, yuv4mpeg, FILM,
|
||||
RoQ, PVA, Matroska файлов, опираясь на множество "родных", XAnim'овских, RealPlayer'овских, и
|
||||
Win32 DLL кодеков. Вы также можете смотреть <emphasis role="bold">VideoCD, SVCD,
|
||||
DVD, 3ivx, RealMedia, Sorenson, Theora</emphasis>, и
|
||||
<emphasis role="bold">DivX</emphasis> фильмы. Другой важной особенностью
|
||||
Ogg/OGM, VIVO, ASF/WMA/WMV, QT/MOV/MP4, FLI, RM, NuppelVideo, yuv4mpeg, FILM,
|
||||
RoQ, PVA, Matroska файлов, опираясь на множество "родных", XAnim'овских,
|
||||
RealPlayer'овских и Win32 DLL кодеков. Вы также можете смотреть VideoCD, SVCD,
|
||||
DVD, 3ivx, RealMedia, Sorenson, Theora, и MPEG-4 (DivX) фильмы.
|
||||
Другой важной особенностью
|
||||
<application>MPlayer</application>'а является широкий спектр поддерживаемых
|
||||
устройств вывода. Он работает с X11, Xv, DGA, OpenGL, SVGAlib,
|
||||
fbdev, AAlib, libcaca, DirectFB, и кроме того Вы можете
|
||||
использовать GGI and SDL (и таким образом все их драйверы) и также несколько
|
||||
низкоуровневых драйверов для конкретных карт (для Matrox, 3Dfx and Radeon,
|
||||
низкоуровневых драйверов для конкретных карт (для Matrox, 3Dfx и Radeon,
|
||||
Mach64, Permedia3)! Большинство из них поддерживают программное или аппаратное
|
||||
масштабирование, поэтому Вы можете насладиться просмотром фильма на полном
|
||||
экране.<application>MPlayer</application> поддерживает некоторые аппаратные
|
||||
MPEG декодеры, такие как <link linkend="dvb">DVB</link> и
|
||||
<link linkend="dxr3">DXR3/Hollywood+</link>. А как насчёт славных больших
|
||||
сглаженных затенённых субтитров (<emphasis role="bold">14 поддерживаемых
|
||||
типов</emphasis>) с Европейскими/ISO 8859-1,2 (венгерский, английский, чешский,
|
||||
и т. п.), кириллическими, корейскими шрифтами, и вывода информации на экран
|
||||
сглаженных затенённых субтитров (14 поддерживаемых
|
||||
типов) с Европейскими/ISO 8859-1,2 (венгерский, английский, чешский,
|
||||
и т.п.), кириллическими, корейскими шрифтами и вывода информации на экран
|
||||
[On Screen Display (OSD)]?
|
||||
</para>
|
||||
|
||||
<para>
|
||||
Плеер без проблем проигрывает повреждённые MPEG файлы (полезно для некоторых VCD),
|
||||
плохие AVI файлы, которые не проигрываются известным
|
||||
windows media player. Даже AVI файлы без индекса являются проигрываемыми.
|
||||
Вы можете временно сделать индекс с помощью ключа <option>-idx</option>, или
|
||||
<application>Windows Media Player</application>.
|
||||
Даже AVI файлы без индекса являются проигрываемыми.
|
||||
Вы можете временно сделать индекс с помощью ключа <option>-idx</option> или
|
||||
перманентно с помощью <application>MEncoder</application>'а,
|
||||
таким образом получив возможность перемещаться
|
||||
по фильму! Как видите стабильность и качество - наиболее важные вещи,
|
||||
но скорость также изумительна. Кроме того у него мощная
|
||||
система плагинов для манипуляции видео.
|
||||
по фильму! Как видите стабильность и качество — наиболее важные вещи,
|
||||
но скорость также изумительна. Кроме того имеется мощная
|
||||
система фильтров для манипуляции с видео и аудио.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
<application>MEncoder</application> (Кодировщик фильмов <application>MPlayer
|
||||
</application>'a [<application>MPlayer</application>'s Movie Encoder]) - это простой
|
||||
</application>'a) — это простой
|
||||
кодировщик фильмов предназначенный для кодирования фильмов, проигрываемых MPlayer'ом
|
||||
(<emphasis role="bold">AVI/ASF/OGG/DVD/VCD/VOB/MPG/MOV/VIV/FLI/RM/NUV/NET/PVA</emphasis>) в другие
|
||||
AVI/ASF/OGG/DVD/VCD/VOB/MPG/MOV/VIV/FLI/RM/NUV/NET/PVA в другие
|
||||
проигрываемые <application>MPlayer</application>'ом форматы (см. ниже).
|
||||
Он может кодировать такими разными кодеками, как
|
||||
<emphasis role="bold">MPEG-4 (DivX4)</emphasis> (1 или 2 прохода),
|
||||
MPEG-4 (DivX4) (1 или 2 прохода),
|
||||
<systemitem class="library">libavcodec</systemitem>,
|
||||
<emphasis role="bold">PCM/MP3/VBR MP3</emphasis> звук.
|
||||
PCM/MP3/VBR MP3 звук.
|
||||
</para>
|
||||
|
||||
<itemizedlist>
|
||||
<title>Возможности <application>MEncoder</application>'а</title>
|
||||
<listitem><para>
|
||||
кодирование из широкого спектра форматов файлов и декодеров
|
||||
Кодирование из широкого спектра форматов файлов и декодеров
|
||||
<application>MPlayer'а</application>
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
кодирование во все кодеки FFmpeg'овской библиотеки
|
||||
Кодирование во все кодеки FFmpeg'овской библиотеки
|
||||
<systemitem class="library">libavcodec</systemitem>
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
кодирование видео с <emphasis role="bold">V4L совместимых TV тюнеров
|
||||
</emphasis>
|
||||
Кодирование видео с V4L совместимых TV тюнеров
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
кодирование/мультиплексирование в "слоёные"[interleaved] AVI файлы
|
||||
Кодирование/мультиплексирование в "слоёные"[interleaved] AVI файлы
|
||||
с соответствующим индексом
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
создание файлов с аудио потоком из внешнего файла
|
||||
Создание файлов с аудио потоком из внешнего файла
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
кодирование в 1, 2 или 3 прохода
|
||||
Кодирование в 1, 2 или 3 прохода
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
<emphasis role="bold">VBR</emphasis> MP3 аудио
|
||||
<important><para>
|
||||
VBR MP3 аудио не всегда хорошо проигрывается плеерами Windows!
|
||||
</para></important>
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
PCM аудио
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
копирование потоков
|
||||
Копирование потоков
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
входная A/V синхронизация (основана на PTS, может быть отключена с помощью
|
||||
Входная A/V синхронизация (основана на PTS, может быть отключена с помощью
|
||||
ключа <option>-mc 0</option> )
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
коррекция FPS[кадров/сек] ключом <option>-ofps</option> (полезно при кодировании
|
||||
29.97fps VOB в 24fps AVI)
|
||||
Коррекция FPS[кадров/сек] ключом <option>-ofps</option> (полезно при кодировании
|
||||
30000/1001 fps VOB в 24000/1001 fps AVI)
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
использование нашей очень мощной системы плагинов (обрезание[crop],
|
||||
Использование нашей очень мощной системы плагинов (обрезание[crop],
|
||||
расширение[expand], отражение[flip], пост-обработка[postprocess],
|
||||
поворот[rotate], масштабирование[scale], rgb/yuv преобразования)
|
||||
поворот[rotate], масштабирование[scale], RGB/YUV преобразования)
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
может кодировать DVD/VOBsub <emphasis role="bold">И</emphasis> текстовые субтитры
|
||||
Может кодировать DVD/VOBsub и текстовые субтитры
|
||||
в один выходной файл
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
может извлекать DVD субтитры в VOBsub формат
|
||||
Может извлекать DVD субтитры в VOBsub формат
|
||||
</para></listitem>
|
||||
|
||||
</itemizedlist>
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- synced with r24035 -->
|
||||
<!-- synced with r28660 -->
|
||||
<chapter id="faq" xreflabel="FAQ">
|
||||
<title>Часто Задаваемые вопросы</title>
|
||||
|
||||
|
@ -13,7 +13,7 @@
|
|||
Как создать правильный патч для <application>MPlayer</application>?
|
||||
</para></question>
|
||||
<answer><para>
|
||||
Мы создали <ulink url="../../tech/patches.txt">краткий документ</ulink>
|
||||
Мы создали <ulink url="../../tech/patches.txt">краткий документ</ulink> (англ.),
|
||||
описывающий все необходимые детали. Пожалуйста, следуйте инструкциям.
|
||||
</para></answer>
|
||||
</qandaentry>
|
||||
|
@ -24,7 +24,7 @@
|
|||
</para></question>
|
||||
<answer><para>
|
||||
Прочитайте <ulink url="../../tech/translations.txt">HOWTO по переводу</ulink> (англ.),
|
||||
там все описано. За дополнительной помощью вы можете обратиться в рассылку
|
||||
там все описано. За дополнительной помощью Вы можете обратиться в рассылку
|
||||
<ulink url="http://lists.mplayerhq.hu/mailman/listinfo/mplayer-translations">MPlayer-translations</ulink>.
|
||||
</para></answer>
|
||||
</qandaentry>
|
||||
|
@ -48,16 +48,16 @@
|
|||
<answer><para>
|
||||
Мы всегда рады приветствовать людей, занимающихся написанием кода и документации.
|
||||
Для начала прочтите <ulink url="../../tech/">техническую документацию</ulink> (англ.).
|
||||
Затем вам следует подписаться на список рассылки
|
||||
Затем Вам следует подписаться на список рассылки
|
||||
<ulink url="http://lists.mplayerhq.hu/mailman/listinfo/mplayer-dev-eng">MPlayer-dev-eng</ulink>
|
||||
и начать написание кода. Если вы хотите помочь с документацией, то подпишитесь на
|
||||
и начать написание кода. Если Вы хотите помочь с документацией, то подпишитесь на
|
||||
<ulink url="http://lists.mplayerhq.hu/mailman/listinfo/mplayer-docs">MPlayer-docs</ulink>.
|
||||
</para></answer>
|
||||
</qandaentry>
|
||||
|
||||
<qandaentry>
|
||||
<question><para>
|
||||
Почему вы не используете autoconf/automake?
|
||||
Почему Вы не используете autoconf/automake?
|
||||
</para></question>
|
||||
<answer><para>
|
||||
У нас есть модульная, написанная вручную система сборки. Она хорошо справляется
|
||||
|
@ -141,7 +141,7 @@ Configure завершается с указанным сообщением, и
|
|||
библиотеки X11. Я не понимаю, ведь X11 у меня <emphasis>установлен</emphasis>!?
|
||||
</para></question>
|
||||
<answer><para>
|
||||
... но вы не имеете установленных пакетов разработки X11. Либо они установлены
|
||||
... но Вы не имеете установленных пакетов разработки X11. Либо они установлены
|
||||
некорректно. Они называются <filename>XFree86-devel*</filename> в Red Hat,
|
||||
<filename>xlibs-dev</filename> в Debian Woody и
|
||||
<filename>libx11-dev</filename> в Debian Sarge. Также проверьте существуют ли
|
||||
|
@ -152,7 +152,7 @@ Configure завершается с указанным сообщением, и
|
|||
|
||||
<qandaentry>
|
||||
<question><para>
|
||||
Сборка в Mac OS 10.3 приводит к нескольким ошибкам линковки
|
||||
Сборка в Mac OS 10.3 приводит к нескольким ошибкам линковки.
|
||||
</para></question>
|
||||
<answer>
|
||||
<para>
|
||||
|
@ -162,10 +162,10 @@ ld: Undefined symbols:
|
|||
_LLCStyleInfoCheckForOpenTypeTables referenced from QuartzCore expected to be defined in ApplicationServices
|
||||
_LLCStyleInfoGetUserRunFeatures referenced from QuartzCore expected to be defined in ApplicationServices
|
||||
</screen>
|
||||
Эта проблема - результат разработчиков Apple, использующих 10.4 для компиляции их программ и
|
||||
Эта проблема — результат разработчиков Apple, использующих 10.4 для компиляции их программ и
|
||||
распространяющих бинарники пользователям 10.3 через Software Update.
|
||||
Неопределённые символы присутствуют в 10.4, но их нет в 10.3.
|
||||
Одно из решений - откат QuickTime до версии 7.0.1, но есть и лучшее.
|
||||
Одно из решений — откат QuickTime до версии 7.0.1, но есть и лучшее.
|
||||
</para>
|
||||
<para>
|
||||
Загрузите
|
||||
|
@ -180,12 +180,12 @@ _LLCStyleInfoGetUserRunFeatures referenced from QuartzCore expected to be define
|
|||
В config.mak следует добавить
|
||||
<systemitem>-F/path/to/where/you/extracted</systemitem>
|
||||
к переменной <systemitem>OPTFLAGS</systemitem>.
|
||||
При использвании <application>X-Code</application> вы можете просто выбрать эти фреймворки
|
||||
При использовании <application>X-Code</application> Вы можете просто выбрать эти фреймворки
|
||||
вместо системных.
|
||||
</para>
|
||||
<para>
|
||||
Получившийся бинарный <application>MPlayer</application> будет использовать фреймворк,
|
||||
установленный в вашей системе, используя динамические ссылки времени исполнения.
|
||||
установленный в Вашей системе, используя динамические ссылки времени исполнения.
|
||||
(Это можно проверить, запустив <systemitem>otool -l</systemitem>).
|
||||
</para>
|
||||
</answer>
|
||||
|
@ -221,13 +221,15 @@ _LLCStyleInfoGetUserRunFeatures referenced from QuartzCore expected to be define
|
|||
|
||||
<qandaentry>
|
||||
<question><para>
|
||||
у меня проблемы с проигрыванием файлов ... кодеком. Можно ли его использовать?
|
||||
У меня происходит дамп ядра при попытке создать дамп потоков, что
|
||||
не так?
|
||||
</para></question>
|
||||
<answer><para>
|
||||
Проверьте <ulink url="../../codecs-status.html">состояние кодеков</ulink>,
|
||||
если его там нет, то прочтите
|
||||
<ulink url="../../tech/win32-codec-howto">HOWTO по импортированию кодеков</ulink>, и
|
||||
свяжитесь с нами.
|
||||
Не паникуйте. Убедитесь, что знаете где Ваше полотенце.</para>
|
||||
<para>
|
||||
Серьёзно, обратите внимание на смайлик и ищите файлы,
|
||||
оканчивающиеся на
|
||||
<filename>.dump</filename>.
|
||||
</para></answer>
|
||||
</qandaentry>
|
||||
|
||||
|
@ -235,10 +237,10 @@ _LLCStyleInfoGetUserRunFeatures referenced from QuartzCore expected to be define
|
|||
<question><para>
|
||||
В начале воспроизведения появляется следующее сообщение, хотя все
|
||||
вроде бы работает прекрасно:
|
||||
<screen>Linux RTC init: ioctl (rtc_pie_on): Permission denied</screen>
|
||||
<screen>Ошибка инициализации Linux RTC в ioctl (rtc_pie_on): Permission denied</screen>
|
||||
</para></question>
|
||||
<answer><para>
|
||||
Чтобы использовать RTC тайминг, вам необходимо специально настроенное ядро.
|
||||
Чтобы использовать RTC тайминг, Вам необходимо специально настроенное ядро.
|
||||
Подробности ищите в разделе <link linkend="rtc">RTC</link>.
|
||||
</para></answer>
|
||||
</qandaentry>
|
||||
|
@ -285,7 +287,7 @@ A: 2.1 V: 2.2 A-V: -0.167 ct: 0.042 57/57 41% 0% 2.6% 0 4 49% 1.00x
|
|||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><systemitem>ct: 0.042</systemitem></term>
|
||||
<listitem><para>сделано коррекций A-V синхронизации</para></listitem>
|
||||
<listitem><para>итоговая выполненная коррекция A-V синхронизации</para></listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><systemitem>57/57</systemitem></term>
|
||||
|
@ -315,14 +317,14 @@ A: 2.1 V: 2.2 A-V: -0.167 ct: 0.042 57/57 41% 0% 2.6% 0 4 49% 1.00x
|
|||
<varlistentry>
|
||||
<term><systemitem>4</systemitem></term>
|
||||
<listitem><para>
|
||||
текущий уровень постпроцессинга (при использовании
|
||||
текущий уровень постобработки (при использовании
|
||||
<option>-autoq</option>)
|
||||
</para></listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><systemitem>49%</systemitem></term>
|
||||
<listitem><para>
|
||||
текущий уровень использования кеша. (нормальное значение - около 50%)
|
||||
текущий уровень использования кеша. (нормальное значение — около 50%)
|
||||
</para></listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
|
@ -335,8 +337,8 @@ A: 2.1 V: 2.2 A-V: -0.167 ct: 0.042 57/57 41% 0% 2.6% 0 4 49% 1.00x
|
|||
Большинство из них используются для отладки, используйте опцию <option>-quiet</option>
|
||||
чтобы их скрыть. Имейте ввиду, что для некоторых файлов использование CPU модулем video_out
|
||||
равно нулю (0%). Дело в том, что иногда он вызывается непосредственно из кодека и не может
|
||||
быть измерен отдельно. Если вы хотите узнать скорость video_out в этом случае сравните
|
||||
разницу при воспроизведении с <option>-vo null</option> и вашим драйвером вывода видео.
|
||||
быть измерен отдельно. Если Вы хотите узнать скорость video_out в этом случае, сравните
|
||||
разницу при воспроизведении с <option>-vo null</option> и Вашим драйвером вывода видео.
|
||||
</para></answer>
|
||||
</qandaentry>
|
||||
|
||||
|
@ -357,7 +359,7 @@ A: 2.1 V: 2.2 A-V: -0.167 ct: 0.042 57/57 41% 0% 2.6% 0 4 49% 1.00x
|
|||
для определенного файла, например <filename>movie.avi</filename>?
|
||||
</para></question>
|
||||
<answer><para>
|
||||
Создайте файл с именем <filename>movie.avi.conf</filename> и вашими опциями в нем,
|
||||
Создайте файл с именем <filename>movie.avi.conf</filename> и Вашими опциями в нем,
|
||||
сохраните его в каталог <filename class="directory">~/.mplayer</filename>
|
||||
или в один каталог с медиа-файлом.
|
||||
</para></answer>
|
||||
|
@ -378,28 +380,7 @@ A: 2.1 V: 2.2 A-V: -0.167 ct: 0.042 57/57 41% 0% 2.6% 0 4 49% 1.00x
|
|||
|
||||
<qandaentry>
|
||||
<question><para>
|
||||
Я не могу получить доступ к GUI меню. Я делаю щелчок правой кнопкой мыши, но пункты меню
|
||||
отсутствуют.
|
||||
</para></question>
|
||||
<answer><para>
|
||||
Используете FVWM? Попробуйте следующее:
|
||||
<orderedlist>
|
||||
<listitem><para>
|
||||
<menuchoice><guimenu>Start</guimenu><guisubmenu>Settings</guisubmenu>
|
||||
<guisubmenu>Configuration</guisubmenu>
|
||||
<guimenuitem>Base Configuration</guimenuitem></menuchoice>
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
Установите <systemitem>Use Applications position hints</systemitem>
|
||||
в <systemitem>Yes</systemitem>
|
||||
</para></listitem>
|
||||
</orderedlist>
|
||||
</para></answer>
|
||||
</qandaentry>
|
||||
|
||||
<qandaentry>
|
||||
<question><para>
|
||||
Как запустить <application>MPlayer</application> в фоновой режиме?
|
||||
Как запустить <application>MPlayer</application> в фоновом режиме?
|
||||
</para></question>
|
||||
<answer><para>
|
||||
Используйте:
|
||||
|
@ -430,7 +411,7 @@ mplayer <replaceable>опции</replaceable> <replaceable>имя_файла</re
|
|||
в новых версиях программы внесены несовместимые изменения.
|
||||
При использовании неэкспертами, это верный путь к, на первый взгляд, случайным и
|
||||
неподдающимся локализации крахам и проблемам воспроизведения.
|
||||
Если этот файл присутствует где-либо в вашей системе, удалите его.
|
||||
Если этот файл присутствует где-либо в Вашей системе, удалите его.
|
||||
</para></answer>
|
||||
</qandaentry>
|
||||
|
||||
|
@ -479,7 +460,7 @@ mplayer -vo null -ao null -frames 0 -v <replaceable>имя_файла</replaceab
|
|||
Я загрузил фильм из P2P сети, но он не работает!
|
||||
</para></question>
|
||||
<answer><para>
|
||||
У вас испорченный или поддельный файл. Если вы получили его от друзей, которые
|
||||
У Вас испорченный или поддельный файл. Если Вы получили его от друзей, которые
|
||||
утверждают, что он работает, проверьте контрольную сумму <application>md5sum</application>.
|
||||
</para></answer>
|
||||
</qandaentry>
|
||||
|
@ -493,7 +474,7 @@ mplayer -vo null -ao null -frames 0 -v <replaceable>имя_файла</replaceab
|
|||
<link linkend="fonts-osd">Шрифты и OSD</link> раздела, посвященного установке.
|
||||
Если используете TrueType шрифты, проверьте, что установлена
|
||||
библиотека <systemitem class="library">FreeType</systemitem>.
|
||||
Стоит также проверить ваши субтитры при помощи текстового редактора или
|
||||
Стоит также проверить Ваши субтитры при помощи текстового редактора или
|
||||
стороннего проигрывателя. Попробуйте преобразовать их в другой формат.
|
||||
</para></answer>
|
||||
</qandaentry>
|
||||
|
@ -514,11 +495,11 @@ Windows DLLs (таким как <application>MPlayer</application>).
|
|||
Когда <application>MPlayer</application> пытается загрузить Windows DLL, он хочет
|
||||
поместить ее по определенному адресу (0x400000). Если там уже находится важная
|
||||
системная библиотека, <application>MPlayer</application> рухнет.
|
||||
(Типичные симптомы - segmentation fault при попытке воспроизвести файлы
|
||||
(Типичные симптомы — segmentation fault при попытке воспроизвести файлы
|
||||
Windows Media 9.)
|
||||
</para>
|
||||
<para>
|
||||
Если столкнулись с этой проблемой, то у вас есть два варианта:
|
||||
Если столкнулись с этой проблемой, то у Вас есть два варианта:
|
||||
<itemizedlist>
|
||||
<listitem><para>
|
||||
Подождать пару недель. Все может снова заработать.
|
||||
|
@ -554,7 +535,7 @@ Windows Media 9.)
|
|||
<qandaentry>
|
||||
<question><para>
|
||||
<application>MPlayer</application> умирает с сообщением:
|
||||
<screen>MPlayer interrupted by signal 4 in module: decode_video</screen>
|
||||
<screen>MPlayer прерван сигналом 4 в модуле: decode_video</screen>
|
||||
</para></question>
|
||||
<answer><para>
|
||||
Не используйте <application>MPlayer</application> на процессоре, отличном от того,
|
||||
|
@ -565,11 +546,11 @@ Windows Media 9.)
|
|||
|
||||
<qandaentry>
|
||||
<question><para>
|
||||
При попытке захвата с тюнера, все работает, но цвета - неправильные. С другими приложениями
|
||||
При попытке захвата с тюнера, все работает, но цвета — неправильные. С другими приложениями
|
||||
все в порядке.
|
||||
</para></question>
|
||||
<answer><para>
|
||||
Ваша карта сообщает о некотором пространстве цветов как поддерживаемом, хотя на самом
|
||||
Ваша карта, вероятно, сообщает о некотором пространстве цветов как поддерживаемом, хотя на самом
|
||||
деле его не поддерживает. Попробуйте с YUY2 вместо YV12 по умолчанию (смотрите
|
||||
секцию <link linkend="tv-input">TV</link>).
|
||||
</para></answer>
|
||||
|
@ -597,7 +578,7 @@ Windows Media 9.)
|
|||
<answer><para>
|
||||
Это тоже эффект системы управления энергопотреблением (смотрите выше).
|
||||
Подсоедините разъем внешнего питания <emphasis role="bold">до</emphasis>
|
||||
включения ноутбука лиюо используйте опцию <option>-nortc</option>.
|
||||
включения ноутбука либо используйте опцию <option>-nortc</option>.
|
||||
</para></answer>
|
||||
</qandaentry>
|
||||
|
||||
|
@ -605,11 +586,11 @@ Windows Media 9.)
|
|||
<question><para>
|
||||
При воспроизведении фильма изображение вдруг начинает дергаться и появляется
|
||||
следующее сообщение:
|
||||
<screen>Badly interleaved AVI file detected - switching to -ni mode...</screen>
|
||||
<screen>Обнаружен плохо 'слоёный' AVI файл - переключаюсь в -ni режим...</screen>
|
||||
</para></question>
|
||||
<answer><para>
|
||||
Файлы с некорректным чередованием и опция
|
||||
<option>-cache</option> вместе работают не очень хорошо..
|
||||
<option>-cache</option> вместе работают не очень хорошо.
|
||||
Попробуйте <option>-nocache</option>.
|
||||
</para></answer>
|
||||
</qandaentry>
|
||||
|
@ -618,7 +599,7 @@ Windows Media 9.)
|
|||
<!-- ********** -->
|
||||
|
||||
<qandadiv id="faq-driver">
|
||||
<title>Проблемы драйверов вывода аудио/видео (ao/vo)</title>
|
||||
<title>Проблемы драйверов вывода видео/аудио (vo/ao)</title>
|
||||
|
||||
<qandaentry>
|
||||
<question><para>
|
||||
|
@ -627,9 +608,9 @@ Windows Media 9.)
|
|||
</para></question>
|
||||
<answer><para>
|
||||
Ваш драйвер вывода видео аппаратно не поддерживает масштабирование, и, поскольку
|
||||
поблочное программное масштабирование может быть ужасно медленным,
|
||||
программное масштабирование может быть ужасно медленным,
|
||||
<application>MPlayer</application> не задействует его автоматически.
|
||||
Скорее всего вы используете драйвер вывода <systemitem>x11</systemitem> вместо
|
||||
Скорее всего Вы используете драйвер вывода <systemitem>x11</systemitem> вместо
|
||||
<systemitem>xv</systemitem>.
|
||||
Попробуйте указать <option>-vo xv</option> в командной строке или
|
||||
прочтите <link linkend="video">раздел видео</link>, чтобы узнать о других
|
||||
|
@ -642,7 +623,7 @@ Windows Media 9.)
|
|||
<question><para>
|
||||
Я только что установил <application>MPlayer</application>. Попытка открыть файл
|
||||
приводит к фатальной ошибке:
|
||||
<screen>Error opening/initializing the selected video_out (-vo) device.</screen>
|
||||
<screen>Ошибка при открытии/инициализации выбранного устройства видеовывода (-vo).</screen>
|
||||
Как решить проблему?
|
||||
</para></question>
|
||||
<answer><para>
|
||||
|
@ -663,7 +644,7 @@ vo_driver = <replaceable>выбранный_драйвер</replaceable>
|
|||
|
||||
<qandaentry>
|
||||
<question><para>
|
||||
У меня проблемы с <replaceable>[ваш оконный менеджер]</replaceable> и
|
||||
У меня проблемы с <replaceable>[Ваш оконный менеджер]</replaceable> и
|
||||
полноэкранным режимом xv/xmga/sdl/x11 ...
|
||||
</para></question>
|
||||
<answer><para>
|
||||
|
@ -684,17 +665,6 @@ vo_driver = <replaceable>выбранный_драйвер</replaceable>
|
|||
</para></answer>
|
||||
</qandaentry>
|
||||
|
||||
<qandaentry>
|
||||
<question><para>
|
||||
Мой компьютер проигрывает MS DivX AVI с разрешениями ~ 640x300 и MP3 стереозвуком
|
||||
слишком медленно. Если указать опцию <option>-nosound</option>, все ОК (но без звука).
|
||||
</para></question>
|
||||
<answer><para>
|
||||
Ваша машина слишком медленная либо драйвер звуковой карты неправильно работает.
|
||||
Обратитесь к документации, чтобы узнать можно ли улучшить производительность.
|
||||
</para></answer>
|
||||
</qandaentry>
|
||||
|
||||
<qandaentry>
|
||||
<question><para>
|
||||
Как использовать <application>dmix</application> с
|
||||
|
@ -712,19 +682,21 @@ vo_driver = <replaceable>выбранный_драйвер</replaceable>
|
|||
Нет звука при воспроизведении видео и появляется ошибка подобная этой:
|
||||
<screen>
|
||||
AO: [oss] 44100Hz 2ch Signed 16-bit (Little-Endian)
|
||||
audio_setup: Can't open audio device /dev/dsp: Device or resource busy
|
||||
couldn't open/init audio device -> NOSOUND
|
||||
Audio: no sound!!!
|
||||
Start playing...
|
||||
[AO OSS] инициализация аудио: Не могу открыть аудиоустройство /dev/dsp: Device or resource busy
|
||||
Не могу открыть/инициализировать аудиоустройство -> без звука.
|
||||
Аудио: без звука
|
||||
Начало воспроизведения...
|
||||
</screen>
|
||||
</para></question>
|
||||
<answer><para>
|
||||
Используете KDE или GNOME со звуковыми службами aRts или ESD?
|
||||
Попробуйте отключить службу звука или используйте <option>-ao arts</option> или
|
||||
<option>-ao esd</option> опции, для указания <application>MPlayer</application>
|
||||
использовать aRts или ESD. Также возможно, что вы используете ALSA без
|
||||
эмуляции OSS, попробуйте загрузить ALSA OSS модули ядра или добавьте опцию
|
||||
<option>-ao alsa</option> в командную строку, для использования ALSA напрямую.
|
||||
использовать aRts или ESD.
|
||||
Также возможно, что Вы используете ALSA без эмуляции OSS,
|
||||
попробуйте загрузить ALSA OSS модули ядра или добавьте опцию
|
||||
<option>-ao alsa</option> в командную строку, для использования
|
||||
ALSA напрямую.
|
||||
</para></answer>
|
||||
</qandaentry>
|
||||
|
||||
|
@ -735,12 +707,12 @@ Start playing...
|
|||
</para></question>
|
||||
<answer><para>
|
||||
aRts блокирует звуковое устройство. Либо подождите старта видео, либо
|
||||
отключите службу aRts в центре управления. Если вы хотите использовать звук
|
||||
отключите службу aRts в центре управления. Если Вы хотите использовать звук
|
||||
через aRts, укажите вывод звука через встроенный звуковой драйвер aRts
|
||||
(<option>-ao arts</option>). Если он не работает, либо
|
||||
<application>MPlayer</application> собран без него, попробуйте SDL
|
||||
(<option>-ao sdl</option>) и убедитесь, что SDL может работать со
|
||||
звуком aRts. Ещё один вариант - запуск <application>MPlayer</application>
|
||||
звуком aRts. Ещё один вариант — запуск <application>MPlayer</application>
|
||||
с artsdsp.
|
||||
</para></answer>
|
||||
</qandaentry>
|
||||
|
@ -748,11 +720,11 @@ aRts блокирует звуковое устройство. Либо подо
|
|||
<qandaentry>
|
||||
<question><para>
|
||||
Проблема с синхронизацией A/V. Некоторые из моих AVI файлов проигрываются нормально, но
|
||||
некоторые - с двойной скоростью!
|
||||
некоторые — с двойной скоростью!
|
||||
</para></question>
|
||||
<answer><para>
|
||||
У вас неверно работающая звуковая карта/драйвер. Скорее всего, поддерживается работа
|
||||
только с 44100Hz, а вы пытаетесь проиграть файл с 22050Hz звуком. Попробуйте
|
||||
У Вас неверно работающая звуковая карта/драйвер. Скорее всего, поддерживается работа
|
||||
только с 44100Гц, а Вы пытаетесь проиграть файл с 22050Гц звуком. Попробуйте
|
||||
звуковой фильтр <systemitem>resample</systemitem>.
|
||||
</para></answer>
|
||||
</qandaentry>
|
||||
|
@ -761,7 +733,7 @@ aRts блокирует звуковое устройство. Либо подо
|
|||
<question><para>
|
||||
При проигрывании фильма происходит рассинхронизация звука и видео или
|
||||
<application>MPlayer</application> рушится с ошибкой:
|
||||
<screen>DEMUXER: Too many (945 in 8390980 bytes) video packets in the buffer!</screen>
|
||||
<screen>Слишком много (945 в 8390980 байтах) видеопакетов в буфере!</screen>
|
||||
</para></question>
|
||||
<answer><para>
|
||||
Причин может быть несколько.
|
||||
|
@ -781,11 +753,11 @@ aRts блокирует звуковое устройство. Либо подо
|
|||
<listitem><para>
|
||||
Многие FLV файлы будут правильно воспроизводиться только с <option>-correct-pts</option>.
|
||||
К сожалению, <application>MEncoder</application> такой опции не имеет,
|
||||
но вы можете попробовать вручную указать правильное значение <option>-fps</option>,
|
||||
если оно вам известно.
|
||||
но Вы можете попробовать вручную указать правильное значение <option>-fps</option>,
|
||||
если оно Вам известно.
|
||||
</para></listitem>
|
||||
<listitem><para>
|
||||
У вас неверно работает звуковой драйвер.
|
||||
У Вас неверно работает звуковой драйвер.
|
||||
</para></listitem>
|
||||
</itemizedlist>
|
||||
</para></answer>
|
||||
|
@ -813,28 +785,14 @@ aRts блокирует звуковое устройство. Либо подо
|
|||
<answer><para>
|
||||
<application>MPlayer</application> не поддерживает DVD меню в силу серьезных
|
||||
архитектурных ограничений, которые мешают правильной обработке неподвижных
|
||||
изображений и интерактивного содержимого. Если хотите модные меню, вам
|
||||
изображений и интерактивного содержимого. Если хотите модные меню, Вам
|
||||
придется использовать другой проигрыватель, например <application>xine</application>,
|
||||
<application>vlc</application> или <application>Ogle</application>.
|
||||
Если вы хотите получить DVD навигацию в <application>MPlayer</application>,
|
||||
Если Вы хотите получить DVD навигацию в <application>MPlayer</application>,
|
||||
реализуйте ее самостоятельно, но имейте ввиду, что это нелегкое и ответственное дело.
|
||||
</para></answer>
|
||||
</qandaentry>
|
||||
|
||||
<qandaentry>
|
||||
<question><para>
|
||||
Я не могу посмотреть некоторые новые DVD от Sony Pictures/BMG.
|
||||
</para></question>
|
||||
<answer><para>
|
||||
Это нормально. Вас ободрали и продали намеренно испорченный диск. Единственный способ
|
||||
просмотреть его - избежать воспроизведения плохих блоков, воспользовавшись DVDnav
|
||||
вместо mpdvdkit2. Это можно сделать, собрав <application>MPlayer</application>
|
||||
с поддержкой DVDnav, и заменив после этого dvd:// на dvdnav:// в командной строке.
|
||||
DVDnav пока что настолько несовместим с mpdvdkit, что вам придется указать опцию
|
||||
<option>--disable-mpdvdkit</option> скрипту configure.
|
||||
</para></answer>
|
||||
</qandaentry>
|
||||
|
||||
<qandaentry>
|
||||
<question><para>
|
||||
Как насчет субтитров? <application>MPlayer</application> умеет их отображать?
|
||||
|
@ -869,7 +827,7 @@ DVD не проигрываются, MPlayer зависает или вывод
|
|||
Нужны ли права root (setuid) для воспроизведения DVD?
|
||||
</para></question>
|
||||
<answer><para>
|
||||
Нет. Конечно, вы должны иметь необходимые права на файл DVD устройства
|
||||
Нет. Конечно, Вы должны иметь необходимые права на файл DVD устройства
|
||||
(в <filename class="directory">/dev/</filename>).
|
||||
</para></answer>
|
||||
</qandaentry>
|
||||
|
@ -974,7 +932,7 @@ mplayer dvd://5 -dumpstream -dumpfile <replaceable>dvd_dump.vob</replaceable>
|
|||
</para></question>
|
||||
<answer><para>
|
||||
Попробуйте скрипт <filename>mencvcd.sh</filename> из каталога
|
||||
<filename class="directory">TOOLS</filename>. С его помощью вы можете перекодировать
|
||||
<filename class="directory">TOOLS</filename>. С его помощью Вы можете перекодировать
|
||||
DVD или другие фильмы в VCD или SVCD формат и даже записывать их на CD.
|
||||
</para></answer>
|
||||
</qandaentry>
|
||||
|
@ -1003,7 +961,7 @@ MPEG файлы могут быть объединены в один, если
|
|||
<application>MEncoder</application>'а
|
||||
работать с несколькими файлами сразу:
|
||||
<screen>
|
||||
mencoder -ovc copy -oac copy -o <replaceable>out.avi</replaceable> <replaceable>file1.avi</replaceable> <replaceable>file2.avi</replaceable>
|
||||
mencoder -ovc copy -oac copy -o <replaceable>out.avi</replaceable> <replaceable>файл1.avi</replaceable> <replaceable>файл2.avi</replaceable>
|
||||
</screen>
|
||||
Это будет работать только если файлы имеют одинаковое разрешение и сжаты одинаковым
|
||||
кодеком. Также попробуйте
|
||||
|
@ -1046,7 +1004,7 @@ mencoder <replaceable>input.avi</replaceable> -ovc copy -oac copy -o <replaceabl
|
|||
|
||||
<qandaentry>
|
||||
<question><para>
|
||||
Как сделать копию/закодировать VOB файл с испорченным началом?
|
||||
Как сделать копию и закодировать VOB файл с испорченным началом?
|
||||
</para></question>
|
||||
<answer><para>
|
||||
Основная проблема при попытке кодировать испорченный VOB файл
|
||||
|
@ -1055,7 +1013,8 @@ mencoder <replaceable>input.avi</replaceable> -ovc copy -oac copy -o <replaceabl
|
|||
испорченное содержимое.
|
||||
</para></footnote>
|
||||
состоит в том, что будет трудно закодировать файл с хорошей
|
||||
A/V синхронизацией. Один из способов заключается в отбрасывании испорченных данных
|
||||
A/V синхронизацией.
|
||||
Один из способов заключается в отбрасывании испорченных данных
|
||||
и кодирования только корретной части. Сначала ищите начало корректных данных (меняя
|
||||
параметр "колво_байтов_для_пропуска"):
|
||||
<screen>
|
||||
|
@ -1158,7 +1117,7 @@ Pos: 264.5s 6612f ( 2%) 7.12fps Trem: 576min 2856mb A-V:0.065 [2156:192]
|
|||
Не могу перекодировать ASF файл в AVI/MPEG-4, потому что используется 1000fps.
|
||||
</para></question>
|
||||
<answer><para>
|
||||
Поскольку ASF использует переменную частоту кадров, а AVI - фиксированную,
|
||||
Поскольку ASF использует переменную частоту кадров, а AVI — фиксированную,
|
||||
необходимо её установить вручную опцией <option>-ofps</option>.
|
||||
</para></answer>
|
||||
</qandaentry>
|
||||
|
@ -1185,12 +1144,12 @@ Pos: 264.5s 6612f ( 2%) 7.12fps Trem: 576min 2856mb A-V:0.065 [2156:192]
|
|||
<screen>
|
||||
mkfifo encode
|
||||
mplayer -ao pcm -aofile <replaceable>encode</replaceable> dvd://1 &
|
||||
lame <replaceable>ваши_опции</replaceable> <replaceable>encode</replaceable> <replaceable>music.mp3</replaceable>
|
||||
lame <replaceable>Ваши_опции</replaceable> <replaceable>encode</replaceable> <replaceable>music.mp3</replaceable>
|
||||
rm <replaceable>encode</replaceable>
|
||||
</screen>
|
||||
Это позволяет использовать любой кодер, не только
|
||||
<application>LAME</application>,
|
||||
просто замените <command>lame</command> на ваш предпочитаемый кодер.
|
||||
просто замените <command>lame</command> на Ваш предпочитаемый кодер.
|
||||
</para></answer>
|
||||
</qandaentry>
|
||||
|
||||
|
@ -1202,14 +1161,14 @@ rm <replaceable>encode</replaceable>
|
|||
<answer><para>
|
||||
<systemitem class="library">libavcodec</systemitem>, родная библиотека
|
||||
кодирования MPEG-4, обычно поставляемая с <application>MEncoder</application>,
|
||||
устанавливала FourCC в 'DIVX' при сжатии MPEG-4 видео (FourCC -
|
||||
устанавливала FourCC в 'DIVX' при сжатии MPEG-4 видео (FourCC —
|
||||
это тэг AVI, указывающий нужную программу сжатия и декодирования видео,
|
||||
т.е. кодек). Поэтому многие люди считают, что
|
||||
<systemitem class="library">libavcodec</systemitem> была библиотекой
|
||||
кодирования DivX, когда на самом деле это совершенно другая библиотека
|
||||
кодирования MPEG-4, реализующая стандарт MPEG-4 значительно лучше, чем DivX.
|
||||
Поэтому новый FourCC, по умолчанию используемый
|
||||
<systemitem class="library">libavcodec</systemitem> -это 'FMP4', но вы
|
||||
<systemitem class="library">libavcodec</systemitem> — это 'FMP4', но Вы
|
||||
можете переопределить это поведение, используя опцию
|
||||
<application>MEncoder</application>'а
|
||||
<option>-ffourcc</option>.
|
||||
|
@ -1219,14 +1178,15 @@ mencoder <replaceable>input.avi</replaceable> -o <replaceable>output.avi</replac
|
|||
</screen>
|
||||
Имейте ввиду, что этот пример устанавливает FourCC в XVID, а не DIVX.
|
||||
Это рекомендуется, т.к. DIVX FourCC означает DivX4, очень простой MPEG-4
|
||||
кодек, в то время как DX50 и XVID оба - полные MPEG-4 (ASP).
|
||||
Таким образом, если вы установите FourCC в DIVX, некоторые плохие
|
||||
кодек, в то время как DX50 и XVID оба — полные MPEG-4 (ASP).
|
||||
Таким образом, если Вы установите FourCC в DIVX, некоторые плохие
|
||||
программные или аппаратные проигрыватели могут быть в шоке от дополнительных
|
||||
возможностей, которые
|
||||
<systemitem class="library">libavcodec</systemitem> поддерживает , а DivX - нет;
|
||||
<systemitem class="library">libavcodec</systemitem> поддерживает,
|
||||
а DivX — нет;
|
||||
с другой стороны <systemitem class="library">Xvid</systemitem>
|
||||
по функциональности ближе к <systemitem class="library">libavcodec</systemitem>
|
||||
и подерживается практически любыми приличными проигрывателями.
|
||||
и поддерживается любыми приличными проигрывателями.
|
||||
</para></answer>
|
||||
</qandaentry>
|
||||
|
||||
|
@ -1237,7 +1197,7 @@ mencoder <replaceable>input.avi</replaceable> -o <replaceable>output.avi</replac
|
|||
<answer><para>
|
||||
Используйте <filename>aconvert.sh</filename> из подкаталога
|
||||
<filename class="directory">TOOLS</filename>
|
||||
дерева каталогов MPlayer.
|
||||
дерева исходников MPlayer.
|
||||
</para></answer>
|
||||
</qandaentry>
|
||||
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
#ifndef MPLAYER_CPUDETECT_H
|
||||
#define MPLAYER_CPUDETECT_H
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#define CPUTYPE_I386 3
|
||||
#define CPUTYPE_I486 4
|
||||
#define CPUTYPE_I586 5
|
||||
|
|
|
@ -50,14 +50,19 @@ static const struct {
|
|||
{IMGFMT_YVU9, PIX_FMT_YUV410P},
|
||||
{IMGFMT_IF09, PIX_FMT_YUV410P},
|
||||
{IMGFMT_YV12, PIX_FMT_YUV420P},
|
||||
{IMGFMT_YV12, PIX_FMT_YUVJ420P},
|
||||
{IMGFMT_I420, PIX_FMT_YUV420P},
|
||||
{IMGFMT_IYUV, PIX_FMT_YUV420P},
|
||||
{IMGFMT_411P, PIX_FMT_YUV411P},
|
||||
{IMGFMT_422P, PIX_FMT_YUV422P},
|
||||
{IMGFMT_422P, PIX_FMT_YUVJ422P},
|
||||
{IMGFMT_444P, PIX_FMT_YUV444P},
|
||||
|
||||
// YUVJ are YUV formats that use the full Y range and not just
|
||||
// 16 - 235 (see colorspaces.txt).
|
||||
// Currently they are all treated the same way.
|
||||
{IMGFMT_YV12, PIX_FMT_YUVJ420P},
|
||||
{IMGFMT_422P, PIX_FMT_YUVJ422P},
|
||||
{IMGFMT_444P, PIX_FMT_YUVJ444P},
|
||||
|
||||
{IMGFMT_XVMC_MOCO_MPEG2, PIX_FMT_XVMC_MPEG2_MC},
|
||||
{IMGFMT_XVMC_IDCT_MPEG2, PIX_FMT_XVMC_MPEG2_IDCT},
|
||||
{IMGFMT_VDPAU_MPEG1, PIX_FMT_VDPAU_MPEG1},
|
||||
|
|
|
@ -75,7 +75,7 @@ static char help_text[]=
|
|||
#define MSGTR_TryForceVideoFmtStr "Попытка форсировать семейство видеокодеков %s...\n"
|
||||
#define MSGTR_CantFindVideoCodec "Не могу найти кодек для выбранного -vo и видеоформата 0x%X!\n"
|
||||
#define MSGTR_CannotInitVO "ФАТАЛЬНАЯ ОШИБКА: Не могу инициализировать видеодрайвер!\n"
|
||||
#define MSGTR_CannotInitAO "не могу открыть/инициализировать аудиоустройство -> БЕЗ ЗВУКА\n"
|
||||
#define MSGTR_CannotInitAO "Не могу открыть/инициализировать аудиоустройство -> без звука.\n"
|
||||
#define MSGTR_StartPlaying "Начало воспроизведения...\n"
|
||||
|
||||
#define MSGTR_SystemTooSlow "\n\n"\
|
||||
|
@ -103,7 +103,7 @@ static char help_text[]=
|
|||
#define MSGTR_NoGui "MPlayer был скомпилирован БЕЗ поддержки GUI!\n"
|
||||
#define MSGTR_GuiNeedsX "GUI MPlayer необходим X11!\n"
|
||||
#define MSGTR_Playing "\nВоспроизведение %s.\n"
|
||||
#define MSGTR_NoSound "Аудио: без звука!!!\n"
|
||||
#define MSGTR_NoSound "Аудио: без звука\n"
|
||||
#define MSGTR_FPSforced "Кадры/сек форсированы в %5.3f (время кадра: %5.3f).\n"
|
||||
#define MSGTR_CompiledWithRuntimeDetection "Скомпилировано для определения типа процессора во время выполнения.\n"
|
||||
#define MSGTR_CompiledWithCPUExtensions "Скомпилировано для x86 CPU со следующими расширениями:"
|
||||
|
|
|
@ -52,6 +52,8 @@ static struct pa_threaded_mainloop *mainloop;
|
|||
/** A temporary variable to store the current volume */
|
||||
static pa_cvolume volume;
|
||||
|
||||
static int broken_pause;
|
||||
|
||||
LIBAO_EXTERN(pulse)
|
||||
|
||||
#define GENERIC_ERR_MSG(ctx, str) \
|
||||
|
@ -138,6 +140,7 @@ static int init(int rate_hz, int channels, int format, int flags) {
|
|||
char *devarg = NULL;
|
||||
char *host = NULL;
|
||||
char *sink = NULL;
|
||||
char *version = pa_get_library_version();
|
||||
|
||||
if (ao_subdevice) {
|
||||
devarg = strdup(ao_subdevice);
|
||||
|
@ -146,6 +149,17 @@ static int init(int rate_hz, int channels, int format, int flags) {
|
|||
if (devarg[0]) host = devarg;
|
||||
}
|
||||
|
||||
broken_pause = 0;
|
||||
// not sure which versions are affected, assume 0.9.1*
|
||||
// known bad: 0.9.14, 0.9.13
|
||||
// known good: 0.9.9, 0.9.10
|
||||
// to test: pause, wait ca. 5 seconds framestep and see if MPlayer hangs somewhen
|
||||
if (strncmp(version, "0.9.1", 5) == 0 && strncmp(version, "0.9.10", 6) != 0) {
|
||||
mp_msg(MSGT_AO, MSGL_WARN, "[pulse] working around probably broken pause functionality,\n"
|
||||
" see http://www.pulseaudio.org/ticket/440\n");
|
||||
broken_pause = 1;
|
||||
}
|
||||
|
||||
ss.channels = channels;
|
||||
ss.rate = rate_hz;
|
||||
|
||||
|
@ -288,6 +302,10 @@ static void audio_pause(void) {
|
|||
|
||||
/** Resume the audio stream by uncorking it on the server */
|
||||
static void audio_resume(void) {
|
||||
// without this, certain versions will cause an infinite hang because
|
||||
// pa_stream_writable_size returns 0 always.
|
||||
// Note that this workaround causes A-V desync after pause
|
||||
if (broken_pause) reset();
|
||||
cork(0);
|
||||
}
|
||||
|
||||
|
|
|
@ -584,14 +584,7 @@ static int init(int rate,int channels,int format,int flags){
|
|||
ao_data.bps = byte_per_sec = bytes_per_sample * ao_data.samplerate;
|
||||
ao_data.outburst = byte_per_sec > 100000 ? 16384 : 8192;
|
||||
|
||||
AUDIO_INITINFO(&info);
|
||||
info.play.samples = 0;
|
||||
info.play.eof = 0;
|
||||
info.play.error = 0;
|
||||
ioctl (audio_fd, AUDIO_SETINFO, &info);
|
||||
|
||||
queued_bursts = 0;
|
||||
queued_samples = 0;
|
||||
reset();
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
@ -608,7 +601,15 @@ static void uninit(int immed){
|
|||
|
||||
// stop playing and empty buffers (for seeking/pause)
|
||||
static void reset(void){
|
||||
audio_info_t info;
|
||||
flush_audio(audio_fd);
|
||||
|
||||
AUDIO_INITINFO(&info);
|
||||
info.play.samples = 0;
|
||||
info.play.eof = 0;
|
||||
info.play.error = 0;
|
||||
ioctl(audio_fd, AUDIO_SETINFO, &info);
|
||||
|
||||
queued_bursts = 0;
|
||||
queued_samples = 0;
|
||||
}
|
||||
|
|
|
@ -879,7 +879,7 @@ static mp_image_t *decode(sh_video_t *sh, void *data, int len, int flags){
|
|||
#if CONFIG_XVMC || CONFIG_VDPAU
|
||||
static enum PixelFormat get_format(struct AVCodecContext *avctx,
|
||||
const enum PixelFormat *fmt){
|
||||
enum PixelFormat selected_format = fmt[0];
|
||||
enum PixelFormat selected_format;
|
||||
int imgfmt;
|
||||
sh_video_t *sh = avctx->opaque;
|
||||
int i;
|
||||
|
@ -889,10 +889,10 @@ static enum PixelFormat get_format(struct AVCodecContext *avctx,
|
|||
if(!IMGFMT_IS_XVMC(imgfmt) && !IMGFMT_IS_VDPAU(imgfmt)) continue;
|
||||
mp_msg(MSGT_DECVIDEO, MSGL_INFO, MSGTR_MPCODECS_TryingPixfmt, i);
|
||||
if(init_vo(sh, fmt[i]) >= 0) {
|
||||
selected_format = fmt[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
selected_format = fmt[i];
|
||||
imgfmt = pixfmt2imgfmt(selected_format);
|
||||
if(IMGFMT_IS_XVMC(imgfmt) || IMGFMT_IS_VDPAU(imgfmt)) {
|
||||
vd_ffmpeg_ctx *ctx = sh->context;
|
||||
|
|
|
@ -160,10 +160,6 @@ static int open(vf_instance_t *vf, char* args)
|
|||
vf->priv->hue *= M_PI / 180.0;
|
||||
|
||||
process = process_C;
|
||||
#if HAVE_MMXX
|
||||
if(gCpuCaps.hasMMX) process = process_MMX;
|
||||
#endif
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
|
@ -624,7 +624,15 @@ static int demux_real_fill_buffer(demuxer_t *demuxer, demux_stream_t *dsds)
|
|||
if (len < 12){
|
||||
mp_msg(MSGT_DEMUX, MSGL_V,"%08X: packet v%d len=%d \n",(int)demuxer->filepos,(int)version,(int)len);
|
||||
mp_msg(MSGT_DEMUX, MSGL_WARN,"bad packet len (%d)\n", len);
|
||||
stream_skip(demuxer->stream, len);
|
||||
if ((unsigned)demuxer->video->id < MAX_STREAMS) {
|
||||
if (priv->current_vpacket + 1 < priv->index_table_size[demuxer->video->id]) {
|
||||
stream_seek(demuxer->stream, priv->index_table[demuxer->video->id][++priv->current_vpacket].offset);
|
||||
}
|
||||
} else if ((unsigned)demuxer->audio->id < MAX_STREAMS) {
|
||||
if (priv->current_apacket + 1 < priv->index_table_size[demuxer->audio->id]) {
|
||||
stream_seek(demuxer->stream, priv->index_table[demuxer->audio->id][++priv->current_apacket].offset);
|
||||
}
|
||||
}
|
||||
continue; //goto loop;
|
||||
}
|
||||
|
||||
|
|
|
@ -206,7 +206,7 @@
|
|||
"m" (lumSrc+lumFilterSize), "m" (chrSrc+chrFilterSize)
|
||||
: "%eax", "%ebx", "%ecx", "%edx", "%esi"
|
||||
*/
|
||||
#define YSCALEYUV2PACKEDX \
|
||||
#define YSCALEYUV2PACKEDX_UV \
|
||||
__asm__ volatile(\
|
||||
"xor %%"REG_a", %%"REG_a" \n\t"\
|
||||
ASMALIGN(4)\
|
||||
|
@ -229,8 +229,9 @@
|
|||
"paddw %%mm5, %%mm4 \n\t"\
|
||||
"test %%"REG_S", %%"REG_S" \n\t"\
|
||||
" jnz 2b \n\t"\
|
||||
\
|
||||
"lea "LUM_MMX_FILTER_OFFSET"(%0), %%"REG_d" \n\t"\
|
||||
|
||||
#define YSCALEYUV2PACKEDX_YA(offset) \
|
||||
"lea "offset"(%0), %%"REG_d" \n\t"\
|
||||
"mov (%%"REG_d"), %%"REG_S" \n\t"\
|
||||
"movq "VROUNDER_OFFSET"(%0), %%mm1 \n\t"\
|
||||
"movq %%mm1, %%mm7 \n\t"\
|
||||
|
@ -248,6 +249,10 @@
|
|||
"test %%"REG_S", %%"REG_S" \n\t"\
|
||||
" jnz 2b \n\t"\
|
||||
|
||||
#define YSCALEYUV2PACKEDX \
|
||||
YSCALEYUV2PACKEDX_UV \
|
||||
YSCALEYUV2PACKEDX_YA(LUM_MMX_FILTER_OFFSET) \
|
||||
|
||||
#define YSCALEYUV2PACKEDX_END \
|
||||
:: "r" (&c->redDither), \
|
||||
"m" (dummy), "m" (dummy), "m" (dummy),\
|
||||
|
@ -255,7 +260,7 @@
|
|||
: "%"REG_a, "%"REG_d, "%"REG_S \
|
||||
);
|
||||
|
||||
#define YSCALEYUV2PACKEDX_ACCURATE \
|
||||
#define YSCALEYUV2PACKEDX_ACCURATE_UV \
|
||||
__asm__ volatile(\
|
||||
"xor %%"REG_a", %%"REG_a" \n\t"\
|
||||
ASMALIGN(4)\
|
||||
|
@ -304,8 +309,9 @@
|
|||
"paddw %%mm0, %%mm6 \n\t"\
|
||||
"movq %%mm4, "U_TEMP"(%0) \n\t"\
|
||||
"movq %%mm6, "V_TEMP"(%0) \n\t"\
|
||||
\
|
||||
"lea "LUM_MMX_FILTER_OFFSET"(%0), %%"REG_d" \n\t"\
|
||||
|
||||
#define YSCALEYUV2PACKEDX_ACCURATE_YA(offset) \
|
||||
"lea "offset"(%0), %%"REG_d" \n\t"\
|
||||
"mov (%%"REG_d"), %%"REG_S" \n\t"\
|
||||
"pxor %%mm1, %%mm1 \n\t"\
|
||||
"pxor %%mm5, %%mm5 \n\t"\
|
||||
|
@ -349,6 +355,10 @@
|
|||
"movq "U_TEMP"(%0), %%mm3 \n\t"\
|
||||
"movq "V_TEMP"(%0), %%mm4 \n\t"\
|
||||
|
||||
#define YSCALEYUV2PACKEDX_ACCURATE \
|
||||
YSCALEYUV2PACKEDX_ACCURATE_UV \
|
||||
YSCALEYUV2PACKEDX_ACCURATE_YA(LUM_MMX_FILTER_OFFSET)
|
||||
|
||||
#define YSCALEYUV2RGBX \
|
||||
"psubw "U_OFFSET"(%0), %%mm3 \n\t" /* (U-128)8*/\
|
||||
"psubw "V_OFFSET"(%0), %%mm4 \n\t" /* (V-128)8*/\
|
||||
|
@ -384,7 +394,6 @@
|
|||
"packuswb %%mm0, %%mm2 \n\t"\
|
||||
"packuswb %%mm6, %%mm5 \n\t"\
|
||||
"packuswb %%mm3, %%mm4 \n\t"\
|
||||
"pxor %%mm7, %%mm7 \n\t"
|
||||
|
||||
#define REAL_YSCALEYUV2PACKED(index, c) \
|
||||
"movq "CHR_MMX_FILTER_OFFSET"+8("#c"), %%mm0 \n\t"\
|
||||
|
@ -424,7 +433,7 @@
|
|||
|
||||
#define YSCALEYUV2PACKED(index, c) REAL_YSCALEYUV2PACKED(index, c)
|
||||
|
||||
#define REAL_YSCALEYUV2RGB(index, c) \
|
||||
#define REAL_YSCALEYUV2RGB_UV(index, c) \
|
||||
"xor "#index", "#index" \n\t"\
|
||||
ASMALIGN(4)\
|
||||
"1: \n\t"\
|
||||
|
@ -448,6 +457,8 @@
|
|||
"pmulhw "UG_COEFF"("#c"), %%mm3 \n\t"\
|
||||
"pmulhw "VG_COEFF"("#c"), %%mm4 \n\t"\
|
||||
/* mm2=(U-128)8, mm3=ug, mm4=vg mm5=(V-128)8 */\
|
||||
|
||||
#define REAL_YSCALEYUV2RGB_YA(index, c) \
|
||||
"movq (%0, "#index", 2), %%mm0 \n\t" /*buf0[eax]*/\
|
||||
"movq (%1, "#index", 2), %%mm1 \n\t" /*buf1[eax]*/\
|
||||
"movq 8(%0, "#index", 2), %%mm6 \n\t" /*buf0[eax]*/\
|
||||
|
@ -460,6 +471,8 @@
|
|||
"psraw $4, %%mm7 \n\t" /* buf0[eax] - buf1[eax] >>4*/\
|
||||
"paddw %%mm0, %%mm1 \n\t" /* buf0[eax]yalpha1 + buf1[eax](1-yalpha1) >>16*/\
|
||||
"paddw %%mm6, %%mm7 \n\t" /* buf0[eax]yalpha1 + buf1[eax](1-yalpha1) >>16*/\
|
||||
|
||||
#define REAL_YSCALEYUV2RGB_COEFF(c) \
|
||||
"pmulhw "UB_COEFF"("#c"), %%mm2 \n\t"\
|
||||
"pmulhw "VR_COEFF"("#c"), %%mm5 \n\t"\
|
||||
"psubw "Y_OFFSET"("#c"), %%mm1 \n\t" /* 8(Y-16)*/\
|
||||
|
@ -487,8 +500,13 @@
|
|||
"packuswb %%mm0, %%mm2 \n\t"\
|
||||
"packuswb %%mm6, %%mm5 \n\t"\
|
||||
"packuswb %%mm3, %%mm4 \n\t"\
|
||||
"pxor %%mm7, %%mm7 \n\t"
|
||||
#define YSCALEYUV2RGB(index, c) REAL_YSCALEYUV2RGB(index, c)
|
||||
|
||||
#define YSCALEYUV2RGB_YA(index, c) REAL_YSCALEYUV2RGB_YA(index, c)
|
||||
|
||||
#define YSCALEYUV2RGB(index, c) \
|
||||
REAL_YSCALEYUV2RGB_UV(index, c) \
|
||||
REAL_YSCALEYUV2RGB_YA(index, c) \
|
||||
REAL_YSCALEYUV2RGB_COEFF(c)
|
||||
|
||||
#define REAL_YSCALEYUV2PACKED1(index, c) \
|
||||
"xor "#index", "#index" \n\t"\
|
||||
|
@ -551,7 +569,7 @@
|
|||
"packuswb %%mm0, %%mm2 \n\t"\
|
||||
"packuswb %%mm6, %%mm5 \n\t"\
|
||||
"packuswb %%mm3, %%mm4 \n\t"\
|
||||
"pxor %%mm7, %%mm7 \n\t"
|
||||
|
||||
#define YSCALEYUV2RGB1(index, c) REAL_YSCALEYUV2RGB1(index, c)
|
||||
|
||||
#define REAL_YSCALEYUV2PACKED1b(index, c) \
|
||||
|
@ -623,33 +641,32 @@
|
|||
"packuswb %%mm0, %%mm2 \n\t"\
|
||||
"packuswb %%mm6, %%mm5 \n\t"\
|
||||
"packuswb %%mm3, %%mm4 \n\t"\
|
||||
"pxor %%mm7, %%mm7 \n\t"
|
||||
|
||||
#define YSCALEYUV2RGB1b(index, c) REAL_YSCALEYUV2RGB1b(index, c)
|
||||
|
||||
#define REAL_WRITEBGR32(dst, dstw, index) \
|
||||
/* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */\
|
||||
"movq %%mm2, %%mm1 \n\t" /* B */\
|
||||
"movq %%mm5, %%mm6 \n\t" /* R */\
|
||||
"punpcklbw %%mm4, %%mm2 \n\t" /* GBGBGBGB 0 */\
|
||||
"punpcklbw %%mm7, %%mm5 \n\t" /* 0R0R0R0R 0 */\
|
||||
"punpckhbw %%mm4, %%mm1 \n\t" /* GBGBGBGB 2 */\
|
||||
"punpckhbw %%mm7, %%mm6 \n\t" /* 0R0R0R0R 2 */\
|
||||
"movq %%mm2, %%mm0 \n\t" /* GBGBGBGB 0 */\
|
||||
"movq %%mm1, %%mm3 \n\t" /* GBGBGBGB 2 */\
|
||||
"punpcklwd %%mm5, %%mm0 \n\t" /* 0RGB0RGB 0 */\
|
||||
"punpckhwd %%mm5, %%mm2 \n\t" /* 0RGB0RGB 1 */\
|
||||
"punpcklwd %%mm6, %%mm1 \n\t" /* 0RGB0RGB 2 */\
|
||||
"punpckhwd %%mm6, %%mm3 \n\t" /* 0RGB0RGB 3 */\
|
||||
#define REAL_WRITEBGR32(dst, dstw, index, b, g, r, a, q0, q2, q3, t) \
|
||||
"movq "#b", "#q2" \n\t" /* B */\
|
||||
"movq "#r", "#t" \n\t" /* R */\
|
||||
"punpcklbw "#g", "#b" \n\t" /* GBGBGBGB 0 */\
|
||||
"punpcklbw "#a", "#r" \n\t" /* ARARARAR 0 */\
|
||||
"punpckhbw "#g", "#q2" \n\t" /* GBGBGBGB 2 */\
|
||||
"punpckhbw "#a", "#t" \n\t" /* ARARARAR 2 */\
|
||||
"movq "#b", "#q0" \n\t" /* GBGBGBGB 0 */\
|
||||
"movq "#q2", "#q3" \n\t" /* GBGBGBGB 2 */\
|
||||
"punpcklwd "#r", "#q0" \n\t" /* ARGBARGB 0 */\
|
||||
"punpckhwd "#r", "#b" \n\t" /* ARGBARGB 1 */\
|
||||
"punpcklwd "#t", "#q2" \n\t" /* ARGBARGB 2 */\
|
||||
"punpckhwd "#t", "#q3" \n\t" /* ARGBARGB 3 */\
|
||||
\
|
||||
MOVNTQ(%%mm0, (dst, index, 4))\
|
||||
MOVNTQ(%%mm2, 8(dst, index, 4))\
|
||||
MOVNTQ(%%mm1, 16(dst, index, 4))\
|
||||
MOVNTQ(%%mm3, 24(dst, index, 4))\
|
||||
MOVNTQ( q0, (dst, index, 4))\
|
||||
MOVNTQ( b, 8(dst, index, 4))\
|
||||
MOVNTQ( q2, 16(dst, index, 4))\
|
||||
MOVNTQ( q3, 24(dst, index, 4))\
|
||||
\
|
||||
"add $8, "#index" \n\t"\
|
||||
"cmp "#dstw", "#index" \n\t"\
|
||||
" jb 1b \n\t"
|
||||
#define WRITEBGR32(dst, dstw, index) REAL_WRITEBGR32(dst, dstw, index)
|
||||
#define WRITEBGR32(dst, dstw, index, b, g, r, a, q0, q2, q3, t) REAL_WRITEBGR32(dst, dstw, index, b, g, r, a, q0, q2, q3, t)
|
||||
|
||||
#define REAL_WRITERGB16(dst, dstw, index) \
|
||||
"pand "MANGLE(bF8)", %%mm2 \n\t" /* B */\
|
||||
|
@ -1014,13 +1031,15 @@ static inline void RENAME(yuv2packedX)(SwsContext *c, int16_t *lumFilter, int16_
|
|||
case PIX_FMT_RGB32:
|
||||
YSCALEYUV2PACKEDX_ACCURATE
|
||||
YSCALEYUV2RGBX
|
||||
WRITEBGR32(%4, %5, %%REGa)
|
||||
"pxor %%mm7, %%mm7 \n\t"
|
||||
WRITEBGR32(%4, %5, %%REGa, %%mm2, %%mm4, %%mm5, %%mm7, %%mm0, %%mm1, %%mm3, %%mm6)
|
||||
|
||||
YSCALEYUV2PACKEDX_END
|
||||
return;
|
||||
case PIX_FMT_BGR24:
|
||||
YSCALEYUV2PACKEDX_ACCURATE
|
||||
YSCALEYUV2RGBX
|
||||
"pxor %%mm7, %%mm7 \n\t"
|
||||
"lea (%%"REG_a", %%"REG_a", 2), %%"REG_c"\n\t" //FIXME optimize
|
||||
"add %4, %%"REG_c" \n\t"
|
||||
WRITEBGR24(%%REGc, %5, %%REGa)
|
||||
|
@ -1035,6 +1054,7 @@ static inline void RENAME(yuv2packedX)(SwsContext *c, int16_t *lumFilter, int16_
|
|||
case PIX_FMT_RGB555:
|
||||
YSCALEYUV2PACKEDX_ACCURATE
|
||||
YSCALEYUV2RGBX
|
||||
"pxor %%mm7, %%mm7 \n\t"
|
||||
/* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */
|
||||
#ifdef DITHER1XBPP
|
||||
"paddusb "BLUE_DITHER"(%0), %%mm2\n\t"
|
||||
|
@ -1048,6 +1068,7 @@ static inline void RENAME(yuv2packedX)(SwsContext *c, int16_t *lumFilter, int16_
|
|||
case PIX_FMT_RGB565:
|
||||
YSCALEYUV2PACKEDX_ACCURATE
|
||||
YSCALEYUV2RGBX
|
||||
"pxor %%mm7, %%mm7 \n\t"
|
||||
/* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */
|
||||
#ifdef DITHER1XBPP
|
||||
"paddusb "BLUE_DITHER"(%0), %%mm2\n\t"
|
||||
|
@ -1076,12 +1097,14 @@ static inline void RENAME(yuv2packedX)(SwsContext *c, int16_t *lumFilter, int16_
|
|||
case PIX_FMT_RGB32:
|
||||
YSCALEYUV2PACKEDX
|
||||
YSCALEYUV2RGBX
|
||||
WRITEBGR32(%4, %5, %%REGa)
|
||||
"pxor %%mm7, %%mm7 \n\t"
|
||||
WRITEBGR32(%4, %5, %%REGa, %%mm2, %%mm4, %%mm5, %%mm7, %%mm0, %%mm1, %%mm3, %%mm6)
|
||||
YSCALEYUV2PACKEDX_END
|
||||
return;
|
||||
case PIX_FMT_BGR24:
|
||||
YSCALEYUV2PACKEDX
|
||||
YSCALEYUV2RGBX
|
||||
"pxor %%mm7, %%mm7 \n\t"
|
||||
"lea (%%"REG_a", %%"REG_a", 2), %%"REG_c" \n\t" //FIXME optimize
|
||||
"add %4, %%"REG_c" \n\t"
|
||||
WRITEBGR24(%%REGc, %5, %%REGa)
|
||||
|
@ -1095,6 +1118,7 @@ static inline void RENAME(yuv2packedX)(SwsContext *c, int16_t *lumFilter, int16_
|
|||
case PIX_FMT_RGB555:
|
||||
YSCALEYUV2PACKEDX
|
||||
YSCALEYUV2RGBX
|
||||
"pxor %%mm7, %%mm7 \n\t"
|
||||
/* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */
|
||||
#ifdef DITHER1XBPP
|
||||
"paddusb "BLUE_DITHER"(%0), %%mm2 \n\t"
|
||||
|
@ -1108,6 +1132,7 @@ static inline void RENAME(yuv2packedX)(SwsContext *c, int16_t *lumFilter, int16_
|
|||
case PIX_FMT_RGB565:
|
||||
YSCALEYUV2PACKEDX
|
||||
YSCALEYUV2RGBX
|
||||
"pxor %%mm7, %%mm7 \n\t"
|
||||
/* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */
|
||||
#ifdef DITHER1XBPP
|
||||
"paddusb "BLUE_DITHER"(%0), %%mm2 \n\t"
|
||||
|
@ -1171,7 +1196,8 @@ static inline void RENAME(yuv2packed2)(SwsContext *c, uint16_t *buf0, uint16_t *
|
|||
"mov %4, %%"REG_b" \n\t"
|
||||
"push %%"REG_BP" \n\t"
|
||||
YSCALEYUV2RGB(%%REGBP, %5)
|
||||
WRITEBGR32(%%REGb, 8280(%5), %%REGBP)
|
||||
"pxor %%mm7, %%mm7 \n\t"
|
||||
WRITEBGR32(%%REGb, 8280(%5), %%REGBP, %%mm2, %%mm4, %%mm5, %%mm7, %%mm0, %%mm1, %%mm3, %%mm6)
|
||||
"pop %%"REG_BP" \n\t"
|
||||
"mov "ESP_OFFSET"(%5), %%"REG_b" \n\t"
|
||||
|
||||
|
@ -1185,6 +1211,7 @@ static inline void RENAME(yuv2packed2)(SwsContext *c, uint16_t *buf0, uint16_t *
|
|||
"mov %4, %%"REG_b" \n\t"
|
||||
"push %%"REG_BP" \n\t"
|
||||
YSCALEYUV2RGB(%%REGBP, %5)
|
||||
"pxor %%mm7, %%mm7 \n\t"
|
||||
WRITEBGR24(%%REGb, 8280(%5), %%REGBP)
|
||||
"pop %%"REG_BP" \n\t"
|
||||
"mov "ESP_OFFSET"(%5), %%"REG_b" \n\t"
|
||||
|
@ -1198,6 +1225,7 @@ static inline void RENAME(yuv2packed2)(SwsContext *c, uint16_t *buf0, uint16_t *
|
|||
"mov %4, %%"REG_b" \n\t"
|
||||
"push %%"REG_BP" \n\t"
|
||||
YSCALEYUV2RGB(%%REGBP, %5)
|
||||
"pxor %%mm7, %%mm7 \n\t"
|
||||
/* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */
|
||||
#ifdef DITHER1XBPP
|
||||
"paddusb "BLUE_DITHER"(%5), %%mm2 \n\t"
|
||||
|
@ -1219,6 +1247,7 @@ static inline void RENAME(yuv2packed2)(SwsContext *c, uint16_t *buf0, uint16_t *
|
|||
"mov %4, %%"REG_b" \n\t"
|
||||
"push %%"REG_BP" \n\t"
|
||||
YSCALEYUV2RGB(%%REGBP, %5)
|
||||
"pxor %%mm7, %%mm7 \n\t"
|
||||
/* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */
|
||||
#ifdef DITHER1XBPP
|
||||
"paddusb "BLUE_DITHER"(%5), %%mm2 \n\t"
|
||||
|
@ -1283,7 +1312,8 @@ static inline void RENAME(yuv2packed1)(SwsContext *c, uint16_t *buf0, uint16_t *
|
|||
"mov %4, %%"REG_b" \n\t"
|
||||
"push %%"REG_BP" \n\t"
|
||||
YSCALEYUV2RGB1(%%REGBP, %5)
|
||||
WRITEBGR32(%%REGb, 8280(%5), %%REGBP)
|
||||
"pxor %%mm7, %%mm7 \n\t"
|
||||
WRITEBGR32(%%REGb, 8280(%5), %%REGBP, %%mm2, %%mm4, %%mm5, %%mm7, %%mm0, %%mm1, %%mm3, %%mm6)
|
||||
"pop %%"REG_BP" \n\t"
|
||||
"mov "ESP_OFFSET"(%5), %%"REG_b" \n\t"
|
||||
|
||||
|
@ -1297,6 +1327,7 @@ static inline void RENAME(yuv2packed1)(SwsContext *c, uint16_t *buf0, uint16_t *
|
|||
"mov %4, %%"REG_b" \n\t"
|
||||
"push %%"REG_BP" \n\t"
|
||||
YSCALEYUV2RGB1(%%REGBP, %5)
|
||||
"pxor %%mm7, %%mm7 \n\t"
|
||||
WRITEBGR24(%%REGb, 8280(%5), %%REGBP)
|
||||
"pop %%"REG_BP" \n\t"
|
||||
"mov "ESP_OFFSET"(%5), %%"REG_b" \n\t"
|
||||
|
@ -1311,6 +1342,7 @@ static inline void RENAME(yuv2packed1)(SwsContext *c, uint16_t *buf0, uint16_t *
|
|||
"mov %4, %%"REG_b" \n\t"
|
||||
"push %%"REG_BP" \n\t"
|
||||
YSCALEYUV2RGB1(%%REGBP, %5)
|
||||
"pxor %%mm7, %%mm7 \n\t"
|
||||
/* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */
|
||||
#ifdef DITHER1XBPP
|
||||
"paddusb "BLUE_DITHER"(%5), %%mm2 \n\t"
|
||||
|
@ -1331,6 +1363,7 @@ static inline void RENAME(yuv2packed1)(SwsContext *c, uint16_t *buf0, uint16_t *
|
|||
"mov %4, %%"REG_b" \n\t"
|
||||
"push %%"REG_BP" \n\t"
|
||||
YSCALEYUV2RGB1(%%REGBP, %5)
|
||||
"pxor %%mm7, %%mm7 \n\t"
|
||||
/* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */
|
||||
#ifdef DITHER1XBPP
|
||||
"paddusb "BLUE_DITHER"(%5), %%mm2 \n\t"
|
||||
|
@ -1372,7 +1405,8 @@ static inline void RENAME(yuv2packed1)(SwsContext *c, uint16_t *buf0, uint16_t *
|
|||
"mov %4, %%"REG_b" \n\t"
|
||||
"push %%"REG_BP" \n\t"
|
||||
YSCALEYUV2RGB1b(%%REGBP, %5)
|
||||
WRITEBGR32(%%REGb, 8280(%5), %%REGBP)
|
||||
"pxor %%mm7, %%mm7 \n\t"
|
||||
WRITEBGR32(%%REGb, 8280(%5), %%REGBP, %%mm2, %%mm4, %%mm5, %%mm7, %%mm0, %%mm1, %%mm3, %%mm6)
|
||||
"pop %%"REG_BP" \n\t"
|
||||
"mov "ESP_OFFSET"(%5), %%"REG_b" \n\t"
|
||||
|
||||
|
@ -1386,6 +1420,7 @@ static inline void RENAME(yuv2packed1)(SwsContext *c, uint16_t *buf0, uint16_t *
|
|||
"mov %4, %%"REG_b" \n\t"
|
||||
"push %%"REG_BP" \n\t"
|
||||
YSCALEYUV2RGB1b(%%REGBP, %5)
|
||||
"pxor %%mm7, %%mm7 \n\t"
|
||||
WRITEBGR24(%%REGb, 8280(%5), %%REGBP)
|
||||
"pop %%"REG_BP" \n\t"
|
||||
"mov "ESP_OFFSET"(%5), %%"REG_b" \n\t"
|
||||
|
@ -1400,6 +1435,7 @@ static inline void RENAME(yuv2packed1)(SwsContext *c, uint16_t *buf0, uint16_t *
|
|||
"mov %4, %%"REG_b" \n\t"
|
||||
"push %%"REG_BP" \n\t"
|
||||
YSCALEYUV2RGB1b(%%REGBP, %5)
|
||||
"pxor %%mm7, %%mm7 \n\t"
|
||||
/* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */
|
||||
#ifdef DITHER1XBPP
|
||||
"paddusb "BLUE_DITHER"(%5), %%mm2 \n\t"
|
||||
|
@ -1420,6 +1456,7 @@ static inline void RENAME(yuv2packed1)(SwsContext *c, uint16_t *buf0, uint16_t *
|
|||
"mov %4, %%"REG_b" \n\t"
|
||||
"push %%"REG_BP" \n\t"
|
||||
YSCALEYUV2RGB1b(%%REGBP, %5)
|
||||
"pxor %%mm7, %%mm7 \n\t"
|
||||
/* mm2=B, %%mm4=G, %%mm5=R, %%mm7=0 */
|
||||
#ifdef DITHER1XBPP
|
||||
"paddusb "BLUE_DITHER"(%5), %%mm2 \n\t"
|
||||
|
|
|
@ -121,47 +121,68 @@
|
|||
"punpcklbw %%mm5, %%mm2;" /* G7 G6 G5 G4 G3 G2 G1 G0 */\
|
||||
|
||||
|
||||
#define YUV422_UNSHIFT \
|
||||
if(c->srcFormat == PIX_FMT_YUV422P){ \
|
||||
srcStride[1] *= 2; \
|
||||
srcStride[2] *= 2; \
|
||||
} \
|
||||
|
||||
#define YUV2RGB_LOOP(depth) \
|
||||
h_size= (c->dstW+7)&~7; \
|
||||
if(h_size*depth > FFABS(dstStride[0])) h_size-=8; \
|
||||
\
|
||||
__asm__ volatile ("pxor %mm4, %mm4;" /* zero mm4 */ ); \
|
||||
for (y= 0; y<srcSliceH; y++ ) { \
|
||||
uint8_t *image = dst[0] + (y+srcSliceY)*dstStride[0]; \
|
||||
uint8_t *py = src[0] + y*srcStride[0]; \
|
||||
uint8_t *pu = src[1] + (y>>1)*srcStride[1]; \
|
||||
uint8_t *pv = src[2] + (y>>1)*srcStride[2]; \
|
||||
long index= -h_size/2; \
|
||||
|
||||
#define YUV2RGB_INIT \
|
||||
/* This MMX assembly code deals with a SINGLE scan line at a time, \
|
||||
* it converts 8 pixels in each iteration. */ \
|
||||
__asm__ volatile ( \
|
||||
/* load data for start of next scan line */ \
|
||||
"movd (%2, %0), %%mm0;" /* Load 4 Cb 00 00 00 00 u3 u2 u1 u0 */ \
|
||||
"movd (%3, %0), %%mm1;" /* Load 4 Cr 00 00 00 00 v3 v2 v1 v0 */ \
|
||||
"movq (%5, %0, 2), %%mm6;" /* Load 8 Y Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 */ \
|
||||
/* \
|
||||
".balign 16 \n\t" \
|
||||
*/ \
|
||||
"1: \n\t" \
|
||||
/* No speed difference on my p3@500 with prefetch, \
|
||||
* if it is faster for anyone with -benchmark then tell me. \
|
||||
PREFETCH" 64(%0) \n\t" \
|
||||
PREFETCH" 64(%1) \n\t" \
|
||||
PREFETCH" 64(%2) \n\t" \
|
||||
*/ \
|
||||
|
||||
#define YUV2RGB_ENDLOOP(depth) \
|
||||
"add $"AV_STRINGIFY(depth*8)", %1 \n\t" \
|
||||
"add $4, %0 \n\t" \
|
||||
" js 1b \n\t" \
|
||||
\
|
||||
: "+r" (index), "+r" (image) \
|
||||
: "r" (pu - index), "r" (pv - index), "r"(&c->redDither), "r" (py - 2*index) \
|
||||
); \
|
||||
} \
|
||||
__asm__ volatile (EMMS); \
|
||||
return srcSliceH; \
|
||||
|
||||
static inline int RENAME(yuv420_rgb16)(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY,
|
||||
int srcSliceH, uint8_t* dst[], int dstStride[]){
|
||||
int y, h_size;
|
||||
|
||||
if(c->srcFormat == PIX_FMT_YUV422P){
|
||||
srcStride[1] *= 2;
|
||||
srcStride[2] *= 2;
|
||||
}
|
||||
|
||||
h_size= (c->dstW+7)&~7;
|
||||
if(h_size*2 > FFABS(dstStride[0])) h_size-=8;
|
||||
|
||||
__asm__ volatile ("pxor %mm4, %mm4;" /* zero mm4 */ );
|
||||
//printf("%X %X %X %X %X %X %X %X %X %X\n", (int)&c->redDither, (int)&c->blueDither, (int)src[0], (int)src[1], (int)src[2], (int)dst[0],
|
||||
//srcStride[0],srcStride[1],srcStride[2],dstStride[0]);
|
||||
for (y= 0; y<srcSliceH; y++ ) {
|
||||
uint8_t *image = dst[0] + (y+srcSliceY)*dstStride[0];
|
||||
uint8_t *py = src[0] + y*srcStride[0];
|
||||
uint8_t *pu = src[1] + (y>>1)*srcStride[1];
|
||||
uint8_t *pv = src[2] + (y>>1)*srcStride[2];
|
||||
long index= -h_size/2;
|
||||
YUV422_UNSHIFT
|
||||
YUV2RGB_LOOP(2)
|
||||
|
||||
c->blueDither= ff_dither8[y&1];
|
||||
c->greenDither= ff_dither4[y&1];
|
||||
c->redDither= ff_dither8[(y+1)&1];
|
||||
/* This MMX assembly code deals with a SINGLE scan line at a time,
|
||||
* it converts 8 pixels in each iteration. */
|
||||
__asm__ volatile (
|
||||
/* load data for start of next scan line */
|
||||
"movd (%2, %0), %%mm0;" /* Load 4 Cb 00 00 00 00 u3 u2 u1 u0 */
|
||||
"movd (%3, %0), %%mm1;" /* Load 4 Cr 00 00 00 00 v3 v2 v1 v0 */
|
||||
"movq (%5, %0, 2), %%mm6;" /* Load 8 Y Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 */
|
||||
//".balign 16 \n\t"
|
||||
"1: \n\t"
|
||||
/* No speed difference on my p3@500 with prefetch,
|
||||
* if it is faster for anyone with -benchmark then tell me.
|
||||
PREFETCH" 64(%0) \n\t"
|
||||
PREFETCH" 64(%1) \n\t"
|
||||
PREFETCH" 64(%2) \n\t"
|
||||
*/
|
||||
YUV2RGB
|
||||
|
||||
YUV2RGB_INIT
|
||||
YUV2RGB
|
||||
|
||||
#ifdef DITHER1XBPP
|
||||
"paddusb "BLUE_DITHER"(%4), %%mm0;"
|
||||
|
@ -201,55 +222,22 @@ YUV2RGB
|
|||
|
||||
MOVNTQ " %%mm5, 8 (%1);" /* store pixel 4-7 */
|
||||
|
||||
"add $16, %1 \n\t"
|
||||
"add $4, %0 \n\t"
|
||||
" js 1b \n\t"
|
||||
|
||||
: "+r" (index), "+r" (image)
|
||||
: "r" (pu - index), "r" (pv - index), "r"(&c->redDither), "r" (py - 2*index)
|
||||
);
|
||||
}
|
||||
|
||||
__asm__ volatile (EMMS);
|
||||
|
||||
return srcSliceH;
|
||||
YUV2RGB_ENDLOOP(2)
|
||||
}
|
||||
|
||||
static inline int RENAME(yuv420_rgb15)(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY,
|
||||
int srcSliceH, uint8_t* dst[], int dstStride[]){
|
||||
int y, h_size;
|
||||
|
||||
if(c->srcFormat == PIX_FMT_YUV422P){
|
||||
srcStride[1] *= 2;
|
||||
srcStride[2] *= 2;
|
||||
}
|
||||
|
||||
h_size= (c->dstW+7)&~7;
|
||||
if(h_size*2 > FFABS(dstStride[0])) h_size-=8;
|
||||
|
||||
__asm__ volatile ("pxor %mm4, %mm4;" /* zero mm4 */ );
|
||||
//printf("%X %X %X %X %X %X %X %X %X %X\n", (int)&c->redDither, (int)&c->blueDither, (int)src[0], (int)src[1], (int)src[2], (int)dst[0],
|
||||
//srcStride[0],srcStride[1],srcStride[2],dstStride[0]);
|
||||
for (y= 0; y<srcSliceH; y++ ) {
|
||||
uint8_t *image = dst[0] + (y+srcSliceY)*dstStride[0];
|
||||
uint8_t *py = src[0] + y*srcStride[0];
|
||||
uint8_t *pu = src[1] + (y>>1)*srcStride[1];
|
||||
uint8_t *pv = src[2] + (y>>1)*srcStride[2];
|
||||
long index= -h_size/2;
|
||||
YUV422_UNSHIFT
|
||||
YUV2RGB_LOOP(2)
|
||||
|
||||
c->blueDither= ff_dither8[y&1];
|
||||
c->greenDither= ff_dither8[y&1];
|
||||
c->redDither= ff_dither8[(y+1)&1];
|
||||
/* This MMX assembly code deals with a SINGLE scan line at a time,
|
||||
* it converts 8 pixels in each iteration. */
|
||||
__asm__ volatile (
|
||||
/* load data for start of next scan line */
|
||||
"movd (%2, %0), %%mm0;" /* Load 4 Cb 00 00 00 00 u3 u2 u1 u0 */
|
||||
"movd (%3, %0), %%mm1;" /* Load 4 Cr 00 00 00 00 v3 v2 v1 v0 */
|
||||
"movq (%5, %0, 2), %%mm6;" /* Load 8 Y Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 */
|
||||
//".balign 16 \n\t"
|
||||
"1: \n\t"
|
||||
YUV2RGB
|
||||
|
||||
YUV2RGB_INIT
|
||||
YUV2RGB
|
||||
|
||||
#ifdef DITHER1XBPP
|
||||
"paddusb "BLUE_DITHER"(%4), %%mm0 \n\t"
|
||||
|
@ -291,49 +279,18 @@ YUV2RGB
|
|||
|
||||
MOVNTQ " %%mm5, 8 (%1);" /* store pixel 4-7 */
|
||||
|
||||
"add $16, %1 \n\t"
|
||||
"add $4, %0 \n\t"
|
||||
" js 1b \n\t"
|
||||
: "+r" (index), "+r" (image)
|
||||
: "r" (pu - index), "r" (pv - index), "r"(&c->redDither), "r" (py - 2*index)
|
||||
);
|
||||
}
|
||||
|
||||
__asm__ volatile (EMMS);
|
||||
return srcSliceH;
|
||||
YUV2RGB_ENDLOOP(2)
|
||||
}
|
||||
|
||||
static inline int RENAME(yuv420_rgb24)(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY,
|
||||
int srcSliceH, uint8_t* dst[], int dstStride[]){
|
||||
int y, h_size;
|
||||
|
||||
if(c->srcFormat == PIX_FMT_YUV422P){
|
||||
srcStride[1] *= 2;
|
||||
srcStride[2] *= 2;
|
||||
}
|
||||
YUV422_UNSHIFT
|
||||
YUV2RGB_LOOP(3)
|
||||
|
||||
h_size= (c->dstW+7)&~7;
|
||||
if(h_size*3 > FFABS(dstStride[0])) h_size-=8;
|
||||
|
||||
__asm__ volatile ("pxor %mm4, %mm4;" /* zero mm4 */ );
|
||||
|
||||
for (y= 0; y<srcSliceH; y++ ) {
|
||||
uint8_t *image = dst[0] + (y+srcSliceY)*dstStride[0];
|
||||
uint8_t *py = src[0] + y*srcStride[0];
|
||||
uint8_t *pu = src[1] + (y>>1)*srcStride[1];
|
||||
uint8_t *pv = src[2] + (y>>1)*srcStride[2];
|
||||
long index= -h_size/2;
|
||||
|
||||
/* This MMX assembly code deals with a SINGLE scan line at a time,
|
||||
* it converts 8 pixels in each iteration. */
|
||||
__asm__ volatile (
|
||||
/* load data for start of next scan line */
|
||||
"movd (%2, %0), %%mm0;" /* Load 4 Cb 00 00 00 00 u3 u2 u1 u0 */
|
||||
"movd (%3, %0), %%mm1;" /* Load 4 Cr 00 00 00 00 v3 v2 v1 v0 */
|
||||
"movq (%5, %0, 2), %%mm6;" /* Load 8 Y Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 */
|
||||
//".balign 16 \n\t"
|
||||
"1: \n\t"
|
||||
YUV2RGB
|
||||
YUV2RGB_INIT
|
||||
YUV2RGB
|
||||
/* mm0=B, %%mm2=G, %%mm1=R */
|
||||
#if HAVE_MMX2
|
||||
"movq "MANGLE(ff_M24A)", %%mm4 \n\t"
|
||||
|
@ -436,50 +393,18 @@ YUV2RGB
|
|||
"pxor %%mm4, %%mm4 \n\t"
|
||||
#endif
|
||||
|
||||
"add $24, %1 \n\t"
|
||||
"add $4, %0 \n\t"
|
||||
" js 1b \n\t"
|
||||
|
||||
: "+r" (index), "+r" (image)
|
||||
: "r" (pu - index), "r" (pv - index), "r"(&c->redDither), "r" (py - 2*index)
|
||||
);
|
||||
}
|
||||
|
||||
__asm__ volatile (EMMS);
|
||||
return srcSliceH;
|
||||
YUV2RGB_ENDLOOP(3)
|
||||
}
|
||||
|
||||
static inline int RENAME(yuv420_rgb32)(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY,
|
||||
int srcSliceH, uint8_t* dst[], int dstStride[]){
|
||||
int y, h_size;
|
||||
|
||||
if(c->srcFormat == PIX_FMT_YUV422P){
|
||||
srcStride[1] *= 2;
|
||||
srcStride[2] *= 2;
|
||||
}
|
||||
YUV422_UNSHIFT
|
||||
YUV2RGB_LOOP(4)
|
||||
|
||||
h_size= (c->dstW+7)&~7;
|
||||
if(h_size*4 > FFABS(dstStride[0])) h_size-=8;
|
||||
|
||||
__asm__ volatile ("pxor %mm4, %mm4;" /* zero mm4 */ );
|
||||
|
||||
for (y= 0; y<srcSliceH; y++ ) {
|
||||
uint8_t *image = dst[0] + (y+srcSliceY)*dstStride[0];
|
||||
uint8_t *py = src[0] + y*srcStride[0];
|
||||
uint8_t *pu = src[1] + (y>>1)*srcStride[1];
|
||||
uint8_t *pv = src[2] + (y>>1)*srcStride[2];
|
||||
long index= -h_size/2;
|
||||
|
||||
/* This MMX assembly code deals with a SINGLE scan line at a time,
|
||||
* it converts 8 pixels in each iteration. */
|
||||
__asm__ volatile (
|
||||
/* load data for start of next scan line */
|
||||
"movd (%2, %0), %%mm0;" /* Load 4 Cb 00 00 00 00 u3 u2 u1 u0 */
|
||||
"movd (%3, %0), %%mm1;" /* Load 4 Cr 00 00 00 00 v3 v2 v1 v0 */
|
||||
"movq (%5, %0, 2), %%mm6;" /* Load 8 Y Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 */
|
||||
//".balign 16 \n\t"
|
||||
"1: \n\t"
|
||||
YUV2RGB
|
||||
YUV2RGB_INIT
|
||||
YUV2RGB
|
||||
/* convert RGB plane to RGB packed format,
|
||||
mm0 -> B, mm1 -> R, mm2 -> G, mm3 -> 0,
|
||||
mm4 -> GB, mm5 -> AR pixel 4-7,
|
||||
|
@ -522,15 +447,5 @@ YUV2RGB
|
|||
"pxor %%mm4, %%mm4;" /* zero mm4 */
|
||||
"movq 8 (%5, %0, 2), %%mm6;" /* Load 8 Y Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 */
|
||||
|
||||
"add $32, %1 \n\t"
|
||||
"add $4, %0 \n\t"
|
||||
" js 1b \n\t"
|
||||
|
||||
: "+r" (index), "+r" (image)
|
||||
: "r" (pu - index), "r" (pv - index), "r"(&c->redDither), "r" (py - 2*index)
|
||||
);
|
||||
}
|
||||
|
||||
__asm__ volatile (EMMS);
|
||||
return srcSliceH;
|
||||
YUV2RGB_ENDLOOP(4)
|
||||
}
|
||||
|
|
|
@ -158,12 +158,12 @@ const struct vo_driver *video_out_drivers[] =
|
|||
#ifdef CONFIG_3DFX
|
||||
&video_out_3dfx,
|
||||
#endif
|
||||
#if CONFIG_VDPAU
|
||||
&video_out_vdpau,
|
||||
#endif
|
||||
#ifdef CONFIG_XV
|
||||
&video_out_xv,
|
||||
#endif
|
||||
#if CONFIG_VDPAU
|
||||
&video_out_vdpau,
|
||||
#endif
|
||||
#ifdef CONFIG_X11
|
||||
&video_out_x11,
|
||||
&video_out_xover,
|
||||
|
|
|
@ -126,7 +126,7 @@ LIBVO_EXTERN(svga)
|
|||
|
||||
//return number of 1'st free page or -1 if no free one
|
||||
static inline int page_find_free(void){
|
||||
int i;
|
||||
int i;
|
||||
for(i=0;i<max_pages;i++)
|
||||
if(PageStore[i].locks == PAGE_EMPTY) return i;
|
||||
return -1;
|
||||
|
@ -134,8 +134,8 @@ int i;
|
|||
|
||||
static int preinit(const char *arg)
|
||||
{
|
||||
int i,rez;
|
||||
char s[64];
|
||||
int i,rez;
|
||||
char s[64];
|
||||
|
||||
getch2_disable();
|
||||
memset(zerobuf,0,sizeof(zerobuf));
|
||||
|
@ -188,7 +188,7 @@ char s[64];
|
|||
|
||||
force_vm=vga_getmodenumber(s);
|
||||
if(force_vm>0) {
|
||||
if( mp_msg_test(MSGT_VO,MSGL_V) ) mp_msg(MSGT_VO,MSGL_V, "vo_svga: Forcing mode %i\n",force_vm);
|
||||
mp_msg(MSGT_VO,MSGL_V, "vo_svga: Forcing mode %i\n",force_vm);
|
||||
}else{
|
||||
force_vm = 0;
|
||||
}
|
||||
|
@ -206,11 +206,10 @@ char s[64];
|
|||
}
|
||||
|
||||
static void svga_clear_box(int x,int y,int w,int h){
|
||||
uint8_t * rgbplane;
|
||||
int i;
|
||||
uint8_t * rgbplane;
|
||||
int i;
|
||||
|
||||
if (mode_capabilities&CAP_ACCEL_CLEAR){
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG3) )
|
||||
mp_msg(MSGT_VO,MSGL_DBG3, "vo_svga: clearing box %d,%d - %d,%d with HW acceleration\n",
|
||||
x,y,w,h);
|
||||
if(mode_capabilities&CAP_ACCEL_BACKGR)
|
||||
|
@ -220,7 +219,6 @@ int i;
|
|||
return;
|
||||
}
|
||||
if (mode_capabilities & CAP_LINEAR){
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG3) )
|
||||
mp_msg(MSGT_VO,MSGL_DBG3, "vo_svga: clearing box %d,%d - %d,%d with memset\n",x,y,w,h);
|
||||
rgbplane=PageStore[0].vbase + (y*mode_stride) + (x*modeinfo->bytesperpixel);
|
||||
for(i=0;i<h;i++){
|
||||
|
@ -232,7 +230,6 @@ int i;
|
|||
return;
|
||||
}
|
||||
//native
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG3) )
|
||||
mp_msg(MSGT_VO,MSGL_DBG3, "vo_svga: clearing box %d,%d - %d,%d with native draw \n",x,y,w,h);
|
||||
if(modeinfo->bytesperpixel!=0) w*=modeinfo->bytesperpixel;
|
||||
for(i=0;i<h;i++){
|
||||
|
@ -241,14 +238,13 @@ int i;
|
|||
};
|
||||
|
||||
static uint32_t svga_draw_image(mp_image_t *mpi){
|
||||
int i,x,y,w,h;
|
||||
int stride;
|
||||
uint8_t *rgbplane, *base;
|
||||
int bytesperline;
|
||||
int page;
|
||||
int i,x,y,w,h;
|
||||
int stride;
|
||||
uint8_t *rgbplane, *base;
|
||||
int bytesperline;
|
||||
int page;
|
||||
|
||||
if(mpi->flags & MP_IMGFLAG_DIRECT){
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG3) )
|
||||
mp_msg(MSGT_VO,MSGL_DBG3, "vo_svga: drawing direct rendered surface\n");
|
||||
cpage=(uint32_t)mpi->priv;
|
||||
assert((cpage>=0)&&(cpage<max_pages));
|
||||
|
@ -278,7 +274,6 @@ int page;
|
|||
(stride == mode_stride) ){ //only monolite image can be accelerated
|
||||
w=(stride*8)/mpi->bpp;//we transfer pixels in the stride so the source
|
||||
//ACCELERATE
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG3) )
|
||||
mp_msg(MSGT_VO,MSGL_DBG3, "vo_svga: using HW PutImage (x=%d,y=%d,w=%d,h=%d)\n",x,y,w,h);
|
||||
if(mode_capabilities & CAP_ACCEL_BACKGR)
|
||||
vga_accel(ACCEL_SYNC);
|
||||
|
@ -289,7 +284,6 @@ int page;
|
|||
|
||||
if( mode_capabilities&CAP_LINEAR){
|
||||
//DIRECT
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG3) )
|
||||
mp_msg(MSGT_VO,MSGL_DBG3, "vo_svga: using Direct memcpy (x=%d,y=%d,w=%d,h=%d)\n",x,y,w,h);
|
||||
bytesperline=(w*mpi->bpp)/8;
|
||||
base=PageStore[cpage].vbase + (y*mode_stride) + (x*mpi->bpp)/8;
|
||||
|
@ -311,7 +305,6 @@ int page;
|
|||
//one byte per pixel! svgalib innovation
|
||||
if(mpi->imgfmt==IMGFMT_RG4B || mpi->imgfmt==IMGFMT_BG4B) length=w;
|
||||
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG3) )
|
||||
mp_msg(MSGT_VO,MSGL_DBG3, "vo_svga: using Native vga_draw(x=%d,y=%d,w=%d,h=%d)\n",x,y,w,h);
|
||||
y+=PageStore[cpage].yoffset;//y position of the page beggining
|
||||
for(i=0;i<h;i++){
|
||||
|
@ -347,7 +340,6 @@ static int find_best_svga_mode(int req_w,int req_h, int req_bpp){
|
|||
for(i=1;i<=lastmode;i++){
|
||||
vminfo = vga_getmodeinfo(i);
|
||||
if( vminfo == NULL ) continue;
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG4) )
|
||||
mp_msg(MSGT_VO,MSGL_DBG4, "vo_svga: testing mode %d (%s)\n",i,vga_getmodename(i));
|
||||
if( vga_hasmode(i) == 0 ) continue;
|
||||
if( req_bpp != bpp_from_vminfo(vminfo) )continue;
|
||||
|
@ -360,7 +352,6 @@ static int find_best_svga_mode(int req_w,int req_h, int req_bpp){
|
|||
if( bestmode==0 || prev_badness >= badness ){//modeX etc...
|
||||
prev_badness=badness;
|
||||
bestmode=i;
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG4) )
|
||||
mp_msg(MSGT_VO,MSGL_DBG4, "vo_svga: found good mode %d with badness %d\n",i,badness);
|
||||
}
|
||||
}
|
||||
|
@ -398,7 +389,6 @@ static int config(uint32_t width, uint32_t height, uint32_t d_width,
|
|||
int32_t req_bpp;
|
||||
|
||||
uint32_t accflags;
|
||||
if( mp_msg_test(MSGT_VO,MSGL_V) )
|
||||
mp_msg(MSGT_VO,MSGL_V, "vo_svga: config(%i, %i, %i, %i, %08x, %s, %08x)\n", width, height,
|
||||
d_width, d_height, flags, title, format);
|
||||
//Only RGB modes supported
|
||||
|
@ -408,10 +398,8 @@ static int config(uint32_t width, uint32_t height, uint32_t d_width,
|
|||
if( vo_dbpp!=0 && vo_dbpp!=req_bpp) {assert(0);return-1;}
|
||||
|
||||
if(!force_vm) {
|
||||
if ( mp_msg_test(MSGT_VO,MSGL_V) ) {
|
||||
mp_msg(MSGT_VO,MSGL_V, "vo_svga: Looking for the best resolution...\n");
|
||||
mp_msg(MSGT_VO,MSGL_V, "vo_svga: req_w: %d, req_h: %d, bpp: %d\n",req_w,req_h,req_bpp);
|
||||
}
|
||||
vid_mode=find_best_svga_mode(req_w,req_h,req_bpp);
|
||||
if(vid_mode==0)
|
||||
return 1;
|
||||
|
@ -571,23 +559,22 @@ static int config(uint32_t width, uint32_t height, uint32_t d_width,
|
|||
|
||||
static int draw_slice(uint8_t *image[],int stride[],
|
||||
int w, int h, int x, int y) {
|
||||
assert(0);
|
||||
UNUSED(image);UNUSED(stride);
|
||||
UNUSED(w);UNUSED(h);
|
||||
UNUSED(x);UNUSED(y);
|
||||
assert(0);
|
||||
UNUSED(image);UNUSED(stride);
|
||||
UNUSED(w);UNUSED(h);
|
||||
UNUSED(x);UNUSED(y);
|
||||
|
||||
return VO_ERROR;//this is yv12 only -> vf_scale should do all transforms
|
||||
}
|
||||
|
||||
static int draw_frame(uint8_t *src[]) {
|
||||
assert(0);
|
||||
UNUSED(src);
|
||||
assert(0);
|
||||
UNUSED(src);
|
||||
return VO_ERROR;//this one should not be called
|
||||
}
|
||||
|
||||
static void draw_osd(void)
|
||||
{
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG4) )
|
||||
mp_msg(MSGT_VO,MSGL_DBG4, "vo_svga: draw_osd()\n");
|
||||
//only modes with bytesperpixel>0 can draw OSD
|
||||
if(modeinfo->bytesperpixel==0) return;
|
||||
|
@ -616,10 +603,9 @@ static void flip_page(void) {
|
|||
PageStore[old_page].locks=PAGE_EMPTY;
|
||||
PageStore[cpage].locks=PAGE_BUSY;
|
||||
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG3) )
|
||||
mp_msg(MSGT_VO,MSGL_DBG3, "vo_svga: viewing page %d\n",cpage);
|
||||
if(sync_flip && old_page!=cpage){
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG3) ) mp_msg(MSGT_VO,MSGL_DBG3, "vo_svga:vga_waitretrace\n");
|
||||
mp_msg(MSGT_VO,MSGL_DBG3, "vo_svga:vga_waitretrace\n");
|
||||
vga_waitretrace();
|
||||
}
|
||||
vga_setdisplaystart(PageStore[cpage].doffset);
|
||||
|
@ -640,11 +626,10 @@ static void uninit(void) {
|
|||
|
||||
/* --------------------------------------------------------------------- */
|
||||
static int query_format(uint32_t format) {
|
||||
int32_t req_bpp,flags;
|
||||
int i,lastmode;
|
||||
vga_modeinfo * vminfo;
|
||||
int32_t req_bpp,flags;
|
||||
int i,lastmode;
|
||||
vga_modeinfo * vminfo;
|
||||
|
||||
if ( mp_msg_test(MSGT_VO,MSGL_DBG4) )
|
||||
mp_msg(MSGT_VO,MSGL_DBG4, "vo_svga: query_format=%X \n",format);
|
||||
//only RGB modes supported
|
||||
if( (!IMGFMT_IS_RGB(format)) && (!IMGFMT_IS_BGR(format)) ) return 0;
|
||||
|
@ -682,7 +667,6 @@ static void draw_alpha(int x0, int y0, int w, int h, unsigned char *src,
|
|||
unsigned char *srca, int stride) {
|
||||
char* base;
|
||||
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG3) )
|
||||
mp_msg(MSGT_VO,MSGL_DBG3, "vo_svga: draw_alpha(x0=%d,y0=%d,w=%d,h=%d,src=%p,srca=%p,stride=%d\n",
|
||||
x0,y0,w,h,src,srca,stride);
|
||||
if(!blackbar_osd) {
|
||||
|
@ -691,7 +675,6 @@ static void draw_alpha(int x0, int y0, int w, int h, unsigned char *src,
|
|||
y0+=y_pos;
|
||||
}
|
||||
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG4) )
|
||||
mp_msg(MSGT_VO,MSGL_DBG4, "vo_svga: OSD draw in page %d\n",cpage);
|
||||
base=PageStore[cpage].vbase + y0*mode_stride + x0*modeinfo->bytesperpixel;
|
||||
switch (mode_bpp) {
|
||||
|
@ -711,7 +694,7 @@ static void draw_alpha(int x0, int y0, int w, int h, unsigned char *src,
|
|||
}
|
||||
|
||||
static uint32_t get_image(mp_image_t *mpi){
|
||||
int page;
|
||||
int page;
|
||||
|
||||
if(!IMGFMT_IS_BGR(mpi->imgfmt) && !IMGFMT_IS_RGB(mpi->imgfmt) ){
|
||||
assert(0);//should never happen
|
||||
|
@ -739,7 +722,6 @@ int page;
|
|||
mpi->planes[0] = PageStore[page].vbase +
|
||||
y_pos*mode_stride + (x_pos*mpi->bpp)/8;
|
||||
mpi->priv=(void *)page;
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG3) )
|
||||
mp_msg(MSGT_VO,MSGL_DBG3, "vo_svga: direct render allocated! page=%d\n",page);
|
||||
return VO_TRUE;
|
||||
}
|
||||
|
|
|
@ -42,6 +42,7 @@
|
|||
#include "x11_common.h"
|
||||
#include "aspect.h"
|
||||
#include "sub.h"
|
||||
#include "subopt-helper.h"
|
||||
|
||||
#include "libavcodec/vdpau.h"
|
||||
|
||||
|
@ -111,6 +112,8 @@ static VdpOutputSurfaceDestroy *vdp_output_surface_destroy;
|
|||
static VdpVideoMixerCreate *vdp_video_mixer_create;
|
||||
static VdpVideoMixerDestroy *vdp_video_mixer_destroy;
|
||||
static VdpVideoMixerRender *vdp_video_mixer_render;
|
||||
static VdpVideoMixerSetFeatureEnables *vdp_video_mixer_set_feature_enables;
|
||||
static VdpVideoMixerSetAttributeValues *vdp_video_mixer_set_attribute_values;
|
||||
|
||||
static VdpPresentationQueueTargetDestroy *vdp_presentation_queue_target_destroy;
|
||||
static VdpPresentationQueueCreate *vdp_presentation_queue_create;
|
||||
|
@ -132,6 +135,10 @@ static VdpOutputSurface output_surfaces[NUM_OUTPUT_SURFACES];
|
|||
static int output_surface_width, output_surface_height;
|
||||
|
||||
static VdpVideoMixer video_mixer;
|
||||
static int deint;
|
||||
static int pullup;
|
||||
static float denoise;
|
||||
static float sharpen;
|
||||
|
||||
static VdpDecoder decoder;
|
||||
static int decoder_max_refs;
|
||||
|
@ -171,6 +178,9 @@ static void video_to_output_surface(void)
|
|||
&dummy);
|
||||
CHECK_ST_WARNING("Error when calling vdp_presentation_queue_block_until_surface_idle")
|
||||
|
||||
// we would need to provide past and future frames to allow deinterlacing,
|
||||
// which is not really possible currently. Deinterlacing is supposed to fall
|
||||
// back to bob deinterlacing, but that seems not to work either.
|
||||
vdp_st = vdp_video_mixer_render(video_mixer, VDP_INVALID_HANDLE, 0,
|
||||
VDP_VIDEO_MIXER_PICTURE_STRUCTURE_FRAME,
|
||||
0, NULL, surface_render[vid_surface_num].surface, 0, NULL, &src_rect_vid,
|
||||
|
@ -254,6 +264,10 @@ static int win_x11_init_vdpau_procs(void)
|
|||
{VDP_FUNC_ID_VIDEO_MIXER_CREATE, &vdp_video_mixer_create},
|
||||
{VDP_FUNC_ID_VIDEO_MIXER_DESTROY, &vdp_video_mixer_destroy},
|
||||
{VDP_FUNC_ID_VIDEO_MIXER_RENDER, &vdp_video_mixer_render},
|
||||
{VDP_FUNC_ID_VIDEO_MIXER_SET_FEATURE_ENABLES,
|
||||
&vdp_video_mixer_set_feature_enables},
|
||||
{VDP_FUNC_ID_VIDEO_MIXER_SET_ATTRIBUTE_VALUES,
|
||||
&vdp_video_mixer_set_attribute_values},
|
||||
{VDP_FUNC_ID_PRESENTATION_QUEUE_TARGET_DESTROY,
|
||||
&vdp_presentation_queue_target_destroy},
|
||||
{VDP_FUNC_ID_PRESENTATION_QUEUE_CREATE, &vdp_presentation_queue_create},
|
||||
|
@ -310,7 +324,16 @@ static int win_x11_init_vdpau_flip_queue(void)
|
|||
|
||||
static int create_vdp_mixer(VdpChromaType vdp_chroma_type) {
|
||||
#define VDP_NUM_MIXER_PARAMETER 3
|
||||
#define MAX_NUM_FEATURES 5
|
||||
int i;
|
||||
VdpStatus vdp_st;
|
||||
int feature_count = 0;
|
||||
VdpVideoMixerFeature features[MAX_NUM_FEATURES];
|
||||
VdpBool feature_enables[MAX_NUM_FEATURES];
|
||||
static const denoise_attrib[] = {VDP_VIDEO_MIXER_ATTRIBUTE_NOISE_REDUCTION_LEVEL};
|
||||
const void * const denoise_value[] = {&denoise};
|
||||
static const sharpen_attrib[] = {VDP_VIDEO_MIXER_ATTRIBUTE_SHARPNESS_LEVEL};
|
||||
const void * const sharpen_value[] = {&sharpen};
|
||||
static const VdpVideoMixerParameter parameters[VDP_NUM_MIXER_PARAMETER] = {
|
||||
VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_WIDTH,
|
||||
VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_HEIGHT,
|
||||
|
@ -321,13 +344,31 @@ static int create_vdp_mixer(VdpChromaType vdp_chroma_type) {
|
|||
&vid_height,
|
||||
&vdp_chroma_type
|
||||
};
|
||||
if (deint == 1)
|
||||
features[feature_count++] = VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL;
|
||||
if (deint == 2)
|
||||
features[feature_count++] = VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL_SPATIAL;
|
||||
if (pullup)
|
||||
features[feature_count++] = VDP_VIDEO_MIXER_FEATURE_INVERSE_TELECINE;
|
||||
if (denoise)
|
||||
features[feature_count++] = VDP_VIDEO_MIXER_FEATURE_NOISE_REDUCTION;
|
||||
if (sharpen)
|
||||
features[feature_count++] = VDP_VIDEO_MIXER_FEATURE_SHARPNESS;
|
||||
|
||||
vdp_st = vdp_video_mixer_create(vdp_device, 0, 0,
|
||||
vdp_st = vdp_video_mixer_create(vdp_device, feature_count, features,
|
||||
VDP_NUM_MIXER_PARAMETER,
|
||||
parameters, parameter_values,
|
||||
&video_mixer);
|
||||
CHECK_ST_ERROR("Error when calling vdp_video_mixer_create")
|
||||
|
||||
for (i = 0; i < feature_count; i++) feature_enables[i] = VDP_TRUE;
|
||||
if (feature_count)
|
||||
vdp_video_mixer_set_feature_enables(video_mixer, feature_count, features, feature_enables);
|
||||
if (denoise)
|
||||
vdp_video_mixer_set_attribute_values(video_mixer, 1, denoise_attrib, denoise_value);
|
||||
if (sharpen)
|
||||
vdp_video_mixer_set_attribute_values(video_mixer, 1, sharpen_attrib, sharpen_value);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -711,15 +752,43 @@ static void uninit(void)
|
|||
dlclose(vdpau_lib_handle);
|
||||
}
|
||||
|
||||
static opt_t subopts[] = {
|
||||
{"deint", OPT_ARG_INT, &deint, (opt_test_f)int_non_neg},
|
||||
{"pullup", OPT_ARG_BOOL, &pullup, NULL},
|
||||
{"denoise", OPT_ARG_FLOAT, &denoise, NULL},
|
||||
{"sharpen", OPT_ARG_FLOAT, &sharpen, NULL},
|
||||
{NULL}
|
||||
};
|
||||
|
||||
static const char help_msg[] =
|
||||
"\n-vo vdpau command line help:\n"
|
||||
"Example: mplayer -vo vdpau:deint=2\n"
|
||||
"\nOptions:\n"
|
||||
" deint\n"
|
||||
" 0: no deinterlacing\n"
|
||||
" 1: temporal deinterlacing (not yet working)\n"
|
||||
" 2: temporal-spatial deinterlacing (not yet working)\n"
|
||||
" pullup\n"
|
||||
" Try to apply inverse-telecine (needs deinterlacing, not working)\n"
|
||||
" denoise\n"
|
||||
" Apply denoising, argument is strength from 0.0 to 1.0\n"
|
||||
" sharpen\n"
|
||||
" Apply sharpening or softening, argument is strength from -1.0 to 1.0\n"
|
||||
;
|
||||
|
||||
static int preinit(const char *arg)
|
||||
{
|
||||
int i;
|
||||
static const char *vdpaulibrary = "libvdpau.so.1";
|
||||
static const char *vdpau_device_create = "vdp_device_create_x11";
|
||||
|
||||
if (arg) {
|
||||
mp_msg(MSGT_VO, MSGL_ERR, "[vdpau] Unknown subdevice: %s\n", arg);
|
||||
return ENOSYS;
|
||||
deint = 0;
|
||||
pullup = 0;
|
||||
denoise = 0;
|
||||
sharpen = 0;
|
||||
if (subopt_parse(arg, subopts) != 0) {
|
||||
mp_msg(MSGT_VO, MSGL_FATAL, help_msg);
|
||||
return -1;
|
||||
}
|
||||
|
||||
vdpau_lib_handle = dlopen(vdpaulibrary, RTLD_LAZY);
|
||||
|
|
370
libvo/vo_xvmc.c
370
libvo/vo_xvmc.c
|
@ -42,6 +42,7 @@
|
|||
#include <X11/extensions/XvMClib.h>
|
||||
|
||||
#include "x11_common.h"
|
||||
#include "libavcodec/avcodec.h"
|
||||
#include "libavcodec/xvmc.h"
|
||||
|
||||
#include "sub.h"
|
||||
|
@ -61,7 +62,6 @@
|
|||
|
||||
#define UNUSED(x) ((void)(x))
|
||||
|
||||
#include "libavcodec/avcodec.h"
|
||||
#if LIBAVCODEC_BUILD < ((51<<16)+(40<<8)+2)
|
||||
#error You need at least libavcodecs v51.40.2
|
||||
#endif
|
||||
|
@ -162,7 +162,7 @@ static void allocate_xvimage(int xvimage_width,int xvimage_height,int xv_format)
|
|||
else
|
||||
{
|
||||
Shmem_Flag = 0;
|
||||
mp_msg(MSGT_VO,MSGL_INFO, "Shared memory not supported\nReverting to normal Xv\n" );
|
||||
mp_msg(MSGT_VO,MSGL_WARN, "Shared memory not supported\nReverting to normal Xv\n" );
|
||||
}
|
||||
if ( Shmem_Flag )
|
||||
{
|
||||
|
@ -225,95 +225,92 @@ return -1;//fail
|
|||
|
||||
//print all info needed to add new format
|
||||
static void print_xvimage_format_values(XvImageFormatValues *xifv){
|
||||
int i;
|
||||
printf("Format_ID = 0x%X\n",xifv->id);
|
||||
int i;
|
||||
const msgl=MSGL_DBG4;
|
||||
|
||||
printf(" type = ");
|
||||
if(xifv->type == XvRGB) printf("RGB\n");
|
||||
else if(xifv->type == XvYUV) printf("YUV\n");
|
||||
else printf("Unknown\n");
|
||||
mp_msg(MSGT_VO,msgl,"Format_ID = 0x%X\n",xifv->id);
|
||||
|
||||
printf(" byte_order = ");
|
||||
if(xifv->byte_order == LSBFirst) printf("LSB First\n");
|
||||
else if(xifv->type == MSBFirst) printf("MSB First\n");
|
||||
else printf("Unknown\n");//yes Linux support other types too
|
||||
mp_msg(MSGT_VO,msgl," type = ");
|
||||
if(xifv->type == XvRGB) mp_msg(MSGT_VO,msgl,"RGB\n");
|
||||
else if(xifv->type == XvYUV) mp_msg(MSGT_VO,msgl,"YUV\n");
|
||||
else mp_msg(MSGT_VO,msgl,"Unknown\n");
|
||||
|
||||
printf(" guid = ");
|
||||
mp_msg(MSGT_VO,msgl," byte_order = ");
|
||||
if(xifv->byte_order == LSBFirst) mp_msg(MSGT_VO,msgl,"LSB First\n");
|
||||
else if(xifv->type == MSBFirst) mp_msg(MSGT_VO,msgl,"MSB First\n");
|
||||
else mp_msg(MSGT_VO,msgl,"Unknown\n");//yes Linux support other types too
|
||||
|
||||
mp_msg(MSGT_VO,msgl," guid = ");
|
||||
for(i=0;i<16;i++)
|
||||
printf("%02X ",(unsigned char)xifv->guid[i]);
|
||||
printf("\n");
|
||||
mp_msg(MSGT_VO,msgl,"%02X ",(unsigned char)xifv->guid[i]);
|
||||
mp_msg(MSGT_VO,msgl,"\n");
|
||||
|
||||
printf(" bits_per_pixel = %d\n",xifv->bits_per_pixel);
|
||||
mp_msg(MSGT_VO,msgl," bits_per_pixel = %d\n",xifv->bits_per_pixel);
|
||||
|
||||
printf(" format = ");
|
||||
if(xifv->format == XvPacked) printf("XvPacked\n");
|
||||
else if(xifv->format == XvPlanar) printf("XvPlanar\n");
|
||||
else printf("Unknown\n");
|
||||
mp_msg(MSGT_VO,msgl," format = ");
|
||||
if(xifv->format == XvPacked) mp_msg(MSGT_VO,msgl,"XvPacked\n");
|
||||
else if(xifv->format == XvPlanar) mp_msg(MSGT_VO,msgl,"XvPlanar\n");
|
||||
else mp_msg(MSGT_VO,msgl,"Unknown\n");
|
||||
|
||||
printf(" num_planes = %d\n",xifv->num_planes);
|
||||
mp_msg(MSGT_VO,msgl," num_planes = %d\n",xifv->num_planes);
|
||||
|
||||
if(xifv->type == XvRGB){
|
||||
printf(" red_mask = %0X\n", xifv->red_mask);
|
||||
printf(" green_mask = %0X\n",xifv->green_mask);
|
||||
printf(" blue_mask = %0X\n", xifv->blue_mask);
|
||||
mp_msg(MSGT_VO,msgl," red_mask = %0X\n", xifv->red_mask);
|
||||
mp_msg(MSGT_VO,msgl," green_mask = %0X\n",xifv->green_mask);
|
||||
mp_msg(MSGT_VO,msgl," blue_mask = %0X\n", xifv->blue_mask);
|
||||
}
|
||||
if(xifv->type == XvYUV){
|
||||
printf(" y_sample_bits = %d\n u_sample_bits = %d\n v_sample_bits = %d\n",
|
||||
mp_msg(MSGT_VO,msgl," y_sample_bits = %d\n u_sample_bits = %d\n v_sample_bits = %d\n",
|
||||
xifv->y_sample_bits,xifv->u_sample_bits,xifv->v_sample_bits);
|
||||
printf(" horz_y_period = %d\n horz_u_period = %d\n horz_v_period = %d\n",
|
||||
mp_msg(MSGT_VO,msgl," horz_y_period = %d\n horz_u_period = %d\n horz_v_period = %d\n",
|
||||
xifv->horz_y_period,xifv->horz_u_period,xifv->horz_v_period);
|
||||
printf(" vert_y_period = %d\n vert_u_period = %d\n vert_v_period = %d\n",
|
||||
mp_msg(MSGT_VO,msgl," vert_y_period = %d\n vert_u_period = %d\n vert_v_period = %d\n",
|
||||
xifv->vert_y_period,xifv->vert_u_period,xifv->vert_v_period);
|
||||
|
||||
printf(" component_order = ");
|
||||
mp_msg(MSGT_VO,msgl," component_order = ");
|
||||
for(i=0;i<32;i++)
|
||||
if(xifv->component_order[i]>=32)
|
||||
printf("%c",xifv->component_order[i]);
|
||||
printf("\n");
|
||||
mp_msg(MSGT_VO,msgl,"%c",xifv->component_order[i]);
|
||||
mp_msg(MSGT_VO,msgl,"\n");
|
||||
|
||||
printf(" scanline = ");
|
||||
if(xifv->scanline_order == XvTopToBottom) printf("XvTopToBottom\n");
|
||||
else if(xifv->scanline_order == XvBottomToTop) printf("XvBottomToTop\n");
|
||||
else printf("Unknown\n");
|
||||
mp_msg(MSGT_VO,msgl," scanline = ");
|
||||
if(xifv->scanline_order == XvTopToBottom) mp_msg(MSGT_VO,msgl,"XvTopToBottom\n");
|
||||
else if(xifv->scanline_order == XvBottomToTop) mp_msg(MSGT_VO,msgl,"XvBottomToTop\n");
|
||||
else mp_msg(MSGT_VO,msgl,"Unknown\n");
|
||||
}
|
||||
printf("\n");
|
||||
mp_msg(MSGT_VO,msgl,"\n");
|
||||
}
|
||||
|
||||
// WARNING This function may changes xv_port and surface_info!
|
||||
static int xvmc_find_surface_by_format(int format,int width,int height,
|
||||
XvMCSurfaceInfo * surf_info,int query){
|
||||
int rez;
|
||||
XvAdaptorInfo * ai;
|
||||
int num_adaptors,i;
|
||||
unsigned long p;
|
||||
int s,mc_surf_num;
|
||||
XvMCSurfaceInfo * mc_surf_list;
|
||||
int rez;
|
||||
XvAdaptorInfo * ai;
|
||||
int num_adaptors,i;
|
||||
unsigned long p;
|
||||
int s,mc_surf_num;
|
||||
XvMCSurfaceInfo * mc_surf_list;
|
||||
|
||||
rez = XvQueryAdaptors(mDisplay,DefaultRootWindow(mDisplay),&num_adaptors,&ai);
|
||||
if( rez != Success ) return -1;
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG3) ) {
|
||||
printf("vo_xvmc: Querying %d adaptors\n",num_adaptors); }
|
||||
mp_msg(MSGT_VO,MSGL_DBG3,"vo_xvmc: Querying %d adaptors\n",num_adaptors);
|
||||
for(i=0; i<num_adaptors; i++)
|
||||
{
|
||||
/* check if adaptor number has been specified */
|
||||
if (xv_adaptor != -1 && xv_adaptor != i)
|
||||
continue;
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG3) ) {
|
||||
printf("vo_xvmc: Quering adaptor #%d\n",i); }
|
||||
mp_msg(MSGT_VO,MSGL_DBG3,"vo_xvmc: Quering adaptor #%d\n",i);
|
||||
if( ai[i].type == 0 ) continue;// we need at least dummy type!
|
||||
//probing ports
|
||||
for(p=ai[i].base_id; p<ai[i].base_id+ai[i].num_ports; p++)
|
||||
{
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG3) ) {
|
||||
printf("vo_xvmc: probing port #%ld\n",p); }
|
||||
mp_msg(MSGT_VO,MSGL_DBG3,"vo_xvmc: probing port #%ld\n",p);
|
||||
mc_surf_list = XvMCListSurfaceTypes(mDisplay,p,&mc_surf_num);
|
||||
if( mc_surf_list == NULL || mc_surf_num == 0){
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG3) ) {
|
||||
printf("vo_xvmc: No XvMC supported. \n"); }
|
||||
mp_msg(MSGT_VO,MSGL_DBG3,"vo_xvmc: No XvMC supported. \n");
|
||||
continue;
|
||||
}
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG3) ) {
|
||||
printf("vo_xvmc: XvMC list have %d surfaces\n",mc_surf_num); }
|
||||
mp_msg(MSGT_VO,MSGL_DBG3,"vo_xvmc: XvMC list have %d surfaces\n",mc_surf_num);
|
||||
//we have XvMC list!
|
||||
for(s=0; s<mc_surf_num; s++)
|
||||
{
|
||||
|
@ -330,12 +327,11 @@ XvMCSurfaceInfo * mc_surf_list;
|
|||
if(!query){
|
||||
rez = XvGrabPort(mDisplay,p,CurrentTime);
|
||||
if(rez != Success){
|
||||
if ( mp_msg_test(MSGT_VO,MSGL_DBG3) ) {
|
||||
printf("vo_xvmc: Fail to grab port %ld\n",p); }
|
||||
mp_msg(MSGT_VO,MSGL_DBG3,"vo_xvmc: Fail to grab port %ld\n",p);
|
||||
continue;
|
||||
}
|
||||
printf("vo_xvmc: Using Xv Adaptor #%d (%s)\n", i, ai[i].name);
|
||||
printf("vo_xvmc: Port %ld grabed\n",p);
|
||||
mp_msg(MSGT_VO,MSGL_INFO,"vo_xvmc: Using Xv Adaptor #%d (%s)\n", i, ai[i].name);
|
||||
mp_msg(MSGT_VO,MSGL_INFO,"vo_xvmc: Port %ld grabed\n",p);
|
||||
xv_port = p;
|
||||
}
|
||||
goto surface_found;
|
||||
|
@ -345,7 +341,7 @@ XvMCSurfaceInfo * mc_surf_list;
|
|||
}//for adaptors
|
||||
XvFreeAdaptorInfo(ai);
|
||||
|
||||
if(!query) printf("vo_xvmc: Could not find free matching surface. Sorry.\n");
|
||||
if(!query) mp_msg(MSGT_VO,MSGL_ERR,"vo_xvmc: Could not find free matching surface. Sorry.\n");
|
||||
return 0;
|
||||
|
||||
// somebody know cleaner way to escape from 3 internal loops?
|
||||
|
@ -353,8 +349,8 @@ surface_found:
|
|||
XvFreeAdaptorInfo(ai);
|
||||
|
||||
memcpy(surf_info,&mc_surf_list[s],sizeof(XvMCSurfaceInfo));
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG3) || !query)
|
||||
printf("vo_xvmc: Found matching surface with id=%X on %ld port at %d adapter\n",
|
||||
mp_msg(MSGT_VO, query?MSGL_INFO:MSGL_DBG3,
|
||||
"vo_xvmc: Found matching surface with id=%X on %ld port at %d adapter\n",
|
||||
mc_surf_list[s].surface_type_id,p,i);
|
||||
return mc_surf_list[s].surface_type_id;
|
||||
}
|
||||
|
@ -369,8 +365,7 @@ static uint32_t xvmc_draw_image(mp_image_t *mpi){
|
|||
rndr = (struct xvmc_pix_fmt*)mpi->priv; //there is copy in plane[2]
|
||||
assert( rndr != NULL );
|
||||
assert( rndr->xvmc_id == AV_XVMC_ID );
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG4) )
|
||||
printf("vo_xvmc: draw_image(show rndr=%p)\n",rndr);
|
||||
mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc: draw_image(show rndr=%p)\n",rndr);
|
||||
// the surface have passed vf system without been skiped, it will be displayed
|
||||
rndr->state |= AV_XVMC_STATE_DISPLAY_PENDING;
|
||||
p_render_surface_to_show = rndr;
|
||||
|
@ -379,13 +374,13 @@ static uint32_t xvmc_draw_image(mp_image_t *mpi){
|
|||
}
|
||||
|
||||
static int preinit(const char *arg){
|
||||
int xv_version,xv_release,xv_request_base,xv_event_base,xv_error_base;
|
||||
int mc_eventBase,mc_errorBase;
|
||||
int mc_ver,mc_rev;
|
||||
strarg_t ck_src_arg = { 0, NULL };
|
||||
strarg_t ck_method_arg = { 0, NULL };
|
||||
opt_t subopts [] =
|
||||
{
|
||||
int xv_version,xv_release,xv_request_base,xv_event_base,xv_error_base;
|
||||
int mc_eventBase,mc_errorBase;
|
||||
int mc_ver,mc_rev;
|
||||
strarg_t ck_src_arg = { 0, NULL };
|
||||
strarg_t ck_method_arg = { 0, NULL };
|
||||
opt_t subopts [] =
|
||||
{
|
||||
/* name arg type arg var test */
|
||||
{ "port", OPT_ARG_INT, &xv_port_request, (opt_test_f)int_pos },
|
||||
{ "adaptor", OPT_ARG_INT, &xv_adaptor, (opt_test_f)int_non_neg },
|
||||
|
@ -396,7 +391,7 @@ opt_t subopts [] =
|
|||
{ "queue", OPT_ARG_BOOL, &use_queue, NULL },
|
||||
{ "bobdeint", OPT_ARG_BOOL, &bob_deinterlace, NULL },
|
||||
{ NULL }
|
||||
};
|
||||
};
|
||||
|
||||
//Obtain display handler
|
||||
if (!vo_init()) return -1;//vo_xv
|
||||
|
@ -408,20 +403,20 @@ opt_t subopts [] =
|
|||
mp_msg(MSGT_VO,MSGL_ERR,"********** Try with -vo x11 or -vo sdl ***********\n");
|
||||
return -1;
|
||||
}
|
||||
printf("vo_xvmc: X-Video extension %d.%d\n",xv_version,xv_release);
|
||||
mp_msg(MSGT_VO,MSGL_INFO,"vo_xvmc: X-Video extension %d.%d\n",xv_version,xv_release);
|
||||
|
||||
if( True != XvMCQueryExtension(mDisplay,&mc_eventBase,&mc_errorBase) ){
|
||||
printf("vo_xvmc: No X-Video MotionCompensation Extension on %s\n",
|
||||
mp_msg(MSGT_VO,MSGL_ERR,"vo_xvmc: No X-Video MotionCompensation Extension on %s\n",
|
||||
XDisplayName(NULL));
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(Success == XvMCQueryVersion(mDisplay, &mc_ver, &mc_rev) ){
|
||||
printf("vo_xvmc: X-Video MotionCompensation Extension version %i.%i\n",
|
||||
mp_msg(MSGT_VO,MSGL_INFO,"vo_xvmc: X-Video MotionCompensation Extension version %i.%i\n",
|
||||
mc_ver,mc_rev);
|
||||
}
|
||||
else{
|
||||
printf("vo_xvmc: Error querying version info!\n");
|
||||
mp_msg(MSGT_VO,MSGL_ERR,"vo_xvmc: Error querying version info!\n");
|
||||
return -1;
|
||||
}
|
||||
surface_render = NULL;
|
||||
|
@ -448,17 +443,17 @@ opt_t subopts [] =
|
|||
static int config(uint32_t width, uint32_t height,
|
||||
uint32_t d_width, uint32_t d_height,
|
||||
uint32_t flags, char *title, uint32_t format){
|
||||
int i,mode_id,rez;
|
||||
int numblocks,blocks_per_macroblock;//bpmb we have 6,8,12
|
||||
int i,mode_id,rez;
|
||||
int numblocks,blocks_per_macroblock;//bpmb we have 6,8,12
|
||||
|
||||
//from vo_xv
|
||||
XVisualInfo vinfo;
|
||||
XSetWindowAttributes xswa;
|
||||
XWindowAttributes attribs;
|
||||
unsigned long xswamask;
|
||||
int depth;
|
||||
XVisualInfo vinfo;
|
||||
XSetWindowAttributes xswa;
|
||||
XWindowAttributes attribs;
|
||||
unsigned long xswamask;
|
||||
int depth;
|
||||
#ifdef CONFIG_XF86VM
|
||||
int vm = flags & VOFLAG_MODESWITCHING;
|
||||
int vm = flags & VOFLAG_MODESWITCHING;
|
||||
#endif
|
||||
//end of vo_xv
|
||||
|
||||
|
@ -486,13 +481,13 @@ int vm = flags & VOFLAG_MODESWITCHING;
|
|||
|
||||
rez = XvMCCreateContext(mDisplay, xv_port,mode_id,width,height,XVMC_DIRECT,&ctx);
|
||||
if( rez != Success ){
|
||||
printf("vo_xvmc: XvMCCreateContext failed with error %d\n",rez);
|
||||
mp_msg(MSGT_VO,MSGL_ERR,"vo_xvmc: XvMCCreateContext failed with error %d\n",rez);
|
||||
return -1;
|
||||
}
|
||||
if( ctx.flags & XVMC_DIRECT ){
|
||||
printf("vo_xvmc: Allocated Direct Context\n");
|
||||
mp_msg(MSGT_VO,MSGL_INFO,"vo_xvmc: Allocated Direct Context\n");
|
||||
}else{
|
||||
printf("vo_xvmc: Allocated Indirect Context!\n");
|
||||
mp_msg(MSGT_VO,MSGL_INFO,"vo_xvmc: Allocated Indirect Context!\n");
|
||||
}
|
||||
|
||||
|
||||
|
@ -507,7 +502,7 @@ int vm = flags & VOFLAG_MODESWITCHING;
|
|||
XvMCDestroyContext(mDisplay,&ctx);
|
||||
return -1;
|
||||
}
|
||||
printf("vo_xvmc: data_blocks allocated\n");
|
||||
mp_msg(MSGT_VO,MSGL_INFO,"vo_xvmc: data_blocks allocated\n");
|
||||
|
||||
rez = XvMCCreateMacroBlocks(mDisplay,&ctx,numblocks,&mv_blocks);
|
||||
if( rez != Success ){
|
||||
|
@ -515,7 +510,7 @@ int vm = flags & VOFLAG_MODESWITCHING;
|
|||
XvMCDestroyContext(mDisplay,&ctx);
|
||||
return -1;
|
||||
}
|
||||
printf("vo_xvmc: mv_blocks allocated\n");
|
||||
mp_msg(MSGT_VO,MSGL_INFO,"vo_xvmc: mv_blocks allocated\n");
|
||||
|
||||
if(surface_render==NULL)
|
||||
surface_render = malloc(MAX_SURFACES * sizeof(struct xvmc_pix_fmt)); //easy mem debug
|
||||
|
@ -533,25 +528,25 @@ int vm = flags & VOFLAG_MODESWITCHING;
|
|||
surface_render[i].idct = (surface_info.mc_type & XVMC_IDCT) == XVMC_IDCT;
|
||||
surface_render[i].unsigned_intra = (surface_info.flags & XVMC_INTRA_UNSIGNED) == XVMC_INTRA_UNSIGNED;
|
||||
surface_render[i].p_surface = &surface_array[i];
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG4) )
|
||||
printf("vo_xvmc: surface[%d] = %p .rndr=%p\n",i,&surface_array[i], &surface_render[i]);
|
||||
mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc: surface[%d] = %p .rndr=%p\n",
|
||||
i,&surface_array[i], &surface_render[i]);
|
||||
}
|
||||
number_of_surfaces = i;
|
||||
if( number_of_surfaces < 4 ){// +2 I or P and +2 for B (to avoid visible motion drawing)
|
||||
printf("vo_xvmc: Unable to allocate at least 4 Surfaces\n");
|
||||
mp_msg(MSGT_VO,MSGL_ERR,"vo_xvmc: Unable to allocate at least 4 Surfaces\n");
|
||||
uninit();
|
||||
return -1;
|
||||
}
|
||||
printf("vo_xvmc: Motion Compensation context allocated - %d surfaces\n",
|
||||
mp_msg(MSGT_VO,MSGL_INFO,"vo_xvmc: Motion Compensation context allocated - %d surfaces\n",
|
||||
number_of_surfaces);
|
||||
|
||||
//debug
|
||||
printf("vo_xvmc: idct=%d unsigned_intra=%d\n",
|
||||
mp_msg(MSGT_VO,MSGL_INFO,"vo_xvmc: idct=%d unsigned_intra=%d\n",
|
||||
(surface_info.mc_type & XVMC_IDCT) == XVMC_IDCT,
|
||||
(surface_info.flags & XVMC_INTRA_UNSIGNED) == XVMC_INTRA_UNSIGNED);
|
||||
|
||||
// Find way to display OSD & subtitle
|
||||
printf("vo_xvmc: looking for OSD support\n");
|
||||
mp_msg(MSGT_VO,MSGL_INFO,"vo_xvmc: looking for OSD support\n");
|
||||
subpicture_mode = NO_SUBPICTURE;
|
||||
if(surface_info.flags & XVMC_OVERLAID_SURFACE)
|
||||
subpicture_mode = OVERLAY_SUBPICTURE;
|
||||
|
@ -580,7 +575,7 @@ int vm = flags & VOFLAG_MODESWITCHING;
|
|||
|
||||
subpicture_mode = BLEND_SUBPICTURE;
|
||||
subpicture_info = xvfmv[s];
|
||||
printf(" Subpicture id 0x%08X\n",subpicture_info.id);
|
||||
mp_msg(MSGT_VO,MSGL_INFO," Subpicture id 0x%08X\n",subpicture_info.id);
|
||||
goto found_subpic;
|
||||
}
|
||||
}
|
||||
|
@ -599,18 +594,18 @@ found_subpic:
|
|||
|
||||
switch(subpicture_mode){
|
||||
case NO_SUBPICTURE:
|
||||
printf("vo_xvmc: No OSD support for this mode\n");
|
||||
mp_msg(MSGT_VO,MSGL_WARN,"vo_xvmc: No OSD support for this mode\n");
|
||||
break;
|
||||
case OVERLAY_SUBPICTURE:
|
||||
printf("vo_xvmc: OSD support via color key tricks\n");
|
||||
printf("vo_xvmc: not yet implemented:(\n");
|
||||
mp_msg(MSGT_VO,MSGL_WARN,"vo_xvmc: OSD support via color key tricks\n");
|
||||
mp_msg(MSGT_VO,MSGL_WARN,"vo_xvmc: not yet implemented:(\n");
|
||||
break;
|
||||
case BLEND_SUBPICTURE:
|
||||
printf("vo_xvmc: OSD support by additional frontend rendering\n");
|
||||
mp_msg(MSGT_VO,MSGL_INFO,"vo_xvmc: OSD support by additional frontend rendering\n");
|
||||
break;
|
||||
case BACKEND_SUBPICTURE:
|
||||
printf("vo_xvmc: OSD support by backend rendering (fast)\n");
|
||||
printf("vo_xvmc: Please send feedback to confirm that it works,otherwise send bugreport!\n");
|
||||
mp_msg(MSGT_VO,MSGL_INFO,"vo_xvmc: OSD support by backend rendering (fast)\n");
|
||||
mp_msg(MSGT_VO,MSGL_INFO,"vo_xvmc: Please send feedback to confirm that it works,otherwise send bugreport!\n");
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -639,7 +634,7 @@ skip_surface_allocation:
|
|||
{
|
||||
vo_vm_switch();
|
||||
}
|
||||
else
|
||||
// else
|
||||
#endif
|
||||
XGetWindowAttributes(mDisplay, DefaultRootWindow(mDisplay), &attribs);
|
||||
depth=attribs.depth;
|
||||
|
@ -720,28 +715,28 @@ static void init_osd_yuv_pal(void) {
|
|||
}
|
||||
rez = XvMCSetSubpicturePalette(mDisplay, &subpicture, palette);
|
||||
if(rez!=Success){
|
||||
printf("vo_xvmc: Setting palette failed.\n");
|
||||
mp_msg(MSGT_VO,MSGL_ERR,"vo_xvmc: Setting palette failed.\n");
|
||||
}
|
||||
free(palette);
|
||||
}
|
||||
}
|
||||
|
||||
static void clear_osd_subpic(int x0, int y0, int w, int h){
|
||||
int rez;
|
||||
int rez;
|
||||
|
||||
rez=XvMCClearSubpicture(mDisplay, &subpicture,
|
||||
x0, y0, w,h,
|
||||
subpicture_clear_color);
|
||||
if(rez != Success)
|
||||
printf("vo_xvmc: XvMCClearSubpicture failed!\n");
|
||||
mp_msg(MSGT_VO,MSGL_ERR,"vo_xvmc: XvMCClearSubpicture failed!\n");
|
||||
}
|
||||
|
||||
static void OSD_init(void) {
|
||||
unsigned short osd_height, osd_width;
|
||||
int rez;
|
||||
unsigned short osd_height, osd_width;
|
||||
int rez;
|
||||
|
||||
if(subpicture_alloc){
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG4) )
|
||||
printf("vo_xvmc: destroying subpicture\n");
|
||||
mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc: destroying subpicture\n");
|
||||
XvMCDestroySubpicture(mDisplay,&subpicture);
|
||||
deallocate_xvimage();
|
||||
subpicture_alloc = 0;
|
||||
|
@ -763,37 +758,35 @@ int rez;
|
|||
if(osd_width == 0 || osd_height == 0)
|
||||
return;//if called before window size is known
|
||||
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG4) )
|
||||
printf("vo_xvmc: creating subpicture (%d,%d) format %X\n",
|
||||
mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc: creating subpicture (%d,%d) format %X\n",
|
||||
osd_width,osd_height,subpicture_info.id);
|
||||
|
||||
rez = XvMCCreateSubpicture(mDisplay,&ctx,&subpicture,
|
||||
osd_width,osd_height,subpicture_info.id);
|
||||
if(rez != Success){
|
||||
subpicture_mode = NO_SUBPICTURE;
|
||||
printf("vo_xvmc: Create Subpicture failed, OSD disabled\n");
|
||||
mp_msg(MSGT_VO,MSGL_WARN,"vo_xvmc: Create Subpicture failed, OSD disabled\n");
|
||||
return;
|
||||
}
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG4) ){
|
||||
int i;
|
||||
printf("vo_xvmc: Created Subpicture:\n");
|
||||
printf(" xvimage_id=0x%X\n",subpicture.xvimage_id);
|
||||
printf(" width=%d\n",subpicture.width);
|
||||
printf(" height=%d\n",subpicture.height);
|
||||
printf(" num_palette_entries=0x%X\n",subpicture.num_palette_entries);
|
||||
printf(" entry_bytes=0x%X\n",subpicture.entry_bytes);
|
||||
mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc: Created Subpicture:\n");
|
||||
mp_msg(MSGT_VO,MSGL_DBG4," xvimage_id=0x%X\n",subpicture.xvimage_id);
|
||||
mp_msg(MSGT_VO,MSGL_DBG4," width=%d\n",subpicture.width);
|
||||
mp_msg(MSGT_VO,MSGL_DBG4," height=%d\n",subpicture.height);
|
||||
mp_msg(MSGT_VO,MSGL_DBG4," num_palette_entries=0x%X\n",subpicture.num_palette_entries);
|
||||
mp_msg(MSGT_VO,MSGL_DBG4," entry_bytes=0x%X\n",subpicture.entry_bytes);
|
||||
|
||||
printf(" component_order=\"");
|
||||
mp_msg(MSGT_VO,MSGL_DBG4," component_order=\"");
|
||||
for(i=0; i<4; i++)
|
||||
if(subpicture.component_order[i] >= 32)
|
||||
printf("%c", subpicture.component_order[i]);
|
||||
printf("\"\n");
|
||||
mp_msg(MSGT_VO,MSGL_DBG4,"%c", subpicture.component_order[i]);
|
||||
mp_msg(MSGT_VO,MSGL_DBG4,"\"\n");
|
||||
}
|
||||
|
||||
//call init for the surface type
|
||||
init_osd_fnc();//init palete,clear color etc ...
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG4) )
|
||||
printf("vo_xvmc: clearing subpicture\n");
|
||||
mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc: clearing subpicture\n");
|
||||
clear_osd_fnc(0, 0, subpicture.width, subpicture.height);
|
||||
|
||||
allocate_xvimage(subpicture.width, subpicture.height, subpicture_info.id);
|
||||
|
@ -801,11 +794,10 @@ int rez;
|
|||
}
|
||||
|
||||
static void draw_osd_IA44(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride){
|
||||
int ox,oy;
|
||||
int rez;
|
||||
int ox,oy;
|
||||
int rez;
|
||||
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG4) )
|
||||
printf("vo_xvmc:composite AI44 subpicture (%d,%d - %d,%d)\n",x0,y0,w,h);
|
||||
mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc:composite AI44 subpicture (%d,%d - %d,%d)\n",x0,y0,w,h);
|
||||
|
||||
for(ox=0; ox<w; ox++){
|
||||
for(oy=0; oy<h; oy++){
|
||||
|
@ -815,16 +807,16 @@ int rez;
|
|||
rez = XvMCCompositeSubpicture(mDisplay, &subpicture, xvimage, 0, 0,
|
||||
w,h,x0,y0);
|
||||
if(rez != Success){
|
||||
printf("vo_xvmc: composite subpicture failed\n");
|
||||
mp_msg(MSGT_VO,MSGL_WARN,"vo_xvmc: composite subpicture failed\n");
|
||||
assert(0);
|
||||
}
|
||||
}
|
||||
|
||||
static void draw_osd_AI44(int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride){
|
||||
int ox,oy;
|
||||
int rez;
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG4) )
|
||||
printf("vo_xvmc:composite AI44 subpicture (%d,%d - %d,%d)\n",x0,y0,w,h);
|
||||
int ox,oy;
|
||||
int rez;
|
||||
|
||||
mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc:composite AI44 subpicture (%d,%d - %d,%d)\n",x0,y0,w,h);
|
||||
|
||||
for(ox=0; ox<w; ox++){
|
||||
for(oy=0; oy<h; oy++){
|
||||
|
@ -834,19 +826,18 @@ int rez;
|
|||
rez = XvMCCompositeSubpicture(mDisplay, &subpicture, xvimage, 0, 0,
|
||||
w,h,x0,y0);
|
||||
if(rez != Success){
|
||||
printf("vo_xvmc: composite subpicture failed\n");
|
||||
mp_msg(MSGT_VO,MSGL_WARN,"vo_xvmc: composite subpicture failed\n");
|
||||
assert(0);
|
||||
}
|
||||
}
|
||||
|
||||
static void draw_osd(void){
|
||||
struct xvmc_pix_fmt *osd_rndr;
|
||||
int osd_has_changed;
|
||||
int have_osd_to_draw;
|
||||
int rez;
|
||||
struct xvmc_pix_fmt *osd_rndr;
|
||||
int osd_has_changed;
|
||||
int have_osd_to_draw;
|
||||
int rez;
|
||||
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG4) )
|
||||
printf("vo_xvmc: draw_osd ,OSD_mode=%d, surface_to_show=%p\n",
|
||||
mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc: draw_osd ,OSD_mode=%d, surface_to_show=%p\n",
|
||||
subpicture_mode,p_render_surface_to_show);
|
||||
|
||||
if(subpicture_mode == BLEND_SUBPICTURE ||
|
||||
|
@ -882,7 +873,7 @@ int rez;
|
|||
0, 0, subpicture.width, subpicture.height,
|
||||
0, 0, image_width, image_height);
|
||||
if(rez!=Success){
|
||||
printf("vo_xvmc: BlendSubpicture failed rez=%d\n",rez);
|
||||
mp_msg(MSGT_VO,MSGL_WARN,"vo_xvmc: BlendSubpicture failed rez=%d\n",rez);
|
||||
assert(0);
|
||||
return;
|
||||
}
|
||||
|
@ -899,8 +890,7 @@ int rez;
|
|||
p_render_surface_to_show = osd_rndr;
|
||||
p_render_surface_to_show->state = AV_XVMC_STATE_DISPLAY_PENDING;
|
||||
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG4) )
|
||||
printf("vo_xvmc:draw_osd: surface_to_show changed to %p\n",osd_rndr);
|
||||
mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc:draw_osd: surface_to_show changed to %p\n",osd_rndr);
|
||||
}//endof if(BLEND)
|
||||
if(subpicture_mode == BACKEND_SUBPICTURE){
|
||||
rez = XvMCBlendSubpicture(mDisplay,
|
||||
|
@ -915,7 +905,8 @@ int rez;
|
|||
}
|
||||
|
||||
static void xvmc_sync_surface(XvMCSurface * srf){
|
||||
int status,rez;
|
||||
int status,rez;
|
||||
|
||||
rez = XvMCGetSurfaceStatus(mDisplay,srf,&status);
|
||||
assert(rez==Success);
|
||||
if((status & XVMC_RENDERING) == 0)
|
||||
|
@ -936,9 +927,9 @@ int status,rez;
|
|||
|
||||
static void put_xvmc_image(struct xvmc_pix_fmt *p_render_surface,
|
||||
int draw_ck){
|
||||
int rez;
|
||||
struct vo_rect src_rect, dst_rect;
|
||||
int i;
|
||||
int rez;
|
||||
struct vo_rect src_rect, dst_rect;
|
||||
int i;
|
||||
|
||||
if(p_render_surface == NULL)
|
||||
return;
|
||||
|
@ -959,7 +950,7 @@ int i;
|
|||
dst_rect.left, dst_rect.top, dst_rect.width, dst_rect.height,
|
||||
bob_deinterlace ? field : 3);
|
||||
if(rez != Success){
|
||||
printf("vo_xvmc: PutSurface failer, critical error %d!\n",rez);
|
||||
mp_msg(MSGT_VO,MSGL_ERR,"vo_xvmc: PutSurface failer, critical error %d!\n",rez);
|
||||
assert(0);
|
||||
}
|
||||
}
|
||||
|
@ -967,11 +958,9 @@ int i;
|
|||
}
|
||||
|
||||
static void flip_page(void){
|
||||
int i,cfs;
|
||||
int i,cfs;
|
||||
|
||||
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG4) )
|
||||
printf("vo_xvmc: flip_page show(rndr=%p)\n\n",p_render_surface_to_show);
|
||||
mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc: flip_page show(rndr=%p)\n\n",p_render_surface_to_show);
|
||||
|
||||
if(p_render_surface_to_show == NULL) return;
|
||||
assert( p_render_surface_to_show->xvmc_id == AV_XVMC_ID );
|
||||
|
@ -988,8 +977,7 @@ int i,cfs;
|
|||
return;
|
||||
}
|
||||
p_render_surface_to_show=show_queue[0];
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG5) )
|
||||
printf("vo_xvmc: flip_queue free_element=%d\n",free_element);
|
||||
mp_msg(MSGT_VO,MSGL_DBG5,"vo_xvmc: flip_queue free_element=%d\n",free_element);
|
||||
free_element--;
|
||||
for(i=0; i<free_element; i++){
|
||||
show_queue[i] = show_queue[i+1];
|
||||
|
@ -1015,7 +1003,8 @@ int i,cfs;
|
|||
}
|
||||
|
||||
static void check_events(void){
|
||||
int e=vo_x11_check_events(mDisplay);
|
||||
int e=vo_x11_check_events(mDisplay);
|
||||
|
||||
if(e&VO_EVENT_RESIZE)
|
||||
{
|
||||
e |= VO_EVENT_EXPOSE;
|
||||
|
@ -1027,7 +1016,8 @@ int e=vo_x11_check_events(mDisplay);
|
|||
}
|
||||
|
||||
static void xvmc_free(void){
|
||||
int i;
|
||||
int i;
|
||||
|
||||
if( subpicture_alloc ){
|
||||
|
||||
XvMCDestroySubpicture(mDisplay,&subpicture);
|
||||
|
@ -1035,8 +1025,7 @@ int i;
|
|||
|
||||
subpicture_alloc = 0;
|
||||
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG4) )
|
||||
printf("vo_xvmc: subpicture destroyed\n");
|
||||
mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc: subpicture destroyed\n");
|
||||
}
|
||||
|
||||
if( number_of_surfaces ){
|
||||
|
@ -1051,7 +1040,7 @@ int i;
|
|||
|
||||
if( (surface_render[i].state != 0) &&
|
||||
(p_render_surface_visible != &surface_render[i]) )
|
||||
printf("vo_xvmc::uninit surface_render[%d].status=%d\n",i,
|
||||
mp_msg(MSGT_VO,MSGL_INFO,"vo_xvmc::uninit surface_render[%d].status=%d\n",i,
|
||||
surface_render[i].state);
|
||||
}
|
||||
|
||||
|
@ -1061,22 +1050,19 @@ int i;
|
|||
XvMCDestroyContext(mDisplay,&ctx);
|
||||
number_of_surfaces = 0;
|
||||
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG4) ) {
|
||||
printf("vo_xvmc: Context sucessfuly freed\n"); }
|
||||
mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc: Context sucessfuly freed\n");
|
||||
}
|
||||
|
||||
|
||||
if( xv_port !=0 ){
|
||||
XvUngrabPort(mDisplay,xv_port,CurrentTime);
|
||||
xv_port = 0;
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG4) ) {
|
||||
printf("vo_xvmc: xv_port sucessfuly ungrabed\n"); }
|
||||
mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc: xv_port sucessfuly ungrabed\n");
|
||||
}
|
||||
}
|
||||
|
||||
static void uninit(void){
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG4) ) {
|
||||
printf("vo_xvmc: uninit called\n"); }
|
||||
mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc: uninit called\n");
|
||||
xvmc_free();
|
||||
//from vo_xv
|
||||
#ifdef CONFIG_XF86VM
|
||||
|
@ -1086,12 +1072,11 @@ static void uninit(void){
|
|||
}
|
||||
|
||||
static int query_format(uint32_t format){
|
||||
uint32_t flags;
|
||||
XvMCSurfaceInfo qsurface_info;
|
||||
int mode_id;
|
||||
uint32_t flags;
|
||||
XvMCSurfaceInfo qsurface_info;
|
||||
int mode_id;
|
||||
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG4) )
|
||||
printf("vo_xvmc: query_format=%X\n",format);
|
||||
mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc: query_format=%X\n",format);
|
||||
|
||||
if(!IMGFMT_IS_XVMC(format)) return 0;// no caps supported
|
||||
mode_id = xvmc_find_surface_by_format(format, 16, 16, &qsurface_info, 1);//true=1 - quering
|
||||
|
@ -1111,11 +1096,10 @@ int mode_id;
|
|||
|
||||
static int draw_slice(uint8_t *image[], int stride[],
|
||||
int w, int h, int x, int y){
|
||||
struct xvmc_pix_fmt *rndr;
|
||||
int rez;
|
||||
struct xvmc_pix_fmt *rndr;
|
||||
int rez;
|
||||
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG4) )
|
||||
printf("vo_xvmc: draw_slice y=%d\n",y);
|
||||
mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc: draw_slice y=%d\n",y);
|
||||
|
||||
rndr = (struct xvmc_pix_fmt*)image[2]; //this is copy of priv-ate
|
||||
assert( rndr != NULL );
|
||||
|
@ -1132,31 +1116,31 @@ int rez;
|
|||
if(rez != Success)
|
||||
{
|
||||
int i;
|
||||
printf("vo_xvmc::slice: RenderSirface returned %d\n",rez);
|
||||
mp_msg(MSGT_VO,MSGL_ERR,"vo_xvmc::slice: RenderSirface returned %d\n",rez);
|
||||
|
||||
printf("vo_xvmc::slice: pict=%d,flags=%x,start_blocks=%d,num_blocks=%d\n",
|
||||
mp_msg(MSGT_VO,MSGL_ERR,"vo_xvmc::slice: pict=%d,flags=%x,start_blocks=%d,num_blocks=%d\n",
|
||||
rndr->picture_structure,rndr->flags,rndr->start_mv_blocks_num,
|
||||
rndr->filled_mv_blocks_num);
|
||||
printf("vo_xvmc::slice: this_surf=%p, past_surf=%p, future_surf=%p\n",
|
||||
mp_msg(MSGT_VO,MSGL_ERR,"vo_xvmc::slice: this_surf=%p, past_surf=%p, future_surf=%p\n",
|
||||
rndr->p_surface,rndr->p_past_surface,rndr->p_future_surface);
|
||||
|
||||
for(i=0; i<rndr->filled_mv_blocks_num; i++){
|
||||
XvMCMacroBlock* testblock;
|
||||
testblock = &mv_blocks.macro_blocks[i];
|
||||
|
||||
printf("vo_xvmc::slice: mv_block - x=%d,y=%d,mb_type=0x%x,mv_type=0x%x,mv_field_select=%d\n",
|
||||
mp_msg(MSGT_VO,MSGL_ERR,"vo_xvmc::slice: mv_block - x=%d,y=%d,mb_type=0x%x,mv_type=0x%x,mv_field_select=%d\n",
|
||||
testblock->x,testblock->y,testblock->macroblock_type,
|
||||
testblock->motion_type,testblock->motion_vertical_field_select);
|
||||
printf("vo_xvmc::slice: dct_type=%d,data_index=0x%x,cbp=%d,pad0=%d\n",
|
||||
mp_msg(MSGT_VO,MSGL_ERR,"vo_xvmc::slice: dct_type=%d,data_index=0x%x,cbp=%d,pad0=%d\n",
|
||||
testblock->dct_type,testblock->index,testblock->coded_block_pattern,
|
||||
testblock->pad0);
|
||||
printf("vo_xvmc::slice: PMV[0][0][0/1]=(%d,%d)\n",
|
||||
mp_msg(MSGT_VO,MSGL_ERR,"vo_xvmc::slice: PMV[0][0][0/1]=(%d,%d)\n",
|
||||
testblock->PMV[0][0][0],testblock->PMV[0][0][1]);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
assert(rez==Success);
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG4) ) printf("vo_xvmc: flush surface\n");
|
||||
mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc: flush surface\n");
|
||||
rez = XvMCFlushSurface(mDisplay, rndr->p_surface);
|
||||
assert(rez==Success);
|
||||
|
||||
|
@ -1172,12 +1156,12 @@ int rez;
|
|||
//XvMCHide hides the surface on next retrace, so
|
||||
//check if the surface is not still displaying
|
||||
static void check_osd_source(struct xvmc_pix_fmt *src_rndr) {
|
||||
struct xvmc_pix_fmt *osd_rndr;
|
||||
int stat;
|
||||
struct xvmc_pix_fmt *osd_rndr;
|
||||
int stat;
|
||||
|
||||
//If this is source surface, check does the OSD rendering is compleate
|
||||
if(src_rndr->state & AV_XVMC_STATE_OSD_SOURCE){
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG4) )
|
||||
printf("vo_xvmc: OSD surface=%p quering\n",src_rndr);
|
||||
mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc: OSD surface=%p quering\n",src_rndr);
|
||||
osd_rndr = src_rndr->p_osd_target_surface_render;
|
||||
XvMCGetSurfaceStatus(mDisplay, osd_rndr->p_surface, &stat);
|
||||
if(!(stat & XVMC_RENDERING))
|
||||
|
@ -1185,7 +1169,8 @@ int stat;
|
|||
}
|
||||
}
|
||||
static int count_free_surfaces(void) {
|
||||
int i,num;
|
||||
int i,num;
|
||||
|
||||
num=0;
|
||||
for(i=0; i<number_of_surfaces; i++){
|
||||
check_osd_source(&surface_render[i]);
|
||||
|
@ -1196,9 +1181,9 @@ int i,num;
|
|||
}
|
||||
|
||||
static struct xvmc_pix_fmt *find_free_surface(void) {
|
||||
int i,t;
|
||||
int stat;
|
||||
struct xvmc_pix_fmt *visible_rndr;
|
||||
int i,t;
|
||||
int stat;
|
||||
struct xvmc_pix_fmt *visible_rndr;
|
||||
|
||||
visible_rndr = NULL;
|
||||
for(i=0; i<number_of_surfaces; i++){
|
||||
|
@ -1215,7 +1200,7 @@ struct xvmc_pix_fmt *visible_rndr;
|
|||
//all surfaces are busy, but there is one that will be free
|
||||
//on next monitor retrace, we just have to wait
|
||||
if(visible_rndr != NULL){
|
||||
printf("vo_xvmc: waiting retrace\n");
|
||||
mp_msg(MSGT_VO,MSGL_INFO,"vo_xvmc: waiting retrace\n");
|
||||
for(t=0;t<1000;t++){
|
||||
usec_sleep(1000);//1ms
|
||||
XvMCGetSurfaceStatus(mDisplay, visible_rndr->p_surface,&stat);
|
||||
|
@ -1224,14 +1209,14 @@ struct xvmc_pix_fmt *visible_rndr;
|
|||
}
|
||||
}
|
||||
//todo remove when stable
|
||||
printf("vo_xvmc: no free surfaces, this should not happen in g1\n");
|
||||
mp_msg(MSGT_VO,MSGL_WARN,"vo_xvmc: no free surfaces, this should not happen in g1\n");
|
||||
for(i=0;i<number_of_surfaces;i++)
|
||||
printf("vo_xvmc: surface[%d].state=%d\n",i,surface_render[i].state);
|
||||
mp_msg(MSGT_VO,MSGL_WARN,"vo_xvmc: surface[%d].state=%d\n",i,surface_render[i].state);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void xvmc_clean_surfaces(void){
|
||||
int i;
|
||||
int i;
|
||||
|
||||
for(i=0; i<number_of_surfaces; i++){
|
||||
|
||||
|
@ -1253,7 +1238,7 @@ static uint32_t get_image(mp_image_t *mpi){
|
|||
rndr = find_free_surface();
|
||||
|
||||
if(rndr == NULL){
|
||||
printf("vo_xvmc: get_image failed\n");
|
||||
mp_msg(MSGT_VO,MSGL_ERR,"vo_xvmc: get_image failed\n");
|
||||
return VO_FALSE;
|
||||
}
|
||||
|
||||
|
@ -1281,8 +1266,7 @@ assert(rndr->next_free_data_block_num == 0);
|
|||
rndr->filled_mv_blocks_num = 0;
|
||||
rndr->next_free_data_block_num = 0;
|
||||
|
||||
if( mp_msg_test(MSGT_VO,MSGL_DBG4) )
|
||||
printf("vo_xvmc: get_image: rndr=%p (surface=%p) \n",
|
||||
mp_msg(MSGT_VO,MSGL_DBG4,"vo_xvmc: get_image: rndr=%p (surface=%p) \n",
|
||||
rndr,rndr->p_surface);
|
||||
return VO_TRUE;
|
||||
}
|
||||
|
@ -1342,5 +1326,5 @@ static int control(uint32_t request, void *data)
|
|||
update_xinerama_info();
|
||||
return VO_TRUE;
|
||||
}
|
||||
return VO_NOTIMPL;
|
||||
return VO_NOTIMPL;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue