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