diff options
130 files changed, 3071 insertions, 2030 deletions
@@ -1,8 +1,8 @@ MPlayer (1.0) - rc3: "StillAlive" March 1, 2009 + rc3: "BikeshedCounter" March 27, 2009 Decoders: - * support for X8 frame (fixes "J-type picture is not supported" for WMV2) + * support for X8 frames (fixes "J-type picture is not supported" for WMV2) * support for DTS WAV/DTS-CD passthrough by ad_hwac3 * Apple's raw YUV2 in MOV * LATM over LOAS AAC decoding via internal libfaad2 @@ -10,15 +10,15 @@ MPlayer (1.0) EA Maxis XA ADPCM audio, RL2 video, Beam Software SIFF video, V.Flash PTX video * AVOption support for libavcodec-based decoders * use lavc ADPCM codecs by default - * support for progressive jpeg in ffmjpeg - * ACDSystems mjpeg (ACDV) via binary DLL and lavc + * support for progressive JPEG in ffmjpeg + * ACDSystems MJPEG (ACDV) via binary DLL and lavc * SIF1 via binary DLL * wincam screen capture (WCMV) via binary DLL - * Creative Labs Video Blaster Webcam mjpeg (CJPG) via binary DLL and ijpg library - * kensington webcam (AJPG,ABYR) via binary DLL + * Creative Labs Video Blaster Webcam MJPEG (CJPG) via binary DLL and ijpg library + * kensington webcam (AJPG, ABYR) via binary DLL * centre for wavelets (wavc) via binary DLL - * GeoVision Advanced MPEG-4 (GMP4,GM40) via binary DLL - * Xiricam jpg from Veo PC Camera (XJPG) via binary DLL + * GeoVision Advanced MPEG-4 (GMP4, GM40) via binary DLL + * Xiricam JPEG from Veo PC Camera (XJPG) via binary DLL * WorldConnect Wavelet Video (SMSV) via binary DLL * VDOWave 3 advanced (VDO3,VDOM,VDOW) via binary DLL * VoxWare MetaVoice (format 0x0074) via binary DLL @@ -87,7 +87,7 @@ MPlayer (1.0) * Linux Media Labs MPEG-4 (LMLM4) demuxer * AVM2 (Flash 9) SWF muxer * QT variant of IMA ADPCM encoder - * Ipod/Iphone compatible mp4 muxer + * iPod/iPhone compatible MP4 muxer * Mimic decoder * MSN TCP Webcam stream demuxer * RL2 demuxer / decoder @@ -124,7 +124,7 @@ MPlayer (1.0) * NC (NC4600) cameras file demuxer * MXF D-10 muxer * Generic metadata API - * H.264 speedup and PAFF decoding (install Yasm for faster H264 decoding) + * H.264 speedup and PAFF decoding (install Yasm for faster H.264 decoding) * correctly decode more of the H.264 conformance testsuite * VC-1/WMV3 decoder speedup * VP3 decoder speedup @@ -141,11 +141,11 @@ MPlayer (1.0) * replace PolypAudio by PulseAudio (-ao pulse) * add force-pbo suboption for faster output in vo_gl * add Nintendo Wii/GameCube video driver (-vo wii) - * VIDIX driver for SuperH Mobile VEU hardware block. + * VIDIX driver for SuperH Mobile VEU hardware block * support -border on vo_gl/gl2 in x11 - * Direct3D Windows video output driver added. + * Direct3D Windows video output driver added * factorize code in vo_wii - * removed unnecessary code from vo x11, xv, xvmc + * remove unnecessary code from vo x11, xv, xvmc * add OS/2 DART audio driver (-ao dart) * add VDPAU video output * add OS/2 KVA video driver (-vo kva) @@ -168,7 +168,7 @@ MPlayer (1.0) * some new slave commands (check DOCS/tech/slave.txt) * libdvdcss updated to 1.2.10, now same as upstream version * fix -endchapter support again for -dump* options - * add startup volume option + * add startup audio volume option * add option to disable default key binds * change default OSD and subtitle font size to a smaller default @@ -183,10 +183,10 @@ MPlayer (1.0) * AC3/DTS passthrough for ao_macosx * fix frozen OSD on Mac OS X * vo_gl now works with -wid and nVidia drivers on Windows (this is a hack) - * VIDIX on SuperH. + * VIDIX on SuperH * workarounds for AltiVec on Apple gcc 3.3 on Mac OS X dropped * vo_macosx can now be compiled in 64-bits mode - * allow multiple MPlayer instances w/ vo_macosx using buffer_name + * allow multiple MPlayer instances with vo_macosx using buffer_name * OpenGL support for unmodified MinGW64 SWScaler: diff --git a/DOCS/man/en/mplayer.1 b/DOCS/man/en/mplayer.1 index 3b6c1873d8..667873c7c4 100644 --- a/DOCS/man/en/mplayer.1 +++ b/DOCS/man/en/mplayer.1 @@ -31,7 +31,7 @@ .\" Title .\" -------------------------------------------------------------------------- . -.TH MPlayer 1 "2009-01-05" "The MPlayer Project" "The Movie Player" +.TH MPlayer 1 "2009-03-25" "The MPlayer Project" "The Movie Player" . .SH NAME mplayer \- movie player @@ -904,7 +904,7 @@ i.e.\& using the shell. MPlayer uses this command without any checking, it is your responsibility to ensure it does not cause security problems (e.g.\& make sure to use full paths if "." is in your path like on Windows). -It also only works when playing video (i.e. not with \-novideo but works with \-vo null). +It also only works when playing video (i.e.\& not with \-novideo but works with \-vo null). .sp 1 This can be "misused" to disable screensavers that do not support the proper X API (also see \-stop\-xscreensaver). @@ -960,7 +960,7 @@ Device to be used for Apple IR Remote (default is autodetected, Linux only). Delay in milliseconds before we start to autorepeat a key (0 to disable). .IPs ar-rate Number of key presses to generate per second on autorepeat. -.IPs (no)default-binds +.IPs (no)default-bindings Use the key bindings that MPlayer ships with by default. .IPs keylist Prints all keys that can be bound to commands. @@ -1133,7 +1133,7 @@ by a newline (\\n) from stdin. .I NOTE: See \-input cmdlist for a list of slave commands and DOCS/tech/slave.txt for their description. -Also, this is not intended to disable other inputs, e.g. via the video window, +Also, this is not intended to disable other inputs, e.g.\& via the video window, use some other method like \-input nodefault\-binds:conf=/dev/null for that. . .TP @@ -3119,6 +3119,9 @@ It also supports the standard X11 \-geometry option format. If an external window is specified using the \-wid option, then the x and y coordinates are relative to the top-left corner of the window rather than the screen. +The coordinates are relative to the screen given with \-xineramascreen for +the video output drivers that fully support \-xineramascreen (direct3d, gl, gl2, +vdpau, x11, xv, xvmc). .br .I NOTE: This option is only supported by the x11, xmga, xv, xvmc, xvidix, @@ -3225,7 +3228,7 @@ Use at your own risk! Change the range of the pan-and-scan functionality (default: 1). Positive values mean multiples of the default range. Negative numbers mean you can zoom in up to a factor of \-panscanrange+1. -E.g. \-panscanrange \-3 allows a zoom factor of up to 4. +E.g.\& \-panscanrange \-3 allows a zoom factor of up to 4. This feature is experimental. Do not report bugs unless you are using \-vo gl. . @@ -3455,25 +3458,27 @@ Apply a noise reduction algorithm to the video (default: 0, no noise reduction). .IPs deint=<0\-4> Chooses the deinterlacer (default: 0). All modes > 0 respect \-field\-dominance. -.br -.I NOTE: -Values > 2 delay the video output by one frame. .RSss .IPs 0 No deinterlacing. .IPs 1 Show only first field, similar to \-vf field. .IPs 2 -Bob deinterlacing (current fallback for advanced deinterlacers). +Bob deinterlacing, similar to \-vf tfields=1. .IPs 3 -Motion adaptive temporal deinterlacing (not yet working). +Motion adaptive temporal deinterlacing. +May lead to A/V desync with slow video hardware and/or high resolution. This is the default if "D" is used to enable deinterlacing. .IPs 4 -Motion adaptive temporal deinterlacing with edge-guided spatial interpolation -(not yet working). +Motion adaptive temporal deinterlacing with edge-guided spatial interpolation. +Needs fast video hardware. .RE +.IPs chroma\-deint +Makes temporal deinterlacers operate both on luma and chroma (default). +Use nochroma\-deint to solely use luma and speed up advanced deinterlacing. +Useful with slow video memory. .IPs pullup -Try to apply inverse telecine, needs temporal deinterlacing. +Try to apply inverse telecine, needs motion adaptive temporal deinterlacing. .RE .PD 1 . @@ -10050,7 +10055,7 @@ Lower values allow the quantizer value to jump around more, higher values force it to vary more smoothly. cplx_blur ensures that each I-frame has quality comparable to the following P-frames, and ensures that alternating high and low complexity frames -(e.g. low fps animation) do not waste bits on fluctuating quantizer. +(e.g.\& low fps animation) do not waste bits on fluctuating quantizer. . .TP .B qblur=<0\-99> (two pass only) diff --git a/DOCS/man/fr/mplayer.1 b/DOCS/man/fr/mplayer.1 index 13f233964f..023641689b 100644 --- a/DOCS/man/fr/mplayer.1 +++ b/DOCS/man/fr/mplayer.1 @@ -1,4 +1,4 @@ -.\" synced with r28950 +.\" synced with r28958 .\" Encoding: iso-8859-1 .\" MPlayer (C) 2000-2009 MPlayer Team .\" The English man page was/is done by Gabucino, Diego Biurrun, Jonas Jermann @@ -946,7 +946,8 @@ MPlayer utilise cette commande sans aucune sorte de vérification, il est donc de votre responsablité qu'elle ne pose pas de problème de sécurité (c-à-d que vous devriez spécifier le chemin absolu, surtout si "." est dans le chemin de recherche $PATH, comme c'est le cas sous Windows). -Cela fonctionne aussi lors de la lecture d'une vidéo (c-à-d. que ça ne fonctionne pas avec \-novideo alors que ça fonctionne avec \-vo null). +Cela fonctionne aussi lors de la lecture d'une vidéo (c-à-d.\& que ça ne +fonctionne pas avec \-novideo alors que ça fonctionne avec \-vo null). .sp 1 Ceci peut être "détourné" pour désactiver un économiseur d'écran ne gérant par l'API de X prévu à cet effet (voir aussi \-stop\-xscreensaver). @@ -1009,7 +1010,7 @@ d'une touche (0 pour désactiver). .IPs ar-rate Combien de frappes par seconde pendant la répétition automatique. -.IPs (no)default-binds +.IPs (no)default-bindings Répond aux touches de contrôle par défaut de MPlayer. .IPs keylist Affiche toutes les touches pouvant être attachées. @@ -10598,7 +10599,7 @@ Des valeurs plus faibles permettent au quantum de plus changer d'une trame à l'autre, des valeurs plus hautes forcent une variation plus douce. cplx_blur permet de s'assurer que chaque trame-I ait une qualité comparable aux trames-P suivantes, et garantit qu'une alternance de trames à complexité -forte et faible (par exemple un dessin animé dont la cadence d'animation est +forte et faible (par ex.\& un dessin animé dont la cadence d'animation est faible) ne gâche pas de bits en faisant fluctuer les quantum. . .TP diff --git a/DOCS/man/hu/mplayer.1 b/DOCS/man/hu/mplayer.1 index 415a7141b3..30771f86d1 100644 --- a/DOCS/man/hu/mplayer.1 +++ b/DOCS/man/hu/mplayer.1 @@ -1,4 +1,4 @@ -.\" Synced with r28895 +.\" Synced with r29059 .\" MPlayer (C) 2000-2009 MPlayer Team .\" Ezt a man oldalt Gabucino, Diego Biurrun és Jonas Jermann készíti/készítette .\" Karbantartó: Gabrov @@ -33,7 +33,7 @@ .\" Név .\" -------------------------------------------------------------------------- . -.TH MPlayer 1 "2009. 03. 09." "MPlayer Project" "A film lejátszó" +.TH MPlayer 1 "2009. 03. 28." "MPlayer Project" "A film lejátszó" . .SH NÉV mplayer \- film lejátszó @@ -161,7 +161,7 @@ Van X11, Xv, DGA, OpenGL, SVGAlib, fbdev, AAlib, libcaca, DirectFB, Quartz, Mac OS X CoreVideo támogatás, de használhatod a GGI, SDL (és ennek összes vezérlõje), VESA (minden VESA-kompatibilis kártyán, még X11 nélkül is), néhány alacsony szintû, kártyaspecifikus vezérlõ (Matroxhoz, 3dfx-hez és ATI-hoz) és -pár hardveeres MPEG dekódoló lap, mint pl. a Siemens DVB, Hauppauge PVR (IVTV), +pár hardveeres MPEG dekódoló lap, mint pl.\& a Siemens DVB, Hauppauge PVR (IVTV), DXR2 és DXR3/\:Hollywood+ támogatását is. A legtöbbjük tudja a szoftveres és harderes nagyítást, így a filmjeidet teljes képernyõs módban élvezheted. .PP @@ -572,7 +572,7 @@ spuaa=20 .SH "PROFILOK" A különbözõ konfigurációjú történõ munka megkönnyítésére profilokat lehet definiálni a konfigurációs fájlokban. -Egy profil a négyzetes zárójelbe tett nevével kezdõdik, pl. '[en-profilom]'. +Egy profil a négyzetes zárójelbe tett nevével kezdõdik, pl.\& '[en-profilom]'. Az összes ezutáni opció a profil része lesz. A leírás (melyet a \-profile help mutat) a profile-desc opcióval adható meg. A profil befejezéséhez kezdj egy újat vagy használd a 'default' profil nevet @@ -644,7 +644,7 @@ Kiírja az összes elérhetõ opciót. A konzol üzeneteket a megadott kódlapra konvertálja (alapértelmezett: automatikus felismerés). A szöveg a a configure \-\-charset opciójával megadott kódolású lesz. -Beállíthatod "noconv"-ra is a konvertálás teljes letiltásához (pl. ha +Beállíthatod "noconv"-ra is a konvertálás teljes letiltásához (pl.\& ha problémáid vannak az iconv-val). .br .I MEGJEGYZÉS: @@ -905,7 +905,7 @@ segítségével - pl.\& shell használat. Az MPlayer ezt a parancsot ellenõrzés nélkül használja, a te felelõsséged, hogy ne okozzon biztonsági problémát (pl.\& gyõzõdj meg róla, hogy teljes elérési utakat használsz, ha a "." benne van az elérési utadban, mint Windows alatt). -Csak videó lejátszás közben mûködik (pl. a \-novideo kapcsolóval nem, de \-vo null mellett igen). +Csak videó lejátszás közben mûködik (pl.\& a \-novideo kapcsolóval nem, de \-vo null mellett igen). .sp 1 Ezt "ki lehet használni" az olyan képernyõvédõ letiltásához, amely nem támogatja ehhez a megfelelõ X API-kat (lásd még \-stop\-xscreensaver). @@ -958,7 +958,7 @@ Az Apple IR távirányítóhoz használt eszköz (alapértelmezetten automatikus detekt Egy gomb automatikus ismétlése elõtti késleltetés miliszekundumban (0: kikapcsolás). .IPs ar-rate Billentyû/másodperc érték megadása autorepeat használata esetén. -.IPs (no)default-binds +.IPs (no)default-bindings Az alapértelmezetten MPlayerbe épített billentyû-hozzárendeléseket használja. .IPs keylist Az összes használható billentyû listájának kiírása. @@ -1052,7 +1052,7 @@ Kikapcsolja az AppleIR távirányító támogatását. Megtiltja az MPlayernek a billentyûzet események olvasását a standard input-ról. Hasznos, ha a standard input-ról olvasol be adatot. Ez automatikusan engedélyezõdik, ha \- van a parancssorban. -Vannak esetek, amikor kézzel kell beállítanod, pl. \& +Vannak esetek, amikor kézzel kell beállítanod, pl.\& ha megnyitod a /dev/\:stdin -t (vagy a rendszereden az ennek megfelelõt), lejátszási listában használod az stdin-t vagy késõbb akarsz olvastatni az stdin-rõl a loadfile vagy loadlist szolga parancsok segítségével. @@ -1136,7 +1136,7 @@ parancsokat olvas az stdin-rõl. .I MEGJEGYZÉS: A \-input cmdlist kapcsoló kilistázza a szolga módban használható parancsokat, a DOCS/tech/slave.txt fájlban megtalálod a leírásukat. -Ez nem a többi, pl. a videó ablakon keresztül érkezõ input letiltására készült, +Ez nem a többi, pl.\& a videó ablakon keresztül érkezõ input letiltására készült, arra használj mást, mint a \-input nodefault\-binds:conf=/dev/null. . .TP @@ -1253,7 +1253,7 @@ A lejátszás akkor indul, ha a cache <százalék>-ig feltöltõdött. Ha léptetést kell végezni az aktuális pozícióból a cache méretének <százalék>-kal megadott részén belüli pozícióba, az MPlayer megvárja, hogy a cache feltöltõdjön addig a pozícióig -egy folyamban történõ ugrás helyett (alapértelmezett: 50). +egy folyamban történõ ugrás helyett (alapértelmezett: 50). . .TP .B \-cdda <opció1:opció2> (csak CDDA) @@ -1304,7 +1304,7 @@ Lejátszási csatornák igénylése (alapértelmezett: 2). Az MPlayer megmondja a dekódernek hogy annyi csatornán dekódoljon, amennyit ez az opció megad. Innentõl a dekóderen múlik ennek teljesítése. -Ez akkor fontos ha AC-3-as hanggal ellátott videót nézel (pl. DVD). +Ez akkor fontos ha AC-3-as hanggal ellátott videót nézel (pl.\& DVD). Ebben alapértelmezésként a liba52 dekódol és lemixeli az audiót a kért számú csatornára. A kimeneti csatornák dekódolt csatornák számától független, direkt @@ -1421,7 +1421,7 @@ várakozással töltött másodpercek maximális száma. Alapértelmezett 30. .TP .B \-dvd\-device <eszköz elérési útja> (csak DVD) Megadja a DVD eszközt vagy .iso fájlnevet (alapértelmezett: /dev/\:dvd). -Megadhatsz egy könyvtárat is, ami egy elõzõleg DVD-rõl (pl. vobcopy-val) +Megadhatsz egy könyvtárat is, ami egy elõzõleg DVD-rõl (pl.\& vobcopy-val) lemásolt fájlokat tartalmaz. . .TP @@ -1483,7 +1483,7 @@ Az indexet a MEncoderrel lehet maradandóan javítani (lásd a dokumentációt). .br .I MEGJEGYZÉS: Értelemszerûen ez az opció csak akkor használható ha a média tekerhetõ -(tehát pl. stdin-nel, pipe-al nem). +(tehát pl.\& stdin-nel, pipe-al nem). . .TP .B \-fps <lebegõpontos érték> @@ -1510,7 +1510,7 @@ Hasznos hibás/\:befejezetlen letöltéseknél vagy hibás fájloknál. .br .I MEGJEGYZÉS: Értelemszerûen ez az opció csak akkor használható ha a média tekerhetõ -(tehát pl. stdin-nel, pipe-al nem). +(tehát pl.\& stdin-nel, pipe-al nem). . .TP .B \-noidx @@ -1641,7 +1641,7 @@ cbr: Konstans BitRáta .REss .IPs vpeak=<érték> Megadja a videó kódolási bitrátájának csúcsértékét Mbps-ben -(csak VBR kódolásnál hasznos, alapértelmezett: 9.6). +(csak VBR kódolásnál hasznos, alapértelmezett: 9.6). .IPs fmt=<érték> Kiválasztja a kódoláshoz használt MPEG formátumot: .RSss @@ -2654,13 +2654,13 @@ Az OSS opciói .B vol, pcm, line. Az opciók teljes listájához lásd a SOUND_DEVICE_NAMES-t a /usr/\:include/\:linux/\:soundcard.h fájlban. -ALSA-hoz használhatod a neveket, amiket pl. az \& alsamixer +ALSA-hoz használhatod a neveket, amiket pl.\& az \& alsamixer megjelenít, úgy mint .B Master, Line, PCM. .br .I MEGJEGYZÉS: Az ALSA mixer csatorna neveit egy szám követi, amit a <név,szám> formában -kell megadni, pl.\& ha a csatorna neve 'PCM 1' az alsamixer-ben, +kell megadni, pl.\& ha a csatorna neve 'PCM 1' az alsamixer-ben, akkor .BR PCM,1 . . @@ -3236,7 +3236,7 @@ Csak saját felelõsségre használd! Megváltoztatja a pan-and-scan funkcionalítás tartományát (alapértelmezett: 1). A pozitív értékek az alapértelmezett tartomány többszörösét jelentik. A negatív számok azt jelentik, hogy \-panscanrange+1 faktorig tudsz nagyítani. -Pl. \-panscanrange \-3 4-es nagyítási faktort enged. +Pl.\& \-panscanrange \-3 4-es nagyítási faktort enged. Ez a képesség még kísérleti. Ne jelents hibákat, hacsak nem \-vo gl-t használsz. . @@ -3474,17 +3474,24 @@ Nincs deinterlace. .IPs 1 Csak az elsõ mezõt mutatja, hasonló a \-vf field kapcsolóhoz. .IPs 2 -Bob deinterlace (jelenleg erre lép vissz a fejlettebb deinterlacer-ekrõl). +Bob deinterlace, hasonló a \-vf tfields=1 kapcsolóhoz. .IPs 3 -Mozgás adaptív idõbeli deinterlace (még nem mûködik). +Mozgás adaptív idõbeli deinterlace. +A/V deszinkronizációt okozhat lassú videó hardveren és/vagy nagy felbontásnál. Ez az alapértelmezett, ha a "D" gombbal engedélyezhetõ a deinterlacing. .IPs 4 -Mozgás adaptív idõbeli deinterlace él-vezérelt térbeli interpolációval (még nem mûködik). -.RE +Mozgás adaptív idõbeli deinterlace él-vezérelt térbeli interpolációval. +Gyors videó hardver kell hozzá. +.RE +.IPs chroma\-deint +Az idõbeli deinterlacer-ek mind a fényerõsségen, mint a telítettségen változtatnak (alapértelmezett). +Használd a nochroma\-deint kapcsolót, ha csak a fényerõsséget akarod változtatni és gyorsítani +szeretnél a fejlett deinterlacing-en. +Hasznos lassú videó memóriánál. .IPs pullup -Inverz telecine-t próbál alkalmazni, idõbeli deinterlace kell hozzá. +Inverz telecine-t próbál alkalmazni, mozgás adaptív idõbeli deinterlace kell hozzá. .RE -.PD 1 +.PD 1 . .TP .B xvmc (csak X11 \-vc ffmpeg12mc kapcsolóval) @@ -3607,10 +3614,27 @@ Próbáld ki ezt az opciót, ha megjelenítési problémáid vannak. .PD 1 . .TP +.B kva (csak OS/2) +Kimeneti videó vezérlõ, ami a libkva interfészt használja. +.PD 0 +.RSs +.IPs snap +Kényszeríti a SNAP módot. +.IPs wo +Kényszeríti a WarpOverlay! módot. +.IPs dive +Kényszeríti a DIVE módot. +.IPs (no)t23 +Engedélyezi/letiltja a T23 laptopokra vonatkozó kódot (alapértelmezett: \-not23). +Próbáld meg engedélyezni ezt az opciót, ha a videó kártyád csak a felméretezést támogatja. +.RE +.PD 1 +. +.TP .B quartz (csak Mac OS X) Mac OS X Quartz kimeneti videó vezérlõ. Bizonyos esetekben hatékonyabb lehet egy csomagolt YUV kimeneti -formátum kényszerítése, pl. a \& \-vf format=yuy2 kapcsolóval. +formátum kényszerítése, pl.\& a \& \-vf format=yuy2 kapcsolóval. .PD 0 .RSs .IPs device_id=<szám> @@ -3943,7 +3967,7 @@ Ez a vezérlõ nagyon hardver specifikus. .RSs .IPs <aleszköz> Explicit kiválasztja a használni kívánt Blinkenlights aleszköz vezérlõt. -Valami olyasmi, mint pl. arcade:host=localhost:2323 vagy +Valami olyasmi, mint pl.\& arcade:host=localhost:2323 vagy hdl:file=name1,file=name2. Meg kell adnod az aleszközt. .RE @@ -4167,7 +4191,7 @@ Kimeneti videó vezérlõ a DVB kártyákhoz, ami a kimenetet egy MPEG-PES fájlba .RSs .IPs card=<1\-4> Megadja a használandó eszköz számát, ha több, mint egy kimeneti DVB kártya van -(csak V3 API, mint pl. az 1.x.y sorozatú vezérlõk). +(csak V3 API, mint pl.\& az 1.x.y sorozatú vezérlõk). Ha nincs megadva, az MPlayer megkeresi az elsõ használható kártyát. .IPs <fájlnév> kimeneti fájl neve (alapértelmezett: ./grab.mpg). @@ -4643,7 +4667,7 @@ A <kihagyási érték> a következõk egyike lehet: .br none: Soha ne hagyja ki. .br -default: Hagyja ki, ha a feldolgozási lépés haszontalan (pl. 0 méretû csomag AVI-ban). +default: Hagyja ki, ha a feldolgozási lépés haszontalan (pl.\& 0 méretû csomag AVI-ban). .br nonref: Hagyja ki a nem referencia kockákat (pl.\& nem lesz felhasználva másik kocka dekódolásánál, a hiba nem tud "tovább épülni"). @@ -4894,7 +4918,7 @@ Kikapcsolja a képarány számításokat. .TP .B "\-zoom\ \ " A szoftveres méretezést engedélyezi, ha használható. -Ez olyan kimeneti vezérlõkkel (mint pl. x11, fbdev) is engedélyezi a méretezést, +Ez olyan kimeneti vezérlõkkel (mint pl.\& x11, fbdev) is engedélyezi a méretezést, melyekben nincs támogatás a hardveres méretezéshez, vagy az MPlayer letiltja a méretezést teljesítménybeli indokok miatt. . @@ -5320,7 +5344,7 @@ ha szükséges. . .TP .B surround[=késleltetés] -Dekódoló mátrix kódolású térhatású hanghoz, mint pl. a Dolby Surround-hoz. +Dekódoló mátrix kódolású térhatású hanghoz, mint pl.\& a Dolby Surround-hoz. Sok két csatornás audióval rendelkezõ fájl tartalmaz mátrixos térhatású hangot. Legalább négy csatornát támogató hangkártya kell hozzá. .PD 0 @@ -5932,7 +5956,7 @@ A használható formátumok listájához lásd a format=fmt=help kapcsolót. .PD 0 .RSs .IPs <fourcc> -formátum név mint pl. rgb15, bgr24, yv12, stb. (alapértelmezett: yuy2) +formátum név mint pl.\& rgb15, bgr24, yv12, stb. (alapértelmezett: yuy2) .RE .PD 1 . @@ -5948,7 +5972,7 @@ Az elérhetõ formátumok listájához lásd a noformat=fmt=help kapcsolót. .PD 0 .RSs .IPs <fourcc> -formátum név, mint pl. rgb15, bgr24, yv12, stb. (alapértelmezett: yv12) +formátum név, mint pl.\& rgb15, bgr24, yv12, stb. (alapértelmezett: yv12) .RE .PD 1 . @@ -6166,7 +6190,7 @@ Kvantálási paraméter kényszerítése (alapértelmezett: 0, videó QP használata). kvantálási paraméter (QP) változtató szûrõ .RSs .IPs <egyenlet> -valamilyen egyenlet, pl. "2+2*sin(PI*qp)" +valamilyen egyenlet, pl.\& "2+2*sin(PI*qp)" .RE . .TP @@ -7954,7 +7978,7 @@ maximális Lagrange szorzó a ratecontrol-hoz (alapértelmezett: 31.0) .B mblmin=<0.01\-255.0> Minimális makroblokk-szintû Lagrange szorzó a ratecontrol-hoz (alapértelmezett: 2.0). -Ez a paraméter az adaptív kvantálási opciókat érinti, mint pl. a +Ez a paraméter az adaptív kvantálási opciókat érinti, mint pl.\& a qprd, lumi_mask, stb.. .RE . @@ -8195,7 +8219,7 @@ N lépéses módban a második lépés (vpass=3, ez nem elírás) mindkettõt elvégzi: elõször elolvassa a statisztika fájlt, majd felülírja. Ajánlott a divx2pass.log elmentése, mielõtt ezt megtennéd, ha esély van rá, hogy meg kell szakítanod a MEncoder-t. -Használhatod mindegyik kódolási opciót, kivéve a nagyon CPU-igényeseket, pl. "qns". +Használhatod mindegyik kódolási opciót, kivéve a nagyon CPU-igényeseket, pl.\& "qns". .br Ezt a lépést újra és újra lefuttathatod a kódolás finomítása érdekében. Minden következõ lépés felhasználja az elõzõ lépés statisztikáit a továbblépéshez. @@ -9129,7 +9153,7 @@ Zajcsökkentés, a 0 azt jelenti, hogy kikapcsolva. 0\-600 a hasznos tartomány egy átlagos tartalom esetén, de lehet, hogy kicsit feljebb kell vinned, ha nagyon zajos az anyagod (alapértelmezett: 0). Mivel kicsi hatása van a sebességre, inkább ezt ajánlott használni, mint a -zajszûrést a videó szûrõknél, pl. denoise3d vagy hqdn3d-vel. +zajszûrést a videó szûrõknél, pl.\& denoise3d vagy hqdn3d-vel. . .TP .B qns=<0\-3> @@ -9554,7 +9578,7 @@ utolsó kockája vagy egy P-kocka vagy egy N-kocka, de nem B-kocka. .TP .B (no)packed Ez az opció a kocka-sorrendbeli gondokat oldja meg konténer formátumokba, -pl. AVI-ba történõ kódoláskor, ami nem tud megbírkózni a nem sorrendben +pl.\& AVI-ba történõ kódoláskor, ami nem tud megbírkózni a nem sorrendben lévõ kockákkal. A gyakorlatban a legtöbb dekódoló (mind szoftveres, mind hardveres) saját maga is tudja kezelni a kocka-sorrendet és összezavarodhat, ha ez az opció be van kapcsolva, így nyugodtan kikapcsolva hagyhatod, @@ -9592,7 +9616,7 @@ Az igazi CBR-t nagyon nehéz elérni. A videó anyagtól függõen a bitráta változhat és ezt nehéz elõre megjósolni. Ezért az Xvid egy átlagoló periódust használ, ami alatt garantálja a megadott bitmennyiséget (minusz egy kis variáció). -Ez a beállítás megadja a "kockák számát", amikre vonatkoztatva az Xvid +Ez a beállítás megadja a "kockák számát", amikre vonatkoztatva az Xvid átlagol és megpróbálja elérni a CBR-t. . .TP @@ -10054,7 +10078,7 @@ Az alacsonyabb érték nagyobb ugrálást enged a kvantáló értékének, a magasabb értékek finomabb váltásokra kényszerítik. A cplx_blur biztosítja, hogy minden I-kocka minõsége összehasonlítható az õt követõ P-kockával és hogy a váltakozó nagy és kicsi komplexitású -kockák (pl. alacsony fps-û animáció) nem vesztegetnek biteket egy +kockák (pl.\& alacsony fps-û animáció) nem vesztegetnek biteket egy ingadozó kvantálóval. . .TP @@ -10290,7 +10314,7 @@ Inkább ezzen a paraméteren változtass, mielõtt a deadzone_inter-hez hozzányúlnál .B (no)fast_pskip A P-kockák korai skip detektálásának végrehajtása (alapértelmezett: bekapcsolva). Ez általában javítja a sebességet, de néha a kevésbé részletes -területeken (pl. ég) mellékhatásokat okoz. +területeken (pl.\& ég) mellékhatásokat okoz. . .TP .B (no)dct_decimate @@ -10307,7 +10331,7 @@ Zajcsökkentés, a 0 a kikapcsolást jelenti. 100\-1000 a használandó tartomány egy átlagos tartalomnál, de a nagyon zajos tartalomnál kicsit felnyomhatod (alapértelmezett: 0). Tekintve, hogy kicsi a befolyása a sebességre, inkább ez a preferálandó a -zajcsökkentésnél a videó szûrõkkel, mint pl. a denoise3d-vel vagy hqdn3d-vel +zajcsökkentésnél a videó szûrõkkel, mint pl.\& a denoise3d-vel vagy hqdn3d-vel történõ zajcsökkentés helyett. . .TP @@ -10409,7 +10433,7 @@ a szálak megfelelõ számának kiválasztását. .B (no)global_header Az SPS és a PPS csak egyszer fog megjelenni, a bitfolyam elején (alapértelmezett: letiltva). -Néhány lejátszó, mint pl. a Sony PSP, igényli ezt az opciót. +Néhány lejátszó, mint pl.\& a Sony PSP, igényli ezt az opciót. Alapértelmezésként az SPS és a PPS minden IDR kocka elõtt ismétlõdik. . .TP @@ -10490,7 +10514,7 @@ A bináris codec fájl neve, amivel kódolni akarsz. . .TP .B compdata=<fájl> -A codec beállításokat tartalmazó fájl neve (pl. firstpass.mcf), melyet a vfw2menc készített. +A codec beállításokat tartalmazó fájl neve (pl.\& firstpass.mcf), melyet a vfw2menc készített. . . .SS MPEG muxer (\-mpegopts) @@ -11171,7 +11195,7 @@ you can directly play it via cdda:// without setting format, hwac3 or hwdts. mplayer \-rawaudio format=0xff \-demuxer rawaudio \-af pan=2:.32:.32:.39:.06:.06:.39:.17:-.17:-.17:.17:.33:.33 adts_he-aac160_51.aac .fi .br -Egy kicsit játszadoznod kell a pan értékekkel (pl. felszorozni az értékeket) a +Egy kicsit játszadoznod kell a pan értékekkel (pl.\& felszorozni az értékeket) a hangerõ növeléséhez vagy a kattogás elkerüléséhez. . .PP diff --git a/DOCS/man/ru/mplayer.1 b/DOCS/man/ru/mplayer.1 index a47e8a5eac..d719820930 100644 --- a/DOCS/man/ru/mplayer.1 +++ b/DOCS/man/ru/mplayer.1 @@ -2,7 +2,7 @@ .\" This man page was/is done by Gabucino, Diego Biurrun, Jonas Jermann .\" Translated by Vladimir Voroshilov <voroshil@gmail.com> .\" Encoding: koi8-r -.\" synced with r28895 +.\" synced with r28991 . .\" -------------------------------------------------------------------------- .\" ïÐÒÅÄÅÌÅÎÉÑ ÍÁËÒÏÓÏ× @@ -863,7 +863,7 @@ MPlayer ÉÓÐÏÌØÚÕÅÔ ÜÔÕ ËÏÍÁÎÄÕ ÂÅÚ ËÁËÉÈ\-ÌÉÂÏ ÐÒÏ×ÅÒÏË, ÐÒÏ×ÅÒËÁ Å£ ÂÅÚÏÐÁÓÎÏÓÔÉ ÌÅÖÉÔ ÐÏÄ ÷ÁÛÅÊ ÏÔ×ÅÔÓÔ×ÅÎÎÏÓÔØÀ (× ÞÁÓÔÎÏÓÔÉ, ÕÂÅÄÉÔÅÓØ, ÞÔÏ ÉÓÐÏÌØÚÕÀÔÓÑ ÐÏÌÎÙÅ ÐÕÔÉ, ÅÓÌÉ "." ÐÒÉÓÕÔÓÔ×ÕÅÔ × ×ÁÛÅÍ ÐÕÔÉ, ÎÁÐÒÉÍÅÒ, ËÁË × Windows). -ëÏÍÁÎÄÁ ÒÁÂÏÔÁÅÔ ÔÏÌØËÏ ÐÒÉ ×ÏÓÐÒÏÉÚ×ÅÄÅÎÉÉ ×ÉÄÅÏ (Ô.Å. ÒÁÂÏÔÁÅÔ Ó +ëÏÍÁÎÄÁ ÒÁÂÏÔÁÅÔ ÔÏÌØËÏ ÐÒÉ ×ÏÓÐÒÏÉÚ×ÅÄÅÎÉÉ ×ÉÄÅÏ (Ô.Å.\& ÒÁÂÏÔÁÅÔ Ó \-vo null, ÎÏ ÎÅ Ó \-novideo). .sp 1 å£ ÍÏÖÎÏ ÐÒÉÍÅÎÑÔØ ÄÌÑ "ÎÅÐÒÁ×ÉÌØÎÏÇÏ" ÏÔËÌÀÞÅÎÉÑ ÈÒÁÎÉÔÅÌÅÊ @@ -922,7 +922,7 @@ mplayer \-heartbeat\-cmd "gnome\-screensaver\-command \-p" file úÁÄÅÒÖËÁ × ÍÉÌÌÉÓÅËÕÎÄÁÈ ÐÅÒÅÄ ÎÁÞÁÌÏÍ Á×ÔÏÐÏ×ÔÏÒÁ (0 ÄÌÑ ÏÔËÌÀÞÅÎÉÑ). .IPs ar\-rate ëÏÌÉÞÅÓÔ×Ï ËÌÁ×ÉÛ × ÓÅËÕÎÄÕ, ÇÅÎÅÒÉÒÕÅÍÙÈ ÐÒÉ Á×ÔÏÐÏ×ÔÏÒÅ. -.IPs (no)default-binds +.IPs (no)default-bindings éÓÐÏÌØÚÏ×ÁÔØ ÐÒÉ×ÑÚËÉ ËÌÁ×ÉÛ, ÐÏÓÔÁ×ÌÑÅÍÙÅ Ó MPlayer ÐÏ ÕÍÏÌÞÁÎÉÀ. .IPs keylist ÷Ù×ÏÄÉÔ ×ÓÅ ËÌÁ×ÉÛÉ, ËÏÔÏÒÙÅ ÍÏÖÎÏ ÎÁÚÎÁÞÉÔØ ËÏÍÁÎÄÁÍ. @@ -3435,22 +3435,32 @@ XResetScreenSaver API, ÐÏÖÁÌÕÊÓÔÁ, ÉÓÐÏÌØÚÕÊÔÅ \-heartbeat\-cmd .IPs deint=<0\-4> ÷ÙÂÉÒÁÅÔ ÄÅÉÎÔÅÒÌÅÊÓÅÒ (ÐÏ ÕÍÏÌÞÁÎÉÀ: 0). ÷ÓÅ ÒÅÖÉÍÙ > 0 ÕÞÉÔÙ×ÁÀÔ \-field\-dominance. +.br +.I úáíåþáîéå: +úÎÁÞÅÎÉÑ > 2 ÚÁÄÅÒÖÉ×ÁÀÔ ×Ù×ÏÄ ×ÉÄÅÏ ÎÁ ÏÄÉÎ ËÁÄÒ. .RSss .IPs 0 îÅÔ ÄÅÉÎÔÅÒÌÅÊÓÉÎÇÁ. .IPs 1 ïÔÏÂÒÁÖÁÅÔ ÔÏÌØËÏ ÐÅÒ×ÏÅ ÐÏÌÅ, ÁÎÁÌÏÇÉÞÎÏ \-vf field. .IPs 2 -Bob ÄÅÉÎÔÅÒÌÅÊÓÉÎÇ (ÔÅËÕÝÉÊ ÚÁÐÁÓÎÏÊ ×ÁÒÉÁÎÔ ÄÌÑ ÐÅÒÅÄÏ×ÙÈ -ÄÅÉÎÔÅÒÌÅÊÓÅÒÏ×). +Bob ÄÅÉÎÔÅÒÌÅÊÓÉÎÇ, ÁÎÁÌÏÇÉÞÎÏ \-vf tfields=1. .IPs 3 -áÄÁÐÔÉ×ÎÙÊ ÐÏ Ä×ÉÖÅÎÉÀ ×ÒÅÍÅÎÎÏÊ ÄÅÉÎÔÅÒÌÅÊÓÉÎÇ (ÅÝ£ ÎÅ ÒÁÂÏÔÁÅÔ). +áÄÁÐÔÉ×ÎÙÊ ÐÏ Ä×ÉÖÅÎÉÀ ×ÒÅÍÅÎÎÏÊ ÄÅÉÎÔÅÒÌÅÊÓÉÎÇ. +íÏÖÅÔ ÐÒÉ×ÅÓÔÉ Ë ÄÅÓÉÎÈÒÏÎÉÚÁÃÉÉ ÁÕÄÉÏ É ×ÉÄÅÏ ÎÁ ÓÌÁÂÏÊ ×ÉÄÅÏ +ËÁÒÔÅ É/ÉÌÉ ×ÙÓÏËÏÍ ÒÁÚÒÅÛÅÎÉÉ. üÔÏ ÚÎÁÞÅÎÉÅ ÐÏ ÕÍÏÌÞÁÎÉÀ, ÅÓÌÉ ËÌÁ×ÉÛÁ "D" ÉÓÐÏÌØÚÕÅÔÓÑ ÄÌÑ ×ËÌÀÞÅÎÉÑ ÄÅÉÎÔÅÒÌÅÊÓÉÎÇÁ. .IPs 4 áÄÁÐÔÉ×ÎÙÊ ÐÏ Ä×ÉÖÅÎÉÀ ×ÒÅÍÅÎÎÏÊ ÄÅÉÎÔÅÒÌÅÊÓÉÎÇ Ó ÕÐÒÁ×ÌÑÅÍÏÊ ÐÏ -ËÒÁÑÍ ÐÒÏÓÔÒÁÎÓÔ×ÅÎÎÏÊ ÉÎÔÅÒÐÏÌÑÃÉÅÊ (ÅÝ£ ÎÅ ÒÁÂÏÔÁÅÔ). -.RE +ËÒÁÑÍ ÐÒÏÓÔÒÁÎÓÔ×ÅÎÎÏÊ ÉÎÔÅÒÐÏÌÑÃÉÅÊ. ôÒÅÂÕÅÔ ÂÙÓÔÒÏÊ ×ÉÄÅÏ ËÁÒÔÙ. +.RE +.IPs chroma\-deint +ðÏÚ×ÏÌÑÅÔ ×ÒÅÍÅÎÎÙÍ ÄÅÉÎÔÅÒÌÅÊÓÅÒÁÍ ÏÐÅÒÉÒÏ×ÁÔØ ËÁË ÑÒËÏÓÔÎÏÊ, ÔÁË +É Ã×ÅÔÎÏÓÔÎÏÊ ËÏÍÐÏÎÅÎÔÁÍÉ (ÐÏ ÕÍÏÌÞÁÎÉÀ). +éÓÐÏÌØÚÕÊÔÅ nochroma\-deint ÄÌÑ ÏÐÅÒÉÒÏ×ÁÎÉÑ ÔÏÌØËÏ Ã×ÅÔÎÏÓÔÎÏÊ +ËÏÍÐÏÎÅÎÔÏÊ É ÕÓËÏÒÅÎÉÑ ÕÓÏ×ÅÒÛÅÎÓÔ×Ï×ÁÎÎÏÇÏ ÄÅÉÎÔÅÒÌÅÊÓÉÎÇÁ. +ðÏÌÅÚÎÏ Ó ÍÅÄÌÅÎÎÏÊ ×ÉÄÅÏ ÐÁÍÑÔØÀ. .IPs pullup ðÒÏÂÕÅÔ ÐÒÉÍÅÎÉÔØ ÏÂÒÁÔÎÙÊ ÔÅÌÅÓÉÎ, ÎÕÖÄÁÅÔÓÑ ×Ï ×ÒÅÍÅÎÎÏÍ ÄÅÉÎÔÅÒÌÅÊÓÉÎÇÅ. @@ -3583,6 +3593,24 @@ Windows ÆÒÏÎÔÅÎÄ ÄÌÑ VIDIX. .PD 1 . .TP +.B kva (ÔÏÌØËÏ OS/2) +äÒÁÊ×ÅÒ ×Ù×ÏÄÁ ×ÉÄÅÏ, ÉÓÐÏÌØÚÕÀÝÉÊ ÉÎÔÅÒÆÅÊÓ libkva. +.PD 0 +.RSs +.IPs snap +æÏÒÓÉÒÕÅÔ ÒÅÖÉÍ SNAP. +.IPs wo +æÏÒÓÉÒÕÅÔ ÒÅÖÉÍ WarpOverlay!. +.IPs dive +æÏÒÓÉÒÕÅÔ ÒÅÖÉÍ DIVE. +.IPs (no)t23 +÷ËÌÀÞÁÅÔ/×ÙËÌÀÞÁÅÔ ÏÂÈÏÄÎÏÅ ÒÅÛÅÎÉÅ ÄÌÑ ÎÏÕÔÂÕËÁ T23 (ÐÏ ÕÍÏÌÞÁÎÉÀ: \-not23). +ðÏÐÒÏÂÕÊÔÅ ×ËÌÀÞÉÔØ ÄÁÎÎÕÀ ÏÐÃÉÀ, ÅÓÌÉ ÷ÁÛÁ ×ÉÄÅÏËÁÒÔÁ ÐÏÄÄÅÒÖÉ×ÁÅÔ +ÔÏÌØËÏ ÒÁÓÔÑÖÅÎÉÅ. +.RE +.PD 1 +. +.TP .B quartz (ÔÏÌØËÏ Mac OS X) äÒÁÊ×ÅÒ ×Ù×ÏÄÁ ×ÉÄÅÏ Mac OS X Quartz. ÷ ÎÅËÏÔÏÒÙÈ ÓÌÕÞÁÑÈ, ÆÏÒÓÉÒÏ×ÁÎÉÅ ÐÁËÏ×ÁÎÎÏÇÏ ×ÙÈÏÄÎÏÇÏ ÆÏÒÍÁÔÁ YUV Ó, @@ -4006,7 +4034,7 @@ MPEG ÆÉÌØÍÏ×, ÐÏÔÒÅÂÕÅÔÓÑ ÅÅ ÕÓÔÁÎÏ×ÉÔØ, ÅÓÌÉ ×Ï ×ÒÅÍÑ ÐÒÏÓÍÏÔÒÁ ÞÅÒÅÓÓÔÒÏÞÎÏÇÏ OSD (ÐÏ ÕÍÏÌÞÁÎÉÀ: ÏÔËÌÀÞÅÎÏ). .IPs (no)crtc2 ÷ËÌÀÞÁÅÔ TV\-×ÙÈÏÄ ÎÁ ×ÔÏÒÏÊ "ÇÏÌÏ×Å" (ÐÏ ÕÍÏÌÞÁÎÉÀ: ×ËÌÀÞÅÎÏ). -ëÁÞÅÓÔ×Ï ×Ù×ÏÄÁ ÕÄÉ×ÉÔÅÌØÎÏÅ, Ô.Ë. ÜÔÏ ÐÏÌÎÏÓÔØÀ ÞÅÒÅÓÓÔÒÏÞÎÏÅ +ëÁÞÅÓÔ×Ï ×Ù×ÏÄÁ ÕÄÉ×ÉÔÅÌØÎÏÅ, Ô.Ë.\& ÜÔÏ ÐÏÌÎÏÓÔØÀ ÞÅÒÅÓÓÔÒÏÞÎÏÅ ÉÚÏÂÒÁÖÅÎÉÅ Ó ÐÒÁ×ÉÌØÎÏÊ ÓÉÎÈÒÏÎÉÚÁÃÉÅÊ ËÁÖÄÏÇÏ ÞÅÔÎÏÇÏ/\:ÎÅÞÅÔÎÏÇÏ ÐÏÌÑ. .IPs tvnorm=pal|ntsc|auto õÓÔÁÎÏ×ÉÔ TV ÓÔÁÎÄÁÒÔ Matrox ËÁÒÔÙ ÂÅÚ ÎÅÏÂÈÏÄÉÍÏÓÔÉ @@ -4227,7 +4255,7 @@ iTVC16), (Hauppauge WinTV PVR\-150/250/350/500). .sp 1 .I úáíåþáîéå: åÓÌÉ ×Ù ÎÅ ÕËÁÚÙ×ÁÅÔÅ ÎÉËÁËÉÈ ÏÐÃÉÊ, ÔÏ ×Ù×ÏÄ ÂÕÄÅÔ ÐÒÏÇÒÅÓÓÉ×ÎÙÍ -(Ô.Å. ÎÅÞÅÒÅÓÓÔÒÏÞÎÙÍ). +(Ô.Å.\& ÎÅÞÅÒÅÓÓÔÒÏÞÎÙÍ). .RE . .TP @@ -6016,7 +6044,7 @@ spal: 768x576 (PAL Ó Ë×ÁÄÒÁÔÎÙÍ ÐÉËÓÅÌÏÍ) ðÏÄÆÉÌØÔÒÙ ÄÏÌÖÎÙ ÂÙÔØ ÏÔÄÅÌÅÎÙ '/', É ÍÏÇÕÔ ÂÙÔØ ÏÔËÌÀÞÅÎÙ ÕËÁÚÁÎÉÅÍ ÐÅÒÅÄ ÎÉÍÉ '\-'. ëÁÖÄÙÊ ÐÏÄÆÉÌØÔÒ É ÎÅËÏÔÏÒÙÅ ÏÐÃÉÉ ÉÍÅÀÔ ËÁË ËÏÒÏÔËÏÅ, ÔÁË É ÄÌÉÎÎÏÅ -ÎÁÚ×ÁÎÉÅ, ËÏÔÏÒÙÅ ÐÏÌÎÏÓÔØÀ ×ÚÁÉÍÏÚÁÍÅÎÑÅÍÙ, Ô.Å. dr/dering \- ÜÔÏ +ÎÁÚ×ÁÎÉÅ, ËÏÔÏÒÙÅ ÐÏÌÎÏÓÔØÀ ×ÚÁÉÍÏÚÁÍÅÎÑÅÍÙ, Ô.Å.\& dr/dering \- ÜÔÏ ÏÄÎÏ É ÔÏ ÖÅ. .\" FIXME is translation correct? scope = ÇÒÁÎÉÃÙ ÄÅÊÓÔ×ÉÑ ÷ÓÅ ÐÏÄÆÉÌØÔÒÙ ÉÍÅÀÔ ÏÂÝÉÅ ÏÐÃÉÉ, ÏÐÒÅÄÅÌÑÀÝÉÅ ÇÒÁÎÉÃÙ ÄÅÊÓÔ×ÉÑ: diff --git a/DOCS/man/zh_CN/mplayer.1 b/DOCS/man/zh_CN/mplayer.1 index faea37c0e1..44994bbf50 100644 --- a/DOCS/man/zh_CN/mplayer.1 +++ b/DOCS/man/zh_CN/mplayer.1 @@ -1,4 +1,4 @@ -.\" sync with en/mplayer.1 r28745 +.\" sync with en/mplayer.1 r29059 .\" Encoding: UTF-8 .\" Reminder of hard terms which need better/final solution later: .\" /capture; playtree in parent list; colorkey; retrace; desync; downmix; @@ -43,7 +43,7 @@ .\" å称 .\" -------------------------------------------------------------------------- . -.TH MPlayer 1 "2009-01-05" "MPlayer 项目" "电影æ’放器" +.TH MPlayer 1 "2009-03-25" "MPlayer 项目" "电影æ’放器" . .SH å称 mplayer \- 影视æ’放器 @@ -862,6 +862,7 @@ xv, xvidix å’Œ dfbmga。 .I 注æ„: MPlayer 执行æ¤å‘½ä»¤æ—¶ä¸åŠ ä»¥æ£€æŸ¥ï¼Œæ‰€ä»¥ä½ æœ‰è´£ä»»ç¡®ä¿è¯¥å‘½ä»¤ä¸é€ æˆä»»ä½•å®‰å…¨é—®é¢˜ï¼ˆä¾‹ 如,如果“.â€å°±åƒåœ¨ Windows ä¸é‚£æ ·æ˜¯åœ¨ä½ 的路径ä¸ï¼Œåˆ™ç¡®ä¿ä½¿ç”¨å®Œæ•´è·¯å¾„)。 +并且该选项åªæœ‰åœ¨æ’放视频时有效(å³æ²¡æœ‰ä½¿ç”¨ \-novideo,但å¯ä»¥ä½¿ç”¨ \-vo null)。 .sp 1 该选项å¯èƒ½è¢«â€œè¯¯ç”¨â€ä»¥ç¦ç”¨ä¸æ供对于适当的 X API 接å£çš„支æŒçš„å±å¹•ä¿æŠ¤ç¨‹åºã€‚ å¦‚æžœä½ è§‰å¾—è¿™å¤ªå¤æ‚了,请è¦æ±‚å±å¹•ä¿æŠ¤ç¨‹åºçš„作者æ供对于适当的 X API 的支æŒã€‚ @@ -910,6 +911,8 @@ mplayer \-heartbeat\-cmd "gnome\-screensaver\-command \-p" file 在开始自动é‡å¤ä¸€ä¸ªé”®ä¹‹å‰ç‰å¾…多少毫秒 (0 代表åœç”¨)。 .IPs ar-rate 自动é‡å¤æ•°æ˜¯æ¯ç§’é‡å¤å¤šå°‘次按键。 +.IPs (no)default-bindings +默认情况下使用 MPlayer 自带的键ä½è®¾ç½®ã€‚ .IPs keylist 列出所有å¯ä»¥è¢«ç»‘定于命令的键。 .IPs cmdlist @@ -1074,6 +1077,8 @@ MPlayer ä»Žæ ‡å‡†è¾“å…¥è¯»å–以新行 (\\n) 分隔开的命令行, .br .I 注æ„: 请å‚è§ \-input cmdlist 的命令列表和 DOCS/tech/slave.txt ä¸çš„æ述。 +å¦å¤–,该选项并éžç”¨æ¥ç¦ç”¨å…¶å®ƒçš„输入,例如通过视频窗å£ã€‚è¦ä½¿ç”¨å…¶å®ƒæ–¹æ³•å®žçŽ°é‚£ç§æ•ˆæžœï¼Œä¾‹å¦‚ +\-input nodefault\-binds:conf=/dev/null。 . .TP .B \-softsleep @@ -2096,14 +2101,14 @@ SSA/ASS æ供器能在那里放置å—幕 (与 \-ass\-use\-margins 组åˆç”¨)。 如果å—幕ä¸çš„逗å·æ˜¾ç¤ºåœ¨å¥é¦–而ä¸æ˜¯åœ¨å¥å°¾, 就使用它。 . .TP -.B \-font <文件 font.desc 的路径> +.B \-font <文件 font.desc 的路径,å—体(FreeType)的路径,å—ä½“æ ·å¼ï¼ˆFontconfig)的路径> 在别的目录ä¸å¯»æ‰¾ OSD/\:SUB å—体( 默认的普通å—体为: ~/\:.mplayer/\:font/\:font.desc, 默认的 FreeType å—体为: ~/.mplayer/\:subfont.ttf)。 .br .I 注æ„: 对于 FreeType, æ¤é€‰é¡¹å†³å®šæ–‡æœ¬å—体文件的路径。 -对于 fontconfig, æ¤é€‰é¡¹å†³å®š fontconfig çš„å—体å称。 +对于 Fontconfig, æ¤é€‰é¡¹å†³å®š Fontconfig çš„å—体å称。 .sp 1 .I 示例: .PD 0 @@ -2113,6 +2118,8 @@ SSA/ASS æ供器能在那里放置å—幕 (与 \-ass\-use\-margins 组åˆç”¨)。 \-font ~/\:.mplayer/\:arialuni.ttf .br \-font 'Bitstream Vera Sans' +.br +\-font 'Bitstream Vera Sans:style=Bold' .RE .PD 1 . @@ -2333,9 +2340,9 @@ CC å—幕到目å‰ä¸ºæ¢è¿˜æ²¡æœ‰åœ¨å…¶å®ƒåœ°åŒºç çš„ DVD ä¸å‘现。 与 \-audiofile ä¸€æ ·, 但用于å—幕æµ(OggDS?)。 . .TP -.B \-subfont <文件å>(仅用于FreeTypeå—体) -设置å—幕å—体。 -如果没有给出\-subfont,则使用\-font。 +.B \-subfont <å—体(FreeType)的路径,å—ä½“æ ·å¼ï¼ˆFontconfig)的路径>(仅用于 FreeType å—体) +设置å—幕å—体(å‚è§ \-font)。 +如果没有给出 \-subfont,则使用 \-font。 . .TP .B \-subfont\-autoscale <0\-3> (仅用于 FreeType) @@ -2647,6 +2654,18 @@ DirectX DirectSound 音频输出驱动 .PD 1 . .TP +.B dart(仅适用于 OS/2) +OS/2 DART 音频输出驱动 +.PD 0 +.RSs +.IPs (no)share +以共享或独å 模å¼æ‰“å¼€ DART 输出。 +.IPs bufsize=<大å°> +将缓冲大å°è®¾ä¸º<大å°>,å•ä½ä¸ºé‡‡æ ·æ•°ï¼ˆé»˜è®¤å€¼ï¼š2048)。 +.RE +.PD 1 +. +.TP .B dxr2 (也请å‚è§ \-dxr2) (仅用于 DXR2) Creative DXR2 专用的输出驱动 . @@ -3211,24 +3230,30 @@ Supported by the gl, gl2, x11, and xv video output drivers. 使用负数值时,则应用模糊算法(默认值:0)。 .IPs denoise=<0\-1> 将一ç§æ¶ˆé™¤å™ªç‚¹çš„算法应用于视频画é¢ï¼ˆé»˜è®¤å€¼ï¼š0,ä¸æ¶ˆé™¤å™ªç‚¹ï¼‰ã€‚ -.IPs deint=<0\-3> +.IPs deint=<0\-4> 选择å隔行扫æ模å¼çš„算法(默认值:0)。 +所有大于 0 的模å¼æœä»Ž \-field\-dominance 选项的设置。 .RSss .IPs 0 ä¸å隔行扫æ。 .IPs 1 -åªæ˜¾ç¤ºä¸€ä¸ªéš”行扫æ域,与 \-vf field 作用相类似。 +åªæ˜¾ç¤ºç¬¬ä¸€ä¸ªéš”行扫æ域,与 \-vf field 作用相类似。 .IPs 2 -跳跃å¼å隔行扫æ(当å‰é«˜çº§å隔行扫æ算法的退化形å¼ï¼‰ã€‚ +跳跃å¼å隔行扫æ,与 \-vf tfields=1 作用相类似。 .IPs 3 -适应è¿åŠ¨ç”»é¢çš„瞬间å隔行扫æ(还未实现)。 +适应è¿åŠ¨ç”»é¢çš„瞬间å隔行扫æ。 +å¯èƒ½åœ¨ä½Žæ€§èƒ½è§†é¢‘硬件和/或高分辨率的情况下导致音视频ä¸åŒæ¥ã€‚ 这是当“Dâ€ç”¨äºŽå¼€å¯å隔行扫æ时的默认值。 .IPs 4 -采用边缘导å‘空间æ’值算法的适应è¿åŠ¨ç”»é¢çš„瞬间å隔行扫æ -(还未实现)。 +采用边缘导å‘空间æ’值算法的适应è¿åŠ¨ç”»é¢çš„瞬间å隔行扫æ。 +需è¦é«˜æ€§èƒ½çš„视频硬件。 .RE +.IPs chroma\-deint +使瞬间å隔行扫æ算法åŒæ—¶ä½œç”¨äºŽäº®åº¦å’Œè‰²åº¦é€šé“上(默认值)。 +使用 nochroma\-deint 以使其仅作用于亮度通é“ï¼Œä»Žè€ŒåŠ é€Ÿé«˜çº§å隔行扫æ算法。 +对于低速显å˜å¾ˆæœ‰ç”¨ã€‚ .IPs pullup -å°è¯•åº”用å电视电影模å¼ï¼Œéœ€è¦çž¬é—´å隔行扫æ。 +å°è¯•åº”用å电视电影模å¼ï¼Œéœ€è¦ä½¿ç”¨è¿åŠ¨è‡ªé€‚应的瞬间å隔行扫æ算法。 .RE .PD 1 . @@ -3341,6 +3366,23 @@ VIDIX çš„ Windows å‰å° .PD 1 . .TP +.B kva(仅适用于 OS/2) +使用 libkva 接å£çš„视频输出驱动。 +.PD 0 +.RSs +.IPs snap +强制使用 SNAP 模å¼ã€‚ +.IPs wo +强制使用 WarpOverlay! 模å¼ã€‚ +.IPs dive +强制使用 DIVE 模å¼ã€‚ +.IPs (no)t23 +å¯ç”¨/ç¦ç”¨è§£å†³ T23 笔记本问题的å˜é€šæ¨¡å¼ï¼ˆé»˜è®¤å€¼ï¼š\-not23)。 +å¦‚æžœä½ çš„æ˜¾å¡ä»…支æŒç”»é¢æ”¾å¤§è¾“出,å°è¯•å¼€å¯è¿™ä¸ªé€‰é¡¹ã€‚ +.RE +.PD 1 +. +.TP .B quartz (仅用于 Mac OS X) Mac OS X Quartz 视频输出驱动。 在æŸäº›æƒ…况下, é”定打包 YUV è¾“å‡ºæ ¼å¼, 如: \-vf format=yuy2, å¯èƒ½æ›´æœ‰æ•ˆã€‚ diff --git a/DOCS/tech/binary-packaging.txt b/DOCS/tech/binary-packaging.txt index 71a19295e2..9d852372db 100644 --- a/DOCS/tech/binary-packaging.txt +++ b/DOCS/tech/binary-packaging.txt @@ -52,14 +52,13 @@ the following features MUST be included in any official binary package: - XAnim codecs support (*) * general: - - default font - FreeType fonts support - HTML documentation - large file support - man page(s) * input/demuxers: - - DVD(mpdvdkit2) + - DVD(libdvdread4/libdvdnav) - streaming - Matroska(internal) - (S)VCD @@ -108,10 +107,10 @@ for Red Hat and Fedora RPMs I am using FHS-compliant paths: /etc/mplayer/ system-wide configs /usr/bin/ binaries /usr/lib/codecs/ binary codecs +/usr/lib64/codecs/ binary codecs on 64bit Linux /usr/share/doc/mplayer-version/ docs /usr/share/man/man1/ man page /usr/share/man/XX/man1/ translated man page -/usr/share/mplayer/font/ fonts /usr/share/mplayer/skins/ GUI skins You MUST NOT include the codecs.conf file in your package. It is useful @@ -134,12 +133,9 @@ mplayer contains MPlayer binary without GUI (mplayer), config files, man pages and documentation; required by mplayer-gui mplayer-codecs-* contain binary codecs available from MPlayer's site -mplayer-font-* contain various bitmap fonts for OSD (obsolete) mplayer-gui contains MPlayer binary with GUI (gmplayer); contains default skin (Blue) mplayer-skin-* contain various MPlayer GUI skins -mplayer-vidix contains VIDIX support library for MPlayer -mplayer-vidix-* contain VIDIX drivers for specific cards, one per package There is no strict policy for now, just use your common sense. diff --git a/DOCS/tech/release-howto.txt b/DOCS/tech/release-howto.txt index 5cf0fef514..b490f80283 100644 --- a/DOCS/tech/release-howto.txt +++ b/DOCS/tech/release-howto.txt @@ -15,17 +15,12 @@ preparations: create the release tree: - tag Subversion with release name +- Add a VERSION file with the release version to the root of the source tree. - update release.sh script with version number ***the following steps are done automatically by release.sh script*** - checkout the mplayer src tree - check out FFmpeg subdirs - remove obsolete DOCS translations, help files -- replace version.sh with this (change version number too...): - -============ -#!/bin/sh -echo "#define VERSION \"1.0pre5-$1 \"" > version.h -============ - build the HTML docs from XML sources, then clean up: make html-chunked; make releaseclean @@ -38,9 +33,9 @@ release the tree: ***end of part done by release.sh** test it (download to your local machine, extract, compile, run) - - compilers: gcc 3, gcc 2.95, mingw, cygwin + - compilers: gcc 4.x, gcc 3.x, gcc 2.95, MinGW, Cygwin - architectures: PPC, AMD64, x86 with MMX[2], SSE[2], 3DNow - - OS: Linux, BSD, Windows, MacOS X + - OS: Linux, BSD, Windows, Mac OS X copy to FTP: cp MPlayer-0.90rc5.tar.bz2 /home/ftp/MPlayer/releases/ diff --git a/DOCS/tech/win32-codec-howto.txt b/DOCS/tech/win32-codec-howto.txt index 3346de47bb..e6a684df32 100644 --- a/DOCS/tech/win32-codec-howto.txt +++ b/DOCS/tech/win32-codec-howto.txt @@ -13,10 +13,10 @@ If you want to add a codec yourself, read DOCS/tech/codecs.conf.txt. -VFW codecs +VfW codecs ~~~~~~~~~~ -VFW (Video for Windows) is the old video API for Windows. Its codecs have +VfW (Video for Windows) is the old video API for Windows. Its codecs have the '.dll' or (rarely) '.drv' extension. If MPlayer fails at playing your AVI with this kind of message: @@ -26,7 +26,7 @@ Cannot find codec matching selected -vo and video format 0x55594648. It means your AVI is encoded with a codec which has the HFYU fourcc (HFYU = HuffYUV codec, DIV3 = DivX Low Motion, etc.). Now that you know this, you have to find out which DLL Windows loads in order to play this file. -You can find the vfw codec by searching the internet for e.g. VIDC.HFYU. +You can find the VfW codec by searching the internet for e.g. VIDC.HFYU. In our case, the 'system.ini' also contains this information in a line that reads: @@ -111,9 +111,9 @@ false hits, but you may get lucky... Tips: ~~~~~~~ If you get an error loading a new codec, it may need some more files to work. -Start the filemon utility before loading MPlayer to find out which dlls are +Start the filemon utility before loading MPlayer to find out which DLLs are trying to be loaded. -Your codec may load some external .dll libraries. If the codec is already +Your codec may load some external DLL libraries. If the codec is already installed in Windows, run listdlls wmplayer.exe while Windows Media Player is playing your file to find out which. diff --git a/DOCS/xml/configure b/DOCS/xml/configure index a61f564fc1..a15cdecd03 100755 --- a/DOCS/xml/configure +++ b/DOCS/xml/configure @@ -186,11 +186,13 @@ then if test -z "$_fake_chunk_xsl" then echo "Found xsltproc. If it works, it's probably the best choice." + # HACK: xslt always need a target file if a doctype is set + _xsltcommand="OUTPUT=\"\$1\"; if test -d \"\$OUTPUT\" ; then OUTPUT=\"\$OUTPUT/dummy.html\" ; fi;" if test -n "$_catalog" then - _xsltcommand="xsltproc --catalogs -o \$1 \$2 \$3" + _xsltcommand="$_xsltcommand xsltproc --catalogs -o \$OUTPUT \$2 \$3" else - _xsltcommand="xsltproc -o \$1 \$2 \$3" + _xsltcommand="$_xsltcommand xsltproc -o \$OUTPUT \$2 \$3" fi else echo "Found xsltproc but no stylesheets on your system." diff --git a/DOCS/xml/en/encoding-guide.xml b/DOCS/xml/en/encoding-guide.xml index e5af2e3873..706b34dbf5 100644 --- a/DOCS/xml/en/encoding-guide.xml +++ b/DOCS/xml/en/encoding-guide.xml @@ -357,7 +357,7 @@ practice, this means a value high enough so that it poses no limit, like 10000Kbit.) With no real restriction on bitrate, the result is that the codec will use the lowest possible quantizer for each macroblock (as specified by -<option>vqmin</option> for +<option>vqmin</option> for <systemitem class="library">libavcodec</systemitem>, which is 2 by default). As soon as you specify a low enough bitrate that the codec @@ -1327,7 +1327,7 @@ With these things in mind, here is our first example: mencoder <replaceable>capture.avi</replaceable> -mc 0 -oac lavc -ovc lavc -lavcopts \ vcodec=mpeg2video:vbitrate=6000:ilme:ildct:acodec=mp2:abitrate=224 </screen> -Note the <option>ilme</option> and <option>ildct</option> options. +Note the <option>ilme</option> and <option>ildct</option> options. </para> </sect2> @@ -1421,7 +1421,7 @@ which widely depend on personal taste and technical constraints. bugs which have not yet been noticed and which can ruin an encode. This is simply the tradeoff for using bleeding-edge technology. </para> - + <para> What is more, beginning to use a new codec requires that you spend some time becoming familiar with its options, so that you know what @@ -1453,13 +1453,13 @@ which widely depend on personal taste and technical constraints. However, they may have some very advanced options that, if enabled, will make the encode really slow for marginal gains. </para> - + <para> If you are after blazing speed you should stick around the default settings of the video codec (although you should still try the other options which are mentioned in other sections of this guide). </para> - + <para> You may also consider choosing a codec which can do multi-threaded processing, though this is only useful for users of machines with @@ -1605,7 +1605,7 @@ will encode <replaceable>destination_sound.wav</replaceable> with the encoding quality 1, which is roughly equivalent to 80Kb/s, and is the minimum quality at which you should encode if you care about quality. -Please note that <application>MEncoder</application> currently cannot +Please note that <application>MEncoder</application> currently cannot mux Vorbis audio tracks into the output file because it only supports AVI and MPEG containers as an output, each of which may lead to audio/video @@ -1773,7 +1773,7 @@ only cover its usage. </para> <para> -Probably the easiest way to get started with Matroska is to use +Probably the easiest way to get started with Matroska is to use <application>MMG</application>, the graphical frontend shipped with <application>mkvtoolnix</application>, and follow the <ulink url="http://www.bunkus.org/videotools/mkvtoolnix/doc/mkvmerge-gui.html">guide to mkvmerge GUI (mmg)</ulink> @@ -2240,7 +2240,7 @@ will be 24000/1001 frames per second. accurate method available for encoding both telecine and "mixed progressive and telecine". <screen> -mencoder dvd://1 -oac copy -vf pullup,softskip +mencoder dvd://1 -oac copy -vf pullup,softskip -ovc lavc -ofps 24000/1001<!-- --></screen> </para></listitem> @@ -4006,7 +4006,7 @@ random differences in the achieved bitrate. This option is for choosing the motion estimation search method. Altering this option provides a straightforward quality-vs-speed tradeoff. <option>me=dia</option> is only a few percent faster than - the default search, at a cost of under 0.1dB global PSNR. The + the default search, at a cost of under 0.1dB global PSNR. The default setting (<option>me=hex</option>) is a reasonable tradeoff between speed and quality. <option>me=umh</option> gains a little under 0.1dB global PSNR, with a speed penalty that varies depending on @@ -4235,7 +4235,7 @@ random differences in the achieved bitrate. (understanding that there are diminishing returns which may become vanishingly low, or even zero). The video stream will still have seekable points as long as there are some scene changes. -</para></listitem> +</para></listitem> <listitem> <para> <emphasis role="bold">deblock</emphasis>: @@ -4551,17 +4551,17 @@ and other options. This is known to work on x86 on both *NIX and Windows. </para> <para> First you must build the <application>vfw2menc</application> program. -It is located in the <filename class="directory">TOOLS</filename> subdirectory +It is located in the <filename class="directory">TOOLS</filename> subdirectory of the MPlayer source tree. To build on Linux, this can be done using <application>Wine</application>: <screen>winegcc vfw2menc.c -o vfw2menc -lwinmm -lole32</screen> -To build on Windows in <application>MinGW</application> or +To build on Windows in <application>MinGW</application> or <application>Cygwin</application> use: <screen>gcc vfw2menc.c -o vfw2menc.exe -lwinmm -lole32</screen> To build on <application>MSVC</application> you will need getopt. -Getopt can be found in the original <application>vfw2menc</application> +Getopt can be found in the original <application>vfw2menc</application> archive available at: The <ulink url="http://oss.netfarm.it/mplayer-win32.php">MPlayer on win32</ulink> project. </para> @@ -4571,13 +4571,13 @@ Below is an example with the VP6 codec. <screen> vfw2menc -f VP62 -d vp6vfw.dll -s firstpass.mcf </screen> -This will open the VP6 codec dialog window. +This will open the VP6 codec dialog window. Repeat this step for the second pass and use <option>-s <replaceable>secondpass.mcf</replaceable></option>. </para> </informalexample> <para> -Windows users can use +Windows users can use <option>-xvfwopts codec=vp6vfw.dll:compdata=dialog</option> to have the codec dialog display before encoding starts. </para> @@ -4882,11 +4882,11 @@ mp4creator -optimize narnia.mp4</screen> <para> If you want to add tags to your video that show up in iTunes, you can use <ulink url="http://atomicparsley.sourceforge.net/">AtomicParsley</ulink>. - + <screen>AtomicParsley narnia.mp4 --metaEnema --title "The Chronicles of Narnia" --year 2005 --stik Movie --freefree --overWrite</screen> The <option>--metaEnema</option> option removes any existing metadata - (<application>mp4creator</application> inserts its name in the + (<application>mp4creator</application> inserts its name in the "encoding tool" tag), and <option>--freefree</option> reclaims the space from the deleted metadata. The <option>--stik</option> option sets the type of video (such as Movie @@ -4954,7 +4954,7 @@ compliant. <tbody> <row> <entry>NTSC DVD</entry> - <entry>720x480, 704x480, 352x480, 352x240</entry> + <entry>720x480, 704x480, 352x480, 352x240</entry> <entry>MPEG-2</entry> <entry>9800 kbps</entry> <entry>48000 Hz</entry> @@ -4967,7 +4967,7 @@ compliant. <entry>NTSC DVD</entry> <entry>352x240<footnote id='fn-rare-resolutions'><para> These resolutions are rarely used for DVDs because - they are fairly low quality.</para></footnote></entry> + they are fairly low quality.</para></footnote></entry> <entry>MPEG-1</entry> <entry>1856 kbps</entry> <entry>48000 Hz</entry> @@ -5062,7 +5062,7 @@ highly bitrate-starved and require effort to obtain acceptable quality. <title>GOP Size Constraints</title> <para> -DVD, VCD, and SVCD also constrain you to relatively low +DVD, VCD, and SVCD also constrain you to relatively low GOP (Group of Pictures) sizes. For 30 fps material the largest allowed GOP size is 18. For 25 or 24 fps, the maximum is 15. @@ -5078,7 +5078,7 @@ The GOP size is set using the <option>keyint</option> option. VCD video is required to be CBR at 1152 kbps. This highly limiting constraint also comes along with an extremely low vbv buffer size of 327 kilobits. -SVCD allows varying video bitrates up to 2500 kbps, and a somewhat less +SVCD allows varying video bitrates up to 2500 kbps, and a somewhat less restrictive vbv buffer size of 917 kilobits is allowed. DVD video bitrates may range anywhere up to 9800 kbps (though typical bitrates are about half that), and the vbv buffer size is 1835 kilobits. @@ -5125,7 +5125,7 @@ DVD (with timestamps on every frame, if possible): <para> DVD with NTSC Pullup: <screen>-of mpeg -mpegopts format=dvd:tsaf:telecine -ofps 24000/1001</screen> -This allows 24000/1001 fps progressive content to be encoded at 30000/1001 +This allows 24000/1001 fps progressive content to be encoded at 30000/1001 fps whilst maintaining DVD-compliance. </para> @@ -5191,7 +5191,7 @@ or in the manual page. <para> If the audio sample rate in the original file is not the same as required by the target format, sample rate conversion is required. -This is achieved using the <option>-srate</option> option and +This is achieved using the <option>-srate</option> option and the <option>-af lavcresample</option> audio filter together. </para> @@ -5259,7 +5259,7 @@ or DVD: Used to set the GOP size. 18 for 30fps material, or 15 for 25/24 fps material. Commercial producers seem to prefer keyframe intervals of 12. - It is possible to make this much larger and still retain compatibility + It is possible to make this much larger and still retain compatibility with most players. A <option>keyint</option> of 25 should never cause any problems. </para></listitem> diff --git a/DOCS/xml/en/mencoder.xml b/DOCS/xml/en/mencoder.xml index 5180a57d40..8914d229d1 100644 --- a/DOCS/xml/en/mencoder.xml +++ b/DOCS/xml/en/mencoder.xml @@ -608,7 +608,7 @@ mencoder mf://<replaceable>frame001.jpg,frame002.jpg</replaceable> -mf w=800:h=6 Creating an MPEG-4 file from explicit list of JPEG files (list.txt in current directory contains the list of files to use as source, one per line): <screen> -mencoder mf://<replaceable>@list.txt</replaceable> -mf w=800:h=600:fps=25:type=jpg \ +mencoder mf://<replaceable>@list.txt</replaceable> -mf w=800:h=600:fps=25:type=jpg \ -ovc lavc -lavcopts vcodec=mpeg4:mbd=2:trell -oac copy -o <replaceable>output.avi</replaceable> </screen> </para> diff --git a/DOCS/xml/en/tvinput.xml b/DOCS/xml/en/tvinput.xml index f0d3641034..c89b7acf00 100644 --- a/DOCS/xml/en/tvinput.xml +++ b/DOCS/xml/en/tvinput.xml @@ -52,7 +52,7 @@ Here are just a few tips: <listitem><para> Choose some sane image dimensions. The dimensions of the resulting image should be divisible by 16. -</para></listitem> +</para></listitem> <listitem> <para> If you capture the video with the vertical resolution higher than half @@ -88,7 +88,7 @@ Here are just a few tips: time. If you have a large capture buffer, <application>MEncoder</application> can survive an overload for few seconds but nothing more. It's better to turn off the 3D OpenGL screensavers and similar stuff. -</para></listitem> +</para></listitem> <listitem><para> Don't mess with the system clock. <application>MEncoder</application> uses the system clock for doing A/V sync. If you adjust the system clock (especially @@ -118,7 +118,7 @@ Here are just a few tips: <filename>linux/Documentation/sound/btaudio</filename> file (in the kernel tree, not <application>MPlayer</application>'s) for some instructions on using this driver. -</para></listitem> +</para></listitem> <listitem><para> If <application>MEncoder</application> cannot open the audio device, make sure that it is really available. There can be some trouble with the sound @@ -251,7 +251,7 @@ Here is an example for Russian: </row> <row> <entry>C</entry> - <entry>Cycle through teletext rendering modes (opaque, transparent, inverted opaque, + <entry>Cycle through teletext rendering modes (opaque, transparent, inverted opaque, inverted transparent</entry> </row> <row> diff --git a/DOCS/xml/en/usage.xml b/DOCS/xml/en/usage.xml index bc573a25d7..ea74911b3f 100644 --- a/DOCS/xml/en/usage.xml +++ b/DOCS/xml/en/usage.xml @@ -602,11 +602,11 @@ is specified. <title>MPEG audio Passthrough</title> <para> -Digital TV transmissions (such as DVB and ATSC) and some DVDs usually have +Digital TV transmissions (such as DVB and ATSC) and some DVDs usually have MPEG audio streams (in particular MP2). -Some MPEG hardware decoders such as full-featured DVB cards and DXR2 -adapters can natively decode this format. -<application>MPlayer</application> can be configured to relay the audio data +Some MPEG hardware decoders such as full-featured DVB cards and DXR2 +adapters can natively decode this format. +<application>MPlayer</application> can be configured to relay the audio data without decoding it. </para> diff --git a/DOCS/xml/en/video.xml b/DOCS/xml/en/video.xml index 5d58a9fbb3..d4eda61ae8 100644 --- a/DOCS/xml/en/video.xml +++ b/DOCS/xml/en/video.xml @@ -2007,7 +2007,7 @@ the native OSD feature of DVB cards. <application>MPlayer</application> supports hardware accelerated playback with the Creative DXR2 card. </para> - + <para> First of all you will need properly installed DXR2 drivers. You can find the drivers and installation instructions at the diff --git a/DOCS/xml/hu/cd-dvd.xml b/DOCS/xml/hu/cd-dvd.xml index c109c90e0f..02887e4b27 100644 --- a/DOCS/xml/hu/cd-dvd.xml +++ b/DOCS/xml/hu/cd-dvd.xml @@ -167,7 +167,7 @@ nevezett értelmetlen korlátozást. Szégyen, hogy a DVD meghajtókat arra kényszerÃtik, hogy a hat különbözÅ‘ régióból, amire a világot felosztották, csak az egyikben gyártott lemezeket fogadják el. Hogy egy asztal körül ülÅ‘ pár ember hogy állhatott elÅ‘ egy ilyen -ötlettel és hogyan várhatják el, hogy a 21. században elfogadnak egy ilyen +ötlettel és hogyan várhatják el, hogy a 21. században elfogadnak egy ilyen ötletet, az minden képzeletet felülmúl. </para> diff --git a/DOCS/xml/hu/documentation.xml b/DOCS/xml/hu/documentation.xml index bf356292c0..83838c3621 100644 --- a/DOCS/xml/hu/documentation.xml +++ b/DOCS/xml/hu/documentation.xml @@ -63,7 +63,7 @@ Az <application>MPlayer</application> egy Linuxon működÅ‘ videolejátszó (fut számos más Unix-on és nem-x86 processzorokon is, lásd <xref linkend="ports"/>). Le tudja játszani a legtöbb MPEG, VOB, AVI, Ogg/OGM, VIVO, ASF/WMA/WMV, QT/MOV/MP4, FLI, RM, NuppelVideo, yuv4mpeg, FILM, RoQ, PVA, és Matroska file-t, és ezekhez -felsorakoztat jónéhány natÃv, XAnim, RealPlayer és Win32 DLL codecet. Nézhetsz vele +felsorakoztat jónéhány natÃv, XAnim, RealPlayer és Win32 DLL codecet. Nézhetsz vele Video CD-t, SVCD-t, DVD-t, 3ivx, RealMedia, Sorenson, Theora és MPEG-4 (DivX) filmet is. Az <application>MPlayer</application> másik nagy elÅ‘nye a megjelenÃtési módok széles választékában rejlik. @@ -73,7 +73,7 @@ az SDL/GGI drivereit is), és néhány alacsony szintű kártyaspecifikus vezér (Matrox, 3dfx, Radeon, Mach64, Permedia3) is használható! Legtöbbjük támogat szoftveres vagy hardveres nagyÃtást, Ãgy a teljesképernyÅ‘s mód is elérhetÅ‘. Az <application>MPlayer</application> támogat továbbá hardveres -MPEG kártyákkal történÅ‘ dekódolást/megjelenÃtést, Ãgy például a +MPEG kártyákkal történÅ‘ dekódolást/megjelenÃtést, Ãgy például a <link linkend="dvb">DVB</link> és <link linkend="dxr3">DXR3/Hollywood+</link> kártyákon! És még nem is szóltam a szép, élsÃmÃtott, árnyékolt feliratozásról diff --git a/DOCS/xml/hu/encoding-guide.xml b/DOCS/xml/hu/encoding-guide.xml index e675f7bb3b..434c7a48be 100644 --- a/DOCS/xml/hu/encoding-guide.xml +++ b/DOCS/xml/hu/encoding-guide.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> -<!-- synced with r28510 --> +<!-- synced with r28984 --> <chapter id="encoding-guide"> <title>Kódolás a <application>MEncoder</application>rel</title> @@ -1429,13 +1429,13 @@ a személyes igények és a technikai korlátok határoznak meg. Azonban van néhány nagyon fejlett opció, amit ha engedélyezel, nagyon nagy mértékben lelassÃtják a kódolást csekély javulást produkálva. </para> - + <para> Ha a fantasztikus sebességet keresed, a codec alapértelmezett beállÃtásai körül nézelÅ‘dj (azonban Ãgy is ajánlott kipróbálni egyéb opciókat, amiket ezen leÃrás más fejezetei emlÃtenek). </para> - + <para> Megfontolandó olyan codec-et választani, ami több-szálas módban dolgozza fel a forrást, azonban ez csak a több processzoros géppel @@ -1681,7 +1681,7 @@ megy. </para> <para> -Ezen hatalmas hátrány mellett az AVI-nak a következÅ‘ fÅ‘ korlátai vannak: +Ezen hatalmas hátrány mellett az AVI-nak a következÅ‘ fÅ‘ korlátai vannak: </para> <orderedlist> @@ -2364,7 +2364,7 @@ Az idÅ‘tartam/hely alapján kell döntened. </listitem> <listitem><formalpara> - <title>A kódolási paraméterekrÅ‘l és a minÅ‘ségrÅ‘l:</title> + <title>A kódolási paraméterekrÅ‘l és a minÅ‘ségrÅ‘l:</title> <para> Csak mert itt javasoltam az <option>mbd=2</option>-t, nem jelenti azt, hogy máshol ne lehetne használni. A <option>trell</option>-lel @@ -3902,7 +3902,7 @@ elért bitráta különbségbÅ‘l adódik. globális PSNR növelést jelent, változó 15%-33%-os sebességveszteség árán. Mivel a kódolási idÅ‘ vs. minÅ‘ség arány eléggé rossz, csak akkor ajánlott használni, ha minden egyes bit fontos és a kódolási idÅ‘ nem számÃt. - </para> + </para> </listitem> <listitem> <para> @@ -3954,7 +3954,7 @@ elért bitráta különbségbÅ‘l adódik. Ezek legtöbbször ritka, szélsÅ‘séges esetek, de ha teljesen biztos akarsz lenni, gondolkozz el rajta, hogy van-e a videódban teljes képernyÅ‘s ismétlÅ‘dÅ‘, csillogó minta vagy nagyon nagy ideiglenes - elzáródás, ami kikényszerÃthet egy I-kockát. + elzáródás, ami kikényszerÃthet egy I-kockát. Az elsÅ‘ lépés <option>frameref</option>-jét úgy állÃtsd be, hogy elég nagy legyen ahhoz, hogy tartalmazza a villódzási ciklust (vagy az elzárást). Például ha a jelenet oda-vissza ugrál két kép @@ -4197,7 +4197,7 @@ elért bitráta különbségbÅ‘l adódik. azt, hogy egyre csökkenÅ‘ hasznot hoz, mely végül szinte észrevehetetlenül kicsi vagy akár nulla lesz). A videó folyam még Ãgy is fog tartalmazni kereshetÅ‘ pontokat, amÃg van benne jelenet váltás. -</para></listitem> +</para></listitem> <listitem> <para> <emphasis role="bold">deblock</emphasis>: @@ -4255,7 +4255,7 @@ elért bitráta különbségbÅ‘l adódik. Ez <emphasis role="bold">még</emphasis> nem igazolja a deblocking szűrÅ‘ erÅ‘sségének csökkentését. Ãltalában jobb zajminÅ‘séget érhetsz el az utófeldolgozással. - Ha a H.264 kódolásod túl foltos vagy maszatos, próbáld meg + Ha a H.264 kódolásod túl foltos vagy maszatos, próbáld meg lejátszani a <option>-vf noise</option> kapcsolóval. A <option>-vf noise=8a:4a</option>-nak a gyenge mellékhatásokat el kell tüntetnie. @@ -4409,7 +4409,7 @@ opciókat, ha a codec hibázik vagy rossz kimenetet ad. <entry>jp2avi.dll</entry> <entry>ImagePower MJPEG2000 (IPJ2)</entry> <entry>d860a11766da0d0ea064672c6833768b</entry> - <entry><option>-vf flip</option></entry> + <entry><option>-vf flip</option></entry> </row> <row> <entry>m3jp2k32.dll</entry> @@ -4845,7 +4845,7 @@ mp4creator -optimize narnia.mp4</screen> <para> Ha tag-eket akarsz hozzáfűzni a videódhoz, amiket az iTunes megjelnÃt, használhatod az <ulink url="http://atomicparsley.sourceforge.net/">AtomicParsley</ulink>-t. - + <screen>AtomicParsley narnia.mp4 --metaEnema --title "The Chronicles of Narnia" --year 2005 --stik Movie --freefree --overWrite</screen> A <option>--metaEnema</option> opció eltávolÃt minden meglévÅ‘ metadata-t @@ -4879,7 +4879,7 @@ mp4creator -optimize narnia.mp4</screen> A <application>MEncoder</application> képes VCD, SCVD és DVD formátumú MPEG fájlok létrehozására a <systemitem class="library">libavcodec</systemitem> könyvtár segÃtségével. -Ezek a fájlok a +Ezek a fájlok a <ulink url="http://www.gnu.org/software/vcdimager/vcdimager.html">vcdimager</ulink>-rel vagy a <ulink url="http://dvdauthor.sourceforge.net/">dvdauthor</ulink>-ral @@ -4918,7 +4918,7 @@ legyen. <tbody> <row> <entry>NTSC DVD</entry> - <entry>720x480, 704x480, 352x480, 352x240</entry> + <entry>720x480, 704x480, 352x480, 352x240</entry> <entry>MPEG-2</entry> <entry>9800 kbps</entry> <entry>48000 Hz</entry> @@ -4931,7 +4931,7 @@ legyen. <entry>NTSC DVD</entry> <entry>352x240<footnote id='fn-rare-resolutions'><para> Ezek a felbontások ritkán használatosak a DVD-ken, mert elég - alacsony minÅ‘ségűek.</para></footnote></entry> + alacsony minÅ‘ségűek.</para></footnote></entry> <entry>MPEG-1</entry> <entry>1856 kbps</entry> <entry>48000 Hz</entry> diff --git a/DOCS/xml/hu/faq.xml b/DOCS/xml/hu/faq.xml index caafd6decf..45d30c36c1 100644 --- a/DOCS/xml/hu/faq.xml +++ b/DOCS/xml/hu/faq.xml @@ -466,7 +466,7 @@ Letöltöttem egy videót egy P2P hálózatról és nem megy! </para></question> <answer><para> A fájlod valószÃnűleg sérült vagy fake. Ha egy ismerÅ‘stÅ‘l kaptad és Å‘ -azt mondja, hogy működik, hasonlÃtsd össze az +azt mondja, hogy működik, hasonlÃtsd össze az <application>md5sum</application> hash-eket. </para></answer> </qandaentry> diff --git a/DOCS/xml/hu/mencoder.xml b/DOCS/xml/hu/mencoder.xml index 6bce44cc2c..2b429d67b3 100644 --- a/DOCS/xml/hu/mencoder.xml +++ b/DOCS/xml/hu/mencoder.xml @@ -373,7 +373,7 @@ mencoder dvd://2 -ovc lavc -lavcopts vcodec=mpeg4:mbd=2:trell:vpass=2 \ <para> A <application>MEncoder</application> támogatja a Sony PSP videó formátumába -történÅ‘ kódolást, de a PSP szoftverének változatától függÅ‘en különbözÅ‘ +történÅ‘ kódolást, de a PSP szoftverének változatától függÅ‘en különbözÅ‘ korlátok vannak. Nyugodt lehetsz, ha a következÅ‘ korlátokat figyelembe veszed: <itemizedlist> @@ -610,7 +610,7 @@ mencoder mf://<replaceable>frame001.jpg,frame002.jpg</replaceable> -mf w=800:h=6 Egy MPEG-4 fájl létrehozása JPEG fájlok explicit listájából (az aktuális könyvtárban lévÅ‘ lista.txt tartalmazza a forrásként felhasználandó fájlokat, soronként egyet): <screen> -mencoder mf://<replaceable>@lista.txt</replaceable> -mf w=800:h=600:fps=25:type=jpg \ +mencoder mf://<replaceable>@lista.txt</replaceable> -mf w=800:h=600:fps=25:type=jpg \ -ovc lavc -lavcopts vcodec=mpeg4:mbd=2:trell -oac copy -o <replaceable>kimenet.avi</replaceable> </screen> </para> diff --git a/DOCS/xml/hu/ports.xml b/DOCS/xml/hu/ports.xml index 18452fbaaf..2a52ae9f71 100644 --- a/DOCS/xml/hu/ports.xml +++ b/DOCS/xml/hu/ports.xml @@ -527,7 +527,7 @@ levelezési listát is segÃtéségért és a legfrissebb információkért. A hivatalos Windows-os binárisok megtalálhatóak a <ulink url="http://www.mplayerhq.hu/design7/dload.html">letöltési oldalon</ulink>. A külsÅ‘ forrásból származó telepÃtÅ‘ csomagokat és egyszerű GUI frontend-eket -összegyűjtöttük a +összegyűjtöttük a <ulink url="http://www.mplayerhq.hu/design7/projects.html#windows">kapcsolódó projektek oldal</ulink> Windows-os részében. </para> @@ -616,7 +616,7 @@ is segÃthet. Ha a lejátszás szaggatott, próbáld meg a <option>-autosync 100</option> opciót. Ha ezek közül bármelyik segÃt, Ãrd be a konfigurációs fájlodba. </para> - + <note> <para> Ha Pentium 4-ed van és fagyásokat tapasztalsz a RealPlayer @@ -670,7 +670,7 @@ alaphelyzetben nincs benne a <application>MinGW</application>-ben. ÃllÃtsd be a <option>--prefix=/mingw</option> kapcsolóval és telepÃtsd, mielÅ‘tt az <application>MPlayer</application>t fordÃtanád. </para> - + <para> Az <application>MPlayer</application> és a szükséges függvénykönyvtárak elkészÃtésének módját elolvashatod az @@ -824,7 +824,7 @@ Lehet, hogy szerkesztened kell a <filename>config.mak</filename> fájlt és <para> Folytasd a <screen>make</screen> -paranccsal, majd menj a mplayerosx könyvtárba és Ãrd be +paranccsal, majd menj a mplayerosx könyvtárba és Ãrd be <screen>make dist</screen> Ez egy tömörÃtett <systemitem>.dmg</systemitem> archÃvot hoz létre egy használatra kész binárissal. diff --git a/DOCS/xml/hu/skin.xml b/DOCS/xml/hu/skin.xml index 71f95ef054..cfbb4581bf 100644 --- a/DOCS/xml/hu/skin.xml +++ b/DOCS/xml/hu/skin.xml @@ -92,13 +92,13 @@ aktiválható). és <emphasis>cÃmkék</emphasis>. Minden egyes elemnek meg kell adnod a pozÃcióját és a méretét. </para> - + <para> Egy <emphasis role="bold">gomb</emphasis>nak három állása van (lenyomott, felengedett, letiltott), Ãgy a képe függÅ‘legesen három részre van osztva. Lásd a <link linkend="skin-button">gomb</link> elemet a részletekért. </para> - + <para> Egy <emphasis role="bold">potmeter</emphasis>nek (fÅ‘ként a keresÅ‘ sáv és a hangerÅ‘/balansz állÃtó) bármennyi fázisa lehet a képének egymás alatti @@ -106,7 +106,7 @@ aktiválható). <link linkend="skin-hpotmeter">hpotmeter</link>t és <link linkend="skin-potmeter">potmeter</link>t a részletekért. </para> - + <para> A <emphasis role="bold">cÃmkék</emphasis> egy kicsit különlegesek: A megrajzolásukhoz szükséges karaktereket egy kép fájlból nyerjük és @@ -781,7 +781,7 @@ Ahol az <literal><replaceable>image</replaceable></literal> a betűhöz használ kép fájl neve (nem kell megadnod a kiterjesztést). <anchor id="skin-font-char"/> <programlisting>"char" = X, Y, width, height</programlisting> -Itt az <literal>X</literal> és az <literal>Y</literal> a +Itt az <literal>X</literal> és az <literal>Y</literal> a <literal>char</literal> karakter pozÃcióját adja meg a képen (<literal>0,0</literal> a bal felsÅ‘ sarok). A <literal>width</literal> és a <literal>height</literal> a karakter méretei pixelben. diff --git a/DOCS/xml/hu/video.xml b/DOCS/xml/hu/video.xml index f6055a9815..7f1d109253 100644 --- a/DOCS/xml/hu/video.xml +++ b/DOCS/xml/hu/video.xml @@ -2020,7 +2020,7 @@ lejátszást a Creative DXR2 kártyával. <para> Mindenek elÅ‘tt megfelelÅ‘en telepÃtett DXR2 vezérlÅ‘ kell. A vezérlÅ‘t és -a telepÃtési útmutatót megtalálhatod a +a telepÃtési útmutatót megtalálhatod a <ulink url="http://dxr2.sf.net/">DXR2 Resource Center</ulink> oldalán. </para> diff --git a/DOCS/xml/ru/encoding-guide.xml b/DOCS/xml/ru/encoding-guide.xml index 1f8024fcc3..e7200d6bcb 100644 --- a/DOCS/xml/ru/encoding-guide.xml +++ b/DOCS/xml/ru/encoding-guide.xml @@ -7,17 +7,17 @@ <title>Создание выÑококачеÑтвенного MPEG-4 ("DivX") рипа из DVD фильма</title> <para> -Одним чаÑто задаваемым вопроÑом ÑвлÑетÑÑ "Как мне Ñделать рип Ñамого выÑокого +Одним чаÑто задаваемым вопроÑом ÑвлÑетÑÑ "Как мне Ñделать рип Ñамого выÑокого качеÑтва Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ размера?". Другой Ð²Ð¾Ð¿Ñ€Ð¾Ñ "Как мне Ñоздать DVD рип Ñ Ñамым -выÑоким возможным качеÑтвом? Я не беÑпокоюÑÑŒ о размере файла, мне нужно лишь +выÑоким возможным качеÑтвом? Я не беÑпокоюÑÑŒ о размере файла, мне нужно лишь наилучшее качеÑтво.". </para> <para> ПоÑледний вопроÑ, похоже, отчаÑти неверно Ñформулирован. Ð’ конце концов, еÑли -Ð’Ñ‹ не беÑпокоитеÑÑŒ о размере файла, почему бы проÑто не Ñкопировать веÑÑŒ MPEG-2 +Ð’Ñ‹ не беÑпокоитеÑÑŒ о размере файла, почему бы проÑто не Ñкопировать веÑÑŒ MPEG-2 видео поток Ñ DVD? Конечно, Ваш AVI файл будет занимать около 5GB, -но еÑли Ð’Ñ‹ желаете наилучшее качеÑтво и не волнуетеÑÑŒ о размере, то Ñто, +но еÑли Ð’Ñ‹ желаете наилучшее качеÑтво и не волнуетеÑÑŒ о размере, то Ñто, неÑомненно, лучшее решение. </para> @@ -38,7 +38,7 @@ </para> <para> -ЕÑли Ñто кажетÑÑ Ð´Ð»Ñ Ð’Ð°Ñ Ñлишком Ñложным, то Вам, пожалуй, Ñледует иÑпользовать +ЕÑли Ñто кажетÑÑ Ð´Ð»Ñ Ð’Ð°Ñ Ñлишком Ñложным, то Вам, пожалуй, Ñледует иÑпользовать один из многочиÑленных неплохих фронтендов, указанных в <ulink url="http://www.mplayerhq.hu/design7/projects.html#mencoder_frontends">разделе MEncoder</ulink> нашей Ñтраницы родÑтвенных проектов. @@ -59,8 +59,8 @@ <para> Первым и наиболее важным шагом перед кодированием должно быть определение типа Ñодержимого, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼ Ð’Ñ‹ работаете. -ЕÑли иÑточником Ваших иÑходных материалов ÑвлÑетÑÑ DVD или -широковещательное/кабельное/Ñпутниковое TV, оно будет ÑодержатьÑÑ Ð² одном из +ЕÑли иÑточником Ваших иÑходных материалов ÑвлÑетÑÑ DVD или +широковещательное/кабельное/Ñпутниковое TV, оно будет ÑодержатьÑÑ Ð² одном из двух форматов: NTSC Ð´Ð»Ñ Ð¡ÐµÐ²ÐµÑ€Ð½Ð¾Ð¹ Ðмерики и Японии, PAL Ð´Ð»Ñ Ð•Ð²Ñ€Ð¾Ð¿Ñ‹ и Ñ‚.д.. Однако, важно понимать, что Ñто только форматирование Ð´Ð»Ñ Ð¿Ð¾ÐºÐ°Ð·Ð° на телевидении, и оно чаÑто @@ -69,7 +69,7 @@ Опыт показывает, что NTSC материал ÑущеÑтвенно более Ñложен Ð´Ð»Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ, Ñ‚.к. в нём ÑодержитÑÑ Ð±Ð¾Ð»ÑŒÑˆÐµ Ñлементов, которые нужно идентифицировать. Ð”Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ ÑƒÐ´Ð°Ñ‡Ð½Ð¾Ð³Ð¾ кодированиÑ, Вам необходимо знать иÑходный формат. -Отказ от принÑÑ‚Ð¸Ñ Ñтого во внимание приведёт к различным дефектам в Вашем +Отказ от принÑÑ‚Ð¸Ñ Ñтого во внимание приведёт к различным дефектам в Вашем кодировании, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ð±ÐµÐ·Ð¾Ð±Ñ€Ð°Ð·Ð½Ñ‹Ðµ гребешки (артефакты череÑÑтрочной развёртки) и повторÑющиеÑÑ Ð¸Ð»Ð¸ даже потерÑнные кадры. Кроме ÑƒÑ…ÑƒÐ´ÑˆÐµÐ½Ð¸Ñ ÐºÐ°Ñ€Ñ‚Ð¸Ð½ÐºÐ¸, артефакты так же уменьшают ÑффективноÑÑ‚ÑŒ кодированиÑ: @@ -80,7 +80,7 @@ <sect3 id="menc-feat-dvd-mpeg4-preparing-encode-fps"> <title>Определение кадровой чаÑтоты иÑточника</title> <para> -Вот ÑпиÑок, Ñодержащий общие типы иÑходных материалов, где они, +Вот ÑпиÑок, Ñодержащий общие типы иÑходных материалов, где они, преимущеÑтвенно, вÑтречаютÑÑ Ð¸ их ÑвойÑтва: </para> @@ -110,7 +110,7 @@ Ð’ других отношениÑÑ… аналогично PAL. </para></listitem> <listitem><para> - <emphasis role="bold">ÐнимациÑ</emphasis>: Обычно риÑуетÑÑ Ð½Ð° 24 fps, + <emphasis role="bold">ÐнимациÑ</emphasis>: Обычно риÑуетÑÑ Ð½Ð° 24 fps, но также ÑущеÑтвуют разновидноÑти Ñо Ñмешанной кадровой чаÑтотой. </para></listitem> <listitem><para> @@ -119,7 +119,7 @@ 24 и 30 кадров в Ñекунду типичны Ð´Ð»Ñ NTSC, и 25 fps типично Ð´Ð»Ñ PAL. </para></listitem> <listitem><para> - <emphasis role="bold">Старый фильм</emphasis>: Различные низкие + <emphasis role="bold">Старый фильм</emphasis>: Различные низкие кадровые чаÑтоты. </para></listitem> </itemizedlist> @@ -146,18 +146,18 @@ <emphasis role="bold">Любой</emphasis> фильм, подготовленный Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра на телевидении (Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ DVD), преобразуетÑÑ Ð² формат, оÑнованный на полÑÑ…. -<!-- FIXME: СущеÑтвует ли лучший *краткий* (1-2 Ñлова) перевод Ð´Ð»Ñ - терминов pulldown и telecine? Ð’ литературе, которую Ñ Ð½Ð°ÑˆÑ‘Ð», - иÑпользуют или указанные мной, по Ñути дела, транÑлитерации, +<!-- FIXME: СущеÑтвует ли лучший *краткий* (1-2 Ñлова) перевод Ð´Ð»Ñ + терминов pulldown и telecine? Ð’ литературе, которую Ñ Ð½Ð°ÑˆÑ‘Ð», + иÑпользуют или указанные мной, по Ñути дела, транÑлитерации, или так и оÑтавлÑÑŽÑ‚ английÑкие названиÑ. Рточный перевод можно выполнить только целым предложением - (Ñ‚.е. определением), что Ñовершенно неумеÑтно в контекÑте + (Ñ‚.е. определением), что Ñовершенно неумеÑтно в контекÑте данного документа, где Ñти термины чаÑто вÑтречаютÑÑ. --> -Различные методы, Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ которых Ñто может быть Ñделано, Ñовокупно -называютÑÑ "телеÑин" (англ. telecine), одним из вариантов которого +Различные методы, Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ которых Ñто может быть Ñделано, Ñовокупно +называютÑÑ "телеÑин" (англ. telecine), одним из вариантов которого ÑвлÑетÑÑ Ð¾Ñ‚Ð²Ñ€Ð°Ñ‚Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ð¹ NTSC "3:2 пулдаун" (англ. pulldown). -За иÑключением Ñлучаев, когда формат иÑходного материала был -также оÑнован на полÑÑ… (и Ñ Ñ‚Ð°ÐºÐ¾Ð¹ же чаÑтотой полей), Ð’Ñ‹ получите +За иÑключением Ñлучаев, когда формат иÑходного материала был +также оÑнован на полÑÑ… (и Ñ Ñ‚Ð°ÐºÐ¾Ð¹ же чаÑтотой полей), Ð’Ñ‹ получите фильм в формате отличном от иÑходного. </para> @@ -165,14 +165,14 @@ <title>СущеÑтвует неÑколько общих типов пулдауна:</title> <listitem><para> <emphasis role="bold">PAL 2:2 пулдаун</emphasis>: Ðаилучший из вÑех. - Каждый кадр показываетÑÑ Ð·Ð° Ð²Ñ€ÐµÐ¼Ñ Ð´Ð»Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ñти двух полей путем + Каждый кадр показываетÑÑ Ð·Ð° Ð²Ñ€ÐµÐ¼Ñ Ð´Ð»Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ñти двух полей путем Ð¸Ð·Ð²Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ Ñ‡Ñ‘Ñ‚Ð½Ñ‹Ñ… и нечётных Ñтрок и их попеременного показа. ЕÑли в иÑходном материале 24 fps, то Ñто уÑкорÑет воÑпроизведение фильма на 4%. </para></listitem> <listitem><para> <emphasis role="bold">PAL 2:2:2:2:2:2:2:2:2:2:2:3 пулдаун</emphasis>: - Каждый 12-й кадр показываетÑÑ Ð·Ð° Ð²Ñ€ÐµÐ¼Ñ Ð´Ð»Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ñти трёх полей, + Каждый 12-й кадр показываетÑÑ Ð·Ð° Ð²Ñ€ÐµÐ¼Ñ Ð´Ð»Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ñти трёх полей, вмеÑто двух. Ðто помогает избежать проблемы 4%-го уÑкорениÑ, но делает обращение процеÑÑа ÑущеÑтвенно более Ñложным. @@ -183,7 +183,7 @@ <emphasis role="bold">NTSC 3:2 телеÑин</emphasis>: Кадры показываютÑÑ Ð¿Ð¾Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð¾ за Ð²Ñ€ÐµÐ¼Ñ Ð´Ð»Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ñти 3-Ñ… полей или 2-Ñ… полей. Ðто даёт чаÑтоту полей в 2.5 раза больше иÑходной чаÑтоты кадров. - Результат также очень незначительно замедлÑетÑÑ Ð¾Ñ‚ 60 до 60000/1001 + Результат также очень незначительно замедлÑетÑÑ Ð¾Ñ‚ 60 до 60000/1001 полей в Ñекунду Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð°Ð½Ð¸Ñ Ñ‡Ð°Ñтоты полей NTSC. </para></listitem> <listitem><para> @@ -205,19 +205,19 @@ </para> <para> -Когда видео находитÑÑ Ð½Ð° DVD, поÑледовательные пары полей +Когда видео находитÑÑ Ð½Ð° DVD, поÑледовательные пары полей группируютÑÑ ÐºÐ°Ðº кадр, даже еÑли они не предназначены Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ð¾Ð³Ð¾ отображениÑ. Стандарт MPEG-2, иÑпользуемый на DVD и цифровом TV предоÑтавлÑет возможноÑÑ‚ÑŒ одновременно кодировать иÑходные кадры Ñ Ð¿Ð¾Ñтрочной -развёрткой и ÑохранÑÑ‚ÑŒ чиÑло полей, в течении которых кадр +развёрткой и ÑохранÑÑ‚ÑŒ чиÑло полей, в течении которых кадр должен быть показан, в его заголовке. ЕÑли был иÑпользован такой метод, фильм чаÑто будет называтьÑÑ ÐºÐ°Ðº "мÑгкий телеÑин", Ñ‚.к. процеÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ указывает DVD-плееру о необходимоÑти Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿ÑƒÐ»Ð´Ð°ÑƒÐ½Ð° к фильму, не изменÑÑ Ð¿Ñ€Ð¸ Ñтом Ñам фильм. Ðтот Ñлучай ÑущеÑтвенно предпочтителен, Ñ‚.к. он может быть легко обращён -(в дейÑтвительноÑти, проигнорирован) кодером и Ñ‚.к. он ÑохранÑет +(в дейÑтвительноÑти, проигнорирован) кодером и Ñ‚.к. он ÑохранÑет макÑимальное качеÑтво. Однако, многие широковещательные и DVD Ñтудии не иÑпользуют надлежащую технологию ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ вмеÑто Ñтого производÑÑ‚ @@ -226,28 +226,28 @@ </para> <para> -ПорÑдок дейÑÑ‚Ð²Ð¸Ñ Ð² таких ÑлучаÑÑ… будет опиÑан +ПорÑдок дейÑÑ‚Ð²Ð¸Ñ Ð² таких ÑлучаÑÑ… будет опиÑан <link linkend="menc-feat-telecine">позже в данном руководÑтве</link>. -Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð¼Ñ‹ дадим Вам неÑколько Ñоветов по идентификации типа +Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð¼Ñ‹ дадим Вам неÑколько Ñоветов по идентификации типа материала, Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼ Ð’Ñ‹ работаете: </para> <itemizedlist> -<title>ОблаÑти NTSC:</title> +<title>Регионы NTSC:</title> <listitem><para> - ЕÑли при проÑмотре Вашего фильма <application>MPlayer</application> + ЕÑли при проÑмотре Вашего фильма <application>MPlayer</application> выводит, что чаÑтота кадров была изменена до 24000/1001 и она никогда не менÑетÑÑ Ð¾Ð±Ñ€Ð°Ñ‚Ð½Ð¾, то Ñто почти навернÑка Ñодержимое - Ñ Ð¿Ð¾Ñтрочной развёрткой, которое было подвергнуто + Ñ Ð¿Ð¾Ñтрочной развёрткой, которое было подвергнуто "мÑгкому телеÑину". </para></listitem> <listitem><para> - ЕÑли <application>MPlayer</application> отображает попеременные - Ð¿ÐµÑ€ÐµÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ñ‡Ð°Ñтоты кадров между 24000/1001 и 30000/1001, и Ð’Ñ‹ + ЕÑли <application>MPlayer</application> отображает попеременные + Ð¿ÐµÑ€ÐµÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ñ‡Ð°Ñтоты кадров между 24000/1001 и 30000/1001, и Ð’Ñ‹ иногда видите "гребешки", еÑÑ‚ÑŒ неÑколько возможноÑтей. - Сегменты Ñ 24000/1001 fps почти навернÑка ÑвлÑÑŽÑ‚ÑÑ "мÑгко + Сегменты Ñ 24000/1001 fps почти навернÑка ÑвлÑÑŽÑ‚ÑÑ "мÑгко телеÑиненным" Ñодержимым Ñ Ð¿Ð¾Ñтрочной развёрткой, но чаÑти Ñ - 30000/1001 fps могут быть как "жёÑтко телеÑиненым" Ñодержимым + 30000/1001 fps могут быть как "жёÑтко телеÑиненым" Ñодержимым Ñ 24000/1001 fps, так и NTSC видео Ñ 60000/1001 полÑми в Ñекунду. ИÑпользуйте два нижеÑледующих руководÑтва Ð´Ð»Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ñ‚Ð¾Ð³Ð¾, Ñ ÐºÐ°ÐºÐ¸Ð¼ Ñлучаем Ð’Ñ‹ имеете дело. @@ -255,7 +255,7 @@ <listitem><para> ЕÑли <application>MPlayer</application> никогда не показывает Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÐºÐ°Ð´Ñ€Ð¾Ð²Ð¾Ð¹ чаÑтоты и каждый отдельный кадр, где еÑÑ‚ÑŒ - движение, оказываетÑÑ Ð³Ñ€ÐµÐ±Ñ‘Ð½ÐºÐ¾Ð¹, Ваш фильм еÑÑ‚ÑŒ NTSC видео Ñ + движение, оказываетÑÑ Ð³Ñ€ÐµÐ±Ñ‘Ð½ÐºÐ¾Ð¹, Ваш фильм еÑÑ‚ÑŒ NTSC видео Ñ 60000/1001 полÑми в Ñекунду. </para></listitem> <listitem><para> @@ -267,7 +267,7 @@ </itemizedlist> <itemizedlist> -<title>ОблаÑти PAL:</title> +<title>Регионы PAL:</title> <listitem><para> ЕÑли Ð’Ñ‹ не видите никакой гребёнки, Ваш фильм еÑÑ‚ÑŒ 2:2 пулдаун. </para></listitem> @@ -276,18 +276,18 @@ Ваш фильм предÑтавлÑет Ñобой 2:2:2:2:2:2:2:2:2:2:2:3 пулдаун. </para></listitem> <listitem><para> - ЕÑли Ð’Ñ‹ вÑегда видите гребёнки во Ð²Ñ€ÐµÐ¼Ñ Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ, значит Ваш + ЕÑли Ð’Ñ‹ вÑегда видите гребёнки во Ð²Ñ€ÐµÐ¼Ñ Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ, значит Ваш фильм ÑвлÑетÑÑ PAL видео Ñ 50 полÑми в Ñекунду. </para></listitem> </itemizedlist> <note><title>ПодÑказка:</title> <para> - <application>MPlayer</application> может замедлить воÑпроизведение + <application>MPlayer</application> может замедлить воÑпроизведение фильма Ñ Ð¾Ð¿Ñ†Ð¸ÐµÐ¹ -speed или воÑпроизводить его покадрово. - Попробуйте иÑпользовать опцию <option>-speed 0.2</option> Ð´Ð»Ñ - очень медленного проÑмотра фильма или неÑколько раз нажмите - клавишу "<keycap>.</keycap>" Ð´Ð»Ñ Ð²Ð¾ÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ кадра + Попробуйте иÑпользовать опцию <option>-speed 0.2</option> Ð´Ð»Ñ + очень медленного проÑмотра фильма или нажимайте + клавишу "<keycap>.</keycap>" Ð´Ð»Ñ Ð²Ð¾ÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ кадра за раз и идетнифицируйте образец, еÑли не можете его увидеть на полной ÑкороÑти. </para> @@ -298,7 +298,7 @@ <!-- ********** --> <sect2 id="menc-feat-dvd-mpeg4-2pass"> -<title>ПоÑтоÑнный квантователь против многопроходноÑти</title> +<title>ПоÑтоÑнный квантователь в Ñравнении Ñ Ð¼Ð½Ð¾Ð³Ð¾Ð¿Ñ€Ð¾Ñ…Ð¾Ð´Ð½Ð¾Ñтью</title> <para> Возможно кодировать Ваш фильм, широко Ð²Ð°Ñ€ÑŒÐ¸Ñ€ÑƒÑ ÐºÐ°Ñ‡ÐµÑтво. @@ -310,7 +310,7 @@ </para> <para> -ЕÑÑ‚ÑŒ три подхода при кодировании видео: поÑтоÑнный битпоток (CBR), +ЕÑÑ‚ÑŒ три подхода при кодировании видео: поÑтоÑнный битпоток (CBR), поÑтоÑнный квантователь и многопроходноÑÑ‚ÑŒ (ABR или уÑреднённый битпоток). </para> @@ -322,8 +322,8 @@ Однако, в таких проÑÑ‚Ñ‹Ñ… режимах как CBR кодеры не знают загруженноÑÑ‚ÑŒ битпотока в поÑледующих Ñценах и Ñ‚.о. не могут превыÑить затребованный битпоток Ð´Ð»Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ñ… промежутков времени. -Более продвинутые режимы, такие как многопроходный режим, могут -учитывать ÑтатиÑтику предыдущих проходов; Ñто решает проблему, +Более Ñовершенные режимы, такие как многопроходный режим, могут +учитывать ÑтатиÑтику предыдущих проходов; Ñто решает проблему, упомÑнутую выше. </para> @@ -346,10 +346,10 @@ Ð’ каждом из Ñтих режимов видеокодек (такой как <systemitem class="library">libavcodec</systemitem>) разбивает видеокадр на макроблоки размером 16Ñ…16 пикÑелей и потом -применÑет квантователь к каждому макроблоку. Чем меньше квантоваль, +применÑет квантователь к каждому макроблоку. Чем меньше квантоваль, тем лучше качеÑтво и выше битпоток. Метод, иÑпользуемый видео кодером Ð´Ð»Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ñ‚Ð¾Ð³Ð¾, какой -квантователь иÑпользовать Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ макроблока, варьируетÑÑ Ð¸ +квантователь иÑпользовать Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ макроблока, варьируетÑÑ Ð¸ подлежит тонкой наÑтройке. (Ðто крайнее упрощение реального процеÑÑа, но оÑÐ½Ð¾Ð²Ð½Ð°Ñ ÐºÐ¾Ð½Ñ†ÐµÐ¿Ñ†Ð¸Ñ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð° Ð´Ð»Ñ Ð¿Ð¾Ð½Ð¸Ð¼Ð°Ð½Ð¸Ñ.) </para> @@ -361,7 +361,7 @@ ЕÑли Ð’Ð°Ñ Ð´ÐµÐ¹Ñтвительно не волнует размер файла, Ð’Ñ‹ можете также иÑпользовать CBR и указать беÑконечный битпоток. (Ðа практике Ñто означает значение, доÑтаточно большое Ð´Ð»Ñ Ð¾Ð±Ð¾Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¾Ñ‚ÑутÑÑ‚Ð²Ð¸Ñ -предела, например, 10000 Кбит.) Ð’ результате, без реального Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ +предела, например, 10000 Кбит.) Ð’ результате, без реального Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð±Ð¸Ñ‚Ð¿Ð¾Ñ‚Ð¾ÐºÐ°, кодек иÑпользует наименьший возможный квантователь Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ макроблока (как указано опцией <option>vqmin</option> Ð´Ð»Ñ @@ -371,27 +371,26 @@ иÑпортите качеÑтво Вашего видео. Чтобы избежать Ñтого, Вам, вероÑтно, придётÑÑ ÑƒÐ¼ÐµÐ½ÑŒÑˆÐ¸Ñ‚ÑŒ размеры Вашего видео, ÑоглаÑно методу, опиÑанному далее в Ñтом руководÑтве. -Ð’ общих чертах, Вам Ñледует избегать CBR ÑовÑем, еÑли Ð’Ñ‹ заботитеÑÑŒ -о качеÑтве. +Ð’ общем, Вам Ñледует избегать CBR ÑовÑем, еÑли Ð’Ñ‹ заботитеÑÑŒ о качеÑтве. </para> <para> С поÑтоÑнным квантователем кодек иÑпользует Ð´Ð»Ñ Ð²Ñех макроблоков один и тот же квантователь, указанный в опции -<option>vqscale</option> (Ð´Ð»Ñ +<option>vqscale</option> (Ð´Ð»Ñ <systemitem class="library">libavcodec</systemitem>). -ЕÑли Ð’Ñ‹ хотите рип наивыÑшего возможного качеÑтва, Ñнова не Ð²Ð·Ð¸Ñ€Ð°Ñ +ЕÑли Ð’Ñ‹ хотите рип наивыÑшего возможного качеÑтва, Ñнова не Ð²Ð·Ð¸Ñ€Ð°Ñ Ð½Ð° битпоток, Ð’Ñ‹ можете иÑпользовать <option>vqscale=2</option>. -Ðто приведёт к тому же битпотоку и PSNR (пику Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ Ñигнала к шуму), -что и CBR Ñ -<option>vbitrate</option>=беÑконечноÑти и значением по умолчанию +Ðто приведёт к тому же битпотоку и PSNR (пику Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ Ñигнала к шуму), +что и CBR Ñ +<option>vbitrate</option>=беÑконечноÑти и значением по умолчанию <option>vqmin</option>, равным 2. </para> <para> Проблема Ñ Ð¿Ð¾ÑтоÑнным квантованием заключаетÑÑ Ð² том, что кодек иÑпользует -заданный квантователь вне завиÑимоÑти от того, требуетÑÑ Ñто Ð´Ð»Ñ +заданный квантователь вне завиÑимоÑти от того, требуетÑÑ Ñто Ð´Ð»Ñ Ð¼Ð°ÐºÑ€Ð¾Ð±Ð»Ð¾ÐºÐ° или нет. То еÑÑ‚ÑŒ возможно иÑпользование большего ÐºÐ²Ð°Ð½Ñ‚Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ Ð¼Ð°ÐºÑ€Ð¾Ð±Ð»Ð¾ÐºÐ° без ÑƒÑ…ÑƒÐ´ÑˆÐµÐ½Ð¸Ñ Ð²Ð¸Ð´Ð¸Ð¼Ð¾Ð³Ð¾ качеÑтва. Зачем тратить биты на излишне низкий квантователь? У Вашего процеÑÑора еÑÑ‚ÑŒ Ñтолько тактов, @@ -400,13 +399,13 @@ </para> <para> -При двупроходном кодировании первый проход ÑоздаÑÑ‚ рип фильма так, +При двупроходном кодировании первый проход ÑоздаÑÑ‚ рип фильма так, как будто Ñто был CBR, но Ñохранит лог ÑвойÑтв Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ кадра. Ðта Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð·Ð°Ñ‚ÐµÐ¼ будет иÑпользована во Ð²Ñ€ÐµÐ¼Ñ Ð²Ñ‚Ð¾Ñ€Ð¾Ð³Ð¾ прохода Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð½ÑÑ‚Ð¸Ñ Ð¸Ð½Ñ‚ÐµÐ»Ð»ÐµÐºÑ‚ÑƒÐ°Ð»ÑŒÐ½Ñ‹Ñ… решений о том, какой квантователь -Ñледует иÑпользовать. Во Ð²Ñ€ÐµÐ¼Ñ Ð±Ñ‹Ñтрого Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ Ñцен Ñ -выÑокой детализацией Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¾Ð¹ вероÑтноÑтью будут иÑпользованы -бОльшие квантователи, а во Ð²Ñ€ÐµÐ¼Ñ Ð¼ÐµÐ´Ð»ÐµÐ½Ð½Ð¾Ð³Ð¾ Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ Ñцен +Ñледует иÑпользовать. Во Ð²Ñ€ÐµÐ¼Ñ Ð±Ñ‹Ñтрого Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ Ñцен Ñ +выÑокой детализацией Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¾Ð¹ вероÑтноÑтью будут иÑпользованы +б<emphasis>о</emphasis>льшие квантователи, а во Ð²Ñ€ÐµÐ¼Ñ Ð¼ÐµÐ´Ð»ÐµÐ½Ð½Ð¾Ð³Ð¾ Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ Ñцен Ñ Ð½Ð¸Ð·ÐºÐ¾Ð¹ детализацией — меньшие. Обычно количеÑтво Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð³Ñ€Ð°ÐµÑ‚ ÑущеÑтвенно более важную роль, чем количеÑтво деталей. @@ -417,7 +416,7 @@ ЕÑли Ð’Ñ‹ иÑпользуете <option>vqscale=3</option>, то Ð’Ñ‹ не получаете рип наивыÑшего качеÑтва. Предположим, Ð’Ñ‹ делаете рип DVD, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ <option>vqscale=3</option>, результат получаетÑÑ 1800 Кбит. -ЕÑли Ð’Ñ‹ Ñделаете двупроходное кодирование Ñ +ЕÑли Ð’Ñ‹ Ñделаете двупроходное кодирование Ñ <option>vbitrate=1800</option>, получившееÑÑ Ð²Ð¸Ð´ÐµÐ¾ будет обладать <emphasis role="bold">лучшим качеÑтвом</emphasis> Ð´Ð»Ñ <emphasis role="bold">того же битпотока</emphasis>. @@ -446,8 +445,8 @@ <para> ЕÑли Вашей целью ÑвлÑетÑÑ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ñ‘Ð½Ð½Ñ‹Ð¹ размер, Вам нужно как-нибудь вычиÑлить битпоток. Ðо перед Ñтим, Вам нужно знать, Ñколько меÑта -нужно зарезервировать по аудио дорожку(и), так что Вам необходимо -<link linkend="menc-feat-dvd-mpeg4-audio">извлечь их</link> Ñперва. +нужно зарезервировать по аудио дорожку(и), так что Вам необходимо +Ñперва <link linkend="menc-feat-dvd-mpeg4-audio">извлечь их</link>. Ð’Ñ‹ можете раÑÑчитать битпоток Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Ñледующей формулы: <systemitem>битпоток = (конечный_размер_в_МБайт - размер_звука_в_МБайт) * 1024 * 1024 / длительноÑÑ‚ÑŒ_в_Ñекундах * 8 / 1000</systemitem>. @@ -465,14 +464,14 @@ <para> Из-за оÑобенноÑтей MPEG-подобного ÑжатиÑ, ÑущеÑтвуют различные -ограничениÑ, которым Ð’Ñ‹ должны Ñледовать Ð´Ð»Ñ Ð´Ð¾ÑÑ‚Ð¸Ð¶ÐµÐ½Ð¸Ñ +ограничениÑ, которым Ð’Ñ‹ должны Ñледовать Ð´Ð»Ñ Ð´Ð¾ÑÑ‚Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð¼Ð°ÐºÑимального качеÑтва. MPEG разбивает видео на квадраты 16Ñ…16, называемые макроблоками. Каждый макроблок ÑоÑтоит из 4 блоков 8Ñ…8 Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸ÐµÐ¹ о люме (интенÑивноÑти) и двух блоков 8Ñ…8 Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸ÐµÐ¹ о хроме (цвете) половинного Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ (один Ð´Ð»Ñ ÐºÑ€Ð°Ñно-бирюзовой оÑи и другой Ð´Ð»Ñ Ð¶Ñ‘Ð»Ñ‚Ð¾-голубой оÑи). -Даже еÑли ширина и выÑота Вашего фильма не кратны 16, кодер +Даже еÑли ширина и выÑота Вашего фильма не кратны 16, кодер вÑÑ‘ равно иÑпользует нужное количеÑтво макроблоков 16Ñ…16 Ð´Ð»Ñ Ð¿Ð¾ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð²Ñей облаÑти картинки, Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¾Ð±Ð»Ð°ÑÑ‚ÑŒ будет впуÑтую потрачена. Так что в интереÑах макÑимизации качеÑтва при фикÑированном размере @@ -481,8 +480,8 @@ MPEG разбивает видео на квадраты 16Ñ…16, называеР<para> У большинÑтва DVD также еÑÑ‚ÑŒ определённое подобие чёрных Ð¿Ð¾Ð»Ð¾Ñ Ð½Ð° -краÑÑ…. ЕÑли Ð’Ñ‹ их оÑтавите, Ñто может -<emphasis role="bold">Ñильно</emphasis> повредить качеÑтво +краÑÑ…. ЕÑли Ð’Ñ‹ их оÑтавите, Ñто может +<emphasis role="bold">Ñильно</emphasis> повредить качеÑтво неÑколькими путÑми. </para> @@ -490,7 +489,7 @@ MPEG разбивает видео на квадраты 16Ñ…16, называеР<listitem> <para> MPEG-подобное Ñжатие очень чувÑтвительно к преобразованиÑм - чаÑтотных интервалов, в чаÑтноÑти, к диÑкретному коÑинуÑному + чаÑтотных интервалов, в чаÑтноÑти, к диÑкретному коÑинуÑному преобразованию (DCT), которое аналогично преобразованию Фурье. Ðтот вид ÑÐ¶Ð°Ñ‚Ð¸Ñ Ñффективен Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´ÑÑ‚Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¾Ð±Ñ€Ð°Ð·Ð¾Ð² и Ñглаженных переходов, но у него возникают проблемы Ñ Ð¾Ñтрыми краÑми. @@ -504,22 +503,22 @@ MPEG разбивает видео на квадраты 16Ñ…16, называеРвозникает только в Ñлучае Ð¿Ð¾Ð¿Ð°Ð´Ð°Ð½Ð¸Ñ Ð¾Ñтрого ÐºÑ€Ð°Ñ Ð²Ð½ÑƒÑ‚Ñ€ÑŒ блока. ЕÑли Ваши чёрные Ð¿Ð¾Ð»Ñ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÑŽÑ‚ точно на границах, кратных 16 пикÑелÑм, Ñто не проблема. - Однако, чёрные полоÑÑ‹ на DVD редко хорошо раÑположены, так что - на практике Вам вÑегда придётÑÑ ÑƒÑекать Ñтороны Ð´Ð»Ñ Ð¸Ð·Ð±ÐµÐ¶Ð°Ð½Ð¸Ñ - Ñтих проблем. + Однако, чёрные полоÑÑ‹ на DVD редко хорошо раÑположены, так что + на практике Вам вÑегда придётÑÑ ÑƒÑекать Ñтороны Ð´Ð»Ñ Ð¸Ð·Ð±ÐµÐ¶Ð°Ð½Ð¸Ñ + Ñтих проблем. </para> </listitem> </orderedlist> <para> -Ð’ дополнение к преобразованиÑм чаÑтотных интервалов, MPEG-подобное -Ñжатие иÑпользует векторы Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ от +Ð’ дополнение к преобразованиÑм чаÑтотных интервалов, MPEG-подобное +Ñжатие иÑпользует векторы Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ от одного кадра к другому. Векторы движениÑ, еÑтеÑтвенно, работают ÑущеÑтвенно менее Ñффективно Ð´Ð»Ñ Ð½Ð¾Ð²Ñ‹Ñ… объектов, идущих от краёв картинки, поÑкольку они отÑутÑтвуют в предыдущих кадрах. Пока картинка проÑтираетÑÑ Ð²Ð¿Ð»Ð¾Ñ‚ÑŒ до ÐºÑ€Ð°Ñ ÐºÐ¾Ð´Ð¸Ñ€ÑƒÐµÐ¼Ð¾Ð¹ облаÑти, у векторов Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð½Ðµ возникает проблем Ñ Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸ÐµÐ¼ объектов -за пределы картинки. Однако, при наличии черных полей +за пределы картинки. Однако, при наличии черных полей могут возникнуть проблемы: </para> @@ -529,13 +528,13 @@ MPEG разбивает видео на квадраты 16Ñ…16, Ð½Ð°Ð·Ñ‹Ð²Ð°ÐµÐ Ð”Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ макроблока MPEG-подобное Ñжатие ÑохранÑет вектор, определÑющий ÐºÐ°ÐºÐ°Ñ Ñ‡Ð°ÑÑ‚ÑŒ предыдущего кадра должна быть Ñкопирована в Ñтот макроблок как оÑнова Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ñледующего кадра. - Кодированию подлежит только оÑтавшаÑÑÑ Ñ€Ð°Ð·Ð½Ð¾ÑÑ‚ÑŒ. ЕÑли макроблок + Кодированию подлежит только оÑтавшаÑÑÑ Ñ€Ð°Ð·Ð½Ð¾ÑÑ‚ÑŒ. ЕÑли макроблок проÑтираетÑÑ Ð´Ð¾ ÐºÑ€Ð°Ñ ÐºÐ°Ñ€Ñ‚Ð¸Ð½ÐºÐ¸ и Ñодержит чаÑÑ‚ÑŒ чёрной полоÑÑ‹, то векторы Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… чаÑтей картинки перепишут чёрную полоÑу. - Ðто означает, что много битов нужно потратить либо на повторное - чернение перепиÑанной полоÑÑ‹, либо (что более вероÑтно) вектор - Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð½Ðµ будет иÑпользован вовÑе и вÑе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñтого - макроблока будут Ñвно кодированы. Другими Ñловами, ÑффективноÑÑ‚ÑŒ + Ðто означает, что много битов нужно потратить либо на повторное + чернение перепиÑанной полоÑÑ‹, либо (что более вероÑтно) вектор + Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð½Ðµ будет иÑпользован вовÑе и вÑе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñтого + макроблока будут Ñвно кодированы. Так или иначе, ÑффективноÑÑ‚ÑŒ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÑущеÑтвенно уменьшаетÑÑ. </para> @@ -547,22 +546,22 @@ MPEG разбивает видео на квадраты 16Ñ…16, называеР<listitem> <para> - Ðаконец, предположим, что у Ð½Ð°Ñ ÐµÑÑ‚ÑŒ находÑщийÑÑ Ð²Ð½ÑƒÑ‚Ñ€Ð¸ картинки + Ðаконец, предположим, что у Ð½Ð°Ñ ÐµÑÑ‚ÑŒ находÑщийÑÑ Ð²Ð½ÑƒÑ‚Ñ€Ð¸ картинки макроблок и объект движетÑÑ Ð² Ñтот блок от ÐºÑ€Ð°Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ. - MPEG-подобное кодирование не может Ñказать "Ñкопируй ту чаÑÑ‚ÑŒ, + MPEG-подобное кодирование не может Ñказать "Ñкопируй ту чаÑÑ‚ÑŒ, что внутри картинки, но не чёрную полоÑу". Так что Ñ‡Ñ‘Ñ€Ð½Ð°Ñ Ð¿Ð¾Ð»Ð¾Ñа - также будет Ñкопирована внутрь, в результате чего маÑÑа битов + также будет Ñкопирована внутрь, в результате чего маÑÑа битов будет потрачена на кодирование чаÑти изображениÑ, которое должно быть на меÑте полоÑÑ‹. </para> <para> Ð”Ð»Ñ Ñлучаев, когда вÑÑ‘ изображение движетÑÑ Ðº краю кодируемой - облаÑти, у MPEG еÑÑ‚ÑŒ Ñпециальные оптимизации Ð´Ð»Ñ Ð¼Ð½Ð¾Ð³Ð¾ÐºÑ€Ð°Ñ‚Ð½Ð¾Ð³Ð¾ - ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¸ÐºÑелей на край картинки, когда вектор Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ - идёт извне облаÑти кодированиÑ. Ðта возможноÑÑ‚ÑŒ ÑтановитÑÑ - беÑполезной, еÑли у фильма еÑÑ‚ÑŒ чёрные полоÑÑ‹. Ð’ отличии от - Ñлучаев 1 и 2, выравнивание границ до кратноÑти 16 здеÑÑŒ + облаÑти, у MPEG еÑÑ‚ÑŒ Ñпециальные оптимизации Ð´Ð»Ñ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€ÑющегоÑÑ + ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¸ÐºÑелей к краю картинки, когда вектор Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ + идёт извне облаÑти кодированиÑ. Ðта возможноÑÑ‚ÑŒ ÑтановитÑÑ + беÑполезной, еÑли у фильма еÑÑ‚ÑŒ чёрные полоÑÑ‹. Ð’ отличии от + Ñлучаев 1 и 2, выравнивание границ до кратноÑти 16 здеÑÑŒ не поможет. </para> </listitem> @@ -575,9 +574,9 @@ MPEG разбивает видео на квадраты 16Ñ…16, называеР</orderedlist> <para> -Ð‘Ð»Ð°Ð³Ð¾Ð´Ð°Ñ€Ñ Ð²Ñем Ñтим причинам, рекомендуетÑÑ Ð¿Ð¾Ð»Ð½Ð¾Ñтью урезать +Ð‘Ð»Ð°Ð³Ð¾Ð´Ð°Ñ€Ñ Ð²Ñем Ñтим причинам, рекомендуетÑÑ Ð¿Ð¾Ð»Ð½Ð¾Ñтью урезать чёрные полоÑÑ‹. Более того, еÑли еÑÑ‚ÑŒ облаÑти шумов/иÑкажений -на краÑÑ… картинки, то их урезание также поÑпоÑобÑтвует улучшению +на краÑÑ… картинки, то их урезание также поÑпоÑобÑтвует улучшению качеÑтва кодированиÑ. Видеофилы, желающие Ñохранить оригинал как можно более точно, могут возражать против такого уÑечениÑ; но еÑли Ð’Ñ‹ не планируете кодировать при поÑтоÑнном квантователе, @@ -593,7 +592,7 @@ MPEG разбивает видео на квадраты 16Ñ…16, называеР<para> Ð’Ñпомните из предыдущего раздела, что конечный размер картинки, -подлежащей кодированию, должен быть кратен 16 (как выÑота, так +подлежащей кодированию, должен быть кратен 16 (как выÑота, так и ширина). Ðто может быть доÑтигнуто уÑечением, маÑштабированием или комбинацией того и другого. </para> @@ -601,11 +600,11 @@ MPEG разбивает видео на квадраты 16Ñ…16, называеР<para> ЕÑÑ‚ÑŒ неÑколько рекомендаций Ð´Ð»Ñ ÑƒÑечениÑ, которым необходимо Ñледовать Ð´Ð»Ñ Ð¸Ð·Ð±ÐµÐ¶Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð²Ñ€ÐµÐ¶Ð´ÐµÐ½Ð¸Ñ Ñ„Ð¸Ð»ÑŒÐ¼Ð°. -Обычный формат YUV, 4:2:0, ÑохранÑет хрому (информацию о цвете) -половинной диÑкретизации, Ñ‚.е. хрома ÑохранÑетÑÑ Ð² два раза реже -в каждом направлении, чем люма (Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ð± интенÑивноÑти). +Обычный формат YUV, 4:2:0, ÑохранÑет цветноÑÑ‚ÑŒ (информацию о цвете) +половинной диÑкретизации, Ñ‚.е. цветноÑÑ‚ÑŒ ÑохранÑетÑÑ Ð² два раза реже +в каждом направлении, чем ÑркоÑтноÑÑ‚ÑŒ (Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ð± интенÑивноÑти). РаÑÑмотрите Ñледующую диаграмму, где L обозначает точки диÑкретизации -люмы и C — хромы. +ÑркоÑтноÑти и C — цветноÑти. </para> <informaltable> @@ -685,15 +684,15 @@ MPEG разбивает видео на квадраты 16Ñ…16, называеРКак Ð’Ñ‹ видите, Ñтроки и Ñтолбцы Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ ÐµÑтеÑтвенным образом идут в парах. ПоÑтому ÑÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¸ размеры уÑÐµÑ‡ÐµÐ½Ð¸Ñ <emphasis>должны</emphasis> быть чётными чиÑлами. -Иначе хрома переÑтанет правильно ÑоответÑтвовать люме. +Иначе цветноÑÑ‚ÑŒ переÑтанет правильно ÑоответÑтвовать ÑркоÑтноÑти. ТеоретичеÑки возможно уÑечение Ñ Ð½ÐµÑ‡Ñ‘Ñ‚Ð½Ñ‹Ð¼Ð¸ ÑмещениÑми, но оно -потребует Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ…Ñ€Ð¾Ð¼Ñ‹, что потенциально ÑвлÑетÑÑ +потребует Ð¿ÐµÑ€ÐµÐºÐ²Ð°Ð½Ñ‚Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ†Ð²ÐµÑ‚Ð½Ð¾Ñти, что потенциально ÑвлÑетÑÑ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸ÐµÐ¹ Ñ Ð¿Ð¾Ñ‚ÐµÑ€ÐµÐ¹ качеÑтва и не поддерживаетÑÑ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð¾Ð¼ уÑÐµÑ‡ÐµÐ½Ð¸Ñ Ñторон crop. </para> <para> -Более того, видео Ñ Ñ‡ÐµÑ€ÐµÑÑтрочной развёрткой диÑкретизируетÑÑ +Более того, видео Ñ Ñ‡ÐµÑ€ÐµÑÑтрочной развёрткой диÑкретизируетÑÑ Ñледующим образом: </para> @@ -941,7 +940,7 @@ MPEG разбивает видео на квадраты 16Ñ…16, называеР</para> <para> -ЕÑтеÑтвенные Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ DVD ÑоÑтавлÑÑŽÑ‚ 720x480 Ð´Ð»Ñ NTSC и 720x576 +ЕÑтеÑтвенные Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ DVD ÑоÑтавлÑÑŽÑ‚ 720x480 Ð´Ð»Ñ NTSC и 720x576 Ð´Ð»Ñ PAL, но ÑущеÑтвует флаг ÑÐ¾Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ Ñторон, который указывает ÑвлÑетÑÑ Ð»Ð¸ видео полноÑкранным (4:3) или широкоÑкранным (16:9). Многие (еÑли не большинÑтво) широкоÑкранных DVD не точно ÑоответÑтвуют @@ -951,14 +950,14 @@ MPEG разбивает видео на квадраты 16Ñ…16, называеР<para> <application>MPlayer</application> предоÑтавлÑет фильтр Ð¾Ð±Ð½Ð°Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ -уÑечениÑ, который определÑет прÑмоугольник, до которго нужно уÑечь +уÑечениÑ, который определÑет прÑмоугольник, до которго нужно уÑечь (<option>-vf cropdetect</option>). ЗапуÑтите <application>MPlayer</application> Ñ <option>-vf cropdetect</option> и он выдаÑÑ‚ наÑтройки уÑÐµÑ‡ÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÐµÐ¹. -С целью Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ñ‚Ð¾Ñ‡Ð½Ñ‹Ñ… параметров уÑечениÑ, Ð’Ñ‹ должны проигрывать -фильм доÑтаточно долго Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтоб была иÑпользована вÑÑ Ð¾Ð±Ð»Ð°ÑÑ‚ÑŒ -изображениÑ. +С целью Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ñ‚Ð¾Ñ‡Ð½Ñ‹Ñ… параметров уÑечениÑ, Ð’Ñ‹ должны проигрывать +фильм доÑтаточно долго Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтоб была иÑпользована вÑÑ Ð¾Ð±Ð»Ð°ÑÑ‚ÑŒ +изображениÑ. </para> <para> @@ -966,18 +965,17 @@ MPEG разбивает видео на квадраты 16Ñ…16, называеР<application>MPlayer</application>, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð½ÑƒÑŽ Ñтроку, выведенную <option>cropdetect</option>, и подÑтройте прÑмоугольник при необходимоÑти. -Фильтр <option>rectangle</option> может быть полезен, позволив +Фильтр <option>rectangle</option> может быть полезен, позволив Вам интерактивно менÑÑ‚ÑŒ прÑмоугольник уÑÐµÑ‡ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð’Ð°ÑˆÐµÐ³Ð¾ фильма. Ðе забывайте Ñледовать указанным выше руководÑтвам по делимоÑти, -чтобы не иÑпортить выравнивание хромы. +чтобы не иÑпортить выравнивание цветноÑти. </para> <para> Ð’ Ñ€Ñде Ñлучаев маÑштабирование может быть нежелательным. МаÑштабирование по вертикальному направлению затруднено Ð´Ð»Ñ Ñ‡ÐµÑ€ÐµÑÑтрочного видео, и еÑли Ð’Ñ‹ хотите Ñохранить череÑÑтрочноÑÑ‚ÑŒ, -Вам в большинÑтве Ñлучаев будет необходимо воздерживатьÑÑ Ð¾Ñ‚ -маÑштабированиÑ. +Вам, как правило, будет необходимо воздерживатьÑÑ Ð¾Ñ‚ маÑштабированиÑ. ЕÑли Ð’Ñ‹ не будете маÑштабировать, но вÑÑ‘ ещё желаете размеры, кратные 16, то Вам придётÑÑ Ð¿Ñ€Ð¾Ð²Ð¾Ð´Ð¸Ñ‚ÑŒ излишнее уÑечение. Ðе проводите неполное уÑечение, поÑкольку чёрные полоÑÑ‹ очень @@ -986,24 +984,22 @@ MPEG разбивает видео на квадраты 16Ñ…16, называеР<para> ПоÑкольку MPEG-4 иÑпользует макроблоки 16Ñ…16, Ð’Ñ‹ должны убедитьÑÑ, -что каждое измерение кодируемого видео кратно 16; иначе Ð’Ñ‹ ухудшите -качеÑтво, оÑобенно на малых битпотоках. Ð’Ñ‹ можете Ñделать Ñто, -округлив ширину и выÑоту прÑмоугольника уÑÐµÑ‡ÐµÐ½Ð¸Ñ Ð´Ð¾ ближайшего +что каждое измерение кодируемого видео кратно 16; иначе Ð’Ñ‹ ухудшите +качеÑтво, оÑобенно на малых битпотоках. Ð’Ñ‹ можете Ñделать Ñто, +округлив ширину и выÑоту прÑмоугольника уÑÐµÑ‡ÐµÐ½Ð¸Ñ Ð´Ð¾ ближайшего меньшего целого, кратного 16. -Ð£Ñ‡Ð¸Ñ‚Ñ‹Ð²Ð°Ñ ÑƒÑтановленное ранее, при уÑечении Ð’Ñ‹ можете захотеть увеличить -Ñмещение по Y на половину разноÑти Ñтарой и новой выÑоты, так что -полученное видео будет братьÑÑ Ð¸Ð· центра кадра. - +Как указано выше, при уÑечении Вам необходимо увеличить Ñмещение по +Y на половину разноÑти Ñтарой и новой выÑоты, так что полученное +видео будет братьÑÑ Ð¸Ð· центра кадра. И из-за ÑпоÑоба диÑкретизации DVD видео, убедитеÑÑŒ, что Ñмещение -еÑÑ‚ÑŒ чётное чиÑло. (ФактичеÑки, возьмите за правило никогда не +еÑÑ‚ÑŒ чётное чиÑло. (ФактичеÑки, возьмите за правило никогда не иÑпользовать нечётные величины Ð´Ð»Ñ Ð»ÑŽÐ±Ñ‹Ñ… параметров уÑÐµÑ‡ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ маÑÑˆÑ‚Ð°Ð±Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ð¸Ð´ÐµÐ¾.) ЕÑли Ð’Ñ‹ беÑпокоитеÑÑŒ из-за неÑкольких излишне отброшенных битов, возможно, Ð’Ñ‹ предпочтёте взамен маÑштабировать видео. Мы раÑÑмотрим Ñто ниже в нашем примере. - Ð’ дейÑтвительноÑти, Ð’Ñ‹ можете доверить фильтру <option>cropdetect</option> Ñделать Ð´Ð»Ñ Ð’Ð°Ñ Ð²ÑÑ‘ вышеупомÑнутое, -Ñ‚.к. у него еÑÑ‚ÑŒ необÑзательный параметр Ð¾ÐºÑ€ÑƒÐ³Ð»ÐµÐ½Ð¸Ñ +Ñ‚.к. у него еÑÑ‚ÑŒ необÑзательный параметр Ð¾ÐºÑ€ÑƒÐ³Ð»ÐµÐ½Ð¸Ñ <option>round</option>, равный 16 по умолчанию. </para> @@ -1015,13 +1011,13 @@ MPEG разбивает видео на квадраты 16Ñ…16, называеР<para> ПоÑле вÑего выше Ñказанного и Ñделанного, Ð’Ñ‹, вероÑтно, получите -видео не точно формата 1:85.1 или 2.35:1, а Ñ Ñ‡ÐµÐ¼-то близким -к Ñтому. Ð’Ñ‹ можете вычиÑлить новый коÑффициент ÑÐ¾Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ -Ñторон вручную, но <application>MEncoder</application> +видео не точно формата 1:85.1 или 2.35:1, а Ñ Ñ‡ÐµÐ¼-то близким +к Ñтому. Ð’Ñ‹ можете вычиÑлить новый коÑффициент ÑÐ¾Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ +Ñторон вручную, но <application>MEncoder</application> предоÑтавлÑет опцию Ð´Ð»Ñ <systemitem class="library">libavcodec</systemitem>, называемую <option>autoaspect</option>, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ñделает Ñто Ð´Ð»Ñ -ВаÑ. Ðи в коем Ñлучае не увеличивайте размер Ñтого видео Ñ Ñ†ÐµÐ»ÑŒÑŽ -квадратизации пикÑелей, еÑли Ð’Ñ‹ не желаете впуÑтую потратить +ВаÑ. Ðи в коем Ñлучае не увеличивайте размер Ñтого видео Ñ Ñ†ÐµÐ»ÑŒÑŽ +квадратизации пикÑелей, еÑли Ð’Ñ‹ не желаете впуÑтую потратить меÑто на жёÑтком диÑке. МаÑштабирование должно выполнÑÑ‚ÑŒÑÑ Ð¿Ñ€Ð¸ воÑпроизведении, и плеер иÑпользует коÑффициент ÑÐ¾Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ Ñторон, Ñохранённый в AVI, Ð´Ð»Ñ @@ -1038,12 +1034,12 @@ MPEG разбивает видео на квадраты 16Ñ…16, называеР<para> ЕÑли Ð’Ñ‹ не ÑобираетеÑÑŒ кодировать в режиме поÑтоÑнного квантователÑ, -Вам нужно выбрать битпоток. +Вам нужно выбрать битпоток. ПонÑтие битпотока очень проÑто: Ñто Ñреднее чиÑло битов, которые будут иÑпользованы Ð´Ð»Ñ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð’Ð°ÑˆÐµÐ³Ð¾ фильма, в Ñекунду. Обычно битпоток измерÑетÑÑ Ð² килобитах (1000 бит) в Ñекунду. -Размер Вашего фильма на диÑке еÑÑ‚ÑŒ битпоток, умноженный на -длительноÑÑ‚ÑŒ фильма, Ð¿Ð»ÑŽÑ Ð½ÐµÐ±Ð¾Ð»ÑŒÑˆÐ¸Ðµ накладные раÑходы +Размер Вашего фильма на диÑке еÑÑ‚ÑŒ битпоток, умноженный на +длительноÑÑ‚ÑŒ фильма, Ð¿Ð»ÑŽÑ Ð½ÐµÐ±Ð¾Ð»ÑŒÑˆÐ¸Ðµ накладные раÑходы (Ñм. раздел <link linkend="menc-feat-dvd-mpeg4-muxing-avi-limitations">контейнер AVI</link> Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð¼ÐµÑ€Ð°). @@ -1054,9 +1050,9 @@ MPEG разбивает видео на квадраты 16Ñ…16, называеР<para> Битпоток изменÑетÑÑ <emphasis role="bold">не</emphasis> -пропорционально разрешению. -То еÑÑ‚ÑŒ файл разрешением 320Ñ…240 Ñ 200 кбит/Ñек не будет -того же качеÑтва, что Ñтот же фильм разрешением 640Ñ…480 +пропорционально разрешению. +То еÑÑ‚ÑŒ файл разрешением 320Ñ…240 Ñ 200 кбит/Ñек не будет +того же качеÑтва, что Ñтот же фильм разрешением 640Ñ…480 и 800 кбит/Ñек! Ð”Ð»Ñ Ñтого еÑÑ‚ÑŒ две причины: <orderedlist> @@ -1065,19 +1061,19 @@ MPEG разбивает видео на квадраты 16Ñ…16, называеРзамечаете MPEG артефакты, еÑли они больше! Ðртефакты возникают на маÑштабе блоков (8Ñ…8). Ваш глаз не увидит ошибки в 4800 маленьких блоков так же - легко, как и в 1200 больших блоков (Ð¿Ñ€ÐµÐ´Ð¿Ð¾Ð»Ð°Ð³Ð°Ñ + легко, как и в 1200 больших блоков (Ð¿Ñ€ÐµÐ´Ð¿Ð¾Ð»Ð°Ð³Ð°Ñ Ð¼Ð°Ñштабирование обоих фильмов на полный Ñкран). </para></listitem> <listitem><para> - <emphasis role="bold">ТеоретичеÑкаÑ</emphasis>: Когда Ð’Ñ‹ + <emphasis role="bold">ТеоретичеÑкаÑ</emphasis>: Когда Ð’Ñ‹ уменьшаете размер изображениÑ, но продолжаете иÑпользовать - блоки того же размера (8Ñ…8) Ð´Ð»Ñ Ð¿Ñ€Ð¾ÑтранÑтвенных чаÑтотных + блоки того же размера (8Ñ…8) Ð´Ð»Ñ Ð¿Ñ€Ð¾ÑтранÑтвенных чаÑтотных преобразований, Ð’Ñ‹ перемещаете больше данных в выÑокочаÑтотные полоÑÑ‹. Грубо говорÑ, каждый пикÑель Ñодержит больше деталей, чем раньше. - Так что неÑÐ¼Ð¾Ñ‚Ñ€Ñ Ð½Ð° то, что Ваша картинка Ñ ÑƒÐ¼ÐµÐ½ÑŒÑˆÐµÐ½Ð½Ñ‹Ð¼ + Так что неÑÐ¼Ð¾Ñ‚Ñ€Ñ Ð½Ð° то, что Ваша картинка Ñ ÑƒÐ¼ÐµÐ½ÑŒÑˆÐµÐ½Ð½Ñ‹Ð¼ маÑштабом Ñодержит 1/4 информации в проÑтранÑтвенных направлениÑÑ…, - она вÑÑ‘ ещё может Ñодержать большУю чаÑÑ‚ÑŒ информации в + она вÑÑ‘ ещё может Ñодержать большУю чаÑÑ‚ÑŒ информации в чаÑтотных интервалах (предполагаÑ, что выÑокие чаÑтоты были не иÑпользованы в оригинальном 640Ñ…480 изображении). </para></listitem> @@ -1086,7 +1082,7 @@ MPEG разбивает видео на квадраты 16Ñ…16, называеР<para> ПоÑледние руководÑтва рекомендовали выбор битпотока и разрешениÑ, -оÑновываÑÑÑŒ на приближении "бит на пикÑель", но Ñто обычно не +оÑновываÑÑÑŒ на приближении "бит на пикÑель", но Ñто обычно не верно из-за упомÑнутых выше причин. Похоже, лучшей оценкой ÑвлÑетÑÑ Ñ€Ð¾ÑÑ‚ битпотока пропорционально квадратному корню разрешениÑ, так что 320Ñ…240 и 400 кбит/Ñек @@ -1107,7 +1103,7 @@ MPEG разбивает видео на квадраты 16Ñ…16, называеР<title>РаÑчёт разрешениÑ</title> <para> -Следующие шаги помогут Вам раÑÑчитать разрешение Ð´Ð»Ñ Ð’Ð°ÑˆÐµÐ³Ð¾ +Следующие шаги помогут Вам раÑÑчитать разрешение Ð´Ð»Ñ Ð’Ð°ÑˆÐµÐ³Ð¾ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð±ÐµÐ· Ñлишком Ñильного иÑÐºÐ°Ð¶ÐµÐ½Ð¸Ñ Ð²Ð¸Ð´ÐµÐ¾, ÑƒÑ‡Ð¸Ñ‚Ñ‹Ð²Ð°Ñ Ð½ÐµÑколько видов информации об иÑходном видео. Прежде вÑего, Вам необходимо раÑÑчитать коÑффициент ÑÐ¾Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ @@ -1142,21 +1138,21 @@ CQ ÑоответÑтвует чиÑлу битов на пикÑель и на Грубо говорÑ, чем больше CQ, тем меньше вероÑтноÑÑ‚ÑŒ увидеть артефакты кодированиÑ. Однако, еÑли у Ð’Ð°Ñ ÐµÑÑ‚ÑŒ заданный размер Ð´Ð»Ñ Ð’Ð°ÑˆÐµÐ³Ð¾ фильма -(например, 1 или 2 CD), еÑÑ‚ÑŒ ограниченное общее чиÑло битов, -которые Ð’Ñ‹ можете потратить; поÑтому важно найти хороший +(например, 1 или 2 CD), еÑÑ‚ÑŒ ограниченное общее чиÑло битов, +которые Ð’Ñ‹ можете потратить; поÑтому важно найти хороший компромиÑÑ Ð¼ÐµÐ¶Ð´Ñƒ ÑжимаемоÑтью и качеÑтвом. </para> <para> CQ завиÑит от битпотока, ÑффективноÑти видеокодека и Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ñ„Ð¸Ð»ÑŒÐ¼Ð°. Обычно, в целÑÑ… ÑƒÐ²ÐµÐ»Ð¸Ñ‡ÐµÐ½Ð¸Ñ CQ, Вам нужно будет уменьшить размер -фильма, при уÑловии, что битпоток, вычиÑленный как Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ ÐºÐ¾Ð½ÐµÑ‡Ð½Ð¾Ð³Ð¾ +фильма, при уÑловии, что битпоток, вычиÑленный как Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ ÐºÐ¾Ð½ÐµÑ‡Ð½Ð¾Ð³Ð¾ размера, и длина фильма поÑтоÑнны. С MPEG-4 ASP кодеками, такими как <systemitem class="library">Xvid</systemitem> -и <systemitem class="library">libavcodec</systemitem>, CQ +и <systemitem class="library">libavcodec</systemitem>, CQ меньше 0.18 обычно приводит к изображению Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ð¼ чиÑлом Ñегментов "квадратиками", из-за недоÑтаточного чиÑла битов Ð´Ð»Ñ -ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ð¸ в каждом макроблоке. +ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ð¸ в каждом макроблоке. (MPEG4, как и многие другие кодеки, группирует пикÑели в блоки по неÑколько пикÑелей Ð´Ð»Ñ ÑÐ¶Ð°Ñ‚Ð¸Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ; еÑли битов не хватает, границы Ñтих блоков заметны.) @@ -1169,17 +1165,17 @@ CQ завиÑит от битпотока, ÑффективноÑти видео <link linkend="menc-feat-xvid-example-settings"><systemitem class="library">Xvid</systemitem></link> должны Ñделать возможным получение того же качеÑтва Ñ CQ в диапазоне от 0.18 до 0.20 Ð´Ð»Ñ Ñ€Ð¸Ð¿Ð° на 1 CD и 0.24-0.26 Ð´Ð»Ñ Ñ€Ð¸Ð¿Ð° на 2 CD. -ИÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ MPEG-4 AVC кодеки, такие как +ИÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ MPEG-4 AVC кодеки, такие как <systemitem class="library">x264</systemitem>, Ð’Ñ‹ можете иÑпользовать CQ в диапазоне от 0.14 до 0.16 Ñо Ñтандартными опциÑми ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ -и должны Ñуметь доÑтичь таких низких значений, как 0.10 - 0.12 +и должны Ñуметь доÑтичь таких низких значений, как 0.10 — 0.12 Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ <link linkend="menc-feat-x264-example-settings">продвинутых опций ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ <systemitem class="library">x264</systemitem></link>. </para> <para> ПожалуйÑта, обратите внимание, что CQ — лишь Ð¿Ð¾ÐºÐ°Ð·Ð°Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð²ÐµÐ»Ð¸Ñ‡Ð¸Ð½Ð°, -Ñ‚.к. она завиÑит от кодируемого Ñодержимого; CQ 0.18 может хорошо +Ñ‚.к. она завиÑит от кодируемого Ñодержимого; CQ 0.18 может хорошо ÑмотретьÑÑ Ð´Ð»Ñ Ð‘ÐµÑ€Ð³Ð¼Ð°Ð½Ð° (Bergman), в отличии от такого фильма как Матрица (The Matrix), Ñодержащего много Ñцен Ñ Ð±Ñ‹Ñтрым движением. С другой Ñтороны, беÑполезно увеличивать CQ выше 0.30, Ñ‚.к. Ð’Ñ‹ @@ -1199,7 +1195,7 @@ CQ в диапазоне от 0.14 до 0.16 Ñо Ñтандартными Ð¾Ð¿Ñ <para> Изучение иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ð¸Ð´ÐµÐ¾ фильтров <application>MEncoder</application> важно Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ñ…Ð¾Ñ€Ð¾ÑˆÐ¸Ñ… результатов кодированиÑ. -Ð’ÑÑ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ° видео выполнÑетÑÑ Ð¿Ð¾ÑредÑтвом фильтров: уÑечение, +Ð’ÑÑ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ° видео выполнÑетÑÑ Ð¿Ð¾ÑредÑтвом фильтров: уÑечение, маÑштабирование, подÑтройка цвета, удаление шума, увеличение чёткоÑти, Ð´ÐµÐ¸Ð½Ñ‚ÐµÑ€Ð»ÐµÐ¹Ñ (преобразование видео из череÑÑтрочной развёртки в поÑтрочную), телеÑин, обратный телеÑин и удаление @@ -1215,7 +1211,7 @@ CQ в диапазоне от 0.14 до 0.16 Ñо Ñтандартными Ð¾Ð¿Ñ <screen>-vf фильтр1=опции,фильтр2=опции,...</screen> -БольшинÑтво фильтров иÑпользуют чиÑленные Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¾Ð¿Ñ†Ð¸Ð¹, +БольшинÑтво фильтров иÑпользуют чиÑленные Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¾Ð¿Ñ†Ð¸Ð¹, разделённые двоеточиÑми, но ÑинтакÑÐ¸Ñ Ñтих параметров различаетÑÑ Ñƒ разных фильтров, так что читайте мануал Ð´Ð»Ñ Ð´ÐµÑ‚Ð°Ð»ÑŒÐ½Ð¾Ð¹ информации о фильтрах, которые Ð’Ñ‹ желаете иÑпользовать. @@ -1227,7 +1223,7 @@ CQ в диапазоне от 0.14 до 0.16 Ñо Ñтандартными Ð¾Ð¿Ñ <screen>-vf crop=688:464:12:4,scale=640:464</screen> -Ñперва уÑечёт облаÑÑ‚ÑŒ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð¾ 688Ñ…464 Ñ Ð²ÐµÑ€Ñ…Ð½Ð¸Ð¼ левым +Ñперва уÑечёт облаÑÑ‚ÑŒ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð¾ 688Ñ…464 Ñ Ð²ÐµÑ€Ñ…Ð½Ð¸Ð¼ левым углом (12,4), а затем маÑштабирует результат до 640Ñ…464. </para> @@ -1236,29 +1232,29 @@ CQ в диапазоне от 0.14 до 0.16 Ñо Ñтандартными Ð¾Ð¿Ñ Ñ€Ñдом Ñ Ð½Ð¸Ð¼) Ñ Ñ†ÐµÐ»ÑŒÑŽ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¿Ñ€ÐµÐ¸Ð¼ÑƒÑ‰ÐµÑтва от иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ð¸ поÑле видеодекодера, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ потерÑна или иÑкажена другими фильтрами. -Важнейшими примерами ÑвлÑÑŽÑ‚ÑÑ: <option>pp</option> (поÑтобработка, +Важнейшими примерами ÑвлÑÑŽÑ‚ÑÑ: <option>pp</option> (поÑтобработка, только при выполнении операций ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð±Ð»Ð¾Ñ‡Ð½Ð¾Ð¹ Ñегментации (deblocking) или ÑƒÐ²ÐµÐ»Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ñ‡Ñ‘Ñ‚ÐºÐ¾Ñти краёв (deringing)), <option>spp</option> (другой фильтр поÑтобработки, Ñлужащий Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð°Ñ€Ñ‚ÐµÑ„Ð°ÐºÑ‚Ð¾Ð² MPEG), <option>pullup</option> (обратный -телеÑин), и <option>softpulldown</option> (Ð´Ð»Ñ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ +телеÑин), и <option>softpulldown</option> (Ð´Ð»Ñ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¼Ñгкого телеÑина в жёÑткий). </para> <para> -Ð’ общем Ñлучае, Вам Ñледует делать наÑтолько мало фильтрации, +Ð’ общем Ñлучае, Вам Ñледует делать наÑтолько мало фильтрации, наÑколько Ñто возможно, Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾ чтоб оÑтатьÑÑ Ð±Ð»Ð¸Ð·ÐºÐ¾ к оригинальному DVD иÑточнику. УÑечение чаÑто необходимо (как опиÑано выше), но -избегайте маÑÑˆÑ‚Ð°Ð±Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ð¸Ð´ÐµÐ¾. ÐеÑÐ¼Ð¾Ñ‚Ñ€Ñ Ð½Ð° то, что уменьшение -размера иногда предпочтительно иÑпользованию бОльших -квантователей, нужно избегать и того, и другого: помните, +избегайте маÑÑˆÑ‚Ð°Ð±Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ð¸Ð´ÐµÐ¾. ÐеÑÐ¼Ð¾Ñ‚Ñ€Ñ Ð½Ð° то, что уменьшение +размера иногда предпочтительно иÑпользованию бОльших +квантователей, нужно избегать и того, и другого: помните, что мы Ñ Ñамого начала решили обменÑÑ‚ÑŒ биты на качеÑтво. </para> <para> Также не корректируйте гамму, контраÑтноÑÑ‚ÑŒ, ÑркоÑÑ‚ÑŒ и Ñ‚.п.. То, что хорошо выглÑдит на Вашем мониторе, может плохо выглÑдеть -на других. Ðти коррекции должны выполнÑÑ‚ÑŒÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ при +на других. Ðти коррекции должны выполнÑÑ‚ÑŒÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ при воÑпроизведении. </para> @@ -1269,11 +1265,11 @@ DVD иÑточнику. УÑечение чаÑто необходимо (как Ещё раз, причиной Ñтому ÑвлÑетÑÑ Ñ‚Ð¾, что Ñтим битам можно найти лучшее применение: зачем тратить их, ÐºÐ¾Ð´Ð¸Ñ€ÑƒÑ ÑˆÑƒÐ¼, еÑли Ð’Ñ‹ проÑто можете вернуть Ñтот шум в процеÑÑе воÑпроизведениÑ? -Увеличение параметров Ð´Ð»Ñ <option>hqdn3d</option> дополнительно +Увеличение параметров Ð´Ð»Ñ <option>hqdn3d</option> дополнительно улучшит ÑжимаемоÑÑ‚ÑŒ, но увеличив Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñлишком Ñильно, Ð’Ñ‹ риÑкуете -ухудшить различимоÑÑ‚ÑŒ изображениÑ. -Рекомендованные выше Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ (<option>2:1:2</option>) Ñлегка -конÑервативны; не бойтеÑÑŒ ÑкÑпериментировать Ñ Ð±Ð¾Ð»ÐµÐµ выÑокими +ухудшить различимоÑÑ‚ÑŒ изображениÑ. +Рекомендованные выше Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ (<option>2:1:2</option>) Ñлегка +конÑервативны; не бойтеÑÑŒ ÑкÑпериментировать Ñ Ð±Ð¾Ð»ÐµÐµ выÑокими значениÑми и ÑамоÑтоÑтельно оценивать результаты. </para> </sect2> @@ -1284,9 +1280,9 @@ DVD иÑточнику. УÑечение чаÑто необходимо (как <title>ЧереÑÑÑ‚Ñ€Ð¾Ñ‡Ð½Ð°Ñ Ñ€Ð°Ð·Ð²Ñ‘Ñ€Ñ‚ÐºÐ° и телеÑин</title> <para> -Почти вÑе фильмы ÑнимаютÑÑ Ð¿Ñ€Ð¸ 24 fps [кадр/Ñек]. ПоÑкольку +Почти вÑе фильмы ÑнимаютÑÑ Ð¿Ñ€Ð¸ 24 fps [кадр/Ñек]. ПоÑкольку в NTSC иÑпользуетÑÑ 30000/1001 fps, нужно выполнить некоторую -обработку Ð´Ð»Ñ Ñ‚Ð°ÐºÐ¾Ð³Ð¾ 24 fps видео, чтобы оно корректно +обработку Ð´Ð»Ñ Ñ‚Ð°ÐºÐ¾Ð³Ð¾ 24 fps видео, чтобы оно корректно воÑпроизводилоÑÑŒ при кадровой чаÑтоте NTSC. Ðтот процеÑÑ Ð½Ð°Ð·Ñ‹Ð²Ð°ÐµÑ‚ÑÑ 3:2 пулдаун, обычно называемый телеÑин (поÑкольку пулдаун чаÑто применÑетÑÑ Ð² процеÑÑе показа телевизионного фильма, англ. telecine); @@ -1303,13 +1299,13 @@ DVD иÑточнику. УÑечение чаÑто необходимо (как воÑпроизводитÑÑ Ñлегка быÑтрее, но еÑли Ð’Ñ‹ не пришелец, то, вероÑтно, не заметите разницы. У большинÑтва PAL DVD аудио Ñкорректировано по выÑоте звука так, -что, воÑпроизводÑÑÑŒ при 25 fps, оно звучит нормально, неÑÐ¼Ð¾Ñ‚Ñ€Ñ Ð½Ð° -то, что аудиодорожка (и, Ñледовательно, веÑÑŒ фильм) проигрываютÑÑ +что, воÑпроизводÑÑÑŒ при 25 fps, оно звучит нормально, неÑÐ¼Ð¾Ñ‚Ñ€Ñ Ð½Ð° +то, что аудиодорожка (и, Ñледовательно, веÑÑŒ фильм) проигрываютÑÑ Ð½Ð° 4% быÑтрее, чем NTSC DVD. </para> <para> -ПоÑкольку видео на PAL DVD не переделываетÑÑ, Вам не Ñтоит +ПоÑкольку видео на PAL DVD не переделываетÑÑ, Вам не Ñтоит беÑпокоитÑÑ Ð¾ чаÑтоте кадров. У иÑточника 25 fps и у Вашего рипа будет 25 fps. Однако, еÑли Ð’Ñ‹ делаете рип NTSC DVD фильма, Вам, быть может, придётÑÑ Ð²Ñ‹Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÑŒ обратный телеÑин. @@ -1317,7 +1313,7 @@ DVD иÑточнику. УÑечение чаÑто необходимо (как <para> Ð”Ð»Ñ Ñ„Ð¸Ð»ÑŒÐ¼Ð¾Ð², ÑнÑÑ‚Ñ‹Ñ… на 24 fps, видео на NTSC DVD идёт либо Ñ Ñ‚ÐµÐ»ÐµÑином -30000/1001, либо Ñ Ð¿Ð¾Ñтрочной развёрткой 24000/1001 fps и +30000/1001, либо Ñ Ð¿Ð¾Ñтрочной развёрткой 24000/1001 fps и предназначаетÑÑ Ð´Ð»Ñ Ñ‚ÐµÐ»ÐµÑина на лету Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ DVD плеера. С другой Ñтороны, TV Ñериалы идут обычно только Ñ Ñ‡ÐµÑ€ÐµÑÑтрочной развёрткой, но без телеÑина. Ðто не Ñтрогое правило: еÑÑ‚ÑŒ Ñериалы Ñ @@ -1349,14 +1345,14 @@ pullup,softskip</option>. <para> ЕÑли Ð’Ñ‹ желаете кодировать фильм Ñ Ñ‡ÐµÑ€ÐµÑÑтрочной развёрткой -(NTSC или PAL видео), Вам нужно решить, будете ли Ð’Ñ‹ его +(NTSC или PAL видео), Вам нужно решить, будете ли Ð’Ñ‹ его преобразовывать в поÑтрочную развёртку или нет. -Ð¥Ð¾Ñ‚Ñ Ñ‚Ð°ÐºÐ¾Ðµ преобразование (деинтерлейÑ) Ñделает Ваш фильм +Ð¥Ð¾Ñ‚Ñ Ñ‚Ð°ÐºÐ¾Ðµ преобразование (деинтерлейÑ) Ñделает Ваш фильм пригодным Ð´Ð»Ñ Ð´Ð¸Ñплеев Ñ Ð¿Ð¾Ñтрочной развёрткой, таких как компьютерные мониторы и проекторы, Ñто будет иметь Ñвою цену: -чаÑтота полей уменьшитÑÑ Ð²Ð´Ð²Ð¾Ðµ от 50 или 60000/1001 до 25 или -30000/1001 Ð¿Ð¾Ð»Ñ Ð² Ñекунду, и примерно половина информации в -Вашем фильме будет потерÑна в Ñценах Ñо значительным движением. +чаÑтота полей уменьшитÑÑ Ð²Ð´Ð²Ð¾Ðµ от 50 или 60000/1001 до 25 или +30000/1001 Ð¿Ð¾Ð»Ñ Ð² Ñекунду, и примерно половина информации в +Вашем фильме будет потерÑна в Ñценах Ñо значительным движением. </para> <para> @@ -1364,9 +1360,9 @@ pullup,softskip</option>. не рекомендуетÑÑ Ð´ÐµÐ»Ð°Ñ‚ÑŒ деинтерлейÑ. Ð’Ñ‹ вÑегда можете преобразовать развёртку фильма в процеÑÑе воÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ (при воÑпроизведении на уÑтройÑтвах Ñ Ð¿Ð¾Ñтрочной развёрткой). -МощноÑÑ‚ÑŒ Ñовременных компьютеров вынуждает плееры иÑпользовать +МощноÑÑ‚ÑŒ Ñовременных компьютеров вынуждает плееры иÑпользовать фильтр деинтерлейÑа, что Ñлегка ухудшает качеÑтво изображениÑ. -Ðо плееры будущего будут ÑпоÑобны имитировать диÑплей TV Ñ +Ðо плееры будущего будут ÑпоÑобны имитировать диÑплей TV Ñ Ñ‡ÐµÑ€ÐµÑÑтрочной развёрткой, выполнÑÑ Ð´ÐµÐ¸Ð½Ñ‚ÐµÑ€Ð»ÐµÐ¹Ñ Ð½Ð° полной чаÑтоте полей и Ð¸Ð½Ñ‚ÐµÑ€Ð¿Ð¾Ð»Ð¸Ñ€ÑƒÑ 50 или 60000/1001 кадров в Ñекунду Ð´Ð»Ñ Ñ‡ÐµÑ€ÐµÑÑтрочного видео. @@ -1385,8 +1381,8 @@ pullup,softskip</option>. череÑÑтрочной развёртки. </para></listitem> <listitem><para> - Фильтры поÑтобработки и ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ ÑˆÑƒÐ¼Ð° могут не работать как - ожидаетÑÑ, только еÑли Ð’Ñ‹ оÑобо не позаботитеÑÑŒ об их + Фильтры поÑтобработки и ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ ÑˆÑƒÐ¼Ð° могут не работать как + ожидаетÑÑ, только еÑли Ð’Ñ‹ оÑобо не позаботитеÑÑŒ об их применении к одному полю за раз, иначе они могут повредить видео при неверном иÑпользовании. </para></listitem> @@ -1398,7 +1394,7 @@ pullup,softskip</option>. mencoder <replaceable>захват.avi</replaceable> -mc 0 -oac lavc -ovc lavc -lavcopts \ vcodec=mpeg2video:vbitrate=6000:ilme:ildct:acodec=mp2:abitrate=224 </screen> -Обратите внимание на опции <option>ilme</option> и <option>ildct</option>. +Обратите внимание на опции <option>ilme</option> и <option>ildct</option>. </para> </sect2> @@ -1411,12 +1407,12 @@ vcodec=mpeg2video:vbitrate=6000:ilme:ildct:acodec=mp2:abitrate=224 Ðлгоритмы аудио/видео (A/V) Ñинхронизации <application>MEncoder</application> были разработаны Ñ Ñ†ÐµÐ»ÑŒÑŽ воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð² Ñ Ð¿Ð¾Ð²Ñ€ÐµÐ¶Ð´Ñ‘Ð½Ð½Ð¾Ð¹ Ñинхронизацией. -Однако, в Ñ€Ñде Ñлучаев они могут привеÑти к ненужному пропуÑку +Однако, в Ñ€Ñде Ñлучаев они могут привеÑти к ненужному пропуÑку или повторению кадров и, возможно, к лёгкой A/V раÑÑинхронизации -корректных входных данных (конечно, проблемы A/V Ñинхронизации +корректных входных данных (конечно, проблемы A/V Ñинхронизации возникают только при обработке или копировании аудиотрека при кодировании видео, что наÑтоÑтельно рекомендуетÑÑ). -ПоÑтому Ð’Ñ‹ можете переключитьÑÑ Ð½Ð° базовую A/V Ñинхронизацию +ПоÑтому Ð’Ñ‹ можете переключитьÑÑ Ð½Ð° базовую A/V Ñинхронизацию Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ опции <option>-mc 0</option> или размеÑтить Ñто в конфигурационном файле <systemitem>~/.mplayer/mencoder</systemitem>, еÑли Ð’Ñ‹ работаете только Ñ Ñ…Ð¾Ñ€Ð¾ÑˆÐ¸Ð¼Ð¸ иÑточниками (DVD, TV-захват, @@ -1425,13 +1421,13 @@ vcodec=mpeg2video:vbitrate=6000:ilme:ildct:acodec=mp2:abitrate=224 </para> <para> -ЕÑли Ð’Ñ‹ хотите дополнительно защититьÑÑ Ð¾Ñ‚ Ñтранных пропуÑков +ЕÑли Ð’Ñ‹ хотите дополнительно защититьÑÑ Ð¾Ñ‚ Ñтранных пропуÑков и повторений кадров, Ð’Ñ‹ можете одновременно иÑпользовать опции <option>-mc 0</option> и <option>-noskip</option>. -Ðто предотвратит <emphasis>любую</emphasis> A/V коррекцию, и +Ðто предотвратит <emphasis>любую</emphasis> A/V коррекцию, и будет копировать кадры один в один, так что Ð’Ñ‹ не Ñможете Ñто иÑпользовать, еÑли будете применÑÑ‚ÑŒ какие-либо фильтры, которые -непредÑказуемо добавлÑÑŽÑ‚ или отбраÑывают кадры, либо еÑли у +непредÑказуемо добавлÑÑŽÑ‚ или отбраÑывают кадры, либо еÑли у Вашего входного файла переменный битопоток! ПоÑтому иÑпользование <option>-noskip</option> в общем Ñлучае не рекомендуетÑÑ. @@ -1442,7 +1438,7 @@ vcodec=mpeg2video:vbitrate=6000:ilme:ildct:acodec=mp2:abitrate=224 поддерживаемое <application>MEncoder</application>, вызывало A/V раÑÑинхронизацию. Ðто навернÑка произойдёт при иÑпользовании ÑовмеÑтно Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼Ð¸ -фильтрами, поÑтому ÑÐµÐ¹Ñ‡Ð°Ñ <emphasis>не</emphasis> рекомендуетÑÑ +фильтрами, поÑтому ÑÐµÐ¹Ñ‡Ð°Ñ <emphasis>не</emphasis> рекомендуетÑÑ Ð¸Ñпользовать трёхпроходный аудио режим. Ðта возможноÑÑ‚ÑŒ оÑтавлена только Ð´Ð»Ñ ÑовмеÑтимоÑти и Ð´Ð»Ñ Ð¾Ð¿Ñ‹Ñ‚Ð½Ñ‹Ñ… пользователей, понимающих когда Ñто безопаÑно, а когда нет. @@ -1453,7 +1449,7 @@ A/V раÑÑинхронизацию. <para> Также были ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ð± A/V раÑÑинхронизации при кодировании Ñо Ñтандартного ввода (stdin) Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ <application>MEncoder</application>. -Ðе делайте Ñтого! Ð’Ñегда взамен иÑпользуйте файл или CD/DVD и Ñ‚.п. +Ðе делайте Ñтого! Ð’Ñегда взамен иÑпользуйте файл или CD/DVD и Ñ‚.п. уÑтройÑтво. </para> </sect2> @@ -1464,7 +1460,7 @@ A/V раÑÑинхронизацию. <title>Выбор видеокодека</title> <para> -То, какой видеокодек лучше выбрать, завиÑит от неÑкольких +То, какой видеокодек лучше выбрать, завиÑит от неÑкольких факторов, таких как размер, качеÑтво, уÑтойчивоÑÑ‚ÑŒ к ошибкам, практичноÑÑ‚ÑŒ и раÑпроÑтранённоÑÑ‚ÑŒ, многие из которых Ñильно завиÑÑÑ‚ от личных предпочтений и техничеÑких ограничений. @@ -1473,13 +1469,13 @@ A/V раÑÑинхронизацию. <listitem> <para> <emphasis role="bold">ÐффективноÑÑ‚ÑŒ ÑжатиÑ</emphasis>: - ДоÑтаточно очевидно, что большинÑтво кодеков нового Ð¿Ð¾ÐºÐ¾Ð»ÐµÐ½Ð¸Ñ + ДоÑтаточно очевидно, что большинÑтво кодеков нового Ð¿Ð¾ÐºÐ¾Ð»ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ñ€Ð°Ð±Ð¾Ñ‚Ð°Ð½Ñ‹ Ð´Ð»Ñ ÑƒÐ²ÐµÐ»Ð¸Ñ‡ÐµÐ½Ð¸Ñ ÐºÐ°Ñ‡ÐµÑтва и Ñтепени ÑжатиÑ. ПоÑтому, авторы данного руководÑтва и многие другие люди полагают, что Ð’Ñ‹ не можете ошибитьÑÑ <footnote id='fn-menc-feat-dvd-mpeg4-codec-cpu'><para> - ÐеÑÐ¼Ð¾Ñ‚Ñ€Ñ Ð½Ð° Ñто, будьте оÑторожны: Ð´Ð»Ñ Ð´ÐµÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ MPEG-4 AVC - видео Ñ DVD разрешением необходима быÑÑ‚Ñ€Ð°Ñ Ð¼Ð°ÑˆÐ¸Ð½Ð° (например, + ÐеÑÐ¼Ð¾Ñ‚Ñ€Ñ Ð½Ð° Ñто, будьте оÑторожны: Ð´Ð»Ñ Ð´ÐµÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ MPEG-4 AVC + видео Ñ DVD разрешением необходима быÑÑ‚Ñ€Ð°Ñ Ð¼Ð°ÑˆÐ¸Ð½Ð° (например, Pentium 4 Ñвыше 1.5 ГГц или Pentium M Ñвыше 1 ГГц). </para></footnote>, Ð²Ñ‹Ð±Ð¸Ñ€Ð°Ñ MPEG-4 AVC кодеки (например, @@ -1487,24 +1483,24 @@ A/V раÑÑинхронизацию. вмеÑто таких MPEG-4 ASP кодеков, как <systemitem class="library">libavcodec</systemitem> MPEG-4 или <systemitem class="library">Xvid</systemitem>. - (Опытные разработчики кодеков могут быть заинтереÑованы в + (Опытные разработчики кодеков могут быть заинтереÑованы в ознакомлении Ñ Ñ‚Ð¾Ñ‡ÐºÐ¾Ð¹ Ð·Ñ€ÐµÐ½Ð¸Ñ ÐœÐ¸Ñ…Ð°ÑÐ»Ñ Ðидермайера (Michael Niedermayer) "<ulink url="http://guru.multimedia.cx/?p=10">почему MPEG4-ASP отÑтой</ulink>".) Ðналогично, Ð’Ñ‹ должны получить лучшее качеÑтво Ñ MPEG-4 ASP, по Ñравнению Ñ MPEG-2 кодеками. </para> - + <para> - Однако, новые кодеки, находÑщиеÑÑ Ð² интенÑивной разработке, - могут Ñтрадать от ещё не замеченных ошибок, которые могут - иÑпортить кодирование. ПроÑто Ñто плата за иÑпользование + Однако, новые кодеки, находÑщиеÑÑ Ð² интенÑивной разработке, + могут Ñтрадать от ещё не замеченных ошибок, которые могут + иÑпортить кодирование. ПроÑто Ñто плата за иÑпользование передовых технологий. </para> - + <para> Более ÑущеÑтвенно то, что Ð´Ð»Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ кодека - необходимо потратить Ð²Ñ€ÐµÐ¼Ñ Ð½Ð° изучение его опций так, чтобы Ð’Ñ‹ + необходимо потратить Ð²Ñ€ÐµÐ¼Ñ Ð½Ð° изучение его опций так, чтобы Ð’Ñ‹ знали, что нужно подÑтраивать Ð´Ð»Ñ Ð´Ð¾ÑÑ‚Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ качеÑтва изображениÑ. </para> @@ -1512,10 +1508,10 @@ A/V раÑÑинхронизацию. <listitem><para> <emphasis role="bold">ÐÐ¿Ð¿Ð°Ñ€Ð°Ñ‚Ð½Ð°Ñ ÑовмеÑтимоÑÑ‚ÑŒ</emphasis>: - Обычно необходимо длительное Ð²Ñ€ÐµÐ¼Ñ Ð´Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¸ + Обычно необходимо длительное Ð²Ñ€ÐµÐ¼Ñ Ð´Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¸ поÑледних видеокодеков в автономные видеоплееры. - Ð’ итоге, большинÑтво поддерживает только MPEG-1 (наподобие - VCD, XVCD и KVCD), MPEG-2 (например, DVD, SVCD и KVCD) и MPEG-4 + Ð’ итоге, большинÑтво поддерживает только MPEG-1 (наподобие + VCD, XVCD и KVCD), MPEG-2 (например, DVD, SVCD и KVCD) и MPEG-4 ASP (например, DivX, <systemitem class="library">libavcodec</systemitem> LMP4 и <systemitem class="library">Xvid</systemitem>) @@ -1529,34 +1525,34 @@ A/V раÑÑинхронизацию. <emphasis role="bold">Лучшее Ñоотношение качеÑтва и времени кодированиÑ</emphasis>: Кодеки, уже иÑпользующиеÑÑ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ñ‘Ð½Ð½Ð¾Ðµ Ð²Ñ€ÐµÐ¼Ñ (например, <systemitem class="library">libavcodec</systemitem> MPEG-4 и - <systemitem class="library">Xvid</systemitem>) обычно Ñильно - оптимизированы вÑевозможными оÑтроумными алгоритмами и + <systemitem class="library">Xvid</systemitem>) обычно Ñильно + оптимизированы вÑевозможными оÑтроумными алгоритмами и аÑÑемблерным SIMD кодом. ПоÑтому они обладают тенденцией доÑÑ‚Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð»ÑƒÑ‡ÑˆÐµÐ³Ð¾ ÑÐ¾Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ ÐºÐ°Ñ‡ÐµÑтва к времени кодированиÑ. Однако, у них могут быть некоторые очень продвинутые опции, которые, будучи включенными, Ñделают кодирование очень медленным ради неÑущеÑтвенного выигрыша. </para> - + <para> - ЕÑли Вам нужна выÑÐ¾ÐºÐ°Ñ ÑкороÑÑ‚ÑŒ, примерно придерживайтеÑÑŒ наÑтроек + ЕÑли Вам нужна выÑÐ¾ÐºÐ°Ñ ÑкороÑÑ‚ÑŒ, примерно придерживайтеÑÑŒ наÑтроек видеокодека по умолчанию (Ñ…Ð¾Ñ‚Ñ Ð’Ð°Ð¼ Ñтоит попробовать другие опции, - упоминаемые в иных разделах данного руководÑтва). + упоминаемые в иных разделах данного руководÑтва). </para> - + <para> - Ð’Ñ‹ так же можете раÑÑмотреть вариант иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¼Ð½Ð¾Ð³Ð¾Ð¿Ð¾Ñ‚Ð¾Ñ‡Ð½Ð¾Ð³Ð¾ + Ð’Ñ‹ так же можете раÑÑмотреть вариант иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¼Ð½Ð¾Ð³Ð¾Ð¿Ð¾Ñ‚Ð¾Ñ‡Ð½Ð¾Ð³Ð¾ кодека, Ñ…Ð¾Ñ‚Ñ Ñто полезно только Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹ машин Ñ Ð½ÐµÑколькими процеÑÑорами. <systemitem class="library">libavcodec</systemitem> MPEG-4 позволÑет Ñто, но выигрыш в ÑкороÑти ограничен и еÑÑ‚ÑŒ небольшой отрицательный Ñффект Ð´Ð»Ñ ÐºÐ°Ñ‡ÐµÑтва картинки. Многопоточное кодирование <systemitem class="library">Xvid</systemitem>, - включаемое опцией <option>threads</option>, может иÑпользоватьÑÑ Ð´Ð»Ñ + включаемое опцией <option>threads</option>, может иÑпользоватьÑÑ Ð´Ð»Ñ ÑƒÑÐºÐ¾Ñ€ÐµÐ½Ð¸Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ (на примерно 40-60% в типичных ÑлучаÑÑ…) Ñ Ð½ÐµÐ±Ð¾Ð»ÑŒÑˆÐ¸Ð¼ ухудшением картинки или вообще без него. - <systemitem class="library">x264</systemitem> также позволÑет - многопоточное кодирование, что обычно уÑкорÑет процеÑÑ Ð½Ð° 94% + <systemitem class="library">x264</systemitem> также позволÑет + многопоточное кодирование, что обычно уÑкорÑет процеÑÑ Ð½Ð° 94% Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ CPU Ñдра Ñ ÑƒÐ¼ÐµÐ½ÑŒÑˆÐµÐ½Ð¸ÐµÐ¼ PSNR от 0.005 дБ до 0.01 дБ при типичных наÑтройках. </para> @@ -1565,21 +1561,21 @@ A/V раÑÑинхронизацию. <listitem> <para> <emphasis role="bold">Личные предпочтениÑ</emphasis>: - ЗдеÑÑŒ вÑÑ‘ ÑтановитÑÑ Ð¿Ð¾Ñ‡Ñ‚Ð¸ неразумным: из-за тех же причин, по + ЗдеÑÑŒ вÑÑ‘ ÑтановитÑÑ Ð¿Ð¾Ñ‡Ñ‚Ð¸ неразумным: из-за тех же причин, по которым одни придерживаютÑÑ DivX 3 в течении лет, в то Ð²Ñ€ÐµÐ¼Ñ ÐºÐ°Ðº новые кодеки уже творÑÑ‚ чудеÑа, другие люди предпочитают <systemitem class="library">Xvid</systemitem> или <systemitem class="library">libavcodec</systemitem> MPEG-4 иÑпользованию <systemitem class="library">x264</systemitem>. </para> - + <para> - Вам нужно принимать решение ÑамоÑтоÑтельно; не Ñлушайте Ñоветов + Вам нужно принимать решение ÑамоÑтоÑтельно; не Ñлушайте Ñоветов людей, признающих только один кодек. Сделайте неÑколько образцов клипов из иÑкомых иÑточников и Ñравните разные опции ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ кодеки, Ñ Ñ†ÐµÐ»ÑŒÑŽ выбора того, что Вам наиболее подходит. - Лучший кодек — Ñто тот, которым Ð’Ñ‹ Ñами овладели, и + Лучший кодек — Ñто тот, которым Ð’Ñ‹ Ñами овладели, и который выглÑдит лучше вÑего Ð´Ð»Ñ Ð’Ð°ÑˆÐ¸Ñ… глаз на Вашем диÑплее <footnote id='fn-menc-feat-dvd-mpeg4-codec-playback'><para> Один и тот же результат ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ‚ не выглÑдеть таким же @@ -1604,30 +1600,30 @@ A/V раÑÑинхронизацию. <title>Ðудио</title> <para> -Ðудио — Ñто гораздо более проÑÑ‚Ð°Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ð°: еÑли Ð’Ñ‹ +Ðудио — Ñто гораздо более проÑÑ‚Ð°Ñ Ð¿Ñ€Ð¾Ð±Ð»ÐµÐ¼Ð°: еÑли Ð’Ñ‹ беÑпокоитеÑÑŒ о качеÑтве, проÑто оÑтавьте вÑÑ‘ как еÑÑ‚ÑŒ. -Даже потоки AC-3 5.1 не более чем 448 Кбит/Ñ Ð¸ они ÑтоÑÑ‚ каждого -бита. Ð’Ñ‹ можете ÑоблазнитьÑÑ Ð¿ÐµÑ€ÐµÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸ÐµÐ¼ аудио в -выÑококачеÑтвенный Vorbis (он же ogg формат), но лишь то, что +Даже потоки AC-3 5.1 не более чем 448 Кбит/Ñ Ð¸ они ÑтоÑÑ‚ каждого +бита. Ð’Ñ‹ можете ÑоблазнитьÑÑ Ð¿ÐµÑ€ÐµÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸ÐµÐ¼ аудио в +выÑококачеÑтвенный Vorbis (он же ogg формат), но лишь то, что у Ð’Ð°Ñ ÑÐµÐ³Ð¾Ð´Ð½Ñ Ð½ÐµÑ‚ A/V приёмника Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð¿ÑƒÑÐºÐ°Ð½Ð¸Ñ AC-3, не означает, -что у Ð’Ð°Ñ Ð½Ðµ будет его завтра. Ð”Ð»Ñ Ð¶Ð¸Ð·Ð½ÐµÑпоÑобноÑти Ваших DVD +что у Ð’Ð°Ñ Ð½Ðµ будет его завтра. Ð”Ð»Ñ Ð¶Ð¸Ð·Ð½ÐµÑпоÑобноÑти Ваших DVD рипов в будущем, ÑохранÑйте поток AC-3. -Ð’Ñ‹ можете Ñохранить поток AC-3, ÐºÐ¾Ð¿Ð¸Ñ€ÑƒÑ ÐµÐ³Ð¾ непоÑредÑтвенно в +Ð’Ñ‹ можете Ñохранить поток AC-3, ÐºÐ¾Ð¿Ð¸Ñ€ÑƒÑ ÐµÐ³Ð¾ непоÑредÑтвенно в видеопоток <link linkend="menc-feat-mpeg4">в процеÑÑе кодированиÑ</link>. -Ð’Ñ‹ также можете извлечь AC-3 поток Ñ Ñ†ÐµÐ»ÑŒÑŽ мультиплекÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÐµÐ³Ð¾ +Ð’Ñ‹ также можете извлечь AC-3 поток Ñ Ñ†ÐµÐ»ÑŒÑŽ мультиплекÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÐµÐ³Ð¾ в контейнеры наподобие NUT или Matroska (Матрёшка). <screen> mplayer <replaceable>файл_иÑточника.vob</replaceable> -aid 129 -dumpaudio -dumpfile <replaceable>звук.ac3</replaceable></screen> Ñохранит в файл <replaceable>звук.ac3</replaceable> аудиодорожку Ñ Ð½Ð¾Ð¼ÐµÑ€Ð¾Ð¼ 129 из файла <replaceable>файл_иÑточника.vob</replaceable> (Обратите внимание: -DVD VOB файлы обычно иÑпользуют нумерацию аудио, отличную от +DVD VOB файлы обычно иÑпользуют нумерацию аудио, отличную от Ñтандартной, что означает, что аудиодорожка VOB 129 — Ñто Ð²Ñ‚Ð¾Ñ€Ð°Ñ Ð°ÑƒÐ´Ð¸Ð¾Ð´Ð¾Ñ€Ð¾Ð¶ÐºÐ° файла). </para> <para> -Ðо иногда у Ð’Ð°Ñ Ð´ÐµÐ¹Ñтвительно нет иного выбора, чем далее Ñжимать +Ðо иногда у Ð’Ð°Ñ Ð´ÐµÐ¹Ñтвительно нет иного выбора, чем далее Ñжимать звук Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтоб больше битов могло быть потрачено на видео. БольшинÑтво людей предпочитают Ñжимать звук Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ MP3 или Vorbis аудиокодеков. @@ -1637,7 +1633,7 @@ Vorbis аудиокодеков. <para> <emphasis>Ðе</emphasis> иÑпользуйте <option>-nosound</option> при -кодировании файла Ñ Ð°ÑƒÐ´Ð¸Ð¾, даже еÑли позже Ð’Ñ‹ будете отдельно +кодировании файла Ñ Ð°ÑƒÐ´Ð¸Ð¾, даже еÑли позже Ð’Ñ‹ будете отдельно кодировать и мультеплекÑировать аудио. Ð¥Ð¾Ñ‚Ñ Ñто может работать в идеальных ÑлучаÑÑ…, иÑпользование <option>-nosound</option> обычно Ñкрывает Ñ€Ñд проблем в Ваших @@ -1649,46 +1645,46 @@ Vorbis аудиокодеков. </para> <para> -Вам необходимо обработать звук Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ -<application>MEncoder</application>. -Ðапример, Ð’Ñ‹ можете копировать иÑходную звуковую дорожку в +Вам необходимо обработать звук Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ +<application>MEncoder</application>. +Ðапример, Ð’Ñ‹ можете копировать иÑходную звуковую дорожку в процеÑÑе ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ <option>-oac copy</option> или преобразовать её в "лёгкий" 4 кГц моно WAV PCM Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ <option>-oac pcm -channels 1 -srate 4000</option>. -Иначе, в Ñ€Ñде Ñлучаев, будет ÑоздаватьÑÑ Ð²Ð¸Ð´ÐµÐ¾ файл, +Иначе, в Ñ€Ñде Ñлучаев, будет ÑоздаватьÑÑ Ð²Ð¸Ð´ÐµÐ¾ файл, раÑÑинхронизированный Ñ Ð°ÑƒÐ´Ð¸Ð¾. Такие Ñлучаи проиÑходÑÑ‚, когда чиÑло кадров видео иÑходного файла не Ñовпадает Ñ Ð¿Ð¾Ð»Ð½Ð¾Ð¹ длиной кадров аудио, или когда были -разрывы/ÑÑˆÐ¸Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾Ñ‚Ð¾ÐºÐ°, где поÑвилиÑÑŒ пропущенные или излишние +разрывы/ÑÑˆÐ¸Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾Ñ‚Ð¾ÐºÐ°, где поÑвилиÑÑŒ пропущенные или излишние аудиокадры. Правильным решением подобных проблем ÑвлÑетÑÑ Ð²Ñтавка тишины или уÑечение аудио в таких точках. Однако, <application>MPlayer</application> не может Ñто Ñделать и еÑли Ð’Ñ‹ демультиплекÑируете AC-3 аудио и кодируете его отдельным приложением (или Ñоздаёте дамп в PCM Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ -<application>MPlayer</application>), ÑÑˆÐ¸Ð²Ð°Ð½Ð¸Ñ Ð¾ÑтанутÑÑ +<application>MPlayer</application>), ÑÑˆÐ¸Ð²Ð°Ð½Ð¸Ñ Ð¾ÑтанутÑÑ Ð½ÐµÑкорректированными и единÑтвенный иÑпоÑоб их иÑправить — пропуÑкать/дублировать видеокадры в меÑтах Ñшивки. -Пока <application>MEncoder</application> видит аудио при +Пока <application>MEncoder</application> видит аудио при кодировании видео, он может выполнÑÑ‚ÑŒ Ñтот пропуÑк/дублирование (что обычно не вызывыет проблем, Ñ‚.к. проиÑходит при полноÑтью чёрных кадрах или при Ñмене Ñцен), но еÑли <application>MEncoder</application> не доÑтупно аудио, он проÑто будет обрабатывать вÑе кадры "как еÑÑ‚ÑŒ" и они не будут Ñовпадать -Ñ Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ð¼ аудиопотоком, когда Ð’Ñ‹, например, объедините +Ñ Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ð¼ аудиопотоком, когда Ð’Ñ‹, например, объедините аудио и видео дорожки в Matroska файл. </para> <para> -Прежде вÑего, Вам необходимо преобразовать DVD звук в WAV файл, -который может иÑпользоватьÑÑ Ð°ÑƒÐ´Ð¸Ð¾ÐºÐ¾Ð´ÐµÐºÐ¾Ð¼ в качеÑтве входных +Прежде вÑего, Вам необходимо преобразовать DVD звук в WAV файл, +который может иÑпользоватьÑÑ Ð°ÑƒÐ´Ð¸Ð¾ÐºÐ¾Ð´ÐµÐºÐ¾Ð¼ в качеÑтве входных данных. Ðапример: <screen> -mplayer <replaceable>иÑходный_файл.vob</replaceable> -ao pcm:file=<replaceable>звук.wav</replaceable> +mplayer <replaceable>иÑходный_файл.vob</replaceable> -ao pcm:file=<replaceable>звук.wav</replaceable> -vc dummy -aid 1 -vo null </screen> Ñохранит вторую аудиодорожку из файла -<replaceable>иÑходный_файл.vob</replaceable> в файл +<replaceable>иÑходный_файл.vob</replaceable> в файл <replaceable>звук.wav</replaceable>. Возможно, Ð’Ñ‹ захотите нормализовать звук перед кодированием, поÑкольку аудиодорожки DVD обычно запиÑываютÑÑ Ñ Ð¼Ð°Ð»ÐµÐ½ÑŒÐºÐ¾Ð¹ @@ -1699,14 +1695,14 @@ mplayer <replaceable>иÑходный_файл.vob</replaceable> -ao pcm:file=<r делает то же Ñамое. Ð’Ñ‹ можете Ñжать в Vorbis или MP3. Ðапример: <screen>oggenc -q1 <replaceable>звук.wav</replaceable></screen> -кодирует <replaceable>звук.wav</replaceable> Ñ ÐºÐ°Ñ‡ÐµÑтвом 1, +кодирует <replaceable>звук.wav</replaceable> Ñ ÐºÐ°Ñ‡ÐµÑтвом 1, что примерно Ñквивалентно 80 Кб/Ñ Ð¸ ÑвлÑетÑÑ Ð¼Ð¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ñ‹Ð¼ качеÑтвом, при котором Вам нужно кодировать, еÑли Ð’Ñ‹ заботитеÑÑŒ о качеÑтве. -ПожалуйÑта, обратите внимание, что <application>MEncoder</application> -на данный момент не поддерживает мультиплекÑирование аудиопотоков +ПожалуйÑта, обратите внимание, что <application>MEncoder</application> +на данный момент не поддерживает мультиплекÑирование аудиопотоков Vorbis в выходной файл, поÑкольку он поддерживает только AVI и -MPEG контейнеры Ð´Ð»Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ð½Ñ‹Ñ… файлов, иÑпользование каждого из -которых может привеÑти к проблемам A/V Ñинхронизации Ñ +MPEG контейнеры Ð´Ð»Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ð½Ñ‹Ñ… файлов, иÑпользование каждого из +которых может привеÑти к проблемам A/V Ñинхронизации Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼Ð¸ плеерами, в Ñлучае когда AVI файл Ñодержит VBR аудиопотоки наподобие Vorbis. Ðе беÑпокойтеÑÑŒ, в данном документе будет раÑÑказано как Ð’Ñ‹ @@ -1721,8 +1717,8 @@ MPEG контейнеры Ð´Ð»Ñ Ð²Ñ‹Ñ…Ð¾Ð´Ð½Ñ‹Ñ… файлов, иÑпользо <para> Теперь, поÑле того как Ð’Ñ‹ кодировали видео, Ñкорее вÑего, Ð’Ñ‹ -захотите мультиплекÑировать его Ñ Ð¾Ð´Ð½Ð¸Ð¼ или неÑколькими -аудиопотоками в такие видео контейнеры как AVI, MPEG, +захотите мультиплекÑировать его Ñ Ð¾Ð´Ð½Ð¸Ð¼ или неÑколькими +аудиопотоками в такие видео контейнеры как AVI, MPEG, Matroska или NUT. Ðа данный момент вÑÑ‚Ñ€Ð¾ÐµÐ½Ð½Ð°Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ° вывода аудио и видео в <application>MEncoder</application> еÑÑ‚ÑŒ только Ð´Ð»Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð¾Ð² @@ -1741,7 +1737,7 @@ mencoder -oac copy -ovc copy -o <replaceable>выходной_фильм.avi</re </para> <para> -<application>MEncoder</application> +<application>MEncoder</application> обладает ÑкÑпериментальной поддержкой <systemitem class="library">libavformat</systemitem> — библиотеки из проекта FFmpeg, поддерживающей мультиплекÑирование @@ -1754,12 +1750,12 @@ mencoder -oac copy -ovc copy -o <replaceable>выходной_фильм.asf</re </screen> Ðто Ñделает то же Ñамое, что и предыдущий пример, но выходным контейнером будет ASF. -ПожалуйÑта, обратите внимание, что Ñта поддержка веÑьма +ПожалуйÑта, обратите внимание, что Ñта поддержка веÑьма ÑкÑпериментальна (но ÑтановитÑÑ Ð»ÑƒÑ‡ÑˆÐµ c каждым днём), и будет -работать только в Ñлучае компилÑции <application>MPlayer</application> -Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ð¾Ð¹ поддержкой -<systemitem class="library">libavformat</systemitem> (что означает, -что в большинÑтве Ñлучаев Ð±Ð¸Ð½Ð°Ñ€Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ð¸Ð· пакетов не будет +работать только в Ñлучае компилÑции <application>MPlayer</application> +Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð½Ð¾Ð¹ поддержкой +<systemitem class="library">libavformat</systemitem> (что означает, +что в большинÑтве Ñлучаев Ð±Ð¸Ð½Ð°Ñ€Ð½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ð¸Ð· пакетов не будет работать). </para> @@ -1769,25 +1765,25 @@ mencoder -oac copy -ovc copy -o <replaceable>выходной_фильм.asf</re <para> Ð’Ñ‹ можете ÑтолкнутьÑÑ Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼Ð¸ Ñерьёзными проблемами A/V -Ñинхронизации при попытке мультиплекÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð’Ð°ÑˆÐµÐ³Ð¾ видео +Ñинхронизации при попытке мультиплекÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð’Ð°ÑˆÐµÐ³Ð¾ видео Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ð¼Ð¸ аудиодорожками, где, как бы Ð’Ñ‹ не подбирали задержку аудио, никогда не получаетÑÑ Ð¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð°Ñ ÑинхронизациÑ. Ðто может проиÑходить при иÑпользовании некоторых видеофильтров, пропуÑкающих или дублирующих некоторые кадры, например фильтров обратного телеÑина. -ÐаÑтоÑтельно рекомендуетÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÑÑ‚ÑŒ видеофильтр +ÐаÑтоÑтельно рекомендуетÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÑÑ‚ÑŒ видеофильтр <option>harddup</option> в конце цепочки фильтров Ð´Ð»Ñ Ð¸Ð·Ð±ÐµÐ¶Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ñ‹Ñ… проблем. </para> <para> -Без опции <option>harddup</option>, в Ñлучае когда -<application>MEncoder</application> хочет дублировать кадр, он -полагаетÑÑ Ð½Ð° то, что мультиплекÑор раÑположит отметку в +Без опции <option>harddup</option>, в Ñлучае когда +<application>MEncoder</application> хочет дублировать кадр, он +полагаетÑÑ Ð½Ð° то, что мультиплекÑор раÑположит отметку в контейнере таким образом, что поÑледний кадр будет повторен Ð´Ð»Ñ Ð´Ð¾ÑÑ‚Ð¸Ð¶ÐµÐ½Ð¸Ñ Ñинхронизации без реальной запиÑи кадра. С опцией <option>harddup</option>, <application>MEncoder</application> -вмеÑто Ñтого проÑто ещё раз помеÑтит поÑледний кадр в цепочку +вмеÑто Ñтого проÑто ещё раз помеÑтит поÑледний кадр в цепочку фильтров. Ðто означает, что кодер получит <emphasis>точно</emphasis> такой же кадр дважды и Ñожмёт его. @@ -1797,12 +1793,12 @@ mencoder -oac copy -ovc copy -o <replaceable>выходной_фильм.asf</re </para> <para> -Также у Ð’Ð°Ñ Ð¼Ð¾Ð¶ÐµÑ‚ не быть иного выбора, как иÑпользовать -<option>harddup</option> Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð°Ð¼Ð¸ контейнеров, которые -не Ñлишком плотно ÑвÑзаны Ñ -<application>MEncoder</application>, например, Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð°Ð¼Ð¸, -поддерживаемыми Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ -<systemitem class="library">libavformat</systemitem>, +Также у Ð’Ð°Ñ Ð¼Ð¾Ð¶ÐµÑ‚ не быть иного выбора, как иÑпользовать +<option>harddup</option> Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð°Ð¼Ð¸ контейнеров, которые +не Ñлишком плотно ÑвÑзаны Ñ +<application>MEncoder</application>, например, Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ñ‚Ð°Ð¼Ð¸, +поддерживаемыми Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ +<systemitem class="library">libavformat</systemitem>, которые могут не поддерживать дублирование кадров на уровне контейнера. </para> @@ -1813,7 +1809,7 @@ mencoder -oac copy -ovc copy -o <replaceable>выходной_фильм.asf</re <title>ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ‚ÐµÐ¹Ð½ÐµÑ€Ð° AVI</title> <para> -Ð¥Ð¾Ñ‚Ñ Ñто Ñамый широко раÑпроÑтранённый формат контейнера поÑле +Ð¥Ð¾Ñ‚Ñ Ñто Ñамый широко раÑпроÑтранённый формат контейнера поÑле MPEG-1, он также обладает некоторыми ÑущеÑтвенными недоÑтатками. Пожалуй, они наиболее очевидны в его избыточноÑти. Ð”Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ цепочки AVI файла терÑетÑÑ 24 байта на заголовки и @@ -1832,7 +1828,7 @@ MPEG-1, он также обладает некоторыми ÑущеÑтвеР<orderedlist> <listitem><para> Может быть Ñохранено только Ñодержимое Ñ Ñ„Ð¸ÐºÑированной чаÑтотой - кадров. Ð’ чаÑтноÑти, Ñто оÑобенно ограничивает, когда Ваш + кадров. Ð’ чаÑтноÑти, Ñто оÑобенно ограничивает, когда Ваш иÑходный материал Ñмешанного Ñодержимого: например, ÑвлÑетÑÑ ÑмеÑью NTSC видео и киноматериала. Ð’ дейÑтвительноÑти, еÑÑ‚ÑŒ хаки, позволÑющие ÑохранÑÑ‚ÑŒ Ñодержимое @@ -1843,7 +1839,7 @@ MPEG-1, он также обладает некоторыми ÑущеÑтвеРÐудио в AVI файлах должно быть или Ñ Ð¿Ð¾ÑтоÑнным битпотоком (CBR) или Ñ Ð¿Ð¾ÑтоÑнным размером кадра (Ñ‚.е. вÑе кадры декодируютÑÑ Ð² одно и то же чиÑло выборок). - К Ñожалению, Ñамый Ñффективный кодек, Vorbis, не удовлетворÑет + К Ñожалению, Ñамый Ñффективный кодек, Vorbis, не удовлетворÑет ни одному из данных требований. ПоÑтому, еÑли Ð’Ñ‹ планируете ÑохранÑÑ‚ÑŒ Ваш фильм в AVI, Ð’Ñ‹ должны иÑпользовать менее Ñффективный кодек, такой как MP3 или AC-3. @@ -1859,7 +1855,7 @@ Vorbis кодирование. инÑтрумент, который Ð’Ñ‹ иÑпользуете Ð´Ð»Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ. Однако, возможно иÑпользовать <application>MEncoder</application> только Ð´Ð»Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ð¸Ð´ÐµÐ¾ и затем иÑпользовать внешние -утилиты Ð´Ð»Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð°ÑƒÐ´Ð¸Ð¾ и мультиплекÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÐµÐ³Ð¾ в +утилиты Ð´Ð»Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð°ÑƒÐ´Ð¸Ð¾ и мультиплекÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÐµÐ³Ð¾ в контейнер другого формата. </para> </sect3> @@ -1874,10 +1870,10 @@ Matroska — Ñто Ñвободный, открытый Ñтандарт Ñ„ продвинутых возможноÑтей, которые Ñтарые контейнеры (наподобие AVI) не поддерживают. Ðапример, Matroska поддерживает аудиоÑодержимое Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ñ‹Ð¼ -битпотоком (VBR), переменные чаÑтоты кадров (VFR), разделы, +битпотоком (VBR), переменные чаÑтоты кадров (VFR), разделы, файловые вложениÑ, код Ð¾Ð±Ð½Ð°Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ð¾ÑˆÐ¸Ð±Ð¾Ðº (EDC) и Ñовременные -A/V кодеки, такие как "Продвинутое Ðудио Кодирование" ("Advanced -Audio Coding", AAC), "Vorbis" или "MPEG-4 AVC" (H.264), также +A/V кодеки, такие как "Продвинутое Ðудио Кодирование" ("Advanced +Audio Coding", AAC), "Vorbis" или "MPEG-4 AVC" (H.264), также не поддерживаемые AVI. </para> @@ -1885,7 +1881,7 @@ Audio Coding", AAC), "Vorbis" или "MPEG-4 AVC" (H.264), также Утилиты, необходимые Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Matroska файлов, Ñообща называютÑÑ <application>mkvtoolnix</application>, и доÑтупны Ð´Ð»Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ð½Ñтва Unix платформ, так же как и Ð´Ð»Ñ Window$. -ПоÑкольку Matroska — открытый формат, Ð’Ñ‹ можете найти +ПоÑкольку Matroska — открытый формат, Ð’Ñ‹ можете найти иные утилиты, которые лучше Вам подходÑÑ‚, но поÑкольку <application>mkvtoolnix</application> — наиболее общие и поддерживаютÑÑ Ñамой командой разработчиков Matroska, мы @@ -1894,8 +1890,8 @@ Audio Coding", AAC), "Vorbis" или "MPEG-4 AVC" (H.264), также <para> Возможно, Ñамым проÑтым ÑпоÑобом начать иÑпользовать Matroska -ÑвлÑетÑÑ Ð¸Ñпользование <application>MMG</application>, -графичеÑкой оболочки, поÑтавлÑемой Ñ +ÑвлÑетÑÑ Ð¸Ñпользование <application>MMG</application>, +графичеÑкой оболочки, поÑтавлÑемой Ñ <application>mkvtoolnix</application>. Следуйте <ulink url="http://www.bunkus.org/videotools/mkvtoolnix/doc/mkvmerge-gui.html">руководÑтву к mkvmerge GUI (mmg)</ulink>. </para> @@ -1912,7 +1908,7 @@ mkvmerge -o <replaceable>выходной_файл.mkv</replaceable> <replaceabl файл <replaceable>выходной_файл.mkv</replaceable>. Как было отмечено ранее, Matroska ÑпоÑобна реализовать гораздо большее, например, множеÑтвенные аудиодорожки (Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ñ‚Ð¾Ð½ÐºÑƒÑŽ -наÑтройку аудио/видео Ñинхронизации), разделы, Ñубтитры, +наÑтройку аудио/видео Ñинхронизации), разделы, Ñубтитры, разбиение и Ñ‚.д.. ПожалуйÑта, обратитеÑÑŒ к документации на Ñти Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð´ÐµÑ‚Ð°Ð»ÐµÐ¹. @@ -1933,7 +1929,7 @@ mkvmerge -o <replaceable>выходной_файл.mkv</replaceable> <replaceabl <formalpara> <title>Что такое телеÑин?</title> <para> -ЕÑли Ð’Ñ‹ не понимаете многое из того, что здеÑÑŒ напиÑано, +ЕÑли Ð’Ñ‹ не понимаете многое из того, что здеÑÑŒ напиÑано, прочтите <ulink url="http://en.wikipedia.org/wiki/Telecine">Ñтатью Википедии о телеÑине</ulink>. Ðто понÑтное и разумно обширное опиÑание того, что такое @@ -1944,29 +1940,29 @@ mkvmerge -o <replaceable>выходной_файл.mkv</replaceable> <replaceabl <title>Замечание о чиÑлах.</title> <para> Многие документы, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½ÑƒÑŽ выше Ñтатью, ÑÑылаютÑÑ -на количеÑтво полей в Ñекунду 59.94 Ð´Ð»Ñ NTSC видео и -ÑоответÑтвующие кадровые чаÑтоты 29.97 (Ð´Ð»Ñ Ð¿Ð¾Ð´Ð²ÐµÑ€Ð¶ÐµÐ½Ð½Ð¾Ð³Ð¾ +на количеÑтво полей в Ñекунду 59.94 Ð´Ð»Ñ NTSC видео и +ÑоответÑтвующие кадровые чаÑтоты 29.97 (Ð´Ð»Ñ Ð¿Ð¾Ð´Ð²ÐµÑ€Ð¶ÐµÐ½Ð½Ð¾Ð³Ð¾ телеÑину и череÑÑтрочного видео) и 23.976 (Ð´Ð»Ñ Ð¿Ð¾Ñтрочного). Ð”Ð»Ñ Ð¿Ñ€Ð¾Ñтоты в Ñ€Ñде Ñтатей Ñти чиÑла даже округлÑÑŽÑ‚ÑÑ Ð´Ð¾ 60, 30 и 24 ÑоответÑтвенно. </para></formalpara> <para> -Строго говорÑ, вÑе Ñти чиÑла ÑвлÑÑŽÑ‚ÑÑ Ð°Ð¿Ð¿Ñ€Ð¾ÐºÑимациÑми. -Чёрно-белое NTSC видео было точно Ñ 60 полÑми в Ñекунду, но +Строго говорÑ, вÑе Ñти чиÑла ÑвлÑÑŽÑ‚ÑÑ Ð°Ð¿Ð¿Ñ€Ð¾ÐºÑимациÑми. +Чёрно-белое NTSC видео было точно Ñ 60 полÑми в Ñекунду, но позже была выбрана чаÑтота 60000/1001 Ð´Ð»Ñ Ð°Ð´Ð°Ð¿Ñ‚Ð°Ñ†Ð¸Ð¸ цветовой -информации Ñ Ð¾Ð´Ð½Ð¾Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ñ‹Ð¼ Ñохранением ÑовмеÑтимоÑти Ñ Ñ‡Ñ‘Ñ€Ð½Ð¾-белым -телевидением. +информации Ñ Ð¾Ð´Ð½Ð¾Ð²Ñ€ÐµÐ¼ÐµÐ½Ð½Ñ‹Ð¼ Ñохранением ÑовмеÑтимоÑти Ñ Ñ‡Ñ‘Ñ€Ð½Ð¾-белым +телевидением. Цифровое NTSC видео (такое как на DVD) также Ñ 60000/1001 полÑми в Ñекунду. ОтÑюда возникла ÐºÐ°Ð´Ñ€Ð¾Ð²Ð°Ñ Ñ‡Ð°Ñтота 30000/1001 -кадр/Ñек Ð´Ð»Ñ Ñ‡ÐµÑ€ÐµÑÑтрочного и телеÑиненного видео; поÑтрочное +кадр/Ñек Ð´Ð»Ñ Ñ‡ÐµÑ€ÐµÑÑтрочного и телеÑиненного видео; поÑтрочное видео идёт Ñ 24000/1001 кадр/Ñек. </para> <para> Старые верÑии документации <application>MEncoder</application> и много архивных Ñообщений из ÑпиÑков раÑÑылки ÑÑылаютÑÑ Ð½Ð° -59.94, 29.97 и 23.976. Ð’ÑÑ Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ <application>MEncoder</application> +59.94, 29.97 и 23.976. Ð’ÑÑ Ð´Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ <application>MEncoder</application> была обновлена Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ñ€Ð¾Ð±Ð½Ñ‹Ñ… значений, и Вам так же Ñледует их иÑпользовать. </para> @@ -1980,26 +1976,26 @@ mkvmerge -o <replaceable>выходной_файл.mkv</replaceable> <replaceabl <title>Как иÑпользуетÑÑ Ñ‚ÐµÐ»ÐµÑин.</title> <para> Ð’ÑÑ‘ видео, предназначенное Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра на NTSC телевидении -должно быть Ñ 60000/1001 полÑми в Ñекунду. Фильмы, Ñделанные +должно быть Ñ 60000/1001 полÑми в Ñекунду. Фильмы, Ñделанные Ð´Ð»Ñ Ð¿Ð¾ÐºÐ°Ð·Ð° на TV чаÑто ÑнимаютÑÑ Ð½ÐµÐ¿Ð¾ÑредÑтвенно при 60000/1001 -полей в Ñекунду, но большинÑтво кино ÑнимаетÑÑ Ð½Ð° 24 или -24000/1001 кадрах в Ñекунду. Ð’ процеÑÑе ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ DVD Ñ +полей в Ñекунду, но большинÑтво кино ÑнимаетÑÑ Ð½Ð° 24 или +24000/1001 кадрах в Ñекунду. Ð’ процеÑÑе ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ DVD Ñ ÐºÐ¸Ð½Ð¾Ñ„Ð¸Ð»ÑŒÐ¼Ð¾Ð¼, видео преобразуетÑÑ Ð´Ð»Ñ Ñ‚ÐµÐ»ÐµÐ²Ð¸Ð´ÐµÐ½Ð¸Ñ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ процеÑÑа, называемого телеÑин. </para></formalpara> <para> -Ð’ дейÑтвительноÑти, видео никогда не хранитÑÑ Ð½Ð° DVD Ñ +Ð’ дейÑтвительноÑти, видео никогда не хранитÑÑ Ð½Ð° DVD Ñ 60000/1001 полÑми в Ñекунду. Ð”Ð»Ñ Ð²Ð¸Ð´ÐµÐ¾, оригинально ÑвлÑющегоÑÑ -60000/1001, ÐºÐ°Ð¶Ð´Ð°Ñ Ð¿Ð°Ñ€Ð° полей объединÑетÑÑ Ð´Ð»Ñ Ñ„Ð¾Ñ€Ð¼Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ +60000/1001, ÐºÐ°Ð¶Ð´Ð°Ñ Ð¿Ð°Ñ€Ð° полей объединÑетÑÑ Ð´Ð»Ñ Ñ„Ð¾Ñ€Ð¼Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ°Ð´Ñ€Ð°, Ð¿Ñ€Ð¸Ð²Ð¾Ð´Ñ Ðº 30000/1001 кадрам в Ñекунду. Затем аппаратные DVD плееры читают флаг, включенный в видеопоток, Ð´Ð»Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ -того какие, чётные или нечётные Ñтроки должны формировать первый +того какие, чётные или нечётные Ñтроки должны формировать первый кадр. </para> <para> -Обычно, Ñодержимое Ñ Ñ‡Ð°Ñтотой кадров 24000/1001 оÑтаётÑÑ +Обычно, Ñодержимое Ñ Ñ‡Ð°Ñтотой кадров 24000/1001 оÑтаётÑÑ Ð½ÐµÐ¸Ð·Ð¼ÐµÐ½Ð½Ñ‹Ð¼ при кодировании на DVD и DVD плеер должен выполнить телеÑин на лету. Однако, иногда видео подвергаетÑÑ Ñ‚ÐµÐ»ÐµÑину <emphasis>до</emphasis> запиÑи на DVD; и Ñ…Ð¾Ñ‚Ñ Ð¾Ð½Ð¾ изначально @@ -2009,11 +2005,11 @@ DVD плееры читают флаг, включенный в видеопот </para> <para> -При раÑÑмотрении отдельных кадров, полученных из 60000/1001 -полей в Ñекунду, телеÑиненных или наоборот, череÑÑÑ‚Ñ€Ð¾Ñ‡Ð½Ð°Ñ -развёртка чётко видна в Ñлучае, еÑли еÑÑ‚ÑŒ какое-либо движение, -поÑкольку одно поле (Ñкажем, Ñ Ñ‡Ñ‘Ñ‚Ð½Ñ‹Ð¼Ð¸ номерами Ñтрок) -отображает момент времени на 1/(60000/1001) Ñекунды позже, чем +При раÑÑмотрении отдельных кадров, полученных из 60000/1001 +полей в Ñекунду, телеÑиненных или наоборот, череÑÑÑ‚Ñ€Ð¾Ñ‡Ð½Ð°Ñ +развёртка чётко видна в Ñлучае, еÑли еÑÑ‚ÑŒ какое-либо движение, +поÑкольку одно поле (Ñкажем, Ñ Ñ‡Ñ‘Ñ‚Ð½Ñ‹Ð¼Ð¸ номерами Ñтрок) +отображает момент времени на 1/(60000/1001) Ñекунды позже, чем другое поле. ВоÑпроизведение череÑÑтрочного видео на компьютере выглÑдит Ñкверно по двум причинам: монитор обладает более выÑоким разрешением и видео показываетÑÑ Ð¿Ð¾ÐºÐ°Ð´Ñ€Ð¾Ð²Ð¾, вмеÑто Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾ @@ -2026,20 +2022,20 @@ DVD плееры читают флаг, включенный в видеопот Ðтот раздел применим только к NTSC DVD, а не к PAL. </para></listitem> <listitem><para> -Примеры командных Ñтрок <application>MEncoder</application> -в данном разделе <emphasis role="bold">не</emphasis> +Примеры командных Ñтрок <application>MEncoder</application> +в данном разделе <emphasis role="bold">не</emphasis> предназначены Ð´Ð»Ñ Ñ€ÐµÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ иÑпользованиÑ. Они проÑто ÑвлÑÑŽÑ‚ÑÑ -минимально необходимым требованием Ð´Ð»Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ +минимально необходимым требованием Ð´Ð»Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÑоответÑтвующей категории видео. То, как Ñделать хорошие DVD -рипы или тонко наÑтроить -<systemitem class="library">libavcodec</systemitem> Ð´Ð»Ñ -доÑÑ‚Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð¼Ð°ÐºÑимального качеÑтва, не входит в рамки данного +рипы или тонко наÑтроить +<systemitem class="library">libavcodec</systemitem> Ð´Ð»Ñ +доÑÑ‚Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð¼Ð°ÐºÑимального качеÑтва, не входит в рамки данного раздела; обратитеÑÑŒ к другим разделам <link linkend="encoding-guide">РуководÑтва по кодированию Ñ MEncoder</link>. </para></listitem> <listitem><para> -ЕÑÑ‚ÑŒ неÑколько ÑноÑок, Ñпецифичных Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ руководÑтва, +ЕÑÑ‚ÑŒ неÑколько ÑноÑок, Ñпецифичных Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ руководÑтва, обозначенных Ñледующим образом: <link linkend="menc-feat-telecine-footnotes">[1]</link> </para></listitem> @@ -2057,8 +2053,8 @@ DVD плееры читают флаг, включенный в видеопот </para> <para> -При воÑпроизведении DVD Ñ Ð¿Ð¾Ñтрочной развёрткой в -<application>MPlayer</application>, <application>MPlayer</application> +При воÑпроизведении DVD Ñ Ð¿Ð¾Ñтрочной развёрткой в +<application>MPlayer</application>, <application>MPlayer</application> выведет Ñледующую Ñтроку при начале воÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ñ„Ð¸Ð»ÑŒÐ¼Ð°: <screen>demux_mpg: обнаружено 24000/1001 кадра/Ñек NTSC Ñодержимое Ñ Ð¿Ð¾Ñтрочной развёрткой, @@ -2071,11 +2067,11 @@ DVD плееры читают флаг, включенный в видеопот <para> При проÑмотре видео Ñ Ð¿Ð¾Ñтрочной развёрткой Ð’Ñ‹ не должны никогда -наблюдать череÑÑтрочноÑÑ‚ÑŒ. Однако, будьте оÑторожны, поÑкольку -иногда еÑÑ‚ÑŒ Ð½ÐµÐ±Ð¾Ð»ÑŒÑˆÐ°Ñ Ð¿Ñ€Ð¸Ð¼ÐµÑÑŒ телеÑина там, где Ð’Ñ‹ Ñтого не -ожидаете. Мной наблюдалиÑÑŒ DVD Ñ TV-шоу, у которых была одна +наблюдать череÑÑтрочноÑÑ‚ÑŒ. Однако, будьте оÑторожны, поÑкольку +иногда еÑÑ‚ÑŒ Ð½ÐµÐ±Ð¾Ð»ÑŒÑˆÐ°Ñ Ð¿Ñ€Ð¸Ð¼ÐµÑÑŒ телеÑина там, где Ð’Ñ‹ Ñтого не +ожидаете. Мной наблюдалиÑÑŒ DVD Ñ TV-шоу, у которых была одна Ñекунда телеÑина при каждой Ñмене Ñцен или в Ñлучайных на вид -меÑтах. Однажды Ñ Ð²Ð¸Ð´ÐµÐ» DVD, у которого одна половина была Ñ +меÑтах. Однажды Ñ Ð²Ð¸Ð´ÐµÐ» DVD, у которого одна половина была Ñ Ð¿Ð¾Ñтрочной развёрткой, а Ð²Ñ‚Ð¾Ñ€Ð°Ñ — телеÑиненной. ЕÑли Ð’Ñ‹ желаете быть <emphasis>дейÑтвительно</emphasis> уверенными, Ð’Ñ‹ можете проÑканировать веÑÑŒ фильм: @@ -2084,24 +2080,24 @@ DVD плееры читают флаг, включенный в видеопот ИÑпользование <option>-benchmark</option> позволÑет <application>MPlayer</application> воÑпроизводить фильм Ñтоль -быÑтро, Ñколь Ñто возможно; тем не менее, в завиÑимоÑти от -Вашего железа, Ñто может занÑÑ‚ÑŒ некоторое времÑ. Ð’ÑÑкий раз, +быÑтро, Ñколь Ñто возможно; тем не менее, в завиÑимоÑти от +Вашего железа, Ñто может занÑÑ‚ÑŒ некоторое времÑ. Ð’ÑÑкий раз, когда demux_mpg будет Ñообщать об изменении чаÑтоты кадров, Ñтрока прÑмо над Ñообщением покажет Вам времÑ, при котором произошло изменение. </para> <para> -Иногда видео на DVD Ñ Ð¿Ð¾Ñтрочной развёрткой называют +Иногда видео на DVD Ñ Ð¿Ð¾Ñтрочной развёрткой называют "мÑгким телеÑином", поÑкольку предполагаетÑÑ, что -телеÑин будет выполнен DVD плеером. +телеÑин будет выполнен DVD плеером. </para> </sect3> <sect3 id="menc-feat-telecine-ident-telecined"> <title>ТелеÑин</title> <para> -ТелеÑиненное видео изначально ÑнимаетÑÑ Ð½Ð° 24000/1001 кадр/Ñек, +ТелеÑиненное видео изначально ÑнимаетÑÑ Ð½Ð° 24000/1001 кадр/Ñек, но подвергаетÑÑ Ñ‚ÐµÐ»ÐµÑину <emphasis>до</emphasis> запиÑи на DVD. </para> @@ -2113,7 +2109,7 @@ DVD плееры читают флаг, включенный в видеопот <para> При проÑмотре телеÑиненного видео, Ð’Ñ‹ будете видеть "мерцающие" -артефакты череÑÑтрочной развёртки: они будут многократно +артефакты череÑÑтрочной развёртки: они будут многократно повторÑÑ‚ÑŒÑÑ Ð¸ иÑчезать. Ð’Ñ‹ можете детально Ñто раÑÑмотреть Ñледующим образом: <orderedlist> @@ -2128,15 +2124,15 @@ DVD плееры читают флаг, включенный в видеопот вперёд. </para></listitem> <listitem><para> - Ðаблюдайте за поÑледовательноÑтью кадров Ñ Ñ‡ÐµÑ€ÐµÑÑтрочной и - поÑтрочной развёрткой. ЕÑли Ð’Ñ‹ видите Ñледующую Ñтруктуру: + Ðаблюдайте за поÑледовательноÑтью кадров Ñ Ñ‡ÐµÑ€ÐµÑÑтрочной и + поÑтрочной развёрткой. ЕÑли Ð’Ñ‹ видите Ñледующую Ñтруктуру: ЧЧЧПП,ЧЧЧПП,ЧЧЧПП,... (где Ч — череÑÑтрочные, а П — - поÑтрочные кадры), значит видео телеÑиненное. ЕÑли Ð’Ñ‹ + поÑтрочные кадры), значит видео телеÑиненное. ЕÑли Ð’Ñ‹ наблюдаете иную Ñтруктуру, видео может быть телеÑиненным, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ ÐºÐ°ÐºÐ¾Ð¹-либо неÑтандартный метод; - <application>MEncoder</application> не может преобразовать + <application>MEncoder</application> не может преобразовать без потерь неÑтандартный телеÑин в поÑтрочную развёртку. - ЕÑли Ð’Ñ‹ не видите вообще никакой Ñтруктуры, значит наиболее + ЕÑли Ð’Ñ‹ не видите вообще никакой Ñтруктуры, значит наиболее вероÑтно, что видео Ñ Ñ‡ÐµÑ€ÐµÑÑтрочной развёрткой. </para></listitem> </orderedlist> @@ -2150,8 +2146,8 @@ DVD плееры читают флаг, включенный в видеопот <para> Другой ÑпоÑоб выÑÑнить, был Ваш иÑточник подвержен телеÑину или нет, заключаетÑÑ -в воÑпроизведении иÑходного материала Ñ Ð¾Ð¿Ñ†Ð¸Ñми командной Ñтроки -<option>-vf pullup</option> и <option>-v</option>, чтобы увидеть, как +в воÑпроизведении иÑходного материала Ñ Ð¾Ð¿Ñ†Ð¸Ñми командной Ñтроки +<option>-vf pullup</option> и <option>-v</option>, чтобы увидеть, как <option>pullup</option> ÑопоÑтавлÑет кадры. ЕÑли иÑточник был телеÑиненным, Ð’Ñ‹ должны увидеть в конÑоли 3:2 Ñтруктуру Ñ Ñ‡ÐµÑ€ÐµÐ´ÑƒÑŽÑ‰Ð¸Ð¼Ð¸ÑÑ <systemitem>0+.1.+2</systemitem> и <systemitem>0++1</systemitem>. @@ -2198,15 +2194,15 @@ DVD плееры читают флаг, включенный в видеопот <para> Когда <application>MPlayer</application> воÑпроизводит Ñту категорию, он будет -(как правило, периодичеÑки) переключатьÑÑ Ð¼ÐµÐ¶Ð´Ñƒ "30000/1001 кадров/Ñек NTSC -Ñодержимым" и "24000/1001 кадра/Ñек NTSC Ñодержимым Ñ Ð¿Ð¾Ñтрочной развёрткой". -Смотрите конец вывода <application>MPlayer</application>, чтобы увидеть +(как правило, периодичеÑки) переключатьÑÑ Ð¼ÐµÐ¶Ð´Ñƒ "30000/1001 кадров/Ñек NTSC +Ñодержимым" и "24000/1001 кадра/Ñек NTSC Ñодержимым Ñ Ð¿Ð¾Ñтрочной развёрткой". +Смотрите конец вывода <application>MPlayer</application>, чтобы увидеть Ñти ÑообщениÑ. </para> <para> -Вам Ñледует проверить разделы Ñ "30000/1001 кадров/Ñек NTSC Ñодержимым", -чтобы убедитьÑÑ, что видео дейÑтвительно телеÑиненное, а не проÑто +Вам Ñледует проверить разделы Ñ "30000/1001 кадров/Ñек NTSC Ñодержимым", +чтобы убедитьÑÑ, что видео дейÑтвительно телеÑиненное, а не проÑто череÑÑтрочное. </para> </sect3> @@ -2221,8 +2217,8 @@ DVD плееры читают флаг, включенный в видеопот </para> <para> -Ðта ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ Ð²Ñ‹Ð³Ð»Ñдит также, как и "Ñмешанные поÑÑ‚Ñ€Ð¾Ñ‡Ð½Ð°Ñ Ñ€Ð°Ð·Ð²ÐµÑ€Ñ‚ÐºÐ° и телеÑин", -до тех пор, пока не проверите разделы 30000/1001 кадр/Ñек и не увидите, +Ðта ÐºÐ°Ñ‚ÐµÐ³Ð¾Ñ€Ð¸Ñ Ð²Ñ‹Ð³Ð»Ñдит также, как и "Ñмешанные поÑÑ‚Ñ€Ð¾Ñ‡Ð½Ð°Ñ Ñ€Ð°Ð·Ð²ÐµÑ€Ñ‚ÐºÐ° и телеÑин", +до тех пор, пока не проверите разделы 30000/1001 кадр/Ñек и не увидите, что Ñтруктура телеÑина отÑутÑтвует. </para> </sect3> @@ -2234,9 +2230,9 @@ DVD плееры читают флаг, включенный в видеопот <title>Как кодировать каждую категорию</title> <para> -Как уже было Ñказано выше, поÑледующие примеры командных Ñтрок -<application>MEncoder</application> <emphasis role="bold">не</emphasis> означают, -что надо иÑпользовать именно их; они вÑего лишь примеры минимального набора параметров +Как уже было Ñказано выше, поÑледующие примеры командных Ñтрок +<application>MEncoder</application> <emphasis role="bold">не</emphasis> означают, +что надо иÑпользовать именно их; они вÑего лишь примеры минимального набора параметров Ð´Ð»Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð¾Ð³Ð¾ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ категории. </para> @@ -2246,8 +2242,8 @@ DVD плееры читают флаг, включенный в видеопот <para> Видео Ñ Ð¿Ð¾Ñтрочной разверткой не требует Ñпециальной обработки Ð´Ð»Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ. -ЕдинÑтвенный нужный Вам Ð´Ð»Ñ ÑƒÐ²ÐµÑ€ÐµÐ½Ð½Ð¾Ñти параметр — Ñто -<option>-ofps 24000/1001</option>. +ЕдинÑтвенный нужный Вам Ð´Ð»Ñ ÑƒÐ²ÐµÑ€ÐµÐ½Ð½Ð¾Ñти параметр — Ñто +<option>-ofps 24000/1001</option>. Ð’ противном Ñлучае <application>MEncoder</application> будет пытатьÑÑ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ Ñ 30000/1001 кадрами в Ñекунду и ÑоздаÑÑ‚ дублирующиеÑÑ ÐºÐ°Ð´Ñ€Ñ‹. </para> @@ -2274,7 +2270,7 @@ DVD плееры читают флаг, включенный в видеопот ТелеÑин может быть обращён Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¾Ñ€Ð¸Ð³Ð¸Ð½Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ 24000/1001 Ñодержимого при помощи процеÑÑа, называемого обратный телеÑин. <application>MPlayer</application> Ñодержит неÑколько фильтров Ð´Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ -Ñтого; лучший из них, <option>pullup</option> опиÑан в разделе +Ñтого; лучший из них, <option>pullup</option> опиÑан в разделе <link linkend="menc-feat-telecine-encode-mixedpt">Ñмешанные поÑÑ‚Ñ€Ð¾Ñ‡Ð½Ð°Ñ Ñ€Ð°Ð·Ð²ÐµÑ€Ñ‚ÐºÐ° и телеÑин</link>. </para> @@ -2285,10 +2281,10 @@ DVD плееры читают флаг, включенный в видеопот <title>ЧереÑÑÑ‚Ñ€Ð¾Ñ‡Ð½Ð°Ñ Ñ€Ð°Ð·Ð²ÐµÑ€Ñ‚ÐºÐ°</title> <para> -Ðа практике в большинÑтве Ñлучаев невозможно получить полноÑтью поÑтрочное +Ðа практике в большинÑтве Ñлучаев невозможно получить полноÑтью поÑтрочное видео из череÑÑтрочного Ñодержимого. ЕдинÑтвенный ÑпоÑоб Ñделать Ñто без потери половины вертикального Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ -- Ñто удвоить чаÑтоту кадров и попытатьÑÑ "угадать", что должно ÑоÑтавить +- Ñто удвоить чаÑтоту кадров и попытатьÑÑ "угадать", что должно ÑоÑтавить ÑоответÑтвующие линии каждого Ð¿Ð¾Ð»Ñ (Ñтот ÑпоÑоб имеет недоÑтатки, Ñмотрите метод 3). </para> @@ -2299,7 +2295,7 @@ DVD плееры читают флаг, включенный в видеопот кодировщика хорошо Ñжимать, но <systemitem class="library">libavcodec</systemitem> имеет два параметра Ñпециально Ð´Ð»Ñ Ñ‡ÑƒÑ‚ÑŒ лучшего ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ñ‡ÐµÑ€ÐµÑÑтрочного видео: <option>ildct</option> и <option>ilme</option>. К тому же, наÑтоÑтельно - рекомендуетÑÑ Ð¸Ñпользовать + рекомендуетÑÑ Ð¸Ñпользовать <option>mbd=2</option><link linkend="menc-feat-telecine-footnotes">[2]</link>, потому что при Ñтом макроблоки в меÑтах без Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ кодированы как нечереÑÑтрочные. Имейте в виду, что <option>-ofps</option> здеÑÑŒ ÐЕ нужна. @@ -2307,15 +2303,15 @@ DVD плееры читают флаг, включенный в видеопот </para></listitem> <listitem><para> ИÑпользуйте фильтр деинтерлейÑинга перед кодированием. СущеÑтвует неÑколько - таких фильтров на выбор, каждый имеет Ñвои преимущеÑтва и недоÑтатки. + таких фильтров на выбор, каждый имеет Ñвои преимущеÑтва и недоÑтатки. ОбратитеÑÑŒ к <option>mplayer -pphelp</option> и <option>mplayer -vf help</option> - Ð´Ð»Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð´Ð¾Ñтупных (grep по "deint"), прочтите + Ð´Ð»Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð´Ð¾Ñтупных (grep по "deint"), прочтите <ulink url="http://guru.multimedia.cx/deinterlacing-filters/">Сравнение фильтров деинтерлейÑинга</ulink> Майкла Ðидермайера (Michael Niedermayer), и поищите в <ulink url="http://www.mplayerhq.hu/design7/mailing_lists.html"> ÑпиÑках раÑÑылки MPlayer</ulink>, чтобы найти множеÑтво обÑуждений различных фильтров. - И опÑÑ‚ÑŒ, чаÑтота кадров не менÑетÑÑ, поÑтому никаких <option>-ofps</option>. + И опÑÑ‚ÑŒ, чаÑтота кадров не менÑетÑÑ, поÑтому никаких <option>-ofps</option>. к тому же деинтерлейÑинг Ñледует производить поÑле Ð¾Ð±Ñ€ÐµÐ·Ð°Ð½Ð¸Ñ <link linkend="menc-feat-telecine-footnotes">[1]</link> и до маÑштабированиÑ. <screen>mencoder dvd://1 -oac copy -vf yadif -ovc lavc</screen> @@ -2323,23 +2319,23 @@ DVD плееры читают флаг, включенный в видеопот <listitem><para> К Ñожалению, Ñта Ð¾Ð¿Ñ†Ð¸Ñ Ñбоит Ñ <application>MEncoder</application>; она должна хорошо работать Ñ <application>MEncoder G2</application>, но его пока нет. Ð’Ñ‹ - можете ÑтолкнутьÑÑ Ñ ÐºÑ€Ð°Ñ…Ð°Ð¼Ð¸. Как бы то ни было, назначение опции + можете ÑтолкнутьÑÑ Ñ ÐºÑ€Ð°Ñ…Ð°Ð¼Ð¸. Как бы то ни было, назначение опции <option> -vf tfields</option> — Ñоздать полный кадр из каждого полÑ, что делает чаÑтоту кадров равной 60000/1001. ПреимущеÑтво Ñтого подхода в том, что никакие данные не терÑÑŽÑ‚ÑÑ; однако, Ñ‚.к. каждый кадр получаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ из одного - полÑ, недоÑтающие Ñтроки должны как-то интерполироватьÑÑ. - + полÑ, недоÑтающие Ñтроки должны как-то интерполироватьÑÑ. + Ðе ÑущеÑтвует очень хороших методов генерации недоÑтающих данных, поÑтому результат будет выглÑдеть неÑколько похожим на применение некоторых фильтров деинтерлейÑинга. Ð“ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ Ð½ÐµÐ´Ð¾Ñтающих Ñтрок также Ñоздает другие проблемы, проÑто потому что количеÑтво данных удваиваетÑÑ. Таким образом, Ð´Ð»Ñ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ ÐºÐ°Ñ‡ÐµÑтва требуютÑÑ Ð±Ð¾Ð»ÐµÐµ выÑокие Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ - битпотока, и больше реÑурÑов процеÑÑора иÑпользуетÑÑ ÐºÐ°Ðº Ð´Ð»Ñ + битпотока, и больше реÑурÑов процеÑÑора иÑпользуетÑÑ ÐºÐ°Ðº Ð´Ð»Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ, так и Ð´Ð»Ñ Ð´ÐµÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ. <option>tfields</option> имеет неÑколько различных опций, определÑющих ÑпоÑоб ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½ÐµÐ´Ð¾Ñтающих Ñтрок каждого кадра. ЕÑли выбрали Ñтот ÑпоÑоб, обратитеÑÑŒ к руководÑтву и выберите ту опцию, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð»ÑƒÑ‡ÑˆÐµ подходит Ð´Ð»Ñ Ð’Ð°ÑˆÐµÐ³Ð¾ материала. Имейте в виду, что при - иÑпользовании <option>tfields</option> Ð’Ñ‹ + иÑпользовании <option>tfields</option> Ð’Ñ‹ <emphasis role="bold">должны</emphasis> указать как <option>-fps</option>, так и <option>-ofps</option>, уÑтановив им значение, равное удвоенной чаÑтоте иÑходного материала. @@ -2352,8 +2348,8 @@ mencoder dvd://1 -oac copy -vf tfields=2 -ovc lavc \ ЕÑли планируете Ñильно уменьшать размер изображениÑ, можно извлекать и декодировать только одно поле из двух. Конечно, Ð’Ñ‹ потерÑете половину вертикального разрешениÑ, но еÑли планируетÑÑ ÑƒÐ¼ÐµÐ½ÑŒÑˆÐ°Ñ‚ÑŒ размер как минимум - вдвое, Ð¿Ð¾Ñ‚ÐµÑ€Ñ Ð±ÑƒÐ´ÐµÑ‚ не Ñильно заметна. Ð’ результате получитÑÑ Ð¿Ð¾Ñтрочной - развёртки файл Ñ 30000/1001 кадрами в Ñекунду. Процедура ÑледующаÑ: + вдвое, Ð¿Ð¾Ñ‚ÐµÑ€Ñ Ð±ÑƒÐ´ÐµÑ‚ не Ñильно заметна. Ð’ результате получитÑÑ Ð¿Ð¾Ñтрочной + развёртки файл Ñ 30000/1001 кадрами в Ñекунду. Процедура ÑледующаÑ: <option>-vf field</option>, затем обрезание <link linkend="menc-feat-telecine-footnotes">[1]</link> и маÑштабирование ÑоответÑтвующим образом. Помните, что потребуетÑÑ Ñкорректировать маÑштабирование @@ -2403,7 +2399,7 @@ mencoder dvd://1 -oac copy -vf pullup,softskip \ имеет тенденцию к более чаÑтому нахождению ÑоответÑтвий. Какой фильтр будет лучше работать завиÑит от иÑходного видео и личного вкуÑа; не бойтеÑÑŒ ÑкÑпериментировать Ñ Ñ‚Ð¾Ð½ÐºÐ¾Ð¹ наÑтройкой - опций фильтров, еÑли у Ð²Ð°Ñ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ»Ð¸ проблемы Ñ Ð»ÑŽÐ±Ñ‹Ð¼ из них (подробноÑти + опций фильтров, еÑли у Ð’Ð°Ñ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ»Ð¸ проблемы Ñ Ð»ÑŽÐ±Ñ‹Ð¼ из них (подробноÑти Ñмотрите на Ñтранице руководÑтва man). Ð”Ð»Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¸Ð½Ñтва качеÑтвенного иÑходного видео, однако, оба фильтра работают доÑтаточно хорошо, так что начинать работать можно Ñ Ð»ÑŽÐ±Ñ‹Ð¼ из них. @@ -2414,10 +2410,10 @@ mencoder dvd://1 -oac copy -vf filmdint -ovc lavc -ofps 24000/1001<!-- <listitem><para> Более Ñтарый метод заключаетÑÑ Ð½Ðµ в применении обратного телеÑина к телеÑиненным чаÑÑ‚Ñм, а, наоборот, в телеÑине не подверженных телеÑину чаÑтей и - поÑледующем применении обратного телеÑина ко вÑему видео. Звучит запутанно? + поÑледующем применении обратного телеÑина ко вÑему видео. Звучит запутанно? softpulldown — Ñто фильтр, проходÑщий по видео и делающий телеÑиненным веÑÑŒ файл. ЕÑли Ñледом за softpulldown указать либо <option>detc</option>, либо - <option>ivtc</option>, финальный результат будет полноÑтью поÑтрочным. + <option>ivtc</option>, финальный результат будет полноÑтью поÑтрочным. <option>-ofps 24000/1001</option> необходима. <screen> mencoder dvd://1 -oac copy -vf softpulldown,ivtc=1 -ovc lavc -ofps 24000/1001 @@ -2446,23 +2442,23 @@ mencoder dvd://1 -oac copy -vf softpulldown,ivtc=1 -ovc lavc -ofps 24000/1001 </para> <para> - Ðта Ð¾Ð¿Ñ†Ð¸Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð½Ð¾ не должна иÑпользоватьÑÑ, еÑли Ð’Ñ‹ хотите Ñо + Ðта Ð¾Ð¿Ñ†Ð¸Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð½Ð¾ не должна иÑпользоватьÑÑ, еÑли Ð’Ñ‹ хотите Ñо временем отображать видео на череÑÑтрочном уÑтройÑтве (Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ TV карты, например). ЕÑли у Ð’Ð°Ñ ÐµÑÑ‚ÑŒ череÑÑтрочные кадры в видео Ñ 24000/1001 кадрами в Ñекунду, к ним, как и к прогреÑÑивным, будет применен телеÑин. Половина их череÑÑтрочных "кадров" будут отображатьÑÑ Ñ Ð´Ð»Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ñтью трех полей - (3/(60000/1001) Ñекунд), Ð´Ð°Ð²Ð°Ñ Ð² результате неприÑтно выглÑдÑщий Ñффект + (3/(60000/1001) Ñекунд), Ð´Ð°Ð²Ð°Ñ Ð² результате неприÑтно выглÑдÑщий Ñффект <!-- FIXME is translation correct? --> - "прыжка назад во времени". Даже еÑли Ð’Ñ‹ пробуете Ñто, Ð’Ñ‹ + "прыжка назад во времени". Даже еÑли Ð’Ñ‹ пробуете Ñто, Ð’Ñ‹ <emphasis role="bold">должны</emphasis> иÑпользовать фильтр деинтерлейÑинга, такой как <option>lb</option> или <option>l5</option>. </para> <para> Ð”Ð»Ñ Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð½Ð° поÑтрочном диÑплее Ñто тоже может быть плохой идеей. - Будут отбраÑыватьÑÑ Ð¿Ð°Ñ€Ñ‹ поÑледовательных череÑÑтрочных полей, Ð¿Ñ€Ð¸Ð²Ð¾Ð´Ñ Ðº + Будут отбраÑыватьÑÑ Ð¿Ð°Ñ€Ñ‹ поÑледовательных череÑÑтрочных полей, Ð¿Ñ€Ð¸Ð²Ð¾Ð´Ñ Ðº разрывам, которые могут быть заметнее, чем при иÑпользовании второго метода, - отображающего некоторые поÑтрочные кадры дважды. ЧереÑÑтрочное видео Ñ + отображающего некоторые поÑтрочные кадры дважды. ЧереÑÑтрочное видео Ñ 30000/1001 кадрами в Ñекунду уже неÑколько прерывиÑто, потому что в реальноÑти оно должно отображатьÑÑ Ñ 60000/1001 полÑми в Ñекунду, так что дублирующиеÑÑ ÐºÐ°Ð´Ñ€Ñ‹ не так Ñильно выделÑÑŽÑ‚ÑÑ. @@ -2471,7 +2467,7 @@ mencoder dvd://1 -oac copy -vf softpulldown,ivtc=1 -ovc lavc -ofps 24000/1001 <para> Так или иначе, лучше вÑего проанализировать Ваше Ñодержимое и как Ð’Ñ‹ его ÑобираетеÑÑŒ показывать. ЕÑли видео на 90% поÑтрочное и Ð’Ñ‹ никогда не будете - показывать его на TV, Вам Ñледует отдать предпочтение поÑтрочному варианту. + показывать его на TV, Вам Ñледует отдать предпочтение поÑтрочному варианту. ЕÑли оно только наполовину поÑтрочное, Ð’Ñ‹, возможно, захотите кодировать его, как еÑли бы оно было череÑÑтрочным. </para> @@ -2497,13 +2493,13 @@ mencoder dvd://1 -oac copy -vf softpulldown,ivtc=1 -ovc lavc -ofps 24000/1001 <title>Об уÑечении Ñторон:</title> <para> Видеоданные на DVD хранÑÑ‚ÑÑ Ð² формате, называемом YUV 4:2:0. Ð’ YUV - видео, люма ("ÑркоÑÑ‚ÑŒ") и хрома ("цвет") хранÑÑ‚ÑÑ Ð¾Ñ‚Ð´ÐµÐ»ÑŒÐ½Ð¾. - ПоÑкольку человечеÑкий глаз отчаÑти менее чувÑтвителен к цвету, чем к ÑркоÑти, + видео, люма ("ÑркоÑÑ‚ÑŒ") и хрома ("цвет") хранÑÑ‚ÑÑ Ð¾Ñ‚Ð´ÐµÐ»ÑŒÐ½Ð¾. + ПоÑкольку человечеÑкий глаз отчаÑти менее чувÑтвителен к цвету, чем к ÑркоÑти, в YUV 4:2:0 изображении приÑутÑтвует только один цветноÑтный пикÑел на четыре - ÑркоÑтных. Ð’ изображении Ñ Ð¿Ð¾Ñтрочной развёрткой каждый квадрат из четырёх ÑркоÑтных + ÑркоÑтных. Ð’ изображении Ñ Ð¿Ð¾Ñтрочной развёрткой каждый квадрат из четырёх ÑркоÑтных пикÑелов (два на два) имеют один общий цветноÑтный пикÑел. Ð’Ñ‹ должны обрезать поÑтрочный YUV 4:2:0 до чётных размеров и иÑпользовать чётные ÑмещениÑ. - Ðапример, + Ðапример, <option>crop=716:380:2:26</option> — правильно, а <option>crop=716:380:3:26 </option> — нет. </para> @@ -2548,7 +2544,7 @@ mencoder dvd://1 -oac copy -vf softpulldown,ivtc=1 -ovc lavc -ofps 24000/1001 <systemitem class="library">libavcodec</systemitem>, которые значительно увеличивают качеÑтво. Вам вÑегда Ñледует иÑпользовать как минимум Ñти две, за иÑключением ÑлучаÑ, когда Ð¿Ð¾Ñ‚ÐµÑ€Ñ ÑкороÑти ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½ÐµÐ´Ð¾Ð¿ÑƒÑтима - (например, кодирование в реальном времени). ЕÑÑ‚ÑŒ множеÑтво других + (например, кодирование в реальном времени). ЕÑÑ‚ÑŒ множеÑтво других <systemitem class="library">libavcodec</systemitem> опций, улучшающих качеÑтво (и замедлÑющих кодирование), но их опиÑание выходит за рамки Ñтого документа. @@ -2559,12 +2555,12 @@ mencoder dvd://1 -oac copy -vf softpulldown,ivtc=1 -ovc lavc -ofps 24000/1001 <title>О производительноÑти pullup:</title> <para> ИÑпользование <option>pullup</option> (ÑовмеÑтно Ñ <option>softskip</option>) - Ð´Ð»Ñ Ð²Ð¸Ð´ÐµÐ¾ Ñ Ð¿Ð¾Ñтрочной развёрткой вполне безопаÑно и обычно ÑвлÑетÑÑ Ñ…Ð¾Ñ€Ð¾ÑˆÐµÐ¹ + Ð´Ð»Ñ Ð²Ð¸Ð´ÐµÐ¾ Ñ Ð¿Ð¾Ñтрочной развёрткой вполне безопаÑно и обычно ÑвлÑетÑÑ Ñ…Ð¾Ñ€Ð¾ÑˆÐµÐ¹ идеей, еÑли только про иÑточник не извеÑтно доÑтоверно, что он полноÑтью поÑтрочный. ÐŸÐ¾Ñ‚ÐµÑ€Ñ ÑкороÑти мала в большинÑтве Ñлучаев. Ð’ минимальном варианте ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ <option>pullup</option> замедлÑет <application>MEncoder</application> на 50%. Добавление обработки звука и - продвинутых <option>lavcopts</option> опций затмевает Ñту разницу, ÑƒÐ¼ÐµÐ½ÑŒÑˆÐ°Ñ + продвинутых <option>lavcopts</option> опций затмевает Ñту разницу, ÑƒÐ¼ÐµÐ½ÑŒÑˆÐ°Ñ Ð¿Ð°Ð´ÐµÐ½Ð¸Ðµ производительноÑти от иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ <option>pullup</option> до 2%. </para> </formalpara></listitem> @@ -3021,13 +3017,13 @@ mencoder dvd://2 -o title2.avi -oac lavc -lavcopts acodec=ac3 -ovc copy Ð’ идеале, Ð’Ñ‹, наверное, хотели бы иметь возможноÑÑ‚ÑŒ проÑто Ñказать кодировщику переключитьÑÑ Ð½Ð° "выÑокое качеÑтво" и начать кодирование. Ðто было бы замечательно, но, к Ñожалению, трудно реализуемо, поÑкольку -различные опции кодированиÑ, в завиÑимоÑти от иÑходного материала, дают в результате +различные опции кодированиÑ, в завиÑимоÑти от иÑходного материала, дают в результате различное качеÑтво. Так проиÑходит потому, что Ñжатие завиÑит от визуальных ÑвойÑтв видео. Ðапример, аниме и Ð¶Ð¸Ð²Ð°Ñ Ñъемка имеют Ñильно отличающиеÑÑ ÑвойÑтва и, поÑтому, требуют разные опции Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¾Ð¿Ñ‚Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ результата. -Ð¥Ð¾Ñ€Ð¾ÑˆÐ°Ñ Ð½Ð¾Ð²Ð¾ÑÑ‚ÑŒ ÑоÑтоит в том, что некоторые опции, такие как -<option>mbd=2</option>, <option>trell</option> и <option>v4mv</option>, +Ð¥Ð¾Ñ€Ð¾ÑˆÐ°Ñ Ð½Ð¾Ð²Ð¾ÑÑ‚ÑŒ ÑоÑтоит в том, что некоторые опции, такие как +<option>mbd=2</option>, <option>trell</option> и <option>v4mv</option>, никогда не Ñледует опуÑкать. Детальное опиÑание оÑновных опций ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñмотрите ниже. </para> @@ -3039,7 +3035,7 @@ mencoder dvd://2 -o title2.avi -oac lavc -lavcopts acodec=ac3 -ovc copy от фильма. Заметьте, еÑли хотите, чтобы Ваш фильм декодировалÑÑ DivX5, Ð’Ñ‹ должны активировать поддержку закрытых GOP, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¾Ð¿Ñ†Ð¸ÑŽ <option>cgop</option> - <systemitem class="library">libavcodec</systemitem>, но также должны деактивировать + <systemitem class="library">libavcodec</systemitem>, но также должны деактивировать определение Ñцен, что не ÑвлÑетÑÑ Ñ…Ð¾Ñ€Ð¾ÑˆÐµÐ¹ идеей, поÑкольку неÑколько вредит ÑффективноÑти. </para></listitem> @@ -3053,7 +3049,7 @@ mencoder dvd://2 -o title2.avi -oac lavc -lavcopts acodec=ac3 -ovc copy <emphasis role="bold">dia</emphasis>: диапазон поиÑка движениÑ. Большие Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð»ÑƒÑ‡ÑˆÐµ и медленнее. Отрицательные Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ — Ñто Ñовершенно Ð´Ñ€ÑƒÐ³Ð°Ñ ÑˆÐºÐ°Ð»Ð°. - Хорошими значениÑми ÑвлÑÑŽÑ‚ÑÑ -1 Ð´Ð»Ñ Ð±Ñ‹Ñтрого ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ 2-4 — Ð´Ð»Ñ + Хорошими значениÑми ÑвлÑÑŽÑ‚ÑÑ -1 Ð´Ð»Ñ Ð±Ñ‹Ñтрого ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ 2-4 — Ð´Ð»Ñ Ð¼ÐµÐ´Ð»ÐµÐ½Ð½Ð¾Ð³Ð¾. </para></listitem> <listitem><para> @@ -3092,7 +3088,7 @@ mencoder dvd://2 -o title2.avi -oac lavc -lavcopts acodec=ac3 -ovc copy <emphasis role="bold">qns</emphasis>: очень медленно, оÑобенно в комбинации Ñ qprd. Ðта Ð¾Ð¿Ñ†Ð¸Ñ ÑƒÐºÐ°Ð¶ÐµÑ‚ кодировщику минимизировать шум от артефактов ÑÐ¶Ð°Ñ‚Ð¸Ñ Ð²Ð¼ÐµÑто ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð·Ð°ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ð¾Ð³Ð¾ видео, полноÑтью ÑоответÑтвующего иÑходному. - Ðе иÑпользуйте ее, еÑли только не перепробовали наÑтроить вÑе, что было + Ðе иÑпользуйте ее, еÑли только не перепробовали наÑтроить вÑе, что было возможно, а результат вÑе таки недоÑтаточно хорош. </para></listitem> <listitem><para> @@ -3109,8 +3105,8 @@ mencoder dvd://2 -o title2.avi -oac lavc -lavcopts acodec=ac3 -ovc copy Они кодируютÑÑ Ð½ÐµÐ·Ð°Ð²Ð¸Ñимо во вÑех MPEG-похожих алгоритмах. Ð˜Ð´ÐµÑ Ñтих опций заключаетÑÑ Ð² иÑпользованию некоторой хорошей ÑвриÑтики Ð´Ð»Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ‚Ð°, когда Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² блоке ниже указанного Вами порога, и что его - Ñтоит кодировать как "блок без изменений". - Ðто ÑохранÑет биты и, возможно, уÑкорÑет кодирование. + Ñтоит кодировать как "блок без изменений". + Ðто ÑохранÑет биты и, возможно, уÑкорÑет кодирование. vlelim=-4 и vcelim=9 выглÑдÑÑ‚ неплохими Ð´Ð»Ñ Ð¶Ð¸Ð²Ð¾Ð¹ Ñъемки, но, Ñкорее вÑего, не помогут Ð´Ð»Ñ Ð°Ð½Ð¸Ð¼Ðµ; при кодировании анимации Вам, возможно, Ñледует оÑтавить Ñту опцию неизменной. @@ -3164,7 +3160,7 @@ mencoder dvd://2 -o title2.avi -oac lavc -lavcopts acodec=ac3 -ovc copy </para> <para> -Ð’Ñе наÑтройки ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÑлиÑÑŒ на теÑтовом видео 720x448 @30000/1001 fps +Ð’Ñе наÑтройки ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÑлиÑÑŒ на теÑтовом видео 720x448 @30000/1001 fps Ñ Ñ†ÐµÐ»ÐµÐ²Ñ‹Ð¼ битпотоком 900кбит/Ñек, на машине AMD-64 3400+ Ñ 2400 МГц и 64 битном режиме. Ð”Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ наÑтройки ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ñ‹ Ð¸Ð·Ð¼ÐµÑ€ÐµÐ½Ð½Ð°Ñ ÑкороÑÑ‚ÑŒ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ (в кадрах в Ñекунду) и Ð¿Ð¾Ñ‚ÐµÑ€Ñ PSNR (в дБ) по Ñравнению Ñ Ð½Ð°Ñтройкой "очень выÑокое @@ -3292,7 +3288,7 @@ vcodec=mpeg2video:intra_matrix=8,9,12,22,26,27,29,34,9,10,14,26,27,29,34,37,\ <para> Итак, Ð’Ñ‹ только что купили новенькую, блеÑÑ‚Ñщую копию фильма "Гарри Поттер и Ð¢Ð°Ð¹Ð½Ð°Ñ ÐšÐ¾Ð¼Ð½Ð°Ñ‚Ð°" (в широкоÑкранном формате, конечно) и хотите Ñделать рип Ñтого DVD так, -чтобы добавить его к Домашнему кинотеатру на PC. Ðто DVD первого региона, +чтобы добавить его к Домашнему кинотеатру на PC. Ðто DVD первого региона, поÑтому NTSC. Пример ниже также применим и Ð´Ð»Ñ PAL, за иÑключением того, что надо будет опуÑтить <option>-ofps 24000/1001</option> (поÑкольку чаÑтота кадров на выходе Ñ‚Ð°ÐºÐ°Ñ Ð¶Ðµ, как и на входе), и, конечно, границы Ð¾Ð±Ñ€ÐµÐ·Ð°Ð½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ @@ -3308,17 +3304,17 @@ vcodec=mpeg2video:intra_matrix=8,9,12,22,26,27,29,34,9,10,14,26,27,29,34,37,\ </para> <para id="menc-feat-dvd-mpeg4-example-crop"> -Далее, мы хотим определить верные границы обрезаниÑ, поÑтому иÑпользуем фильтр +Далее, мы хотим определить верные границы обрезаниÑ, поÑтому иÑпользуем фильтр cropdetect: <screen>mplayer dvd://1 -vf cropdetect</screen> УбедитеÑÑŒ, что перемеÑтилиÑÑŒ к полноÑтью заполненному кадру (например, -к Ñветлой Ñцене поÑле пропущенных начальных титров и логотипов), +к Ñветлой Ñцене поÑле пропущенных начальных титров и логотипов), Ð’Ñ‹ должны увидеть в конÑоли <application>MPlayer</application>: <screen>crop area: X: 0..719 Y: 57..419 (-vf crop=720:362:0:58)</screen> Затем Ñнова воÑпроизводим фильм Ñ Ñтим фильтром Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ его корректноÑти: <screen>mplayer dvd://1 -vf crop=720:362:0:58</screen> И убеждаемÑÑ, что вÑе выглÑдит прекраÑно. Далее, проверÑем, что ширина и выÑота -делÑÑ‚ÑÑ Ð½Ð° 16. С шириной вÑе в порÑдке, а Ñ Ð²Ñ‹Ñотой — нет. +делÑÑ‚ÑÑ Ð½Ð° 16. С шириной вÑе в порÑдке, а Ñ Ð²Ñ‹Ñотой — нет. ПоÑкольку мы не заваливали математику в 7-ом клаÑÑе, то знаем, что ближайшее целое, меньшее 362 и кратное 16, равно 352. </para> @@ -3342,7 +3338,7 @@ cropdetect: <para> ЕÑли Ð’Ð°Ñ Ð´ÐµÐ¹Ñтвительно заботит Ð¿Ð¾Ñ‚ÐµÑ€Ñ Ñтих 10 пикÑелов, Ð’Ñ‹ можете -вмеÑто Ñтого отмаÑштабировать фильм, уменьшив размерноÑти до ближайших +вмеÑто Ñтого отмаÑштабировать фильм, уменьшив размерноÑти до ближайших кратных 16 значений. Цепочка фильтров будет выглÑдеть примерно так: <screen>-vf crop=720:362:0:58,scale=720:352</screen> @@ -3379,23 +3375,23 @@ mencoder dvd://1 -ofps 24000/1001 -oac copy -o <replaceable>Harry_Potter_2.avi</ <para> Опции <option>v4mv:mbd=2:trell</option> значительно улучшат качеÑтво ценой времени кодированиÑ. Ðет никаких оÑнований отключать Ñти -опции, когда главным критерием ÑвлÑетÑÑ ÐºÐ°Ñ‡ÐµÑтво. Опции +опции, когда главным критерием ÑвлÑетÑÑ ÐºÐ°Ñ‡ÐµÑтво. Опции <option>cmp=3:subcmp=3</option> выбирают функцию ÑравнениÑ, дающую лучшее качеÑтво, чем ÑтандартнаÑ. Ð’Ñ‹ можете поÑкÑпериментировать Ñ Ñтим параметром (возможные Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ñмотрите на man Ñтранице), поÑкольку разные функции могут давать разный прироÑÑ‚ в качеÑтве в завиÑимоÑти от иÑходного материала. Ðапример, еÑли Ð’Ñ‹ замечаете, что <systemitem class="library">libavcodec</systemitem> производит Ñлишком много блочных артефактов (квадратиков), то можете попытатьÑÑ -выбрать ÑкÑпериментальный NSSE в качеÑтве функции ÑÑ€Ð°Ð²Ð½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ помощи опции +выбрать ÑкÑпериментальный NSSE в качеÑтве функции ÑÑ€Ð°Ð²Ð½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ помощи опции <option>*cmp=10</option>. </para> <para> Ð”Ð»Ñ Ñтого фильма полученный AVI будет 138 минут длинной и размером около 3Гб. И, поÑкольку Ð’Ñ‹ Ñказали, что размер файла Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð½Ðµ имеет, Ñто вполне -приемлемый результат. Однако, еÑли вÑе-таки хотите получить меньший размер файла, -можете попробовать уменьшить битпоток. Увеличение битпотока имеет ÑнижающийÑÑ Ñффект, -поÑтому, Ñ…Ð¾Ñ‚Ñ Ð¼Ñ‹ можем ÑÑно видеть улучшение от 1800Кбит/Ñек до 2000Кбит/Ñек, оно +приемлемый результат. Однако, еÑли вÑе-таки хотите получить меньший размер файла, +можете попробовать уменьшить битпоток. Увеличение битпотока имеет ÑнижающийÑÑ Ñффект, +поÑтому, Ñ…Ð¾Ñ‚Ñ Ð¼Ñ‹ можем ÑÑно видеть улучшение от 1800Кбит/Ñек до 2000Кбит/Ñек, оно может быть не Ñтоль заметно выше 2000Кбит/Ñек. </para> @@ -3406,7 +3402,7 @@ mencoder dvd://1 -ofps 24000/1001 -oac copy -o <replaceable>Harry_Potter_2.avi</ улучшит воÑпринимаемое качеÑтво и поможет избежать блочных артефактов в видео. Опцией <option>autoq</option> <application>MPlayer</application>'а Ð’Ñ‹ можете изменÑÑ‚ÑŒ величину производимой фильтром spp поÑтобработки в завиÑимоÑти от -доÑтупных реÑурÑов CPU. Вдобавок, на Ñтом Ñтапе Ð’Ñ‹ можете захотеть применить +доÑтупных реÑурÑов CPU. Вдобавок, на Ñтом Ñтапе Ð’Ñ‹ можете захотеть применить коррекцию гаммы и/или цвета Ð´Ð»Ñ Ð»ÑƒÑ‡ÑˆÐµÐ³Ð¾ ÑоответÑÑ‚Ð²Ð¸Ñ Ð’Ð°ÑˆÐµÐ¼Ñƒ монитору. Ðапример: <screen> mplayer <replaceable>Harry_Potter_2.avi</replaceable> -vf spp,noise=9ah:5ah,eq2=1.2 -autoq 3 @@ -3432,7 +3428,7 @@ mplayer <replaceable>Harry_Potter_2.avi</replaceable> -vf spp,noise=9ah:5ah,eq2= <para> Ðто руководÑтво в оÑновном нацелено на оÑобенноÑти Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ‚ÐµÑ… же методов, что опиÑаны в руководÑтве по кодированию Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ x264. -ПоÑтому, Ñначала прочтите, пожалуйÑта, +ПоÑтому, Ñначала прочтите, пожалуйÑта, <link linkend="menc-feat-x264-encoding-options-intro">первую чаÑÑ‚ÑŒ</link> того руководÑтва. </para> @@ -3443,7 +3439,7 @@ mplayer <replaceable>Harry_Potter_2.avi</replaceable> -vf spp,noise=9ah:5ah,eq2= <title>Какие опции Ñледует иÑпользовать Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð»ÑƒÑ‡ÑˆÐ¸Ñ… результатов?</title> <para> -ПожалуйÑта, начните Ñ Ð¿Ñ€Ð¾Ñмотра раздела +ПожалуйÑта, начните Ñ Ð¿Ñ€Ð¾Ñмотра раздела <systemitem class="library">Xvid</systemitem> man Ñтраницы <application>MPlayer</application>. Ðтот раздел предполагаетÑÑ ÐºÐ°Ðº дополнение к man Ñтранице. @@ -3497,24 +3493,24 @@ mplayer <replaceable>Harry_Potter_2.avi</replaceable> -vf spp,noise=9ah:5ah,eq2= УправлÑет чувÑтвительноÑтью кодировщика к B-кадрам, где большие Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ð²Ð¾Ð´ÑÑ‚ к иÑпользованию большего количеÑтва B-кадров (и наоборот). ÐžÐ¿Ñ†Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° иÑпользоватьÑÑ ÑовмеÑтно Ñ <option>max_bframes</option>; - еÑли Ð’Ñ‹ ÑтеÑнены величиной битпотока, то должны увеличить и + еÑли Ð’Ñ‹ ÑтеÑнены величиной битпотока, то должны увеличить и <option>max_bframes</option>, и <option>bf_threshold</option>, в том Ð²Ñ€ÐµÐ¼Ñ ÐºÐ°Ðº увеличение <option>max_bframes</option> и уменьшение <option>bf_threshold</option> позволÑÑ‚ кодировщику иÑпользовать больше B-кадров в меÑтах, где Ñто <emphasis role="bold">дейÑтвительно</emphasis> необходимо. - Ðизкое количеÑтво <option>max_bframes</option> и выÑокое значение + Ðизкое количеÑтво <option>max_bframes</option> и выÑокое значение <option>bf_threshold</option> — Ñто, возможно, не Ñамое мудрое решение, поÑкольку оно принудит кодировщик размещать B-кадры в меÑтах, которые никак не выиграют от Ñтого, тем Ñамым ÑƒÑ…ÑƒÐ´ÑˆÐ°Ñ Ð²Ð¸Ð·ÑƒÐ°Ð»ÑŒÐ½Ð¾Ðµ качеÑтво. Однако, еÑли Вам требуетÑÑ ÑовмеÑтимоÑÑ‚ÑŒ Ñ Ð°Ð¿Ð¿Ð°Ñ€Ð°Ñ‚Ð½Ñ‹Ð¼Ð¸ проигрывателÑми, поддерживающими только Ñтарые DivX профили (которые - поддерживают только 1 поÑледовательный B-кадр), Ñто единÑтвенный ÑпоÑоб + поддерживают только 1 поÑледовательный B-кадр), Ñто единÑтвенный ÑпоÑоб увеличить ÑжимаемоÑÑ‚ÑŒ при помощи B-кадров. </para></listitem> <listitem><para> <emphasis role="bold">trellis</emphasis> - Оптимизирует процеÑÑ ÐºÐ²Ð°Ð½Ñ‚Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¾Ð¿Ñ‚Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ + Оптимизирует процеÑÑ ÐºÐ²Ð°Ð½Ñ‚Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¾Ð¿Ñ‚Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ ÑÐ¾Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñƒ PSNR и битпотоком, что позволÑет ÑущеÑтвенно Ñкономить биты. Ðти биты впоÑледÑтвии будут потрачены на другие чаÑти видео, что приведет к увеличению общего качеÑтва. @@ -3570,10 +3566,10 @@ mplayer <replaceable>Harry_Potter_2.avi</replaceable> -vf spp,noise=9ah:5ah,eq2= </para></listitem> <listitem><para> <emphasis role="bold">lumi_mask</emphasis> - ПытаетÑÑ Ð¾Ñ‚Ð´Ð°Ñ‚ÑŒ меньший битпоток облаÑÑ‚Ñм изображениÑ, которые + ПытаетÑÑ Ð¾Ñ‚Ð´Ð°Ñ‚ÑŒ меньший битпоток облаÑÑ‚Ñм изображениÑ, которые человечеÑкий глаз не в ÑоÑтоÑнии увидеть доÑтаточно хорошо, что - позволит кодировщику потратить ÑÑкономленные биты на более важные - чаÑти картинки. КачеÑтво закодированного материала, привнеÑенное Ñтой + позволит кодировщику потратить ÑÑкономленные биты на более важные + чаÑти картинки. КачеÑтво закодированного материала, привнеÑенное Ñтой опцией, Ñильно завиÑит от личных предпочтений и от типа и наÑтроек монитора, иÑпользовавшегоÑÑ Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра (обычно результат выглÑдит не очень хорошо, еÑли он Ñркий, или ÑвлÑетÑÑ TFT монитором). @@ -3581,7 +3577,7 @@ mplayer <replaceable>Harry_Potter_2.avi</replaceable> -vf spp,noise=9ah:5ah,eq2= <listitem> <para> <emphasis role="bold">qpel</emphasis> - Увеличивает количеÑтво предполагаемых векторов движениÑ, путём Ð¿Ð¾Ð²Ñ‹ÑˆÐµÐ½Ð¸Ñ + Увеличивает количеÑтво предполагаемых векторов движениÑ, путём Ð¿Ð¾Ð²Ñ‹ÑˆÐµÐ½Ð¸Ñ Ñ‚Ð¾Ñ‡Ð½Ð¾Ñти оценки Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ Ñ Ð¿Ð¾Ð»ÑƒÐ¿Ð¸ÐºÑельной до четвертьпикÑельной. Ð˜Ð´ÐµÑ ÑоÑтоит в том, чтобы найти лучшие векторы движениÑ, которые взамен уменьшат битпоток (тем Ñамым ÑƒÐ²ÐµÐ»Ð¸Ñ‡Ð¸Ð²Ð°Ñ ÐºÐ°Ñ‡ÐµÑтво). @@ -3590,11 +3586,11 @@ mplayer <replaceable>Harry_Potter_2.avi</replaceable> -vf spp,noise=9ah:5ah,eq2= дают (значительно) лучшие результаты. ДоÑтаточно чаÑто кодек тратит дополнительные биты на повышенную точноÑÑ‚ÑŒ впуÑтую, а взамен получает или вообще ничего, или небольшое увеличение качеÑтва. - К Ñожалению, нет ÑпоÑоба предÑказать возможные ÑƒÐ»ÑƒÑ‡ÑˆÐµÐ½Ð¸Ñ Ð¾Ñ‚ <option>qpel</option>, + К Ñожалению, нет ÑпоÑоба предÑказать возможные ÑƒÐ»ÑƒÑ‡ÑˆÐµÐ½Ð¸Ñ Ð¾Ñ‚ <option>qpel</option>, так что Вам придетÑÑ Ñделать кодирование Ñ Ð½ÐµÐ¹ и без нее, чтобы знать навернÑка. </para> - + <para> <option>qpel</option> может почти удвоить Ð²Ñ€ÐµÐ¼Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ требует, как минимум, на 25% большей мощноÑти при декодировании. @@ -3606,7 +3602,7 @@ mplayer <replaceable>Harry_Potter_2.avi</replaceable> -vf spp,noise=9ah:5ah,eq2= ПытаетÑÑ ÑÑкономить биты в панорамных Ñценах, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¾Ð´Ð¸Ð½ вектор Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð²Ñего кадра. Ðто почти вÑегда увеличивает PSNR, но заметно замедлÑет кодирование (так же как и декодирование). - ПоÑтому Ð’Ð°Ñ Ñледует иÑпользовать ее, только когда Ð’Ñ‹ включили + ПоÑтому Ð’Ð°Ñ Ñледует иÑпользовать ее, только когда Ð’Ñ‹ включили <option>vhq</option> на макÑимум. GMC <systemitem class="library">Xvid</systemitem>'а ÑвлÑетÑÑ Ð±Ð¾Ð»ÐµÐµ Ñложным, чем у DivX'а, но поддерживаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ некоторыми аппаратными проигрывателÑми. @@ -3902,7 +3898,7 @@ Xvid поддерживает профили ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‡ÐµÑ€ÐµÐ· Ð </para> <para> -Ð’Ñе наÑтройки ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÑлиÑÑŒ на теÑтовом видео 720x448 @30000/1001 fps +Ð’Ñе наÑтройки ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÑлиÑÑŒ на теÑтовом видео 720x448 @30000/1001 fps Ñ Ñ†ÐµÐ»ÐµÐ²Ñ‹Ð¼ битпотоком 900кбит/Ñек, на машине AMD-64 3400+ Ñ 2400 МГц и 64 битном режиме. Ð”Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ наÑтройки ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ñ‹ Ð¸Ð·Ð¼ÐµÑ€ÐµÐ½Ð½Ð°Ñ ÑкороÑÑ‚ÑŒ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ (в кадрах в Ñекунду) и Ð¿Ð¾Ñ‚ÐµÑ€Ñ PSNR (в дБ) по Ñравнению Ñ Ð½Ð°Ñтройкой "очень выÑокое @@ -3913,7 +3909,7 @@ Xvid поддерживает профили ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‡ÐµÑ€ÐµÐ· Ð <informaltable frame="all"> <tgroup cols="4"> <thead> -<row><entry>ОпиÑание</entry><entry>Опции кодированиÑ</entry><entry>ÑкороÑÑ‚ÑŒ +<row><entry>ОпиÑание</entry><entry>Опции кодированиÑ</entry><entry>ÑкороÑÑ‚ÑŒ (в fps)</entry><entry>ОтноÑÐ¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¿Ð¾Ñ‚ÐµÑ€Ñ PSNR (в дБ)</entry></row> </thead> <tbody> @@ -3966,8 +3962,8 @@ Xvid поддерживает профили ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‡ÐµÑ€ÐµÐ· Ð <title>Опции ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ x264</title> <para> -Ðачните, пожалуйÑта Ñ Ð¿Ñ€Ð¾Ñмотра раздела -<systemitem class="library">x264</systemitem> +Ðачните, пожалуйÑта Ñ Ð¿Ñ€Ð¾Ñмотра раздела +<systemitem class="library">x264</systemitem> man Ñтраницы <application>MPlayer</application>'а. Ðтот раздел предполагаетÑÑ Ð±Ñ‹Ñ‚ÑŒ дополнением к Ñтранице man. ЗдеÑÑŒ Ð’Ñ‹ найдете быÑтрые подÑказки о том, какие опции чаще вÑего интереÑуют @@ -3998,7 +3994,7 @@ man Ñтраницы <application>MPlayer</application>'а. целей. Решение Ð´Ð»Ñ Ð¿ÐµÑ€Ð²Ð¾Ð³Ð¾ клаÑÑа опций очень проÑтое: надо только определить, Ñчитаете ли Ð’Ñ‹, что разница в качеÑтве оправдывает разницу в ÑкороÑти. Ð”Ð»Ñ Ð²Ñ‚Ð¾Ñ€Ð¾Ð³Ð¾ клаÑÑа опций Ð¿Ñ€ÐµÐ´Ð¿Ð¾Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑƒÑ‚ быть значительно более -Ñубъективными и завиÑеть от большего чиÑла факторов. +Ñубъективными и завиÑеть от большего чиÑла факторов. Имейте в виду, что некоторые из опций категории "пользовательÑких предпочтений и Ñпециальных требований" могут вÑе же иметь большое влиÑние на ÑкороÑÑ‚ÑŒ или качеÑтво, но Ñто не оÑновное их предназначение. @@ -4035,16 +4031,16 @@ man Ñтраницы <application>MPlayer</application>'а. <sect3 id="menc-feat-x264-encoding-options-speedvquality"> -<title>Опции, затрагивающие, в оÑновном, ÑкороÑÑ‚ÑŒ и качеÑтво</title> +<title>Опции, затрагивающие, в оÑновном, ÑкороÑÑ‚ÑŒ и качеÑтво</title> <itemizedlist> <listitem> <para> <emphasis role="bold">subq</emphasis>: - Из вÑех опций, позволÑющих выбирать между ÑкороÑтью и качеÑтвом, + Из вÑех опций, позволÑющих выбирать между ÑкороÑтью и качеÑтвом, <option>subq</option> и <option>frameref</option> (Ñмотрите ниже), пожалуй, Ñамые важные. - ЕÑли Ð’Ñ‹ заинтереÑованы в тонкой наÑтройке либо ÑкороÑти, либо качеÑтва, + ЕÑли Ð’Ñ‹ заинтереÑованы в тонкой наÑтройке либо ÑкороÑти, либо качеÑтва, Ñти две — первое, Ñ Ñ‡ÐµÐ³Ð¾ Вам Ñтоит начать. С точки Ð·Ñ€ÐµÐ½Ð¸Ñ ÑкороÑти, опции <option>frameref</option> и <option>subq</option> очень жеÑтко взаимодейÑтвуют друг Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð¼. @@ -4054,29 +4050,29 @@ man Ñтраницы <application>MPlayer</application>'а. С 6 ÑÑылочными кадрами Ñта величина доÑтигает 60%. Ðффект <option>subq</option> на PSNR выглÑдит довольно поÑтоÑнным, в отличие от количеÑтва ÑÑылочных кадров. - Как правило, <option>subq=5</option> доÑтигает Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð³Ð»Ð¾Ð±Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ PSNR + Как правило, <option>subq=5</option> доÑтигает Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð³Ð»Ð¾Ð±Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ PSNR на 0.2-0.5 дБ большего, чем при <option>subq=1</option>. Обычно Ñтого доÑтаточно, чтобы заметить. </para> - + <para> <option>subq=6</option> — медленнее и дает лучшее качеÑтво при разумной цене. ЕÑли Ñравнивать Ñ <option>subq=5</option>, он обычно дает на 0.1-0.4 дБ больший глобальный PSNR ценой потери 25%-100% ÑкороÑти. - Ð’ отличие от оÑтальных уровней <option>subq</option>, поведение + Ð’ отличие от оÑтальных уровней <option>subq</option>, поведение <option>subq=6</option> не так Ñильно завиÑит от <option>frameref</option> - и <option>me</option>. ВмеÑто Ñтого, ÑффективноÑÑ‚ÑŒ <option>subq=6</option> + и <option>me</option>. ВмеÑто Ñтого, ÑффективноÑÑ‚ÑŒ <option>subq=6</option> по большей чаÑти завиÑит от количеÑтва иÑпользуемых B-кадров. При обычном иÑпользовании Ñто означает, что <option>subq=6</option> в Ñложных, выÑокодинамичных Ñценах имеет большое влиÑние как на ÑкороÑÑ‚ÑŒ, так и на качеÑтво, но в Ñценах Ñ Ð¼Ð°Ð»Ñ‹Ð¼ количеÑтвах Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð¾Ð½Ð° не имеет такого - Ñффекта. Имейте в виду, что по-прежнему рекомендуетÑÑ Ð²Ñегда уÑтанавливать + Ñффекта. Имейте в виду, что по-прежнему рекомендуетÑÑ Ð²Ñегда уÑтанавливать <option>bframes</option> в значение, отличное от Ð½ÑƒÐ»Ñ (Ñмотрите далее). </para> <para> <option>subq=7</option> — Ñамый медленный режим Ñ Ð½Ð°Ð¸Ð»ÑƒÑ‡ÑˆÐ¸Ð¼ качеÑтвом. - По Ñравнению Ñ <option>subq=6</option> он, обычно, улучшает общий PSNR на + По Ñравнению Ñ <option>subq=6</option> он, обычно, улучшает общий PSNR на 0.01-0.05 дБ ценой потери 15%-30% ÑкороÑти. ПоÑкольку Ñоотношение качеÑтва и времени ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¾Ñ‡ÐµÐ½ÑŒ невелико, Вам Ñледует иÑпользовать Ñтот режим, только еÑли боретеÑÑŒ за каждый бит, и Ð²Ñ€ÐµÐ¼Ñ @@ -4095,14 +4091,14 @@ man Ñтраницы <application>MPlayer</application>'а. <option>frameref=3</option> медленнее примерно на 15%, чем <option>frameref=1</option>. К Ñожалению, улучшение очень быÑтро Ñходит на нет. - От <option>frameref=6</option> можно ожидать прироÑта PSNR лишь на + От <option>frameref=6</option> можно ожидать прироÑта PSNR лишь на 0.05-0.1 дБ по Ñравнению Ñ <option>frameref=3</option> Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ потерей 15% ÑкороÑти. - Выше <option>frameref=6</option> качеÑтво обычно увеличиваетÑÑ Ð¾Ñ‡ÐµÐ½ÑŒ незначительно + Выше <option>frameref=6</option> качеÑтво обычно увеличиваетÑÑ Ð¾Ñ‡ÐµÐ½ÑŒ незначительно (Ñ…Ð¾Ñ‚Ñ Ð½Ð° вÑем протÑжении Ñтой диÑкуÑÑии Вам Ñледует иметь в виду, оно может значительно изменÑÑ‚ÑŒÑÑ Ð² завиÑимоÑти от иÑходного материала). - Ð’ довольно типичном Ñлучае <option>frameref=12</option> улучшит глобальный - PSNR вÑего на 0.02дБ по Ñравнению Ñ <option>frameref=6</option>, + Ð’ довольно типичном Ñлучае <option>frameref=12</option> улучшит глобальный + PSNR вÑего на 0.02дБ по Ñравнению Ñ <option>frameref=6</option>, ценой 15%-20% ÑкороÑти. При таких выÑоких значениÑÑ… <option>frameref</option>, единÑÑ‚Ð²ÐµÐ½Ð½Ð°Ñ Ð´ÐµÐ¹Ñтвительно Ñ…Ð¾Ñ€Ð¾ÑˆÐ°Ñ Ð²ÐµÑˆÑŒ, о которой может быть Ñказано, ÑоÑтоит в том, что @@ -4112,11 +4108,11 @@ man Ñтраницы <application>MPlayer</application>'а. </para> <note><title>Замечание:</title> <para> - Увеличение <option>frameref</option> до чрезмерно выÑоких значений + Увеличение <option>frameref</option> до чрезмерно выÑоких значений <emphasis role="bold">может</emphasis> и <emphasis role="bold">обычно наноÑит</emphasis> вред ÑффективноÑти кодированиÑ, еÑли CABAC отключен. - С задейÑтвованным CABAC (наÑтройка по умолчанию), возможноÑÑ‚ÑŒ уÑтановки + С задейÑтвованным CABAC (наÑтройка по умолчанию), возможноÑÑ‚ÑŒ уÑтановки <option>frameref</option> "Ñлишком выÑоким" на данный момент выглÑдит Ñлишком далекой, чтобы об Ñтом беÑпокоитьÑÑ, а в будущем оптимизации могут вообще убрать такую возможноÑÑ‚ÑŒ. @@ -4127,17 +4123,17 @@ man Ñтраницы <application>MPlayer</application>'а. затем увеличить их во втором. Обычно, Ñто обладает ничтожным отрицательным Ñффектом на конечное качеÑтво: Ð’Ñ‹, возможно, потерÑете вплоть до 0.1дБ PSNR, что должно быть Ñлишком малой разницей, чтобы её заметить. - Однако, различные Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ <option>frameref</option> могут + Однако, различные Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ <option>frameref</option> могут иногда повлиÑÑ‚ÑŒ на решение о выборе типа кадра. Скорее вÑего, Ñто довольно редкие крайние Ñлучаи, но еÑли Ð’Ñ‹ хотите быть точно уверенными, поÑмотрите, Ñодержит ли Ваше видео полноÑкранные <!-- FIXME is translation correct? --> периодичеÑки вÑпыхивающие Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ очень большие паузы, которые могут Ñтать причиной принудительной вÑтавки I-кадра. - ÐаÑтройте <option>frameref</option> в первом проходе так, чтобы + ÐаÑтройте <option>frameref</option> в первом проходе так, чтобы она была доÑтаточно большой Ð´Ð»Ñ ÑÐ¾Ð´ÐµÑ€Ð¶Ð°Ð½Ð¸Ñ Ð´Ð»Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ñти цикла вÑÐ¿Ñ‹Ñ…Ð¸Ð²Ð°Ð½Ð¸Ñ (или паузы). - Ðапример, еÑли Ñцены вÑпыхивают и гаÑнут между Ð´Ð²ÑƒÐ¼Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñми в течении + Ðапример, еÑли Ñцены вÑпыхивают и гаÑнут между Ð´Ð²ÑƒÐ¼Ñ Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñми в течении трёх кадров, уÑтановите <option>frameref</option> равным 3 или выше. Ðта проблема, возможно, очень редко поÑвлÑетÑÑ Ð´Ð»Ñ Ð¶Ð¸Ð²Ð¾Ð¹ Ñъемки, но она иногда возникает при запиÑи видео игр. @@ -4149,11 +4145,11 @@ man Ñтраницы <application>MPlayer</application>'а. Ðта Ð¾Ð¿Ñ†Ð¸Ñ Ð¸ÑпользуетÑÑ Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° метода оценки движениÑ. Изменение Ñтой опции оказывает прÑмое влиÑние на Ñоотношение ÑкороÑÑ‚ÑŒ-качеÑтво. <option>me=dia</option> лишь на неÑколько процентов - быÑтрее, чем поиÑк по умолчанию, ценой не больше 0.1дБ глобального PSNR. + быÑтрее, чем поиÑк по умолчанию, ценой не больше 0.1дБ глобального PSNR. Значение по умолчанию (<option>me=hex</option>) — разумный выбор между ÑкороÑтью и качеÑтвом. <option>me=umh</option> немного, вплоть до 0.1дБ, улучшает - глобальный PSNR, ÑоответÑтвующее падение ÑкороÑти менÑетÑÑ Ð² - завиÑимоÑти от <option>frameref</option>. С выÑокими значениÑми + глобальный PSNR, ÑоответÑтвующее падение ÑкороÑти менÑетÑÑ Ð² + завиÑимоÑти от <option>frameref</option>. С выÑокими значениÑми <option>frameref</option> (например, 12 или около того), <option>me=umh</option> примерно на 40% медленнее, чем наÑтройка по умолчанию <option>me=hex</option>. С <option>frameref=3</option>, падение ÑкороÑти уменьшаетÑÑ Ð´Ð¾ 25%-30%. @@ -4188,7 +4184,7 @@ man Ñтраницы <application>MPlayer</application>'а. <para> С отключенным адаптивным принÑтием Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð¾ B-кадрах (<option>nob_adapt</option> в <option>x264encopts</option>), - оптимальное значение Ñтой опции обычно не превышает + оптимальное значение Ñтой опции обычно не превышает <option>bframes=1</option>, иначе могут поÑтрадать выÑокодинамичные Ñцены. С включенным адаптивным принÑтием Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð¾ B-кадрах (поведение по умолчанию), можно безопаÑно иÑпользовать более выÑокие значениÑ; кодировщик уменьшит @@ -4204,7 +4200,7 @@ man Ñтраницы <application>MPlayer</application>'а. Заметьте: она включена по умолчанию. </para> <para> - Когда Ñта Ð¾Ð¿Ñ†Ð¸Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð°, кодировщик будет иÑпользовать разумно + Когда Ñта Ð¾Ð¿Ñ†Ð¸Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð°, кодировщик будет иÑпользовать разумно быÑтрый процеÑÑ Ð¿Ñ€Ð¸Ð½ÑÑ‚Ð¸Ñ Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÑƒÐ¼ÐµÐ½ÑŒÑˆÐµÐ½Ð¸Ñ ÐºÐ¾Ð»Ð¸Ñ‡ÐµÑтва B-кадров, иÑпользуемых в Ñценах, которые от Ñтого не Ñильно выиграют. Ð’Ñ‹ можете иÑпользовать <option>b_bias</option> Ð´Ð»Ñ Ñ‚Ð¾Ð½ÐºÐ¾Ð¹ наÑтройки того, @@ -4224,7 +4220,7 @@ man Ñтраницы <application>MPlayer</application>'а. Ð’Ñ‹ получите небольшое улучшение качеÑтва без потери в ÑкороÑти, как и говорит man руководÑтво. Имейте в виду, что такое видео не может быть прочитано оÑнованными на - libavcodec декодерами, Ñозданными ранее, чем примерно 5 Марта 2005. + libavcodec декодерами, Ñозданными ранее, чем примерно 5 Марта 2005. </para></listitem> <listitem> <para> @@ -4243,7 +4239,7 @@ man Ñтраницы <application>MPlayer</application>'а. <para> К Ñожалению, текущий алгоритм адаптивного принÑÑ‚Ð¸Ñ Ñ€ÐµÑˆÐµÐ½Ð¸Ð¹ о B-кадрах имеет твердую ÑклонноÑÑ‚ÑŒ к избеганию иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ B-кадров при затуханиÑÑ…. - До тех пор, пока Ñто не изменитÑÑ, хорошей идеей, возможно, будет добавить + До тех пор, пока Ñто не изменитÑÑ, хорошей идеей, возможно, будет добавить <option>nob_adapt</option> к x264encopts, еÑли предполагаете, что Ð·Ð°Ñ‚ÑƒÑ…Ð°Ð½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ давать ÑущеÑтвенный вклад в Вашем конкретном видеоклипе. </para> @@ -4252,8 +4248,8 @@ man Ñтраницы <application>MPlayer</application>'а. <para> <emphasis role="bold">threads</emphasis> Ðта Ð¾Ð¿Ñ†Ð¸Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»Ñет породить потоки Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð»Ð»ÐµÐ»ÑŒÐ½Ð¾Ð³Ð¾ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ð° - неÑкольких CPU. Ð’Ñ‹ можете вручную выбрать количеÑтво Ñоздаваемых потоков или, - что лучше, уÑтановить <option>threads=auto</option> и позволить + неÑкольких CPU. Ð’Ñ‹ можете вручную выбрать количеÑтво Ñоздаваемых потоков или, + что лучше, уÑтановить <option>threads=auto</option> и позволить <systemitem class="library">x264</systemitem> определить количеÑтво доÑтупных CPU и выбрать ÑоответÑтвующее количеÑтво потоков. ЕÑли у Ð’Ð°Ñ Ð¼Ð½Ð¾Ð³Ð¾Ð¿Ñ€Ð¾Ñ†ÐµÑÑÐ¾Ñ€Ð½Ð°Ñ Ð¼Ð°ÑˆÐ¸Ð½Ð°, Вам Ñледует вÑерьез задуматьÑÑ Ð¾Ð± @@ -4295,11 +4291,11 @@ man Ñтраницы <application>MPlayer</application>'а. Во-первых, оно уÑтановит битпоток в 1400 кбит/Ñек Ð´Ð»Ñ Ð¾Ð±ÐµÐ¸Ñ… чаÑтей. ÐŸÐµÑ€Ð²Ð°Ñ Ñ‡Ð°ÑÑ‚ÑŒ может оказатьÑÑ Ñ‡Ñ€ÐµÐ·Ð¼ÐµÑ€Ð½Ð¾ квантованной, что приведет к недопуÑтимо выглÑдÑщему и неоправданно блочному изображению. Ð’Ñ‚Ð¾Ñ€Ð°Ñ Ñ‡Ð°ÑÑ‚ÑŒ будет - ÑущеÑтвенно недоÑтаточно квантованной; она может выглÑдеть отлично, но цена + ÑущеÑтвенно недоÑтаточно квантованной; она может выглÑдеть отлично, но цена битпотока Ð´Ð»Ñ Ñтого качеÑтва будет полноÑтью неоправданной. Чего намного труднее избежать, так Ñто проблемы перехода между Ð´Ð²ÑƒÐ¼Ñ Ñценами. Ð’ первых Ñекундах малодинамичной чаÑти квантователь будет чрезвычайно - превышен, потому что управление битпотоком вÑе еще ожидает вÑтретить такие же + превышен, потому что управление битпотоком вÑе еще ожидает вÑтретить такие же Ñ‚Ñ€ÐµÐ±Ð¾Ð²Ð°Ð½Ð¸Ñ Ðº битпотоку как и в первой чаÑти. Ðтот "ошибочный период" Ñ Ñ‡Ñ€ÐµÐ·Ð²Ñ‹Ñ‡Ð°Ð¹Ð½Ð¾ превышенным квантованием будет выглÑдеть раздражающе неприÑтно и иÑпользовать на Ñамом деле меньше, чем 300 кбит/Ñек, требуемых ему Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, @@ -4309,7 +4305,7 @@ man Ñтраницы <application>MPlayer</application>'а. </para> <para> Многопроходное кодирование может предложить огромные преимущеÑтва по Ñравнению - Ñ Ð¾Ð´Ð½Ð¾Ð¿Ñ€Ð¾Ñ…Ð¾Ð´Ð½Ñ‹Ð¼. ИÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ ÑтатиÑтику, Ñобранную при первом проходе, + Ñ Ð¾Ð´Ð½Ð¾Ð¿Ñ€Ð¾Ñ…Ð¾Ð´Ð½Ñ‹Ð¼. ИÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ ÑтатиÑтику, Ñобранную при первом проходе, кодировщик может оценить, Ñ Ñ€Ð°Ð·ÑƒÐ¼Ð½Ð¾Ð¹ точноÑтью, "ÑтоимоÑÑ‚ÑŒ" (в битах) ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð»ÑŽÐ±Ð¾Ð³Ð¾ заданного кадра при любом заданном квантователе. Ðто делает возможным намного более рациональное, лучше Ñпланированное @@ -4335,7 +4331,7 @@ man Ñтраницы <application>MPlayer</application>'а. x264 предоÑтавлÑет возможноÑÑ‚ÑŒ делать желаемое количеÑтво поÑледовательных проходов. ЕÑли Ð’Ñ‹ указали <option>pass=1</option> при первом проходе, иÑпользуйте затем <option>pass=3</option> в поÑледующем проходе, Ñтот проход - будет одновременно читать ÑтатиÑтику предыдущего прохода и запиÑывать Ñвою + будет одновременно читать ÑтатиÑтику предыдущего прохода и запиÑывать Ñвою ÑобÑтвенную. Дополнительный проход, Ñледующий за Ñтим, будет иметь очень хорошую оÑнову Ð´Ð»Ñ Ð¾ÑущеÑÑ‚Ð²Ð»ÐµÐ½Ð¸Ñ Ð¾Ñ‡ÐµÐ½ÑŒ точных предÑказаний размеров кадров при выбранном квантователе. Ðа практике, общее улучшение качеÑтва от иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ @@ -4355,7 +4351,7 @@ man Ñтраницы <application>MPlayer</application>'а. Ñлучай: <option>qcomp=0</option>, предназначен Ð´Ð»Ñ Ð¸Ñтинно поÑтоÑнного битпотока. Обычно Ñто Ñделает выÑокодинамичные Ñцены выглÑдÑщими проÑто ужаÑно, в то Ð²Ñ€ÐµÐ¼Ñ ÐºÐ°Ðº малодинамичные Ñцены будут, возможно, выглÑдеть - абÑолютно великолепно, но при Ñтом будут иÑпользовать во много раз больший + абÑолютно великолепно, но при Ñтом будут иÑпользовать во много раз больший битпоток, чем им необходимо, чтобы выглÑдеть лишь превоÑходно. Ð”Ñ€ÑƒÐ³Ð°Ñ ÐºÑ€Ð°Ð¹Ð½Ð¾ÑÑ‚ÑŒ: <option>qcomp=1</option>, добиваетÑÑ Ð¿Ñ€Ð¸Ð¼ÐµÑ€Ð½Ð¾ одинакового параметра ÐºÐ²Ð°Ð½Ñ‚Ð¾Ð²Ð°Ð½Ð¸Ñ (QP). ПоÑтоÑнный QP не выглÑдит плохо, но большинÑтво @@ -4378,7 +4374,7 @@ man Ñтраницы <application>MPlayer</application>'а. убывающим, вплоть до иÑчезающе малого или даже нулевого). Видео поток по-прежнему будет иметь точки перемещениÑ, пока в нем еÑÑ‚ÑŒ какие-то Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñцен. -</para></listitem> +</para></listitem> <listitem> <para> <emphasis role="bold">deblock</emphasis>: @@ -4457,7 +4453,7 @@ man Ñтраницы <application>MPlayer</application>'а. </para> <para> -Ð’Ñе наÑтройки ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÑлиÑÑŒ на теÑтовом видео 720x448 @30000/1001 fps +Ð’Ñе наÑтройки ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÑлиÑÑŒ на теÑтовом видео 720x448 @30000/1001 fps Ñ Ñ†ÐµÐ»ÐµÐ²Ñ‹Ð¼ битпотоком 900кбит/Ñек, на машине AMD-64 3400+ Ñ 2400 МГц и 64-Ñ… битном режиме. Ð”Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ наÑтройки ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ñ‹ Ð¸Ð·Ð¼ÐµÑ€ÐµÐ½Ð½Ð°Ñ ÑкороÑÑ‚ÑŒ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ (в кадрах в Ñекунду) и Ð¿Ð¾Ñ‚ÐµÑ€Ñ PSNR (в дБ) по Ñравнению Ñ Ð½Ð°Ñтройкой "очень выÑокое @@ -4518,7 +4514,7 @@ Video for Windows предоÑтавлÑет проÑтое кодировани <para> Имейте в виду, что поддержка Ñтой возможноÑти очень ÑкÑÐ¿ÐµÑ€Ð¸Ð¼ÐµÐ½Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ð¸ некоторые кодеки могут не работать корректно. Ðекоторые кодеки могут работать -только в определенных проÑтранÑтвах цветов, попробуйте +только в определенных проÑтранÑтвах цветов, попробуйте <option>-vf format=bgr24</option> и <option>-vf format=yuy2</option>, еÑли кодек выдает ошибку или кодирует неверно. </para> @@ -4661,8 +4657,8 @@ Video for Windows предоÑтавлÑет проÑтое кодировани </tgroup> </informaltable> -Первый Ñтолбец Ñодержит имена кодеков, которые должны указыватьÑÑ Ð¿Ð¾Ñле -параметра <literal>codec</literal>, +Первый Ñтолбец Ñодержит имена кодеков, которые должны указыватьÑÑ Ð¿Ð¾Ñле +параметра <literal>codec</literal>, например: <option>-xvfwopts codec=divx.dll</option> FourCC код, иÑпользуемый каждым кодеком, указан в Ñкобках. </para> @@ -4699,7 +4695,7 @@ mencoder -dvd-device <replaceable>zeiram.iso</replaceable> dvd://7 -o <replaceab <application>Cygwin</application> иÑпользуйте: <screen>gcc vfw2menc.c -o vfw2menc.exe -lwinmm -lole32</screen> -Ð”Ð»Ñ Ñборки в <application>MSVC</application> вам потребуетÑÑ getopt. +Ð”Ð»Ñ Ñборки в <application>MSVC</application> Вам потребуетÑÑ getopt. Getopt можно найти в иÑходном архиве <application>vfw2menc</application>, доÑтупном в: Проект <ulink url="http://oss.netfarm.it/mplayer-win32.php">MPlayer на win32</ulink>. @@ -4715,8 +4711,8 @@ vfw2menc -f VP62 -d vp6vfw.dll -s firstpass.mcf </para> </informalexample> <para> -Пользователи Windows могут иÑпользовать -<option>-xvfwopts codec=vp6vfw.dll:compdata=dialog</option>, +Пользователи Windows могут иÑпользовать +<option>-xvfwopts codec=vp6vfw.dll:compdata=dialog</option>, Ð´Ð»Ñ Ð¿Ð¾ÐºÐ°Ð·Ð° окна наÑтроек кодека перед началом кодированиÑ. </para> </sect2> @@ -4727,7 +4723,7 @@ vfw2menc -f VP62 -d vp6vfw.dll -s firstpass.mcf <sect1 id="menc-feat-quicktime-7"> -<title>ИÑпользование <application>MEncoder</application> +<title>ИÑпользование <application>MEncoder</application> Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑовмеÑтимых Ñ <application>QuickTime</application> файлов</title> @@ -4737,7 +4733,7 @@ vfw2menc -f VP62 -d vp6vfw.dll -s firstpass.mcf файлы?</title> <para> - ЕÑÑ‚ÑŒ неÑколько причин, по которым Ñоздание + ЕÑÑ‚ÑŒ неÑколько причин, по которым Ñоздание <application>QuickTime</application>-ÑовмеÑтимых файлов может быть желательно. </para> @@ -4747,7 +4743,7 @@ vfw2menc -f VP62 -d vp6vfw.dll -s firstpass.mcf результат Вашего ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ð° большинÑтве платформ (Windows, Mac OS X, Unices …). </para></listitem> <listitem><para> - <application>QuickTime</application> + <application>QuickTime</application> позволÑет воÑпользоватьÑÑ Ð¿Ñ€ÐµÐ¸Ð¼ÑƒÑ‰ÐµÑтвами большего чиÑла возможноÑтей аппаратного и программного уÑÐºÐ¾Ñ€ÐµÐ½Ð¸Ñ Ð½Ð° Mac OS X, чем платформо-незавиÑимые плееры наподобие <application>MPlayer</application> или @@ -4757,7 +4753,7 @@ vfw2menc -f VP62 -d vp6vfw.dll -s firstpass.mcf </para></listitem> <listitem><para> <application>QuickTime</application> 7 поддерживает кодек нового Ð¿Ð¾ÐºÐ¾Ð»ÐµÐ½Ð¸Ñ - H.264, который даёт ÑущеÑтвенно лучшее качеÑтво изображениÑ, чем + H.264, который даёт ÑущеÑтвенно лучшее качеÑтво изображениÑ, чем предыдущие Ð¿Ð¾ÐºÐ¾Ð»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð´ÐµÐºÐ¾Ð² (MPEG-2, MPEG-4 …). </para></listitem> </itemizedlist> @@ -4767,11 +4763,11 @@ vfw2menc -f VP62 -d vp6vfw.dll -s firstpass.mcf <title>ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ <application>QuickTime</application> 7</title> <para> - <application>QuickTime</application> 7 поддерживает H.264 видео и - AAC аудио, но не поддерживает их мультиплекÑирование в формат + <application>QuickTime</application> 7 поддерживает H.264 видео и + AAC аудио, но не поддерживает их мультиплекÑирование в формат контейнера AVI. - Однако, Ð’Ñ‹ можете иÑпользовать <application>MEncoder</application> - Ð´Ð»Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ð¸Ð´ÐµÐ¾ и аудио, а потом иÑпользовать внешнюю + Однако, Ð’Ñ‹ можете иÑпользовать <application>MEncoder</application> + Ð´Ð»Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ð¸Ð´ÐµÐ¾ и аудио, а потом иÑпользовать внешнюю программу, такую как <application>mp4creator</application> (чаÑÑ‚ÑŒ <ulink url="http://mpeg4ip.sourceforge.net/">пакета MPEG4I</ulink>) Ð´Ð»Ñ Ñ€ÐµÐ¼ÑƒÐ»ÑŒÑ‚Ð¸Ð¿Ð»ÐµÐºÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ð¸Ð´ÐµÐ¾ и аудио дорожек в контейнер MP4. @@ -4790,15 +4786,15 @@ vfw2menc -f VP62 -d vp6vfw.dll -s firstpass.mcf <listitem><para> <emphasis role="bold">B-кадры</emphasis>: <application>QuickTime</application> 7 поддерживает макÑимум 1 B-кадр, - Ñ‚.е. <option>-x264encopts bframes=1</option>. Ðто означает, что - <option>b_pyramid</option> и <option>weight_b</option> не дадут - Ñффекта, поÑкольку им необходимо, чтобы <option>bframes</option> + Ñ‚.е. <option>-x264encopts bframes=1</option>. Ðто означает, что + <option>b_pyramid</option> и <option>weight_b</option> не дадут + Ñффекта, поÑкольку им необходимо, чтобы <option>bframes</option> было больше 1. </para></listitem> <listitem><para> <emphasis role="bold">Макроблоки</emphasis>: <application>QuickTime</application> 7 не поддерживает 8x8 DCT макроблоки. - Ðта Ð¾Ð¿Ñ†Ð¸Ñ (<option>8x8dct</option>) выключена по умолчанию, так что + Ðта Ð¾Ð¿Ñ†Ð¸Ñ (<option>8x8dct</option>) выключена по умолчанию, так что проÑто удоÑтоверьтеÑÑŒ, что Ñвно её не задали. Ðто также означает, что Ð¾Ð¿Ñ†Ð¸Ñ <option>i8x8</option> будет беÑполезна, Ñ‚.к. ей необходима <option>8x8dct</option>. @@ -4806,7 +4802,7 @@ vfw2menc -f VP62 -d vp6vfw.dll -s firstpass.mcf <listitem><para> <emphasis role="bold">КоÑффициент ÑÐ¾Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ Ñторон</emphasis>: <application>QuickTime</application> 7 не поддерживает информацию - SAR (коÑффициент пропорций пикÑела, sample aspect ratio) + SAR (коÑффициент пропорций пикÑела, sample aspect ratio) в MPEG-4 файлах; он предполагает SAR=1. Прочтите <link linkend="menc-feat-quicktime-7-scale">раздел о маÑштабировании</link> Ð´Ð»Ñ Ð¾Ð±Ñ…Ð¾Ð´Ð° проблемы. @@ -4820,23 +4816,23 @@ vfw2menc -f VP62 -d vp6vfw.dll -s firstpass.mcf <para> Предположим, что Ð’Ñ‹ хотите Ñделать рип Ñвежекупленной копии "Хроник Ðарнии" и Ваш регион DVD 1, что означает, что Ñто NTSC. - Пример ниже будет также применим к PAL, за иÑключением того, что Вам + Пример ниже будет также применим к PAL, за иÑключением того, что Вам нужно будет опуÑтить <option>-ofps 24000/1001</option> и иÑпользовать Ñлегка отличающиеÑÑ Ñ€Ð°Ð·Ð¼ÐµÑ€Ñ‹ Ð´Ð»Ñ <option>crop</option> и <option>scale</option>. </para> <para> - ПоÑле запуÑка <option>mplayer dvd://1</option>, Ð’Ñ‹ Ñледуете процеÑÑу, - опиÑанному в разделе <link linkend="menc-feat-telecine">Как работать - Ñ Ñ‚ÐµÐ»ÐµÑином и череÑÑтрочной развёрткой на NTSC DVD</link> и обнаруживаете, - что Ñто 24000/1001 fps видео Ñ Ð¿Ð¾Ñтрочной развёрткой. Ðто неÑколько - упрощает обработку, поÑкольку Вам не нужно иÑпользовать фильтр - обратного телеÑина, такой как <option>pullup</option>, или фильтр + ПоÑле запуÑка <option>mplayer dvd://1</option>, Ð’Ñ‹ Ñледуете процеÑÑу, + опиÑанному в разделе <link linkend="menc-feat-telecine">Как работать + Ñ Ñ‚ÐµÐ»ÐµÑином и череÑÑтрочной развёрткой на NTSC DVD</link> и обнаруживаете, + что Ñто 24000/1001 fps видео Ñ Ð¿Ð¾Ñтрочной развёрткой. Ðто неÑколько + упрощает обработку, поÑкольку Вам не нужно иÑпользовать фильтр + обратного телеÑина, такой как <option>pullup</option>, или фильтр деинтерлейÑа, такой как <option>yadif</option>. </para> <para> - Затем Вам необходимо уÑечь чёрные полоÑÑ‹ Ñверху и Ñнизу видео, как + Затем Вам необходимо уÑечь чёрные полоÑÑ‹ Ñверху и Ñнизу видео, как опиÑано в <link linkend="menc-feat-dvd-mpeg4-example-crop">Ñтом</link> разделе. </para> @@ -4848,22 +4844,22 @@ vfw2menc -f VP62 -d vp6vfw.dll -s firstpass.mcf <para> Следующий шаг дейÑтвительно душераздирающий. - <application>QuickTime</application> 7 не поддерживает MPEG-4 видео - Ñ ÐºÐ¾Ñффициентом ÑÐ¾Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ Ñторон пикÑела, отличным от 1. Так что Вам - придётÑÑ Ð¼Ð°Ñштабировать видео либо в Ñторону ÑƒÐ²ÐµÐ»Ð¸Ñ‡ÐµÐ½Ð¸Ñ (что впуÑтую - потратит много меÑта на диÑке), либо в Ñтрону ÑƒÐ¼ÐµÐ½ÑŒÑˆÐµÐ½Ð¸Ñ (что приведёт + <application>QuickTime</application> 7 не поддерживает MPEG-4 видео + Ñ ÐºÐ¾Ñффициентом ÑÐ¾Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ Ñторон пикÑела, отличным от 1. Так что Вам + придётÑÑ Ð¼Ð°Ñштабировать видео либо в Ñторону ÑƒÐ²ÐµÐ»Ð¸Ñ‡ÐµÐ½Ð¸Ñ (что впуÑтую + потратит много меÑта на диÑке), либо в Ñтрону ÑƒÐ¼ÐµÐ½ÑŒÑˆÐµÐ½Ð¸Ñ (что приведёт к потере некоторых деталей иÑточника) Ð´Ð»Ñ ÐºÐ²Ð°Ð´Ñ€Ð°Ñ‚Ð¸Ð·Ð°Ñ†Ð¸Ð¸ пикÑелов. - Какой бы ÑпоÑоб Ð’Ñ‹ не выбрали, Ñто будет крайне неÑффективным, но + Какой бы ÑпоÑоб Ð’Ñ‹ не выбрали, Ñто будет крайне неÑффективным, но не может быть опущено, еÑли Ð’Ñ‹ хотите, чтоб Ваше видео воÑпроизводилоÑÑŒ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ <application>QuickTime</application> 7. - <application>MEncoder</application> может применить необходимое + <application>MEncoder</application> может применить необходимое увеличивающее или уменьшающее маÑштабирование, еÑли ему указать <option>-vf scale=-10:-1</option> или <option>-vf scale=-1:-10</option> ÑоответÑтвенно. - Ðто отмаÑштабирует Ваше видео до корректной ширины Ð´Ð»Ñ ÑƒÑечённой - выÑоты, округлённой до ближайшего Ð¼Ð½Ð¾Ð¶Ð¸Ñ‚ÐµÐ»Ñ 16 Ð´Ð»Ñ Ð¾Ð¿Ñ‚Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ + Ðто отмаÑштабирует Ваше видео до корректной ширины Ð´Ð»Ñ ÑƒÑечённой + выÑоты, округлённой до ближайшего Ð¼Ð½Ð¾Ð¶Ð¸Ñ‚ÐµÐ»Ñ 16 Ð´Ð»Ñ Ð¾Ð¿Ñ‚Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ ÑжатиÑ. - Помните, что еÑли производите обрезание, то нужно Ñперва обрезать, а лишь затем + Помните, что еÑли производите обрезание, то нужно Ñперва обрезать, а лишь затем маÑштабировать: <screen>-vf crop=720:352:0:62,scale=-10:-1</screen> @@ -4876,12 +4872,12 @@ vfw2menc -f VP62 -d vp6vfw.dll -s firstpass.mcf <para> ПоÑкольку Ð’Ñ‹ будете мультиплекÑировать в другой контейнер, Ð’Ñ‹ должны - вÑегда иÑпользовать опцию <option>harddup</option>, чтобы убедитьÑÑ, + вÑегда иÑпользовать опцию <option>harddup</option>, чтобы убедитьÑÑ, что дублирующиеÑÑ ÐºÐ°Ð´Ñ€Ñ‹ будут дейÑтвительно дублироватьÑÑ Ð² полученном видео. Без Ñтой опции <application>MEncoder</application> будет проÑто раÑполагать маркер в видеопотоке о том, что кадр был повторен, и будет - полагатьÑÑ Ð½Ð° то, что клиентÑкое программное обеÑпечение покажет кадр - дважды. К Ñожалению, Ñто "мÑгкое дублирование" не переживает + полагатьÑÑ Ð½Ð° то, что клиентÑкое программное обеÑпечение покажет кадр + дважды. К Ñожалению, Ñто "мÑгкое дублирование" не переживает ремультиплекÑирование, в результате чего аудио будет поÑтепенно терÑÑ‚ÑŒ Ñинхронизацию Ñ Ð²Ð¸Ð´ÐµÐ¾. </para> @@ -4897,15 +4893,15 @@ vfw2menc -f VP62 -d vp6vfw.dll -s firstpass.mcf <title>Битпоток</title> <para> - Как обычно, выбор битпотока завиÑит от техничеÑких ÑвойÑтв иÑходного + Как обычно, выбор битпотока завиÑит от техничеÑких ÑвойÑтв иÑходного материала, как объÑÑнÑетÑÑ <link linkend="menc-feat-dvd-mpeg4-resolution-bitrate">здеÑÑŒ</link>, как, впрочем, и от личного вкуÑа. - Ðтот фильм обладает небольшим количеÑтвом Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð¸ большим - количеÑтвом деталей, но H.264 видео хорошо выглÑдит на ÑущеÑтвенно + Ðтот фильм обладает небольшим количеÑтвом Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð¸ большим + количеÑтвом деталей, но H.264 видео хорошо выглÑдит на ÑущеÑтвенно меньших битпотоках, чем XviD или другие MPEG-4 кодеки. - ПоÑле длительного ÑкÑпериментированиÑ, автор данного руководÑтва - решил кодировать фильм на 900 кбит/Ñек, и Ñчитает, что он выглÑдит + ПоÑле длительного ÑкÑпериментированиÑ, автор данного руководÑтва + решил кодировать фильм на 900 кбит/Ñек, и Ñчитает, что он выглÑдит очень хорошо. Ð’Ñ‹ можете уменьшить битпоток, еÑли Вам нужно Ñохранить больше меÑта, или увеличить, еÑли Вам нужно улучшить качеÑтво. </para> @@ -4916,14 +4912,14 @@ vfw2menc -f VP62 -d vp6vfw.dll -s firstpass.mcf <title>Пример кодированиÑ</title> <para> - Теперь Ð’Ñ‹ готовы к кодированию видео. ПоÑкольку Ð’Ñ‹ заботитеÑÑŒ + Теперь Ð’Ñ‹ готовы к кодированию видео. ПоÑкольку Ð’Ñ‹ заботитеÑÑŒ о качеÑтве, Ð’Ñ‹ , разумеетÑÑ, будете делать двупроходное кодирование. Ð”Ð»Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð³Ð¾ ÑÐ¾ÐºÑ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ кодированиÑ, Ð’Ñ‹ можете указать опцию <option>turbo</option> при первом проходе; Ñто уменьшит - <option>subq</option> и <option>frameref</option> до 1. + <option>subq</option> и <option>frameref</option> до 1. Чтобы Ñохранить немного меÑта на диÑке, Ð’Ñ‹ можете иÑпользовать - параметр <option>ss</option> Ð´Ð»Ñ Ð¾Ñ‚Ñ€ÐµÐ·Ð°Ð½Ð¸Ñ Ð¿ÐµÑ€Ð²Ñ‹Ñ… неÑкольких - Ñекунд видео. (Я обнаружил, что, в чаÑтноÑти, у данного фильма + параметр <option>ss</option> Ð´Ð»Ñ Ð¾Ñ‚Ñ€ÐµÐ·Ð°Ð½Ð¸Ñ Ð¿ÐµÑ€Ð²Ñ‹Ñ… неÑкольких + Ñекунд видео. (Я обнаружил, что, в чаÑтноÑти, у данного фильма еÑÑ‚ÑŒ 32 Ñекунды титров и логотипов.) <option>bframes</option> может быть 0 или 1. оÑтальные опции опиÑаны в разделе <link @@ -4938,8 +4934,8 @@ me=umh:partitions=all:trellis=1:qp_step=4:qcomp=0.7:direct_pred=auto:keyint=300 -oac faac -faacopts br=192:mpeg=4:object=2 -channels 2 -srate 48000 \ -ofps 24000/1001</screen> - ЕÑли у Ð’Ð°Ñ Ð¼Ð½Ð¾Ð³Ð¾Ð¿Ñ€Ð¾Ñ†ÐµÑÑÐ¾Ñ€Ð½Ð°Ñ Ð¼Ð°ÑˆÐ¸Ð½Ð°, не упуÑтите ÑˆÐ°Ð½Ñ Ð·Ð½Ð°Ñ‡Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾ - уÑкорить кодирование задейÑтвованием + ЕÑли у Ð’Ð°Ñ Ð¼Ð½Ð¾Ð³Ð¾Ð¿Ñ€Ð¾Ñ†ÐµÑÑÐ¾Ñ€Ð½Ð°Ñ Ð¼Ð°ÑˆÐ¸Ð½Ð°, не упуÑтите ÑˆÐ°Ð½Ñ Ð·Ð½Ð°Ñ‡Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾ + уÑкорить кодирование задейÑтвованием <link linkend="menc-feat-x264-encoding-options-speedquality-threads"> многопоточного режима <systemitem class="library">x264</systemitem></link>, добавив <option>threads=auto</option> в <option>x264encopts</option> в @@ -4947,7 +4943,7 @@ me=umh:partitions=all:trellis=1:qp_step=4:qcomp=0.7:direct_pred=auto:keyint=300 </para> <para> - Второй проход выполнÑетÑÑ Ð°Ð½Ð°Ð»Ð¾Ð³Ð¸Ñ‡Ð½Ð¾, за иÑключением того, что Вам + Второй проход выполнÑетÑÑ Ð°Ð½Ð°Ð»Ð¾Ð³Ð¸Ñ‡Ð½Ð¾, за иÑключением того, что Вам нужно указать выходной файл и уÑтановить <option>pass=2</option>. <screen>mencoder dvd://1 <emphasis role="bold">-o нарниÑ.avi</emphasis> -ss 32 -ovc x264 \ @@ -4961,7 +4957,7 @@ me=umh:partitions=all:trellis=1:qp_step=4:qcomp=0.7:direct_pred=auto:keyint=300 <para> ПолучившееÑÑ AVI должно хорошо воÑпроизводитьÑÑ Ð² <application>MPlayer</application>, но, конечно же, - <application>QuickTime</application> не Ñможет его воÑпроизвеÑти, + <application>QuickTime</application> не Ñможет его воÑпроизвеÑти, Ñ‚.к. не поддерживает H.264, мультиплекÑированный в AVI. Так что Ñледующий шаг — ремультиплекÑирование видео в контейнер MP4. </para> @@ -4971,14 +4967,14 @@ me=umh:partitions=all:trellis=1:qp_step=4:qcomp=0.7:direct_pred=auto:keyint=300 <title>РемультиплекÑирование в MP4</title> <para> - СущеÑтвует неÑколько ÑпоÑобов ремультиплекÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ AVI файлов - в MP4. Ð’Ñ‹ можете иÑпользовать <application>mp4creator</application>, + СущеÑтвует неÑколько ÑпоÑобов ремультиплекÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ AVI файлов + в MP4. Ð’Ñ‹ можете иÑпользовать <application>mp4creator</application>, ÑвлÑющийÑÑ Ñ‡Ð°Ñтью <ulink url="http://mpeg4ip.sourceforge.net/">пакета MPEG4IP</ulink>. </para> <para> - Сперва демультиплекÑируйте AVI в отдельные аудио и видео потоки + Сперва демультиплекÑируйте AVI в отдельные аудио и видео потоки Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ <application>MPlayer</application>. <screen>mplayer нарниÑ.avi -dumpaudio -dumpfile нарниÑ.aac @@ -4990,7 +4986,7 @@ mplayer нарниÑ.avi -dumpvideo -dumpfile нарниÑ.h264</screen> </para> <para> - Теперь иÑпользуйте <application>mp4creator</application> Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ + Теперь иÑпользуйте <application>mp4creator</application> Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ MP4 файла из аудио и видео потоков. <screen>mp4creator -create=нарниÑ.aac нарниÑ.mp4 @@ -5005,9 +5001,9 @@ mp4creator -create=нарниÑ.h264 -rate=23.976 нарниÑ.mp4</screen> Теперь файл <systemitem>нарниÑ.mp4</systemitem> должен проигрыватьÑÑ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ любого <application>QuickTime</application> 7 приложениÑ, например, <application>QuickTime Player</application> или - <application>iTunes</application>. - ЕÑли Ð’Ñ‹ планируете проÑмотр видео в вÑб-браузере Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ плагина - <application>QuickTime</application>, Вам также необходимо + <application>iTunes</application>. + ЕÑли Ð’Ñ‹ планируете проÑмотр видео в вÑб-браузере Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ плагина + <application>QuickTime</application>, Вам также необходимо модифицировать фильм таким образом, чтобы плагин <application>QuickTime</application> мог начать его воÑпроизведение ещё во Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸. <application>mp4creator</application> @@ -5017,7 +5013,7 @@ mp4creator -create=нарниÑ.h264 -rate=23.976 нарниÑ.mp4</screen> mp4creator -hint=2 нарниÑ.mp4 mp4creator -optimize нарниÑ.mp4</screen> - Ð’Ñ‹ можете проверить полученный результат, чтобы убедитьÑÑ, что + Ð’Ñ‹ можете проверить полученный результат, чтобы убедитьÑÑ, что вÑпомогательные дорожки были уÑпешно Ñозданы. <screen>mp4creator -list нарниÑ.mp4</screen> @@ -5038,18 +5034,18 @@ mp4creator -optimize нарниÑ.mp4</screen> <title>Добавление тегов метаданных</title> <para> - ЕÑли Ð’Ñ‹ хотите добавить в видео теги, которые отображаютÑÑ Ð² iTunes, Ð’Ñ‹ + ЕÑли Ð’Ñ‹ хотите добавить в видео теги, которые отображаютÑÑ Ð² iTunes, Ð’Ñ‹ можете иÑпользовать <ulink url="http://atomicparsley.sourceforge.net/">AtomicParsley</ulink>. - + <screen>AtomicParsley нарниÑ.mp4 --metaEnema --title "The Chronicles of Narnia" --year 2005 --stik Movie --freefree --overWrite</screen> ÐžÐ¿Ñ†Ð¸Ñ <option>--metaEnema</option> удалÑет любые ÑущеÑтвующие метаданные (<application>mp4creator</application> вÑтавлÑет Ñвоё название в тег "утилита кодированиÑ") и <option>--freefree</option> выÑвобождает меÑто, оÑтавшееÑÑ Ð¾Ñ‚ удалённых метаданных. - ÐžÐ¿Ñ†Ð¸Ñ <option>--stik</option> уÑтанавливает тип видео (например, - Movie или TV Show), который иÑпользуетÑÑ iTunes Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð¸Ñ€Ð¾Ð²ÐºÐ¸ + ÐžÐ¿Ñ†Ð¸Ñ <option>--stik</option> уÑтанавливает тип видео (например, + Movie или TV Show), который иÑпользуетÑÑ iTunes Ð´Ð»Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð¸Ñ€Ð¾Ð²ÐºÐ¸ родÑтвенных видеофайлов. ÐžÐ¿Ñ†Ð¸Ñ <option>--overWrite</option> перезапиÑывает иÑходный файл; без неё <application>AtomicParsley</application> ÑоздаÑÑ‚ новый файл Ñ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑким @@ -5065,7 +5061,7 @@ mp4creator -optimize нарниÑ.mp4</screen> <sect1 id="menc-feat-vcd-dvd"> -<title>ИÑпользование <application>MEncoder</application> +<title>ИÑпользование <application>MEncoder</application> Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ VCD/SVCD/DVD-ÑовмеÑтимых файлов.</title> <sect2 id="menc-feat-vcd-dvd-constraints"> @@ -5074,11 +5070,11 @@ mp4creator -optimize нарниÑ.mp4</screen> <para> <application>MEncoder</application> ÑпоÑобен Ñоздавать MPEG файлы VCD, SCVD и DVD формата, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñ‚ÐµÐºÑƒ <systemitem class="library">libavcodec</systemitem>. -Ðти файлы затем могут быть иÑпользованы ÑовмеÑтно Ñ +Ðти файлы затем могут быть иÑпользованы ÑовмеÑтно Ñ <ulink url="http://www.gnu.org/software/vcdimager/vcdimager.html">vcdimager</ulink> или <ulink url="http://dvdauthor.sourceforge.net/">dvdauthor</ulink> -Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð´Ð¸Ñков, которые будут воÑпроизводитьÑÑ Ð½Ð° Ñтандартном видео +Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð´Ð¸Ñков, которые будут воÑпроизводитьÑÑ Ð½Ð° Ñтандартном видео проигрывателе. </para> @@ -5112,7 +5108,7 @@ DVD, SVCD, и VCD форматы обладают жеÑткими Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ <tbody> <row> <entry>NTSC DVD</entry> - <entry>720x480, 704x480, 352x480, 352x240</entry> + <entry>720x480, 704x480, 352x480, 352x240</entry> <entry>MPEG-2</entry> <entry>9800 кбит/Ñ</entry> <entry>48000 Гц</entry> @@ -5125,7 +5121,7 @@ DVD, SVCD, и VCD форматы обладают жеÑткими Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ <entry>NTSC DVD</entry> <entry>352x240<footnote id='fn-rare-resolutions'><para> Ðти Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ñ€ÐµÐ´ÐºÐ¾ иÑпользуютÑÑ Ð´Ð»Ñ DVD, поÑкольку имеют довольно низкое - качеÑтво.</para></footnote></entry> + качеÑтво.</para></footnote></entry> <entry>MPEG-1</entry> <entry>1856 кбит/Ñ</entry> <entry>48000 Гц</entry> @@ -5220,7 +5216,7 @@ DVD, SVCD, и VCD форматы обладают жеÑткими Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ <title>ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð½Ð° размер GOP</title> <para> -DVD, VCD, и SVCD также ограничивают Ð’Ð°Ñ Ð¾Ñ‚Ð½Ð¾Ñительно низкими размерами +DVD, VCD, и SVCD также ограничивают Ð’Ð°Ñ Ð¾Ñ‚Ð½Ð¾Ñительно низкими размерами GOP (Group of Pictures, Группа Изображений). Ð”Ð»Ñ Ð¼Ð°Ñ‚ÐµÑ€Ð¸Ð°Ð»Ð° Ñ 30 fps макÑимальный допуÑтимый размер GOP равен 18. Ð”Ð»Ñ 25 или 24 fps, макÑимум равен 15. @@ -5325,14 +5321,14 @@ DVD Ñ NTSC Pullup: <title>Сохранение A/V Ñинхронизации</title> <para> -Ð”Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы ÑохранÑÑ‚ÑŒ аудио/видео Ñинхронизацию на протÑжении вÑего +Ð”Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы ÑохранÑÑ‚ÑŒ аудио/видео Ñинхронизацию на протÑжении вÑего кодированиÑ, <application>MEncoder</application> должен выбраÑывать или дублировать кадры. Ðто довольно неплохо работает при мультиплекÑировании в AVI файл, но Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼Ð¸ мультиплекÑорами, такими как MPEG, почти гарантировано -приведет к нарушению A/V Ñинхронизации. Ð”Ð»Ñ Ð¸Ð·Ð±ÐµÐ¶Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ñ‹Ñ… проблем, +приведет к нарушению A/V Ñинхронизации. Ð”Ð»Ñ Ð¸Ð·Ð±ÐµÐ¶Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ñ‹Ñ… проблем, необходимо добавить видео фильтр <option>harddup</option> в конец цепочки фильтров. Дополнительную техничеÑкую информацию о <option>harddup</option> можно -найти в разделе +найти в разделе <link linkend="menc-feat-dvd-mpeg4-muxing-filter-issues">Улучшение мультиплекÑÐ¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ надежноÑти A/V Ñинхронизации</link> или в man руководÑтве. </para> @@ -5369,8 +5365,8 @@ VCD и SVCD: <title>Введение</title> <para> - ИÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ ÑоответÑтвующие опции, можно применÑÑ‚ÑŒ - <systemitem class="library">libavcodec</systemitem> Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ VCD/SVCD/DVD + ИÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ ÑоответÑтвующие опции, можно применÑÑ‚ÑŒ + <systemitem class="library">libavcodec</systemitem> Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ VCD/SVCD/DVD ÑовмеÑтимого видео. </para> </sect3> @@ -5405,7 +5401,7 @@ VCD и SVCD: <option>mpeg1video</option> Ð´Ð»Ñ VCD; <option>mpeg2video</option> Ð´Ð»Ñ SVCD; <option>mpeg2video</option> обычно иÑпользуетÑÑ Ð´Ð»Ñ DVD, но Ð’Ñ‹ также можете - иÑпользовать + иÑпользовать <option>mpeg1video</option> Ð´Ð»Ñ CIF разрешений. </para></listitem> <listitem><para> @@ -5491,15 +5487,15 @@ keyint=15:vstrict=0:acodec=ac3 <title>РаÑширенные опции</title> <para> -Ð”Ð»Ñ Ð´Ð¾ÑÑ‚Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð±Ð¾Ð»ÐµÐµ выÑокого качеÑтва кодированиÑ, Ð’Ñ‹ также можете +Ð”Ð»Ñ Ð´Ð¾ÑÑ‚Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð±Ð¾Ð»ÐµÐµ выÑокого качеÑтва кодированиÑ, Ð’Ñ‹ также можете добавить опции lavcopts, улучшающие качеÑтво, такие как <option>trell</option>, <option>mbd=2</option> и другие. -Обратите внимание, что <option>qpel</option> и <option>v4mv</option>, +Обратите внимание, что <option>qpel</option> и <option>v4mv</option>, чаÑто полезные Ñ MPEG-4, не применимы к MPEG-1 или MPEG-2. Также, еÑли Ð’Ñ‹ хотите выполнить очень выÑококачеÑтвенное кодирование DVD, может быть полезным добавление <option>dc=10</option> в lavcopts. -Ðто может помочь подавить поÑвление блоков в однородно окрашенных -облаÑÑ‚ÑÑ…. ÐŸÐ¾Ð´Ð²Ð¾Ð´Ñ Ð¸Ñ‚Ð¾Ð³, вот пример наÑтроек lavcopts Ð´Ð»Ñ +Ðто может помочь подавить поÑвление блоков в однородно окрашенных +облаÑÑ‚ÑÑ…. ÐŸÐ¾Ð´Ð²Ð¾Ð´Ñ Ð¸Ñ‚Ð¾Ð³, вот пример наÑтроек lavcopts Ð´Ð»Ñ Ð²Ñ‹ÑококачеÑтвенного DVD: </para> @@ -5519,7 +5515,7 @@ vqmin=1:lmin=1:dc=10:vstrict=0 <title>Кодирование звука</title> <para> -VCD и SVCD поддерживают звук MPEG-1 layer II, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¾Ð´Ð½Ñƒ из +VCD и SVCD поддерживают звук MPEG-1 layer II, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¾Ð´Ð½Ñƒ из <systemitem class="library">toolame</systemitem>, <systemitem class="library">twolame</systemitem>, или MP2 <systemitem class="library">libavcodec</systemitem> кодировщик. @@ -61,13 +61,13 @@ compile_check() { echo >> "$TMPLOG" cat "$1" >> "$TMPLOG" echo >> "$TMPLOG" - echo "$_cc $CFLAGS $_inc_extra $_ld_static $_ld_extra $_libs_mplayer $_libs_mencoder -o $TMPEXE $@" >> "$TMPLOG" + echo "$_cc $CFLAGS $extra_cflags $_ld_static $extra_ldflags $libs_mplayer $libs_mencoder -o $TMPEXE $@" >> "$TMPLOG" rm -f "$TMPEXE" - $_cc $CFLAGS $_inc_extra $_ld_static $_ld_extra $_libs_mplayer $_libs_mencoder -o "$TMPEXE" "$@" >> "$TMPLOG" 2>&1 - TMP="$?" + $_cc $CFLAGS $extra_cflags $_ld_static $extra_ldflags $libs_mplayer $libs_mencoder -o "$TMPEXE" "$@" >> "$TMPLOG" 2>&1 + TMPRES="$?" echo >> "$TMPLOG" echo >> "$TMPLOG" - return "$TMP" + return "$TMPRES" } cc_check() { @@ -85,10 +85,10 @@ yasm_check() { echo "$_yasm $YASMFLAGS -o $TMPEXE $TMPS $@" >> "$TMPLOG" rm -f "$TMPEXE" $_yasm $YASMFLAGS -o "$TMPEXE" "$TMPS" "$@" >> "$TMPLOG" 2>&1 - TMP="$?" + TMPRES="$?" echo >> "$TMPLOG" echo >> "$TMPLOG" - return "$TMP" + return "$TMPRES" } tmp_run() { @@ -464,13 +464,12 @@ Advanced options: --enable-crash-debug enable automatic gdb attach on crash [disable] --enable-dynamic-plugins enable dynamic A/V plugins [disable] -Use these options if autodetection fails (Options marked with (*) accept -multiple paths separated by ':'): +Use these options if autodetection fails: + --extra-cflags=FLAGS extra CFLAGS + --extra-ldflags=FLAGS extra LDFLAGS --extra-libs=FLAGS extra linker flags --extra-libs-mplayer=FLAGS extra linker flags for MPlayer --extra-libs-mencoder=FLAGS extra linker flags for MEncoder - --with-extraincdir=DIR extra header search paths in DIR (*) - --with-extralibdir=DIR extra linker search paths in DIR (*) --with-xvmclib=NAME adapter-specific library name (e.g. XvMCNVIDIA) --with-freetype-config=PATH path to freetype-config @@ -765,12 +764,6 @@ for ac_option do --realcodecsdir=*) _realcodecsdir=`echo $ac_option | cut -d '=' -f 2` ;; - --with-extraincdir=*) - _inc_extra=-I`echo $ac_option | cut -d '=' -f 2 | sed 's,:, -I,g'` - ;; - --with-extralibdir=*) - _ld_extra=-L`echo $ac_option | cut -d '=' -f 2 | sed 's,:, -L,g'` - ;; --with-install=*) _install=`echo $ac_option | cut -d '=' -f 2 ` @@ -801,14 +794,20 @@ for ac_option do _dvdreadconfig=`echo $ac_option | cut -d '=' -f 2` ;; + --extra-cflags=*) + extra_cflags=`echo $ac_option | cut -d '=' -f 2` + ;; + --extra-ldflags=*) + extra_ldflags=`echo $ac_option | cut -d '=' -f 2` + ;; --extra-libs=*) - _extra_libs=`echo $ac_option | cut -d '=' -f 2` + extra_libs=`echo $ac_option | cut -d '=' -f 2` ;; --extra-libs-mplayer=*) - _libs_mplayer=`echo $ac_option | cut -d '=' -f 2` + libs_mplayer=`echo $ac_option | cut -d '=' -f 2` ;; --extra-libs-mencoder=*) - _libs_mencoder=`echo $ac_option | cut -d '=' -f 2` + libs_mencoder=`echo $ac_option | cut -d '=' -f 2` ;; --target=*) @@ -1417,27 +1416,27 @@ if test "$_runtime_cpudetection" = yes && ! x86 && ! ppc; then fi -_inc_extra="-I. $_inc_extra" +extra_cflags="-I. $extra_cflags" _timer=timer-linux.c _getch=getch2.c if freebsd ; then - _ld_extra="$_ld_extra -L/usr/local/lib" - _inc_extra="$_inc_extra -I/usr/local/include" + extra_ldflags="$extra_ldflags -L/usr/local/lib" + extra_cflags="$extra_cflags -I/usr/local/include" fi if netbsd || dragonfly ; then - _ld_extra="$_ld_extra -L/usr/pkg/lib" - _inc_extra="$_inc_extra -I/usr/pkg/include" + extra_ldflags="$extra_ldflags -L/usr/pkg/lib" + extra_cflags="$extra_cflags -I/usr/pkg/include" fi if darwin; then - _ld_extra="$_ld_extra -L/usr/local/lib" - _inc_extra="$_inc_extra -I/usr/local/include" + extra_ldflags="$extra_ldflags -L/usr/local/lib" + extra_cflags="$extra_cflags -I/usr/local/include" _timer=timer-darwin.c fi if aix ; then - _ld_extra="$_ld_extra -lC" + extra_ldflags="$extra_ldflags -lC" fi if irix ; then @@ -1449,7 +1448,7 @@ fi if win32 ; then _exesuf=".exe" # -lwinmm is always needed for osdep/timer-win2.c - _ld_extra="$_ld_extra -lwinmm" + extra_ldflags="$extra_ldflags -lwinmm" _pe_executable=yes _timer=timer-win2.c _priority=yes @@ -1470,7 +1469,7 @@ if amigaos ; then fi if qnx ; then - _ld_extra="$_ld_extra -lph" + extra_ldflags="$extra_ldflags -lph" fi if os2 ; then @@ -1528,7 +1527,7 @@ if test "`basename $_cc`" = "icc" || test "`basename $_cc`" = "ecc"; then cc_version="v. ?.??, bad" cc_fail=yes ;; - 10.1|11.0) + 10.1|11.0|11.1) cc_version="$cc_version, ok" ;; *) @@ -1712,6 +1711,7 @@ fi def_fast_64bit='#define HAVE_FAST_64BIT 0' +def_fast_unaligned='#define HAVE_FAST_UNALIGNED 0' _arch_all='X86 X86_32 X86_64 IA64 SPARC ARM AVR32 SH4 PPC ALPHA SGI_MIPS PA_RISC S390 S390X VAX BFIN XTENSA GENERIC' case "$host_arch" in i[3-9]86|x86|x86pc|k5|k6|k6-2|k6-3|pentium*|athlon*|i586-i686) @@ -2412,19 +2412,19 @@ elif test -z "$CFLAGS" ; then CFLAGS="-O2 $_march $_mcpu $_pipe" else CFLAGS="-Wall -Wno-switch -Wpointer-arith -Wredundant-decls -O4 $_march $_mcpu $_pipe -ffast-math -fomit-frame-pointer" - _ld_extra="$_ld_extra -ffast-math" + extra_ldflags="$extra_ldflags -ffast-math" fi else _warn_CFLAGS=yes fi if test -n "$LDFLAGS" ; then - _ld_extra="$_ld_extra $LDFLAGS" + extra_ldflags="$extra_ldflags $LDFLAGS" _warn_CFLAGS=yes elif test "$cc_vendor" = "intel" ; then - _ld_extra="$_ld_extra -i-static" + extra_ldflags="$extra_ldflags -i-static" fi if test -n "$CPPFLAGS" ; then - _inc_extra="$_inc_extra $CPPFLAGS" + extra_cflags="$extra_cflags $CPPFLAGS" _warn_CFLAGS=yes fi @@ -2725,7 +2725,7 @@ cat > $TMPC <<EOF int main(void) { return 0; } EOF if cc_check -lposix ; then - _ld_extra="$_ld_extra -lposix" + extra_ldflags="$extra_ldflags -lposix" echores "yes" else echores "no" @@ -2865,7 +2865,7 @@ _kstat=no cc_check -lkstat && _kstat=yes if test "$_kstat" = yes ; then def_kstat="#define HAVE_LIBKSTAT 1" - _ld_extra="$_ld_extra -lkstat" + extra_ldflags="$extra_ldflags -lkstat" else def_kstat="#undef HAVE_LIBKSTAT" fi @@ -2881,7 +2881,7 @@ EOF _posix4=no cc_check -lposix4 && _posix4=yes if test "$_posix4" = yes ; then - _ld_extra="$_ld_extra -lposix4" + extra_ldflags="$extra_ldflags -lposix4" fi echores "$_posix4" @@ -3052,7 +3052,7 @@ test $_winsock2_h = no && test $inet_pton = no && test $inet_aton = no && _network=no if test "$_network" = yes ; then def_network='#define CONFIG_NETWORK 1' - _ld_extra="$_ld_extra $_ld_sock" + extra_ldflags="$extra_ldflags $_ld_sock" _inputmodules="network $_inputmodules" else _noinputmodules="network $_noinputmodules" @@ -3286,7 +3286,7 @@ fi echores "$_dynamic_plugins" -def_threads='#undef HAVE_THREADS' +def_threads='#define HAVE_THREADS 0' echocheck "pthread" if test "$_pthreads" = auto ; then @@ -3339,10 +3339,10 @@ echores "$_w32threads" echocheck "rpath" netbsd &&_rpath=yes if test "$_rpath" = yes ; then - for I in `echo $_ld_extra | sed 's/-L//g'` ; do + for I in `echo $extra_ldflags | sed 's/-L//g'` ; do tmp="$tmp ` echo $I | sed 's/.*/ -L& -Wl,-R&/'`" done -_ld_extra=$tmp +extra_ldflags=$tmp fi echores "$_rpath" @@ -3382,7 +3382,7 @@ int main(void) { EOF _iconv=no for _ld_tmp in "" "-liconv" "-liconv $_ld_dl" ; do - cc_check $_ld_lm $_ld_tmp && _ld_extra="$_ld_extra $_ld_tmp" && \ + cc_check $_ld_lm $_ld_tmp && extra_ldflags="$extra_ldflags $_ld_tmp" && \ _iconv=yes && break done fi @@ -3543,7 +3543,7 @@ int main(void) { tgetent(NULL, NULL); return 0; } EOF _termcap=no for _ld_tmp in "-lncurses" "-ltinfo" "-ltermcap"; do - cc_check $_ld_tmp && _ld_extra="$_ld_extra $_ld_tmp" \ + cc_check $_ld_tmp && extra_ldflags="$extra_ldflags $_ld_tmp" \ && _termcap=yes && break done fi @@ -3794,7 +3794,7 @@ if test "$_macosx" = yes ; then int main(void) { return 0; } EOF if cc_check -framework CoreAudio; then - _ld_extra="$_ld_extra -framework CoreAudio -framework AudioUnit -framework AudioToolbox" + extra_ldflags="$extra_ldflags -framework CoreAudio -framework AudioUnit -framework AudioToolbox" _coreaudio=yes def_coreaudio='#define CONFIG_COREAUDIO 1' _aomodules="macosx $_aomodules" @@ -3814,7 +3814,7 @@ int main(void) { } EOF if cc_check -framework Carbon -framework QuickTime; then - _ld_extra="$_ld_extra -framework Carbon -framework QuickTime" + extra_ldflags="$extra_ldflags -framework Carbon -framework QuickTime" _quartz=yes def_quartz='#define CONFIG_QUARTZ 1' _vomodules="quartz $_vomodules" @@ -3832,7 +3832,7 @@ int main(void) { return 0; } EOF if cc_check -framework Carbon -framework QuartzCore -framework OpenGL; then _vomodules="macosx $_vomodules" - _ld_extra="$_ld_extra -framework Cocoa -framework QuartzCore -framework OpenGL" + extra_ldflags="$extra_ldflags -framework Cocoa -framework QuartzCore -framework OpenGL" def_corevideo='#define CONFIG_COREVIDEO 1' _corevideo=yes else @@ -3899,7 +3899,7 @@ EOF fi if test "$_apple_remote" = yes ; then def_apple_remote='#define CONFIG_APPLE_REMOTE 1' - _ld_extra="$_ld_extra -framework IOKit" + extra_ldflags="$extra_ldflags -framework IOKit" else def_apple_remote='#undef CONFIG_APPLE_REMOTE' fi @@ -3946,7 +3946,7 @@ fi echocheck "Samba support (libsmbclient)" if test "$_smb" = yes; then - _ld_extra="$_ld_extra -lsmbclient" + extra_ldflags="$extra_ldflags -lsmbclient" fi if test "$_smb" = auto; then _smb=no @@ -3955,7 +3955,7 @@ if test "$_smb" = auto; then int main(void) { smbc_opendir("smb://"); return 0; } EOF for _ld_tmp in "-lsmbclient" "-lsmbclient $_ld_dl" "-lsmbclient $_ld_dl -lnsl" "-lsmbclient $_ld_dl -lssl -lnsl" ; do - cc_check $_ld_tmp && _ld_extra="$_ld_extra $_ld_tmp" && \ + cc_check $_ld_tmp && extra_ldflags="$extra_ldflags $_ld_tmp" && \ _smb=yes && break done fi @@ -4095,7 +4095,7 @@ EOF for _inc_tmp in "" -I/usr/local/include/directfb \ -I/usr/include/directfb -I/usr/local/include; do cc_check $_inc_tmp -ldirectfb && _directfb=yes && \ - _inc_extra="$_inc_extra $_inc_tmp" && break + extra_cflags="$extra_cflags $_inc_tmp" && break done fi @@ -4110,7 +4110,7 @@ int dfb_ver = DIRECTFB_MAJOR_VERSION.DIRECTFB_MINOR_VERSION.DIRECTFB_MICRO_VERSION ; EOF - if $_cc -E $TMPC $_inc_extra > "$TMPEXE"; then + if $_cc -E $TMPC $extra_cflags > "$TMPEXE"; then _directfb_version=`sed -n 's/^dfb_ver[^0-9]*\(.*\)/\1/p' "$TMPEXE" | tr -d '()'` _dfb_major=`echo $_directfb_version | cut -d . -f 1` _dfb_minor=`echo $_directfb_version | cut -d . -f 2` @@ -4135,7 +4135,7 @@ echores "$_directfb" if test "$_directfb" = yes ; then def_directfb='#define CONFIG_DIRECTFB 1' _vomodules="directfb $_vomodules" - _libs_mplayer="$_libs_mplayer -ldirectfb" + libs_mplayer="$libs_mplayer -ldirectfb" else def_directfb='#undef CONFIG_DIRECTFB' _novomodules="directfb $_novomodules" @@ -4152,7 +4152,7 @@ fi echocheck "X11 headers presence" _x11_headers="no" _res_comment="check if the dev(el) packages are installed" - for I in `echo $_inc_extra | sed s/-I//g` /usr/include ; do + for I in `echo $extra_cflags | sed s/-I//g` /usr/include ; do if test -f "$I/X11/Xlib.h" ; then _x11_headers="yes" _res_comment="" @@ -4163,7 +4163,7 @@ echocheck "X11 headers presence" for I in /usr/X11/include /usr/X11R7/include /usr/X11R6/include \ /usr/include/X11R6 /usr/openwin/include ; do if test -f "$I/X11/Xlib.h" ; then - _inc_extra="$_inc_extra -I$I" + extra_cflags="$extra_cflags -I$I" _x11_headers="yes" _res_comment="using $I" break @@ -4188,7 +4188,7 @@ EOF else _ld_tmp="$I -lXext -lX11 $_ld_pthread" fi - cc_check $_ld_tmp && _libs_mplayer="$_libs_mplayer $_ld_tmp" \ + cc_check $_ld_tmp && libs_mplayer="$libs_mplayer $_ld_tmp" \ && _x11=yes && break done fi @@ -4217,7 +4217,7 @@ EOF fi if test "$_xss" = yes ; then def_xss='#define CONFIG_XSS 1' - _libs_mplayer="$_libs_mplayer -lXss" + libs_mplayer="$libs_mplayer -lXss" else def_xss='#undef CONFIG_XSS' fi @@ -4249,7 +4249,7 @@ if test "$_xdpms4" = yes ; then echores "yes" elif test "$_xdpms3" = yes ; then def_xdpms='#define CONFIG_XDPMS 1' - _libs_mplayer="$_libs_mplayer -lXdpms" + libs_mplayer="$libs_mplayer -lXdpms" _res_comment="using Xdpms 3" echores "yes" else @@ -4274,7 +4274,7 @@ fi if test "$_xv" = yes ; then def_xv='#define CONFIG_XV 1' - _libs_mplayer="$_libs_mplayer -lXv" + libs_mplayer="$libs_mplayer -lXv" _vomodules="xv $_vomodules" else def_xv='#undef CONFIG_XV' @@ -4301,7 +4301,7 @@ EOF fi if test "$_xvmc" = yes ; then def_xvmc='#define CONFIG_XVMC 1' - _libs_mplayer="$_libs_mplayer -lXvMC -l$_xvmclib" + libs_mplayer="$libs_mplayer -lXvMC -l$_xvmclib" _vomodules="xvmc $_vomodules" _res_comment="using $_xvmclib" else @@ -4318,7 +4318,7 @@ if test "$_vdpau" = auto ; then if test "$_dl" = yes ; then cat > $TMPC <<EOF #include <vdpau/vdpau_x11.h> -int main(void) {return 0;} +int main(void) {return VDP_VIDEO_MIXER_ATTRIBUTE_SKIP_CHROMA_DEINTERLACE;} EOF cc_check && _vdpau=yes fi @@ -4347,7 +4347,7 @@ fi if test "$_xinerama" = yes ; then def_xinerama='#define CONFIG_XINERAMA 1' - _libs_mplayer="$_libs_mplayer -lXinerama" + libs_mplayer="$libs_mplayer -lXinerama" else def_xinerama='#undef CONFIG_XINERAMA' fi @@ -4371,7 +4371,7 @@ EOF fi if test "$_vm" = yes ; then def_vm='#define CONFIG_XF86VM 1' - _libs_mplayer="$_libs_mplayer -lXxf86vm" + libs_mplayer="$libs_mplayer -lXxf86vm" else def_vm='#undef CONFIG_XF86VM' fi @@ -4433,7 +4433,7 @@ elif test "$_dga2" = yes ; then fi if test "$_dga" = yes ; then def_dga='#define CONFIG_DGA 1' - _libs_mplayer="$_libs_mplayer -lXxf86dga" + libs_mplayer="$libs_mplayer -lXxf86dga" _vomodules="dga $_vomodules" else _novomodules="dga $_novomodules" @@ -4478,14 +4478,14 @@ EOF _gl=no if cc_check -lGL $_ld_lm ; then _gl=yes - _libs_mplayer="$_libs_mplayer -lGL $_ld_dl" + libs_mplayer="$libs_mplayer -lGL $_ld_dl" elif cc_check -lGL $_ld_lm $_ld_pthread ; then _gl=yes - _libs_mplayer="$_libs_mplayer -lGL $_ld_pthread $_ld_dl" + libs_mplayer="$libs_mplayer -lGL $_ld_pthread $_ld_dl" elif cc_check -DGL_WIN32 -lopengl32 ; then _gl=yes _gl_win32=yes - _libs_mplayer="$_libs_mplayer -lopengl32 -lgdi32" + libs_mplayer="$libs_mplayer -lopengl32 -lgdi32" fi else _gl=no @@ -4584,7 +4584,7 @@ fi if test "$_vidix" = yes && win32; then winvidix=yes _vomodules="winvidix $_vomodules" - _libs_mplayer="$_libs_mplayer -lgdi32" + libs_mplayer="$libs_mplayer -lgdi32" else _novomodules="winvidix $_novomodules" fi @@ -4636,7 +4636,7 @@ EOF fi if test "$_ggi" = yes ; then def_ggi='#define CONFIG_GGI 1' - _libs_mplayer="$_libs_mplayer -lggi" + libs_mplayer="$libs_mplayer -lggi" _vomodules="ggi $_vomodules" else def_ggi='#undef CONFIG_GGI' @@ -4658,7 +4658,7 @@ fi # like --disable-ggi --enable-ggiwmh if test "$_ggi" = yes && test "$_ggiwmh" = yes ; then def_ggiwmh='#define CONFIG_GGIWMH 1' - _libs_mplayer="$_libs_mplayer -lggiwmh" + libs_mplayer="$libs_mplayer -lggiwmh" else _ggiwmh=no def_ggiwmh='#undef CONFIG_GGIWMH' @@ -4683,13 +4683,13 @@ return 0; } EOF _aa=no for _ld_tmp in "-laa" ; do - cc_check $_ld_tmp && _libs_mplayer="$_libs_mplayer $_ld_tmp" && _aa=yes && break + cc_check $_ld_tmp && libs_mplayer="$libs_mplayer $_ld_tmp" && _aa=yes && break done fi if test "$_aa" = yes ; then def_aa='#define CONFIG_AA 1' if cygwin ; then - _libs_mplayer="$_libs_mplayer `aalib-config --libs | cut -d " " -f 2,5,6`" + libs_mplayer="$libs_mplayer `aalib-config --libs | cut -d " " -f 2,5,6`" fi _vomodules="aa $_vomodules" else @@ -4715,8 +4715,8 @@ EOF fi if test "$_caca" = yes ; then def_caca='#define CONFIG_CACA 1' - _inc_extra="$_inc_extra `caca-config --cflags`" - _libs_mplayer="$_libs_mplayer `caca-config --libs`" + extra_cflags="$extra_cflags `caca-config --cflags`" + libs_mplayer="$libs_mplayer `caca-config --libs`" _vomodules="caca $_vomodules" else def_caca='#undef CONFIG_CACA' @@ -4736,7 +4736,7 @@ EOF fi if test "$_svga" = yes ; then def_svga='#define CONFIG_SVGALIB 1' - _libs_mplayer="$_libs_mplayer -lvga" + libs_mplayer="$libs_mplayer -lvga" _vomodules="svga $_vomodules" else def_svga='#undef CONFIG_SVGALIB' @@ -4779,7 +4779,7 @@ int main(void) {return 0;} EOF for _inc_tmp in "" "-I/usr/src/DVB/ost/include" ; do cc_check $_inc_tmp && _dvb=yes && \ - _inc_extra="$_inc_extra $_inc_tmp" && break + extra_cflags="$extra_cflags $_inc_tmp" && break done fi echores "$_dvb" @@ -4808,7 +4808,7 @@ int main(void) {return 0;} EOF for _inc_tmp in "" "-I/usr/src/DVB/include" ; do cc_check $_inc_tmp && _dvbhead=yes && \ - _inc_extra="$_inc_extra $_inc_tmp" && break + extra_cflags="$extra_cflags $_inc_tmp" && break done fi echores "$_dvbhead" @@ -4868,7 +4868,7 @@ fi echores "$_png" if test "$_png" = yes ; then def_png='#define CONFIG_PNG 1' - _ld_extra="$_ld_extra -lpng -lz" + extra_ldflags="$extra_ldflags -lpng -lz" _vomodules="png $_vomodules" else def_png='#undef CONFIG_PNG' @@ -4892,7 +4892,7 @@ fi echores "$_mng" if test "$_mng" = yes ; then def_mng='#define CONFIG_MNG 1' - _ld_extra="$_ld_extra -lmng -lz" + extra_ldflags="$extra_ldflags -lmng -lz" else def_mng='#undef CONFIG_MNG' fi @@ -4919,7 +4919,7 @@ echores "$_jpeg" if test "$_jpeg" = yes ; then def_jpeg='#define CONFIG_JPEG 1' _vomodules="jpeg $_vomodules" - _ld_extra="$_ld_extra -ljpeg" + extra_ldflags="$extra_ldflags -ljpeg" else def_jpeg='#undef CONFIG_JPEG' _novomodules="jpeg $_novomodules" @@ -4979,7 +4979,7 @@ if test "$_gif" = yes ; then _vomodules="gif89a $_vomodules" _res_comment="old version, some encoding functions disabled" def_gif_4='#undef CONFIG_GIF_4' - _ld_extra="$_ld_extra $_ld_gif" + extra_ldflags="$extra_ldflags $_ld_gif" cat > $TMPC << EOF #include <signal.h> @@ -5038,7 +5038,7 @@ EOF fi if test "$_vesa" = yes ; then def_vesa='#define CONFIG_VESA 1' - _libs_mplayer="$_libs_mplayer -lvbe -llrmi" + libs_mplayer="$libs_mplayer -lvbe -llrmi" _vomodules="vesa $_vomodules" else def_vesa='#undef CONFIG_VESA' @@ -5087,14 +5087,14 @@ fi if test "$_sdl" = yes ; then def_sdl='#define CONFIG_SDL 1' if cygwin ; then - _libs_mplayer="$_libs_mplayer `$_sdlconfig --libs | cut -d " " -f 1,4,6 | sed s/no-cygwin/cygwin/`" - _inc_extra="$_inc_extra `$_sdlconfig --cflags | cut -d " " -f 1,5,6 | sed s/no-cygwin/cygwin/`" + libs_mplayer="$libs_mplayer `$_sdlconfig --libs | cut -d " " -f 1,4,6 | sed s/no-cygwin/cygwin/`" + extra_cflags="$extra_cflags `$_sdlconfig --cflags | cut -d " " -f 1,5,6 | sed s/no-cygwin/cygwin/`" elif mingw32 ; then - _libs_mplayer="$_libs_mplayer `$_sdlconfig --libs | sed -e s/-mwindows// -e s/-lmingw32//`" - _inc_extra="$_inc_extra `$_sdlconfig --cflags | sed s/-Dmain=SDL_main//`" + libs_mplayer="$libs_mplayer `$_sdlconfig --libs | sed -e s/-mwindows// -e s/-lmingw32//`" + extra_cflags="$extra_cflags `$_sdlconfig --cflags | sed s/-Dmain=SDL_main//`" else - _libs_mplayer="$_libs_mplayer `$_sdlconfig --libs`" - _inc_extra="$_inc_extra `$_sdlconfig --cflags | sed s/-D_GNU_SOURCE=1//`" + libs_mplayer="$libs_mplayer `$_sdlconfig --libs`" + extra_cflags="$extra_cflags `$_sdlconfig --cflags | sed s/-D_GNU_SOURCE=1//`" fi _vomodules="sdl $_vomodules" _aomodules="sdl $_aomodules" @@ -5120,7 +5120,7 @@ EOF fi if test "$_kva" = yes ; then def_kva='#define CONFIG_KVA 1' - _libs_mplayer="$_libs_mplayer -lkva" + libs_mplayer="$libs_mplayer -lkva" _vomodules="kva $_vomodules" else def_kva='#undef CONFIG_KVA' @@ -5144,7 +5144,7 @@ EOF fi if test "$_win32waveout" = yes ; then def_win32waveout='#define CONFIG_WIN32WAVEOUT 1' - _libs_mplayer="$_libs_mplayer -lwinmm" + libs_mplayer="$libs_mplayer -lwinmm" _aomodules="win32 $_aomodules" else def_win32waveout='#undef CONFIG_WIN32WAVEOUT' @@ -5164,7 +5164,7 @@ EOF fi if test "$_direct3d" = yes ; then def_direct3d='#define CONFIG_DIRECT3D 1' - _libs_mplayer="$_libs_mplayer -ld3d9" + libs_mplayer="$libs_mplayer -ld3d9" _vomodules="direct3d $_vomodules" else def_direct3d='#undef CONFIG_DIRECT3D' @@ -5185,7 +5185,7 @@ EOF fi if test "$_directx" = yes ; then def_directx='#define CONFIG_DIRECTX 1' - _libs_mplayer="$_libs_mplayer -lgdi32" + libs_mplayer="$libs_mplayer -lgdi32" _vomodules="directx $_vomodules" _aomodules="dsound $_aomodules" else @@ -5207,7 +5207,7 @@ int main(void) { return 0; } EOF for _inc_tmp in "" -I/usr/local/include/dxr2 -I/usr/include/dxr2; do cc_check $_inc_tmp && _dxr2=yes && \ - _inc_extra="$_inc_extra $_inc_tmp" && break + extra_cflags="$extra_cflags $_inc_tmp" && break done fi if test "$_dxr2" = yes; then @@ -5342,7 +5342,7 @@ EOF def_ossaudio_devdsp='#define PATH_DEV_DSP "/dev/dsp"' elif netbsd || openbsd ; then def_ossaudio_devdsp='#define PATH_DEV_DSP "/dev/sound"' - _ld_extra="$_ld_extra -lossaudio" + extra_ldflags="$extra_ldflags -lossaudio" else def_ossaudio_devdsp='#define PATH_DEV_DSP "/dev/dsp"' fi @@ -5374,8 +5374,8 @@ fi if test "$_arts" = yes ; then def_arts='#define CONFIG_ARTS 1' _aomodules="arts $_aomodules" - _libs_mplayer="$_libs_mplayer `artsc-config --libs`" - _inc_extra="$_inc_extra `artsc-config --cflags`" + libs_mplayer="$libs_mplayer `artsc-config --libs`" + extra_cflags="$extra_cflags `artsc-config --cflags`" else _noaomodules="arts $_noaomodules" fi @@ -5400,8 +5400,8 @@ echores "$_esd" if test "$_esd" = yes ; then def_esd='#define CONFIG_ESD 1' _aomodules="esd $_aomodules" - _libs_mplayer="$_libs_mplayer `esd-config --libs`" - _inc_extra="$_inc_extra `esd-config --cflags`" + libs_mplayer="$libs_mplayer `esd-config --libs`" + extra_cflags="$extra_cflags `esd-config --cflags`" echocheck "esd_get_latency()" cat > $TMPC << EOF @@ -5428,7 +5428,7 @@ EOF fi if test "$_nas" = yes ; then def_nas='#define CONFIG_NAS 1' - _libs_mplayer="$_libs_mplayer -laudio -lXt" + libs_mplayer="$libs_mplayer -laudio -lXt" _aomodules="nas $_aomodules" else _noaomodules="nas $_noaomodules" @@ -5455,8 +5455,8 @@ echores "$_pulse" if test "$_pulse" = yes ; then def_pulse='#define CONFIG_PULSE 1' _aomodules="pulse $_aomodules" - _libs_mplayer="$_libs_mplayer `$_pkg_config --libs libpulse`" - _inc_extra="$_inc_extra `$_pkg_config --cflags libpulse`" + libs_mplayer="$libs_mplayer `$_pkg_config --libs libpulse`" + extra_cflags="$extra_cflags `$_pkg_config --cflags libpulse`" else def_pulse='#undef CONFIG_PULSE' _noaomodules="pulse $_noaomodules" @@ -5472,10 +5472,10 @@ cat > $TMPC << EOF int main(void) { jack_client_open("test", JackUseExactName, NULL); return 0; } EOF if cc_check -ljack ; then - _libs_mplayer="$_libs_mplayer -ljack" + libs_mplayer="$libs_mplayer -ljack" elif cc_check `$_pkg_config --libs --cflags --silence-errors jack` ; then - _libs_mplayer="$_libs_mplayer `$_pkg_config --libs jack`" - _inc_extra="$_inc_extra "`$_pkg_config --cflags jack`"" + libs_mplayer="$libs_mplayer `$_pkg_config --libs jack`" + extra_cflags="$extra_cflags "`$_pkg_config --cflags jack`"" else _jack=no fi @@ -5508,7 +5508,7 @@ EOF cc_check $I && _openal=yes && break cc_check -DOPENAL_AL_H=1 $I && def_openal_h='#define OPENAL_AL_H 1' && _openal=yes && break done - test "$_openal" = yes && _libs_mplayer="$_libs_mplayer $I" + test "$_openal" = yes && libs_mplayer="$libs_mplayer $I" fi if test "$_openal" = yes ; then def_openal='#define CONFIG_OPENAL 1' @@ -5619,7 +5619,7 @@ if test "$_alsaver" ; then _alsa=no _res_comment="unknown version" fi - _ld_extra="$_ld_extra -lasound $_ld_dl $_ld_pthread" + extra_ldflags="$extra_ldflags -lasound $_ld_dl $_ld_pthread" else _noaomodules="alsa $_noaomodules" fi @@ -5674,7 +5674,7 @@ EOF fi if test "$_sgiaudio" = "yes" ; then def_sgiaudio='#define CONFIG_SGI_AUDIO 1' - _libs_mplayer="$_libs_mplayer -laudio" + libs_mplayer="$libs_mplayer -laudio" _aomodules="sgi $_aomodules" else def_sgiaudio='#undef CONFIG_SGI_AUDIO' @@ -5697,7 +5697,7 @@ EOF fi if test "$_dart" = yes ; then def_dart='#define CONFIG_DART 1' - _libs_mplayer="$_libs_mplayer -ldart" + libs_mplayer="$libs_mplayer -ldart" _aomodules="dart $_aomodules" else def_dart='#undef CONFIG_DART' @@ -5736,15 +5736,23 @@ fi echocheck "VCD support" -if linux || freebsd || netbsd || openbsd || dragonfly || bsdos || darwin || sunos || mingw32; then +_vcd=no +if linux || freebsd || netbsd || openbsd || dragonfly || bsdos || darwin || sunos; then + _vcd=yes +elif mingw32; then + cat > $TMPC << EOF +#include <ddk/ntddcdrm.h> +int main(void) { return 0; } +EOF + cc_check && _vcd=yes +fi +if test "$_vcd" = yes; then _inputmodules="vcd $_inputmodules" def_vcd='#define CONFIG_VCD 1' - _vcd="yes" else def_vcd='#undef CONFIG_VCD' _noinputmodules="vcd $_noinputmodules" _res_comment="not supported on this OS" - _vcd="no" fi echores "$_vcd" @@ -5763,7 +5771,7 @@ if test "$_dvdread_internal" = auto ; then || darwin || win32 || os2; then _dvdread_internal=yes _dvdread=yes - _inc_extra="$_inc_extra -Ilibdvdread4" + extra_cflags="$extra_cflags -Ilibdvdread4" fi elif test "$_dvdread" = auto ; then _dvdread=no @@ -5782,8 +5790,8 @@ EOF if cc_check -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE \ $_dvdreadcflags $_dvdreadlibs $_ld_dl ; then _dvdread=yes - _inc_extra="$_inc_extra $_dvdreadcflags" - _ld_extra="$_ld_extra $_dvdreadlibs" + extra_cflags="$extra_cflags $_dvdreadcflags" + extra_ldflags="$extra_ldflags $_dvdreadlibs" _res_comment="external" fi fi @@ -5796,7 +5804,7 @@ if test "$_dvdread_internal" = yes; then elif test "$_dvdread" = yes; then def_dvdread='#define CONFIG_DVDREAD 1' _largefiles=yes - _ld_extra="$_ld_extra -ldvdread" + extra_ldflags="$extra_ldflags -ldvdread" _inputmodules="dvdread(external) $_inputmodules" _res_comment="external" else @@ -5820,7 +5828,7 @@ if test "$_libdvdcss_internal" = yes ; then def_dvd_bsd='#define HAVE_BSD_DVD_STRUCT 1' elif darwin ; then def_dvd_darwin='#define DARWIN_DVD_IOCTL' - _ld_extra="$_ld_extra -framework IOKit" + extra_ldflags="$extra_ldflags -framework IOKit" elif cygwin ; then cflags_libdvdcss="-DSYS_CYGWIN -DWIN32" elif beos ; then @@ -5848,13 +5856,13 @@ EOF _cdparanoia=no for _inc_tmp in "" "-I/usr/include/cdda" "-I/usr/local/include/cdda" ; do cc_check $_inc_tmp -lcdda_interface -lcdda_paranoia $_ld_lm && \ - _cdparanoia=yes && _inc_extra="$_inc_extra $_inc_tmp" && break + _cdparanoia=yes && extra_cflags="$extra_cflags $_inc_tmp" && break done fi if test "$_cdparanoia" = yes ; then _cdda='yes' - _ld_extra="$_ld_extra -lcdda_interface -lcdda_paranoia" - openbsd && _ld_extra="$_ld_extra -lutil" + extra_ldflags="$extra_ldflags -lcdda_interface -lcdda_paranoia" + openbsd && extra_ldflags="$extra_ldflags -lutil" fi echores "$_cdparanoia" @@ -5876,13 +5884,13 @@ EOF for _ld_tmp in "" "-lwinmm" ; do _ld_tmp="-lcdio_cdda -lcdio -lcdio_paranoia $_ld_tmp" cc_check $_ld_tmp $_ld_lm \ - && _libcdio=yes && _ld_extra="$_ld_extra $_ld_tmp" && break + && _libcdio=yes && extra_ldflags="$extra_ldflags $_ld_tmp" && break done if test "$_libcdio" = no && $_pkg_config --exists libcdio_paranoia ; then _inc_tmp=`$_pkg_config --cflags libcdio_paranoia` _ld_tmp=`$_pkg_config --libs libcdio_paranoia` cc_check $_inc_tmp $_ld_tmp $_ld_lm && _libcdio=yes \ - && _ld_extra="$_ld_extra $_ld_tmp" && _inc_extra="$_inc_extra $_inc_tmp" + && extra_ldflags="$extra_ldflags $_ld_tmp" && extra_cflags="$extra_cflags $_inc_tmp" fi fi if test "$_libcdio" = yes && test "$_cdparanoia" = no ; then @@ -5969,8 +5977,8 @@ EOF fi if test "$_freetype" = yes ; then def_freetype='#define CONFIG_FREETYPE' - _inc_extra="$_inc_extra `$_freetypeconfig --cflags`" - _ld_extra="$_ld_extra `$_freetypeconfig --libs`" + extra_cflags="$extra_cflags `$_freetypeconfig --cflags`" + extra_ldflags="$extra_ldflags `$_freetypeconfig --libs`" else def_freetype='#undef CONFIG_FREETYPE' fi @@ -5998,13 +6006,13 @@ EOF _fontconfig=no for _ld_tmp in "" "-lexpat -lfreetype" "-lexpat -lfreetype -lz" ; do _ld_tmp="-lfontconfig $_ld_tmp" - cc_check $_ld_tmp && _fontconfig=yes && _ld_extra="$_ld_extra $_ld_tmp" && break + cc_check $_ld_tmp && _fontconfig=yes && extra_ldflags="$extra_ldflags $_ld_tmp" && break done if test "$_fontconfig" = no && $_pkg_config --exists fontconfig ; then _inc_tmp=`$_pkg_config --cflags fontconfig` _ld_tmp=`$_pkg_config --libs fontconfig` cc_check $_inc_tmp $_ld_tmp && _fontconfig=yes \ - && _ld_extra="$_ld_extra $_ld_tmp" && _inc_extra="$_inc_extra $_inc_tmp" + && extra_ldflags="$extra_ldflags $_ld_tmp" && extra_cflags="$extra_cflags $_inc_tmp" fi fi if test "$_fontconfig" = yes ; then @@ -6069,8 +6077,8 @@ EOF fi if test "$_fribidi" = yes ; then def_fribidi='#define CONFIG_FRIBIDI' - _inc_extra="$_inc_extra `$_fribidiconfig --cflags`" - _ld_extra="$_ld_extra `$_fribidiconfig --libs`" + extra_cflags="$extra_cflags `$_fribidiconfig --cflags`" + extra_ldflags="$extra_ldflags `$_fribidiconfig --libs`" else def_fribidi='#undef CONFIG_FRIBIDI' fi @@ -6094,7 +6102,7 @@ EOF fi if test "$_enca" = yes ; then def_enca='#define CONFIG_ENCA 1' - _ld_extra="$_ld_extra -lenca" + extra_ldflags="$extra_ldflags -lenca" else def_enca='#undef CONFIG_ENCA' fi @@ -6110,7 +6118,7 @@ _zlib=no cc_check -lz && _zlib=yes if test "$_zlib" = yes ; then def_zlib='#define CONFIG_ZLIB 1' - _ld_extra="$_ld_extra -lz" + extra_ldflags="$extra_ldflags -lz" else def_zlib='#define CONFIG_ZLIB 0' _libavdecoders=`echo $_libavdecoders | sed -e s/FLASHSV_DECODER// -e s/PNG_DECODER// -e s/ZMBV_DECODER// -e s/DXA_DECODER// -e s/TSCC_DECODER// ` @@ -6129,7 +6137,7 @@ EOF cc_check -lbz2 && bzlib=yes if test "$bzlib" = yes ; then def_bzlib='#define CONFIG_BZLIB 1' - _ld_extra="$_ld_extra -lbz2" + extra_ldflags="$extra_ldflags -lbz2" fi echores "$bzlib" @@ -6169,7 +6177,7 @@ EOF fi if test "$_liblzo" = yes ; then def_liblzo='#define CONFIG_LIBLZO 1' - _ld_extra="$_ld_extra -llzo2" + extra_ldflags="$extra_ldflags -llzo2" _codecmodules="liblzo $_codecmodules" else def_liblzo='#undef CONFIG_LIBLZO' @@ -6189,7 +6197,7 @@ EOF fi if test "$_mad" = yes ; then def_mad='#define CONFIG_LIBMAD 1' - _ld_extra="$_ld_extra -lmad" + extra_ldflags="$extra_ldflags -lmad" _codecmodules="libmad $_codecmodules" else def_mad='#undef CONFIG_LIBMAD' @@ -6208,7 +6216,7 @@ EOF fi if test "$_twolame" = yes ; then def_twolame='#define CONFIG_TWOLAME 1' - _libs_mencoder="$_libs_mencoder -ltwolame" + libs_mencoder="$libs_mencoder -ltwolame" _codecmodules="twolame $_codecmodules" else def_twolame='#undef CONFIG_TWOLAME' @@ -6231,7 +6239,7 @@ fi fi if test "$_toolame" = yes ; then def_toolame='#define CONFIG_TOOLAME 1' - _libs_mencoder="$_libs_mencoder -ltoolame" + libs_mencoder="$libs_mencoder -ltoolame" _codecmodules="toolame $_codecmodules" else def_toolame='#undef CONFIG_TOOLAME' @@ -6277,13 +6285,13 @@ elif test "$_tremor" = yes ; then def_tremor='#define CONFIG_TREMOR 1' _codecmodules="tremor(external) $_codecmodules" _res_comment="external Tremor" - _ld_extra="$_ld_extra -logg -lvorbisidec" + extra_ldflags="$extra_ldflags -logg -lvorbisidec" elif test "$_libvorbis" = yes ; then _vorbis=yes def_vorbis='#define CONFIG_OGGVORBIS 1' _codecmodules="libvorbis $_codecmodules" _res_comment="libvorbis" - _ld_extra="$_ld_extra -lvorbis -logg" + extra_ldflags="$extra_ldflags -lvorbis -logg" else _vorbis=no _nocodecmodules="libvorbis $_nocodecmodules" @@ -6301,7 +6309,7 @@ EOF fi if test "$_speex" = yes ; then def_speex='#define CONFIG_SPEEX 1' - _ld_extra="$_ld_extra -lspeex" + extra_ldflags="$extra_ldflags -lspeex" _codecmodules="speex $_codecmodules" else def_speex='#undef CONFIG_SPEEX' @@ -6346,22 +6354,22 @@ int main(void) { EOF _ld_theora=$($_pkg_config --silence-errors --libs theora) _inc_theora=$($_pkg_config --silence-errors --cflags theora) - cc_check $_inc_theora $_ld_theora && _ld_extra="$_ld_extra $_ld_theora" && - _inc_extra="$_inc_extra $_inc_theora" && _theora=yes + cc_check $_inc_theora $_ld_theora && extra_ldflags="$extra_ldflags $_ld_theora" && + extra_cflags="$extra_cflags $_inc_theora" && _theora=yes if test _theora = no; then _ld_theora="-ltheora -logg" - cc_check $_ld_theora && _ld_extra="$_ld_extra $_ld_theora" && _theora=yes + cc_check $_ld_theora && extra_ldflags="$extra_ldflags $_ld_theora" && _theora=yes fi if test "$_theora" = no && test "$_tremor_internal" = yes; then _ld_theora=$($_pkg_config --silence-errors --libs theora) _inc_theora=$($_pkg_config --silence-errors --cflags theora) cc_check tremor/bitwise.c $_inc_theora $_ld_theora && - _ld_extra="$_ld_extra $_ld_theora" && - _inc_extra="$_inc_extra $_inc_theora" && _theora=yes + extra_ldflags="$extra_ldflags $_ld_theora" && + extra_cflags="$extra_cflags $_inc_theora" && _theora=yes if test _theora = no; then _ld_theora="-ltheora -logg" cc_check tremor/bitwise.c $_ld_theora && - _ld_extra="$_ld_extra $_ld_theora" && _theora=yes + extra_ldflags="$extra_ldflags $_ld_theora" && _theora=yes fi fi fi @@ -6370,7 +6378,7 @@ if test "$_theora" = yes ; then _codecmodules="libtheora $_codecmodules" # when --enable-theora is forced, we'd better provide a probably sane # $_ld_theora than nothing - test -z "$_ld_theora" && _ld_extra="$_ld_extra -ltheora -logg" + test -z "$_ld_theora" && extra_ldflags="$extra_ldflags -ltheora -logg" else def_theora='#undef CONFIG_OGGTHEORA' _nocodecmodules="libtheora $_nocodecmodules" @@ -6407,7 +6415,7 @@ elif test "$_liba52_internal" = no && test "$_liba52" = auto ; then #include <a52dec/a52.h> int main(void) { a52_state_t *testHand; testHand=a52_init(0); return 0; } EOF - cc_check -la52 && _liba52=yes && _res_comment="external" && _ld_extra="$_ld_extra -la52" + cc_check -la52 && _liba52=yes && _res_comment="external" && extra_ldflags="$extra_ldflags -la52" fi if test "$_liba52" = yes ; then def_liba52='#define CONFIG_LIBA52 1' @@ -6447,7 +6455,7 @@ if test "$_libdca" = auto ; then int main(void) { dts_init(0); return 0; } EOF for _ld_dca in -ldts -ldca ; do - cc_check $_ld_dca $_ld_lm && _ld_extra="$_ld_extra $_ld_dca" \ + cc_check $_ld_dca $_ld_lm && extra_ldflags="$extra_ldflags $_ld_dca" \ && _libdca=yes && break done fi @@ -6478,7 +6486,7 @@ EOF fi if test "$_musepack" = yes ; then def_musepack='#define CONFIG_MUSEPACK 1' - _ld_extra="$_ld_extra -lmpcdec" + extra_ldflags="$extra_ldflags -lmpcdec" _codecmodules="musepack $_codecmodules" else def_musepack='#undef CONFIG_MUSEPACK' @@ -6496,7 +6504,7 @@ int main(void) { unsigned long x, y; faacEncOpen(48000, 2, &x, &y); return 0; } EOF _faac=no for _ld_faac in "-lfaac" "-lfaac -lmp4v2 -lstdc++" ; do - cc_check -O4 $_ld_faac $_ld_lm && _libs_mencoder="$_libs_mencoder $_ld_faac" && _faac=yes && break + cc_check -O4 $_ld_faac $_ld_lm && libs_mencoder="$libs_mencoder $_ld_faac" && _faac=yes && break done fi if test "$_faac" = yes ; then @@ -6504,7 +6512,7 @@ if test "$_faac" = yes ; then test "$_faac_lavc" = auto && _faac_lavc=yes if test "$_faac_lavc" = yes ; then def_faac_lavc="#define CONFIG_LIBFAAC 1" - _libs_mplayer="$_libs_mplayer $_ld_faac" + libs_mplayer="$libs_mplayer $_ld_faac" _libavencoders="$_libavencoders LIBFAAC_ENCODER" fi _codecmodules="faac $_codecmodules" @@ -6560,7 +6568,7 @@ if test "$_faad_internal" = yes ; then _res_comment="internal fixed-point" fi elif test "$_faad" = yes ; then - _ld_extra="$_ld_extra -lfaad" + extra_ldflags="$extra_ldflags -lfaad" fi if test "$_faad" = yes ; then @@ -6630,7 +6638,7 @@ if test "$_win32dll" = yes ; then def_win32_loader='#define WIN32_LOADER 1' _win32_emulation=yes else - _ld_extra="$_ld_extra -ladvapi32 -lole32" + extra_ldflags="$extra_ldflags -ladvapi32 -lole32" _res_comment="using native windows" fi _codecmodules="win32 $_codecmodules" @@ -6708,8 +6716,8 @@ echocheck "Nemesi Streaming Media libraries" if test "$_nemesi" = auto && test "$_network" = yes ; then _nemesi=no if $_pkg_config libnemesi --atleast-version=0.6.3 ; then - _inc_extra="$_inc_extra `$_pkg_config --cflags libnemesi`" - _ld_extra="$_ld_extra `$_pkg_config --libs libnemesi`" + extra_cflags="$extra_cflags `$_pkg_config --cflags libnemesi`" + extra_ldflags="$extra_ldflags `$_pkg_config --libs libnemesi`" _nemesi=yes fi fi @@ -6736,15 +6744,15 @@ int main(void) { return 0; } EOF _live=no - for I in $_inc_extra "-I$_libdir/live" "-I/usr/lib/live" "-I/usr/lib64/live" "-I/usr/local/live" "-I/usr/local/lib/live" ; do + for I in $extra_cflags "-I$_libdir/live" "-I/usr/lib/live" "-I/usr/lib64/live" "-I/usr/local/live" "-I/usr/local/lib/live" ; do cxx_check $I/liveMedia/include $I/UsageEnvironment/include \ $I/groupsock/include && _livelibdir=`echo $I| sed s/-I//` && \ - _ld_extra="$_livelibdir/liveMedia/libliveMedia.a \ + extra_ldflags="$_livelibdir/liveMedia/libliveMedia.a \ $_livelibdir/groupsock/libgroupsock.a \ $_livelibdir/UsageEnvironment/libUsageEnvironment.a \ $_livelibdir/BasicUsageEnvironment/libBasicUsageEnvironment.a \ - $_ld_extra -lstdc++" \ - _inc_extraxx="-I$_livelibdir/liveMedia/include \ + $extra_ldflags -lstdc++" \ + extra_cxxflags="-I$_livelibdir/liveMedia/include \ -I$_livelibdir/UsageEnvironment/include \ -I$_livelibdir/BasicUsageEnvironment/include \ -I$_livelibdir/groupsock/include" && \ @@ -6764,8 +6772,8 @@ elif test "$_live_dist" = yes && test "$_network" = yes; then _res_comment="using distribution version" _live="yes" def_live='#define CONFIG_LIVE555 1' - _ld_extra="$_ld_extra -lliveMedia -lgroupsock -lUsageEnvironment -lBasicUsageEnvironment -lstdc++" - _inc_extraxx="-I/usr/include/liveMedia -I/usr/include/UsageEnvironment \ + extra_ldflags="$extra_ldflags -lliveMedia -lgroupsock -lUsageEnvironment -lBasicUsageEnvironment -lstdc++" + extra_cxxflags="-I/usr/include/liveMedia -I/usr/include/UsageEnvironment \ -I/usr/include/BasicUsageEnvironment -I/usr/include/groupsock" _inputmodules="live555 $_inputmodules" else @@ -6793,10 +6801,10 @@ EOF if $_pkg_config --exists libavutil ; then _inc_libavutil=`$_pkg_config --cflags libavutil` _ld_tmp=`$_pkg_config --libs libavutil` - cc_check $_inc_libavutil $_ld_tmp && _ld_extra="$_ld_extra $_ld_tmp" \ + cc_check $_inc_libavutil $_ld_tmp && extra_ldflags="$extra_ldflags $_ld_tmp" \ && _libavutil_so=yes elif cc_check -lavutil $_ld_lm ; then - _ld_extra="$_ld_extra -lavutil" + extra_ldflags="$extra_ldflags -lavutil" _libavutil_so=yes _res_comment="using libavutil.so, but static libavutil is recommended" fi @@ -6832,10 +6840,10 @@ EOF if $_pkg_config --exists libavcodec ; then _inc_libavcodec=`$_pkg_config --cflags libavcodec` _ld_tmp=`$_pkg_config --libs libavcodec` - cc_check $_inc_libavcodec $_ld_tmp && _ld_extra="$_ld_extra $_ld_tmp" \ + cc_check $_inc_libavcodec $_ld_tmp && extra_ldflags="$extra_ldflags $_ld_tmp" \ && _libavcodec_so=yes elif cc_check -lavcodec $_ld_lm ; then - _ld_extra="$_ld_extra -lavcodec" + extra_ldflags="$extra_ldflags -lavcodec" _libavcodec_so=yes _res_comment="using libavcodec.so, but static libavcodec is recommended" fi @@ -6876,10 +6884,10 @@ EOF if $_pkg_config --exists libavformat ; then _inc_libavformat=`$_pkg_config --cflags libavformat` _ld_tmp=`$_pkg_config --libs libavformat` - cc_check $_inc_libavformat $_ld_tmp && _ld_extra="$_ld_extra $_ld_tmp" \ + cc_check $_inc_libavformat $_ld_tmp && extra_ldflags="$extra_ldflags $_ld_tmp" \ && _libavformat_so=yes elif cc_check $_ld_lm -lavformat ; then - _ld_extra="$_ld_extra -lavformat" + extra_ldflags="$extra_ldflags -lavformat" _libavformat_so=yes _res_comment="using libavformat.so, but static libavformat is recommended" fi @@ -6910,7 +6918,7 @@ elif test "$_libpostproc_so" = auto ; then int main(void) { pp_get_mode_by_name_and_quality("de", 0); return 0; } EOF if cc_check -lpostproc $_ld_lm ; then - _ld_extra="$_ld_extra -lpostproc" + extra_ldflags="$extra_ldflags -lpostproc" _libpostproc_so=yes _res_comment="using libpostproc.so, but static libpostproc is recommended" fi @@ -6943,10 +6951,10 @@ EOF if $_pkg_config --exists libswscale ; then _inc_libswscale=`$_pkg_config --cflags libswscale` _ld_tmp=`$_pkg_config --libs libswscale` - cc_check $_inc_libswscale $_ld_tmp && _ld_extra="$_ld_extra $_ld_tmp" \ + cc_check $_inc_libswscale $_ld_tmp && extra_ldflags="$extra_ldflags $_ld_tmp" \ && _libswscale_so=yes elif cc_check -lswscale ; then - _ld_extra="$_ld_extra -lswscale" + extra_ldflags="$extra_ldflags -lswscale" _libswscale_so=yes fi fi @@ -6976,7 +6984,7 @@ EOF fi if test "$_libamr_nb" = yes ; then _libamr=yes - _ld_extra="$_ld_extra -lamrnb" + extra_ldflags="$extra_ldflags -lamrnb" def_libamr='#define CONFIG_LIBAMR 1' def_libamr_nb='#define CONFIG_LIBAMR_NB 1' _libavdecoders="$_libavdecoders LIBAMR_NB_DECODER" @@ -7004,7 +7012,7 @@ EOF fi if test "$_libamr_wb" = yes ; then _libamr=yes - _ld_extra="$_ld_extra -lamrwb" + extra_ldflags="$extra_ldflags -lamrwb" def_libamr='#define CONFIG_LIBAMR 1' def_libamr_wb='#define CONFIG_LIBAMR_WB 1' _libavdecoders="$_libavdecoders LIBAMR_WB_DECODER" @@ -7027,7 +7035,7 @@ EOF fi if test "$_libdv" = yes ; then def_libdv='#define CONFIG_LIBDV095 1' - _ld_extra="$_ld_extra -ldv" + extra_ldflags="$extra_ldflags -ldv" _codecmodules="libdv $_codecmodules" else def_libdv='#undef CONFIG_LIBDV095' @@ -7044,7 +7052,7 @@ if test "$_xvid" = auto ; then int main(void) { xvid_global(0, 0, 0, 0); return 0; } EOF for _ld_tmp in "-lxvidcore $_ld_lm" "-lxvidcore $_ld_lm $_ld_pthread" ; do - cc_check $_ld_tmp && _ld_extra="$_ld_extra $_ld_tmp" && _xvid=yes && break + cc_check $_ld_tmp && extra_ldflags="$extra_ldflags $_ld_tmp" && _xvid=yes && break done fi @@ -7087,7 +7095,7 @@ int main(void) { x264_encoder_open((void*)0); return 0; } EOF _x264=no for _ld_x264 in "-lx264 $_ld_pthread" "-lx264 $_ld_pthread $_ld_lm" ; do - cc_check $_ld_x264 && _libs_mencoder="$_libs_mencoder $_ld_x264" && _x264=yes && break + cc_check $_ld_x264 && libs_mencoder="$libs_mencoder $_ld_x264" && _x264=yes && break done fi @@ -7097,7 +7105,7 @@ if test "$_x264" = yes ; then test "$_x264_lavc" = auto && _x264_lavc=yes if test "$_x264_lavc" = yes ; then def_x264_lavc='#define CONFIG_LIBX264 1' - _libs_mplayer="$_libs_mplayer $_ld_x264" + libs_mplayer="$libs_mplayer $_ld_x264" _libavencoders="$_libavencoders LIBX264_ENCODER" fi else @@ -7135,8 +7143,8 @@ EOF _ld_dirac=`$_pkg_config --silence-errors --libs dirac` cc_check $_inc_dirac $_ld_dirac && _libdirac_lavc=yes && - _inc_extra="$_inc_extra $_inc_dirac" && - _ld_extra="$_ld_extra $_ld_dirac" + extra_cflags="$extra_cflags $_inc_dirac" && + extra_ldflags="$extra_ldflags $_ld_dirac" fi fi fi @@ -7167,8 +7175,8 @@ EOF _ld_schroedinger=`$_pkg_config --silence-errors --libs schroedinger-1.0` cc_check $_inc_schroedinger $_ld_schroedinger && _libschroedinger_lavc=yes && - _inc_extra="$_inc_extra $_inc_schroedinger" && - _ld_extra="$_ld_extra $_ld_schroedinger" + extra_cflags="$extra_cflags $_inc_schroedinger" && + extra_ldflags="$extra_ldflags $_ld_schroedinger" fi fi fi @@ -7198,7 +7206,7 @@ fi if test "$_libnut" = yes ; then def_libnut='#define CONFIG_LIBNUT 1' - _ld_extra="$_ld_extra -lnut" + extra_ldflags="$extra_ldflags -lnut" else def_libnut='#undef CONFIG_LIBNUT' fi @@ -7249,7 +7257,7 @@ fi if test "$_mp3lame" = yes ; then def_mp3lame="#define CONFIG_MP3LAME" _ld_mp3lame=-lmp3lame - _libs_mencoder="$_libs_mencoder $_ld_mp3lame" + libs_mencoder="$libs_mencoder $_ld_mp3lame" cat > $TMPC << EOF #include <lame/lame.h> int main(void) { lame_set_preset(NULL, STANDARD_FAST); return 0; } @@ -7264,7 +7272,7 @@ EOF if test "$_mp3lame_lavc" = yes ; then def_mp3lame_lavc="#define CONFIG_LIBMP3LAME 1" _libavencoders="$_libavencoders LIBMP3LAME_ENCODER" - _libs_mplayer="$_libs_mplayer $_ld_mp3lame" + libs_mplayer="$libs_mplayer $_ld_mp3lame" fi else _mp3lame_lavc=no @@ -7414,7 +7422,7 @@ fi if test "$_tv_dshow" = yes ; then _inputmodules="tv-dshow $_inputmodules" def_tv_dshow='#define CONFIG_TV_DSHOW 1' - _ld_extra="$_ld_extra -lole32 -luuid" + extra_ldflags="$extra_ldflags -lole32 -luuid" else _noinputmodules="tv-dshow $_noinputmodules" def_tv_dshow='#undef CONFIG_TV_DSHOW' @@ -7628,7 +7636,7 @@ fi if test "$_vstream" = yes ; then def_vstream='#define CONFIG_VSTREAM 1' _inputmodules="vstream $_inputmodules" - _ld_extra="$_ld_extra -lvstream-client" + extra_ldflags="$extra_ldflags -lvstream-client" else _noinputmodules="vstream $_noinputmodules" def_vstream='#undef CONFIG_VSTREAM' @@ -7668,9 +7676,9 @@ if test "$_xmms" = yes ; then def_xmms='#define CONFIG_XMMS 1' if darwin ; then - _ld_extra="$_ld_extra ${_xmmslibdir}/libxmms.dylib" + extra_ldflags="$extra_ldflags ${_xmmslibdir}/libxmms.dylib" else - _ld_extra="$_ld_extra ${_xmmslibdir}/libxmms.so.1 -export-dynamic" + extra_ldflags="$extra_ldflags ${_xmmslibdir}/libxmms.so.1 -export-dynamic" fi else def_xmms='#undef CONFIG_XMMS' @@ -7733,15 +7741,15 @@ if test "$_gtk1" = no ; then if $_pkg_config gtk+-2.0 --exists ; then _gtk=`$_pkg_config gtk+-2.0 --modversion 2>/dev/null` - _inc_extra="$_inc_extra `$_pkg_config gtk+-2.0 --cflags 2>/dev/null`" - _libs_mplayer="$_libs_mplayer `$_pkg_config gtk+-2.0 --libs 2>/dev/null`" + extra_cflags="$extra_cflags `$_pkg_config gtk+-2.0 --cflags 2>/dev/null`" + libs_mplayer="$libs_mplayer `$_pkg_config gtk+-2.0 --libs 2>/dev/null`" echores "$_gtk" # Check for GLIB2 if $_pkg_config glib-2.0 --exists ; then echocheck "glib version" _glib=`$_pkg_config glib-2.0 --modversion 2>/dev/null` - _libs_mplayer="$_libs_mplayer `$_pkg_config glib-2.0 --libs 2>/dev/null`" + libs_mplayer="$libs_mplayer `$_pkg_config glib-2.0 --libs 2>/dev/null`" echores "$_glib" def_gui='#define CONFIG_GUI 1' @@ -7769,8 +7777,8 @@ if test "$_gtk1" = yes ; then fi fi _gtk=`$_gtkconfig --version 2>&1` - _inc_extra="$_inc_extra `$_gtkconfig --cflags 2>&1`" - _libs_mplayer="$_libs_mplayer `$_gtkconfig --libs 2>&1`" + extra_cflags="$extra_cflags `$_gtkconfig --cflags 2>&1`" + libs_mplayer="$libs_mplayer `$_gtkconfig --libs 2>&1`" echores "$_gtk (using $_gtkconfig)" # Check for GLIB @@ -7785,7 +7793,7 @@ if test "$_gtk1" = yes ; then fi fi _glib=`$_glibconfig --version 2>&1` - _libs_mplayer="$_libs_mplayer `$_glibconfig --libs 2>&1`" + libs_mplayer="$libs_mplayer `$_glibconfig --libs 2>&1`" echores "$_glib (using $_glibconfig)" def_gui='#define CONFIG_GUI 1' @@ -7794,7 +7802,7 @@ fi else #if ! win32 _gui_win32=yes - _libs_mplayer="$_libs_mplayer -lcomdlg32 -lcomctl32 -lshell32 -lkernel32" + libs_mplayer="$libs_mplayer -lcomdlg32 -lcomctl32 -lshell32 -lkernel32" def_gui='#define CONFIG_GUI 1' def_gtk2='#undef CONFIG_GTK2' fi #if ! win32 @@ -7844,7 +7852,7 @@ cat > $TMPC <<EOF int main(void) { return 0; } EOF if cc_check -Wl,-z,noexecstack ; then - _ld_extra="-Wl,-z,noexecstack $_ld_extra" + extra_ldflags="-Wl,-z,noexecstack $extra_ldflags" echores "yes" else echores "no" @@ -7859,9 +7867,9 @@ if test "$_real" = yes || test "$_xanim" = yes && ! win32 && ! qnx && ! darwin & _ld_dl_dynamic='-rdynamic' fi -_ld_extra="$_ld_extra $_ld_pthread $_ld_dl $_ld_dl_dynamic" -bsdos && _ld_extra="$_ld_extra -ldvd" -(netbsd || openbsd) && x86_32 && _ld_extra="$_ld_extra -li386" +extra_ldflags="$extra_ldflags $_ld_pthread $_ld_dl $_ld_dl_dynamic" +bsdos && extra_ldflags="$extra_ldflags -ldvd" +(netbsd || openbsd) && x86_32 && extra_ldflags="$extra_ldflags -li386" def_debug='#undef MP_DEBUG' test "$_debug" != "" && def_debug='#define MP_DEBUG 1' @@ -7891,7 +7899,7 @@ EOF fi if test "$_lirc" = yes ; then def_lirc='#define CONFIG_LIRC 1' - _ld_extra="$_ld_extra -llirc_client" + extra_ldflags="$extra_ldflags -llirc_client" else def_lirc='#undef CONFIG_LIRC' fi @@ -7908,7 +7916,7 @@ EOF fi if test "$_lircc" = yes ; then def_lircc='#define CONFIG_LIRCC 1' - _ld_extra="$_ld_extra -llircc" + extra_ldflags="$extra_ldflags -llircc" else def_lircc='#undef CONFIG_LIRCC' fi @@ -7928,8 +7936,8 @@ EOF fi if test "$_maemo" = yes ; then def_maemo='#define CONFIG_MAEMO 1' - _inc_extra="$_inc_extra `$_pkg_config --cflags libosso`" - _ld_extra="$_ld_extra `$_pkg_config --libs libosso` -lXsp" + extra_cflags="$extra_cflags `$_pkg_config --cflags libosso`" + extra_ldflags="$extra_ldflags `$_pkg_config --libs libosso` -lXsp" else def_maemo='#undef CONFIG_MAEMO' fi @@ -7942,20 +7950,20 @@ fi # the OMF format needs to come after the 'extern symbol prefix' check, which # uses nm. if os2 ; then - _ld_extra="$_ld_extra -Zomf -Zstack 16384 -Zbin-files -Zargs-wild" + extra_ldflags="$extra_ldflags -Zomf -Zstack 16384 -Zbin-files -Zargs-wild" fi # linker paths should be the same for mencoder and mplayer _ld_tmp="" -for I in $_libs_mplayer ; do +for I in $libs_mplayer ; do _tmp=`echo $I | sed -e 's/^-L.*$//'` if test -z "$_tmp" ; then - _ld_extra="$_ld_extra $I" + extra_ldflags="$extra_ldflags $I" else _ld_tmp="$_ld_tmp $I" fi done -_libs_mplayer=$_ld_tmp +libs_mplayer=$_ld_tmp ############################################################################# @@ -8037,8 +8045,8 @@ if test "$_dvdnav" = yes ; then cflags_libdvdnav="-Ilibdvdnav" _inputmodules="dvdnav(internal) $_inputmodules" else - _inc_extra="$_inc_extra `$_dvdnavconfig --cflags`" - _ld_extra="$_ld_extra `$_dvdnavconfig --minilibs`" + extra_cflags="$extra_cflags `$_dvdnavconfig --cflags`" + extra_ldflags="$extra_ldflags `$_dvdnavconfig --minilibs`" _inputmodules="dvdnav $_inputmodules" fi else @@ -8086,12 +8094,10 @@ INSTALLSTRIP = $_install_strip RANLIB = $_ranlib WINDRES = $_windres -EXTRA_INC = $_inc_extra -EXTRAXX_INC = $_inc_extra $_inc_extraxx -CFLAGS = $CFLAGS \$(EXTRA_INC) -OPTFLAGS = $CFLAGS \$(EXTRA_INC) -FFMPEG_OFLAGS = $CFLAGS_FFMPEG \$(EXTRA_INC) -CXXFLAGS = $CXXFLAGS \$(EXTRAXX_INC) +CFLAGS = $CFLAGS $extra_cflags +OPTFLAGS = $CFLAGS $extra_cflags +FFMPEG_OFLAGS = $CFLAGS_FFMPEG $extra_cflags +CXXFLAGS = $CXXFLAGS $extra_cflags $extra_cxxflags CFLAGS_DHAHELPER = $cflags_dhahelper CFLAGS_FAAD_FIXED = $cflags_faad_fixed CFLAGS_LIBDVDCSS = $cflags_libdvdcss @@ -8103,10 +8109,10 @@ CFLAGS_SVGALIB_HELPER = $cflags_svgalib_helper CFLAGS_TREMOR_LOW = $cflags_tremor_low YASMFLAGS = $YASMFLAGS -EXTRALIBS = $_extra_libs -EXTRA_LIB = $_ld_extra $_ld_static $_ld_lm -EXTRALIBS_MPLAYER = $_libs_mplayer -EXTRALIBS_MENCODER = $_libs_mencoder +EXTRALIBS = $extra_libs +EXTRA_LIB = $extra_ldflags $_ld_static $_ld_lm +EXTRALIBS_MPLAYER = $libs_mplayer +EXTRALIBS_MENCODER = $libs_mencoder DEPEND_CMD = \$(CC) -MM \$(CFLAGS) \$(filter-out %.h,\$^) | sed "s,[0-9a-z._-]*: \(\$(SRC_DIR)/\)*\([a-z0-9]*/\)[^/]* ,\\2&," @@ -8786,11 +8792,13 @@ $def_yasm #define CONFIG_POWERPC_PERF 0 #define CONFIG_SMALL 0 #define CONFIG_SWSCALE 1 +#define CONFIG_SWSCALE_ALPHA 1 #define HAVE_GETHRTIME 0 #define HAVE_INLINE_ASM 0 #define HAVE_POLL_H 1 #define HAVE_PPC4XX 0 +#define HAVE_VIRTUALALLOC 0 /* Some FFmpeg codecs depend on these. Enable them unconditionally for now. */ #define CONFIG_AANDCT 1 diff --git a/cpudetect.c b/cpudetect.c index 84ae527089..62afe5895e 100644 --- a/cpudetect.c +++ b/cpudetect.c @@ -44,20 +44,15 @@ static void check_os_katmai_support( void ); // return TRUE if cpuid supported static int has_cpuid(void) { - long a, c; - // code from libavcodec: #if ARCH_X86_64 -#define PUSHF "pushfq\n\t" -#define POPF "popfq\n\t" + return 1; #else -#define PUSHF "pushfl\n\t" -#define POPF "popfl\n\t" -#endif + long a, c; __asm__ volatile ( /* See if CPUID instruction is supported ... */ /* ... Get copies of EFLAGS into eax and ecx */ - PUSHF + "pushfl\n\t" "pop %0\n\t" "mov %0, %1\n\t" @@ -65,19 +60,18 @@ static int has_cpuid(void) /* to the EFLAGS reg */ "xor $0x200000, %0\n\t" "push %0\n\t" - POPF + "popfl\n\t" /* ... Get the (hopefully modified) EFLAGS */ - PUSHF + "pushfl\n\t" "pop %0\n\t" : "=a" (a), "=c" (c) : : "cc" ); -#undef PUSHF -#undef POPF return a != c; +#endif } static void @@ -277,7 +271,7 @@ static void sigill_handler_sse( int signal, struct sigcontext sc ) } #endif /* __linux__ && _POSIX_SOURCE */ -#if defined(__MINGW32__) || defined(__CYGWIN__) +#if (defined(__MINGW32__) || defined(__CYGWIN__)) && !ARCH_X86_64 LONG CALLBACK win32_sig_handler_sse(EXCEPTION_POINTERS* ep) { if(ep->ExceptionRecord->ExceptionCode==EXCEPTION_ILLEGAL_INSTRUCTION){ diff --git a/cpudetect.h b/cpudetect.h index f31bf07dff..5ac4633582 100644 --- a/cpudetect.h +++ b/cpudetect.h @@ -8,33 +8,7 @@ #define CPUTYPE_I586 5 #define CPUTYPE_I686 6 -#if ARCH_X86_64 -# define REGa rax -# define REGb rbx -# define REGBP rbp -# define REGSP rsp -# define REG_a "rax" -# define REG_b "rbx" -# define REG_c "rcx" -# define REG_d "rdx" -# define REG_S "rsi" -# define REG_D "rdi" -# define REG_SP "rsp" -# define REG_BP "rbp" -#else -# define REGa eax -# define REGb ebx -# define REGBP ebp -# define REGSP esp -# define REG_a "eax" -# define REG_b "ebx" -# define REG_c "ecx" -# define REG_d "edx" -# define REG_S "esi" -# define REG_D "edi" -# define REG_SP "esp" -# define REG_BP "ebp" -#endif +#include "libavutil/x86_cpu.h" typedef struct cpucaps_s { int cpuType; @@ -8,15 +8,6 @@ #include <string.h> #include <unistd.h> -#if defined(__MINGW32__) && (__MINGW32_MAJOR_VERSION <= 3) && (__MINGW32_MINOR_VERSION < 10) && !defined(MINGW64) -#include <sys/timeb.h> -void gettimeofday(struct timeval* t,void* timezone) { - struct timeb timebuffer; - ftime( &timebuffer ); - t->tv_sec=timebuffer.time; - t->tv_usec=1000*timebuffer.millitm; -} -#endif #ifdef __MINGW32__ #define MISSING_USLEEP #include <windows.h> @@ -195,6 +186,8 @@ main(void) char *desc; } cap2[] = { CPUID_FEATURE_DEF(0, "pni", "SSE3 Extensions"), + CPUID_FEATURE_DEF(1, "pclmulqdq", "Carryless Multiplication"), + CPUID_FEATURE_DEF(2, "dtes64", "64-bit Debug Store"), CPUID_FEATURE_DEF(3, "monitor", "MONITOR/MWAIT"), CPUID_FEATURE_DEF(4, "ds_cpl", "CPL Qualified Debug Store"), CPUID_FEATURE_DEF(5, "vmx", "Virtual Machine Extensions"), @@ -203,13 +196,20 @@ main(void) CPUID_FEATURE_DEF(8, "tm2", "Thermal Monitor 2"), CPUID_FEATURE_DEF(9, "ssse3", "Supplemental SSE3"), CPUID_FEATURE_DEF(10, "cid", "L1 Context ID"), + CPUID_FEATURE_DEF(12, "fma", "Fused Multiply Add"), CPUID_FEATURE_DEF(13, "cx16", "CMPXCHG16B Available"), CPUID_FEATURE_DEF(14, "xtpr", "xTPR Disable"), CPUID_FEATURE_DEF(15, "pdcm", "Perf/Debug Capability MSR"), CPUID_FEATURE_DEF(18, "dca", "Direct Cache Access"), CPUID_FEATURE_DEF(19, "sse4_1", "SSE4.1 Extensions"), CPUID_FEATURE_DEF(20, "sse4_2", "SSE4.2 Extensions"), + CPUID_FEATURE_DEF(21, "x2apic", "x2APIC Feature"), + CPUID_FEATURE_DEF(22, "movbe", "MOVBE Instruction"), CPUID_FEATURE_DEF(23, "popcnt", "Pop Count Instruction"), + CPUID_FEATURE_DEF(25, "aes", "AES Instruction"), + CPUID_FEATURE_DEF(26, "xsave", "XSAVE/XRSTOR Extensions"), + CPUID_FEATURE_DEF(27, "osxsave", "XSAVE/XRSTOR Enabled in the OS"), + CPUID_FEATURE_DEF(28, "avx", "Advanced Vector Extension"), { -1 } }; static struct { @@ -236,7 +236,7 @@ main(void) CPUID_FEATURE_DEF(1, "cmp_legacy", "Chip Multi-Core"), CPUID_FEATURE_DEF(2, "svm", "Secure Virtual Machine"), CPUID_FEATURE_DEF(3, "extapic", "Extended APIC Space"), - CPUID_FEATURE_DEF(4, "cr8legacy", "CR8 Available in Legacy Mode"), + CPUID_FEATURE_DEF(4, "cr8_legacy", "CR8 Available in Legacy Mode"), CPUID_FEATURE_DEF(5, "abm", "Advanced Bit Manipulation"), CPUID_FEATURE_DEF(6, "sse4a", "SSE4A Extensions"), CPUID_FEATURE_DEF(7, "misalignsse", "Misaligned SSE Mode"), @@ -290,11 +290,11 @@ main(void) have to check the family, model and stepping instead. */ if (strstr(idstr, "AMD") && family == 5 && - (model >= 9 || model == 8 && stepping >= 8)) + (model >= 9 || (model == 8 && stepping >= 8))) printf(" %s", "k6_mtrr"); /* similar for cyrix_arr. */ if (strstr(idstr, "Cyrix") && - (family == 5 && model < 4 || family == 6)) + (family == 5 && (model < 4 || family == 6))) printf(" %s", "cyrix_arr"); /* as well as centaur_mcr. */ if (strstr(idstr, "Centaur") && diff --git a/debian/control b/debian/control index 30f00aa24f..cef6880d0b 100644 --- a/debian/control +++ b/debian/control @@ -7,7 +7,7 @@ Build-Depends: libgtk1.2-dev | libgtk2.0-dev, libpng12-dev, zlib1g-dev, x11proto Package: mplayer Architecture: any -Depends: ${shlibs:Depends},debconf,libconfhelper-perl +Depends: ${shlibs:Depends},debconf Description: The Ultimate Movie Player MPlayer is a movie player for LINUX (runs on many other Unices, and non-x86 CPUs, see the ports section). It plays most MPEG, VOB, AVI, OGG/OGM, VIVO, diff --git a/debian/postinst b/debian/postinst deleted file mode 100755 index e8fb6367ab..0000000000 --- a/debian/postinst +++ /dev/null @@ -1,58 +0,0 @@ -#!/usr/bin/perl -w - -# mplayer postinst - -require ConfHelper; - -use Debconf::Client::ConfModule qw(:all); -use IO::Handle; -use Fcntl; -my $version = version(2.0); -my $didupgrade = 0; - -dealwithupgrades(); - -my $mcfg = new ConfHelper('mplayer', "/etc/mplayer/mplayer.conf"); - - - -my $dcarea = "" ; -my $font = scalar(get("mplayer/ttfont")) ; - $dcarea .= "#truetype font\nfont=" . $font . "\n" if $font; -$mcfg->setconfarea($dcarea); - - - -sub dealwithupgrades { - open(OLDCONF, "</etc/mplayer/mplayer.conf") || return 1; - close OLDCONF; - - my $mconf = new ConfHelper("mplayer", "/etc/mplayer/mplayer.conf"); - return 1 if ($mconf->hasconfarea()); - undef $mconf; - - if ((get('mplayer/replace-existing-files') eq 'true') && - (fget('mplayer/replace-existing-files', 'isdefault') eq 'false')) { - $didupgrade = 1; - for my $file ("/etc/mplayer/mplayer.conf" ) { - debug("Moving away $file"); - rename($file,$file . ".old"); - } - } else { - debug("Upgrade refused, exiting"); - exit 0; - } -} - -sub debug { - print STDERR @_, "\n"; -} - - -# pass control to debhelper scripts.. -# -my $temp="set -e\nset -- @ARGV\n" . << 'DEBHELPER_EOF_'; -#DEBHELPER# -DEBHELPER_EOF_ -system ($temp) / 256 == 0 - or die "Problem with debhelper scripts: $!"; diff --git a/defaultopts.c b/defaultopts.c index 2f77b16fcd..fd53979d80 100644 --- a/defaultopts.c +++ b/defaultopts.c @@ -46,7 +46,7 @@ void set_default_mplayer_options(struct MPOpts *opts) #else .use_ar = 0, #endif - .default_binds = 1, + .default_bindings = 1, } }; } diff --git a/etc/codecs.conf b/etc/codecs.conf index 1b7dd58d22..1c51043940 100644 --- a/etc/codecs.conf +++ b/etc/codecs.conf @@ -1520,24 +1520,11 @@ videocodec indeo3xa ; DV: qdv is more stable... libdv is slow, mcdv is unstable -videocodec qdv - info "Sony Digital Video (DV)" - status working - fourcc dvsl,dvsd,dvhd ; ???? - fourcc DVSD dvsd ; pal .avi - fourcc "dvcp" dvsd ; pal .mov - fourcc "dvc " dvsd ; ntsc .mov - driver dshow - dll "qdv.dll" - guid 0xB1B77C00, 0xC3E4, 0x11CF, 0xAF, 0x79, 0x00, 0xAA, 0x00, 0xB6, 0x7A, 0x42 - out YUY2 - out UYVY - out BGR24,BGR16,BGR15 ; BGR32 is buggy, at least with one sample - videocodec ffdv info "FFmpeg DV" status working fourcc CDVC,cdvc + fourcc CDVH,cdvh ; Canopus DVCPRO HD fourcc DVSD,dvsd ; PAL fourcc DVCS,dvcs ; NTSC ? fourcc "dvcp" ; PAL DV in .mov @@ -1554,6 +1541,20 @@ videocodec ffdv dll dvvideo out 411P,422P,YV12 +videocodec qdv + info "Sony Digital Video (DV)" + status working + fourcc dvsl,dvsd,dvhd ; ???? + fourcc DVSD dvsd ; pal .avi + fourcc "dvcp" dvsd ; pal .mov + fourcc "dvc " dvsd ; ntsc .mov + driver dshow + dll "qdv.dll" + guid 0xB1B77C00, 0xC3E4, 0x11CF, 0xAF, 0x79, 0x00, 0xAA, 0x00, 0xB6, 0x7A, 0x42 + out YUY2 + out UYVY + out BGR24,BGR16,BGR15 ; BGR32 is buggy, at least with one sample + videocodec libdv info "Raw DV (libdv)" status working @@ -3036,6 +3037,7 @@ audiocodec ffqclp info "FFmpeg QCLP audio" status buggy format 0x706C6351 ; "Qclp" + format 0x70637173 ; "sqcp" driver ffmpeg dll "qcelp" diff --git a/fmt-conversion.c b/fmt-conversion.c index ddedbb11c7..bcfb56a415 100644 --- a/fmt-conversion.c +++ b/fmt-conversion.c @@ -28,6 +28,7 @@ static const struct { {IMGFMT_BGR32, PIX_FMT_RGB32}, {IMGFMT_BGR24, PIX_FMT_BGR24}, {IMGFMT_BGR16, PIX_FMT_RGB565}, + {IMGFMT_BGR15, PIX_FMT_RGB555}, {IMGFMT_BGR8, PIX_FMT_RGB8}, {IMGFMT_BGR4, PIX_FMT_RGB4}, {IMGFMT_BGR1, PIX_FMT_MONOBLACK}, diff --git a/help/help_mp-ru.h b/help/help_mp-ru.h index 97152a4bf8..d997bf1347 100644 --- a/help/help_mp-ru.h +++ b/help/help_mp-ru.h @@ -2,7 +2,7 @@ // Dmitry Baryshkov <mitya@school.ioffe.ru> // Reworked by: Andrew Savchenko aka Bircoph <Bircoph[at]list[dot]ru> -// Synced with help_mp-en.h: r28122 +// Synced with help_mp-en.h: r28860 // ========================= MPlayer help =========================== diff --git a/input/input.c b/input/input.c index 66c245071d..9296a714e5 100644 --- a/input/input.c +++ b/input/input.c @@ -583,7 +583,7 @@ struct input_ctx { unsigned int num_key_down; unsigned int last_key_down; - bool default_binds; + bool default_bindings; // List of command binding sections mp_cmd_bind_section_t *cmd_bind_sections; // Name of currently used command section @@ -623,8 +623,8 @@ static const m_option_t input_conf[] = { OPT_STRING("js-dev", input.js_dev, CONF_GLOBAL), OPT_STRING("ar-dev", input.ar_dev, CONF_GLOBAL), OPT_STRING("file", input.in_file, CONF_GLOBAL), - OPT_FLAG_ON("default-binds", input.default_binds, CONF_GLOBAL), - OPT_FLAG_OFF("nodefault-binds", input.default_binds, CONF_GLOBAL), + OPT_FLAG_ON("default-bindings", input.default_bindings, CONF_GLOBAL), + OPT_FLAG_OFF("nodefault-bindings", input.default_bindings, CONF_GLOBAL), { NULL, NULL, 0, 0, 0, 0, NULL} }; @@ -1063,7 +1063,7 @@ static mp_cmd_t *get_cmd_from_keys(struct input_ctx *ictx, int n, int *keys, cmd = find_bind_for_key(ictx->cmd_binds, n, keys); if (ictx->cmd_binds_default && cmd == NULL) cmd = find_bind_for_key(ictx->cmd_binds_default, n, keys); - if (ictx->default_binds && cmd == NULL) + if (ictx->default_bindings && cmd == NULL) cmd = find_bind_for_key(def_cmd_binds,n,keys); if(cmd == NULL) { @@ -1698,7 +1698,7 @@ struct input_ctx *mp_input_init(struct input_conf *input_conf, int use_gui) .ar_state = -1, .ar_delay = input_conf->ar_delay, .ar_rate = input_conf->ar_rate, - .default_binds = input_conf->default_binds, + .default_bindings = input_conf->default_bindings, }; char* file; diff --git a/libaf/af.c b/libaf/af.c index 1f7a1b0be8..33819c71a5 100644 --- a/libaf/af.c +++ b/libaf/af.c @@ -91,9 +91,6 @@ static af_info_t* filter_list[]={ NULL }; -// Message printing -af_msg_cfg_t af_msg_cfg={0,NULL,NULL}; - // CPU speed int* af_cpu_speed = NULL; @@ -107,7 +104,7 @@ static af_info_t* af_find(char*name) return filter_list[i]; i++; } - af_msg(AF_MSG_ERROR,"Couldn't find audio filter '%s'\n",name); + mp_msg(MSGT_AFILTER, MSGL_ERR, "Couldn't find audio filter '%s'\n",name); return NULL; } @@ -135,7 +132,7 @@ static af_instance_t* af_create(af_stream_t* s, const char* name_with_cmd) // Allocate space for the new filter and reset all pointers af_instance_t* new=malloc(sizeof(af_instance_t)); if (!name || !new) { - af_msg(AF_MSG_ERROR,"[libaf] Could not allocate memory\n"); + mp_msg(MSGT_AFILTER, MSGL_ERR, "[libaf] Could not allocate memory\n"); goto err_out; } memset(new,0,sizeof(af_instance_t)); @@ -151,13 +148,13 @@ static af_instance_t* af_create(af_stream_t* s, const char* name_with_cmd) non-reentrant */ if(new->info->flags & AF_FLAGS_NOT_REENTRANT){ if(af_get(s,name)){ - af_msg(AF_MSG_ERROR,"[libaf] There can only be one instance of" + mp_msg(MSGT_AFILTER, MSGL_ERR, "[libaf] There can only be one instance of" " the filter '%s' in each stream\n",name); goto err_out; } } - af_msg(AF_MSG_VERBOSE,"[libaf] Adding filter %s \n",name); + mp_msg(MSGT_AFILTER, MSGL_V, "[libaf] Adding filter %s \n",name); // Initialize the new filter if(AF_OK == new->info->open(new) && @@ -172,7 +169,7 @@ static af_instance_t* af_create(af_stream_t* s, const char* name_with_cmd) err_out: free(new); - af_msg(AF_MSG_ERROR,"[libaf] Couldn't create or open audio filter '%s'\n", + mp_msg(MSGT_AFILTER, MSGL_ERR, "[libaf] Couldn't create or open audio filter '%s'\n", name); free(name); return NULL; @@ -232,7 +229,7 @@ void af_remove(af_stream_t* s, af_instance_t* af) if(!af) return; // Print friendly message - af_msg(AF_MSG_VERBOSE,"[libaf] Removing filter %s \n",af->info->name); + mp_msg(MSGT_AFILTER, MSGL_V, "[libaf] Removing filter %s \n",af->info->name); // Notify filter before changing anything af->control(af,AF_CONTROL_PRE_DESTROY,0); @@ -321,14 +318,14 @@ static int af_reinit(af_stream_t* s, af_instance_t* af) return rv; } if(!new){ // Should _never_ happen - af_msg(AF_MSG_ERROR,"[libaf] Unable to correct audio format. " + mp_msg(MSGT_AFILTER, MSGL_ERR, "[libaf] Unable to correct audio format. " "This error should never uccur, please send bugreport.\n"); return AF_ERROR; } af=new->next; } else { - af_msg(AF_MSG_ERROR, "[libaf] Automatic filter insertion disabled " + mp_msg(MSGT_AFILTER, MSGL_ERR, "[libaf] Automatic filter insertion disabled " "but formats do not match. Giving up.\n"); return AF_ERROR; } @@ -347,7 +344,7 @@ static int af_reinit(af_stream_t* s, af_instance_t* af) break; } default: - af_msg(AF_MSG_ERROR,"[libaf] Reinitialization did not work, audio" + mp_msg(MSGT_AFILTER, MSGL_ERR, "[libaf] Reinitialization did not work, audio" " filter '%s' returned error code %i\n",af->info->name,rv); return AF_ERROR; } @@ -498,7 +495,7 @@ int af_init(af_stream_t* s) (s->last->data->nch != s->output.nch) || (s->last->data->rate != s->output.rate)) { // Something is stuffed audio out will not work - af_msg(AF_MSG_ERROR,"[libaf] Unable to setup filter system can not" + mp_msg(MSGT_AFILTER, MSGL_ERR, "[libaf] Unable to setup filter system can not" " meet sound-card demands, please send bugreport. \n"); af_uninit(s); return -1; @@ -589,7 +586,7 @@ int af_resize_local_buffer(af_instance_t* af, af_data_t* data) { // Calculate new length register int len = af_lencalc(af->mul,data); - af_msg(AF_MSG_VERBOSE,"[libaf] Reallocating memory in module %s, " + mp_msg(MSGT_AFILTER, MSGL_V, "[libaf] Reallocating memory in module %s, " "old len = %i, new len = %i\n",af->info->name,af->data->len,len); // If there is a buffer free it if(af->data->audio) @@ -597,7 +594,7 @@ int af_resize_local_buffer(af_instance_t* af, af_data_t* data) // Create new buffer and check that it is OK af->data->audio = malloc(len); if(!af->data->audio){ - af_msg(AF_MSG_FATAL,"[libaf] Could not allocate memory \n"); + mp_msg(MSGT_AFILTER, MSGL_FATAL, "[libaf] Could not allocate memory \n"); return AF_ERROR; } af->data->len=len; @@ -619,12 +616,12 @@ af_instance_t *af_control_any_rev (af_stream_t* s, int cmd, void* arg) { void af_help (void) { int i = 0; - af_msg(AF_MSG_INFO, "Available audio filters:\n"); + mp_msg(MSGT_AFILTER, MSGL_INFO, "Available audio filters:\n"); while (filter_list[i]) { if (filter_list[i]->comment && filter_list[i]->comment[0]) - af_msg(AF_MSG_INFO, " %-15s: %s (%s)\n", filter_list[i]->name, filter_list[i]->info, filter_list[i]->comment); + mp_msg(MSGT_AFILTER, MSGL_INFO, " %-15s: %s (%s)\n", filter_list[i]->name, filter_list[i]->info, filter_list[i]->comment); else - af_msg(AF_MSG_INFO, " %-15s: %s\n", filter_list[i]->name, filter_list[i]->info); + mp_msg(MSGT_AFILTER, MSGL_INFO, " %-15s: %s\n", filter_list[i]->name, filter_list[i]->info); i++; } } diff --git a/libaf/af.h b/libaf/af.h index f5967d8bee..487c635a97 100644 --- a/libaf/af.h +++ b/libaf/af.h @@ -22,9 +22,18 @@ #include <stdio.h> #include "config.h" -#include "af_mp.h" -#include "control.h" + #include "af_format.h" +#include "control.h" +#include "cpudetect.h" +#include "mp_msg.h" + +/* Set the initialization type from mplayers cpudetect */ +#ifdef AF_INIT_TYPE +#undef AF_INIT_TYPE +#define AF_INIT_TYPE \ + ((gCpuCaps.has3DNow || gCpuCaps.hasSSE)?AF_INIT_FAST:AF_INIT_SLOW) +#endif struct af_instance_s; @@ -342,34 +351,4 @@ void af_fix_parameters(af_data_t *data); #define lrnd(a,b) ((b)((a)>=0.0?(a)+0.5:(a)-0.5)) #endif -/* Error messages */ - -typedef struct af_msg_cfg_s -{ - int level; /* Message level for debug and error messages max = 2 - min = -2 default = 0 */ - FILE* err; // Stream to print error messages to - FILE* msg; // Stream to print information messages to -}af_msg_cfg_t; - -extern af_msg_cfg_t af_msg_cfg; // Message - -//! \addtogroup af_filter -//! \{ -#define AF_MSG_FATAL -3 ///< Fatal error exit immediately -#define AF_MSG_ERROR -2 ///< Error return gracefully -#define AF_MSG_WARN -1 ///< Print warning but do not exit (can be suppressed) -#define AF_MSG_INFO 0 ///< Important information -#define AF_MSG_VERBOSE 1 ///< Print this if verbose is enabled -#define AF_MSG_DEBUG0 2 ///< Print if very verbose -#define AF_MSG_DEBUG1 3 ///< Print if very very verbose - -//! Macro for printing error messages -#ifndef af_msg -#define af_msg(lev, args... ) \ -(((lev)<AF_MSG_WARN)?(fprintf(af_msg_cfg.err?af_msg_cfg.err:stderr, ## args )): \ -(((lev)<=af_msg_cfg.level)?(fprintf(af_msg_cfg.msg?af_msg_cfg.msg:stdout, ## args )):0)) -#endif -//! \} - #endif /* MPLAYER_AF_H */ diff --git a/libaf/af_center.c b/libaf/af_center.c index c24554436f..5023872447 100644 --- a/libaf/af_center.c +++ b/libaf/af_center.c @@ -62,7 +62,7 @@ static int control(struct af_instance_s* af, int cmd, void* arg) case AF_CONTROL_CENTER_CH | AF_CONTROL_SET: // Requires reinit // Sanity check if((*(int*)arg >= AF_NCH) || (*(int*)arg < 0)){ - af_msg(AF_MSG_ERROR,"[sub] Center channel number must be between " + mp_msg(MSGT_AFILTER, MSGL_ERR, "[sub] Center channel number must be between " " 0 and %i current value is %i\n", AF_NCH-1, *(int*)arg); return AF_ERROR; } diff --git a/libaf/af_channels.c b/libaf/af_channels.c index bc329c9b31..ffed84bfb0 100644 --- a/libaf/af_channels.c +++ b/libaf/af_channels.c @@ -108,7 +108,7 @@ static void copy(void* in, void* out, int ins, int inos,int outs, int outos, int break; } default: - af_msg(AF_MSG_ERROR,"[channels] Unsupported number of bytes/sample: %i" + mp_msg(MSGT_AFILTER, MSGL_ERR, "[channels] Unsupported number of bytes/sample: %i" " please report this error on the MPlayer mailing list. \n",bps); } } @@ -118,14 +118,14 @@ static int check_routes(af_channels_t* s, int nin, int nout) { int i; if((s->nr < 1) || (s->nr > AF_NCH)){ - af_msg(AF_MSG_ERROR,"[channels] The number of routing pairs must be" + mp_msg(MSGT_AFILTER, MSGL_ERR, "[channels] The number of routing pairs must be" " between 1 and %i. Current value is %i\n",AF_NCH,s->nr); return AF_ERROR; } for(i=0;i<s->nr;i++){ if((s->route[i][FR] >= nin) || (s->route[i][TO] >= nout)){ - af_msg(AF_MSG_ERROR,"[channels] Invalid routing in pair nr. %i.\n", i); + mp_msg(MSGT_AFILTER, MSGL_ERR, "[channels] Invalid routing in pair nr. %i.\n", i); return AF_ERROR; } } @@ -180,14 +180,14 @@ static int control(struct af_instance_s* af, int cmd, void* arg) int ch = 0; // Sanity check if((s->nr < 1) || (s->nr > AF_NCH)){ - af_msg(AF_MSG_ERROR,"[channels] The number of routing pairs must be" + mp_msg(MSGT_AFILTER, MSGL_ERR, "[channels] The number of routing pairs must be" " between 1 and %i. Current value is %i\n",AF_NCH,s->nr); } s->router = 1; // Scan for pairs on commandline while((*cp == ':') && (ch < s->nr)){ sscanf(cp, ":%i:%i%n" ,&s->route[ch][FR], &s->route[ch][TO], &n); - af_msg(AF_MSG_VERBOSE,"[channels] Routing from channel %i to" + mp_msg(MSGT_AFILTER, MSGL_V, "[channels] Routing from channel %i to" " channel %i\n",s->route[ch][FR],s->route[ch][TO]); cp = &cp[n]; ch++; @@ -203,14 +203,14 @@ static int control(struct af_instance_s* af, int cmd, void* arg) // Sanity check if(((int*)arg)[0] <= 0 || ((int*)arg)[0] > AF_NCH){ - af_msg(AF_MSG_ERROR,"[channels] The number of output channels must be" + mp_msg(MSGT_AFILTER, MSGL_ERR, "[channels] The number of output channels must be" " between 1 and %i. Current value is %i\n",AF_NCH,((int*)arg)[0]); return AF_ERROR; } af->data->nch=((int*)arg)[0]; if(!s->router) - af_msg(AF_MSG_VERBOSE,"[channels] Changing number of channels" + mp_msg(MSGT_AFILTER, MSGL_V, "[channels] Changing number of channels" " to %i\n",af->data->nch); return AF_OK; case AF_CONTROL_CHANNELS | AF_CONTROL_GET: diff --git a/libaf/af_delay.c b/libaf/af_delay.c index f754e736cd..4b94e00066 100644 --- a/libaf/af_delay.c +++ b/libaf/af_delay.c @@ -63,7 +63,7 @@ static int control(struct af_instance_s* af, int cmd, void* arg) for(i=0;i<af->data->nch;i++){ s->q[i] = calloc(L,af->data->bps); if(NULL == s->q[i]) - af_msg(AF_MSG_FATAL,"[delay] Out of memory\n"); + mp_msg(MSGT_AFILTER, MSGL_FATAL, "[delay] Out of memory\n"); } return control(af,AF_CONTROL_DELAY_LEN | AF_CONTROL_SET,s->d); @@ -87,9 +87,9 @@ static int control(struct af_instance_s* af, int cmd, void* arg) return AF_ERROR; s->ri = 0; for(i=0;i<AF_NCH;i++){ - af_msg(AF_MSG_DEBUG0,"[delay] Channel %i delayed by %0.3fms\n", + mp_msg(MSGT_AFILTER, MSGL_DBG2, "[delay] Channel %i delayed by %0.3fms\n", i,clamp(s->d[i],0.0,1000.0)); - af_msg(AF_MSG_DEBUG1,"[delay] Channel %i delayed by %i samples\n", + mp_msg(MSGT_AFILTER, MSGL_DBG3, "[delay] Channel %i delayed by %i samples\n", i,s->wi[i]); } return AF_OK; diff --git a/libaf/af_dummy.c b/libaf/af_dummy.c index 19a765c66d..6e32116b99 100644 --- a/libaf/af_dummy.c +++ b/libaf/af_dummy.c @@ -31,7 +31,7 @@ static int control(struct af_instance_s* af, int cmd, void* arg) switch(cmd){ case AF_CONTROL_REINIT: memcpy(af->data,(af_data_t*)arg,sizeof(af_data_t)); - af_msg(AF_MSG_VERBOSE,"[dummy] Was reinitialized: %iHz/%ich/%s\n", + mp_msg(MSGT_AFILTER, MSGL_V, "[dummy] Was reinitialized: %iHz/%ich/%s\n", af->data->rate,af->data->nch,af_fmt2str_short(af->data->format)); return AF_OK; } @@ -50,7 +50,7 @@ static af_data_t* play(struct af_instance_s* af, af_data_t* data) { // Do something necessary to get rid of annoying warning during compile if(!af) - af_msg(AF_MSG_ERROR,"EEEK: Argument af == NULL in af_dummy.c play()."); + mp_msg(MSGT_AFILTER, MSGL_ERR, "EEEK: Argument af == NULL in af_dummy.c play()."); return data; } diff --git a/libaf/af_equalizer.c b/libaf/af_equalizer.c index e9c95d98b9..519d9aba4c 100644 --- a/libaf/af_equalizer.c +++ b/libaf/af_equalizer.c @@ -107,7 +107,7 @@ static int control(struct af_instance_s* af, int cmd, void* arg) s->K--; if(s->K != KM) - af_msg(AF_MSG_INFO,"[equalizer] Limiting the number of filters to" + mp_msg(MSGT_AFILTER, MSGL_INFO, "[equalizer] Limiting the number of filters to" " %i due to low sample rate.\n",s->K); // Generate filter taps diff --git a/libaf/af_export.c b/libaf/af_export.c index cc32fac42d..59a6e8ec00 100644 --- a/libaf/af_export.c +++ b/libaf/af_export.c @@ -96,15 +96,15 @@ static int control(struct af_instance_s* af, int cmd, void* arg) // Allocate new buffers (as one continuous block) s->buf[0] = calloc(s->sz*af->data->nch, af->data->bps); if(NULL == s->buf[0]) - af_msg(AF_MSG_FATAL, "[export] Out of memory\n"); + mp_msg(MSGT_AFILTER, MSGL_FATAL, "[export] Out of memory\n"); for(i = 1; i < af->data->nch; i++) s->buf[i] = s->buf[0] + i*s->sz*af->data->bps; // Init memory mapping s->fd = open(s->filename, O_RDWR | O_CREAT | O_TRUNC, 0640); - af_msg(AF_MSG_INFO, "[export] Exporting to file: %s\n", s->filename); + mp_msg(MSGT_AFILTER, MSGL_INFO, "[export] Exporting to file: %s\n", s->filename); if(s->fd < 0) - af_msg(AF_MSG_FATAL, "[export] Could not open/create file: %s\n", + mp_msg(MSGT_AFILTER, MSGL_FATAL, "[export] Could not open/create file: %s\n", s->filename); // header + buffer @@ -119,8 +119,8 @@ static int control(struct af_instance_s* af, int cmd, void* arg) // mmap size s->mmap_area = mmap(0, mapsize, PROT_READ|PROT_WRITE,MAP_SHARED, s->fd, 0); if(s->mmap_area == NULL) - af_msg(AF_MSG_FATAL, "[export] Could not mmap file %s\n", s->filename); - af_msg(AF_MSG_INFO, "[export] Memory mapped to file: %s (%p)\n", + mp_msg(MSGT_AFILTER, MSGL_FATAL, "[export] Could not mmap file %s\n", s->filename); + mp_msg(MSGT_AFILTER, MSGL_INFO, "[export] Memory mapped to file: %s (%p)\n", s->filename, s->mmap_area); // Initialize header @@ -160,7 +160,7 @@ static int control(struct af_instance_s* af, int cmd, void* arg) case AF_CONTROL_EXPORT_SZ | AF_CONTROL_SET: s->sz = * (int *) arg; if((s->sz <= 0) || (s->sz > 2048)) - af_msg( AF_MSG_ERROR, "[export] Buffer size must be between" + mp_msg(MSGT_AFILTER, MSGL_ERR, "[export] Buffer size must be between" " 1 and 2048\n" ); return AF_OK; diff --git a/libaf/af_format.c b/libaf/af_format.c index df4dac2841..8917a870a6 100644 --- a/libaf/af_format.c +++ b/libaf/af_format.c @@ -62,7 +62,7 @@ static af_data_t* play_s16_float(struct af_instance_s* af, af_data_t* data); static int check_bps(int bps) { if(bps != 4 && bps != 3 && bps != 2 && bps != 1){ - af_msg(AF_MSG_ERROR,"[format] The number of bytes per sample" + mp_msg(MSGT_AFILTER, MSGL_ERR, "[format] The number of bytes per sample" " must be 1, 2, 3 or 4. Current value is %i \n",bps); return AF_ERROR; } @@ -77,7 +77,7 @@ static int check_format(int format) case(AF_FORMAT_IMA_ADPCM): case(AF_FORMAT_MPEG2): case(AF_FORMAT_AC3): - af_msg(AF_MSG_ERROR,"[format] Sample format %s not yet supported \n", + mp_msg(MSGT_AFILTER, MSGL_ERR, "[format] Sample format %s not yet supported \n", af_fmt2str(format,buf,256)); return AF_ERROR; } @@ -105,7 +105,7 @@ static int control(struct af_instance_s* af, int cmd, void* arg) (AF_OK != check_format(af->data->format))) return AF_ERROR; - af_msg(AF_MSG_VERBOSE,"[format] Changing sample format from %s to %s\n", + mp_msg(MSGT_AFILTER, MSGL_V, "[format] Changing sample format from %s to %s\n", af_fmt2str(data->format,buf1,256), af_fmt2str(af->data->format,buf2,256)); @@ -119,13 +119,13 @@ static int control(struct af_instance_s* af, int cmd, void* arg) if ((af->data->format & ~AF_FORMAT_END_MASK) == (data->format & ~AF_FORMAT_END_MASK)) { - af_msg(AF_MSG_VERBOSE,"[format] Accelerated endianness conversion only\n"); + mp_msg(MSGT_AFILTER, MSGL_V, "[format] Accelerated endianness conversion only\n"); af->play = play_swapendian; } if ((data->format == AF_FORMAT_FLOAT_NE) && (af->data->format == AF_FORMAT_S16_NE)) { - af_msg(AF_MSG_VERBOSE,"[format] Accelerated %s to %s conversion\n", + mp_msg(MSGT_AFILTER, MSGL_V, "[format] Accelerated %s to %s conversion\n", af_fmt2str(data->format,buf1,256), af_fmt2str(af->data->format,buf2,256)); af->play = play_float_s16; @@ -133,7 +133,7 @@ static int control(struct af_instance_s* af, int cmd, void* arg) if ((data->format == AF_FORMAT_S16_NE) && (af->data->format == AF_FORMAT_FLOAT_NE)) { - af_msg(AF_MSG_VERBOSE,"[format] Accelerated %s to %s conversion\n", + mp_msg(MSGT_AFILTER, MSGL_V, "[format] Accelerated %s to %s conversion\n", af_fmt2str(data->format,buf1,256), af_fmt2str(af->data->format,buf2,256)); af->play = play_s16_float; @@ -143,7 +143,7 @@ static int control(struct af_instance_s* af, int cmd, void* arg) case AF_CONTROL_COMMAND_LINE:{ int format = af_str2fmt_short(arg); if (format == -1) { - af_msg(AF_MSG_ERROR, "[format] %s is not a valid format\n", (char *)arg); + mp_msg(MSGT_AFILTER, MSGL_ERR, "[format] %s is not a valid format\n", (char *)arg); return AF_ERROR; } if(AF_OK != af->control(af,AF_CONTROL_FORMAT_FMT | AF_CONTROL_SET,&format)) diff --git a/libaf/af_hrtf.c b/libaf/af_hrtf.c index 6fc6035c08..8f86f5d854 100644 --- a/libaf/af_hrtf.c +++ b/libaf/af_hrtf.c @@ -293,7 +293,7 @@ static int control(struct af_instance_s *af, int cmd, void* arg) if(af->data->rate != 48000) { // automatic samplerate adjustment in the filter chain // is not yet supported. - af_msg(AF_MSG_ERROR, + mp_msg(MSGT_AFILTER, MSGL_ERR, "[hrtf] ERROR: Sampling rate is not 48000 Hz (%d)!\n", af->data->rate); return AF_ERROR; @@ -331,7 +331,7 @@ static int control(struct af_instance_s *af, int cmd, void* arg) s->matrix_mode = 0; break; default: - af_msg(AF_MSG_ERROR, + mp_msg(MSGT_AFILTER, MSGL_ERR, "[hrtf] Mode is neither 'm', 's', nor '0' (%c).\n", mode); return AF_ERROR; @@ -409,29 +409,29 @@ static af_data_t* play(struct af_instance_s *af, af_data_t *data) s->print_flag = 0; switch (s->decode_mode) { case HRTF_MIX_51: - af_msg(AF_MSG_INFO, + mp_msg(MSGT_AFILTER, MSGL_INFO, "[hrtf] Using HRTF to mix %s discrete surround into " "L, R channels\n", s->matrix_mode ? "5+1" : "5"); break; case HRTF_MIX_STEREO: - af_msg(AF_MSG_INFO, + mp_msg(MSGT_AFILTER, MSGL_INFO, "[hrtf] Using HRTF to mix stereo into " "L, R channels\n"); break; case HRTF_MIX_MATRIX2CH: - af_msg(AF_MSG_INFO, + mp_msg(MSGT_AFILTER, MSGL_INFO, "[hrtf] Using active matrix to decode 2 channel " "input, HRTF to mix %s matrix surround into " "L, R channels\n", "3/2"); break; default: - af_msg(AF_MSG_WARN, + mp_msg(MSGT_AFILTER, MSGL_WARN, "[hrtf] bogus decode_mode: %d\n", s->decode_mode); break; } if(s->matrix_mode) - af_msg(AF_MSG_INFO, + mp_msg(MSGT_AFILTER, MSGL_INFO, "[hrtf] Using active matrix to decode rear center " "channel\n"); } @@ -636,7 +636,7 @@ static int af_open(af_instance_t* af) s->print_flag = 1; if (allocate(s) != 0) { - af_msg(AF_MSG_ERROR, "[hrtf] Memory allocation error.\n"); + mp_msg(MSGT_AFILTER, MSGL_ERR, "[hrtf] Memory allocation error.\n"); return AF_ERROR; } @@ -655,13 +655,13 @@ static int af_open(af_instance_t* af) s->cr_ir = cr_filt + (s->cr_o = pulse_detect(cr_filt)); if((s->ba_ir = malloc(s->basslen * sizeof(float))) == NULL) { - af_msg(AF_MSG_ERROR, "[hrtf] Memory allocation error.\n"); + mp_msg(MSGT_AFILTER, MSGL_ERR, "[hrtf] Memory allocation error.\n"); return AF_ERROR; } fc = 2.0 * BASSFILTFREQ / (float)af->data->rate; if(af_filter_design_fir(s->basslen, s->ba_ir, &fc, LP | KAISER, 4 * M_PI) == -1) { - af_msg(AF_MSG_ERROR, "[hrtf] Unable to design low-pass " + mp_msg(MSGT_AFILTER, MSGL_ERR, "[hrtf] Unable to design low-pass " "filter.\n"); return AF_ERROR; } diff --git a/libaf/af_ladspa.c b/libaf/af_ladspa.c index 97b8982503..34cf0a6d19 100644 --- a/libaf/af_ladspa.c +++ b/libaf/af_ladspa.c @@ -1,5 +1,5 @@ /* - * af_ladspa.c, LADSPA plugin loader + * LADSPA plugin loader * * Written by Ivo van Poorten <ivop@euronet.nl> * Copyright (C) 2004, 2005 @@ -212,30 +212,30 @@ static int af_ladspa_parse_plugin(af_ladspa_t *setup) { } if (setup->ninputs == 0) { - af_msg(AF_MSG_WARN, "%s: %s\n", setup->myname, + mp_msg(MSGT_AFILTER, MSGL_WARN, "%s: %s\n", setup->myname, MSGTR_AF_LADSPA_WarnNoInputs); } else if (setup->ninputs == 1) { - af_msg(AF_MSG_VERBOSE, "%s: this is a mono effect\n", setup->myname); + mp_msg(MSGT_AFILTER, MSGL_V, "%s: this is a mono effect\n", setup->myname); } else if (setup->ninputs == 2) { - af_msg(AF_MSG_VERBOSE, "%s: this is a stereo effect\n", setup->myname); + mp_msg(MSGT_AFILTER, MSGL_V, "%s: this is a stereo effect\n", setup->myname); } else { - af_msg(AF_MSG_VERBOSE, "%s: this is a %i-channel effect, " + mp_msg(MSGT_AFILTER, MSGL_V, "%s: this is a %i-channel effect, " "support is experimental\n", setup->myname, setup->ninputs); } if (setup->noutputs == 0) { - af_msg(AF_MSG_ERROR, "%s: %s\n", setup->myname, + mp_msg(MSGT_AFILTER, MSGL_ERR, "%s: %s\n", setup->myname, MSGTR_AF_LADSPA_ErrNoOutputs); return AF_ERROR; } if (setup->noutputs != setup->ninputs ) { - af_msg(AF_MSG_ERROR, "%s: %s\n", setup->myname, + mp_msg(MSGT_AFILTER, MSGL_ERR, "%s: %s\n", setup->myname, MSGTR_AF_LADSPA_ErrInOutDiff); return AF_ERROR; } - af_msg(AF_MSG_VERBOSE, "%s: this plugin has %d input control(s)\n", + mp_msg(MSGT_AFILTER, MSGL_V, "%s: this plugin has %d input control(s)\n", setup->myname, setup->ninputcontrols); /* Print list of controls and its range of values it accepts */ @@ -243,18 +243,18 @@ static int af_ladspa_parse_plugin(af_ladspa_t *setup) { for (i=0; i<setup->ninputcontrols; i++) { p = setup->inputcontrolsmap[i]; hint = pdes->PortRangeHints[p]; - af_msg(AF_MSG_VERBOSE, " --- %d %s [", i, pdes->PortNames[p]); + mp_msg(MSGT_AFILTER, MSGL_V, " --- %d %s [", i, pdes->PortNames[p]); if (LADSPA_IS_HINT_BOUNDED_BELOW(hint.HintDescriptor)) { - af_msg(AF_MSG_VERBOSE, "%0.2f , ", hint.LowerBound); + mp_msg(MSGT_AFILTER, MSGL_V, "%0.2f , ", hint.LowerBound); } else { - af_msg(AF_MSG_VERBOSE, "... , "); + mp_msg(MSGT_AFILTER, MSGL_V, "... , "); } if (LADSPA_IS_HINT_BOUNDED_ABOVE(hint.HintDescriptor)) { - af_msg(AF_MSG_VERBOSE, "%0.2f]\n", hint.UpperBound); + mp_msg(MSGT_AFILTER, MSGL_V, "%0.2f]\n", hint.UpperBound); } else { - af_msg(AF_MSG_VERBOSE, "...]\n"); + mp_msg(MSGT_AFILTER, MSGL_V, "...]\n"); } } @@ -300,9 +300,9 @@ static void* mydlopen(const char *filename, int flag) { /* For Windows there's only absolute path support. * If you have a Windows machine, feel free to fix this. * (path separator, shared objects extension, et cetera). */ - af_msg(AF_MSG_VERBOSE, "\ton windows, only absolute pathnames " + mp_msg(MSGT_AFILTER, MSGL_V, "\ton windows, only absolute pathnames " "are supported\n"); - af_msg(AF_MSG_VERBOSE, "\ttrying %s\n", filename); + mp_msg(MSGT_AFILTER, MSGL_V, "\ttrying %s\n", filename); return dlopen(filename, flag); #endif @@ -343,7 +343,7 @@ static void* mydlopen(const char *filename, int flag) { } strcpy(buf+needslash+(end-start), filename); - af_msg(AF_MSG_VERBOSE, "\ttrying %s\n", buf); + mp_msg(MSGT_AFILTER, MSGL_V, "\ttrying %s\n", buf); result=dlopen(buf, flag); free(buf); @@ -357,7 +357,7 @@ static void* mydlopen(const char *filename, int flag) { } /* end if there's a ladspapath */ /* last resort, just open it again, so the dlerror() message is correct */ - af_msg(AF_MSG_VERBOSE, "\ttrying %s\n", filename); + mp_msg(MSGT_AFILTER, MSGL_V, "\ttrying %s\n", filename); return dlopen(filename,flag); } @@ -384,18 +384,18 @@ static int af_ladspa_load_plugin(af_ladspa_t *setup) { int i; /* load library */ - af_msg(AF_MSG_VERBOSE, "%s: loading ladspa plugin library %s\n", + mp_msg(MSGT_AFILTER, MSGL_V, "%s: loading ladspa plugin library %s\n", setup->myname, setup->file); setup->libhandle = mydlopen(setup->file, RTLD_NOW); if (!setup->libhandle) { - af_msg(AF_MSG_ERROR, "%s: %s %s\n\t%s\n", setup->myname, + mp_msg(MSGT_AFILTER, MSGL_ERR, "%s: %s %s\n\t%s\n", setup->myname, MSGTR_AF_LADSPA_ErrFailedToLoad, setup->file, dlerror() ); return AF_ERROR; } - af_msg(AF_MSG_VERBOSE, "%s: library found.\n", setup->myname); + mp_msg(MSGT_AFILTER, MSGL_V, "%s: library found.\n", setup->myname); /* find descriptor function */ dlerror(); @@ -403,7 +403,7 @@ static int af_ladspa_load_plugin(af_ladspa_t *setup) { "ladspa_descriptor"); if (!descriptor_function) { - af_msg(AF_MSG_ERROR, "%s: %s\n\t%s\n", setup->myname, + mp_msg(MSGT_AFILTER, MSGL_ERR, "%s: %s\n\t%s\n", setup->myname, MSGTR_AF_LADSPA_ErrNoDescriptor, dlerror()); return AF_ERROR; } @@ -411,33 +411,33 @@ static int af_ladspa_load_plugin(af_ladspa_t *setup) { /* if label == help, list all labels in library and exit */ if (strcmp(setup->label, "help") == 0) { - af_msg(AF_MSG_INFO, "%s: %s %s:\n", setup->myname, + mp_msg(MSGT_AFILTER, MSGL_INFO, "%s: %s %s:\n", setup->myname, MSGTR_AF_LADSPA_AvailableLabels, setup->file); for (i=0; ; i++) { ladspa_descriptor = descriptor_function(i); if (ladspa_descriptor == NULL) { return AF_ERROR; } - af_msg(AF_MSG_INFO, " %-16s - %s (%lu)\n", + mp_msg(MSGT_AFILTER, MSGL_INFO, " %-16s - %s (%lu)\n", ladspa_descriptor->Label, ladspa_descriptor->Name, ladspa_descriptor->UniqueID); } } - af_msg(AF_MSG_VERBOSE, "%s: looking for label\n", setup->myname); + mp_msg(MSGT_AFILTER, MSGL_V, "%s: looking for label\n", setup->myname); /* find label in library */ for (i=0; ; i++) { ladspa_descriptor = descriptor_function(i); if (ladspa_descriptor == NULL) { - af_msg(AF_MSG_ERROR, "%s: %s\n", setup->myname, + mp_msg(MSGT_AFILTER, MSGL_ERR, "%s: %s\n", setup->myname, MSGTR_AF_LADSPA_ErrLabelNotFound); return AF_ERROR; } if (strcmp(ladspa_descriptor->Label, setup->label) == 0) { setup->plugin_descriptor = ladspa_descriptor; - af_msg(AF_MSG_VERBOSE, "%s: %s found\n", setup->myname, + mp_msg(MSGT_AFILTER, MSGL_V, "%s: %s found\n", setup->myname, setup->label); return AF_OK; } @@ -458,7 +458,7 @@ static int af_ladspa_load_plugin(af_ladspa_t *setup) { */ static int af_ladspa_malloc_failed(char *myname) { - af_msg(AF_MSG_ERROR, "%s: %s", myname, MSGTR_MemAllocFailed); + mp_msg(MSGT_AFILTER, MSGL_ERR, "%s: %s", myname, MSGTR_MemAllocFailed); return AF_ERROR; } @@ -493,7 +493,7 @@ static int control(struct af_instance_s *af, int cmd, void *arg) { switch(cmd) { case AF_CONTROL_REINIT: - af_msg(AF_MSG_VERBOSE, "%s: (re)init\n", setup->myname); + mp_msg(MSGT_AFILTER, MSGL_V, "%s: (re)init\n", setup->myname); if (!arg) return AF_ERROR; @@ -512,14 +512,14 @@ static int control(struct af_instance_s *af, int cmd, void *arg) { case AF_CONTROL_COMMAND_LINE: { char *buf; - af_msg(AF_MSG_VERBOSE, "%s: parse suboptions\n", setup->myname); + mp_msg(MSGT_AFILTER, MSGL_V, "%s: parse suboptions\n", setup->myname); /* suboption parser here! * format is (ladspa=)file:label:controls.... */ if (!arg) { - af_msg(AF_MSG_ERROR, "%s: %s\n", setup->myname, + mp_msg(MSGT_AFILTER, MSGL_ERR, "%s: %s\n", setup->myname, MSGTR_AF_LADSPA_ErrNoSuboptions); return AF_ERROR; } @@ -531,7 +531,7 @@ static int control(struct af_instance_s *af, int cmd, void *arg) { buf[0] = '\0'; sscanf(arg, "%[^:]", buf); if (buf[0] == '\0') { - af_msg(AF_MSG_ERROR, "%s: %s\n", setup->myname, + mp_msg(MSGT_AFILTER, MSGL_ERR, "%s: %s\n", setup->myname, MSGTR_AF_LADSPA_ErrNoLibFile); free(buf); return AF_ERROR; @@ -539,7 +539,7 @@ static int control(struct af_instance_s *af, int cmd, void *arg) { arg += strlen(buf); setup->file = strdup(buf); if (!setup->file) return af_ladspa_malloc_failed(setup->myname); - af_msg(AF_MSG_VERBOSE, "%s: file --> %s\n", setup->myname, + mp_msg(MSGT_AFILTER, MSGL_V, "%s: file --> %s\n", setup->myname, setup->file); if (*(char*)arg != '\0') arg++; /* read ':' */ @@ -547,7 +547,7 @@ static int control(struct af_instance_s *af, int cmd, void *arg) { buf[0] = '\0'; sscanf(arg, "%[^:]", buf); if (buf[0] == '\0') { - af_msg(AF_MSG_ERROR, "%s: %s\n", setup->myname, + mp_msg(MSGT_AFILTER, MSGL_ERR, "%s: %s\n", setup->myname, MSGTR_AF_LADSPA_ErrNoLabel); free(buf); return AF_ERROR; @@ -555,7 +555,7 @@ static int control(struct af_instance_s *af, int cmd, void *arg) { arg += strlen(buf); setup->label = strdup(buf); if (!setup->label) return af_ladspa_malloc_failed(setup->myname); - af_msg(AF_MSG_VERBOSE, "%s: label --> %s\n", setup->myname, + mp_msg(MSGT_AFILTER, MSGL_V, "%s: label --> %s\n", setup->myname, setup->label); /* if (*(char*)arg != '0') arg++; */ /* read ':' */ @@ -583,14 +583,14 @@ static int control(struct af_instance_s *af, int cmd, void *arg) { for(i=0; i<setup->ninputcontrols; i++) { if (!arg || (*(char*)arg != ':') ) { - af_msg(AF_MSG_ERROR, "%s: %s\n", setup->myname, + mp_msg(MSGT_AFILTER, MSGL_ERR, "%s: %s\n", setup->myname, MSGTR_AF_LADSPA_ErrNotEnoughControls); return AF_ERROR; } arg++; r = sscanf(arg, "%f", &val); if (r!=1) { - af_msg(AF_MSG_ERROR, "%s: %s\n", setup->myname, + mp_msg(MSGT_AFILTER, MSGL_ERR, "%s: %s\n", setup->myname, MSGTR_AF_LADSPA_ErrNotEnoughControls); return AF_ERROR; } @@ -598,16 +598,16 @@ static int control(struct af_instance_s *af, int cmd, void *arg) { arg = strchr(arg, ':'); } - af_msg(AF_MSG_VERBOSE, "%s: input controls: ", setup->myname); + mp_msg(MSGT_AFILTER, MSGL_V, "%s: input controls: ", setup->myname); for(i=0; i<setup->ninputcontrols; i++) { - af_msg(AF_MSG_VERBOSE, "%0.4f ", + mp_msg(MSGT_AFILTER, MSGL_V, "%0.4f ", setup->inputcontrols[setup->inputcontrolsmap[i]]); } - af_msg(AF_MSG_VERBOSE, "\n"); + mp_msg(MSGT_AFILTER, MSGL_V, "\n"); /* check boundaries of inputcontrols */ - af_msg(AF_MSG_VERBOSE, "%s: checking boundaries of input controls\n", + mp_msg(MSGT_AFILTER, MSGL_V, "%s: checking boundaries of input controls\n", setup->myname); for(i=0; i<setup->ninputcontrols; i++) { int p = setup->inputcontrolsmap[i]; @@ -617,18 +617,18 @@ static int control(struct af_instance_s *af, int cmd, void *arg) { if (LADSPA_IS_HINT_BOUNDED_BELOW(hint.HintDescriptor) && val < hint.LowerBound) { - af_msg(AF_MSG_ERROR, MSGTR_AF_LADSPA_ErrControlBelow, + mp_msg(MSGT_AFILTER, MSGL_ERR, MSGTR_AF_LADSPA_ErrControlBelow, setup->myname, i, hint.LowerBound); return AF_ERROR; } if (LADSPA_IS_HINT_BOUNDED_ABOVE(hint.HintDescriptor) && val > hint.UpperBound) { - af_msg(AF_MSG_ERROR, MSGTR_AF_LADSPA_ErrControlAbove, + mp_msg(MSGT_AFILTER, MSGL_ERR, MSGTR_AF_LADSPA_ErrControlAbove, setup->myname, i, hint.UpperBound); return AF_ERROR; } } - af_msg(AF_MSG_VERBOSE, "%s: all controls have sane values\n", + mp_msg(MSGT_AFILTER, MSGL_V, "%s: all controls have sane values\n", setup->myname); /* All is well! */ @@ -660,7 +660,7 @@ static void uninit(struct af_instance_s *af) { const LADSPA_Descriptor *pdes = setup->plugin_descriptor; if (setup->myname) { - af_msg(AF_MSG_VERBOSE, "%s: cleaning up\n", setup->myname); + mp_msg(MSGT_AFILTER, MSGL_V, "%s: cleaning up\n", setup->myname); free(setup->myname); } @@ -750,7 +750,7 @@ static af_data_t* play(struct af_instance_s *af, af_data_t *data) { */ if (setup->nch != 0) { - af_msg(AF_MSG_DEBUG1, "%s: bufsize change; free old buffer\n", + mp_msg(MSGT_AFILTER, MSGL_DBG3, "%s: bufsize change; free old buffer\n", setup->myname); if(setup->inbufs) { @@ -775,7 +775,7 @@ static af_data_t* play(struct af_instance_s *af, af_data_t *data) { setup->inbufs = calloc(nch, sizeof(float*)); setup->outbufs = calloc(nch, sizeof(float*)); - af_msg(AF_MSG_DEBUG1, "%s: bufsize = %d\n", + mp_msg(MSGT_AFILTER, MSGL_DBG3, "%s: bufsize = %d\n", setup->myname, setup->bufsize); for(i=0; i<nch; i++) { diff --git a/libaf/af_lavcac3enc.c b/libaf/af_lavcac3enc.c index 37a49404e8..36a19dad60 100644 --- a/libaf/af_lavcac3enc.c +++ b/libaf/af_lavcac3enc.c @@ -68,7 +68,7 @@ static int control(struct af_instance_s *af, int cmd, void *arg) else af->mul = (double)AC3_MAX_CODED_FRAME_SIZE / s->expect_len; - af_msg(AF_MSG_DEBUG0, "af_lavcac3enc reinit: %d, %d, %f, %d.\n", + mp_msg(MSGT_AFILTER, MSGL_DBG2, "af_lavcac3enc reinit: %d, %d, %f, %d.\n", data->nch, data->rate, af->mul, s->expect_len); af->data->format = AF_FORMAT_S16_NE; @@ -98,7 +98,7 @@ static int control(struct af_instance_s *af, int cmd, void *arg) s->lavc_actx->bit_rate = bit_rate; if(avcodec_open(s->lavc_actx, s->lavc_acodec) < 0) { - af_msg(AF_MSG_ERROR, MSGTR_CouldntOpenCodec, "ac3", bit_rate); + mp_msg(MSGT_AFILTER, MSGL_ERR, MSGTR_CouldntOpenCodec, "ac3", bit_rate); return AF_ERROR; } } @@ -106,7 +106,7 @@ static int control(struct af_instance_s *af, int cmd, void *arg) af->data->nch = 2; return test_output_res; case AF_CONTROL_COMMAND_LINE: - af_msg(AF_MSG_DEBUG0, "af_lavcac3enc cmdline: %s.\n", (char*)arg); + mp_msg(MSGT_AFILTER, MSGL_DBG2, "af_lavcac3enc cmdline: %s.\n", (char*)arg); s->bit_rate = 0; s->min_channel_num = 0; s->add_iec61937_header = 0; @@ -119,7 +119,7 @@ static int control(struct af_instance_s *af, int cmd, void *arg) if (ff_ac3_bitrate_tab[i] * 1000 == s->bit_rate) break; if (i >= 19) { - af_msg(AF_MSG_WARN, "af_lavcac3enc unable set unsupported " + mp_msg(MSGT_AFILTER, MSGL_WARN, "af_lavcac3enc unable set unsupported " "bitrate %d, use default bitrate (check manpage to see " "supported bitrates).\n", s->bit_rate); s->bit_rate = 0; @@ -127,7 +127,7 @@ static int control(struct af_instance_s *af, int cmd, void *arg) } if (s->min_channel_num == 0) s->min_channel_num = 5; - af_msg(AF_MSG_VERBOSE, "af_lavcac3enc config spdif:%d, bitrate:%d, " + mp_msg(MSGT_AFILTER, MSGL_V, "af_lavcac3enc config spdif:%d, bitrate:%d, " "minchnum:%d.\n", s->add_iec61937_header, s->bit_rate, s->min_channel_num); return AF_OK; @@ -171,13 +171,13 @@ static af_data_t* play(struct af_instance_s* af, af_data_t* data) max_output_len = AC3_MAX_CODED_FRAME_SIZE * frame_num; if (af->data->len < max_output_len) { - af_msg(AF_MSG_VERBOSE,"[libaf] Reallocating memory in module %s, " + mp_msg(MSGT_AFILTER, MSGL_V, "[libaf] Reallocating memory in module %s, " "old len = %i, new len = %i\n", af->info->name, af->data->len, max_output_len); free(af->data->audio); af->data->audio = malloc(max_output_len); if (!af->data->audio) { - af_msg(AF_MSG_FATAL,"[libaf] Could not allocate memory \n"); + mp_msg(MSGT_AFILTER, MSGL_FATAL, "[libaf] Could not allocate memory \n"); return NULL; } af->data->len = max_output_len; @@ -231,7 +231,7 @@ static af_data_t* play(struct af_instance_s* af, af_data_t* data) src += s->expect_len; left -= s->expect_len; } - af_msg(AF_MSG_DEBUG0, "avcodec_encode_audio got %d, pending %d.\n", + mp_msg(MSGT_AFILTER, MSGL_DBG2, "avcodec_encode_audio got %d, pending %d.\n", len, s->pending_len); if (s->add_iec61937_header) { @@ -269,7 +269,7 @@ static af_data_t* play(struct af_instance_s* af, af_data_t* data) c->nch = 2; c->bps = 2; c->len = outsize; - af_msg(AF_MSG_DEBUG0, "play return size %d, pending %d\n", + mp_msg(MSGT_AFILTER, MSGL_DBG2, "play return size %d, pending %d\n", outsize, s->pending_len); return c; } @@ -295,13 +295,13 @@ static int af_open(af_instance_t* af){ s->lavc_acodec = avcodec_find_encoder_by_name("ac3"); if (!s->lavc_acodec) { - af_msg(AF_MSG_ERROR, MSGTR_LavcAudioCodecNotFound, "ac3"); + mp_msg(MSGT_AFILTER, MSGL_ERR, MSGTR_LavcAudioCodecNotFound, "ac3"); return AF_ERROR; } s->lavc_actx = avcodec_alloc_context(); if (!s->lavc_actx) { - af_msg(AF_MSG_ERROR, MSGTR_CouldntAllocateLavcContext); + mp_msg(MSGT_AFILTER, MSGL_ERR, MSGTR_CouldntAllocateLavcContext); return AF_ERROR; } diff --git a/libaf/af_mp.h b/libaf/af_mp.h deleted file mode 100644 index 29aca538e7..0000000000 --- a/libaf/af_mp.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -/* Include file for mplayer specific defines and includes */ -#ifndef MPLAYER_AF_MP_H -#define MPLAYER_AF_MP_H - -#include "config.h" -#include "mp_msg.h" -#include "cpudetect.h" - -/* Set the initialization type from mplayers cpudetect */ -#ifdef AF_INIT_TYPE -#undef AF_INIT_TYPE -#define AF_INIT_TYPE \ - ((gCpuCaps.has3DNow || gCpuCaps.hasSSE)?AF_INIT_FAST:AF_INIT_SLOW) -#endif - -#ifdef af_msg -#undef af_msg -#endif -#define af_msg(lev, args... ) \ - mp_msg(MSGT_AFILTER,(((lev)<0)?((lev)+3):(((lev)==0)?MSGL_INFO:((lev)+5))), ##args ) - -#endif /* MPLAYER_AF_MP_H */ diff --git a/libaf/af_pan.c b/libaf/af_pan.c index ae2f81c50a..2c1a41dd87 100644 --- a/libaf/af_pan.c +++ b/libaf/af_pan.c @@ -72,7 +72,7 @@ static int control(struct af_instance_s* af, int cmd, void* arg) j = 0; k = 0; while((*cp == ':') && (k < AF_NCH)){ sscanf(cp, ":%f%n" , &s->level[j][k], &n); - af_msg(AF_MSG_VERBOSE,"[pan] Pan level from channel %i to" + mp_msg(MSGT_AFILTER, MSGL_V, "[pan] Pan level from channel %i to" " channel %i = %f\n",k,j,s->level[j][k]); cp =&cp[n]; j++; @@ -108,7 +108,7 @@ static int control(struct af_instance_s* af, int cmd, void* arg) // Sanity check if(((int*)arg)[0] <= 0 || ((int*)arg)[0] > AF_NCH){ - af_msg(AF_MSG_ERROR,"[pan] The number of output channels must be" + mp_msg(MSGT_AFILTER, MSGL_ERR, "[pan] The number of output channels must be" " between 1 and %i. Current value is %i\n",AF_NCH,((int*)arg)[0]); return AF_ERROR; } diff --git a/libaf/af_resample.c b/libaf/af_resample.c index 2844940000..03ad4e3d42 100644 --- a/libaf/af_resample.c +++ b/libaf/af_resample.c @@ -139,7 +139,7 @@ static int set_types(struct af_instance_s* af, af_data_t* data) s->setup = (s->setup & ~RSMP_MASK) | RSMP_LIN; af->data->format = AF_FORMAT_S16_NE; af->data->bps = 2; - af_msg(AF_MSG_VERBOSE,"[resample] Using linear interpolation. \n"); + mp_msg(MSGT_AFILTER, MSGL_V, "[resample] Using linear interpolation. \n"); } else{ /* If the input format is float or if float is explicitly selected @@ -155,7 +155,7 @@ static int set_types(struct af_instance_s* af, af_data_t* data) af->data->format = AF_FORMAT_S16_NE; af->data->bps = 2; } - af_msg(AF_MSG_VERBOSE,"[resample] Using %s processing and %s frequecy" + mp_msg(MSGT_AFILTER, MSGL_V, "[resample] Using %s processing and %s frequecy" " conversion.\n", ((s->setup & RSMP_MASK) == RSMP_FLOAT)?"floating point":"integer", ((s->setup & FREQ_MASK) == FREQ_SLOPPY)?"inexact":"exact"); @@ -193,7 +193,7 @@ static int control(struct af_instance_s* af, int cmd, void* arg) if((s->setup & RSMP_MASK) == RSMP_LIN){ s->pt=0LL; s->step=((uint64_t)n->rate<<STEPACCURACY)/(uint64_t)af->data->rate+1LL; - af_msg(AF_MSG_DEBUG0,"[resample] Linear interpolation step: 0x%016"PRIX64".\n", + mp_msg(MSGT_AFILTER, MSGL_DBG2, "[resample] Linear interpolation step: 0x%016"PRIX64".\n", s->step); af->mul = (double)af->data->rate / n->rate; return rv; @@ -243,7 +243,7 @@ static int control(struct af_instance_s* af, int cmd, void* arg) // Design prototype filter type using Kaiser window with beta = 10 if(NULL == w || NULL == s->w || -1 == af_filter_design_fir(s->up*L, w, &fc, LP|KAISER , 10.0)){ - af_msg(AF_MSG_ERROR,"[resample] Unable to design prototype filter.\n"); + mp_msg(MSGT_AFILTER, MSGL_ERR, "[resample] Unable to design prototype filter.\n"); return AF_ERROR; } // Copy data from prototype to polyphase filter @@ -260,7 +260,7 @@ static int control(struct af_instance_s* af, int cmd, void* arg) } } free(w); - af_msg(AF_MSG_VERBOSE,"[resample] New filter designed up: %i " + mp_msg(MSGT_AFILTER, MSGL_V, "[resample] New filter designed up: %i " "down: %i\n", s->up, s->dn); } @@ -288,14 +288,14 @@ static int control(struct af_instance_s* af, int cmd, void* arg) // Sanity check if(((int*)arg)[0] < 8000 || ((int*)arg)[0] > 192000){ - af_msg(AF_MSG_ERROR,"[resample] The output sample frequency " + mp_msg(MSGT_AFILTER, MSGL_ERR, "[resample] The output sample frequency " "must be between 8kHz and 192kHz. Current value is %i \n", ((int*)arg)[0]); return AF_ERROR; } af->data->rate=((int*)arg)[0]; - af_msg(AF_MSG_VERBOSE,"[resample] Changing sample rate " + mp_msg(MSGT_AFILTER, MSGL_V, "[resample] Changing sample rate " "to %iHz\n",af->data->rate); return AF_OK; } diff --git a/libaf/af_scaletempo.c b/libaf/af_scaletempo.c index d09fe950b5..8b39290efa 100644 --- a/libaf/af_scaletempo.c +++ b/libaf/af_scaletempo.c @@ -232,11 +232,11 @@ static af_data_t* play(struct af_instance_s* af, af_data_t* data) // RESIZE_LOCAL_BUFFER - can't use macro max_bytes_out = ((int)(data->len / s->bytes_stride_scaled) + 1) * s->bytes_stride; if (max_bytes_out > af->data->len) { - af_msg(AF_MSG_VERBOSE, "[libaf] Reallocating memory in module %s, " + mp_msg(MSGT_AFILTER, MSGL_V, "[libaf] Reallocating memory in module %s, " "old len = %i, new len = %i\n",af->info->name,af->data->len,max_bytes_out); af->data->audio = realloc(af->data->audio, max_bytes_out); if (!af->data->audio) { - af_msg(AF_MSG_FATAL, "[libaf] Could not allocate memory\n"); + mp_msg(MSGT_AFILTER, MSGL_FATAL, "[libaf] Could not allocate memory\n"); return NULL; } af->data->len = max_bytes_out; @@ -296,7 +296,7 @@ static int control(struct af_instance_s* af, int cmd, void* arg) int frames_stride, frames_overlap; int i, j; - af_msg(AF_MSG_VERBOSE, + mp_msg(MSGT_AFILTER, MSGL_V, "[scaletempo] %.3f speed * %.3f scale_nominal = %.3f\n", s->speed, s->scale_nominal, s->scale); @@ -339,7 +339,7 @@ static int control(struct af_instance_s* af, int cmd, void* arg) s->buf_overlap = realloc(s->buf_overlap, s->bytes_overlap); s->table_blend = realloc(s->table_blend, s->bytes_overlap * 4); if(!s->buf_overlap || !s->table_blend) { - af_msg(AF_MSG_FATAL, "[scaletempo] Out of memory\n"); + mp_msg(MSGT_AFILTER, MSGL_FATAL, "[scaletempo] Out of memory\n"); return AF_ERROR; } memset(s->buf_overlap, 0, s->bytes_overlap); @@ -377,7 +377,7 @@ static int control(struct af_instance_s* af, int cmd, void* arg) s->buf_pre_corr = realloc(s->buf_pre_corr, s->bytes_overlap * 2 + UNROLL_PADDING); s->table_window = realloc(s->table_window, s->bytes_overlap * 2 - nch * bps * 2); if(!s->buf_pre_corr || !s->table_window) { - af_msg(AF_MSG_FATAL, "[scaletempo] Out of memory\n"); + mp_msg(MSGT_AFILTER, MSGL_FATAL, "[scaletempo] Out of memory\n"); return AF_ERROR; } memset((char *)s->buf_pre_corr + s->bytes_overlap * 2, 0, UNROLL_PADDING); @@ -394,7 +394,7 @@ static int control(struct af_instance_s* af, int cmd, void* arg) s->buf_pre_corr = realloc(s->buf_pre_corr, s->bytes_overlap); s->table_window = realloc(s->table_window, s->bytes_overlap - nch * bps); if(!s->buf_pre_corr || !s->table_window) { - af_msg(AF_MSG_FATAL, "[scaletempo] Out of memory\n"); + mp_msg(MSGT_AFILTER, MSGL_FATAL, "[scaletempo] Out of memory\n"); return AF_ERROR; } pw = s->table_window; @@ -415,11 +415,11 @@ static int control(struct af_instance_s* af, int cmd, void* arg) = (s->frames_search + frames_stride + frames_overlap) * bps * nch; s->buf_queue = realloc(s->buf_queue, s->bytes_queue + UNROLL_PADDING); if(!s->buf_queue) { - af_msg(AF_MSG_FATAL, "[scaletempo] Out of memory\n"); + mp_msg(MSGT_AFILTER, MSGL_FATAL, "[scaletempo] Out of memory\n"); return AF_ERROR; } - af_msg (AF_MSG_DEBUG0, "[scaletempo] " + mp_msg (MSGT_AFILTER, MSGL_DBG2, "[scaletempo] " "%.2f stride_in, %i stride_out, %i standing, " "%i overlap, %i search, %i queue, %s mode\n", s->frames_stride_scaled, @@ -470,25 +470,25 @@ static int control(struct af_instance_s* af, int cmd, void* arg) return AF_ERROR; } if (s->scale_nominal <= 0) { - af_msg(AF_MSG_ERROR, "[scaletempo] " + mp_msg(MSGT_AFILTER, MSGL_ERR, "[scaletempo] " MSGTR_ErrorParsingCommandLine ": " MSGTR_AF_ValueOutOfRange ": scale > 0\n"); return AF_ERROR; } if (s->ms_stride <= 0) { - af_msg(AF_MSG_ERROR, "[scaletempo] " + mp_msg(MSGT_AFILTER, MSGL_ERR, "[scaletempo] " MSGTR_ErrorParsingCommandLine ": " MSGTR_AF_ValueOutOfRange ": stride > 0\n"); return AF_ERROR; } if (s->percent_overlap < 0 || s->percent_overlap > 1) { - af_msg(AF_MSG_ERROR, "[scaletempo] " + mp_msg(MSGT_AFILTER, MSGL_ERR, "[scaletempo] " MSGTR_ErrorParsingCommandLine ": " MSGTR_AF_ValueOutOfRange ": 0 <= overlap <= 1\n"); return AF_ERROR; } if (s->ms_search < 0) { - af_msg(AF_MSG_ERROR, "[scaletempo] " + mp_msg(MSGT_AFILTER, MSGL_ERR, "[scaletempo] " MSGTR_ErrorParsingCommandLine ": " MSGTR_AF_ValueOutOfRange ": search >= 0\n"); return AF_ERROR; @@ -507,14 +507,14 @@ static int control(struct af_instance_s* af, int cmd, void* arg) s->speed_tempo = 1; s->speed_pitch = 1; } else { - af_msg(AF_MSG_ERROR, "[scaletempo] " + mp_msg(MSGT_AFILTER, MSGL_ERR, "[scaletempo] " MSGTR_ErrorParsingCommandLine ": " MSGTR_AF_ValueOutOfRange ": speed=[pitch|tempo|none|both]\n"); return AF_ERROR; } } s->scale = s->speed * s->scale_nominal; - af_msg(AF_MSG_DEBUG0, "[scaletempo] %6.3f scale, %6.2f stride, %6.2f overlap, %6.2f search, speed = %s\n", s->scale_nominal, s->ms_stride, s->percent_overlap, s->ms_search, (s->speed_tempo?(s->speed_pitch?"tempo and speed":"tempo"):(s->speed_pitch?"pitch":"none"))); + mp_msg(MSGT_AFILTER, MSGL_DBG2, "[scaletempo] %6.3f scale, %6.2f stride, %6.2f overlap, %6.2f search, speed = %s\n", s->scale_nominal, s->ms_stride, s->percent_overlap, s->ms_search, (s->speed_tempo?(s->speed_pitch?"tempo and speed":"tempo"):(s->speed_pitch?"pitch":"none"))); return AF_OK; } } diff --git a/libaf/af_sinesuppress.c b/libaf/af_sinesuppress.c index e15a740c84..b7ed277d7b 100644 --- a/libaf/af_sinesuppress.c +++ b/libaf/af_sinesuppress.c @@ -130,7 +130,7 @@ static af_data_t* play_s16(struct af_instance_s* af, af_data_t* data) s->pos += 2 * M_PI * s->freq / data->rate; } - af_msg(AF_MSG_VERBOSE,"[sinesuppress] f:%8.2f: amp:%8.2f\n", s->freq, sqrt(s->real*s->real + s->imag*s->imag) / s->ref); + mp_msg(MSGT_AFILTER, MSGL_V, "[sinesuppress] f:%8.2f: amp:%8.2f\n", s->freq, sqrt(s->real*s->real + s->imag*s->imag) / s->ref); return data; } diff --git a/libaf/af_sub.c b/libaf/af_sub.c index f7034da61d..294c6f788e 100644 --- a/libaf/af_sub.c +++ b/libaf/af_sub.c @@ -94,7 +94,7 @@ static int control(struct af_instance_s* af, int cmd, void* arg) case AF_CONTROL_SUB_CH | AF_CONTROL_SET: // Requires reinit // Sanity check if((*(int*)arg >= AF_NCH) || (*(int*)arg < 0)){ - af_msg(AF_MSG_ERROR,"[sub] Subwoofer channel number must be between " + mp_msg(MSGT_AFILTER, MSGL_ERR, "[sub] Subwoofer channel number must be between " " 0 and %i current value is %i\n", AF_NCH-1, *(int*)arg); return AF_ERROR; } @@ -106,7 +106,7 @@ static int control(struct af_instance_s* af, int cmd, void* arg) case AF_CONTROL_SUB_FC | AF_CONTROL_SET: // Requires reinit // Sanity check if((*(float*)arg > 300) || (*(float*)arg < 20)){ - af_msg(AF_MSG_ERROR,"[sub] Cutoff frequency must be between 20Hz and" + mp_msg(MSGT_AFILTER, MSGL_ERR, "[sub] Cutoff frequency must be between 20Hz and" " 300Hz current value is %0.2f",*(float*)arg); return AF_ERROR; } diff --git a/libaf/af_surround.c b/libaf/af_surround.c index dad1c5a4b5..a81eb40427 100644 --- a/libaf/af_surround.c +++ b/libaf/af_surround.c @@ -98,13 +98,13 @@ static int control(struct af_instance_s* af, int cmd, void* arg) af->data->bps = 4; if (af->data->nch != 4){ - af_msg(AF_MSG_ERROR,"[surround] Only stereo input is supported.\n"); + mp_msg(MSGT_AFILTER, MSGL_ERR, "[surround] Only stereo input is supported.\n"); return AF_DETACH; } // Surround filer coefficients fc = 2.0 * 7000.0/(float)af->data->rate; if (-1 == af_filter_design_fir(L, s->w, &fc, LP|HAMMING, 0)){ - af_msg(AF_MSG_ERROR,"[surround] Unable to design low-pass filter.\n"); + mp_msg(MSGT_AFILTER, MSGL_ERR, "[surround] Unable to design low-pass filter.\n"); return AF_ERROR; } @@ -117,7 +117,7 @@ static int control(struct af_instance_s* af, int cmd, void* arg) s->dl = calloc(LD,af->data->bps); s->dr = calloc(LD,af->data->bps); if((NULL == s->dl) || (NULL == s->dr)) - af_msg(AF_MSG_FATAL,"[delay] Out of memory\n"); + mp_msg(MSGT_AFILTER, MSGL_FATAL, "[delay] Out of memory\n"); // Initialize delay queue index if(AF_OK != af_from_ms(1, &s->d, &s->wi, af->data->rate, 0.0, 1000.0)) @@ -137,7 +137,7 @@ static int control(struct af_instance_s* af, int cmd, void* arg) float d = 0; sscanf((char*)arg,"%f",&d); if ((d < 0) || (d > 1000)){ - af_msg(AF_MSG_ERROR,"[surround] Invalid delay time, valid time values" + mp_msg(MSGT_AFILTER, MSGL_ERR, "[surround] Invalid delay time, valid time values" " are 0ms to 1000ms current value is %0.3f ms\n",d); return AF_ERROR; } diff --git a/libaf/af_volume.c b/libaf/af_volume.c index 045b4c2618..127db7b37a 100644 --- a/libaf/af_volume.c +++ b/libaf/af_volume.c @@ -78,7 +78,7 @@ static int control(struct af_instance_s* af, int cmd, void* arg) float x = 2.0*M_PI*15.0/(float)af->data->rate; float t = 2.0-cos(x); s->time = 1.0 - (t - sqrt(t*t - 1)); - af_msg(AF_MSG_DEBUG0,"[volume] Forgetting factor = %0.5f\n",s->time); + mp_msg(MSGT_AFILTER, MSGL_DBG2, "[volume] Forgetting factor = %0.5f\n",s->time); af->data->format = AF_FORMAT_FLOAT_NE; af->data->bps = 4; } @@ -122,7 +122,7 @@ static int control(struct af_instance_s* af, int cmd, void* arg) for(i=0;i<AF_NCH;i++) m=max(m,s->max[i]); af_to_dB(1, &m, &m, 10.0); - af_msg(AF_MSG_INFO,"[volume] The maximum volume was %0.2fdB \n", m); + mp_msg(MSGT_AFILTER, MSGL_INFO, "[volume] The maximum volume was %0.2fdB \n", m); } return AF_OK; } diff --git a/libao2/ao_pcm.c b/libao2/ao_pcm.c index bf3f224e81..b64118ff31 100644 --- a/libao2/ao_pcm.c +++ b/libao2/ao_pcm.c @@ -37,10 +37,10 @@ static const ao_info_t info = { - "RAW PCM/WAVE file writer audio output", - "pcm", - "Atmosfear", - "" + "RAW PCM/WAVE file writer audio output", + "pcm", + "Atmosfear", + "" }; LIBAO_EXTERN(pcm) @@ -60,23 +60,24 @@ static int fast = 0; struct WaveHeader { - uint32_t riff; - uint32_t file_length; - uint32_t wave; - uint32_t fmt; - uint32_t fmt_length; - uint16_t fmt_tag; - uint16_t channels; - uint32_t sample_rate; - uint32_t bytes_per_second; - uint16_t block_align; - uint16_t bits; - uint32_t data; - uint32_t data_length; + uint32_t riff; + uint32_t file_length; + uint32_t wave; + uint32_t fmt; + uint32_t fmt_length; + uint16_t fmt_tag; + uint16_t channels; + uint32_t sample_rate; + uint32_t bytes_per_second; + uint16_t block_align; + uint16_t bits; + uint32_t data; + uint32_t data_length; }; /* init with default values */ static struct WaveHeader wavhdr; +static uint64_t data_length; static FILE *fp = NULL; @@ -88,102 +89,107 @@ static int control(int cmd,void *arg){ // open & setup audio device // return: 1=success 0=fail static int init(int rate,int channels,int format,int flags){ - int bits; - opt_t subopts[] = { - {"waveheader", OPT_ARG_BOOL, &ao_pcm_waveheader, NULL}, - {"file", OPT_ARG_MSTRZ, &ao_outputfilename, NULL}, - {"fast", OPT_ARG_BOOL, &fast, NULL}, - {NULL} - }; - // set defaults - ao_pcm_waveheader = 1; - - if (subopt_parse(ao_subdevice, subopts) != 0) { - return 0; - } - if (!ao_outputfilename){ - ao_outputfilename = - strdup(ao_pcm_waveheader?"audiodump.wav":"audiodump.pcm"); - } - - bits=8; - switch(format){ - case AF_FORMAT_S32_BE: - format=AF_FORMAT_S32_LE; - case AF_FORMAT_S32_LE: - bits=32; - break; - case AF_FORMAT_FLOAT_BE: - format=AF_FORMAT_FLOAT_LE; - case AF_FORMAT_FLOAT_LE: - bits=32; - break; - case AF_FORMAT_S8: - format=AF_FORMAT_U8; - case AF_FORMAT_U8: - break; - case AF_FORMAT_AC3: - bits=16; - break; - default: - format=AF_FORMAT_S16_LE; - bits=16; - break; - } - - ao_data.outburst = 65536; - ao_data.buffersize= 2*65536; - ao_data.channels=channels; - ao_data.samplerate=rate; - ao_data.format=format; - ao_data.bps=channels*rate*(bits/8); - - wavhdr.riff = le2me_32(WAV_ID_RIFF); - wavhdr.wave = le2me_32(WAV_ID_WAVE); - wavhdr.fmt = le2me_32(WAV_ID_FMT); - wavhdr.fmt_length = le2me_32(16); - wavhdr.fmt_tag = le2me_16(format == AF_FORMAT_FLOAT_LE ? WAV_ID_FLOAT_PCM : WAV_ID_PCM); - wavhdr.channels = le2me_16(ao_data.channels); - wavhdr.sample_rate = le2me_32(ao_data.samplerate); - wavhdr.bytes_per_second = le2me_32(ao_data.bps); - wavhdr.bits = le2me_16(bits); - wavhdr.block_align = le2me_16(ao_data.channels * (bits / 8)); - - wavhdr.data = le2me_32(WAV_ID_DATA); - wavhdr.data_length=le2me_32(0x7ffff000); - wavhdr.file_length = wavhdr.data_length + sizeof(wavhdr) - 8; - - mp_msg(MSGT_AO, MSGL_INFO, MSGTR_AO_PCM_FileInfo, ao_outputfilename, - (ao_pcm_waveheader?"WAVE":"RAW PCM"), rate, - (channels > 1) ? "Stereo" : "Mono", af_fmt2str_short(format)); - mp_msg(MSGT_AO, MSGL_INFO, MSGTR_AO_PCM_HintInfo); - - fp = fopen(ao_outputfilename, "wb"); - if(fp) { - if(ao_pcm_waveheader){ /* Reserve space for wave header */ - fwrite(&wavhdr,sizeof(wavhdr),1,fp); - wavhdr.file_length=wavhdr.data_length=0; - } - return 1; - } - mp_msg(MSGT_AO, MSGL_ERR, MSGTR_AO_PCM_CantOpenOutputFile, + int bits; + opt_t subopts[] = { + {"waveheader", OPT_ARG_BOOL, &ao_pcm_waveheader, NULL}, + {"file", OPT_ARG_MSTRZ, &ao_outputfilename, NULL}, + {"fast", OPT_ARG_BOOL, &fast, NULL}, + {NULL} + }; + // set defaults + ao_pcm_waveheader = 1; + + if (subopt_parse(ao_subdevice, subopts) != 0) { + return 0; + } + if (!ao_outputfilename){ + ao_outputfilename = + strdup(ao_pcm_waveheader?"audiodump.wav":"audiodump.pcm"); + } + + bits=8; + switch(format){ + case AF_FORMAT_S32_BE: + format=AF_FORMAT_S32_LE; + case AF_FORMAT_S32_LE: + bits=32; + break; + case AF_FORMAT_FLOAT_BE: + format=AF_FORMAT_FLOAT_LE; + case AF_FORMAT_FLOAT_LE: + bits=32; + break; + case AF_FORMAT_S8: + format=AF_FORMAT_U8; + case AF_FORMAT_U8: + break; + case AF_FORMAT_AC3: + bits=16; + break; + default: + format=AF_FORMAT_S16_LE; + bits=16; + break; + } + + ao_data.outburst = 65536; + ao_data.buffersize= 2*65536; + ao_data.channels=channels; + ao_data.samplerate=rate; + ao_data.format=format; + ao_data.bps=channels*rate*(bits/8); + + wavhdr.riff = le2me_32(WAV_ID_RIFF); + wavhdr.wave = le2me_32(WAV_ID_WAVE); + wavhdr.fmt = le2me_32(WAV_ID_FMT); + wavhdr.fmt_length = le2me_32(16); + wavhdr.fmt_tag = le2me_16(format == AF_FORMAT_FLOAT_LE ? WAV_ID_FLOAT_PCM : WAV_ID_PCM); + wavhdr.channels = le2me_16(ao_data.channels); + wavhdr.sample_rate = le2me_32(ao_data.samplerate); + wavhdr.bytes_per_second = le2me_32(ao_data.bps); + wavhdr.bits = le2me_16(bits); + wavhdr.block_align = le2me_16(ao_data.channels * (bits / 8)); + + wavhdr.data = le2me_32(WAV_ID_DATA); + wavhdr.data_length=le2me_32(0x7ffff000); + wavhdr.file_length = wavhdr.data_length + sizeof(wavhdr) - 8; + + mp_msg(MSGT_AO, MSGL_INFO, MSGTR_AO_PCM_FileInfo, ao_outputfilename, + (ao_pcm_waveheader?"WAVE":"RAW PCM"), rate, + (channels > 1) ? "Stereo" : "Mono", af_fmt2str_short(format)); + mp_msg(MSGT_AO, MSGL_INFO, MSGTR_AO_PCM_HintInfo); + + fp = fopen(ao_outputfilename, "wb"); + if(fp) { + if(ao_pcm_waveheader){ /* Reserve space for wave header */ + fwrite(&wavhdr,sizeof(wavhdr),1,fp); + } + return 1; + } + mp_msg(MSGT_AO, MSGL_ERR, MSGTR_AO_PCM_CantOpenOutputFile, ao_outputfilename); - return 0; + return 0; } // close audio device static void uninit(int immed){ - - if(ao_pcm_waveheader && fseek(fp, 0, SEEK_SET) == 0){ /* Write wave header */ - wavhdr.file_length = wavhdr.data_length + sizeof(wavhdr) - 8; - wavhdr.file_length = le2me_32(wavhdr.file_length); - wavhdr.data_length = le2me_32(wavhdr.data_length); - fwrite(&wavhdr,sizeof(wavhdr),1,fp); - } - fclose(fp); - if (ao_outputfilename) - free(ao_outputfilename); - ao_outputfilename = NULL; + + if(ao_pcm_waveheader){ /* Rewrite wave header */ + if (fseek(fp, 0, SEEK_SET) != 0) + mp_msg(MSGT_AO, MSGL_ERR, "Could not seek to start, WAV size headers not updated!\n"); + else if (data_length > 0x7ffff000) + mp_msg(MSGT_AO, MSGL_ERR, "File larger than allowed for WAV files, may play truncated!\n"); + else { + wavhdr.file_length = data_length + sizeof(wavhdr) - 8; + wavhdr.file_length = le2me_32(wavhdr.file_length); + wavhdr.data_length = le2me_32(data_length); + fwrite(&wavhdr,sizeof(wavhdr),1,fp); + } + } + fclose(fp); + if (ao_outputfilename) + free(ao_outputfilename); + ao_outputfilename = NULL; } // stop playing and empty buffers (for seeking/pause) @@ -207,7 +213,7 @@ static void audio_resume(void) static int get_space(void){ if(vo_pts) - return ao_data.pts < vo_pts + fast * 30000 ? ao_data.outburst : 0; + return ao_data.pts < vo_pts + fast * 30000 ? ao_data.outburst : 0; return ao_data.outburst; } @@ -219,31 +225,31 @@ static int play(void* data,int len,int flags){ // let libaf to do the conversion... #if 0 //#ifdef WORDS_BIGENDIAN - if (ao_data.format == AFMT_S16_LE) { - unsigned short *buffer = (unsigned short *) data; - register int i; - for(i = 0; i < len/2; ++i) { - buffer[i] = le2me_16(buffer[i]); - } - } + if (ao_data.format == AFMT_S16_LE) { + unsigned short *buffer = (unsigned short *) data; + register int i; + for(i = 0; i < len/2; ++i) { + buffer[i] = le2me_16(buffer[i]); + } + } #endif - if (ao_data.channels == 6 || ao_data.channels == 5) { - int frame_size = le2me_16(wavhdr.bits) / 8; - len -= len % (frame_size * ao_data.channels); - reorder_channel_nch(data, AF_CHANNEL_LAYOUT_MPLAYER_DEFAULT, - AF_CHANNEL_LAYOUT_WAVEEX_DEFAULT, - ao_data.channels, - len / frame_size, frame_size); - } - - //printf("PCM: Writing chunk!\n"); - fwrite(data,len,1,fp); - - if(ao_pcm_waveheader) - wavhdr.data_length += len; - - return len; + if (ao_data.channels == 6 || ao_data.channels == 5) { + int frame_size = le2me_16(wavhdr.bits) / 8; + len -= len % (frame_size * ao_data.channels); + reorder_channel_nch(data, AF_CHANNEL_LAYOUT_MPLAYER_DEFAULT, + AF_CHANNEL_LAYOUT_WAVEEX_DEFAULT, + ao_data.channels, + len / frame_size, frame_size); + } + + //printf("PCM: Writing chunk!\n"); + fwrite(data,len,1,fp); + + if(ao_pcm_waveheader) + data_length += len; + + return len; } // return: delay in seconds between first and last sample in buffer diff --git a/libass/ass_fontconfig.c b/libass/ass_fontconfig.c index d0042dcdfd..a54bc8c4af 100644 --- a/libass/ass_fontconfig.c +++ b/libass/ass_fontconfig.c @@ -160,11 +160,13 @@ static char* _select_font(fc_instance_t* priv, const char* family, int treat_fam goto error; #if (FC_VERSION >= 20297) - // Remove all extra family names from original pattern. - // After this, FcFontRenderPrepare will select the most relevant family - // name in case there are more than one of them. - for (; family_cnt > 1; --family_cnt) - FcPatternRemove(pat, FC_FAMILY, family_cnt - 1); + if (!treat_family_as_pattern) { + // Remove all extra family names from original pattern. + // After this, FcFontRenderPrepare will select the most relevant family + // name in case there are more than one of them. + for (; family_cnt > 1; --family_cnt) + FcPatternRemove(pat, FC_FAMILY, family_cnt - 1); + } #endif rpat = FcFontRenderPrepare(priv->config, pat, fset->fonts[curf]); diff --git a/libass/ass_render.c b/libass/ass_render.c index e52195e023..fd3a122e9b 100644 --- a/libass/ass_render.c +++ b/libass/ass_render.c @@ -455,6 +455,7 @@ static void render_overlap(ass_image_t** last_tail, ass_image_t** tail, bitmap_h cur_top = top-by; // Query cache + memset(&hk, 0, sizeof(hk)); memcpy(&hk.a, last_hash, sizeof(*last_hash)); memcpy(&hk.b, hash, sizeof(*hash)); hk.aw = aw; @@ -1432,6 +1433,7 @@ static void get_outline_glyph(int symbol, glyph_info_t* info, FT_Vector* advance int error; glyph_hash_val_t* val; glyph_hash_key_t key; + memset(&key, 0, sizeof(key)); key.font = render_context.font; key.size = render_context.font_size; key.ch = symbol; @@ -1876,6 +1878,7 @@ static void transform_3d(FT_Vector shift, FT_Glyph* glyph, FT_Glyph* glyph2, dou /** * \brief Main ass rendering function, glues everything together * \param event event to render + * \param event_images struct containing resulting images, will also be initialized * Process event, appending resulting ass_image_t's to images_root. */ static int ass_render_event(ass_event_t* event, event_images_t* event_images) @@ -2169,6 +2172,7 @@ static int ass_render_event(ass_event_t* event, event_images_t* event_images) for (i = 0; i < text_info.length; ++i) get_bitmap_glyph(text_info.glyphs + i); + memset(event_images, 0, sizeof(*event_images)); event_images->top = device_y - d6_to_int(text_info.lines[0].asc); event_images->height = d6_to_int(text_info.height); event_images->detect_collisions = render_context.detect_collisions; diff --git a/libmpcodecs/ad.c b/libmpcodecs/ad.c index 3f191826fa..c7e87cd92e 100644 --- a/libmpcodecs/ad.c +++ b/libmpcodecs/ad.c @@ -1,6 +1,4 @@ -/* - ad.c - audio decoder interface -*/ +/* audio decoder interface */ #include <stdio.h> #include <stdlib.h> diff --git a/libmpcodecs/ad_ffmpeg.c b/libmpcodecs/ad_ffmpeg.c index 560dd90c0a..7ecbb20cb3 100644 --- a/libmpcodecs/ad_ffmpeg.c +++ b/libmpcodecs/ad_ffmpeg.c @@ -112,6 +112,15 @@ static int init(sh_audio_t *sh_audio) sh_audio->channels=lavc_context->channels; sh_audio->samplerate=lavc_context->sample_rate; sh_audio->i_bps=lavc_context->bit_rate/8; + switch (lavc_context->sample_fmt) { + case SAMPLE_FMT_U8: sh_audio->sample_format = AF_FORMAT_U8; break; + case SAMPLE_FMT_S16: sh_audio->sample_format = AF_FORMAT_S16_NE; break; + case SAMPLE_FMT_S32: sh_audio->sample_format = AF_FORMAT_S32_NE; break; + case SAMPLE_FMT_FLT: sh_audio->sample_format = AF_FORMAT_FLOAT_NE; break; + default: + mp_msg(MSGT_DECAUDIO, MSGL_FATAL, "Unsupported sample format\n"); + return 0; + } if(sh_audio->wf){ // If the decoder uses the wrong number of channels all is lost anyway. // sh_audio->channels=sh_audio->wf->nChannels; @@ -120,7 +129,7 @@ static int init(sh_audio_t *sh_audio) if (sh_audio->wf->nAvgBytesPerSec) sh_audio->i_bps=sh_audio->wf->nAvgBytesPerSec; } - sh_audio->samplesize=2; + sh_audio->samplesize=af_fmt2bits(sh_audio->sample_format)/ 8; return 1; } diff --git a/libmpcodecs/ae_lavc.c b/libmpcodecs/ae_lavc.c index 3b07d6a963..4bc82abed4 100644 --- a/libmpcodecs/ae_lavc.c +++ b/libmpcodecs/ae_lavc.c @@ -248,6 +248,7 @@ int mpae_init_lavc(audio_encoder_t *encoder) } encoder->decode_buffer_size = lavc_actx->frame_size * 2 * encoder->params.channels; + while (encoder->decode_buffer_size < 1024) encoder->decode_buffer_size *= 2; encoder->bind = bind_lavc; encoder->get_frame_size = get_frame_size; encoder->encode = encode_lavc; diff --git a/libmpcodecs/mp_image.h b/libmpcodecs/mp_image.h index fb06e62fc9..77ce04102a 100644 --- a/libmpcodecs/mp_image.h +++ b/libmpcodecs/mp_image.h @@ -54,8 +54,6 @@ // buffer type was printed (do NOT set this flag - it's for INTERNAL USE!!!) #define MP_IMGFLAG_TYPE_DISPLAYED 0x8000 -// set if it can not be reused yet (for MP_IMGTYPE_NUMBERED) -#define MP_IMGFLAG_IN_USE 0x10000 // codec doesn't support any form of direct rendering - it has own buffer // allocation. so we just export its buffer pointers: @@ -101,6 +99,7 @@ typedef struct mp_image { int chroma_height; int chroma_x_shift; // horizontal int chroma_y_shift; // vertical + int usage_count; /* for private use by filter or vo driver (to store buffer id or dmpi) */ void* priv; } mp_image_t; diff --git a/libmpcodecs/vd_ffmpeg.c b/libmpcodecs/vd_ffmpeg.c index 16b8eb9452..708254304d 100644 --- a/libmpcodecs/vd_ffmpeg.c +++ b/libmpcodecs/vd_ffmpeg.c @@ -434,7 +434,7 @@ static void draw_slice(struct AVCodecContext *s, const AVFrame *src, int offset[4], int y, int type, int height){ sh_video_t *sh = s->opaque; - uint8_t *source[3]= {src->data[0] + offset[0], src->data[1] + offset[1], src->data[2] + offset[2]}; + uint8_t *source[MP_MAX_PLANES]= {src->data[0] + offset[0], src->data[1] + offset[1], src->data[2] + offset[2]}; #if 0 int start=0, i; int width= s->width; @@ -703,7 +703,7 @@ static void release_buffer(struct AVCodecContext *avctx, AVFrame *pic){ } #endif // release mpi (in case MPI_IMGTYPE_NUMBERED is used, e.g. for VDPAU) - mpi->flags &= ~MP_IMGFLAG_IN_USE; + mpi->usage_count--; } if(pic->type!=FF_BUFFER_TYPE_USER){ diff --git a/libmpcodecs/vd_libmpeg2.c b/libmpcodecs/vd_libmpeg2.c index ef7671e3ce..1a8fd6f214 100644 --- a/libmpcodecs/vd_libmpeg2.c +++ b/libmpcodecs/vd_libmpeg2.c @@ -125,14 +125,12 @@ static void draw_slice (void * _sh, uint8_t * const * src, unsigned int y){ vd_libmpeg2_ctx_t *context = sh->context; mpeg2dec_t* mpeg2dec = context->mpeg2dec; const mpeg2_info_t * info = mpeg2_info (mpeg2dec); - int stride[3]; + int stride[MP_MAX_PLANES] = {mpeg2dec->decoder.stride, mpeg2dec->decoder.uv_stride, mpeg2dec->decoder.uv_stride}; + uint8_t *srcs[MP_MAX_PLANES] = {src[0], src[1], src[2]}; // printf("draw_slice() y=%d \n",y); - stride[0]=mpeg2dec->decoder.stride; - stride[1]=stride[2]=mpeg2dec->decoder.uv_stride; - - mpcodecs_draw_slice(sh, (uint8_t **)src, + mpcodecs_draw_slice(sh, srcs, stride, info->sequence->picture_width, (y+16<=info->sequence->picture_height) ? 16 : info->sequence->picture_height-y, diff --git a/libmpcodecs/vf.c b/libmpcodecs/vf.c index 445e631c21..9bed6c78f8 100644 --- a/libmpcodecs/vf.c +++ b/libmpcodecs/vf.c @@ -303,7 +303,7 @@ mp_image_t* vf_get_image(vf_instance_t* vf, unsigned int outfmt, int mp_imgtype, if (number == -1) { int i; for (i = 0; i < NUM_NUMBERED_MPI; i++) - if (!vf->imgctx.numbered_images[i] || !(vf->imgctx.numbered_images[i]->flags & MP_IMGFLAG_IN_USE)) + if (!vf->imgctx.numbered_images[i] || !vf->imgctx.numbered_images[i]->usage_count) break; number = i; } @@ -430,7 +430,7 @@ mp_image_t* vf_get_image(vf_instance_t* vf, unsigned int outfmt, int mp_imgtype, mpi->qscale = NULL; } - mpi->flags |= MP_IMGFLAG_IN_USE; + mpi->usage_count++; // printf("\rVF_MPI: %p %p %p %d %d %d \n", // mpi->planes[0],mpi->planes[1],mpi->planes[2], // mpi->stride[0],mpi->stride[1],mpi->stride[2]); diff --git a/libmpcodecs/vf_bmovl.c b/libmpcodecs/vf_bmovl.c index 1c16d60ca7..0412779cb5 100644 --- a/libmpcodecs/vf_bmovl.c +++ b/libmpcodecs/vf_bmovl.c @@ -1,5 +1,5 @@ /* - * vf_bmovl.c v0.9.1 - BitMap OVerLay video filter for MPlayer + * BitMap OVerLay video filter for MPlayer * * (C) 2002 Per Wigren <wigren@home.se> * diff --git a/libmpcodecs/vf_filmdint.c b/libmpcodecs/vf_filmdint.c index 5427171fbd..b15990bd97 100644 --- a/libmpcodecs/vf_filmdint.c +++ b/libmpcodecs/vf_filmdint.c @@ -422,7 +422,7 @@ block_metrics_faster_c(unsigned char *a, unsigned char *b, int as, int bs, "paddusw %%mm2, %%mm7\n\t" \ "paddusw %%mm1, %%mm7\n\t" \ : "=r" (a), "=r" (b) \ - : "r"((long)as), "r"((long)bs), "m" (ones), "0"(a), "1"(b), "X"(*a), "X"(*b) \ + : "r"((x86_reg)as), "r"((x86_reg)bs), "m" (ones), "0"(a), "1"(b), "X"(*a), "X"(*b) \ ); \ } while (--lines); @@ -464,8 +464,8 @@ block_metrics_mmx2(unsigned char *a, unsigned char *b, int as, int bs, mp_msg(MSGT_VFILTER, MSGL_FATAL, "block_metrics_mmx2: internal error\n"); #else static const unsigned long long ones = 0x0101010101010101ull; - unsigned long interlaced; - unsigned long prefetch_line = (((long)a>>3) & 7) + 10; + x86_reg interlaced; + x86_reg prefetch_line = (((long)a>>3) & 7) + 10; #ifdef DEBUG struct frame_stats ts = *s; #endif @@ -631,7 +631,7 @@ dint_copy_line_mmx2(unsigned char *dst, unsigned char *a, long bos, "por %%mm3, %%mm1 \n\t" /* avg if >= threshold */ "movq %%mm1, (%2,%4) \n\t" : /* no output */ - : "r" (a), "r" (bos), "r" (dst), "r" ((long)ss), "r" ((long)ds), "r" (cos) + : "r" (a), "r" ((x86_reg)bos), "r" ((x86_reg)dst), "r" ((x86_reg)ss), "r" ((x86_reg)ds), "r" ((x86_reg)cos) ); a += 8; dst += 8; diff --git a/libmpcodecs/vf_framestep.c b/libmpcodecs/vf_framestep.c index c5f93244de..fde72bd6e7 100644 --- a/libmpcodecs/vf_framestep.c +++ b/libmpcodecs/vf_framestep.c @@ -1,6 +1,5 @@ /* - * vf_fstep.c - filter to ouput only 1 every n frame, or only the I (key) - * frame + * filter to ouput only 1 every n frame, or only the I (key)frame * * The parameters are: * diff --git a/libmpcodecs/vf_ilpack.c b/libmpcodecs/vf_ilpack.c index f3ce051535..1f25e054f5 100644 --- a/libmpcodecs/vf_ilpack.c +++ b/libmpcodecs/vf_ilpack.c @@ -187,7 +187,7 @@ static void pack_li_0_MMX(unsigned char *dst, unsigned char *y, : : "S" (y), "D" (dst), "a" (u), "b" (v), "c" (w/16), #if ARCH_X86_64 - "d" ((long)us), "r" ((long)vs) + "d" ((x86_reg)us), "r" ((x86_reg)vs) #else "d" (&us) #endif @@ -299,7 +299,7 @@ static void pack_li_1_MMX(unsigned char *dst, unsigned char *y, : : "S" (y), "D" (dst), "a" (u), "b" (v), "c" (w/16), #if ARCH_X86_64 - "d" ((long)us), "r" ((long)vs) + "d" ((x86_reg)us), "r" ((x86_reg)vs) #else "d" (&us) #endif diff --git a/libmpcodecs/vf_noise.c b/libmpcodecs/vf_noise.c index f797121973..0d4a089d5e 100644 --- a/libmpcodecs/vf_noise.c +++ b/libmpcodecs/vf_noise.c @@ -147,7 +147,7 @@ static int8_t *initNoise(FilterParam *fp){ #if HAVE_MMX static inline void lineNoise_MMX(uint8_t *dst, uint8_t *src, int8_t *noise, int len, int shift){ - long mmx_len= len&(~7); + x86_reg mmx_len= len&(~7); noise+=shift; __asm__ volatile( @@ -176,7 +176,7 @@ static inline void lineNoise_MMX(uint8_t *dst, uint8_t *src, int8_t *noise, int //duplicate of previous except movntq #if HAVE_MMX2 static inline void lineNoise_MMX2(uint8_t *dst, uint8_t *src, int8_t *noise, int len, int shift){ - long mmx_len= len&(~7); + x86_reg mmx_len= len&(~7); noise+=shift; __asm__ volatile( @@ -218,7 +218,7 @@ static inline void lineNoise_C(uint8_t *dst, uint8_t *src, int8_t *noise, int le #if HAVE_MMX static inline void lineNoiseAvg_MMX(uint8_t *dst, uint8_t *src, int len, int8_t **shift){ - long mmx_len= len&(~7); + x86_reg mmx_len= len&(~7); __asm__ volatile( "mov %5, %%"REG_a" \n\t" diff --git a/libmpcodecs/vf_sab.c b/libmpcodecs/vf_sab.c index 5074e45b3e..5a0ce4e48f 100644 --- a/libmpcodecs/vf_sab.c +++ b/libmpcodecs/vf_sab.c @@ -174,10 +174,10 @@ static inline void blur(uint8_t *dst, uint8_t *src, int w, int h, int dstStride, int x, y; FilterParam f= *fp; const int radius= f.distWidth/2; - uint8_t *srcArray[3]= {src, NULL, NULL}; - uint8_t *dstArray[3]= {f.preFilterBuf, NULL, NULL}; - int srcStrideArray[3]= {srcStride, 0, 0}; - int dstStrideArray[3]= {f.preFilterStride, 0, 0}; + uint8_t *srcArray[MP_MAX_PLANES]= {src}; + uint8_t *dstArray[MP_MAX_PLANES]= {f.preFilterBuf}; + int srcStrideArray[MP_MAX_PLANES]= {srcStride}; + int dstStrideArray[MP_MAX_PLANES]= {f.preFilterStride}; // f.preFilterContext->swScale(f.preFilterContext, srcArray, srcStrideArray, 0, h, dstArray, dstStrideArray); sws_scale(f.preFilterContext, srcArray, srcStrideArray, 0, h, dstArray, dstStrideArray); diff --git a/libmpcodecs/vf_scale.c b/libmpcodecs/vf_scale.c index fd1c6ee7f3..b453114475 100644 --- a/libmpcodecs/vf_scale.c +++ b/libmpcodecs/vf_scale.c @@ -318,9 +318,9 @@ static void start_slice(struct vf_instance* vf, mp_image_t *mpi){ vf->priv->w, vf->priv->h); } -static void scale(struct SwsContext *sws1, struct SwsContext *sws2, uint8_t *src[3], int src_stride[3], int y, int h, - uint8_t *dst[3], int dst_stride[3], int interlaced){ - uint8_t *src2[3]={src[0], src[1], src[2]}; +static void scale(struct SwsContext *sws1, struct SwsContext *sws2, uint8_t *src[MP_MAX_PLANES], int src_stride[MP_MAX_PLANES], + int y, int h, uint8_t *dst[MP_MAX_PLANES], int dst_stride[MP_MAX_PLANES], int interlaced){ + uint8_t *src2[MP_MAX_PLANES]={src[0], src[1], src[2]}; #ifdef WORDS_BIGENDIAN uint32_t pal2[256]; if (src[1] && !src[2]){ @@ -333,9 +333,9 @@ static void scale(struct SwsContext *sws1, struct SwsContext *sws2, uint8_t *src if(interlaced){ int i; - uint8_t *dst2[3]={dst[0], dst[1], dst[2]}; - int src_stride2[3]={2*src_stride[0], 2*src_stride[1], 2*src_stride[2]}; - int dst_stride2[3]={2*dst_stride[0], 2*dst_stride[1], 2*dst_stride[2]}; + uint8_t *dst2[MP_MAX_PLANES]={dst[0], dst[1], dst[2]}; + int src_stride2[MP_MAX_PLANES]={2*src_stride[0], 2*src_stride[1], 2*src_stride[2]}; + int dst_stride2[MP_MAX_PLANES]={2*dst_stride[0], 2*dst_stride[1], 2*dst_stride[2]}; sws_scale_ordered(sws1, src2, src_stride2, y>>1, h>>1, dst2, dst_stride2); for(i=0; i<3; i++){ diff --git a/libmpcodecs/vf_screenshot.c b/libmpcodecs/vf_screenshot.c index cded6ad1dd..1fb37a623b 100644 --- a/libmpcodecs/vf_screenshot.c +++ b/libmpcodecs/vf_screenshot.c @@ -108,16 +108,14 @@ static void gen_fname(struct vf_priv_s* priv) static void scale_image(struct vf_priv_s* priv, mp_image_t *mpi) { - uint8_t *dst[3]; - int dst_stride[3]; + uint8_t *dst[MP_MAX_PLANES] = {NULL}; + int dst_stride[MP_MAX_PLANES] = {0}; dst_stride[0] = priv->stride; - dst_stride[1] = dst_stride[2] = 0; if (!priv->buffer) priv->buffer = memalign(16, dst_stride[0]*priv->dh); dst[0] = priv->buffer; - dst[1] = dst[2] = 0; sws_scale_ordered(priv->ctx, mpi->planes, mpi->stride, 0, priv->dh, dst, dst_stride); } @@ -137,12 +135,10 @@ static void draw_slice(struct vf_instance* vf, unsigned char** src, int* stride, int w,int h, int x, int y) { if (vf->priv->store_slices) { - uint8_t *dst[3]; - int dst_stride[3]; + uint8_t *dst[MP_MAX_PLANES] = {NULL}; + int dst_stride[MP_MAX_PLANES] = {0}; dst_stride[0] = vf->priv->stride; - dst_stride[1] = dst_stride[2] = 0; dst[0] = vf->priv->buffer; - dst[1] = dst[2] = 0; sws_scale_ordered(vf->priv->ctx, src, stride, y, h, dst, dst_stride); } vf_next_draw_slice(vf,src,stride,w,h,x,y); diff --git a/libmpcodecs/vf_smartblur.c b/libmpcodecs/vf_smartblur.c index 78ab70a6ce..a420bf109c 100644 --- a/libmpcodecs/vf_smartblur.c +++ b/libmpcodecs/vf_smartblur.c @@ -132,10 +132,10 @@ static void uninit(struct vf_instance* vf){ static inline void blur(uint8_t *dst, uint8_t *src, int w, int h, int dstStride, int srcStride, FilterParam *fp){ int x, y; FilterParam f= *fp; - uint8_t *srcArray[3]= {src, NULL, NULL}; - uint8_t *dstArray[3]= {dst, NULL, NULL}; - int srcStrideArray[3]= {srcStride, 0, 0}; - int dstStrideArray[3]= {dstStride, 0, 0}; + uint8_t *srcArray[MP_MAX_PLANES]= {src}; + uint8_t *dstArray[MP_MAX_PLANES]= {dst}; + int srcStrideArray[MP_MAX_PLANES]= {srcStride}; + int dstStrideArray[MP_MAX_PLANES]= {dstStride}; sws_scale(f.filterContext, srcArray, srcStrideArray, 0, h, dstArray, dstStrideArray); diff --git a/libmpcodecs/vf_tile.c b/libmpcodecs/vf_tile.c index c5b4b90e96..5559c3f41a 100644 --- a/libmpcodecs/vf_tile.c +++ b/libmpcodecs/vf_tile.c @@ -1,5 +1,5 @@ /* - * vf_tile.c - filter to tile a serie of image in a single, bigger, image + * filter to tile a serie of image in a single, bigger, image * * The parameters are: * diff --git a/libmpcodecs/vf_yadif.c b/libmpcodecs/vf_yadif.c index 828ca29dd7..82ffe21412 100644 --- a/libmpcodecs/vf_yadif.c +++ b/libmpcodecs/vf_yadif.c @@ -248,8 +248,8 @@ static void filter_line_mmx2(struct vf_priv_s *p, uint8_t *dst, uint8_t *prev, u :[prev] "r"(prev),\ [cur] "r"(cur),\ [next] "r"(next),\ - [prefs]"r"((long)refs),\ - [mrefs]"r"((long)-refs),\ + [prefs]"r"((x86_reg)refs),\ + [mrefs]"r"((x86_reg)-refs),\ [pw1] "m"(pw_1),\ [pb1] "m"(pb_1),\ [mode] "g"(mode)\ diff --git a/libmpdemux/demux_mf.c b/libmpdemux/demux_mf.c index f7c241feed..dc990c0b8f 100644 --- a/libmpdemux/demux_mf.c +++ b/libmpdemux/demux_mf.c @@ -58,6 +58,8 @@ static int demux_mf_fill_buffer(demuxer_t *demuxer, demux_stream_t *ds){ return 1; } +// force extension/type to have a fourcc + static const struct { const char *type; uint32_t format; @@ -65,6 +67,9 @@ static const struct { { "bmp", mmioFOURCC('b', 'm', 'p', ' ') }, { "jpeg", mmioFOURCC('I', 'J', 'P', 'G') }, { "jpg", mmioFOURCC('I', 'J', 'P', 'G') }, + { "jls", mmioFOURCC('I', 'J', 'P', 'G') }, + { "thm", mmioFOURCC('I', 'J', 'P', 'G') }, + { "db", mmioFOURCC('I', 'J', 'P', 'G') }, { "pcx", mmioFOURCC('p', 'c', 'x', ' ') }, { "png", mmioFOURCC('M', 'P', 'N', 'G') }, { "ptx", mmioFOURCC('p', 't', 'x', ' ') }, diff --git a/libmpdemux/demuxer.c b/libmpdemux/demuxer.c index 4347feee0b..e9f577ae65 100644 --- a/libmpdemux/demuxer.c +++ b/libmpdemux/demuxer.c @@ -260,6 +260,10 @@ sh_sub_t *new_sh_sub_sid(demuxer_t *demuxer, int id, int sid) sh->opts = demuxer->opts; mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_SUBTITLE_ID=%d\n", sid); } + if (sid == demuxer->opts->sub_id) { + demuxer->sub->id = id; + demuxer->sub->sh = demuxer->s_streams[id]; + } return demuxer->s_streams[id]; } diff --git a/libmpdemux/mp_taglists.c b/libmpdemux/mp_taglists.c index 275112ac1a..98564b5916 100644 --- a/libmpdemux/mp_taglists.c +++ b/libmpdemux/mp_taglists.c @@ -59,6 +59,7 @@ static const AVCodecTag mp_wav_override_tags[] = { { CODEC_ID_PCM_S16BE, MKTAG('t', 'w', 'o', 's')}, { CODEC_ID_PCM_S16LE, 1}, { CODEC_ID_PCM_S24BE, MKTAG('i', 'n', '2', '4')}, + { CODEC_ID_PCM_S24LE, 1}, { 0, 0 }, }; diff --git a/libmpdemux/ms_hdr.h b/libmpdemux/ms_hdr.h index 6b810569d7..89f95ecbc3 100644 --- a/libmpdemux/ms_hdr.h +++ b/libmpdemux/ms_hdr.h @@ -27,7 +27,7 @@ typedef struct __attribute__((__packed__)) mpeglayer3waveformat_tag { #endif /* _MPEGLAYER3WAVEFORMAT_ */ /* windows.h #includes wingdi.h on MinGW. */ -#if !defined(_BITMAPINFOHEADER_) && !defined(_WINGDI_H) +#if !defined(_BITMAPINFOHEADER_) && !defined(_WINGDI_) #define _BITMAPINFOHEADER_ typedef struct __attribute__((__packed__)) { diff --git a/libswscale/Makefile b/libswscale/Makefile index 6d500abc65..bf75b64959 100644 --- a/libswscale/Makefile +++ b/libswscale/Makefile @@ -7,18 +7,25 @@ HEADERS = swscale.h OBJS = rgb2rgb.o swscale.o swscale_avoption.o yuv2rgb.o -OBJS-$(ARCH_BFIN) += internal_bfin.o swscale_bfin.o yuv2rgb_bfin.o -OBJS-$(CONFIG_MLIB) += yuv2rgb_mlib.o -OBJS-$(HAVE_ALTIVEC) += yuv2rgb_altivec.o -OBJS-$(HAVE_VIS) += yuv2rgb_vis.o +OBJS-$(ARCH_BFIN) += bfin/internal_bfin.o \ + bfin/swscale_bfin.o \ + bfin/yuv2rgb_bfin.o +OBJS-$(CONFIG_MLIB) += mlib/yuv2rgb_mlib.o +OBJS-$(HAVE_ALTIVEC) += ppc/yuv2rgb_altivec.o +OBJS-$(HAVE_VIS) += sparc/yuv2rgb_vis.o -TESTS = cs_test swscale-example +MMX-OBJS-$(CONFIG_GPL) += x86/yuv2rgb_mmx.o \ -CLEANFILES = cs_test swscale-example +OBJS-$(HAVE_MMX) += $(MMX-OBJS-yes) + +EXAMPLES = swscale +TESTPROGS = colorspace + +DIRS = bfin mlib ppc sparc x86 include $(SUBDIR)../subdir.mak -$(SUBDIR)cs_test: $(SUBDIR)cs_test.o $(SUBDIR)$(LIBNAME) +$(SUBDIR)colorspace-test$(EXESUF): $(SUBDIR)colorspace-test.o $(SUBDIR)$(LIBNAME) -$(SUBDIR)swscale-example: $(SUBDIR)swscale-example.o $(SUBDIR)$(LIBNAME) -$(SUBDIR)swscale-example: EXTRALIBS += -lm +$(SUBDIR)swscale-example$(EXESUF): $(SUBDIR)swscale-example.o $(SUBDIR)$(LIBNAME) +$(SUBDIR)swscale-example$(EXESUF): EXTRALIBS += -lm diff --git a/libswscale/internal_bfin.S b/libswscale/bfin/internal_bfin.S index fb7bda7e12..fb7bda7e12 100644 --- a/libswscale/internal_bfin.S +++ b/libswscale/bfin/internal_bfin.S diff --git a/libswscale/swscale_bfin.c b/libswscale/bfin/swscale_bfin.c index ed7d9579b6..2ad81d847d 100644 --- a/libswscale/swscale_bfin.c +++ b/libswscale/bfin/swscale_bfin.c @@ -27,9 +27,9 @@ #include <assert.h> #include "config.h" #include <unistd.h> -#include "rgb2rgb.h" -#include "swscale.h" -#include "swscale_internal.h" +#include "libswscale/rgb2rgb.h" +#include "libswscale/swscale.h" +#include "libswscale/swscale_internal.h" #ifdef __FDPIC__ #define L1CODE __attribute__ ((l1_text)) @@ -37,16 +37,16 @@ #define L1CODE #endif -int ff_bfin_uyvytoyv12 (const uint8_t *src, uint8_t *ydst, uint8_t *udst, uint8_t *vdst, - long width, long height, - long lumStride, long chromStride, long srcStride) L1CODE; +int ff_bfin_uyvytoyv12(const uint8_t *src, uint8_t *ydst, uint8_t *udst, uint8_t *vdst, + long width, long height, + long lumStride, long chromStride, long srcStride) L1CODE; -int ff_bfin_yuyvtoyv12 (const uint8_t *src, uint8_t *ydst, uint8_t *udst, uint8_t *vdst, - long width, long height, - long lumStride, long chromStride, long srcStride) L1CODE; +int ff_bfin_yuyvtoyv12(const uint8_t *src, uint8_t *ydst, uint8_t *udst, uint8_t *vdst, + long width, long height, + long lumStride, long chromStride, long srcStride) L1CODE; -static int uyvytoyv12_unscaled (SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, - int srcSliceH, uint8_t* dst[], int dstStride[]) +static int uyvytoyv12_unscaled(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, + int srcSliceH, uint8_t* dst[], int dstStride[]) { uint8_t *dsty = dst[0] + dstStride[0]*srcSliceY; uint8_t *dstu = dst[1] + dstStride[1]*srcSliceY/2; @@ -54,13 +54,14 @@ static int uyvytoyv12_unscaled (SwsContext *c, uint8_t* src[], int srcStride[], uint8_t *ip = src[0] + srcStride[0]*srcSliceY; int w = dstStride[0]; - ff_bfin_uyvytoyv12 (ip, dsty, dstu, dstv, w, srcSliceH, dstStride[0], dstStride[1], srcStride[0]); + ff_bfin_uyvytoyv12(ip, dsty, dstu, dstv, w, srcSliceH, + dstStride[0], dstStride[1], srcStride[0]); return srcSliceH; } -static int yuyvtoyv12_unscaled (SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, - int srcSliceH, uint8_t* dst[], int dstStride[]) +static int yuyvtoyv12_unscaled(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, + int srcSliceH, uint8_t* dst[], int dstStride[]) { uint8_t *dsty = dst[0] + dstStride[0]*srcSliceY; uint8_t *dstu = dst[1] + dstStride[1]*srcSliceY/2; @@ -68,13 +69,14 @@ static int yuyvtoyv12_unscaled (SwsContext *c, uint8_t* src[], int srcStride[], uint8_t *ip = src[0] + srcStride[0]*srcSliceY; int w = dstStride[0]; - ff_bfin_yuyvtoyv12 (ip, dsty, dstu, dstv, w, srcSliceH, dstStride[0], dstStride[1], srcStride[0]); + ff_bfin_yuyvtoyv12(ip, dsty, dstu, dstv, w, srcSliceH, + dstStride[0], dstStride[1], srcStride[0]); return srcSliceH; } -void ff_bfin_get_unscaled_swscale (SwsContext *c) +void ff_bfin_get_unscaled_swscale(SwsContext *c) { SwsFunc swScale = c->swScale; if (c->flags & SWS_CPU_CAPS_BFIN) diff --git a/libswscale/yuv2rgb_bfin.c b/libswscale/bfin/yuv2rgb_bfin.c index 58cc5b6a35..39e1ec87b5 100644 --- a/libswscale/yuv2rgb_bfin.c +++ b/libswscale/bfin/yuv2rgb_bfin.c @@ -28,9 +28,9 @@ #include <assert.h> #include "config.h" #include <unistd.h> -#include "rgb2rgb.h" -#include "swscale.h" -#include "swscale_internal.h" +#include "libswscale/rgb2rgb.h" +#include "libswscale/swscale.h" +#include "libswscale/swscale_internal.h" #ifdef __FDPIC__ #define L1CODE __attribute__ ((l1_text)) @@ -38,20 +38,20 @@ #define L1CODE #endif -void ff_bfin_yuv2rgb555_line (uint8_t *Y, uint8_t *U, uint8_t *V, uint8_t *out, - int w, uint32_t *coeffs) L1CODE; - -void ff_bfin_yuv2rgb565_line (uint8_t *Y, uint8_t *U, uint8_t *V, uint8_t *out, - int w, uint32_t *coeffs) L1CODE; +void ff_bfin_yuv2rgb555_line(uint8_t *Y, uint8_t *U, uint8_t *V, uint8_t *out, + int w, uint32_t *coeffs) L1CODE; -void ff_bfin_yuv2rgb24_line (uint8_t *Y, uint8_t *U, uint8_t *V, uint8_t *out, +void ff_bfin_yuv2rgb565_line(uint8_t *Y, uint8_t *U, uint8_t *V, uint8_t *out, int w, uint32_t *coeffs) L1CODE; +void ff_bfin_yuv2rgb24_line(uint8_t *Y, uint8_t *U, uint8_t *V, uint8_t *out, + int w, uint32_t *coeffs) L1CODE; + typedef void (* ltransform)(uint8_t *Y, uint8_t *U, uint8_t *V, uint8_t *out, int w, uint32_t *coeffs); -static void bfin_prepare_coefficients (SwsContext *c, int rgb, int masks) +static void bfin_prepare_coefficients(SwsContext *c, int rgb, int masks) { int oy; oy = c->yOffset&0xffff; @@ -88,18 +88,18 @@ static void bfin_prepare_coefficients (SwsContext *c, int rgb, int masks) } } -static int core_yuv420_rgb (SwsContext *c, - uint8_t **in, int *instrides, - int srcSliceY, int srcSliceH, - uint8_t **oplanes, int *outstrides, - ltransform lcscf, int rgb, int masks) +static int core_yuv420_rgb(SwsContext *c, + uint8_t **in, int *instrides, + int srcSliceY, int srcSliceH, + uint8_t **oplanes, int *outstrides, + ltransform lcscf, int rgb, int masks) { uint8_t *py,*pu,*pv,*op; int w = instrides[0]; int h2 = srcSliceH>>1; int i; - bfin_prepare_coefficients (c, rgb, masks); + bfin_prepare_coefficients(c, rgb, masks); py = in[0]; pu = in[1+(1^rgb)]; @@ -109,12 +109,12 @@ static int core_yuv420_rgb (SwsContext *c, for (i=0;i<h2;i++) { - lcscf (py, pu, pv, op, w, &c->oy); + lcscf(py, pu, pv, op, w, &c->oy); py += instrides[0]; op += outstrides[0]; - lcscf (py, pu, pv, op, w, &c->oy); + lcscf(py, pu, pv, op, w, &c->oy); py += instrides[0]; pu += instrides[1]; @@ -126,62 +126,62 @@ static int core_yuv420_rgb (SwsContext *c, } -static int bfin_yuv420_rgb555 (SwsContext *c, - uint8_t **in, int *instrides, - int srcSliceY, int srcSliceH, - uint8_t **oplanes, int *outstrides) -{ - return core_yuv420_rgb (c, in, instrides, srcSliceY, srcSliceH, oplanes, outstrides, - ff_bfin_yuv2rgb555_line, 1, 555); -} - -static int bfin_yuv420_bgr555 (SwsContext *c, - uint8_t **in, int *instrides, - int srcSliceY, int srcSliceH, - uint8_t **oplanes, int *outstrides) -{ - return core_yuv420_rgb (c, in, instrides, srcSliceY, srcSliceH, oplanes, outstrides, - ff_bfin_yuv2rgb555_line, 0, 555); -} - -static int bfin_yuv420_rgb24 (SwsContext *c, +static int bfin_yuv420_rgb555(SwsContext *c, uint8_t **in, int *instrides, int srcSliceY, int srcSliceH, uint8_t **oplanes, int *outstrides) { - return core_yuv420_rgb (c, in, instrides, srcSliceY, srcSliceH, oplanes, outstrides, - ff_bfin_yuv2rgb24_line, 1, 888); + return core_yuv420_rgb(c, in, instrides, srcSliceY, srcSliceH, oplanes, + outstrides, ff_bfin_yuv2rgb555_line, 1, 555); } -static int bfin_yuv420_bgr24 (SwsContext *c, +static int bfin_yuv420_bgr555(SwsContext *c, uint8_t **in, int *instrides, int srcSliceY, int srcSliceH, uint8_t **oplanes, int *outstrides) { - return core_yuv420_rgb (c, in, instrides, srcSliceY, srcSliceH, oplanes, outstrides, - ff_bfin_yuv2rgb24_line, 0, 888); + return core_yuv420_rgb(c, in, instrides, srcSliceY, srcSliceH, oplanes, + outstrides, ff_bfin_yuv2rgb555_line, 0, 555); } -static int bfin_yuv420_rgb565 (SwsContext *c, - uint8_t **in, int *instrides, - int srcSliceY, int srcSliceH, - uint8_t **oplanes, int *outstrides) +static int bfin_yuv420_rgb24(SwsContext *c, + uint8_t **in, int *instrides, + int srcSliceY, int srcSliceH, + uint8_t **oplanes, int *outstrides) { - return core_yuv420_rgb (c, in, instrides, srcSliceY, srcSliceH, oplanes, outstrides, - ff_bfin_yuv2rgb565_line, 1, 565); + return core_yuv420_rgb(c, in, instrides, srcSliceY, srcSliceH, oplanes, + outstrides, ff_bfin_yuv2rgb24_line, 1, 888); } -static int bfin_yuv420_bgr565 (SwsContext *c, - uint8_t **in, int *instrides, - int srcSliceY, int srcSliceH, - uint8_t **oplanes, int *outstrides) +static int bfin_yuv420_bgr24(SwsContext *c, + uint8_t **in, int *instrides, + int srcSliceY, int srcSliceH, + uint8_t **oplanes, int *outstrides) +{ + return core_yuv420_rgb(c, in, instrides, srcSliceY, srcSliceH, oplanes, + outstrides, ff_bfin_yuv2rgb24_line, 0, 888); +} + +static int bfin_yuv420_rgb565(SwsContext *c, + uint8_t **in, int *instrides, + int srcSliceY, int srcSliceH, + uint8_t **oplanes, int *outstrides) +{ + return core_yuv420_rgb(c, in, instrides, srcSliceY, srcSliceH, oplanes, + outstrides, ff_bfin_yuv2rgb565_line, 1, 565); +} + +static int bfin_yuv420_bgr565(SwsContext *c, + uint8_t **in, int *instrides, + int srcSliceY, int srcSliceH, + uint8_t **oplanes, int *outstrides) { - return core_yuv420_rgb (c, in, instrides, srcSliceY, srcSliceH, oplanes, outstrides, - ff_bfin_yuv2rgb565_line, 0, 565); + return core_yuv420_rgb(c, in, instrides, srcSliceY, srcSliceH, oplanes, + outstrides, ff_bfin_yuv2rgb565_line, 0, 565); } -SwsFunc ff_bfin_yuv2rgb_get_func_ptr (SwsContext *c) +SwsFunc ff_yuv2rgb_get_func_ptr_bfin(SwsContext *c) { SwsFunc f; diff --git a/libswscale/cs_test.c b/libswscale/colorspace-test.c index 2223ee3a31..2223ee3a31 100644 --- a/libswscale/cs_test.c +++ b/libswscale/colorspace-test.c diff --git a/libswscale/yuv2rgb_mlib.c b/libswscale/mlib/yuv2rgb_mlib.c index 68247914e7..a4bdd1986c 100644 --- a/libswscale/yuv2rgb_mlib.c +++ b/libswscale/mlib/yuv2rgb_mlib.c @@ -28,7 +28,7 @@ #include <stdlib.h> #include <assert.h> -#include "swscale.h" +#include "libswscale/swscale.h" static int mlib_YUV2ARGB420_32(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t* dst[], int dstStride[]){ @@ -73,7 +73,7 @@ static int mlib_YUV2RGB420_24(SwsContext *c, uint8_t* src[], int srcStride[], in } -SwsFunc sws_yuv2rgb_init_mlib(SwsContext *c) +SwsFunc ff_yuv2rgb_init_mlib(SwsContext *c) { switch(c->dstFormat){ case PIX_FMT_RGB24: return mlib_YUV2RGB420_24; diff --git a/libswscale/swscale_altivec_template.c b/libswscale/ppc/swscale_altivec_template.c index a008b966e8..0bf620bc83 100644 --- a/libswscale/swscale_altivec_template.c +++ b/libswscale/ppc/swscale_altivec_template.c @@ -6,18 +6,18 @@ * * This file is part of FFmpeg. * - * FFmpeg is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. * * FFmpeg is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with FFmpeg; if not, write to the Free Software + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ diff --git a/libswscale/yuv2rgb_altivec.c b/libswscale/ppc/yuv2rgb_altivec.c index b3a87a0360..dc5894cda5 100644 --- a/libswscale/yuv2rgb_altivec.c +++ b/libswscale/ppc/yuv2rgb_altivec.c @@ -91,9 +91,9 @@ adjustment. #include <inttypes.h> #include <assert.h> #include "config.h" -#include "rgb2rgb.h" -#include "swscale.h" -#include "swscale_internal.h" +#include "libswscale/rgb2rgb.h" +#include "libswscale/swscale.h" +#include "libswscale/swscale_internal.h" #undef PROFILE_THE_BEAST #undef INC_SCALING @@ -690,7 +690,7 @@ static int altivec_uyvy_rgb32 (SwsContext *c, So we just fall back to the C codes for this. */ -SwsFunc sws_yuv2rgb_init_altivec (SwsContext *c) +SwsFunc ff_yuv2rgb_init_altivec(SwsContext *c) { if (!(c->flags & SWS_CPU_CAPS_ALTIVEC)) return NULL; @@ -750,7 +750,7 @@ SwsFunc sws_yuv2rgb_init_altivec (SwsContext *c) return NULL; } -void sws_yuv2rgb_altivec_init_tables (SwsContext *c, const int inv_table[4],int brightness,int contrast, int saturation) +void ff_yuv2rgb_init_tables_altivec(SwsContext *c, const int inv_table[4], int brightness, int contrast, int saturation) { union { signed short tmp[8] __attribute__ ((aligned(16))); @@ -786,7 +786,7 @@ void sws_yuv2rgb_altivec_init_tables (SwsContext *c, const int inv_table[4],int void -altivec_yuv2packedX (SwsContext *c, +ff_yuv2packedX_altivec(SwsContext *c, int16_t *lumFilter, int16_t **lumSrc, int lumFilterSize, int16_t *chrFilter, int16_t **chrSrc, int chrFilterSize, uint8_t *dest, int dstW, int dstY) diff --git a/libswscale/rgb2rgb.c b/libswscale/rgb2rgb.c index ad69265c37..59b8e30a63 100644 --- a/libswscale/rgb2rgb.c +++ b/libswscale/rgb2rgb.c @@ -87,6 +87,19 @@ void (*yvu9_to_yuy2)(const uint8_t *src1, const uint8_t *src2, const uint8_t *sr long width, long height, long srcStride1, long srcStride2, long srcStride3, long dstStride); +void (*uyvytoyuv420)(uint8_t *ydst, uint8_t *udst, uint8_t *vdst, const uint8_t *src, + long width, long height, + long lumStride, long chromStride, long srcStride); +void (*uyvytoyuv422)(uint8_t *ydst, uint8_t *udst, uint8_t *vdst, const uint8_t *src, + long width, long height, + long lumStride, long chromStride, long srcStride); +void (*yuyvtoyuv420)(uint8_t *ydst, uint8_t *udst, uint8_t *vdst, const uint8_t *src, + long width, long height, + long lumStride, long chromStride, long srcStride); +void (*yuyvtoyuv422)(uint8_t *ydst, uint8_t *udst, uint8_t *vdst, const uint8_t *src, + long width, long height, + long lumStride, long chromStride, long srcStride); + #if ARCH_X86 && CONFIG_GPL DECLARE_ASM_CONST(8, uint64_t, mmx_null) = 0x0000000000000000ULL; diff --git a/libswscale/rgb2rgb.h b/libswscale/rgb2rgb.h index df912c8533..3850ef291d 100644 --- a/libswscale/rgb2rgb.h +++ b/libswscale/rgb2rgb.h @@ -142,6 +142,20 @@ extern void (*yvu9_to_yuy2)(const uint8_t *src1, const uint8_t *src2, const uint long srcStride1, long srcStride2, long srcStride3, long dstStride); + +extern void (*uyvytoyuv420)(uint8_t *ydst, uint8_t *udst, uint8_t *vdst, const uint8_t *src, + long width, long height, + long lumStride, long chromStride, long srcStride); +extern void (*uyvytoyuv422)(uint8_t *ydst, uint8_t *udst, uint8_t *vdst, const uint8_t *src, + long width, long height, + long lumStride, long chromStride, long srcStride); +extern void (*yuyvtoyuv420)(uint8_t *ydst, uint8_t *udst, uint8_t *vdst, const uint8_t *src, + long width, long height, + long lumStride, long chromStride, long srcStride); +extern void (*yuyvtoyuv422)(uint8_t *ydst, uint8_t *udst, uint8_t *vdst, const uint8_t *src, + long width, long height, + long lumStride, long chromStride, long srcStride); + void sws_rgb2rgb_init(int flags); #endif /* SWSCALE_RGB2RGB_H */ diff --git a/libswscale/rgb2rgb_template.c b/libswscale/rgb2rgb_template.c index b03f6424f7..09a57cab81 100644 --- a/libswscale/rgb2rgb_template.c +++ b/libswscale/rgb2rgb_template.c @@ -1339,7 +1339,7 @@ static inline void RENAME(rgb16to32)(const uint8_t *src, uint8_t *dst, long src_ static inline void RENAME(rgb32tobgr32)(const uint8_t *src, uint8_t *dst, long src_size) { - long idx = 15 - src_size; + x86_reg idx = 15 - src_size; const uint8_t *s = src-idx; uint8_t *d = dst-idx; #if HAVE_MMX @@ -1405,7 +1405,7 @@ static inline void RENAME(rgb24tobgr24)(const uint8_t *src, uint8_t *dst, long s { unsigned i; #if HAVE_MMX - long mmx_size= 23 - src_size; + x86_reg mmx_size= 23 - src_size; __asm__ volatile ( "test %%"REG_a", %%"REG_a" \n\t" "jns 2f \n\t" @@ -1476,7 +1476,7 @@ static inline void RENAME(yuvPlanartoyuy2)(const uint8_t *ysrc, const uint8_t *u long lumStride, long chromStride, long dstStride, long vertLumPerChroma) { long y; - const long chromWidth= width>>1; + const x86_reg chromWidth= width>>1; for (y=0; y<height; y++) { #if HAVE_MMX @@ -1628,7 +1628,7 @@ static inline void RENAME(yuvPlanartouyvy)(const uint8_t *ysrc, const uint8_t *u long lumStride, long chromStride, long dstStride, long vertLumPerChroma) { long y; - const long chromWidth= width>>1; + const x86_reg chromWidth= width>>1; for (y=0; y<height; y++) { #if HAVE_MMX @@ -1758,7 +1758,7 @@ static inline void RENAME(yuy2toyv12)(const uint8_t *src, uint8_t *ydst, uint8_t long lumStride, long chromStride, long srcStride) { long y; - const long chromWidth= width>>1; + const x86_reg chromWidth= width>>1; for (y=0; y<height; y+=2) { #if HAVE_MMX @@ -1900,7 +1900,7 @@ static inline void RENAME(planar2x)(const uint8_t *src, uint8_t *dst, long srcWi for (y=1; y<srcHeight; y++){ #if HAVE_MMX2 || HAVE_AMD3DNOW - const long mmxSize= srcWidth&~15; + const x86_reg mmxSize= srcWidth&~15; __asm__ volatile( "mov %4, %%"REG_a" \n\t" "1: \n\t" @@ -1944,7 +1944,7 @@ static inline void RENAME(planar2x)(const uint8_t *src, uint8_t *dst, long srcWi ); #else - const long mmxSize=1; + const x86_reg mmxSize=1; #endif dst[0 ]= (3*src[0] + src[srcStride])>>2; dst[dstStride]= ( src[0] + 3*src[srcStride])>>2; @@ -1996,7 +1996,7 @@ static inline void RENAME(uyvytoyv12)(const uint8_t *src, uint8_t *ydst, uint8_t long lumStride, long chromStride, long srcStride) { long y; - const long chromWidth= width>>1; + const x86_reg chromWidth= width>>1; for (y=0; y<height; y+=2) { #if HAVE_MMX @@ -2123,7 +2123,7 @@ static inline void RENAME(rgb24toyv12)(const uint8_t *src, uint8_t *ydst, uint8_ long lumStride, long chromStride, long srcStride) { long y; - const long chromWidth= width>>1; + const x86_reg chromWidth= width>>1; #if HAVE_MMX for (y=0; y<height-2; y+=2) { @@ -2196,7 +2196,7 @@ static inline void RENAME(rgb24toyv12)(const uint8_t *src, uint8_t *ydst, uint8_ MOVNTQ" %%mm0, (%1, %%"REG_a") \n\t" "add $8, %%"REG_a" \n\t" " js 1b \n\t" - : : "r" (src+width*3), "r" (ydst+width), "g" (-width) + : : "r" (src+width*3), "r" (ydst+width), "g" ((x86_reg)-width) : "%"REG_a, "%"REG_d ); ydst += lumStride; @@ -2440,7 +2440,7 @@ static void RENAME(interleaveBytes)(uint8_t *src1, uint8_t *src2, uint8_t *dest, "add $16, %%"REG_a" \n\t" "cmp %3, %%"REG_a" \n\t" " jb 1b \n\t" - ::"r"(dest), "r"(src1), "r"(src2), "r" (width-15) + ::"r"(dest), "r"(src1), "r"(src2), "r" ((x86_reg)width-15) : "memory", "%"REG_a"" ); #else @@ -2466,7 +2466,7 @@ static void RENAME(interleaveBytes)(uint8_t *src1, uint8_t *src2, uint8_t *dest, "add $16, %%"REG_a" \n\t" "cmp %3, %%"REG_a" \n\t" " jb 1b \n\t" - ::"r"(dest), "r"(src1), "r"(src2), "r" (width-15) + ::"r"(dest), "r"(src1), "r"(src2), "r" ((x86_reg)width-15) : "memory", "%"REG_a ); #endif @@ -2501,7 +2501,8 @@ static inline void RENAME(vu9_to_vu12)(const uint8_t *src1, const uint8_t *src2, long srcStride1, long srcStride2, long dstStride1, long dstStride2) { - long y,x,w,h; + x86_reg y; + long x,w,h; w=width/2; h=height/2; #if HAVE_MMX __asm__ volatile( @@ -2604,7 +2605,8 @@ static inline void RENAME(yvu9_to_yuy2)(const uint8_t *src1, const uint8_t *src2 long srcStride1, long srcStride2, long srcStride3, long dstStride) { - long y,x,w,h; + x86_reg x; + long y,w,h; w=width/2; h=height; for (y=0;y<h;y++){ const uint8_t* yp=src1+srcStride1*y; @@ -2689,6 +2691,354 @@ static inline void RENAME(yvu9_to_yuy2)(const uint8_t *src1, const uint8_t *src2 #endif } +static void RENAME(extract_even)(const uint8_t *src, uint8_t *dst, x86_reg count) +{ + dst += count; + src += 2*count; + count= - count; + +#if HAVE_MMX + if(count <= -16){ + count += 15; + __asm__ volatile( + "pcmpeqw %%mm7, %%mm7 \n\t" + "psrlw $8, %%mm7 \n\t" + "1: \n\t" + "movq -30(%1, %0, 2), %%mm0 \n\t" + "movq -22(%1, %0, 2), %%mm1 \n\t" + "movq -14(%1, %0, 2), %%mm2 \n\t" + "movq -6(%1, %0, 2), %%mm3 \n\t" + "pand %%mm7, %%mm0 \n\t" + "pand %%mm7, %%mm1 \n\t" + "pand %%mm7, %%mm2 \n\t" + "pand %%mm7, %%mm3 \n\t" + "packuswb %%mm1, %%mm0 \n\t" + "packuswb %%mm3, %%mm2 \n\t" + MOVNTQ" %%mm0,-15(%2, %0) \n\t" + MOVNTQ" %%mm2,- 7(%2, %0) \n\t" + "add $16, %0 \n\t" + " js 1b \n\t" + : "+r"(count) + : "r"(src), "r"(dst) + ); + count -= 15; + } +#endif + while(count<0){ + dst[count]= src[2*count]; + count++; + } +} + +static void RENAME(extract_even2)(const uint8_t *src, uint8_t *dst0, uint8_t *dst1, x86_reg count) +{ + dst0+= count; + dst1+= count; + src += 4*count; + count= - count; +#if HAVE_MMX + if(count <= -8){ + count += 7; + __asm__ volatile( + "pcmpeqw %%mm7, %%mm7 \n\t" + "psrlw $8, %%mm7 \n\t" + "1: \n\t" + "movq -28(%1, %0, 4), %%mm0 \n\t" + "movq -20(%1, %0, 4), %%mm1 \n\t" + "movq -12(%1, %0, 4), %%mm2 \n\t" + "movq -4(%1, %0, 4), %%mm3 \n\t" + "pand %%mm7, %%mm0 \n\t" + "pand %%mm7, %%mm1 \n\t" + "pand %%mm7, %%mm2 \n\t" + "pand %%mm7, %%mm3 \n\t" + "packuswb %%mm1, %%mm0 \n\t" + "packuswb %%mm3, %%mm2 \n\t" + "movq %%mm0, %%mm1 \n\t" + "movq %%mm2, %%mm3 \n\t" + "psrlw $8, %%mm0 \n\t" + "psrlw $8, %%mm2 \n\t" + "pand %%mm7, %%mm1 \n\t" + "pand %%mm7, %%mm3 \n\t" + "packuswb %%mm2, %%mm0 \n\t" + "packuswb %%mm3, %%mm1 \n\t" + MOVNTQ" %%mm0,- 7(%3, %0) \n\t" + MOVNTQ" %%mm1,- 7(%2, %0) \n\t" + "add $8, %0 \n\t" + " js 1b \n\t" + : "+r"(count) + : "r"(src), "r"(dst0), "r"(dst1) + ); + count -= 7; + } +#endif + while(count<0){ + dst0[count]= src[4*count+0]; + dst1[count]= src[4*count+2]; + count++; + } +} + +static void RENAME(extract_even2avg)(const uint8_t *src0, const uint8_t *src1, uint8_t *dst0, uint8_t *dst1, x86_reg count) +{ + dst0 += count; + dst1 += count; + src0 += 4*count; + src1 += 4*count; + count= - count; +#ifdef PAVGB + if(count <= -8){ + count += 7; + __asm__ volatile( + "pcmpeqw %%mm7, %%mm7 \n\t" + "psrlw $8, %%mm7 \n\t" + "1: \n\t" + "movq -28(%1, %0, 4), %%mm0 \n\t" + "movq -20(%1, %0, 4), %%mm1 \n\t" + "movq -12(%1, %0, 4), %%mm2 \n\t" + "movq -4(%1, %0, 4), %%mm3 \n\t" + PAVGB" -28(%2, %0, 4), %%mm0 \n\t" + PAVGB" -20(%2, %0, 4), %%mm1 \n\t" + PAVGB" -12(%2, %0, 4), %%mm2 \n\t" + PAVGB" - 4(%2, %0, 4), %%mm3 \n\t" + "pand %%mm7, %%mm0 \n\t" + "pand %%mm7, %%mm1 \n\t" + "pand %%mm7, %%mm2 \n\t" + "pand %%mm7, %%mm3 \n\t" + "packuswb %%mm1, %%mm0 \n\t" + "packuswb %%mm3, %%mm2 \n\t" + "movq %%mm0, %%mm1 \n\t" + "movq %%mm2, %%mm3 \n\t" + "psrlw $8, %%mm0 \n\t" + "psrlw $8, %%mm2 \n\t" + "pand %%mm7, %%mm1 \n\t" + "pand %%mm7, %%mm3 \n\t" + "packuswb %%mm2, %%mm0 \n\t" + "packuswb %%mm3, %%mm1 \n\t" + MOVNTQ" %%mm0,- 7(%4, %0) \n\t" + MOVNTQ" %%mm1,- 7(%3, %0) \n\t" + "add $8, %0 \n\t" + " js 1b \n\t" + : "+r"(count) + : "r"(src0), "r"(src1), "r"(dst0), "r"(dst1) + ); + count -= 7; + } +#endif + while(count<0){ + dst0[count]= (src0[4*count+0]+src1[4*count+0])>>1; + dst1[count]= (src0[4*count+2]+src1[4*count+2])>>1; + count++; + } +} + +static void RENAME(extract_odd2)(const uint8_t *src, uint8_t *dst0, uint8_t *dst1, x86_reg count) +{ + dst0+= count; + dst1+= count; + src += 4*count; + count= - count; +#if HAVE_MMX + if(count <= -8){ + count += 7; + __asm__ volatile( + "pcmpeqw %%mm7, %%mm7 \n\t" + "psrlw $8, %%mm7 \n\t" + "1: \n\t" + "movq -28(%1, %0, 4), %%mm0 \n\t" + "movq -20(%1, %0, 4), %%mm1 \n\t" + "movq -12(%1, %0, 4), %%mm2 \n\t" + "movq -4(%1, %0, 4), %%mm3 \n\t" + "psrlw $8, %%mm0 \n\t" + "psrlw $8, %%mm1 \n\t" + "psrlw $8, %%mm2 \n\t" + "psrlw $8, %%mm3 \n\t" + "packuswb %%mm1, %%mm0 \n\t" + "packuswb %%mm3, %%mm2 \n\t" + "movq %%mm0, %%mm1 \n\t" + "movq %%mm2, %%mm3 \n\t" + "psrlw $8, %%mm0 \n\t" + "psrlw $8, %%mm2 \n\t" + "pand %%mm7, %%mm1 \n\t" + "pand %%mm7, %%mm3 \n\t" + "packuswb %%mm2, %%mm0 \n\t" + "packuswb %%mm3, %%mm1 \n\t" + MOVNTQ" %%mm0,- 7(%3, %0) \n\t" + MOVNTQ" %%mm1,- 7(%2, %0) \n\t" + "add $8, %0 \n\t" + " js 1b \n\t" + : "+r"(count) + : "r"(src), "r"(dst0), "r"(dst1) + ); + count -= 7; + } +#endif + src++; + while(count<0){ + dst0[count]= src[4*count+0]; + dst1[count]= src[4*count+2]; + count++; + } +} + +static void RENAME(extract_odd2avg)(const uint8_t *src0, const uint8_t *src1, uint8_t *dst0, uint8_t *dst1, x86_reg count) +{ + dst0 += count; + dst1 += count; + src0 += 4*count; + src1 += 4*count; + count= - count; +#ifdef PAVGB + if(count <= -8){ + count += 7; + __asm__ volatile( + "pcmpeqw %%mm7, %%mm7 \n\t" + "psrlw $8, %%mm7 \n\t" + "1: \n\t" + "movq -28(%1, %0, 4), %%mm0 \n\t" + "movq -20(%1, %0, 4), %%mm1 \n\t" + "movq -12(%1, %0, 4), %%mm2 \n\t" + "movq -4(%1, %0, 4), %%mm3 \n\t" + PAVGB" -28(%2, %0, 4), %%mm0 \n\t" + PAVGB" -20(%2, %0, 4), %%mm1 \n\t" + PAVGB" -12(%2, %0, 4), %%mm2 \n\t" + PAVGB" - 4(%2, %0, 4), %%mm3 \n\t" + "psrlw $8, %%mm0 \n\t" + "psrlw $8, %%mm1 \n\t" + "psrlw $8, %%mm2 \n\t" + "psrlw $8, %%mm3 \n\t" + "packuswb %%mm1, %%mm0 \n\t" + "packuswb %%mm3, %%mm2 \n\t" + "movq %%mm0, %%mm1 \n\t" + "movq %%mm2, %%mm3 \n\t" + "psrlw $8, %%mm0 \n\t" + "psrlw $8, %%mm2 \n\t" + "pand %%mm7, %%mm1 \n\t" + "pand %%mm7, %%mm3 \n\t" + "packuswb %%mm2, %%mm0 \n\t" + "packuswb %%mm3, %%mm1 \n\t" + MOVNTQ" %%mm0,- 7(%4, %0) \n\t" + MOVNTQ" %%mm1,- 7(%3, %0) \n\t" + "add $8, %0 \n\t" + " js 1b \n\t" + : "+r"(count) + : "r"(src0), "r"(src1), "r"(dst0), "r"(dst1) + ); + count -= 7; + } +#endif + src0++; + src1++; + while(count<0){ + dst0[count]= (src0[4*count+0]+src1[4*count+0])>>1; + dst1[count]= (src0[4*count+2]+src1[4*count+2])>>1; + count++; + } +} + +static void RENAME(yuyvtoyuv420)(uint8_t *ydst, uint8_t *udst, uint8_t *vdst, const uint8_t *src, + long width, long height, + long lumStride, long chromStride, long srcStride) +{ + long y; + const long chromWidth= -((-width)>>1); + + for (y=0; y<height; y++){ + RENAME(extract_even)(src, ydst, width); + if(y&1){ + RENAME(extract_odd2avg)(src-srcStride, src, udst, vdst, chromWidth); + udst+= chromStride; + vdst+= chromStride; + } + + src += srcStride; + ydst+= lumStride; + } +#if HAVE_MMX + __asm__( + EMMS" \n\t" + SFENCE" \n\t" + ::: "memory" + ); +#endif +} + +static void RENAME(yuyvtoyuv422)(uint8_t *ydst, uint8_t *udst, uint8_t *vdst, const uint8_t *src, + long width, long height, + long lumStride, long chromStride, long srcStride) +{ + long y; + const long chromWidth= -((-width)>>1); + + for (y=0; y<height; y++){ + RENAME(extract_even)(src, ydst, width); + RENAME(extract_odd2)(src, udst, vdst, chromWidth); + + src += srcStride; + ydst+= lumStride; + udst+= chromStride; + vdst+= chromStride; + } +#if HAVE_MMX + __asm__( + EMMS" \n\t" + SFENCE" \n\t" + ::: "memory" + ); +#endif +} + +static void RENAME(uyvytoyuv420)(uint8_t *ydst, uint8_t *udst, uint8_t *vdst, const uint8_t *src, + long width, long height, + long lumStride, long chromStride, long srcStride) +{ + long y; + const long chromWidth= -((-width)>>1); + + for (y=0; y<height; y++){ + RENAME(extract_even)(src+1, ydst, width); + if(y&1){ + RENAME(extract_even2avg)(src-srcStride, src, udst, vdst, chromWidth); + udst+= chromStride; + vdst+= chromStride; + } + + src += srcStride; + ydst+= lumStride; + } +#if HAVE_MMX + __asm__( + EMMS" \n\t" + SFENCE" \n\t" + ::: "memory" + ); +#endif +} + +static void RENAME(uyvytoyuv422)(uint8_t *ydst, uint8_t *udst, uint8_t *vdst, const uint8_t *src, + long width, long height, + long lumStride, long chromStride, long srcStride) +{ + long y; + const long chromWidth= -((-width)>>1); + + for (y=0; y<height; y++){ + RENAME(extract_even)(src+1, ydst, width); + RENAME(extract_even2)(src, udst, vdst, chromWidth); + + src += srcStride; + ydst+= lumStride; + udst+= chromStride; + vdst+= chromStride; + } +#if HAVE_MMX + __asm__( + EMMS" \n\t" + SFENCE" \n\t" + ::: "memory" + ); +#endif +} + static inline void RENAME(rgb2rgb_init)(void){ rgb15to16 = RENAME(rgb15to16); rgb15tobgr24 = RENAME(rgb15tobgr24); @@ -2713,11 +3063,15 @@ static inline void RENAME(rgb2rgb_init)(void){ yuv422ptoyuy2 = RENAME(yuv422ptoyuy2); yuv422ptouyvy = RENAME(yuv422ptouyvy); yuy2toyv12 = RENAME(yuy2toyv12); -// uyvytoyv12 = RENAME(uyvytoyv12); // yvu9toyv12 = RENAME(yvu9toyv12); planar2x = RENAME(planar2x); rgb24toyv12 = RENAME(rgb24toyv12); interleaveBytes = RENAME(interleaveBytes); vu9_to_vu12 = RENAME(vu9_to_vu12); yvu9_to_yuy2 = RENAME(yvu9_to_yuy2); + + uyvytoyuv420 = RENAME(uyvytoyuv420); + uyvytoyuv422 = RENAME(uyvytoyuv422); + yuyvtoyuv420 = RENAME(yuyvtoyuv420); + yuyvtoyuv422 = RENAME(yuyvtoyuv422); } diff --git a/libswscale/yuv2rgb_vis.c b/libswscale/sparc/yuv2rgb_vis.c index 2e2737aa9f..cdbe140b20 100644 --- a/libswscale/yuv2rgb_vis.c +++ b/libswscale/sparc/yuv2rgb_vis.c @@ -22,8 +22,8 @@ #include <inttypes.h> #include <stdlib.h> -#include "swscale.h" -#include "swscale_internal.h" +#include "libswscale/swscale.h" +#include "libswscale/swscale_internal.h" #define YUV2RGB_INIT \ "wr %%g0, 0x10, %%gsr \n\t" \ @@ -184,7 +184,7 @@ static int vis_422P_ARGB32(SwsContext *c, uint8_t* src[], int srcStride[], int s return srcSliceH; } -SwsFunc sws_yuv2rgb_init_vis(SwsContext *c) { +SwsFunc ff_yuv2rgb_init_vis(SwsContext *c){ c->sparc_coeffs[5]=c->yCoeff; c->sparc_coeffs[6]=c->vgCoeff; c->sparc_coeffs[7]=c->vrCoeff; diff --git a/libswscale/swscale-example.c b/libswscale/swscale-example.c index 87b9ba027d..8d60332897 100644 --- a/libswscale/swscale-example.c +++ b/libswscale/swscale-example.c @@ -26,6 +26,7 @@ #undef HAVE_AV_CONFIG_H #include "libavutil/avutil.h" +#include "libavutil/lfg.h" #include "swscale.h" #include "swscale_internal.h" @@ -48,19 +49,20 @@ static uint64_t getSSD(uint8_t *src1, uint8_t *src2, int stride1, int stride2, i // test by ref -> src -> dst -> out & compare out against ref // ref & out are YV12 -static int doTest(uint8_t *ref[3], int refStride[3], int w, int h, int srcFormat, int dstFormat, +static int doTest(uint8_t *ref[4], int refStride[4], int w, int h, int srcFormat, int dstFormat, int srcW, int srcH, int dstW, int dstH, int flags){ - uint8_t *src[3]; - uint8_t *dst[3]; - uint8_t *out[3]; - int srcStride[3], dstStride[3]; + uint8_t *src[4] = {0}; + uint8_t *dst[4] = {0}; + uint8_t *out[4] = {0}; + int srcStride[4], dstStride[4]; int i; - uint64_t ssdY, ssdU, ssdV; - struct SwsContext *srcContext, *dstContext, *outContext; + uint64_t ssdY, ssdU, ssdV, ssdA=0; + struct SwsContext *srcContext = NULL, *dstContext = NULL, + *outContext = NULL; int res; res = 0; - for (i=0; i<3; i++){ + for (i=0; i<4; i++){ // avoid stride % bpp != 0 if (srcFormat==PIX_FMT_RGB24 || srcFormat==PIX_FMT_BGR24) srcStride[i]= srcW*3; @@ -83,11 +85,10 @@ static int doTest(uint8_t *ref[3], int refStride[3], int w, int h, int srcFormat } } - dstContext = outContext = NULL; - srcContext= sws_getContext(w, h, PIX_FMT_YUV420P, srcW, srcH, srcFormat, flags, NULL, NULL, NULL); + srcContext= sws_getContext(w, h, PIX_FMT_YUVA420P, srcW, srcH, srcFormat, flags, NULL, NULL, NULL); if (!srcContext) { fprintf(stderr, "Failed to get %s ---> %s\n", - sws_format_name(PIX_FMT_YUV420P), + sws_format_name(PIX_FMT_YUVA420P), sws_format_name(srcFormat)); res = -1; @@ -102,11 +103,11 @@ static int doTest(uint8_t *ref[3], int refStride[3], int w, int h, int srcFormat goto end; } - outContext= sws_getContext(dstW, dstH, dstFormat, w, h, PIX_FMT_YUV420P, flags, NULL, NULL, NULL); + outContext= sws_getContext(dstW, dstH, dstFormat, w, h, PIX_FMT_YUVA420P, flags, NULL, NULL, NULL); if (!outContext) { fprintf(stderr, "Failed to get %s ---> %s\n", sws_format_name(dstFormat), - sws_format_name(PIX_FMT_YUV420P)); + sws_format_name(PIX_FMT_YUVA420P)); res = -1; goto end; @@ -121,17 +122,20 @@ static int doTest(uint8_t *ref[3], int refStride[3], int w, int h, int srcFormat ssdY= getSSD(ref[0], out[0], refStride[0], refStride[0], w, h); ssdU= getSSD(ref[1], out[1], refStride[1], refStride[1], (w+1)>>1, (h+1)>>1); ssdV= getSSD(ref[2], out[2], refStride[2], refStride[2], (w+1)>>1, (h+1)>>1); + if (isALPHA(srcFormat) && isALPHA(dstFormat)) + ssdA= getSSD(ref[3], out[3], refStride[3], refStride[3], w, h); if (srcFormat == PIX_FMT_GRAY8 || dstFormat==PIX_FMT_GRAY8) ssdU=ssdV=0; //FIXME check that output is really gray ssdY/= w*h; ssdU/= w*h/4; ssdV/= w*h/4; + ssdA/= w*h; - printf(" %s %dx%d -> %s %4dx%4d flags=%2d SSD=%5lld,%5lld,%5lld\n", + printf(" %s %dx%d -> %s %4dx%4d flags=%2d SSD=%5"PRId64",%5"PRId64",%5"PRId64",%5"PRId64"\n", sws_format_name(srcFormat), srcW, srcH, sws_format_name(dstFormat), dstW, dstH, - flags, ssdY, ssdU, ssdV); + flags, ssdY, ssdU, ssdV, ssdA); fflush(stdout); end: @@ -140,7 +144,7 @@ static int doTest(uint8_t *ref[3], int refStride[3], int w, int h, int srcFormat sws_freeContext(dstContext); sws_freeContext(outContext); - for (i=0; i<3; i++){ + for (i=0; i<4; i++){ free(src[i]); free(dst[i]); free(out[i]); @@ -149,7 +153,7 @@ static int doTest(uint8_t *ref[3], int refStride[3], int w, int h, int srcFormat return res; } -static void selfTest(uint8_t *src[3], int stride[3], int w, int h){ +static void selfTest(uint8_t *src[4], int stride[4], int w, int h){ enum PixelFormat srcFormat, dstFormat; int srcW, srcH, dstW, dstH; int flags; @@ -189,17 +193,20 @@ int main(int argc, char **argv){ uint8_t *rgb_data = malloc (W*H*4); uint8_t *rgb_src[3]= {rgb_data, NULL, NULL}; int rgb_stride[3]={4*W, 0, 0}; - uint8_t *data = malloc (3*W*H); - uint8_t *src[3]= {data, data+W*H, data+W*H*2}; - int stride[3]={W, W, W}; + uint8_t *data = malloc (4*W*H); + uint8_t *src[4]= {data, data+W*H, data+W*H*2, data+W*H*3}; + int stride[4]={W, W, W, W}; int x, y; struct SwsContext *sws; + AVLFG rand; - sws= sws_getContext(W/12, H/12, PIX_FMT_RGB32, W, H, PIX_FMT_YUV420P, 2, NULL, NULL, NULL); + sws= sws_getContext(W/12, H/12, PIX_FMT_RGB32, W, H, PIX_FMT_YUVA420P, 2, NULL, NULL, NULL); + + av_lfg_init(&rand, 1); for (y=0; y<H; y++){ for (x=0; x<W*4; x++){ - rgb_data[ x + y*4*W]= random(); + rgb_data[ x + y*4*W]= av_lfg_get(&rand); } } sws_scale(sws, rgb_src, rgb_stride, 0, H, src, stride); diff --git a/libswscale/swscale.c b/libswscale/swscale.c index c6012c15b7..316f4517e4 100644 --- a/libswscale/swscale.c +++ b/libswscale/swscale.c @@ -68,6 +68,10 @@ untested special converters #define MAP_ANONYMOUS MAP_ANON #endif #endif +#if HAVE_VIRTUALALLOC +#define WIN32_LEAN_AND_MEAN +#include <windows.h> +#endif #include "swscale.h" #include "swscale_internal.h" #include "rgb2rgb.h" @@ -133,6 +137,7 @@ unsigned swscale_version(void) ) #define isSupportedOut(x) ( \ (x)==PIX_FMT_YUV420P \ + || (x)==PIX_FMT_YUVA420P \ || (x)==PIX_FMT_YUYV422 \ || (x)==PIX_FMT_UYVY422 \ || (x)==PIX_FMT_YUV444P \ @@ -469,7 +474,7 @@ const char *sws_format_name(enum PixelFormat format) static inline void yuv2yuvXinC(int16_t *lumFilter, int16_t **lumSrc, int lumFilterSize, int16_t *chrFilter, int16_t **chrSrc, int chrFilterSize, - uint8_t *dest, uint8_t *uDest, uint8_t *vDest, int dstW, int chrDstW) + int16_t **alpSrc, uint8_t *dest, uint8_t *uDest, uint8_t *vDest, uint8_t *aDest, int dstW, int chrDstW) { //FIXME Optimize (just quickly written not optimized..) int i; @@ -498,6 +503,17 @@ static inline void yuv2yuvXinC(int16_t *lumFilter, int16_t **lumSrc, int lumFilt uDest[i]= av_clip_uint8(u>>19); vDest[i]= av_clip_uint8(v>>19); } + + if (CONFIG_SWSCALE_ALPHA && aDest) + for (i=0; i<dstW; i++){ + int val=1<<18; + int j; + for (j=0; j<lumFilterSize; j++) + val += alpSrc[j][i] * lumFilter[j]; + + aDest[i]= av_clip_uint8(val>>19); + } + } static inline void yuv2nv12XinC(int16_t *lumFilter, int16_t **lumSrc, int lumFilterSize, @@ -551,13 +567,14 @@ static inline void yuv2nv12XinC(int16_t *lumFilter, int16_t **lumSrc, int lumFil } } -#define YSCALE_YUV_2_PACKEDX_NOCLIP_C(type) \ +#define YSCALE_YUV_2_PACKEDX_NOCLIP_C(type,alpha) \ for (i=0; i<(dstW>>1); i++){\ int j;\ int Y1 = 1<<18;\ int Y2 = 1<<18;\ int U = 1<<18;\ int V = 1<<18;\ + int av_unused A1, A2;\ type av_unused *r, *b, *g;\ const int i2= 2*i;\ \ @@ -575,9 +592,19 @@ static inline void yuv2nv12XinC(int16_t *lumFilter, int16_t **lumSrc, int lumFil Y2>>=19;\ U >>=19;\ V >>=19;\ + if (alpha){\ + A1 = 1<<18;\ + A2 = 1<<18;\ + for (j=0; j<lumFilterSize; j++){\ + A1 += alpSrc[j][i2 ] * lumFilter[j];\ + A2 += alpSrc[j][i2+1] * lumFilter[j];\ + }\ + A1>>=19;\ + A2>>=19;\ + }\ -#define YSCALE_YUV_2_PACKEDX_C(type) \ - YSCALE_YUV_2_PACKEDX_NOCLIP_C(type)\ +#define YSCALE_YUV_2_PACKEDX_C(type,alpha) \ + YSCALE_YUV_2_PACKEDX_NOCLIP_C(type,alpha)\ if ((Y1|Y2|U|V)&256)\ {\ if (Y1>255) Y1=255; \ @@ -588,14 +615,19 @@ static inline void yuv2nv12XinC(int16_t *lumFilter, int16_t **lumSrc, int lumFil else if (U<0) U=0; \ if (V>255) V=255; \ else if (V<0) V=0; \ + }\ + if (alpha && ((A1|A2)&256)){\ + A1=av_clip_uint8(A1);\ + A2=av_clip_uint8(A2);\ } -#define YSCALE_YUV_2_PACKEDX_FULL_C \ +#define YSCALE_YUV_2_PACKEDX_FULL_C(rnd,alpha) \ for (i=0; i<dstW; i++){\ int j;\ int Y = 0;\ int U = -128<<19;\ int V = -128<<19;\ + int av_unused A;\ int R,G,B;\ \ for (j=0; j<lumFilterSize; j++){\ @@ -608,9 +640,17 @@ static inline void yuv2nv12XinC(int16_t *lumFilter, int16_t **lumSrc, int lumFil Y >>=10;\ U >>=10;\ V >>=10;\ + if (alpha){\ + A = rnd;\ + for (j=0; j<lumFilterSize; j++)\ + A += alpSrc[j][i ] * lumFilter[j];\ + A >>=19;\ + if (A&256)\ + A = av_clip_uint8(A);\ + }\ -#define YSCALE_YUV_2_RGBX_FULL_C(rnd) \ - YSCALE_YUV_2_PACKEDX_FULL_C\ +#define YSCALE_YUV_2_RGBX_FULL_C(rnd,alpha) \ + YSCALE_YUV_2_PACKEDX_FULL_C(rnd>>3,alpha)\ Y-= c->yuv2rgb_y_offset;\ Y*= c->yuv2rgb_y_coeff;\ Y+= rnd;\ @@ -652,19 +692,25 @@ static inline void yuv2nv12XinC(int16_t *lumFilter, int16_t **lumSrc, int lumFil else if (Y2<0)Y2=0; \ } -#define YSCALE_YUV_2_RGBX_C(type) \ - YSCALE_YUV_2_PACKEDX_C(type) /* FIXME fix tables so that clipping is not needed and then use _NOCLIP*/\ +#define YSCALE_YUV_2_RGBX_C(type,alpha) \ + YSCALE_YUV_2_PACKEDX_C(type,alpha) /* FIXME fix tables so that clipping is not needed and then use _NOCLIP*/\ r = (type *)c->table_rV[V]; \ g = (type *)(c->table_gU[U] + c->table_gV[V]); \ b = (type *)c->table_bU[U]; \ -#define YSCALE_YUV_2_PACKED2_C \ +#define YSCALE_YUV_2_PACKED2_C(type,alpha) \ for (i=0; i<(dstW>>1); i++){ \ const int i2= 2*i; \ int Y1= (buf0[i2 ]*yalpha1+buf1[i2 ]*yalpha)>>19; \ int Y2= (buf0[i2+1]*yalpha1+buf1[i2+1]*yalpha)>>19; \ int U= (uvbuf0[i ]*uvalpha1+uvbuf1[i ]*uvalpha)>>19; \ int V= (uvbuf0[i+VOFW]*uvalpha1+uvbuf1[i+VOFW]*uvalpha)>>19; \ + type av_unused *r, *b, *g; \ + int av_unused A1, A2; \ + if (alpha){\ + A1= (abuf0[i2 ]*yalpha1+abuf1[i2 ]*yalpha)>>19; \ + A2= (abuf0[i2+1]*yalpha1+abuf1[i2+1]*yalpha)>>19; \ + }\ #define YSCALE_YUV_2_GRAY16_2_C \ for (i=0; i<(dstW>>1); i++){ \ @@ -672,20 +718,25 @@ static inline void yuv2nv12XinC(int16_t *lumFilter, int16_t **lumSrc, int lumFil int Y1= (buf0[i2 ]*yalpha1+buf1[i2 ]*yalpha)>>11; \ int Y2= (buf0[i2+1]*yalpha1+buf1[i2+1]*yalpha)>>11; \ -#define YSCALE_YUV_2_RGB2_C(type) \ - YSCALE_YUV_2_PACKED2_C\ - type *r, *b, *g;\ +#define YSCALE_YUV_2_RGB2_C(type,alpha) \ + YSCALE_YUV_2_PACKED2_C(type,alpha)\ r = (type *)c->table_rV[V];\ g = (type *)(c->table_gU[U] + c->table_gV[V]);\ b = (type *)c->table_bU[U];\ -#define YSCALE_YUV_2_PACKED1_C \ +#define YSCALE_YUV_2_PACKED1_C(type,alpha) \ for (i=0; i<(dstW>>1); i++){\ const int i2= 2*i;\ int Y1= buf0[i2 ]>>7;\ int Y2= buf0[i2+1]>>7;\ int U= (uvbuf1[i ])>>7;\ int V= (uvbuf1[i+VOFW])>>7;\ + type av_unused *r, *b, *g;\ + int av_unused A1, A2;\ + if (alpha){\ + A1= abuf0[i2 ]>>7;\ + A2= abuf0[i2+1]>>7;\ + }\ #define YSCALE_YUV_2_GRAY16_1_C \ for (i=0; i<(dstW>>1); i++){\ @@ -693,24 +744,28 @@ static inline void yuv2nv12XinC(int16_t *lumFilter, int16_t **lumSrc, int lumFil int Y1= buf0[i2 ]<<1;\ int Y2= buf0[i2+1]<<1;\ -#define YSCALE_YUV_2_RGB1_C(type) \ - YSCALE_YUV_2_PACKED1_C\ - type *r, *b, *g;\ +#define YSCALE_YUV_2_RGB1_C(type,alpha) \ + YSCALE_YUV_2_PACKED1_C(type,alpha)\ r = (type *)c->table_rV[V];\ g = (type *)(c->table_gU[U] + c->table_gV[V]);\ b = (type *)c->table_bU[U];\ -#define YSCALE_YUV_2_PACKED1B_C \ +#define YSCALE_YUV_2_PACKED1B_C(type,alpha) \ for (i=0; i<(dstW>>1); i++){\ const int i2= 2*i;\ int Y1= buf0[i2 ]>>7;\ int Y2= buf0[i2+1]>>7;\ int U= (uvbuf0[i ] + uvbuf1[i ])>>8;\ int V= (uvbuf0[i+VOFW] + uvbuf1[i+VOFW])>>8;\ + type av_unused *r, *b, *g;\ + int av_unused A1, A2;\ + if (alpha){\ + A1= abuf0[i2 ]>>7;\ + A2= abuf0[i2+1]>>7;\ + }\ -#define YSCALE_YUV_2_RGB1B_C(type) \ - YSCALE_YUV_2_PACKED1B_C\ - type *r, *b, *g;\ +#define YSCALE_YUV_2_RGB1B_C(type,alpha) \ + YSCALE_YUV_2_PACKED1B_C(type,alpha)\ r = (type *)c->table_rV[V];\ g = (type *)(c->table_gU[U] + c->table_gV[V]);\ b = (type *)c->table_bU[U];\ @@ -768,17 +823,52 @@ static inline void yuv2nv12XinC(int16_t *lumFilter, int16_t **lumSrc, int lumFil #define YSCALE_YUV_2_ANYRGB_C(func, func2, func_g16, func_monoblack)\ switch(c->dstFormat)\ {\ - case PIX_FMT_RGB32:\ - case PIX_FMT_BGR32:\ - case PIX_FMT_RGB32_1:\ - case PIX_FMT_BGR32_1:\ - func(uint32_t)\ - ((uint32_t*)dest)[i2+0]= r[Y1] + g[Y1] + b[Y1];\ - ((uint32_t*)dest)[i2+1]= r[Y2] + g[Y2] + b[Y2];\ + case PIX_FMT_RGBA:\ + case PIX_FMT_BGRA:\ + if (CONFIG_SMALL){\ + int needAlpha = CONFIG_SWSCALE_ALPHA && c->alpPixBuf;\ + func(uint32_t,needAlpha)\ + ((uint32_t*)dest)[i2+0]= r[Y1] + g[Y1] + b[Y1] + (needAlpha ? (A1<<24) : 0);\ + ((uint32_t*)dest)[i2+1]= r[Y2] + g[Y2] + b[Y2] + (needAlpha ? (A2<<24) : 0);\ + }\ + }else{\ + if (CONFIG_SWSCALE_ALPHA && c->alpPixBuf){\ + func(uint32_t,1)\ + ((uint32_t*)dest)[i2+0]= r[Y1] + g[Y1] + b[Y1] + (A1<<24);\ + ((uint32_t*)dest)[i2+1]= r[Y2] + g[Y2] + b[Y2] + (A2<<24);\ + }\ + }else{\ + func(uint32_t,0)\ + ((uint32_t*)dest)[i2+0]= r[Y1] + g[Y1] + b[Y1];\ + ((uint32_t*)dest)[i2+1]= r[Y2] + g[Y2] + b[Y2];\ + }\ + }\ + }\ + break;\ + case PIX_FMT_ARGB:\ + case PIX_FMT_ABGR:\ + if (CONFIG_SMALL){\ + int needAlpha = CONFIG_SWSCALE_ALPHA && c->alpPixBuf;\ + func(uint32_t,needAlpha)\ + ((uint32_t*)dest)[i2+0]= r[Y1] + g[Y1] + b[Y1] + (needAlpha ? A1 : 0);\ + ((uint32_t*)dest)[i2+1]= r[Y2] + g[Y2] + b[Y2] + (needAlpha ? A2 : 0);\ + }\ + }else{\ + if (CONFIG_SWSCALE_ALPHA && c->alpPixBuf){\ + func(uint32_t,1)\ + ((uint32_t*)dest)[i2+0]= r[Y1] + g[Y1] + b[Y1] + A1;\ + ((uint32_t*)dest)[i2+1]= r[Y2] + g[Y2] + b[Y2] + A2;\ + }\ + }else{\ + func(uint32_t,0)\ + ((uint32_t*)dest)[i2+0]= r[Y1] + g[Y1] + b[Y1];\ + ((uint32_t*)dest)[i2+1]= r[Y2] + g[Y2] + b[Y2];\ + }\ + }\ } \ break;\ case PIX_FMT_RGB24:\ - func(uint8_t)\ + func(uint8_t,0)\ ((uint8_t*)dest)[0]= r[Y1];\ ((uint8_t*)dest)[1]= g[Y1];\ ((uint8_t*)dest)[2]= b[Y1];\ @@ -789,7 +879,7 @@ static inline void yuv2nv12XinC(int16_t *lumFilter, int16_t **lumSrc, int lumFil }\ break;\ case PIX_FMT_BGR24:\ - func(uint8_t)\ + func(uint8_t,0)\ ((uint8_t*)dest)[0]= b[Y1];\ ((uint8_t*)dest)[1]= g[Y1];\ ((uint8_t*)dest)[2]= r[Y1];\ @@ -808,7 +898,7 @@ static inline void yuv2nv12XinC(int16_t *lumFilter, int16_t **lumSrc, int lumFil const int dr2= dither_2x2_8[y&1 ][1];\ const int dg2= dither_2x2_4[y&1 ][1];\ const int db2= dither_2x2_8[(y&1)^1][1];\ - func(uint16_t)\ + func(uint16_t,0)\ ((uint16_t*)dest)[i2+0]= r[Y1+dr1] + g[Y1+dg1] + b[Y1+db1];\ ((uint16_t*)dest)[i2+1]= r[Y2+dr2] + g[Y2+dg2] + b[Y2+db2];\ }\ @@ -823,7 +913,7 @@ static inline void yuv2nv12XinC(int16_t *lumFilter, int16_t **lumSrc, int lumFil const int dr2= dither_2x2_8[y&1 ][1];\ const int dg2= dither_2x2_8[y&1 ][0];\ const int db2= dither_2x2_8[(y&1)^1][1];\ - func(uint16_t)\ + func(uint16_t,0)\ ((uint16_t*)dest)[i2+0]= r[Y1+dr1] + g[Y1+dg1] + b[Y1+db1];\ ((uint16_t*)dest)[i2+1]= r[Y2+dr2] + g[Y2+dg2] + b[Y2+db2];\ }\ @@ -834,7 +924,7 @@ static inline void yuv2nv12XinC(int16_t *lumFilter, int16_t **lumSrc, int lumFil {\ const uint8_t * const d64= dither_8x8_73[y&7];\ const uint8_t * const d32= dither_8x8_32[y&7];\ - func(uint8_t)\ + func(uint8_t,0)\ ((uint8_t*)dest)[i2+0]= r[Y1+d32[(i2+0)&7]] + g[Y1+d32[(i2+0)&7]] + b[Y1+d64[(i2+0)&7]];\ ((uint8_t*)dest)[i2+1]= r[Y2+d32[(i2+1)&7]] + g[Y2+d32[(i2+1)&7]] + b[Y2+d64[(i2+1)&7]];\ }\ @@ -845,7 +935,7 @@ static inline void yuv2nv12XinC(int16_t *lumFilter, int16_t **lumSrc, int lumFil {\ const uint8_t * const d64= dither_8x8_73 [y&7];\ const uint8_t * const d128=dither_8x8_220[y&7];\ - func(uint8_t)\ + func(uint8_t,0)\ ((uint8_t*)dest)[i]= r[Y1+d128[(i2+0)&7]] + g[Y1+d64[(i2+0)&7]] + b[Y1+d128[(i2+0)&7]]\ + ((r[Y2+d128[(i2+1)&7]] + g[Y2+d64[(i2+1)&7]] + b[Y2+d128[(i2+1)&7]])<<4);\ }\ @@ -856,7 +946,7 @@ static inline void yuv2nv12XinC(int16_t *lumFilter, int16_t **lumSrc, int lumFil {\ const uint8_t * const d64= dither_8x8_73 [y&7];\ const uint8_t * const d128=dither_8x8_220[y&7];\ - func(uint8_t)\ + func(uint8_t,0)\ ((uint8_t*)dest)[i2+0]= r[Y1+d128[(i2+0)&7]] + g[Y1+d64[(i2+0)&7]] + b[Y1+d128[(i2+0)&7]];\ ((uint8_t*)dest)[i2+1]= r[Y2+d128[(i2+1)&7]] + g[Y2+d64[(i2+1)&7]] + b[Y2+d128[(i2+1)&7]];\ }\ @@ -905,15 +995,15 @@ static inline void yuv2nv12XinC(int16_t *lumFilter, int16_t **lumSrc, int lumFil static inline void yuv2packedXinC(SwsContext *c, int16_t *lumFilter, int16_t **lumSrc, int lumFilterSize, int16_t *chrFilter, int16_t **chrSrc, int chrFilterSize, - uint8_t *dest, int dstW, int y) + int16_t **alpSrc, uint8_t *dest, int dstW, int y) { int i; - YSCALE_YUV_2_ANYRGB_C(YSCALE_YUV_2_RGBX_C, YSCALE_YUV_2_PACKEDX_C(void), YSCALE_YUV_2_GRAY16_C, YSCALE_YUV_2_MONOX_C) + YSCALE_YUV_2_ANYRGB_C(YSCALE_YUV_2_RGBX_C, YSCALE_YUV_2_PACKEDX_C(void,0), YSCALE_YUV_2_GRAY16_C, YSCALE_YUV_2_MONOX_C) } static inline void yuv2rgbXinC_full(SwsContext *c, int16_t *lumFilter, int16_t **lumSrc, int lumFilterSize, int16_t *chrFilter, int16_t **chrSrc, int chrFilterSize, - uint8_t *dest, int dstW, int y) + int16_t **alpSrc, uint8_t *dest, int dstW, int y) { int i; int step= fmt_depth(c->dstFormat)/8; @@ -926,12 +1016,33 @@ static inline void yuv2rgbXinC_full(SwsContext *c, int16_t *lumFilter, int16_t * case PIX_FMT_RGB24: aidx--; case PIX_FMT_RGBA: - YSCALE_YUV_2_RGBX_FULL_C(1<<21) - dest[aidx]= 255; - dest[0]= R>>22; - dest[1]= G>>22; - dest[2]= B>>22; - dest+= step; + if (CONFIG_SMALL){ + int needAlpha = CONFIG_SWSCALE_ALPHA && c->alpPixBuf; + YSCALE_YUV_2_RGBX_FULL_C(1<<21, needAlpha) + dest[aidx]= needAlpha ? A : 255; + dest[0]= R>>22; + dest[1]= G>>22; + dest[2]= B>>22; + dest+= step; + } + }else{ + if (CONFIG_SWSCALE_ALPHA && c->alpPixBuf){ + YSCALE_YUV_2_RGBX_FULL_C(1<<21, 1) + dest[aidx]= A; + dest[0]= R>>22; + dest[1]= G>>22; + dest[2]= B>>22; + dest+= step; + } + }else{ + YSCALE_YUV_2_RGBX_FULL_C(1<<21, 0) + dest[aidx]= 255; + dest[0]= R>>22; + dest[1]= G>>22; + dest[2]= B>>22; + dest+= step; + } + } } break; case PIX_FMT_ABGR: @@ -940,12 +1051,33 @@ static inline void yuv2rgbXinC_full(SwsContext *c, int16_t *lumFilter, int16_t * case PIX_FMT_BGR24: aidx--; case PIX_FMT_BGRA: - YSCALE_YUV_2_RGBX_FULL_C(1<<21) - dest[aidx]= 255; - dest[0]= B>>22; - dest[1]= G>>22; - dest[2]= R>>22; - dest+= step; + if (CONFIG_SMALL){ + int needAlpha = CONFIG_SWSCALE_ALPHA && c->alpPixBuf; + YSCALE_YUV_2_RGBX_FULL_C(1<<21, needAlpha) + dest[aidx]= needAlpha ? A : 255; + dest[0]= B>>22; + dest[1]= G>>22; + dest[2]= R>>22; + dest+= step; + } + }else{ + if (CONFIG_SWSCALE_ALPHA && c->alpPixBuf){ + YSCALE_YUV_2_RGBX_FULL_C(1<<21, 1) + dest[aidx]= A; + dest[0]= B>>22; + dest[1]= G>>22; + dest[2]= R>>22; + dest+= step; + } + }else{ + YSCALE_YUV_2_RGBX_FULL_C(1<<21, 0) + dest[aidx]= 255; + dest[0]= B>>22; + dest[1]= G>>22; + dest[2]= R>>22; + dest+= step; + } + } } break; default: @@ -953,6 +1085,15 @@ static inline void yuv2rgbXinC_full(SwsContext *c, int16_t *lumFilter, int16_t * } } +static void fillPlane(uint8_t* plane, int stride, int width, int height, int y, uint8_t val){ + int i; + uint8_t *ptr = plane + stride*y; + for (i=0; i<height; i++){ + memset(ptr, val, width); + ptr += stride; + } +} + //Note: we have C, X86, MMX, MMX2, 3DNOW versions, there is no 3DNOW+MMX2 one //Plain C versions #if !HAVE_MMX || defined (RUNTIME_CPUDETECT) || !CONFIG_GPL @@ -1457,13 +1598,13 @@ error: static void initMMX2HScaler(int dstW, int xInc, uint8_t *funnyCode, int16_t *filter, int32_t *filterPos, int numSplits) { uint8_t *fragmentA; - long imm8OfPShufW1A; - long imm8OfPShufW2A; - long fragmentLengthA; + x86_reg imm8OfPShufW1A; + x86_reg imm8OfPShufW2A; + x86_reg fragmentLengthA; uint8_t *fragmentB; - long imm8OfPShufW1B; - long imm8OfPShufW2B; - long fragmentLengthB; + x86_reg imm8OfPShufW1B; + x86_reg imm8OfPShufW2B; + x86_reg fragmentLengthB; int fragmentPos; int xpos, i; @@ -1736,6 +1877,56 @@ static int YUV422PToUyvyWrapper(SwsContext *c, uint8_t* src[], int srcStride[], return srcSliceH; } +static int YUYV2YUV420Wrapper(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, + int srcSliceH, uint8_t* dstParam[], int dstStride[]){ + uint8_t *ydst=dstParam[0] + dstStride[0]*srcSliceY; + uint8_t *udst=dstParam[1] + dstStride[1]*srcSliceY/2; + uint8_t *vdst=dstParam[2] + dstStride[2]*srcSliceY/2; + + yuyvtoyuv420(ydst, udst, vdst, src[0], c->srcW, srcSliceH, dstStride[0], dstStride[1], srcStride[0]); + + if (dstParam[3]) + fillPlane(dstParam[3], dstStride[3], c->srcW, srcSliceH, srcSliceY, 255); + + return srcSliceH; +} + +static int YUYV2YUV422Wrapper(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, + int srcSliceH, uint8_t* dstParam[], int dstStride[]){ + uint8_t *ydst=dstParam[0] + dstStride[0]*srcSliceY; + uint8_t *udst=dstParam[1] + dstStride[1]*srcSliceY; + uint8_t *vdst=dstParam[2] + dstStride[2]*srcSliceY; + + yuyvtoyuv422(ydst, udst, vdst, src[0], c->srcW, srcSliceH, dstStride[0], dstStride[1], srcStride[0]); + + return srcSliceH; +} + +static int UYVY2YUV420Wrapper(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, + int srcSliceH, uint8_t* dstParam[], int dstStride[]){ + uint8_t *ydst=dstParam[0] + dstStride[0]*srcSliceY; + uint8_t *udst=dstParam[1] + dstStride[1]*srcSliceY/2; + uint8_t *vdst=dstParam[2] + dstStride[2]*srcSliceY/2; + + uyvytoyuv420(ydst, udst, vdst, src[0], c->srcW, srcSliceH, dstStride[0], dstStride[1], srcStride[0]); + + if (dstParam[3]) + fillPlane(dstParam[3], dstStride[3], c->srcW, srcSliceH, srcSliceY, 255); + + return srcSliceH; +} + +static int UYVY2YUV422Wrapper(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, + int srcSliceH, uint8_t* dstParam[], int dstStride[]){ + uint8_t *ydst=dstParam[0] + dstStride[0]*srcSliceY; + uint8_t *udst=dstParam[1] + dstStride[1]*srcSliceY; + uint8_t *vdst=dstParam[2] + dstStride[2]*srcSliceY; + + uyvytoyuv422(ydst, udst, vdst, src[0], c->srcW, srcSliceH, dstStride[0], dstStride[1], srcStride[0]); + + return srcSliceH; +} + static int pal2rgbWrapper(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t* dst[], int dstStride[]){ const enum PixelFormat srcFormat= c->srcFormat; @@ -1862,6 +2053,8 @@ static int bgr24toyv12Wrapper(SwsContext *c, uint8_t* src[], int srcStride[], in dst[2]+(srcSliceY>>1)*dstStride[2], c->srcW, srcSliceH, dstStride[0], dstStride[1], srcStride[0]); + if (dst[3]) + fillPlane(dst[3], dstStride[3], c->srcW, srcSliceH, srcSliceY, 255); return srcSliceH; } @@ -1884,13 +2077,15 @@ static int yvu9toyv12Wrapper(SwsContext *c, uint8_t* src[], int srcStride[], int } } - if (c->dstFormat==PIX_FMT_YUV420P){ + if (c->dstFormat==PIX_FMT_YUV420P || c->dstFormat==PIX_FMT_YUVA420P){ planar2x(src[1], dst[1], c->chrSrcW, c->chrSrcH, srcStride[1], dstStride[1]); planar2x(src[2], dst[2], c->chrSrcW, c->chrSrcH, srcStride[2], dstStride[2]); }else{ planar2x(src[1], dst[2], c->chrSrcW, c->chrSrcH, srcStride[1], dstStride[2]); planar2x(src[2], dst[1], c->chrSrcW, c->chrSrcH, srcStride[2], dstStride[1]); } + if (dst[3]) + fillPlane(dst[3], dstStride[3], c->srcW, srcSliceH, srcSliceY, 255); return srcSliceH; } @@ -1926,17 +2121,17 @@ static int planarCopy(SwsContext *c, uint8_t* src[], int srcStride[], int srcSli int srcSliceH, uint8_t* dst[], int dstStride[]) { int plane; - for (plane=0; plane<3; plane++) + for (plane=0; plane<4; plane++) { - int length= plane==0 ? c->srcW : -((-c->srcW )>>c->chrDstHSubSample); - int y= plane==0 ? srcSliceY: -((-srcSliceY)>>c->chrDstVSubSample); - int height= plane==0 ? srcSliceH: -((-srcSliceH)>>c->chrDstVSubSample); - - if ((isGray(c->srcFormat) || isGray(c->dstFormat)) && plane>0) - { - if (!isGray(c->dstFormat)) - memset(dst[plane], 128, dstStride[plane]*height); - } + int length= (plane==0 || plane==3) ? c->srcW : -((-c->srcW )>>c->chrDstHSubSample); + int y= (plane==0 || plane==3) ? srcSliceY: -((-srcSliceY)>>c->chrDstVSubSample); + int height= (plane==0 || plane==3) ? srcSliceH: -((-srcSliceH)>>c->chrDstVSubSample); + + if (!dst[plane]) continue; + // ignore palette for GRAY8 + if (plane == 1 && !dst[2]) continue; + if (!src[plane] || (plane == 1 && !src[2])) + fillPlane(dst[plane], dstStride[plane], length, height, y, (plane==3) ? 255 : 128); else { if (dstStride[plane]==srcStride[plane] && srcStride[plane] > 0) @@ -1980,6 +2175,8 @@ static int gray16togray(SwsContext *c, uint8_t* src[], int srcStride[], int srcS srcPtr+= srcStride[0]; dstPtr+= dstStride[0]; } + if (dst[3]) + fillPlane(dst[3], dstStride[3], length, height, y, 255); return srcSliceH; } @@ -2133,12 +2330,12 @@ int sws_setColorspaceDetails(SwsContext *c, const int inv_table[4], int srcRange c->yuv2rgb_u2g_coeff= (int16_t)roundToInt16(cgu<<13); c->yuv2rgb_u2b_coeff= (int16_t)roundToInt16(cbu<<13); - sws_yuv2rgb_c_init_tables(c, inv_table, srcRange, brightness, contrast, saturation); + ff_yuv2rgb_c_init_tables(c, inv_table, srcRange, brightness, contrast, saturation); //FIXME factorize #ifdef COMPILE_ALTIVEC if (c->flags & SWS_CPU_CAPS_ALTIVEC) - sws_yuv2rgb_altivec_init_tables (c, inv_table, brightness, contrast, saturation); + ff_yuv2rgb_init_tables_altivec(c, inv_table, brightness, contrast, saturation); #endif return 0; } @@ -2335,16 +2532,16 @@ SwsContext *sws_getContext(int srcW, int srcH, enum PixelFormat srcFormat, int d if ((srcFormat==PIX_FMT_YUV420P || srcFormat==PIX_FMT_YUV422P || srcFormat==PIX_FMT_YUVA420P) && (isBGR(dstFormat) || isRGB(dstFormat)) && !(flags & SWS_ACCURATE_RND) && !(dstH&1)) { - c->swScale= sws_yuv2rgb_get_func_ptr(c); + c->swScale= ff_yuv2rgb_get_func_ptr(c); } - if (srcFormat==PIX_FMT_YUV410P && dstFormat==PIX_FMT_YUV420P && !(flags & SWS_BITEXACT)) + if (srcFormat==PIX_FMT_YUV410P && (dstFormat==PIX_FMT_YUV420P || dstFormat==PIX_FMT_YUVA420P) && !(flags & SWS_BITEXACT)) { c->swScale= yvu9toyv12Wrapper; } /* bgr24toYV12 */ - if (srcFormat==PIX_FMT_BGR24 && dstFormat==PIX_FMT_YUV420P && !(flags & SWS_ACCURATE_RND)) + if (srcFormat==PIX_FMT_BGR24 && (dstFormat==PIX_FMT_YUV420P || dstFormat==PIX_FMT_YUVA420P) && !(flags & SWS_ACCURATE_RND)) c->swScale= bgr24toyv12Wrapper; /* RGB/BGR -> RGB/BGR (no dither needed forms) */ @@ -2391,6 +2588,14 @@ SwsContext *sws_getContext(int srcW, int srcH, enum PixelFormat srcFormat, int d c->swScale= PlanarToUyvyWrapper; } } + if(srcFormat == PIX_FMT_YUYV422 && (dstFormat == PIX_FMT_YUV420P || dstFormat == PIX_FMT_YUVA420P)) + c->swScale= YUYV2YUV420Wrapper; + if(srcFormat == PIX_FMT_UYVY422 && (dstFormat == PIX_FMT_YUV420P || dstFormat == PIX_FMT_YUVA420P)) + c->swScale= UYVY2YUV420Wrapper; + if(srcFormat == PIX_FMT_YUYV422 && dstFormat == PIX_FMT_YUV422P) + c->swScale= YUYV2YUV422Wrapper; + if(srcFormat == PIX_FMT_UYVY422 && dstFormat == PIX_FMT_YUV422P) + c->swScale= UYVY2YUV422Wrapper; #ifdef COMPILE_ALTIVEC if ((c->flags & SWS_CPU_CAPS_ALTIVEC) && @@ -2407,6 +2612,7 @@ SwsContext *sws_getContext(int srcW, int srcH, enum PixelFormat srcFormat, int d /* simple copy */ if ( srcFormat == dstFormat || (srcFormat == PIX_FMT_YUVA420P && dstFormat == PIX_FMT_YUV420P) + || (srcFormat == PIX_FMT_YUV420P && dstFormat == PIX_FMT_YUVA420P) || (isPlanarYUV(srcFormat) && isGray(dstFormat)) || (isPlanarYUV(dstFormat) && isGray(srcFormat))) { @@ -2502,10 +2708,13 @@ SwsContext *sws_getContext(int srcW, int srcH, enum PixelFormat srcFormat, int d if (c->canMMX2BeUsed && (flags & SWS_FAST_BILINEAR)) { #ifdef MAP_ANONYMOUS - c->funnyYCode = (uint8_t*)mmap(NULL, MAX_FUNNY_CODE_SIZE, PROT_EXEC | PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0); - c->funnyUVCode = (uint8_t*)mmap(NULL, MAX_FUNNY_CODE_SIZE, PROT_EXEC | PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0); + c->funnyYCode = mmap(NULL, MAX_FUNNY_CODE_SIZE, PROT_EXEC | PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0); + c->funnyUVCode = mmap(NULL, MAX_FUNNY_CODE_SIZE, PROT_EXEC | PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, 0, 0); +#elif HAVE_VIRTUALALLOC + c->funnyYCode = VirtualAlloc(NULL, MAX_FUNNY_CODE_SIZE, MEM_COMMIT, PAGE_EXECUTE_READWRITE); + c->funnyUVCode = VirtualAlloc(NULL, MAX_FUNNY_CODE_SIZE, MEM_COMMIT, PAGE_EXECUTE_READWRITE); #else - c->funnyYCode = av_malloc(MAX_FUNNY_CODE_SIZE); + c->funnyYCode = av_malloc(MAX_FUNNY_CODE_SIZE); c->funnyUVCode = av_malloc(MAX_FUNNY_CODE_SIZE); #endif @@ -2578,12 +2787,17 @@ SwsContext *sws_getContext(int srcW, int srcH, enum PixelFormat srcFormat, int d // allocate pixbufs (we use dynamic allocation because otherwise we would need to c->lumPixBuf= av_malloc(c->vLumBufSize*2*sizeof(int16_t*)); c->chrPixBuf= av_malloc(c->vChrBufSize*2*sizeof(int16_t*)); + if (CONFIG_SWSCALE_ALPHA && isALPHA(c->srcFormat) && isALPHA(c->dstFormat)) + c->alpPixBuf= av_malloc(c->vLumBufSize*2*sizeof(int16_t*)); //Note we need at least one pixel more at the end because of the MMX code (just in case someone wanna replace the 4000/8000) /* align at 16 bytes for AltiVec */ for (i=0; i<c->vLumBufSize; i++) c->lumPixBuf[i]= c->lumPixBuf[i+c->vLumBufSize]= av_mallocz(VOF+1); for (i=0; i<c->vChrBufSize; i++) c->chrPixBuf[i]= c->chrPixBuf[i+c->vChrBufSize]= av_malloc((VOF+1)*2); + if (CONFIG_SWSCALE_ALPHA && c->alpPixBuf) + for (i=0; i<c->vLumBufSize; i++) + c->alpPixBuf[i]= c->alpPixBuf[i+c->vLumBufSize]= av_mallocz(VOF+1); //try to avoid drawing green stuff between the right end and the stride end for (i=0; i<c->vChrBufSize; i++) memset(c->chrPixBuf[i], 64, (VOF+1)*2); @@ -3134,6 +3348,12 @@ void sws_freeContext(SwsContext *c){ av_freep(&c->chrPixBuf); } + if (CONFIG_SWSCALE_ALPHA && c->alpPixBuf){ + for (i=0; i<c->vLumBufSize; i++) + av_freep(&c->alpPixBuf[i]); + av_freep(&c->alpPixBuf); + } + av_freep(&c->vLumFilter); av_freep(&c->vChrFilter); av_freep(&c->hLumFilter); @@ -3150,10 +3370,13 @@ void sws_freeContext(SwsContext *c){ #if ARCH_X86 && CONFIG_GPL #ifdef MAP_ANONYMOUS - if (c->funnyYCode) munmap(c->funnyYCode, MAX_FUNNY_CODE_SIZE); + if (c->funnyYCode ) munmap(c->funnyYCode , MAX_FUNNY_CODE_SIZE); if (c->funnyUVCode) munmap(c->funnyUVCode, MAX_FUNNY_CODE_SIZE); +#elif HAVE_VIRTUALALLOC + if (c->funnyYCode ) VirtualFree(c->funnyYCode , MAX_FUNNY_CODE_SIZE, MEM_RELEASE); + if (c->funnyUVCode) VirtualFree(c->funnyUVCode, MAX_FUNNY_CODE_SIZE, MEM_RELEASE); #else - av_free(c->funnyYCode); + av_free(c->funnyYCode ); av_free(c->funnyUVCode); #endif c->funnyYCode=NULL; diff --git a/libswscale/swscale_internal.h b/libswscale/swscale_internal.h index 13b9609060..785c00aa3c 100644 --- a/libswscale/swscale_internal.h +++ b/libswscale/swscale_internal.h @@ -87,6 +87,7 @@ typedef struct SwsContext{ int16_t **lumPixBuf; int16_t **chrPixBuf; + int16_t **alpPixBuf; int16_t *hLumFilter; int16_t *hLumFilterPos; int16_t *hChrFilter; @@ -156,6 +157,8 @@ typedef struct SwsContext{ #define VROUNDER_OFFSET "11*8+4*4*256*2+16" #define U_TEMP "11*8+4*4*256*2+24" #define V_TEMP "11*8+4*4*256*2+32" +#define Y_TEMP "11*8+4*4*256*2+40" +#define ALP_MMX_FILTER_OFFSET "11*8+4*4*256*2+48" uint64_t redDither __attribute__((aligned(8))); uint64_t greenDither __attribute__((aligned(8))); @@ -176,6 +179,8 @@ typedef struct SwsContext{ uint64_t vRounder __attribute__((aligned(8))); uint64_t u_temp __attribute__((aligned(8))); uint64_t v_temp __attribute__((aligned(8))); + uint64_t y_temp __attribute__((aligned(8))); + int32_t alpMmxFilter[4*MAX_FILTER_SIZE]; #if HAVE_ALTIVEC @@ -212,12 +217,17 @@ typedef struct SwsContext{ } SwsContext; //FIXME check init (where 0) -SwsFunc sws_yuv2rgb_get_func_ptr (SwsContext *c); -int sws_yuv2rgb_c_init_tables (SwsContext *c, const int inv_table[4], int fullRange, int brightness, int contrast, int saturation); - -void sws_yuv2rgb_altivec_init_tables (SwsContext *c, const int inv_table[4],int brightness,int contrast, int saturation); -SwsFunc sws_yuv2rgb_init_altivec (SwsContext *c); -void altivec_yuv2packedX (SwsContext *c, +SwsFunc ff_yuv2rgb_get_func_ptr(SwsContext *c); +int ff_yuv2rgb_c_init_tables(SwsContext *c, const int inv_table[4], int fullRange, int brightness, int contrast, int saturation); + +void ff_yuv2rgb_init_tables_altivec(SwsContext *c, const int inv_table[4], int brightness, int contrast, int saturation); +SwsFunc ff_yuv2rgb_init_mmx(SwsContext *c); +SwsFunc ff_yuv2rgb_init_vis(SwsContext *c); +SwsFunc ff_yuv2rgb_init_mlib(SwsContext *c); +SwsFunc ff_yuv2rgb_init_altivec(SwsContext *c); +SwsFunc ff_yuv2rgb_get_func_ptr_bfin(SwsContext *c); +void ff_bfin_get_unscaled_swscale(SwsContext *c); +void ff_yuv2packedX_altivec(SwsContext *c, int16_t *lumFilter, int16_t **lumSrc, int lumFilterSize, int16_t *chrFilter, int16_t **chrSrc, int chrFilterSize, uint8_t *dest, int dstW, int dstY); diff --git a/libswscale/swscale_template.c b/libswscale/swscale_template.c index 80704f6eb6..ecf5c10131 100644 --- a/libswscale/swscale_template.c +++ b/libswscale/swscale_template.c @@ -67,7 +67,7 @@ #define MOVNTQ(a,b) REAL_MOVNTQ(a,b) #if HAVE_ALTIVEC -#include "swscale_altivec_template.c" +#include "ppc/swscale_altivec_template.c" #endif #define YSCALEYUV2YV12X(x, offset, dest, width) \ @@ -644,6 +644,14 @@ #define YSCALEYUV2RGB1b(index, c) REAL_YSCALEYUV2RGB1b(index, c) +#define REAL_YSCALEYUV2RGB1_ALPHA(index) \ + "movq (%1, "#index", 2), %%mm7 \n\t" /* abuf0[index ] */\ + "movq 8(%1, "#index", 2), %%mm1 \n\t" /* abuf0[index+4] */\ + "psraw $7, %%mm7 \n\t" /* abuf0[index ] >>7 */\ + "psraw $7, %%mm1 \n\t" /* abuf0[index+4] >>7 */\ + "packuswb %%mm1, %%mm7 \n\t" +#define YSCALEYUV2RGB1_ALPHA(index) REAL_YSCALEYUV2RGB1_ALPHA(index) + #define REAL_WRITEBGR32(dst, dstw, index, b, g, r, a, q0, q2, q3, t) \ "movq "#b", "#q2" \n\t" /* B */\ "movq "#r", "#t" \n\t" /* R */\ @@ -909,8 +917,8 @@ static inline void RENAME(yuv2yuvX)(SwsContext *c, int16_t *lumFilter, int16_t **lumSrc, int lumFilterSize, - int16_t *chrFilter, int16_t **chrSrc, int chrFilterSize, - uint8_t *dest, uint8_t *uDest, uint8_t *vDest, long dstW, long chrDstW) + int16_t *chrFilter, int16_t **chrSrc, int chrFilterSize, int16_t **alpSrc, + uint8_t *dest, uint8_t *uDest, uint8_t *vDest, uint8_t *aDest, long dstW, long chrDstW) { #if HAVE_MMX if(!(c->flags & SWS_BITEXACT)){ @@ -919,6 +927,9 @@ static inline void RENAME(yuv2yuvX)(SwsContext *c, int16_t *lumFilter, int16_t * YSCALEYUV2YV12X_ACCURATE( "0", CHR_MMX_FILTER_OFFSET, uDest, chrDstW) YSCALEYUV2YV12X_ACCURATE(AV_STRINGIFY(VOF), CHR_MMX_FILTER_OFFSET, vDest, chrDstW) } + if (CONFIG_SWSCALE_ALPHA && aDest){ + YSCALEYUV2YV12X_ACCURATE( "0", ALP_MMX_FILTER_OFFSET, aDest, dstW) + } YSCALEYUV2YV12X_ACCURATE("0", LUM_MMX_FILTER_OFFSET, dest, dstW) }else{ @@ -926,6 +937,9 @@ static inline void RENAME(yuv2yuvX)(SwsContext *c, int16_t *lumFilter, int16_t * YSCALEYUV2YV12X( "0", CHR_MMX_FILTER_OFFSET, uDest, chrDstW) YSCALEYUV2YV12X(AV_STRINGIFY(VOF), CHR_MMX_FILTER_OFFSET, vDest, chrDstW) } + if (CONFIG_SWSCALE_ALPHA && aDest){ + YSCALEYUV2YV12X( "0", ALP_MMX_FILTER_OFFSET, aDest, dstW) + } YSCALEYUV2YV12X("0", LUM_MMX_FILTER_OFFSET, dest, dstW) } @@ -939,7 +953,7 @@ yuv2yuvX_altivec_real(lumFilter, lumSrc, lumFilterSize, #else //HAVE_ALTIVEC yuv2yuvXinC(lumFilter, lumSrc, lumFilterSize, chrFilter, chrSrc, chrFilterSize, - dest, uDest, vDest, dstW, chrDstW); + alpSrc, dest, uDest, vDest, aDest, dstW, chrDstW); #endif //!HAVE_ALTIVEC } @@ -952,34 +966,38 @@ yuv2nv12XinC(lumFilter, lumSrc, lumFilterSize, dest, uDest, dstW, chrDstW, dstFormat); } -static inline void RENAME(yuv2yuv1)(SwsContext *c, int16_t *lumSrc, int16_t *chrSrc, - uint8_t *dest, uint8_t *uDest, uint8_t *vDest, long dstW, long chrDstW) +static inline void RENAME(yuv2yuv1)(SwsContext *c, int16_t *lumSrc, int16_t *chrSrc, int16_t *alpSrc, + uint8_t *dest, uint8_t *uDest, uint8_t *vDest, uint8_t *aDest, long dstW, long chrDstW) { int i; #if HAVE_MMX if(!(c->flags & SWS_BITEXACT)){ - long p= uDest ? 3 : 1; - uint8_t *src[3]= {lumSrc + dstW, chrSrc + chrDstW, chrSrc + VOFW + chrDstW}; - uint8_t *dst[3]= {dest, uDest, vDest}; - long counter[3] = {dstW, chrDstW, chrDstW}; + long p= 4; + uint8_t *src[4]= {alpSrc + dstW, lumSrc + dstW, chrSrc + chrDstW, chrSrc + VOFW + chrDstW}; + uint8_t *dst[4]= {aDest, dest, uDest, vDest}; + x86_reg counter[4]= {dstW, dstW, chrDstW, chrDstW}; if (c->flags & SWS_ACCURATE_RND){ while(p--){ - __asm__ volatile( - YSCALEYUV2YV121_ACCURATE - :: "r" (src[p]), "r" (dst[p] + counter[p]), - "g" (-counter[p]) - : "%"REG_a - ); + if (dst[p]){ + __asm__ volatile( + YSCALEYUV2YV121_ACCURATE + :: "r" (src[p]), "r" (dst[p] + counter[p]), + "g" (-counter[p]) + : "%"REG_a + ); + } } }else{ while(p--){ - __asm__ volatile( - YSCALEYUV2YV121 - :: "r" (src[p]), "r" (dst[p] + counter[p]), - "g" (-counter[p]) - : "%"REG_a - ); + if (dst[p]){ + __asm__ volatile( + YSCALEYUV2YV121 + :: "r" (src[p]), "r" (dst[p] + counter[p]), + "g" (-counter[p]) + : "%"REG_a + ); + } } } return; @@ -1013,6 +1031,12 @@ static inline void RENAME(yuv2yuv1)(SwsContext *c, int16_t *lumSrc, int16_t *chr uDest[i]= u; vDest[i]= v; } + + if (CONFIG_SWSCALE_ALPHA && aDest) + for (i=0; i<dstW; i++){ + int val= (alpSrc[i]+64)>>7; + aDest[i]= av_clip_uint8(val); + } } @@ -1021,20 +1045,36 @@ static inline void RENAME(yuv2yuv1)(SwsContext *c, int16_t *lumSrc, int16_t *chr */ static inline void RENAME(yuv2packedX)(SwsContext *c, int16_t *lumFilter, int16_t **lumSrc, int lumFilterSize, int16_t *chrFilter, int16_t **chrSrc, int chrFilterSize, - uint8_t *dest, long dstW, long dstY) + int16_t **alpSrc, uint8_t *dest, long dstW, long dstY) { #if HAVE_MMX - long dummy=0; + x86_reg dummy=0; if(!(c->flags & SWS_BITEXACT)){ if (c->flags & SWS_ACCURATE_RND){ switch(c->dstFormat){ case PIX_FMT_RGB32: - YSCALEYUV2PACKEDX_ACCURATE - YSCALEYUV2RGBX - "pcmpeqd %%mm7, %%mm7 \n\t" - WRITEBGR32(%4, %5, %%REGa, %%mm2, %%mm4, %%mm5, %%mm7, %%mm0, %%mm1, %%mm3, %%mm6) + if (CONFIG_SWSCALE_ALPHA && c->alpPixBuf){ + YSCALEYUV2PACKEDX_ACCURATE + YSCALEYUV2RGBX + "movq %%mm2, "U_TEMP"(%0) \n\t" + "movq %%mm4, "V_TEMP"(%0) \n\t" + "movq %%mm5, "Y_TEMP"(%0) \n\t" + YSCALEYUV2PACKEDX_ACCURATE_YA(ALP_MMX_FILTER_OFFSET) + "movq "Y_TEMP"(%0), %%mm5 \n\t" + "psraw $3, %%mm1 \n\t" + "psraw $3, %%mm7 \n\t" + "packuswb %%mm7, %%mm1 \n\t" + WRITEBGR32(%4, %5, %%REGa, %%mm3, %%mm4, %%mm5, %%mm1, %%mm0, %%mm7, %%mm2, %%mm6) + + YSCALEYUV2PACKEDX_END + }else{ + YSCALEYUV2PACKEDX_ACCURATE + YSCALEYUV2RGBX + "pcmpeqd %%mm7, %%mm7 \n\t" + WRITEBGR32(%4, %5, %%REGa, %%mm2, %%mm4, %%mm5, %%mm7, %%mm0, %%mm1, %%mm3, %%mm6) - YSCALEYUV2PACKEDX_END + YSCALEYUV2PACKEDX_END + } return; case PIX_FMT_BGR24: YSCALEYUV2PACKEDX_ACCURATE @@ -1095,11 +1135,22 @@ static inline void RENAME(yuv2packedX)(SwsContext *c, int16_t *lumFilter, int16_ switch(c->dstFormat) { case PIX_FMT_RGB32: - YSCALEYUV2PACKEDX - YSCALEYUV2RGBX - "pcmpeqd %%mm7, %%mm7 \n\t" - WRITEBGR32(%4, %5, %%REGa, %%mm2, %%mm4, %%mm5, %%mm7, %%mm0, %%mm1, %%mm3, %%mm6) - YSCALEYUV2PACKEDX_END + if (CONFIG_SWSCALE_ALPHA && c->alpPixBuf){ + YSCALEYUV2PACKEDX + YSCALEYUV2RGBX + YSCALEYUV2PACKEDX_YA(ALP_MMX_FILTER_OFFSET, %%mm0, %%mm3, %%mm6, %%mm1, %%mm7) + "psraw $3, %%mm1 \n\t" + "psraw $3, %%mm7 \n\t" + "packuswb %%mm7, %%mm1 \n\t" + WRITEBGR32(%4, %5, %%REGa, %%mm2, %%mm4, %%mm5, %%mm1, %%mm0, %%mm7, %%mm3, %%mm6) + YSCALEYUV2PACKEDX_END + }else{ + YSCALEYUV2PACKEDX + YSCALEYUV2RGBX + "pcmpeqd %%mm7, %%mm7 \n\t" + WRITEBGR32(%4, %5, %%REGa, %%mm2, %%mm4, %%mm5, %%mm7, %%mm0, %%mm1, %%mm3, %%mm6) + YSCALEYUV2PACKEDX_END + } return; case PIX_FMT_BGR24: YSCALEYUV2PACKEDX @@ -1160,26 +1211,26 @@ static inline void RENAME(yuv2packedX)(SwsContext *c, int16_t *lumFilter, int16_ #endif /* HAVE_MMX */ #if HAVE_ALTIVEC /* The following list of supported dstFormat values should - match what's found in the body of altivec_yuv2packedX() */ - if (!(c->flags & SWS_BITEXACT) && + match what's found in the body of ff_yuv2packedX_altivec() */ + if (!(c->flags & SWS_BITEXACT) && !c->alpPixBuf && (c->dstFormat==PIX_FMT_ABGR || c->dstFormat==PIX_FMT_BGRA || c->dstFormat==PIX_FMT_BGR24 || c->dstFormat==PIX_FMT_RGB24 || c->dstFormat==PIX_FMT_RGBA || c->dstFormat==PIX_FMT_ARGB)) - altivec_yuv2packedX (c, lumFilter, lumSrc, lumFilterSize, - chrFilter, chrSrc, chrFilterSize, - dest, dstW, dstY); + ff_yuv2packedX_altivec(c, lumFilter, lumSrc, lumFilterSize, + chrFilter, chrSrc, chrFilterSize, + dest, dstW, dstY); else #endif yuv2packedXinC(c, lumFilter, lumSrc, lumFilterSize, chrFilter, chrSrc, chrFilterSize, - dest, dstW, dstY); + alpSrc, dest, dstW, dstY); } /** * vertical bilinear scale YV12 to RGB */ static inline void RENAME(yuv2packed2)(SwsContext *c, uint16_t *buf0, uint16_t *buf1, uint16_t *uvbuf0, uint16_t *uvbuf1, - uint8_t *dest, int dstW, int yalpha, int uvalpha, int y) + uint16_t *abuf0, uint16_t *abuf1, uint8_t *dest, int dstW, int yalpha, int uvalpha, int y) { int yalpha1=4095- yalpha; int uvalpha1=4095-uvalpha; @@ -1191,19 +1242,62 @@ static inline void RENAME(yuv2packed2)(SwsContext *c, uint16_t *buf0, uint16_t * { //Note 8280 == DSTW_OFFSET but the preprocessor can't handle that there :( case PIX_FMT_RGB32: - __asm__ volatile( - "mov %%"REG_b", "ESP_OFFSET"(%5) \n\t" - "mov %4, %%"REG_b" \n\t" - "push %%"REG_BP" \n\t" - YSCALEYUV2RGB(%%REGBP, %5) - "pcmpeqd %%mm7, %%mm7 \n\t" - WRITEBGR32(%%REGb, 8280(%5), %%REGBP, %%mm2, %%mm4, %%mm5, %%mm7, %%mm0, %%mm1, %%mm3, %%mm6) - "pop %%"REG_BP" \n\t" - "mov "ESP_OFFSET"(%5), %%"REG_b" \n\t" - - :: "c" (buf0), "d" (buf1), "S" (uvbuf0), "D" (uvbuf1), "m" (dest), - "a" (&c->redDither) - ); + if (CONFIG_SWSCALE_ALPHA && c->alpPixBuf){ +#if ARCH_X86_64 + __asm__ volatile( + YSCALEYUV2RGB(%%REGBP, %5) + YSCALEYUV2RGB_YA(%%REGBP, %5, %6, %7) + "psraw $3, %%mm1 \n\t" /* abuf0[eax] - abuf1[eax] >>7*/ + "psraw $3, %%mm7 \n\t" /* abuf0[eax] - abuf1[eax] >>7*/ + "packuswb %%mm7, %%mm1 \n\t" + WRITEBGR32(%4, 8280(%5), %%REGBP, %%mm2, %%mm4, %%mm5, %%mm1, %%mm0, %%mm7, %%mm3, %%mm6) + + :: "c" (buf0), "d" (buf1), "S" (uvbuf0), "D" (uvbuf1), "r" (dest), + "a" (&c->redDither) + ,"r" (abuf0), "r" (abuf1) + : "%"REG_BP + ); +#else + *(uint16_t **)(&c->u_temp)=abuf0; + *(uint16_t **)(&c->v_temp)=abuf1; + __asm__ volatile( + "mov %%"REG_b", "ESP_OFFSET"(%5) \n\t" + "mov %4, %%"REG_b" \n\t" + "push %%"REG_BP" \n\t" + YSCALEYUV2RGB(%%REGBP, %5) + "push %0 \n\t" + "push %1 \n\t" + "mov "U_TEMP"(%5), %0 \n\t" + "mov "V_TEMP"(%5), %1 \n\t" + YSCALEYUV2RGB_YA(%%REGBP, %5, %0, %1) + "psraw $3, %%mm1 \n\t" /* abuf0[eax] - abuf1[eax] >>7*/ + "psraw $3, %%mm7 \n\t" /* abuf0[eax] - abuf1[eax] >>7*/ + "packuswb %%mm7, %%mm1 \n\t" + "pop %1 \n\t" + "pop %0 \n\t" + WRITEBGR32(%%REGb, 8280(%5), %%REGBP, %%mm2, %%mm4, %%mm5, %%mm1, %%mm0, %%mm7, %%mm3, %%mm6) + "pop %%"REG_BP" \n\t" + "mov "ESP_OFFSET"(%5), %%"REG_b" \n\t" + + :: "c" (buf0), "d" (buf1), "S" (uvbuf0), "D" (uvbuf1), "m" (dest), + "a" (&c->redDither) + ); +#endif + }else{ + __asm__ volatile( + "mov %%"REG_b", "ESP_OFFSET"(%5) \n\t" + "mov %4, %%"REG_b" \n\t" + "push %%"REG_BP" \n\t" + YSCALEYUV2RGB(%%REGBP, %5) + "pcmpeqd %%mm7, %%mm7 \n\t" + WRITEBGR32(%%REGb, 8280(%5), %%REGBP, %%mm2, %%mm4, %%mm5, %%mm7, %%mm0, %%mm1, %%mm3, %%mm6) + "pop %%"REG_BP" \n\t" + "mov "ESP_OFFSET"(%5), %%"REG_b" \n\t" + + :: "c" (buf0), "d" (buf1), "S" (uvbuf0), "D" (uvbuf1), "m" (dest), + "a" (&c->redDither) + ); + } return; case PIX_FMT_BGR24: __asm__ volatile( @@ -1279,14 +1373,14 @@ static inline void RENAME(yuv2packed2)(SwsContext *c, uint16_t *buf0, uint16_t * } } #endif //HAVE_MMX -YSCALE_YUV_2_ANYRGB_C(YSCALE_YUV_2_RGB2_C, YSCALE_YUV_2_PACKED2_C, YSCALE_YUV_2_GRAY16_2_C, YSCALE_YUV_2_MONO2_C) +YSCALE_YUV_2_ANYRGB_C(YSCALE_YUV_2_RGB2_C, YSCALE_YUV_2_PACKED2_C(void,0), YSCALE_YUV_2_GRAY16_2_C, YSCALE_YUV_2_MONO2_C) } /** * YV12 to RGB without scaling or interpolating */ static inline void RENAME(yuv2packed1)(SwsContext *c, uint16_t *buf0, uint16_t *uvbuf0, uint16_t *uvbuf1, - uint8_t *dest, int dstW, int uvalpha, int dstFormat, int flags, int y) + uint16_t *abuf0, uint8_t *dest, int dstW, int uvalpha, int dstFormat, int flags, int y) { const int yalpha1=0; int i; @@ -1296,7 +1390,7 @@ static inline void RENAME(yuv2packed1)(SwsContext *c, uint16_t *buf0, uint16_t * if (flags&SWS_FULL_CHR_H_INT) { - RENAME(yuv2packed2)(c, buf0, buf0, uvbuf0, uvbuf1, dest, dstW, 0, uvalpha, y); + RENAME(yuv2packed2)(c, buf0, buf0, uvbuf0, uvbuf1, abuf0, abuf0, dest, dstW, 0, uvalpha, y); return; } @@ -1307,19 +1401,35 @@ static inline void RENAME(yuv2packed1)(SwsContext *c, uint16_t *buf0, uint16_t * switch(dstFormat) { case PIX_FMT_RGB32: - __asm__ volatile( - "mov %%"REG_b", "ESP_OFFSET"(%5) \n\t" - "mov %4, %%"REG_b" \n\t" - "push %%"REG_BP" \n\t" - YSCALEYUV2RGB1(%%REGBP, %5) - "pcmpeqd %%mm7, %%mm7 \n\t" - WRITEBGR32(%%REGb, 8280(%5), %%REGBP, %%mm2, %%mm4, %%mm5, %%mm7, %%mm0, %%mm1, %%mm3, %%mm6) - "pop %%"REG_BP" \n\t" - "mov "ESP_OFFSET"(%5), %%"REG_b" \n\t" - - :: "c" (buf0), "d" (buf1), "S" (uvbuf0), "D" (uvbuf1), "m" (dest), - "a" (&c->redDither) - ); + if (CONFIG_SWSCALE_ALPHA && c->alpPixBuf){ + __asm__ volatile( + "mov %%"REG_b", "ESP_OFFSET"(%5) \n\t" + "mov %4, %%"REG_b" \n\t" + "push %%"REG_BP" \n\t" + YSCALEYUV2RGB1(%%REGBP, %5) + YSCALEYUV2RGB1_ALPHA(%%REGBP) + WRITEBGR32(%%REGb, 8280(%5), %%REGBP, %%mm2, %%mm4, %%mm5, %%mm7, %%mm0, %%mm1, %%mm3, %%mm6) + "pop %%"REG_BP" \n\t" + "mov "ESP_OFFSET"(%5), %%"REG_b" \n\t" + + :: "c" (buf0), "d" (abuf0), "S" (uvbuf0), "D" (uvbuf1), "m" (dest), + "a" (&c->redDither) + ); + }else{ + __asm__ volatile( + "mov %%"REG_b", "ESP_OFFSET"(%5) \n\t" + "mov %4, %%"REG_b" \n\t" + "push %%"REG_BP" \n\t" + YSCALEYUV2RGB1(%%REGBP, %5) + "pcmpeqd %%mm7, %%mm7 \n\t" + WRITEBGR32(%%REGb, 8280(%5), %%REGBP, %%mm2, %%mm4, %%mm5, %%mm7, %%mm0, %%mm1, %%mm3, %%mm6) + "pop %%"REG_BP" \n\t" + "mov "ESP_OFFSET"(%5), %%"REG_b" \n\t" + + :: "c" (buf0), "d" (buf1), "S" (uvbuf0), "D" (uvbuf1), "m" (dest), + "a" (&c->redDither) + ); + } return; case PIX_FMT_BGR24: __asm__ volatile( @@ -1400,19 +1510,35 @@ static inline void RENAME(yuv2packed1)(SwsContext *c, uint16_t *buf0, uint16_t * switch(dstFormat) { case PIX_FMT_RGB32: - __asm__ volatile( - "mov %%"REG_b", "ESP_OFFSET"(%5) \n\t" - "mov %4, %%"REG_b" \n\t" - "push %%"REG_BP" \n\t" - YSCALEYUV2RGB1b(%%REGBP, %5) - "pcmpeqd %%mm7, %%mm7 \n\t" - WRITEBGR32(%%REGb, 8280(%5), %%REGBP, %%mm2, %%mm4, %%mm5, %%mm7, %%mm0, %%mm1, %%mm3, %%mm6) - "pop %%"REG_BP" \n\t" - "mov "ESP_OFFSET"(%5), %%"REG_b" \n\t" - - :: "c" (buf0), "d" (buf1), "S" (uvbuf0), "D" (uvbuf1), "m" (dest), - "a" (&c->redDither) - ); + if (CONFIG_SWSCALE_ALPHA && c->alpPixBuf){ + __asm__ volatile( + "mov %%"REG_b", "ESP_OFFSET"(%5) \n\t" + "mov %4, %%"REG_b" \n\t" + "push %%"REG_BP" \n\t" + YSCALEYUV2RGB1b(%%REGBP, %5) + YSCALEYUV2RGB1_ALPHA(%%REGBP) + WRITEBGR32(%%REGb, 8280(%5), %%REGBP, %%mm2, %%mm4, %%mm5, %%mm7, %%mm0, %%mm1, %%mm3, %%mm6) + "pop %%"REG_BP" \n\t" + "mov "ESP_OFFSET"(%5), %%"REG_b" \n\t" + + :: "c" (buf0), "d" (abuf0), "S" (uvbuf0), "D" (uvbuf1), "m" (dest), + "a" (&c->redDither) + ); + }else{ + __asm__ volatile( + "mov %%"REG_b", "ESP_OFFSET"(%5) \n\t" + "mov %4, %%"REG_b" \n\t" + "push %%"REG_BP" \n\t" + YSCALEYUV2RGB1b(%%REGBP, %5) + "pcmpeqd %%mm7, %%mm7 \n\t" + WRITEBGR32(%%REGb, 8280(%5), %%REGBP, %%mm2, %%mm4, %%mm5, %%mm7, %%mm0, %%mm1, %%mm3, %%mm6) + "pop %%"REG_BP" \n\t" + "mov "ESP_OFFSET"(%5), %%"REG_b" \n\t" + + :: "c" (buf0), "d" (buf1), "S" (uvbuf0), "D" (uvbuf1), "m" (dest), + "a" (&c->redDither) + ); + } return; case PIX_FMT_BGR24: __asm__ volatile( @@ -1492,9 +1618,9 @@ static inline void RENAME(yuv2packed1)(SwsContext *c, uint16_t *buf0, uint16_t * #endif /* HAVE_MMX */ if (uvalpha < 2048) { - YSCALE_YUV_2_ANYRGB_C(YSCALE_YUV_2_RGB1_C, YSCALE_YUV_2_PACKED1_C, YSCALE_YUV_2_GRAY16_1_C, YSCALE_YUV_2_MONO2_C) + YSCALE_YUV_2_ANYRGB_C(YSCALE_YUV_2_RGB1_C, YSCALE_YUV_2_PACKED1_C(void,0), YSCALE_YUV_2_GRAY16_1_C, YSCALE_YUV_2_MONO2_C) }else{ - YSCALE_YUV_2_ANYRGB_C(YSCALE_YUV_2_RGB1B_C, YSCALE_YUV_2_PACKED1B_C, YSCALE_YUV_2_GRAY16_1_C, YSCALE_YUV_2_MONO2_C) + YSCALE_YUV_2_ANYRGB_C(YSCALE_YUV_2_RGB1B_C, YSCALE_YUV_2_PACKED1B_C(void,0), YSCALE_YUV_2_GRAY16_1_C, YSCALE_YUV_2_MONO2_C) } } @@ -1515,7 +1641,7 @@ static inline void RENAME(yuy2ToY)(uint8_t *dst, uint8_t *src, long width, uint3 "movq %%mm0, (%2, %%"REG_a") \n\t" "add $8, %%"REG_a" \n\t" " js 1b \n\t" - : : "g" (-width), "r" (src+width*2), "r" (dst+width) + : : "g" ((x86_reg)-width), "r" (src+width*2), "r" (dst+width) : "%"REG_a ); #else @@ -1546,7 +1672,7 @@ static inline void RENAME(yuy2ToUV)(uint8_t *dstU, uint8_t *dstV, uint8_t *src1, "movd %%mm1, (%2, %%"REG_a") \n\t" "add $4, %%"REG_a" \n\t" " js 1b \n\t" - : : "g" (-width), "r" (src1+width*4), "r" (dstU+width), "r" (dstV+width) + : : "g" ((x86_reg)-width), "r" (src1+width*4), "r" (dstU+width), "r" (dstV+width) : "%"REG_a ); #else @@ -1576,7 +1702,7 @@ static inline void RENAME(uyvyToY)(uint8_t *dst, uint8_t *src, long width, uint3 "movq %%mm0, (%2, %%"REG_a") \n\t" "add $8, %%"REG_a" \n\t" " js 1b \n\t" - : : "g" (-width), "r" (src+width*2), "r" (dst+width) + : : "g" ((x86_reg)-width), "r" (src+width*2), "r" (dst+width) : "%"REG_a ); #else @@ -1607,7 +1733,7 @@ static inline void RENAME(uyvyToUV)(uint8_t *dstU, uint8_t *dstV, uint8_t *src1, "movd %%mm1, (%2, %%"REG_a") \n\t" "add $4, %%"REG_a" \n\t" " js 1b \n\t" - : : "g" (-width), "r" (src1+width*4), "r" (dstU+width), "r" (dstV+width) + : : "g" ((x86_reg)-width), "r" (src1+width*4), "r" (dstU+width), "r" (dstV+width) : "%"REG_a ); #else @@ -1642,6 +1768,13 @@ BGR2Y(uint16_t, bgr15ToY, 0, 0, 0, 0x001F, 0x03E0, 0x7C00, RY<<10, GY<<5, BY BGR2Y(uint16_t, rgb16ToY, 0, 0, 0, 0xF800, 0x07E0, 0x001F, RY , GY<<5, BY<<11, RGB2YUV_SHIFT+8) BGR2Y(uint16_t, rgb15ToY, 0, 0, 0, 0x7C00, 0x03E0, 0x001F, RY , GY<<5, BY<<10, RGB2YUV_SHIFT+7) +static inline void RENAME(abgrToA)(uint8_t *dst, uint8_t *src, long width, uint32_t *unused){ + int i; + for (i=0; i<width; i++){ + dst[i]= src[4*i]; + } +} + #define BGR2UV(type, name, shr, shg, shb, maska, maskr, maskg, maskb, RU, GU, BU, RV, GV, BV, S)\ static inline void RENAME(name)(uint8_t *dstU, uint8_t *dstV, uint8_t *src, uint8_t *dummy, long width, uint32_t *unused)\ {\ @@ -1731,7 +1864,7 @@ static inline void RENAME(bgr24ToY_mmx)(uint8_t *dst, uint8_t *src, long width, "add $4, %%"REG_a" \n\t" " js 1b \n\t" : "+r" (src) - : "r" (dst+width), "g" (-width) + : "r" (dst+width), "g" ((x86_reg)-width) : "%"REG_a ); } @@ -1789,7 +1922,7 @@ static inline void RENAME(bgr24ToUV_mmx)(uint8_t *dstU, uint8_t *dstV, uint8_t * "add $4, %%"REG_a" \n\t" " js 1b \n\t" : "+r" (src) - : "r" (dstU+width), "r" (dstV+width), "g" (-width), "m"(ff_bgr24toUV[srcFormat == PIX_FMT_RGB24][0]) + : "r" (dstU+width), "r" (dstV+width), "g" ((x86_reg)-width), "m"(ff_bgr24toUV[srcFormat == PIX_FMT_RGB24][0]) : "%"REG_a ); } @@ -1951,7 +2084,7 @@ static inline void RENAME(hScale)(int16_t *dst, int dstW, uint8_t *src, int srcW assert(filterSize % 4 == 0 && filterSize>0); if (filterSize==4) // Always true for upscaling, sometimes for down, too. { - long counter= -2*dstW; + x86_reg counter= -2*dstW; filter-= counter*2; filterPos-= counter/2; dst-= counter/2; @@ -1997,7 +2130,7 @@ static inline void RENAME(hScale)(int16_t *dst, int dstW, uint8_t *src, int srcW } else if (filterSize==8) { - long counter= -2*dstW; + x86_reg counter= -2*dstW; filter-= counter*4; filterPos-= counter/2; dst-= counter/2; @@ -2055,7 +2188,7 @@ static inline void RENAME(hScale)(int16_t *dst, int dstW, uint8_t *src, int srcW else { uint8_t *offset = src+filterSize; - long counter= -2*dstW; + x86_reg counter= -2*dstW; //filter-= counter*filterSize/2; filterPos-= counter/2; dst-= counter/2; @@ -2098,7 +2231,7 @@ static inline void RENAME(hScale)(int16_t *dst, int dstW, uint8_t *src, int srcW : "+r" (counter), "+r" (filter) : "m" (filterPos), "m" (dst), "m"(offset), - "m" (src), "r" (filterSize*2) + "m" (src), "r" ((x86_reg)filterSize*2) : "%"REG_a, "%"REG_c, "%"REG_d ); } @@ -2130,7 +2263,7 @@ static inline void RENAME(hyscale)(SwsContext *c, uint16_t *dst, long dstWidth, int flags, int canMMX2BeUsed, int16_t *hLumFilter, int16_t *hLumFilterPos, int hLumFilterSize, void *funnyYCode, int srcFormat, uint8_t *formatConvBuffer, int16_t *mmx2Filter, - int32_t *mmx2FilterPos, uint32_t *pal) + int32_t *mmx2FilterPos, uint32_t *pal, int isAlpha) { if (srcFormat==PIX_FMT_YUYV422 || srcFormat==PIX_FMT_GRAY16BE) { @@ -2144,12 +2277,18 @@ static inline void RENAME(hyscale)(SwsContext *c, uint16_t *dst, long dstWidth, } else if (srcFormat==PIX_FMT_RGB32) { - RENAME(bgr32ToY)(formatConvBuffer, src, srcW, pal); + if (isAlpha) + RENAME(abgrToA)(formatConvBuffer, src+3, srcW, pal); + else + RENAME(bgr32ToY)(formatConvBuffer, src, srcW, pal); src= formatConvBuffer; } else if (srcFormat==PIX_FMT_RGB32_1) { - RENAME(bgr32ToY)(formatConvBuffer, src+ALT32_CORR, srcW, pal); + if (isAlpha) + RENAME(abgrToA)(formatConvBuffer, src, srcW, pal); + else + RENAME(bgr32ToY)(formatConvBuffer, src+ALT32_CORR, srcW, pal); src= formatConvBuffer; } else if (srcFormat==PIX_FMT_BGR24) @@ -2169,12 +2308,18 @@ static inline void RENAME(hyscale)(SwsContext *c, uint16_t *dst, long dstWidth, } else if (srcFormat==PIX_FMT_BGR32) { - RENAME(rgb32ToY)(formatConvBuffer, src, srcW, pal); + if (isAlpha) + RENAME(abgrToA)(formatConvBuffer, src+3, srcW, pal); + else + RENAME(rgb32ToY)(formatConvBuffer, src, srcW, pal); src= formatConvBuffer; } else if (srcFormat==PIX_FMT_BGR32_1) { - RENAME(rgb32ToY)(formatConvBuffer, src+ALT32_CORR, srcW, pal); + if (isAlpha) + RENAME(abgrToA)(formatConvBuffer, src, srcW, pal); + else + RENAME(rgb32ToY)(formatConvBuffer, src+ALT32_CORR, srcW, pal); src= formatConvBuffer; } else if (srcFormat==PIX_FMT_RGB24) @@ -2289,7 +2434,7 @@ FUNNY_Y_CODE else { #endif /* HAVE_MMX2 */ - long xInc_shr16 = xInc >> 16; + x86_reg xInc_shr16 = xInc >> 16; uint16_t xInc_mask = xInc & 0xffff; //NO MMX just normal asm ... __asm__ volatile( @@ -2347,7 +2492,7 @@ FUNNY_Y_CODE #endif /* ARCH_X86 */ } - if(c->srcRange != c->dstRange && !(isRGB(c->dstFormat) || isBGR(c->dstFormat))){ + if(!isAlpha && c->srcRange != c->dstRange && !(isRGB(c->dstFormat) || isBGR(c->dstFormat))){ int i; //FIXME all pal and rgb srcFormats could do this convertion as well //FIXME all scalers more complex than bilinear could do half of this transform @@ -2575,7 +2720,7 @@ FUNNY_UV_CODE else { #endif /* HAVE_MMX2 */ - long xInc_shr16 = (long) (xInc >> 16); + x86_reg xInc_shr16 = (x86_reg) (xInc >> 16); uint16_t xInc_mask = xInc & 0xffff; __asm__ volatile( "xor %%"REG_a", %%"REG_a" \n\t" // i @@ -2613,9 +2758,9 @@ FUNNY_UV_CODE /* GCC 3.3 makes MPlayer crash on IA-32 machines when using "g" operand here, which is needed to support GCC 4.0. */ #if ARCH_X86_64 && ((__GNUC__ > 3) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) - :: "m" (src1), "m" (dst), "g" ((long)dstWidth), "m" (xInc_shr16), "m" (xInc_mask), + :: "m" (src1), "m" (dst), "g" (dstWidth), "m" (xInc_shr16), "m" (xInc_mask), #else - :: "m" (src1), "m" (dst), "m" ((long)dstWidth), "m" (xInc_shr16), "m" (xInc_mask), + :: "m" (src1), "m" (dst), "m" (dstWidth), "m" (xInc_shr16), "m" (xInc_mask), #endif "r" (src2) : "%"REG_a, "%"REG_d, "%ecx", "%"REG_D, "%esi" @@ -2683,12 +2828,14 @@ static int RENAME(swScale)(SwsContext *c, uint8_t* src[], int srcStride[], int s int16_t *hChrFilter= c->hChrFilter; int32_t *lumMmxFilter= c->lumMmxFilter; int32_t *chrMmxFilter= c->chrMmxFilter; + int32_t *alpMmxFilter= c->alpMmxFilter; const int vLumFilterSize= c->vLumFilterSize; const int vChrFilterSize= c->vChrFilterSize; const int hLumFilterSize= c->hLumFilterSize; const int hChrFilterSize= c->hChrFilterSize; int16_t **lumPixBuf= c->lumPixBuf; int16_t **chrPixBuf= c->chrPixBuf; + int16_t **alpPixBuf= c->alpPixBuf; const int vLumBufSize= c->vLumBufSize; const int vChrBufSize= c->vChrBufSize; uint8_t *funnyYCode= c->funnyYCode; @@ -2709,10 +2856,12 @@ static int RENAME(swScale)(SwsContext *c, uint8_t* src[], int srcStride[], int s if (isPacked(c->srcFormat)){ src[0]= src[1]= - src[2]= src[0]; + src[2]= + src[3]= src[0]; srcStride[0]= srcStride[1]= - srcStride[2]= srcStride[0]; + srcStride[2]= + srcStride[3]= srcStride[0]; } srcStride[1]<<= c->vChrDrop; srcStride[2]<<= c->vChrDrop; @@ -2733,7 +2882,7 @@ static int RENAME(swScale)(SwsContext *c, uint8_t* src[], int srcStride[], int s //printf("sws Strides:%d %d %d -> %d %d %d\n", srcStride[0],srcStride[1],srcStride[2], //dstStride[0],dstStride[1],dstStride[2]); - if (dstStride[0]%8 !=0 || dstStride[1]%8 !=0 || dstStride[2]%8 !=0) + if (dstStride[0]%8 !=0 || dstStride[1]%8 !=0 || dstStride[2]%8 !=0 || dstStride[3]%8 != 0) { static int warnedAlready=0; //FIXME move this into the context perhaps if (flags & SWS_PRINT_INFO && !warnedAlready) @@ -2762,6 +2911,7 @@ static int RENAME(swScale)(SwsContext *c, uint8_t* src[], int srcStride[], int s const int chrDstY= dstY>>c->chrDstVSubSample; unsigned char *uDest=dst[1]+dstStride[1]*chrDstY; unsigned char *vDest=dst[2]+dstStride[2]*chrDstY; + unsigned char *aDest=(CONFIG_SWSCALE_ALPHA && alpPixBuf) ? dst[3]+dstStride[3]*dstY : NULL; const int firstLumSrcY= vLumFilterPos[dstY]; //First line needed as input const int firstChrSrcY= vChrFilterPos[chrDstY]; //First line needed as input @@ -2783,17 +2933,23 @@ static int RENAME(swScale)(SwsContext *c, uint8_t* src[], int srcStride[], int s //Do horizontal scaling while(lastInLumBuf < lastLumSrcY) { - uint8_t *s= src[0]+(lastInLumBuf + 1 - srcSliceY)*srcStride[0]; + uint8_t *src1= src[0]+(lastInLumBuf + 1 - srcSliceY)*srcStride[0]; + uint8_t *src2= src[3]+(lastInLumBuf + 1 - srcSliceY)*srcStride[3]; lumBufIndex++; //printf("%d %d %d %d\n", lumBufIndex, vLumBufSize, lastInLumBuf, lastLumSrcY); assert(lumBufIndex < 2*vLumBufSize); assert(lastInLumBuf + 1 - srcSliceY < srcSliceH); assert(lastInLumBuf + 1 - srcSliceY >= 0); //printf("%d %d\n", lumBufIndex, vLumBufSize); - RENAME(hyscale)(c, lumPixBuf[ lumBufIndex ], dstW, s, srcW, lumXInc, + RENAME(hyscale)(c, lumPixBuf[ lumBufIndex ], dstW, src1, srcW, lumXInc, flags, canMMX2BeUsed, hLumFilter, hLumFilterPos, hLumFilterSize, funnyYCode, c->srcFormat, formatConvBuffer, - c->lumMmx2Filter, c->lumMmx2FilterPos, pal); + c->lumMmx2Filter, c->lumMmx2FilterPos, pal, 0); + if (CONFIG_SWSCALE_ALPHA && alpPixBuf) + RENAME(hyscale)(c, alpPixBuf[ lumBufIndex ], dstW, src2, srcW, lumXInc, + flags, canMMX2BeUsed, hLumFilter, hLumFilterPos, hLumFilterSize, + funnyYCode, c->srcFormat, formatConvBuffer, + c->lumMmx2Filter, c->lumMmx2FilterPos, pal, 1); lastInLumBuf++; } while(lastInChrBuf < lastChrSrcY) @@ -2827,15 +2983,21 @@ static int RENAME(swScale)(SwsContext *c, uint8_t* src[], int srcStride[], int s //Do horizontal scaling while(lastInLumBuf+1 < srcSliceY + srcSliceH) { - uint8_t *s= src[0]+(lastInLumBuf + 1 - srcSliceY)*srcStride[0]; + uint8_t *src1= src[0]+(lastInLumBuf + 1 - srcSliceY)*srcStride[0]; + uint8_t *src2= src[3]+(lastInLumBuf + 1 - srcSliceY)*srcStride[3]; lumBufIndex++; assert(lumBufIndex < 2*vLumBufSize); assert(lastInLumBuf + 1 - srcSliceY < srcSliceH); assert(lastInLumBuf + 1 - srcSliceY >= 0); - RENAME(hyscale)(c, lumPixBuf[ lumBufIndex ], dstW, s, srcW, lumXInc, + RENAME(hyscale)(c, lumPixBuf[ lumBufIndex ], dstW, src1, srcW, lumXInc, flags, canMMX2BeUsed, hLumFilter, hLumFilterPos, hLumFilterSize, funnyYCode, c->srcFormat, formatConvBuffer, - c->lumMmx2Filter, c->lumMmx2FilterPos, pal); + c->lumMmx2Filter, c->lumMmx2FilterPos, pal, 0); + if (CONFIG_SWSCALE_ALPHA && alpPixBuf) + RENAME(hyscale)(c, alpPixBuf[ lumBufIndex ], dstW, src2, srcW, lumXInc, + flags, canMMX2BeUsed, hLumFilter, hLumFilterPos, hLumFilterSize, + funnyYCode, c->srcFormat, formatConvBuffer, + c->lumMmx2Filter, c->lumMmx2FilterPos, pal, 1); lastInLumBuf++; } while(lastInChrBuf+1 < (chrSrcSliceY + chrSrcSliceH)) @@ -2872,6 +3034,7 @@ static int RENAME(swScale)(SwsContext *c, uint8_t* src[], int srcStride[], int s { int16_t **lumSrcPtr= lumPixBuf + lumBufIndex + firstLumSrcY - lastInLumBuf + vLumBufSize; int16_t **chrSrcPtr= chrPixBuf + chrBufIndex + firstChrSrcY - lastInChrBuf + vChrBufSize; + int16_t **alpSrcPtr= (CONFIG_SWSCALE_ALPHA && alpPixBuf) ? alpPixBuf + lumBufIndex + firstLumSrcY - lastInLumBuf + vLumBufSize : NULL; #if HAVE_MMX int i; if (flags & SWS_ACCURATE_RND){ @@ -2882,6 +3045,12 @@ static int RENAME(swScale)(SwsContext *c, uint8_t* src[], int srcStride[], int s lumMmxFilter[s*i+APCK_COEF/4 ]= lumMmxFilter[s*i+APCK_COEF/4+1]= vLumFilter[dstY*vLumFilterSize + i ] + (vLumFilterSize>1 ? vLumFilter[dstY*vLumFilterSize + i + 1]<<16 : 0); + if (CONFIG_SWSCALE_ALPHA && alpPixBuf){ + *(void**)&alpMmxFilter[s*i ]= alpSrcPtr[i ]; + *(void**)&alpMmxFilter[s*i+APCK_PTR2/4 ]= alpSrcPtr[i+(vLumFilterSize>1)]; + alpMmxFilter[s*i+APCK_COEF/4 ]= + alpMmxFilter[s*i+APCK_COEF/4+1]= lumMmxFilter[s*i+APCK_COEF/4 ]; + } } for (i=0; i<vChrFilterSize; i+=2){ *(void**)&chrMmxFilter[s*i ]= chrSrcPtr[i ]; @@ -2898,6 +3067,12 @@ static int RENAME(swScale)(SwsContext *c, uint8_t* src[], int srcStride[], int s lumMmxFilter[4*i+2]= lumMmxFilter[4*i+3]= ((uint16_t)vLumFilter[dstY*vLumFilterSize + i])*0x10001; + if (CONFIG_SWSCALE_ALPHA && alpPixBuf){ + alpMmxFilter[4*i+0]= (int32_t)alpSrcPtr[i]; + alpMmxFilter[4*i+1]= (uint64_t)alpSrcPtr[i] >> 32; + alpMmxFilter[4*i+2]= + alpMmxFilter[4*i+3]= lumMmxFilter[4*i+2]; + } } for (i=0; i<vChrFilterSize; i++) { @@ -2925,14 +3100,15 @@ static int RENAME(swScale)(SwsContext *c, uint8_t* src[], int srcStride[], int s { int16_t *lumBuf = lumPixBuf[0]; int16_t *chrBuf= chrPixBuf[0]; - RENAME(yuv2yuv1)(c, lumBuf, chrBuf, dest, uDest, vDest, dstW, chrDstW); + int16_t *alpBuf= (CONFIG_SWSCALE_ALPHA && alpPixBuf) ? alpPixBuf[0] : NULL; + RENAME(yuv2yuv1)(c, lumBuf, chrBuf, alpBuf, dest, uDest, vDest, aDest, dstW, chrDstW); } else //General YV12 { RENAME(yuv2yuvX)(c, vLumFilter+dstY*vLumFilterSize , lumSrcPtr, vLumFilterSize, vChrFilter+chrDstY*vChrFilterSize, chrSrcPtr, vChrFilterSize, - dest, uDest, vDest, dstW, chrDstW); + alpSrcPtr, dest, uDest, vDest, aDest, dstW, chrDstW); } } else @@ -2946,9 +3122,10 @@ static int RENAME(swScale)(SwsContext *c, uint8_t* src[], int srcStride[], int s yuv2rgbXinC_full(c, //FIXME write a packed1_full function vLumFilter+dstY*vLumFilterSize, lumSrcPtr, vLumFilterSize, vChrFilter+dstY*vChrFilterSize, chrSrcPtr, vChrFilterSize, - dest, dstW, dstY); + alpSrcPtr, dest, dstW, dstY); }else{ RENAME(yuv2packed1)(c, *lumSrcPtr, *chrSrcPtr, *(chrSrcPtr+1), + alpPixBuf ? *alpSrcPtr : NULL, dest, dstW, chrAlpha, dstFormat, flags, dstY); } } @@ -2964,9 +3141,10 @@ static int RENAME(swScale)(SwsContext *c, uint8_t* src[], int srcStride[], int s yuv2rgbXinC_full(c, //FIXME write a packed2_full function vLumFilter+dstY*vLumFilterSize, lumSrcPtr, vLumFilterSize, vChrFilter+dstY*vChrFilterSize, chrSrcPtr, vChrFilterSize, - dest, dstW, dstY); + alpSrcPtr, dest, dstW, dstY); }else{ RENAME(yuv2packed2)(c, *lumSrcPtr, *(lumSrcPtr+1), *chrSrcPtr, *(chrSrcPtr+1), + alpPixBuf ? *alpSrcPtr : NULL, alpPixBuf ? *(alpSrcPtr+1) : NULL, dest, dstW, lumAlpha, chrAlpha, dstY); } } @@ -2976,12 +3154,12 @@ static int RENAME(swScale)(SwsContext *c, uint8_t* src[], int srcStride[], int s yuv2rgbXinC_full(c, vLumFilter+dstY*vLumFilterSize, lumSrcPtr, vLumFilterSize, vChrFilter+dstY*vChrFilterSize, chrSrcPtr, vChrFilterSize, - dest, dstW, dstY); + alpSrcPtr, dest, dstW, dstY); }else{ RENAME(yuv2packedX)(c, vLumFilter+dstY*vLumFilterSize, lumSrcPtr, vLumFilterSize, vChrFilter+dstY*vChrFilterSize, chrSrcPtr, vChrFilterSize, - dest, dstW, dstY); + alpSrcPtr, dest, dstW, dstY); } } } @@ -2990,6 +3168,7 @@ static int RENAME(swScale)(SwsContext *c, uint8_t* src[], int srcStride[], int s { int16_t **lumSrcPtr= lumPixBuf + lumBufIndex + firstLumSrcY - lastInLumBuf + vLumBufSize; int16_t **chrSrcPtr= chrPixBuf + chrBufIndex + firstChrSrcY - lastInChrBuf + vChrBufSize; + int16_t **alpSrcPtr= (CONFIG_SWSCALE_ALPHA && alpPixBuf) ? alpPixBuf + lumBufIndex + firstLumSrcY - lastInLumBuf + vLumBufSize : NULL; if (dstFormat == PIX_FMT_NV12 || dstFormat == PIX_FMT_NV21){ const int chrSkipMask= (1<<c->chrDstVSubSample)-1; if (dstY&chrSkipMask) uDest= NULL; //FIXME split functions in lumi / chromi @@ -3005,7 +3184,7 @@ static int RENAME(swScale)(SwsContext *c, uint8_t* src[], int srcStride[], int s yuv2yuvXinC( vLumFilter+dstY*vLumFilterSize , lumSrcPtr, vLumFilterSize, vChrFilter+chrDstY*vChrFilterSize, chrSrcPtr, vChrFilterSize, - dest, uDest, vDest, dstW, chrDstW); + alpSrcPtr, dest, uDest, vDest, aDest, dstW, chrDstW); } else { @@ -3015,17 +3194,20 @@ static int RENAME(swScale)(SwsContext *c, uint8_t* src[], int srcStride[], int s yuv2rgbXinC_full(c, vLumFilter+dstY*vLumFilterSize, lumSrcPtr, vLumFilterSize, vChrFilter+dstY*vChrFilterSize, chrSrcPtr, vChrFilterSize, - dest, dstW, dstY); + alpSrcPtr, dest, dstW, dstY); }else{ yuv2packedXinC(c, vLumFilter+dstY*vLumFilterSize, lumSrcPtr, vLumFilterSize, vChrFilter+dstY*vChrFilterSize, chrSrcPtr, vChrFilterSize, - dest, dstW, dstY); + alpSrcPtr, dest, dstW, dstY); } } } } + if ((dstFormat == PIX_FMT_YUVA420P) && !alpPixBuf) + fillPlane(dst[3], dstStride[3], dstW, dstY-lastDstY, lastDstY, 255); + #if HAVE_MMX __asm__ volatile(SFENCE:::"memory"); __asm__ volatile(EMMS:::"memory"); diff --git a/libswscale/x86/yuv2rgb_mmx.c b/libswscale/x86/yuv2rgb_mmx.c new file mode 100644 index 0000000000..ced537fcce --- /dev/null +++ b/libswscale/x86/yuv2rgb_mmx.c @@ -0,0 +1,89 @@ +/* + * software YUV to RGB converter + * + * Copyright (C) 2009 Konstantin Shishkov + * + * MMX/MMX2 template stuff (needed for fast movntq support), + * 1,4,8bpp support and context / deglobalize stuff + * by Michael Niedermayer (michaelni@gmx.at) + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include <stdio.h> +#include <stdlib.h> +#include <inttypes.h> +#include <assert.h> + +#include "config.h" +#include "libswscale/rgb2rgb.h" +#include "libswscale/swscale.h" +#include "libswscale/swscale_internal.h" +#include "libavutil/x86_cpu.h" + +#define DITHER1XBPP // only for MMX + +/* hope these constant values are cache line aligned */ +DECLARE_ASM_CONST(8, uint64_t, mmx_00ffw) = 0x00ff00ff00ff00ffULL; +DECLARE_ASM_CONST(8, uint64_t, mmx_redmask) = 0xf8f8f8f8f8f8f8f8ULL; +DECLARE_ASM_CONST(8, uint64_t, mmx_grnmask) = 0xfcfcfcfcfcfcfcfcULL; + +//MMX versions +#undef RENAME +#undef HAVE_MMX2 +#undef HAVE_AMD3DNOW +#define HAVE_MMX2 0 +#define HAVE_AMD3DNOW 0 +#define RENAME(a) a ## _MMX +#include "yuv2rgb_template.c" + +//MMX2 versions +#undef RENAME +#undef HAVE_MMX2 +#define HAVE_MMX2 1 +#define RENAME(a) a ## _MMX2 +#include "yuv2rgb_template.c" + +SwsFunc ff_yuv2rgb_init_mmx(SwsContext *c) +{ + if (c->flags & SWS_CPU_CAPS_MMX2) { + switch (c->dstFormat) { + case PIX_FMT_RGB32: + if (CONFIG_SWSCALE_ALPHA && c->srcFormat == PIX_FMT_YUVA420P){ + if (HAVE_7REGS) return yuva420_rgb32_MMX2; + break; + }else return yuv420_rgb32_MMX2; + case PIX_FMT_BGR24: return yuv420_rgb24_MMX2; + case PIX_FMT_RGB565: return yuv420_rgb16_MMX2; + case PIX_FMT_RGB555: return yuv420_rgb15_MMX2; + } + } + if (c->flags & SWS_CPU_CAPS_MMX) { + switch (c->dstFormat) { + case PIX_FMT_RGB32: + if (CONFIG_SWSCALE_ALPHA && c->srcFormat == PIX_FMT_YUVA420P){ + if (HAVE_7REGS) return yuva420_rgb32_MMX; + break; + }else return yuv420_rgb32_MMX; + case PIX_FMT_BGR24: return yuv420_rgb24_MMX; + case PIX_FMT_RGB565: return yuv420_rgb16_MMX; + case PIX_FMT_RGB555: return yuv420_rgb15_MMX; + } + } + + return NULL; +} diff --git a/libswscale/yuv2rgb_template.c b/libswscale/x86/yuv2rgb_template.c index f55568b0ab..798eff0e33 100644 --- a/libswscale/yuv2rgb_template.c +++ b/libswscale/x86/yuv2rgb_template.c @@ -137,7 +137,7 @@ 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; \ + x86_reg index= -h_size/2; \ #define YUV2RGB_INIT \ /* This MMX assembly code deals with a SINGLE scan line at a time, \ @@ -162,7 +162,8 @@ "add $"AV_STRINGIFY(depth*8)", %1 \n\t" \ "add $4, %0 \n\t" \ " js 1b \n\t" \ -\ + +#define YUV2RGB_OPERANDS \ : "+r" (index), "+r" (image) \ : "r" (pu - index), "r" (pv - index), "r"(&c->redDither), "r" (py - 2*index) \ ); \ @@ -170,6 +171,14 @@ __asm__ volatile (EMMS); \ return srcSliceH; \ +#define YUV2RGB_OPERANDS_ALPHA \ + : "+r" (index), "+r" (image) \ + : "r" (pu - index), "r" (pv - index), "r"(&c->redDither), "r" (py - 2*index), "r" (pa - 2*index) \ + ); \ + } \ + __asm__ volatile (EMMS); \ + return srcSliceH; \ + static inline int RENAME(yuv420_rgb16)(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, int srcSliceH, uint8_t* dst[], int dstStride[]){ int y, h_size; @@ -223,6 +232,7 @@ static inline int RENAME(yuv420_rgb16)(SwsContext *c, uint8_t* src[], int srcStr MOVNTQ " %%mm5, 8 (%1);" /* store pixel 4-7 */ YUV2RGB_ENDLOOP(2) + YUV2RGB_OPERANDS } static inline int RENAME(yuv420_rgb15)(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, @@ -280,6 +290,7 @@ static inline int RENAME(yuv420_rgb15)(SwsContext *c, uint8_t* src[], int srcStr MOVNTQ " %%mm5, 8 (%1);" /* store pixel 4-7 */ YUV2RGB_ENDLOOP(2) + YUV2RGB_OPERANDS } static inline int RENAME(yuv420_rgb24)(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, @@ -394,6 +405,7 @@ static inline int RENAME(yuv420_rgb24)(SwsContext *c, uint8_t* src[], int srcStr #endif YUV2RGB_ENDLOOP(3) + YUV2RGB_OPERANDS } #define RGB_PLANAR2PACKED32 \ @@ -450,4 +462,23 @@ static inline int RENAME(yuv420_rgb32)(SwsContext *c, uint8_t* src[], int srcStr RGB_PLANAR2PACKED32 YUV2RGB_ENDLOOP(4) + YUV2RGB_OPERANDS +} + +static inline int RENAME(yuva420_rgb32)(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, + int srcSliceH, uint8_t* dst[], int dstStride[]){ +#if HAVE_7REGS + int y, h_size; + + YUV2RGB_LOOP(4) + + uint8_t *pa = src[3] + y*srcStride[3]; + YUV2RGB_INIT + YUV2RGB + "movq (%6, %0, 2), %%mm3;" /* Load 8 A A7 A6 A5 A4 A3 A2 A1 A0 */ + RGB_PLANAR2PACKED32 + + YUV2RGB_ENDLOOP(4) + YUV2RGB_OPERANDS_ALPHA +#endif } diff --git a/libswscale/yuv2rgb.c b/libswscale/yuv2rgb.c index 65af412c2c..d8438c0c66 100644 --- a/libswscale/yuv2rgb.c +++ b/libswscale/yuv2rgb.c @@ -3,7 +3,6 @@ * * Copyright (C) 2009 Konstantin Shishkov * - * MMX/MMX2 template stuff (needed for fast movntq support), * 1,4,8bpp support and context / deglobalize stuff * by Michael Niedermayer (michaelni@gmx.at) * @@ -33,38 +32,12 @@ #include "rgb2rgb.h" #include "swscale.h" #include "swscale_internal.h" - -#define DITHER1XBPP // only for MMX +#include "libavutil/x86_cpu.h" extern const uint8_t dither_8x8_32[8][8]; extern const uint8_t dither_8x8_73[8][8]; extern const uint8_t dither_8x8_220[8][8]; -#if HAVE_MMX && CONFIG_GPL - -/* hope these constant values are cache line aligned */ -DECLARE_ASM_CONST(8, uint64_t, mmx_00ffw) = 0x00ff00ff00ff00ffULL; -DECLARE_ASM_CONST(8, uint64_t, mmx_redmask) = 0xf8f8f8f8f8f8f8f8ULL; -DECLARE_ASM_CONST(8, uint64_t, mmx_grnmask) = 0xfcfcfcfcfcfcfcfcULL; - -//MMX versions -#undef RENAME -#undef HAVE_MMX2 -#undef HAVE_AMD3DNOW -#define HAVE_MMX2 0 -#define HAVE_AMD3DNOW 0 -#define RENAME(a) a ## _MMX -#include "yuv2rgb_template.c" - -//MMX2 versions -#undef RENAME -#undef HAVE_MMX2 -#define HAVE_MMX2 1 -#define RENAME(a) a ## _MMX2 -#include "yuv2rgb_template.c" - -#endif /* HAVE_MMX && CONFIG_GPL */ - const int32_t ff_yuv2rgb_coeffs[8][4] = { {117504, 138453, 13954, 34903}, /* no sequence_display_extension */ {117504, 138453, 13954, 34903}, /* ITU-R Rec. 709 (1990) */ @@ -101,12 +74,18 @@ const int32_t ff_yuv2rgb_coeffs[8][4] = { Y = src[2*i+1]; \ dst[6*i+3] = b[Y]; dst[6*i+4] = g[Y]; dst[6*i+5] = r[Y]; -#define YUV2RGBFUNC(func_name, dst_type) \ +#define PUTRGBA(dst,ysrc,asrc,i,o,s) \ + Y = ysrc[2*i+o]; \ + dst[2*i ] = r[Y] + g[Y] + b[Y] + (asrc[2*i ]<<s); \ + Y = ysrc[2*i+1-o]; \ + dst[2*i+1] = r[Y] + g[Y] + b[Y] + (asrc[2*i+1]<<s); + +#define YUV2RGBFUNC(func_name, dst_type, alpha) \ static int func_name(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY, \ int srcSliceH, uint8_t* dst[], int dstStride[]){\ int y;\ \ - if (c->srcFormat == PIX_FMT_YUV422P) {\ + if (!alpha && c->srcFormat == PIX_FMT_YUV422P) {\ srcStride[1] *= 2;\ srcStride[2] *= 2;\ }\ @@ -119,7 +98,12 @@ static int func_name(SwsContext *c, uint8_t* src[], int srcStride[], int srcSlic uint8_t *py_2 = py_1 + srcStride[0];\ uint8_t *pu = src[1] + (y>>1)*srcStride[1];\ uint8_t *pv = src[2] + (y>>1)*srcStride[2];\ + uint8_t av_unused *pa_1, *pa_2;\ unsigned int h_size = c->dstW>>3;\ + if (alpha){\ + pa_1 = src[3] + y*srcStride[3];\ + pa_2 = pa_1 + srcStride[3];\ + }\ while (h_size--) {\ int av_unused U, V;\ int Y;\ @@ -145,7 +129,7 @@ static int func_name(SwsContext *c, uint8_t* src[], int srcStride[], int srcSlic ENDYUV2RGBLINE(dst_delta)\ ENDYUV2RGBFUNC() -YUV2RGBFUNC(yuv2rgb_c_32, uint32_t) +YUV2RGBFUNC(yuv2rgb_c_32, uint32_t, 0) LOADCHROMA(0); PUTRGB(dst_1,py_1,0,0); PUTRGB(dst_2,py_2,0,1); @@ -174,7 +158,69 @@ ENDYUV2RGBLINE(8) PUTRGB(dst_1,py_1,1,0); ENDYUV2RGBFUNC() -YUV2RGBFUNC(yuv2rgb_c_24_rgb, uint8_t) +YUV2RGBFUNC(yuva2rgba_c, uint32_t, 1) + LOADCHROMA(0); + PUTRGBA(dst_1,py_1,pa_1,0,0,24); + PUTRGBA(dst_2,py_2,pa_2,0,1,24); + + LOADCHROMA(1); + PUTRGBA(dst_2,py_2,pa_1,1,1,24); + PUTRGBA(dst_1,py_1,pa_2,1,0,24); + LOADCHROMA(1); + PUTRGBA(dst_2,py_2,pa_1,1,1,24); + PUTRGBA(dst_1,py_1,pa_2,1,0,24); + + LOADCHROMA(2); + PUTRGBA(dst_1,py_1,pa_1,2,0,24); + PUTRGBA(dst_2,py_2,pa_2,2,1,24); + + LOADCHROMA(3); + PUTRGBA(dst_2,py_2,pa_1,3,1,24); + PUTRGBA(dst_1,py_1,pa_2,3,0,24); + pa_1 += 8;\ + pa_2 += 8;\ +ENDYUV2RGBLINE(8) + LOADCHROMA(0); + PUTRGBA(dst_1,py_1,pa_1,0,0,24); + PUTRGBA(dst_2,py_2,pa_2,0,1,24); + + LOADCHROMA(1); + PUTRGBA(dst_2,py_2,pa_1,1,1,24); + PUTRGBA(dst_1,py_1,pa_2,1,0,24); +ENDYUV2RGBFUNC() + +YUV2RGBFUNC(yuva2argb_c, uint32_t, 1) + LOADCHROMA(0); + PUTRGBA(dst_1,py_1,pa_1,0,0,0); + PUTRGBA(dst_2,py_2,pa_2,0,1,0); + + LOADCHROMA(1); + PUTRGBA(dst_2,py_2,pa_2,1,1,0); + PUTRGBA(dst_1,py_1,pa_1,1,0,0); + LOADCHROMA(1); + PUTRGBA(dst_2,py_2,pa_2,1,1,0); + PUTRGBA(dst_1,py_1,pa_1,1,0,0); + + LOADCHROMA(2); + PUTRGBA(dst_1,py_1,pa_1,2,0,0); + PUTRGBA(dst_2,py_2,pa_2,2,1,0); + + LOADCHROMA(3); + PUTRGBA(dst_2,py_2,pa_2,3,1,0); + PUTRGBA(dst_1,py_1,pa_1,3,0,0); + pa_1 += 8;\ + pa_2 += 8;\ +ENDYUV2RGBLINE(8) + LOADCHROMA(0); + PUTRGBA(dst_1,py_1,pa_1,0,0,0); + PUTRGBA(dst_2,py_2,pa_2,0,1,0); + + LOADCHROMA(1); + PUTRGBA(dst_2,py_2,pa_2,1,1,0); + PUTRGBA(dst_1,py_1,pa_1,1,0,0); +ENDYUV2RGBFUNC() + +YUV2RGBFUNC(yuv2rgb_c_24_rgb, uint8_t, 0) LOADCHROMA(0); PUTRGB24(dst_1,py_1,0); PUTRGB24(dst_2,py_2,0); @@ -201,7 +247,7 @@ ENDYUV2RGBLINE(24) ENDYUV2RGBFUNC() // only trivial mods from yuv2rgb_c_24_rgb -YUV2RGBFUNC(yuv2rgb_c_24_bgr, uint8_t) +YUV2RGBFUNC(yuv2rgb_c_24_bgr, uint8_t, 0) LOADCHROMA(0); PUTBGR24(dst_1,py_1,0); PUTBGR24(dst_2,py_2,0); @@ -229,7 +275,7 @@ ENDYUV2RGBFUNC() // This is exactly the same code as yuv2rgb_c_32 except for the types of // r, g, b, dst_1, dst_2 -YUV2RGBFUNC(yuv2rgb_c_16, uint16_t) +YUV2RGBFUNC(yuv2rgb_c_16, uint16_t, 0) LOADCHROMA(0); PUTRGB(dst_1,py_1,0,0); PUTRGB(dst_2,py_2,0,1); @@ -249,7 +295,7 @@ CLOSEYUV2RGBFUNC(8) // This is exactly the same code as yuv2rgb_c_32 except for the types of // r, g, b, dst_1, dst_2 -YUV2RGBFUNC(yuv2rgb_c_8, uint8_t) +YUV2RGBFUNC(yuv2rgb_c_8, uint8_t, 0) LOADCHROMA(0); PUTRGB(dst_1,py_1,0,0); PUTRGB(dst_2,py_2,0,1); @@ -268,7 +314,7 @@ YUV2RGBFUNC(yuv2rgb_c_8, uint8_t) CLOSEYUV2RGBFUNC(8) // r, g, b, dst_1, dst_2 -YUV2RGBFUNC(yuv2rgb_c_8_ordered_dither, uint8_t) +YUV2RGBFUNC(yuv2rgb_c_8_ordered_dither, uint8_t, 0) const uint8_t *d32 = dither_8x8_32[y&7]; const uint8_t *d64 = dither_8x8_73[y&7]; #define PUTRGB8(dst,src,i,o) \ @@ -297,7 +343,7 @@ CLOSEYUV2RGBFUNC(8) // This is exactly the same code as yuv2rgb_c_32 except for the types of // r, g, b, dst_1, dst_2 -YUV2RGBFUNC(yuv2rgb_c_4, uint8_t) +YUV2RGBFUNC(yuv2rgb_c_4, uint8_t, 0) int acc; #define PUTRGB4(dst,src,i) \ Y = src[2*i]; \ @@ -323,7 +369,7 @@ YUV2RGBFUNC(yuv2rgb_c_4, uint8_t) PUTRGB4(dst_1,py_1,3); CLOSEYUV2RGBFUNC(4) -YUV2RGBFUNC(yuv2rgb_c_4_ordered_dither, uint8_t) +YUV2RGBFUNC(yuv2rgb_c_4_ordered_dither, uint8_t, 0) const uint8_t *d64 = dither_8x8_73[y&7]; const uint8_t *d128 = dither_8x8_220[y&7]; int acc; @@ -354,7 +400,7 @@ CLOSEYUV2RGBFUNC(4) // This is exactly the same code as yuv2rgb_c_32 except for the types of // r, g, b, dst_1, dst_2 -YUV2RGBFUNC(yuv2rgb_c_4b, uint8_t) +YUV2RGBFUNC(yuv2rgb_c_4b, uint8_t, 0) LOADCHROMA(0); PUTRGB(dst_1,py_1,0,0); PUTRGB(dst_2,py_2,0,1); @@ -372,7 +418,7 @@ YUV2RGBFUNC(yuv2rgb_c_4b, uint8_t) PUTRGB(dst_1,py_1,3,0); CLOSEYUV2RGBFUNC(8) -YUV2RGBFUNC(yuv2rgb_c_4b_ordered_dither, uint8_t) +YUV2RGBFUNC(yuv2rgb_c_4b_ordered_dither, uint8_t, 0) const uint8_t *d64 = dither_8x8_73[y&7]; const uint8_t *d128 = dither_8x8_220[y&7]; @@ -399,7 +445,7 @@ YUV2RGBFUNC(yuv2rgb_c_4b_ordered_dither, uint8_t) PUTRGB4DB(dst_1,py_1,3,6); CLOSEYUV2RGBFUNC(8) -YUV2RGBFUNC(yuv2rgb_c_1_ordered_dither, uint8_t) +YUV2RGBFUNC(yuv2rgb_c_1_ordered_dither, uint8_t, 0) const uint8_t *d128 = dither_8x8_220[y&7]; char out_1 = 0, out_2 = 0; g= c->table_gU[128] + c->table_gV[128]; @@ -426,41 +472,26 @@ YUV2RGBFUNC(yuv2rgb_c_1_ordered_dither, uint8_t) dst_2[0]= out_2; CLOSEYUV2RGBFUNC(1) -SwsFunc sws_yuv2rgb_get_func_ptr(SwsContext *c) +SwsFunc ff_yuv2rgb_get_func_ptr(SwsContext *c) { SwsFunc t = NULL; #if (HAVE_MMX2 || HAVE_MMX) && CONFIG_GPL - if (c->flags & SWS_CPU_CAPS_MMX2) { - switch (c->dstFormat) { - case PIX_FMT_RGB32: return yuv420_rgb32_MMX2; - case PIX_FMT_BGR24: return yuv420_rgb24_MMX2; - case PIX_FMT_RGB565: return yuv420_rgb16_MMX2; - case PIX_FMT_RGB555: return yuv420_rgb15_MMX2; - } - } - if (c->flags & SWS_CPU_CAPS_MMX) { - switch (c->dstFormat) { - case PIX_FMT_RGB32: return yuv420_rgb32_MMX; - case PIX_FMT_BGR24: return yuv420_rgb24_MMX; - case PIX_FMT_RGB565: return yuv420_rgb16_MMX; - case PIX_FMT_RGB555: return yuv420_rgb15_MMX; - } - } + t = ff_yuv2rgb_init_mmx(c); #endif #if HAVE_VIS - t = sws_yuv2rgb_init_vis(c); + t = ff_yuv2rgb_init_vis(c); #endif #if CONFIG_MLIB - t = sws_yuv2rgb_init_mlib(c); + t = ff_yuv2rgb_init_mlib(c); #endif #if HAVE_ALTIVEC && CONFIG_GPL if (c->flags & SWS_CPU_CAPS_ALTIVEC) - t = sws_yuv2rgb_init_altivec(c); + t = ff_yuv2rgb_init_altivec(c); #endif #if ARCH_BFIN if (c->flags & SWS_CPU_CAPS_BFIN) - t = sws_ff_bfin_yuv2rgb_get_func_ptr(c); + t = ff_yuv2rgb_get_func_ptr_bfin(c); #endif if (t) @@ -469,10 +500,10 @@ SwsFunc sws_yuv2rgb_get_func_ptr(SwsContext *c) av_log(c, AV_LOG_WARNING, "No accelerated colorspace conversion found.\n"); switch (c->dstFormat) { - case PIX_FMT_BGR32_1: - case PIX_FMT_RGB32_1: - case PIX_FMT_BGR32: - case PIX_FMT_RGB32: return yuv2rgb_c_32; + case PIX_FMT_ARGB: + case PIX_FMT_ABGR: if (CONFIG_SWSCALE_ALPHA && c->srcFormat == PIX_FMT_YUVA420P) return yuva2argb_c; + case PIX_FMT_RGBA: + case PIX_FMT_BGRA: return (CONFIG_SWSCALE_ALPHA && c->srcFormat == PIX_FMT_YUVA420P) ? yuva2rgba_c : yuv2rgb_c_32; case PIX_FMT_RGB24: return yuv2rgb_c_24_rgb; case PIX_FMT_BGR24: return yuv2rgb_c_24_bgr; case PIX_FMT_RGB565: @@ -517,8 +548,8 @@ static void fill_gv_table(int table[256], const int elemsize, const int inc) } } -av_cold int sws_yuv2rgb_c_init_tables(SwsContext *c, const int inv_table[4], int fullRange, - int brightness, int contrast, int saturation) +av_cold int ff_yuv2rgb_c_init_tables(SwsContext *c, const int inv_table[4], int fullRange, + int brightness, int contrast, int saturation) { const int isRgb = c->dstFormat==PIX_FMT_RGB32 || c->dstFormat==PIX_FMT_RGB32_1 @@ -533,7 +564,7 @@ av_cold int sws_yuv2rgb_c_init_tables(SwsContext *c, const int inv_table[4], int uint8_t *y_table; uint16_t *y_table16; uint32_t *y_table32; - int i, base, rbase, gbase, bbase, abase; + int i, base, rbase, gbase, bbase, abase, needAlpha; const int yoffs = fullRange ? 384 : 326; int64_t crv = inv_table[0]; @@ -659,13 +690,15 @@ av_cold int sws_yuv2rgb_c_init_tables(SwsContext *c, const int inv_table[4], int rbase = base + (isRgb ? 16 : 0); gbase = base + 8; bbase = base + (isRgb ? 0 : 16); - abase = (base + 24) & 31; + needAlpha = CONFIG_SWSCALE_ALPHA && isALPHA(c->srcFormat); + if (!needAlpha) + abase = (base + 24) & 31; c->yuvTable = av_malloc(1024*3*4); y_table32 = c->yuvTable; yb = -(384<<16) - oy; for (i = 0; i < 1024; i++) { uint8_t yval = av_clip_uint8((yb + 0x8000) >> 16); - y_table32[i ] = (yval << rbase) + (255 << abase); + y_table32[i ] = (yval << rbase) + (needAlpha ? 0 : (255 << abase)); y_table32[i+1024] = yval << gbase; y_table32[i+2048] = yval << bbase; yb += cy; diff --git a/libvo/aclib.c b/libvo/aclib.c index cae86dd3d4..47c9dead6b 100644 --- a/libvo/aclib.c +++ b/libvo/aclib.c @@ -33,9 +33,6 @@ //Feel free to fine-tune the above 2, it might be possible to get some speedup with them :) //#define STATISTICS -#if ARCH_X86 -#define CAN_COMPILE_X86_ASM -#endif //Note: we have MMX, MMX2, 3DNOW version there is no 3DNOW+MMX2 one //Plain C versions @@ -43,7 +40,7 @@ //#define COMPILE_C //#endif -#ifdef CAN_COMPILE_X86_ASM +#if ARCH_X86 #if (HAVE_MMX && !HAVE_AMD3DNOW && !HAVE_MMX2) || defined (RUNTIME_CPUDETECT) #define COMPILE_MMX @@ -155,14 +152,14 @@ #include "aclib_template.c" #endif -#endif // CAN_COMPILE_X86_ASM +#endif /* ARCH_X86 */ #undef fast_memcpy void * fast_memcpy(void * to, const void * from, size_t len) { #ifdef RUNTIME_CPUDETECT -#ifdef CAN_COMPILE_X86_ASM +#if ARCH_X86 // ordered per speed fasterst first if(gCpuCaps.hasSSE2) fast_memcpy_SSE(to, from, len); @@ -173,7 +170,7 @@ void * fast_memcpy(void * to, const void * from, size_t len) else if(gCpuCaps.hasMMX) fast_memcpy_MMX(to, from, len); else -#endif //CAN_COMPILE_X86_ASM +#endif memcpy(to, from, len); // prior to mmx we use the standart memcpy #else #if HAVE_SSE2 @@ -196,7 +193,7 @@ void * fast_memcpy(void * to, const void * from, size_t len) void * mem2agpcpy(void * to, const void * from, size_t len) { #ifdef RUNTIME_CPUDETECT -#ifdef CAN_COMPILE_X86_ASM +#if ARCH_X86 // ordered per speed fasterst first if(gCpuCaps.hasSSE2) mem2agpcpy_SSE(to, from, len); @@ -207,7 +204,7 @@ void * mem2agpcpy(void * to, const void * from, size_t len) else if(gCpuCaps.hasMMX) mem2agpcpy_MMX(to, from, len); else -#endif //CAN_COMPILE_X86_ASM +#endif memcpy(to, from, len); // prior to mmx we use the standart memcpy #else #if HAVE_SSE2 diff --git a/libvo/geometry.c b/libvo/geometry.c index a805c147f9..7c6dc54087 100644 --- a/libvo/geometry.c +++ b/libvo/geometry.c @@ -20,6 +20,7 @@ #include <stdio.h> #include <string.h> +#include <limits.h> #include "geometry.h" #include "mp_msg.h" @@ -38,7 +39,7 @@ int geometry(int *xpos, int *ypos, int *widw, int *widh, int scrw, int scrh) { int width, height, xoff, yoff, xper, yper; - width = height = xoff = yoff = xper = yper = -1; + width = height = xoff = yoff = xper = yper = INT_MIN; if(vo_geometry != NULL) { if(sscanf(vo_geometry, "%ix%i+%i+%i", &width, &height, &xoff, &yoff) != 4 ) @@ -90,22 +91,14 @@ int geometry(int *xpos, int *ypos, int *widw, int *widh, int scrw, int scrh) mp_msg(MSGT_VO, MSGL_V,"geometry window parameter: widw: %i," " widh: %i, scrw: %i, scrh: %i\n",*widw, *widh, scrw, scrh); - /* FIXME: better checking of bounds... */ - if( width != -1 && (width < 0 || width > scrw)) - width = (scrw < *widw) ? scrw : *widw; - if( height != -1 && (height < 0 || height > scrh)) - height = (scrh < *widh) ? scrh : *widh; - if(xoff != -1 && (xoff < 0 || xoff + width > scrw)) xoff = 0; - if(yoff != -1 && (yoff < 0 || yoff + height > scrh)) yoff = 0; + if (xoff != INT_MIN && xpos) *xpos = xoff; + if (yoff != INT_MIN && ypos) *ypos = yoff; + if (width > 0 && widw) *widw = width; + if (height > 0 && widh) *widh = height; - if(xoff != -1 && xpos) *xpos = xoff; - if(yoff != -1 && ypos) *ypos = yoff; - if(width != -1 && widw) *widw = width; - if(height != -1 && widh) *widh = height; - - if( width != -1 || height != -1) + if (width > 0 || height > 0) geometry_wh_changed = 1; - if( xoff != -1 || yoff != -1) + if (xoff != INT_MIN || yoff != INT_MIN) geometry_xy_changed = 1; } return 1; diff --git a/libvo/osd.c b/libvo/osd.c index 6660500ecd..42dd4fcc69 100644 --- a/libvo/osd.c +++ b/libvo/osd.c @@ -30,10 +30,6 @@ #include "cpudetect.h" #if ARCH_X86 -#define CAN_COMPILE_X86_ASM -#endif - -#ifdef CAN_COMPILE_X86_ASM static const uint64_t bFF __attribute__((aligned(8))) = 0xFFFFFFFFFFFFFFFFULL; static const unsigned long long mask24lh __attribute__((aligned(8))) = 0xFFFF000000000000ULL; static const unsigned long long mask24hl __attribute__((aligned(8))) = 0x0000FFFFFFFFFFFFULL; @@ -45,7 +41,7 @@ static const unsigned long long mask24hl __attribute__((aligned(8))) = 0x0000FF #define COMPILE_C #endif -#ifdef CAN_COMPILE_X86_ASM +#if ARCH_X86 #if (HAVE_MMX && !HAVE_AMD3DNOW && !HAVE_MMX2) || defined (RUNTIME_CPUDETECT) #define COMPILE_MMX @@ -58,7 +54,8 @@ static const unsigned long long mask24hl __attribute__((aligned(8))) = 0x0000FF #if (HAVE_AMD3DNOW && !HAVE_MMX2) || defined (RUNTIME_CPUDETECT) #define COMPILE_3DNOW #endif -#endif //CAN_COMPILE_X86_ASM + +#endif /* ARCH_X86 */ #undef HAVE_MMX #undef HAVE_MMX2 @@ -67,7 +64,7 @@ static const unsigned long long mask24hl __attribute__((aligned(8))) = 0x0000FF #define HAVE_MMX2 0 #define HAVE_AMD3DNOW 0 -#ifndef CAN_COMPILE_X86_ASM +#if ! ARCH_X86 #ifdef COMPILE_C #undef HAVE_MMX @@ -134,11 +131,11 @@ static const unsigned long long mask24hl __attribute__((aligned(8))) = 0x0000FF #include "osd_template.c" #endif -#endif //CAN_COMPILE_X86_ASM +#endif /* ARCH_X86 */ void vo_draw_alpha_yv12(int w,int h, unsigned char* src, unsigned char *srca, int srcstride, unsigned char* dstbase,int dststride){ #ifdef RUNTIME_CPUDETECT -#ifdef CAN_COMPILE_X86_ASM +#if ARCH_X86 // ordered by speed / fastest first if(gCpuCaps.hasMMX2) vo_draw_alpha_yv12_MMX2(w, h, src, srca, srcstride, dstbase, dststride); @@ -168,7 +165,7 @@ void vo_draw_alpha_yv12(int w,int h, unsigned char* src, unsigned char *srca, in void vo_draw_alpha_yuy2(int w,int h, unsigned char* src, unsigned char *srca, int srcstride, unsigned char* dstbase,int dststride){ #ifdef RUNTIME_CPUDETECT -#ifdef CAN_COMPILE_X86_ASM +#if ARCH_X86 // ordered by speed / fastest first if(gCpuCaps.hasMMX2) vo_draw_alpha_yuy2_MMX2(w, h, src, srca, srcstride, dstbase, dststride); @@ -198,7 +195,7 @@ void vo_draw_alpha_yuy2(int w,int h, unsigned char* src, unsigned char *srca, in void vo_draw_alpha_uyvy(int w,int h, unsigned char* src, unsigned char *srca, int srcstride, unsigned char* dstbase,int dststride){ #ifdef RUNTIME_CPUDETECT -#ifdef CAN_COMPILE_X86_ASM +#if ARCH_X86 // ordered by speed / fastest first if(gCpuCaps.hasMMX2) vo_draw_alpha_uyvy_MMX2(w, h, src, srca, srcstride, dstbase, dststride); @@ -228,7 +225,7 @@ void vo_draw_alpha_uyvy(int w,int h, unsigned char* src, unsigned char *srca, in void vo_draw_alpha_rgb24(int w,int h, unsigned char* src, unsigned char *srca, int srcstride, unsigned char* dstbase,int dststride){ #ifdef RUNTIME_CPUDETECT -#ifdef CAN_COMPILE_X86_ASM +#if ARCH_X86 // ordered by speed / fastest first if(gCpuCaps.hasMMX2) vo_draw_alpha_rgb24_MMX2(w, h, src, srca, srcstride, dstbase, dststride); @@ -258,7 +255,7 @@ void vo_draw_alpha_rgb24(int w,int h, unsigned char* src, unsigned char *srca, i void vo_draw_alpha_rgb32(int w,int h, unsigned char* src, unsigned char *srca, int srcstride, unsigned char* dstbase,int dststride){ #ifdef RUNTIME_CPUDETECT -#ifdef CAN_COMPILE_X86_ASM +#if ARCH_X86 // ordered by speed / fastest first if(gCpuCaps.hasMMX2) vo_draw_alpha_rgb32_MMX2(w, h, src, srca, srcstride, dstbase, dststride); @@ -303,7 +300,7 @@ void vo_draw_alpha_init(void){ if( mp_msg_test(MSGT_OSD,MSGL_V) ) { #ifdef RUNTIME_CPUDETECT -#ifdef CAN_COMPILE_X86_ASM +#if ARCH_X86 // ordered per speed fasterst first if(gCpuCaps.hasMMX2) mp_msg(MSGT_OSD,MSGL_INFO,"Using MMX (with tiny bit MMX2) Optimized OnScreenDisplay\n"); diff --git a/libvo/spuenc.c b/libvo/spuenc.c index a1e457c282..f03c0d9be9 100644 --- a/libvo/spuenc.c +++ b/libvo/spuenc.c @@ -1,5 +1,5 @@ /* - * subpic_encode.c - encodes a pixmap with RLE + * encode a pixmap with RLE * * Copyright (C) 2000 Alejandro J. Cura <alecu@protocultura.net> * diff --git a/libvo/spuenc.h b/libvo/spuenc.h index d19732a98f..7f4590b4ac 100644 --- a/libvo/spuenc.h +++ b/libvo/spuenc.h @@ -1,5 +1,5 @@ /* - * subpic_encode.c - encodes a pixmap with RLE + * encode a pixmap with RLE * * Copyright (C) 2000 Alejandro J. Cura <alecu@protocultura.net> * diff --git a/libvo/vo_aa.c b/libvo/vo_aa.c index 48b9f2f2ad..140c251355 100644 --- a/libvo/vo_aa.c +++ b/libvo/vo_aa.c @@ -68,8 +68,8 @@ aa_context *c; aa_renderparams *p; static int fast =0; /* used for the sws */ -static uint8_t * image[3]; -static int image_stride[3]; +static uint8_t * image[MP_MAX_PLANES]; +static int image_stride[MP_MAX_PLANES]; /* image infos */ static int image_format; @@ -125,13 +125,11 @@ resize(void){ sws = sws_getContextFromCmdLine(src_width,src_height,image_format, image_width,image_height,IMGFMT_Y8); + memset(image, 0, sizeof(image)); image[0] = aa_image(c) + image_y * aa_imgwidth(c) + image_x; - image[1] = NULL; - image[2] = NULL; + memset(image_stride, 0, sizeof(image_stride)); image_stride[0] = aa_imgwidth(c); - image_stride[1] = 0; - image_stride[2] = 0; showosdmessage=0; @@ -336,7 +334,7 @@ query_format(uint32_t format) { static int draw_frame(uint8_t *src[]) { - int stride[3] = { 0 , 0 , 0 }; + int stride[MP_MAX_PLANES] = {0}; switch(image_format) { case IMGFMT_BGR15: @@ -576,9 +574,9 @@ static int parse_suboptions(const char *arg) { *helpmsg = NULL; int pseudoargc, displayhelp = 0, *booleans; const opt_t extra_opts[] = { - {"osdcolor", OPT_ARG_MSTRZ, &osdcolor, NULL, 0}, - {"subcolor", OPT_ARG_MSTRZ, &subcolor, NULL, 0}, - {"help", OPT_ARG_BOOL, &displayhelp, NULL, 0} }; + {"osdcolor", OPT_ARG_MSTRZ, &osdcolor, NULL}, + {"subcolor", OPT_ARG_MSTRZ, &subcolor, NULL}, + {"help", OPT_ARG_BOOL, &displayhelp, NULL} }; opt_t *subopts = NULL, *p; char * const strings_list[] = {"-driver", "-kbddriver", "-mousedriver", "-font", "-width", "-height", "-minwidth", "-minheight", "-maxwidth", diff --git a/libvo/vo_gif89a.c b/libvo/vo_gif89a.c index 78dd5249fd..5da23cd8cb 100644 --- a/libvo/vo_gif89a.c +++ b/libvo/vo_gif89a.c @@ -105,9 +105,9 @@ static char *gif_filename = NULL; #define DEFAULT_FILE "out.gif" static const opt_t subopts[] = { - {"output", OPT_ARG_MSTRZ, &gif_filename, NULL, 0}, - {"fps", OPT_ARG_FLOAT, &target_fps, NULL, 0}, - {NULL, 0, NULL, NULL, 0} + {"output", OPT_ARG_MSTRZ, &gif_filename, NULL}, + {"fps", OPT_ARG_FLOAT, &target_fps, NULL}, + {NULL, 0, NULL, NULL} }; static int preinit(const char *arg) diff --git a/libvo/vo_gl.c b/libvo/vo_gl.c index 2a0edaab6d..93064cfe5e 100644 --- a/libvo/vo_gl.c +++ b/libvo/vo_gl.c @@ -765,6 +765,9 @@ static uint32_t get_image(mp_image_t *mpi) { return VO_FALSE; } if (mpi->flags & MP_IMGFLAG_READABLE) return VO_FALSE; + if (mpi->type != MP_IMGTYPE_STATIC && mpi->type != MP_IMGTYPE_TEMP && + (mpi->type != MP_IMGTYPE_NUMBERED || mpi->number)) + return VO_FALSE; if (mesa_buffer) mpi->width = texture_width; else if (ati_hack) { mpi->width = texture_width; diff --git a/libvo/vo_jpeg.c b/libvo/vo_jpeg.c index cd6a83a938..d29d7b0cd5 100644 --- a/libvo/vo_jpeg.c +++ b/libvo/vo_jpeg.c @@ -340,19 +340,19 @@ static int int_zero_hundred(int *val) static int preinit(const char *arg) { const opt_t subopts[] = { - {"progressive", OPT_ARG_BOOL, &jpeg_progressive_mode, NULL, 0}, - {"baseline", OPT_ARG_BOOL, &jpeg_baseline, NULL, 0}, + {"progressive", OPT_ARG_BOOL, &jpeg_progressive_mode, NULL}, + {"baseline", OPT_ARG_BOOL, &jpeg_baseline, NULL}, {"optimize", OPT_ARG_INT, &jpeg_optimize, - (opt_test_f)int_zero_hundred, 0}, + (opt_test_f)int_zero_hundred}, {"smooth", OPT_ARG_INT, &jpeg_smooth, - (opt_test_f)int_zero_hundred, 0}, + (opt_test_f)int_zero_hundred}, {"quality", OPT_ARG_INT, &jpeg_quality, - (opt_test_f)int_zero_hundred, 0}, - {"dpi", OPT_ARG_INT, &jpeg_dpi, NULL, 0}, - {"outdir", OPT_ARG_MSTRZ, &jpeg_outdir, NULL, 0}, - {"subdirs", OPT_ARG_MSTRZ, &jpeg_subdirs, NULL, 0}, - {"maxfiles", OPT_ARG_INT, &jpeg_maxfiles, (opt_test_f)int_pos, 0}, - {NULL, 0, NULL, NULL, 0} + (opt_test_f)int_zero_hundred}, + {"dpi", OPT_ARG_INT, &jpeg_dpi, NULL}, + {"outdir", OPT_ARG_MSTRZ, &jpeg_outdir, NULL}, + {"subdirs", OPT_ARG_MSTRZ, &jpeg_subdirs, NULL}, + {"maxfiles", OPT_ARG_INT, &jpeg_maxfiles, (opt_test_f)int_pos}, + {NULL, 0, NULL, NULL} }; const char *info_message = NULL; diff --git a/libvo/vo_kva.c b/libvo/vo_kva.c index 6b126ed592..fbd670e790 100644 --- a/libvo/vo_kva.c +++ b/libvo/vo_kva.c @@ -131,8 +131,8 @@ struct { PBYTE pbImage; BOOL fFixT23; PFNWP pfnwpOldFrame; - uint8_t *planes[3]; // y = 0, u = 1, v = 2 - int stride[3]; + uint8_t *planes[MP_MAX_PLANES]; // y = 0, u = 1, v = 2 + int stride[MP_MAX_PLANES]; BOOL fHWAccel; RECTL rclParent; struct SwsContext *sws; @@ -230,6 +230,8 @@ static void imgCreate(void) m_int.pbImage = malloc(size); + memset(m_int.planes, 0, sizeof(m_int.planes)); + memset(m_int.stride, 0, sizeof(m_int.stride)); m_int.planes[0] = m_int.pbImage; m_int.stride[0] = m_int.lStride; @@ -257,8 +259,8 @@ static void imgDisplay(void) ULONG ulBPL; if (!kvaLockBuffer(&pBuffer, &ulBPL)) { - uint8_t *dst[3]; - int dstStride[3]; + uint8_t *dst[MP_MAX_PLANES] = {NULL}; + int dstStride[MP_MAX_PLANES] = {0}; // Get packed or Y dst[0] = pBuffer; diff --git a/libvo/vo_md5sum.c b/libvo/vo_md5sum.c index c0996354e5..58fab4e1fd 100644 --- a/libvo/vo_md5sum.c +++ b/libvo/vo_md5sum.c @@ -108,8 +108,8 @@ static void md5sum_write_error(void) { static int preinit(const char *arg) { const opt_t subopts[] = { - {"outfile", OPT_ARG_MSTRZ, &md5sum_outfile, NULL, 0}, - {NULL, 0, NULL, NULL, 0} + {"outfile", OPT_ARG_MSTRZ, &md5sum_outfile, NULL}, + {NULL, 0, NULL, NULL} }; mp_msg(MSGT_VO, MSGL_INFO, "%s: %s\n", info.short_name, diff --git a/libvo/vo_png.c b/libvo/vo_png.c index 608a9a63c0..3163059b52 100644 --- a/libvo/vo_png.c +++ b/libvo/vo_png.c @@ -230,7 +230,7 @@ static int int_zero_to_nine(int *sh) } static const opt_t subopts[] = { - {"alpha", OPT_ARG_BOOL, &use_alpha, NULL, 0}, + {"alpha", OPT_ARG_BOOL, &use_alpha, NULL}, {"z", OPT_ARG_INT, &z_compression, (opt_test_f)int_zero_to_nine}, {NULL} }; diff --git a/libvo/vo_pnm.c b/libvo/vo_pnm.c index 2defb37ba5..9fe387608e 100644 --- a/libvo/vo_pnm.c +++ b/libvo/vo_pnm.c @@ -121,15 +121,15 @@ static int preinit(const char *arg) int ppm_type = 0, pgm_type = 0, pgmyuv_type = 0, raw_mode = 0, ascii_mode = 0; const opt_t subopts[] = { - {"ppm", OPT_ARG_BOOL, &ppm_type, NULL, 0}, - {"pgm", OPT_ARG_BOOL, &pgm_type, NULL, 0}, - {"pgmyuv", OPT_ARG_BOOL, &pgmyuv_type, NULL, 0}, - {"raw", OPT_ARG_BOOL, &raw_mode, NULL, 0}, - {"ascii", OPT_ARG_BOOL, &ascii_mode, NULL, 0}, - {"outdir", OPT_ARG_MSTRZ, &pnm_outdir, NULL, 0}, - {"subdirs", OPT_ARG_MSTRZ, &pnm_subdirs, NULL, 0}, - {"maxfiles", OPT_ARG_INT, &pnm_maxfiles, (opt_test_f)int_pos, 0}, - {NULL, 0, NULL, NULL, 0} + {"ppm", OPT_ARG_BOOL, &ppm_type, NULL}, + {"pgm", OPT_ARG_BOOL, &pgm_type, NULL}, + {"pgmyuv", OPT_ARG_BOOL, &pgmyuv_type, NULL}, + {"raw", OPT_ARG_BOOL, &raw_mode, NULL}, + {"ascii", OPT_ARG_BOOL, &ascii_mode, NULL}, + {"outdir", OPT_ARG_MSTRZ, &pnm_outdir, NULL}, + {"subdirs", OPT_ARG_MSTRZ, &pnm_subdirs, NULL}, + {"maxfiles", OPT_ARG_INT, &pnm_maxfiles, (opt_test_f)int_pos}, + {NULL, 0, NULL, NULL} }; const char *info_message = NULL; diff --git a/libvo/vo_sdl.c b/libvo/vo_sdl.c index d4c0e75041..9096350632 100644 --- a/libvo/vo_sdl.c +++ b/libvo/vo_sdl.c @@ -1527,10 +1527,10 @@ static int preinit(const char *arg) int sdl_hwaccel; int sdl_forcexv; const opt_t subopts[] = { - {"forcexv", OPT_ARG_BOOL, &sdl_forcexv, NULL, 0}, - {"hwaccel", OPT_ARG_BOOL, &sdl_hwaccel, NULL, 0}, - {"driver", OPT_ARG_MSTRZ, &sdl_driver, NULL, 0}, - {NULL, 0, NULL, NULL, 0} + {"forcexv", OPT_ARG_BOOL, &sdl_forcexv, NULL}, + {"hwaccel", OPT_ARG_BOOL, &sdl_hwaccel, NULL}, + {"driver", OPT_ARG_MSTRZ, &sdl_driver, NULL}, + {NULL, 0, NULL, NULL} }; sdl_forcexv = 1; diff --git a/libvo/vo_vdpau.c b/libvo/vo_vdpau.c index 085dfb4156..5d38306efb 100644 --- a/libvo/vo_vdpau.c +++ b/libvo/vo_vdpau.c @@ -147,14 +147,19 @@ static void *vdpau_lib_handle; /* output_surfaces[NUM_OUTPUT_SURFACES] is misused for OSD. */ #define osd_surface output_surfaces[NUM_OUTPUT_SURFACES] static VdpOutputSurface output_surfaces[NUM_OUTPUT_SURFACES + 1]; +static VdpVideoSurface deint_surfaces[3]; +static mp_image_t *deint_mpi[2]; static int output_surface_width, output_surface_height; static VdpVideoMixer video_mixer; static int deint; static int deint_type; +static int deint_counter; +static int deint_buffer_past_frames; static int pullup; static float denoise; static float sharpen; +static int chroma_deint; static int top_field_first; static VdpDecoder decoder; @@ -169,7 +174,8 @@ static int surface_num; static int vid_surface_num; static uint32_t vid_width, vid_height; static uint32_t image_format; -static const VdpChromaType vdp_chroma_type = VDP_CHROMA_TYPE_420; +static VdpChromaType vdp_chroma_type; +static VdpYCbCrFormat vdp_pixel_format; /* draw_osd */ static unsigned char *index_data; @@ -207,6 +213,13 @@ static int int_pause; static void draw_eosd(void); +static void push_deint_surface(VdpVideoSurface surface) +{ + deint_surfaces[2] = deint_surfaces[1]; + deint_surfaces[1] = deint_surfaces[0]; + deint_surfaces[0] = surface; +} + static void video_to_output_surface(void) { VdpTime dummy; @@ -215,8 +228,9 @@ static void video_to_output_surface(void) if (vid_surface_num < 0) return; - // we would need to provide 2 past and 1 future frames to allow advanced - // deinterlacing, which is not really possible currently. + if (deint < 2 || deint_surfaces[0] == VDP_INVALID_HANDLE) + push_deint_surface(surface_render[vid_surface_num].surface); + for (i = 0; i <= !!(deint > 1); i++) { int field = VDP_VIDEO_MIXER_PICTURE_STRUCTURE_FRAME; VdpOutputSurface output_surface; @@ -226,7 +240,7 @@ static void video_to_output_surface(void) flip_page(); } if (deint) - field = top_field_first == i ? + field = (top_field_first == i) ^ (deint > 1) ? VDP_VIDEO_MIXER_PICTURE_STRUCTURE_BOTTOM_FIELD: VDP_VIDEO_MIXER_PICTURE_STRUCTURE_TOP_FIELD; output_surface = output_surfaces[surface_num]; @@ -236,12 +250,14 @@ static void video_to_output_surface(void) CHECK_ST_WARNING("Error when calling vdp_presentation_queue_block_until_surface_idle") vdp_st = vdp_video_mixer_render(video_mixer, VDP_INVALID_HANDLE, 0, - field, 0, NULL, - surface_render[vid_surface_num].surface, - 0, NULL, &src_rect_vid, + field, 2, deint_surfaces + 1, + deint_surfaces[0], + 1, &surface_render[vid_surface_num].surface, + &src_rect_vid, output_surface, NULL, &out_rect_vid, 0, NULL); CHECK_ST_WARNING("Error when calling vdp_video_mixer_render") + push_deint_surface(surface_render[vid_surface_num].surface); } } @@ -359,6 +375,7 @@ static int win_x11_init_vdpau_procs(void) return -1; } + vdp_get_error_string = NULL; for (dsc = vdp_func; dsc->pointer; dsc++) { vdp_st = vdp_get_proc_address(vdp_device, dsc->id, dsc->pointer); if (vdp_st != VDP_STATUS_OK) { @@ -397,6 +414,9 @@ static int create_vdp_mixer(VdpChromaType vdp_chroma_type) { const void * const denoise_value[] = {&denoise}; static const VdpVideoMixerAttribute sharpen_attrib[] = {VDP_VIDEO_MIXER_ATTRIBUTE_SHARPNESS_LEVEL}; const void * const sharpen_value[] = {&sharpen}; + static const VdpVideoMixerAttribute skip_chroma_attrib[] = {VDP_VIDEO_MIXER_ATTRIBUTE_SKIP_CHROMA_DEINTERLACE}; + const uint8_t skip_chroma_value = 1; + const void * const skip_chroma_value_ptr[] = {&skip_chroma_value}; static const VdpVideoMixerParameter parameters[VDP_NUM_MIXER_PARAMETER] = { VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_WIDTH, VDP_VIDEO_MIXER_PARAMETER_VIDEO_SURFACE_HEIGHT, @@ -407,8 +427,7 @@ static int create_vdp_mixer(VdpChromaType vdp_chroma_type) { &vid_height, &vdp_chroma_type }; - if (deint == 3) - features[feature_count++] = VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL; + features[feature_count++] = VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL; if (deint == 4) features[feature_count++] = VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL_SPATIAL; if (pullup) @@ -425,12 +444,16 @@ static int create_vdp_mixer(VdpChromaType vdp_chroma_type) { CHECK_ST_ERROR("Error when calling vdp_video_mixer_create") for (i = 0; i < feature_count; i++) feature_enables[i] = VDP_TRUE; + if (deint < 3) + feature_enables[0] = VDP_FALSE; 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); + if (!chroma_deint) + vdp_video_mixer_set_attribute_values(video_mixer, 1, skip_chroma_attrib, skip_chroma_value_ptr); return 0; } @@ -445,6 +468,15 @@ static void free_video_specific(void) { decoder = VDP_INVALID_HANDLE; decoder_max_refs = -1; + for (i = 0; i < 3; i++) + deint_surfaces[i] = VDP_INVALID_HANDLE; + + for (i = 0; i < 2; i++) + if (deint_mpi[i]) { + deint_mpi[i]->usage_count--; + deint_mpi[i] = NULL; + } + for (i = 0; i < MAX_VIDEO_SURFACES; i++) { if (surface_render[i].surface != VDP_INVALID_HANDLE) { vdp_st = vdp_video_surface_destroy(surface_render[i].surface); @@ -460,6 +492,42 @@ static void free_video_specific(void) { video_mixer = VDP_INVALID_HANDLE; } +static int create_vdp_decoder(int max_refs) +{ + VdpStatus vdp_st; + VdpDecoderProfile vdp_decoder_profile; + if (decoder != VDP_INVALID_HANDLE) + vdp_decoder_destroy(decoder); + switch (image_format) { + case IMGFMT_VDPAU_MPEG1: + vdp_decoder_profile = VDP_DECODER_PROFILE_MPEG1; + break; + case IMGFMT_VDPAU_MPEG2: + vdp_decoder_profile = VDP_DECODER_PROFILE_MPEG2_MAIN; + break; + case IMGFMT_VDPAU_H264: + vdp_decoder_profile = VDP_DECODER_PROFILE_H264_HIGH; + mp_msg(MSGT_VO, MSGL_V, "[vdpau] Creating H264 hardware decoder for %d reference frames.\n", max_refs); + break; + case IMGFMT_VDPAU_WMV3: + vdp_decoder_profile = VDP_DECODER_PROFILE_VC1_MAIN; + break; + case IMGFMT_VDPAU_VC1: + vdp_decoder_profile = VDP_DECODER_PROFILE_VC1_ADVANCED; + break; + } + vdp_st = vdp_decoder_create(vdp_device, vdp_decoder_profile, + vid_width, vid_height, max_refs, &decoder); + CHECK_ST_WARNING("Failed creating VDPAU decoder"); + if (vdp_st != VDP_STATUS_OK) { + decoder = VDP_INVALID_HANDLE; + decoder_max_refs = 0; + return 0; + } + decoder_max_refs = max_refs; + return 1; +} + /* * connect to X server, create and map window, initialize all * VDPAU objects, create different surfaces etc. @@ -479,6 +547,11 @@ static int config(uint32_t width, uint32_t height, uint32_t d_width, #endif image_format = format; + vid_width = width; + vid_height = height; + free_video_specific(); + if (IMGFMT_IS_VDPAU(image_format) && !create_vdp_decoder(2)) + return -1; int_pause = 0; visible_buf = 0; @@ -524,16 +597,27 @@ static int config(uint32_t width, uint32_t height, uint32_t d_width, vo_fs = 1; /* -----VDPAU related code here -------- */ - - free_video_specific(); - if (vdp_flip_queue == VDP_INVALID_HANDLE && win_x11_init_vdpau_flip_queue()) return -1; - // video width and height - vid_width = width; - vid_height = height; - + vdp_chroma_type = VDP_CHROMA_TYPE_420; + switch (image_format) { + case IMGFMT_YV12: + case IMGFMT_I420: + case IMGFMT_IYUV: + vdp_pixel_format = VDP_YCBCR_FORMAT_YV12; + break; + case IMGFMT_NV12: + vdp_pixel_format = VDP_YCBCR_FORMAT_NV12; + break; + case IMGFMT_YUY2: + vdp_pixel_format = VDP_YCBCR_FORMAT_YUYV; + vdp_chroma_type = VDP_CHROMA_TYPE_422; + break; + case IMGFMT_UYVY: + vdp_pixel_format = VDP_YCBCR_FORMAT_UYVY; + vdp_chroma_type = VDP_CHROMA_TYPE_422; + } if (create_vdp_mixer(vdp_chroma_type)) return -1; @@ -772,38 +856,10 @@ static int draw_slice(uint8_t *image[], int stride[], int w, int h, int max_refs = image_format == IMGFMT_VDPAU_H264 ? rndr->info.h264.num_ref_frames : 2; if (!IMGFMT_IS_VDPAU(image_format)) return VO_FALSE; - if (decoder == VDP_INVALID_HANDLE || decoder_max_refs < max_refs) { - VdpDecoderProfile vdp_decoder_profile; - if (decoder != VDP_INVALID_HANDLE) - vdp_decoder_destroy(decoder); - decoder = VDP_INVALID_HANDLE; - switch (image_format) { - case IMGFMT_VDPAU_MPEG1: - vdp_decoder_profile = VDP_DECODER_PROFILE_MPEG1; - break; - case IMGFMT_VDPAU_MPEG2: - vdp_decoder_profile = VDP_DECODER_PROFILE_MPEG2_MAIN; - break; - case IMGFMT_VDPAU_H264: - vdp_decoder_profile = VDP_DECODER_PROFILE_H264_HIGH; - mp_msg(MSGT_VO, MSGL_V, "[vdpau] Creating H264 hardware decoder for %d reference frames.\n", max_refs); - break; - case IMGFMT_VDPAU_WMV3: - vdp_decoder_profile = VDP_DECODER_PROFILE_VC1_MAIN; - break; - case IMGFMT_VDPAU_VC1: - vdp_decoder_profile = VDP_DECODER_PROFILE_VC1_ADVANCED; - break; - } - vdp_st = vdp_decoder_create(vdp_device, vdp_decoder_profile, vid_width, vid_height, max_refs, &decoder); - CHECK_ST_WARNING("Failed creating VDPAU decoder"); - if (vdp_st != VDP_STATUS_OK) { - decoder = VDP_INVALID_HANDLE; - decoder_max_refs = 0; - return VO_FALSE; - } - decoder_max_refs = max_refs; - } + if ((decoder == VDP_INVALID_HANDLE || decoder_max_refs < max_refs) + && !create_vdp_decoder(max_refs)) + return VO_FALSE; + vdp_st = vdp_decoder_render(decoder, rndr->surface, (void *)&rndr->info, rndr->bitstream_buffers_used, rndr->bitstream_buffers); CHECK_ST_WARNING("Failed VDPAU decoder rendering"); return VO_TRUE; @@ -837,18 +893,31 @@ static uint32_t draw_image(mp_image_t *mpi) if (IMGFMT_IS_VDPAU(image_format)) { struct vdpau_render_state *rndr = mpi->priv; vid_surface_num = rndr - surface_render; + if (deint_buffer_past_frames) { + mpi->usage_count++; + if (deint_mpi[1]) + deint_mpi[1]->usage_count--; + deint_mpi[1] = deint_mpi[0]; + deint_mpi[0] = mpi; + } } else if (!(mpi->flags & MP_IMGFLAG_DRAW_CALLBACK)) { VdpStatus vdp_st; void *destdata[3] = {mpi->planes[0], mpi->planes[2], mpi->planes[1]}; - struct vdpau_render_state *rndr = get_surface(0); + struct vdpau_render_state *rndr = get_surface(deint_counter); + deint_counter = (deint_counter + 1) % 3; vid_surface_num = rndr - surface_render; + if (image_format == IMGFMT_NV12) + destdata[1] = destdata[2]; vdp_st = vdp_video_surface_put_bits_y_cb_cr(rndr->surface, - VDP_YCBCR_FORMAT_YV12, + vdp_pixel_format, (const void *const*)destdata, mpi->stride); // pitch CHECK_ST_ERROR("Error when calling vdp_video_surface_put_bits_y_cb_cr") } - top_field_first = !!(mpi->fields & MP_IMGFIELD_TOP_FIRST); + if (mpi->fields & MP_IMGFIELD_ORDERED) + top_field_first = !!(mpi->fields & MP_IMGFIELD_TOP_FIRST); + else + top_field_first = 1; video_to_output_surface(); return VO_TRUE; @@ -883,6 +952,11 @@ static int query_format(uint32_t format) int default_flags = VFCAP_CSP_SUPPORTED | VFCAP_CSP_SUPPORTED_BY_HW | VFCAP_HWSCALE_UP | VFCAP_HWSCALE_DOWN | VFCAP_OSD | VFCAP_EOSD | VFCAP_EOSD_UNSCALED; switch (format) { case IMGFMT_YV12: + case IMGFMT_I420: + case IMGFMT_IYUV: + case IMGFMT_NV12: + case IMGFMT_YUY2: + case IMGFMT_UYVY: return default_flags | VOCAP_NOSLICES; case IMGFMT_VDPAU_MPEG1: case IMGFMT_VDPAU_MPEG2: @@ -952,6 +1026,7 @@ static void uninit(void) static const opt_t subopts[] = { {"deint", OPT_ARG_INT, &deint, (opt_test_f)int_non_neg}, + {"chroma-deint", OPT_ARG_BOOL, &chroma_deint, NULL}, {"pullup", OPT_ARG_BOOL, &pullup, NULL}, {"denoise", OPT_ARG_FLOAT, &denoise, NULL}, {"sharpen", OPT_ARG_FLOAT, &sharpen, NULL}, @@ -965,11 +1040,14 @@ static const char help_msg[] = " deint (all modes > 0 respect -field-dominance)\n" " 0: no deinterlacing\n" " 1: only show first field\n" - " 2: bob deinterlacing (current fallback)\n" - " 3: temporal deinterlacing (not yet working)\n" - " 4: temporal-spatial deinterlacing (not yet working)\n" + " 2: bob deinterlacing\n" + " 3: temporal deinterlacing (resource-hungry)\n" + " 4: temporal-spatial deinterlacing (very resource-hungry)\n" + " chroma-deint\n" + " Operate on luma and chroma when using temporal deinterlacing (default)\n" + " Use nochroma-deint to speed up temporal deinterlacing\n" " pullup\n" - " Try to apply inverse-telecine (needs deinterlacing, not working)\n" + " Try to apply inverse-telecine (needs temporal deinterlacing)\n" " denoise\n" " Apply denoising, argument is strength from 0.0 to 1.0\n" " sharpen\n" @@ -984,6 +1062,10 @@ static int preinit(const char *arg) deint = 0; deint_type = 3; + deint_counter = 0; + deint_buffer_past_frames = 0; + deint_mpi[0] = deint_mpi[1] = NULL; + chroma_deint = 1; pullup = 0; denoise = 0; sharpen = 0; @@ -993,6 +1075,8 @@ static int preinit(const char *arg) } if (deint) deint_type = deint; + if (deint > 1) + deint_buffer_past_frames = 1; vdpau_lib_handle = dlopen(vdpaulibrary, RTLD_LAZY); if (!vdpau_lib_handle) { @@ -1087,6 +1171,19 @@ static int control(uint32_t request, void *data) deint = *(int*)data; if (deint) deint = deint_type; + if (deint_type > 2) { + VdpStatus vdp_st; + VdpVideoMixerFeature features[1] = + {deint_type == 3 ? + VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL : + VDP_VIDEO_MIXER_FEATURE_DEINTERLACE_TEMPORAL_SPATIAL}; + VdpBool feature_enables[1] = {deint ? VDP_TRUE : VDP_FALSE}; + vdp_st = vdp_video_mixer_set_feature_enables(video_mixer, 1, + features, + feature_enables); + CHECK_ST_WARNING("Error changing deinterlacing settings") + deint_buffer_past_frames = 1; + } return VO_TRUE; case VOCTRL_PAUSE: return (int_pause = 1); diff --git a/libvo/vo_vesa.c b/libvo/vo_vesa.c index 8b9e05a731..63342435f3 100644 --- a/libvo/vo_vesa.c +++ b/libvo/vo_vesa.c @@ -283,8 +283,8 @@ static void vbeCopyData(uint8_t *image) static int draw_slice(uint8_t *image[], int stride[], int w,int h,int x,int y) { int dstride=HAS_DGA()?video_mode_info.XResolution:dstW; - uint8_t *dst[3]= {dga_buffer, NULL, NULL}; - int dstStride[3]; + uint8_t *dst[MP_MAX_PLANES]={dga_buffer}; + int dstStride[MP_MAX_PLANES]={0}; if( mp_msg_test(MSGT_VO,MSGL_DBG3) ) mp_msg(MSGT_VO,MSGL_DBG3, "vo_vesa: draw_slice was called: w=%u h=%u x=%u y=%u\n",w,h,x,y); dstStride[0]=dstride*((dstBpp+7)/8); @@ -423,8 +423,8 @@ static int draw_frame(uint8_t *src[]) { int dstride=HAS_DGA()?video_mode_info.XResolution:dstW; int srcStride[1]; - uint8_t *dst[3]= {dga_buffer, NULL, NULL}; - int dstStride[3]; + uint8_t *dst[MP_MAX_PLANES]={dga_buffer}; + int dstStride[MP_MAX_PLANES]={0}; dstStride[0]=dstride*((dstBpp+7)/8); dstStride[1]= dstStride[2]=dstStride[0]>>1; diff --git a/libvo/vo_x11.c b/libvo/vo_x11.c index 4e6b1b79fb..91d4d96269 100644 --- a/libvo/vo_x11.c +++ b/libvo/vo_x11.c @@ -523,8 +523,8 @@ static void flip_page(void) static int draw_slice(uint8_t * src[], int stride[], int w, int h, int x, int y) { - uint8_t *dst[3]; - int dstStride[3]; + uint8_t *dst[MP_MAX_PLANES] = {NULL}; + int dstStride[MP_MAX_PLANES] = {0}; if ((old_vo_dwidth != vo_dwidth || old_vo_dheight != vo_dheight) /*&& y==0 */ && zoomFlag) @@ -557,8 +557,6 @@ static int draw_slice(uint8_t * src[], int stride[], int w, int h, } dst_width = newW; } - dstStride[1] = dstStride[2] = 0; - dst[1] = dst[2] = NULL; dstStride[0] = image_width * ((bpp + 7) / 8); dst[0] = ImageData; diff --git a/libvo/vo_xvmc.c b/libvo/vo_xvmc.c index 696fc682ba..aad00de687 100644 --- a/libvo/vo_xvmc.c +++ b/libvo/vo_xvmc.c @@ -63,7 +63,7 @@ #define UNUSED(x) ((void)(x)) #if LIBAVCODEC_BUILD < ((51<<16)+(40<<8)+2) -#error You need at least libavcodecs v51.40.2 +#error You need at least libavcodec v51.40.2 #endif @@ -226,7 +226,7 @@ return -1;//fail //print all info needed to add new format static void print_xvimage_format_values(XvImageFormatValues *xifv){ int i; - const msgl=MSGL_DBG4; + const int msgl=MSGL_DBG4; mp_msg(MSGT_VO,msgl,"Format_ID = 0x%X\n",xifv->id); diff --git a/libvo/vo_zr2.c b/libvo/vo_zr2.c index d3fe6604de..f15494bc37 100644 --- a/libvo/vo_zr2.c +++ b/libvo/vo_zr2.c @@ -210,10 +210,10 @@ static int preinit(const char *arg) { char *dev_arg = NULL, *norm_arg = NULL; int norm = VIDEO_MODE_AUTO, prebuf = 0; const opt_t subopts[] = { /* don't want warnings with -Wall... */ - { "dev", OPT_ARG_MSTRZ, &dev_arg, NULL, 0 }, - { "prebuf", OPT_ARG_BOOL, &prebuf, (opt_test_f)pbc, 0 }, - { "norm", OPT_ARG_MSTRZ, &norm_arg, (opt_test_f)nc, 0 }, - { NULL, 0, NULL, NULL, 0 } + { "dev", OPT_ARG_MSTRZ, &dev_arg, NULL }, + { "prebuf", OPT_ARG_BOOL, &prebuf, (opt_test_f)pbc }, + { "norm", OPT_ARG_MSTRZ, &norm_arg, (opt_test_f)nc }, + { NULL, 0, NULL, NULL } }; VERBOSE("preinit() called with arg: %s\n", arg); diff --git a/libvo/w32_common.c b/libvo/w32_common.c index a23ec8ea42..7052e3457a 100644 --- a/libvo/w32_common.c +++ b/libvo/w32_common.c @@ -38,7 +38,7 @@ extern int enable_mouse_movements; #define MONITOR_DEFAULTTOPRIMARY 1 #endif -static const char classname[] = "MPlayer - Media player for Win32"; +static const char classname[] = "MPlayer - The Movie Player"; int vo_vm = 0; static int depthonscreen; diff --git a/loader/win32.c b/loader/win32.c index 2ee9f1ea7e..3aded84674 100644 --- a/loader/win32.c +++ b/loader/win32.c @@ -63,6 +63,8 @@ for DLL to know too much about its environment. #include <sys/types.h> #include <dirent.h> #include <sys/time.h> +#include <sys/stat.h> +#include <sys/timeb.h> #ifdef HAVE_KSTAT #include <kstat.h> #endif @@ -3519,7 +3521,7 @@ static HANDLE WINAPI expCreateFileA(LPCSTR cs1,DWORD i1,DWORD i2, free(tmp); return result; } - if (strstr(cs1, "vp3")) + if (strstr(cs1, "vp3") || strstr(cs1, ".fpf")) { int r; int flg = 0; @@ -3537,10 +3539,10 @@ static HANDLE WINAPI expCreateFileA(LPCSTR cs1,DWORD i1,DWORD i2, flg |= O_RDONLY; else if (GENERIC_WRITE & i1) { - flg |= O_WRONLY; + flg |= O_WRONLY | O_CREAT; printf("Warning: openning filename %s %d (flags; 0x%x) for write\n", tmp, r, flg); } - r=open(tmp, flg); + r=open(tmp, flg, S_IRWXU); free(tmp); return r; } diff --git a/mencoder.c b/mencoder.c index 1661722679..14c7793079 100644 --- a/mencoder.c +++ b/mencoder.c @@ -700,6 +700,8 @@ vo_spudec=spudec_new_scaled(stream->type==STREAMTYPE_DVD?((dvd_priv_t *)(stream- sh_video->disp_w, sh_video->disp_h, NULL, 0); } #endif +if (vo_spudec) + spudec_set_forced_subs_only(vo_spudec, forced_subs_only); } ostream = open_output_stream(out_filename, 0); @@ -1098,8 +1098,10 @@ void init_vo_spudec(struct MPContext *mpctx) spudec_set_font_factor(vo_spudec,font_factor); } - if (vo_spudec!=NULL) + if (vo_spudec!=NULL) { mpctx->initialized_flags|=INITIALIZED_SPUDEC; + mp_property_do("sub_forced_only", M_PROPERTY_SET, &forced_subs_only, mpctx); + } } /* @@ -3104,6 +3106,7 @@ if (edl_output_filename) { if(vo_vobsub){ mpctx->initialized_flags|=INITIALIZED_VOBSUB; vobsub_set_from_lang(vo_vobsub, dvdsub_lang); + mp_property_do("sub_forced_only", M_PROPERTY_SET, &forced_subs_only, mpctx); // setup global sub numbering mpctx->global_sub_indices[SUB_SOURCE_VOBSUB] = mpctx->global_sub_size; // the global # of the first vobsub. @@ -70,7 +70,7 @@ typedef struct MPOpts { int use_lirc; int use_lircc; int use_ar; // apple remote - int default_binds; + int default_bindings; } input; } MPOpts; diff --git a/osdep/getch2-os2.c b/osdep/getch2-os2.c index 0b6e84683e..4ecfacd5cd 100644 --- a/osdep/getch2-os2.c +++ b/osdep/getch2-os2.c @@ -1,5 +1,5 @@ /* - * getch2-os2.c : OS/2 TermIO for MPlayer + * OS/2 TermIO * * Copyright (c) 2007 KO Myung-Hun (komh@chollian.net) * diff --git a/stream/asf_streaming.c b/stream/asf_streaming.c index 73cff872b5..a9825cf20f 100644 --- a/stream/asf_streaming.c +++ b/stream/asf_streaming.c @@ -85,7 +85,8 @@ static int asf_streaming_start( stream_t *stream, int *demuxer_type) { //Is protocol http, http_proxy, or mms? if (!strcasecmp(proto, "http_proxy") || !strcasecmp(proto, "http") || - !strcasecmp(proto, "mms") || !strcasecmp(proto, "mmshttp")) + !strcasecmp(proto, "mms") || !strcasecmp(proto, "mmsh") || + !strcasecmp(proto, "mmshttp")) { mp_msg(MSGT_NETWORK,MSGL_V,"Trying ASF/HTTP...\n"); fd = asf_http_streaming_start( stream, demuxer_type ); @@ -146,7 +147,7 @@ printf("0x%02X\n", stream_chunck->type ); } static void close_s(stream_t *stream) { - close(stream->fd); + closesocket(stream->fd); stream->fd=-1; } @@ -847,7 +848,7 @@ const stream_info_t stream_info_asf = { "Bertrand, Reimar Doeffinger, Albeu", "originally based on work by Majormms (is that code still there?)", open_s, - {"mms", "mmsu", "mmst", "http", "http_proxy", "mmshttp", NULL}, + {"mms", "mmsu", "mmst", "http", "http_proxy", "mmsh", "mmshttp", NULL}, NULL, 0 // Urls are an option string }; diff --git a/stream/stream_dvd.c b/stream/stream_dvd.c index 05f9c411ab..2f00b083ae 100644 --- a/stream/stream_dvd.c +++ b/stream/stream_dvd.c @@ -1097,9 +1097,9 @@ static int ifo_stream_open (stream_t *stream, int mode, void *opts, int *file_fo char *ext; char* filename; struct stream_priv_s *spriv; + int len = strlen(stream->url); - ext = strrchr (stream->url, '.'); - if (!ext || strcasecmp (ext + 1, "ifo")) + if (len < 4 || strcasecmp (stream->url + len - 4, ".ifo")) return STREAM_UNSUPPORTED; mp_msg(MSGT_DVD, MSGL_INFO, ".IFO detected. Redirecting to dvd://\n"); diff --git a/stream/tv.c b/stream/tv.c index 641737a9f1..53d1adb2c5 100644 --- a/stream/tv.c +++ b/stream/tv.c @@ -439,6 +439,12 @@ static int open_tv(tvi_handle_t *tvh) #endif /* limits on w&h are norm-dependent -- JM */ + if (tvh->tv_param->width != -1 && tvh->tv_param->height != -1) { + // first tell the driver both width and height, some drivers do not support setting them independently. + int dim[2]; + dim[0] = tvh->tv_param->width; dim[1] = tvh->tv_param->height; + funcs->control(tvh->priv, TVI_CONTROL_VID_SET_WIDTH_HEIGHT, dim); + } /* set width */ if (tvh->tv_param->width != -1) { diff --git a/stream/tv.h b/stream/tv.h index 37c63b7a89..c7ffae032c 100644 --- a/stream/tv.h +++ b/stream/tv.h @@ -175,6 +175,7 @@ typedef struct { #define TVI_CONTROL_VID_SET_PICTURE 0x11e #define TVI_CONTROL_VID_SET_GAIN 0x11f #define TVI_CONTROL_VID_GET_GAIN 0x120 +#define TVI_CONTROL_VID_SET_WIDTH_HEIGHT 0x121 /* TUNER controls */ #define TVI_CONTROL_TUN_GET_FREQ 0x201 diff --git a/stream/tvi_v4l2.c b/stream/tvi_v4l2.c index 0742135740..c890d7a51e 100644 --- a/stream/tvi_v4l2.c +++ b/stream/tvi_v4l2.c @@ -780,6 +780,14 @@ static int control(priv_t *priv, int cmd, void *arg) return TVI_CONTROL_TRUE; case TVI_CONTROL_VID_CHK_WIDTH: return TVI_CONTROL_TRUE; + case TVI_CONTROL_VID_SET_WIDTH_HEIGHT: + if (getfmt(priv) < 0) return TVI_CONTROL_FALSE; + priv->format.fmt.pix.width = ((int *)arg)[0]; + priv->format.fmt.pix.height = ((int *)arg)[1]; + priv->format.fmt.pix.field = V4L2_FIELD_ANY; + if (ioctl(priv->video_fd, VIDIOC_S_FMT, &priv->format) < 0) + return TVI_CONTROL_FALSE; + return TVI_CONTROL_TRUE; case TVI_CONTROL_VID_SET_WIDTH: if (getfmt(priv) < 0) return TVI_CONTROL_FALSE; priv->format.fmt.pix.width = *(int *)arg; @@ -1126,7 +1134,7 @@ static int uninit(priv_t *priv) struct v4l2_buffer buf; /* get performance */ - frames = 1 + lrintf((double)(priv->curr_frame - priv->first_frame) / (1e6 * getfps(priv))); + frames = 1 + lrintf((double)(priv->curr_frame - priv->first_frame) / 1e6 * getfps(priv)); dropped = frames - priv->frames; /* turn off streaming */ @@ -1,5 +1,5 @@ /* - * sub_cc.c - Decoder for Closed Captions + * decoder for Closed Captions * * This decoder relies on MPlayer's OSD to display subtitles. * Be warned that the decoding is somewhat preliminary, though it basically works. @@ -130,7 +130,7 @@ static void append_char(char c) { if(cursor_pos==CC_MAX_LINE_LENGTH-1) { - fprintf(stderr,"sub_cc.c: append_char() reached CC_MAX_LINE_LENGTH!\n"); + fprintf(stderr,"CC: append_char() reached CC_MAX_LINE_LENGTH!\n"); return; } bb->text[bb->lines - 1][cursor_pos++]=c; |