diff --git a/Changelog b/Changelog index 75d6f927c8..7ced40d04e 100644 --- a/Changelog +++ b/Changelog @@ -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 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 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 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 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 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 .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 Ha léptetést kell végezni az aktuális pozícióból a cache méretének -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 (csak CDDA) @@ -1304,7 +1304,7 @@ Lej 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 .TP .B \-dvd\-device (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 .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 @@ -1510,7 +1510,7 @@ Hasznos hib .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 .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 .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 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 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). +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 .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= @@ -3943,7 +3967,7 @@ Ez a vez .RSs .IPs 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 .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 kimeneti fájl neve (alapértelmezett: ./grab.mpg). @@ -4643,7 +4667,7 @@ A -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 .PD 0 .RSs .IPs -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 kvantálási paraméter (QP) változtató szűrő .RSs .IPs -valamilyen egyenlet, pl. "2+2*sin(PI*qp)" +valamilyen egyenlet, pl.\& "2+2*sin(PI*qp)" .RE . .TP @@ -7954,7 +7978,7 @@ maxim .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 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 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 .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 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 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 .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 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 .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 . .TP .B compdata= -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 .\" 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, .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 +.IPs chroma\-deint +đĎÚ×ĎĚŃĹÔ ×ŇĹÍĹÎÎŮÍ ÄĹÉÎÔĹŇĚĹĘÓĹŇÁÍ ĎĐĹŇÉŇĎ×ÁÔŘ ËÁË ŃŇËĎÓÔÎĎĘ, ÔÁË +É Ă×ĹÔÎĎÓÔÎĎĘ ËĎÍĐĎÎĹÎÔÁÍÉ (ĐĎ ŐÍĎĚŢÁÎÉŔ). +éÓĐĎĚŘÚŐĘÔĹ nochroma\-deint ÄĚŃ ĎĐĹŇÉŇĎ×ÁÎÉŃ ÔĎĚŘËĎ Ă×ĹÔÎĎÓÔÎĎĘ +ËĎÍĐĎÎĹÎÔĎĘ É ŐÓËĎŇĹÎÉŃ ŐÓĎ×ĹŇŰĹÎÓÔ×Ď×ÁÎÎĎÇĎ ÄĹÉÎÔĹŇĚĹĘÓÉÎÇÁ. +đĎĚĹÚÎĎ Ó ÍĹÄĚĹÎÎĎĘ ×ÉÄĹĎ ĐÁÍŃÔŘŔ. .IPs pullup đŇĎÂŐĹÔ ĐŇÉÍĹÎÉÔŘ ĎÂŇÁÔÎŮĘ ÔĹĚĹÓÉÎ, ÎŐÖÄÁĹÔÓŃ ×Ď ×ŇĹÍĹÎÎĎÍ ÄĹÉÎÔĹŇĚĹĘÓÉÎÇĹ. @@ -3583,6 +3593,24 @@ 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 Ó, @@ -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 - for + for libavcodec, 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 capture.avi -mc 0 -oac lavc -ovc lavc -lavcopts \ vcodec=mpeg2video:vbitrate=6000:ilme:ildct:acodec=mp2:abitrate=224 -Note the and options. +Note the and options. @@ -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. - + 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. - + 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). - + 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 destination_sound.wav 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 MEncoder currently cannot +Please note that MEncoder 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. -Probably the easiest way to get started with Matroska is to use +Probably the easiest way to get started with Matroska is to use MMG, the graphical frontend shipped with mkvtoolnix, and follow the guide to mkvmerge GUI (mmg) @@ -2240,7 +2240,7 @@ will be 24000/1001 frames per second. accurate method available for encoding both telecine and "mixed progressive and telecine". -mencoder dvd://1 -oac copy -vf pullup,softskip +mencoder dvd://1 -oac copy -vf pullup,softskip -ovc lavc -ofps 24000/1001 @@ -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. 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 () is a reasonable tradeoff between speed and quality. 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. - + deblock: @@ -4551,17 +4551,17 @@ and other options. This is known to work on x86 on both *NIX and Windows. First you must build the vfw2menc program. -It is located in the TOOLS subdirectory +It is located in the TOOLS subdirectory of the MPlayer source tree. To build on Linux, this can be done using Wine: winegcc vfw2menc.c -o vfw2menc -lwinmm -lole32 -To build on Windows in MinGW or +To build on Windows in MinGW or Cygwin use: gcc vfw2menc.c -o vfw2menc.exe -lwinmm -lole32 To build on MSVC you will need getopt. -Getopt can be found in the original vfw2menc +Getopt can be found in the original vfw2menc archive available at: The MPlayer on win32 project. @@ -4571,13 +4571,13 @@ Below is an example with the VP6 codec. vfw2menc -f VP62 -d vp6vfw.dll -s firstpass.mcf -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 . -Windows users can use +Windows users can use to have the codec dialog display before encoding starts. @@ -4882,11 +4882,11 @@ mp4creator -optimize narnia.mp4 If you want to add tags to your video that show up in iTunes, you can use AtomicParsley. - + AtomicParsley narnia.mp4 --metaEnema --title "The Chronicles of Narnia" --year 2005 --stik Movie --freefree --overWrite The option removes any existing metadata - (mp4creator inserts its name in the + (mp4creator inserts its name in the "encoding tool" tag), and reclaims the space from the deleted metadata. The option sets the type of video (such as Movie @@ -4954,7 +4954,7 @@ compliant. NTSC DVD - 720x480, 704x480, 352x480, 352x240 + 720x480, 704x480, 352x480, 352x240 MPEG-2 9800 kbps 48000 Hz @@ -4967,7 +4967,7 @@ compliant. NTSC DVD 352x240 These resolutions are rarely used for DVDs because - they are fairly low quality. + they are fairly low quality. MPEG-1 1856 kbps 48000 Hz @@ -5062,7 +5062,7 @@ highly bitrate-starved and require effort to obtain acceptable quality. GOP Size Constraints -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. 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): DVD with NTSC Pullup: -of mpeg -mpegopts format=dvd:tsaf:telecine -ofps 24000/1001 -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. @@ -5191,7 +5191,7 @@ or in the manual page. 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 and +This is achieved using the option and the audio filter together. @@ -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 of 25 should never cause any problems. 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://frame001.jpg,frame002.jpg -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): -mencoder mf://@list.txt -mf w=800:h=600:fps=25:type=jpg \ +mencoder mf://@list.txt -mf w=800:h=600:fps=25:type=jpg \ -ovc lavc -lavcopts vcodec=mpeg4:mbd=2:trell -oac copy -o output.avi 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: Choose some sane image dimensions. The dimensions of the resulting image should be divisible by 16. - + 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, MEncoder can survive an overload for few seconds but nothing more. It's better to turn off the 3D OpenGL screensavers and similar stuff. - + Don't mess with the system clock. MEncoder 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: linux/Documentation/sound/btaudio file (in the kernel tree, not MPlayer's) for some instructions on using this driver. - + If MEncoder 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: C - Cycle through teletext rendering modes (opaque, transparent, inverted opaque, + Cycle through teletext rendering modes (opaque, transparent, inverted opaque, inverted transparent 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. MPEG audio Passthrough -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. -MPlayer 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. +MPlayer can be configured to relay the audio data without decoding it. 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. MPlayer supports hardware accelerated playback with the Creative DXR2 card. - + 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. 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 MPlayer egy Linuxon mĹąkĂśdő videolejĂĄtszĂł (fut szĂĄmos mĂĄs Unix-on ĂŠs nem-x86 processzorokon is, lĂĄsd ). 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 MPlayer 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 MPlayer 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 DVB ĂŠs DXR3/Hollywood+ 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 @@ - + KĂłdolĂĄs a <application>MEncoder</application>rel @@ -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. - + 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). - + 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. -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: @@ -2364,7 +2364,7 @@ Az időtartam/hely alapjĂĄn kell dĂśntened. - A kĂłdolĂĄsi paramĂŠterekről ĂŠs a minősĂŠgről: + A kĂłdolĂĄsi paramĂŠterekről ĂŠs a minősĂŠgről: Csak mert itt javasoltam az -t, nem jelenti azt, hogy mĂĄshol ne lehetne hasznĂĄlni. A -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. - + @@ -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 -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. - + deblock: @@ -4255,7 +4255,7 @@ elĂŠrt bitrĂĄta kĂźlĂśnbsĂŠgből adĂłdik. Ez mĂŠg 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 kapcsolĂłval. A -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. jp2avi.dll ImagePower MJPEG2000 (IPJ2) d860a11766da0d0ea064672c6833768b - + m3jp2k32.dll @@ -4845,7 +4845,7 @@ mp4creator -optimize narnia.mp4 Ha tag-eket akarsz hozzĂĄfĹązni a videĂłdhoz, amiket az iTunes megjelnĂ­t, hasznĂĄlhatod az AtomicParsley-t. - + AtomicParsley narnia.mp4 --metaEnema --title "The Chronicles of Narnia" --year 2005 --stik Movie --freefree --overWrite A opciĂł eltĂĄvolĂ­t minden meglĂŠvő metadata-t @@ -4879,7 +4879,7 @@ mp4creator -optimize narnia.mp4 A MEncoder kĂŠpes VCD, SCVD ĂŠs DVD formĂĄtumĂş MPEG fĂĄjlok lĂŠtrehozĂĄsĂĄra a libavcodec kĂśnyvtĂĄr segĂ­tsĂŠgĂŠvel. -Ezek a fĂĄjlok a +Ezek a fĂĄjlok a vcdimager-rel vagy a dvdauthor-ral @@ -4918,7 +4918,7 @@ legyen. NTSC DVD - 720x480, 704x480, 352x480, 352x240 + 720x480, 704x480, 352x480, 352x240 MPEG-2 9800 kbps 48000 Hz @@ -4931,7 +4931,7 @@ legyen. NTSC DVD 352x240 Ezek a felbontĂĄsok ritkĂĄn hasznĂĄlatosak a DVD-ken, mert elĂŠg - alacsony minősĂŠgĹąek. + alacsony minősĂŠgĹąek. MPEG-1 1856 kbps 48000 Hz 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! 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 md5sum hash-eket. 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 \ A MEncoder 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: @@ -610,7 +610,7 @@ mencoder mf://frame001.jpg,frame002.jpg -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): -mencoder mf://@lista.txt -mf w=800:h=600:fps=25:type=jpg \ +mencoder mf://@lista.txt -mf w=800:h=600:fps=25:type=jpg \ -ovc lavc -lavcopts vcodec=mpeg4:mbd=2:trell -oac copy -o kimenet.avi 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 letĂśltĂŠsi oldalon. 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 kapcsolĂłdĂł projektek oldal Windows-os rĂŠszĂŠben. @@ -616,7 +616,7 @@ is segĂ­thet. Ha a lejĂĄtszĂĄs szaggatott, prĂłbĂĄld meg a opciĂłt. Ha ezek kĂśzĂźl bĂĄrmelyik segĂ­t, Ă­rd be a konfigurĂĄciĂłs fĂĄjlodba. - + Ha Pentium 4-ed van ĂŠs fagyĂĄsokat tapasztalsz a RealPlayer @@ -670,7 +670,7 @@ alaphelyzetben nincs benne a MinGW-ben. ÁllĂ­tsd be a kapcsolĂłval ĂŠs telepĂ­tsd, mielőtt az MPlayert fordĂ­tanĂĄd. - + Az MPlayer ĂŠ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 config.mak fĂĄjlt ĂŠs Folytasd a make -paranccsal, majd menj a mplayerosx kĂśnyvtĂĄrba ĂŠs Ă­rd be +paranccsal, majd menj a mplayerosx kĂśnyvtĂĄrba ĂŠs Ă­rd be make dist Ez egy tĂśmĂśrĂ­tett .dmg 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 cĂ­mkĂŠk. Minden egyes elemnek meg kell adnod a pozĂ­ciĂłjĂĄt ĂŠs a mĂŠretĂŠt. - + Egy gombnak hĂĄrom ĂĄllĂĄsa van (lenyomott, felengedett, letiltott), Ă­gy a kĂŠpe fĂźggőlegesen hĂĄrom rĂŠszre van osztva. LĂĄsd a gomb elemet a rĂŠszletekĂŠrt. - + Egy potmeternek (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Ăł). hpotmetert ĂŠs potmetert a rĂŠszletekĂŠrt. - + A cĂ­mkĂŠk 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 image a betĹąhĂśz hasznĂĄl kĂŠp fĂĄjl neve (nem kell megadnod a kiterjesztĂŠst). "char" = X, Y, width, height -Itt az X ĂŠs az Y a +Itt az X ĂŠs az Y a char karakter pozĂ­ciĂłjĂĄt adja meg a kĂŠpen (0,0 a bal felső sarok). A width ĂŠs a height 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. 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 DXR2 Resource Center oldalĂĄn. 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 @@ ХОСданио высококачественного MPEG-4 ("DivX") рипа иС DVD фильма -Одним часто задаваемым вопросом является "Как Пно сделать рип саПОгО высокого +Одним часто задаваемым вопросом является "Как Пно сделать рип саПОгО высокого качества для СаданнОгО размера?". Другой вопрос "Как Пно создать DVD рип с самым -высоким возможным качеством? ĐŻ но беспокоюсь Đž размере файла, Пно нуМнО лишь +высоким возможным качеством? ĐŻ но беспокоюсь Đž размере файла, Пно нуМнО лишь наилучшее качество.". Последний вопрос, похоже, отчасти неверно сформулирован. В конце концов, осНи -Вы но беспокоитесь Đž размере файла, почему бы просто но скопировать весь MPEG-2 +Вы но беспокоитесь Đž размере файла, почему бы просто но скопировать весь MPEG-2 видоО поток с DVD? Конечно, Ваш AVI файл будет занимать ОкОНО 5GB, -нО осНи Вы желаете наилучшее качество и но волнуетесь Đž размере, то это, +нО осНи Вы желаете наилучшее качество и но волнуетесь Đž размере, то это, носОПноннО, лучшее решение. @@ -38,7 +38,7 @@ -Если это кажется для Вас сНишкОП сложным, то Вам, пОМаНуК, следует использовать +Если это кажется для Вас сНишкОП сложным, то Вам, пОМаНуК, следует использовать Один иС многочисленных неплохих фронтендов, указанных в разделе MEncoder нашоК страницы родственных проектов. @@ -59,8 +59,8 @@ Первым и наийОНоо важным шагОП перед кодированием дОНМнО быть определение типа содержимого, с которым Вы работаете. -Если источником Ваших исходных материалов является DVD иНи -широковещательное/кабельное/спутниковое TV, ОнО будет содержаться в ОднОП иС +Если источником Ваших исходных материалов является DVD иНи +широковещательное/кабельное/спутниковое TV, ОнО будет содержаться в ОднОП иС двух форматов: NTSC для Северной Америки и ЯпОнии, PAL для Европы и т.Đ´.. Однако, ваМнО понимать, что это только форматирование для пОкаСа на телевидении, и ОнО часто @@ -69,7 +69,7 @@ Опыт показывает, что NTSC материал существенно йОНоо сНОМон для кодирования, т.Đş. в нём содержится больше элементов, которые нуМнО идентифицировать. Для проведения удачного кодирования, Вам необходимо знать исходный формат. -Отказ от принятия этого вО вниПанио приведёт Đş различным дефектам в Вашем +Отказ от принятия этого вО вниПанио приведёт Đş различным дефектам в Вашем кодировании, включая безобразные гребешки (артефакты чересстрочной развёртки) и повторяющиеся иНи даМо потерянные кадры. Кроме ухудшения картинки, артефакты так Мо уменьшают эффективность кодирования: @@ -80,7 +80,7 @@ Определение кадровой частоты источника -Вот списОк, содержащий общие типы исходных материалов, гдо Они, +Вот списОк, содержащий общие типы исходных материалов, гдо Они, преимущественно, встречаются и их свойства: @@ -110,7 +110,7 @@ В других отношениях аналогично PAL. - Анимация: Обычно рисуется на 24 fps, + Анимация: Обычно рисуется на 24 fps, нО также существуют разновидности сО сПошаннОК кадровой частотой. @@ -119,7 +119,7 @@ 24 и 30 кадров в сокунду типичны для NTSC, и 25 fps типично для PAL. - Старый фильм: Различные ниСкио + Старый фильм: Различные ниСкио кадровые частоты. @@ -146,18 +146,18 @@ Любой фильм, подготовленный для просмотра на телевидении (включая DVD), преобразуется в формат, основанный на полях. - -Различные методы, с помощью которых это может быть сдоНанО, сОвОкупнО -называются "телесин" (ангН. telecine), ОдниП иС вариантов которого +Различные методы, с помощью которых это может быть сдоНанО, сОвОкупнО +называются "телесин" (ангН. telecine), ОдниП иС вариантов которого является отвратительный NTSC "3:2 пуНдаун" (ангН. pulldown). -За исключением случаев, кОгда формат исходного материала был -также ОснОван на полях (и с такой Мо частотой пОНоК), Вы получите +За исключением случаев, кОгда формат исходного материала был +также ОснОван на полях (и с такой Мо частотой пОНоК), Вы получите фильм в формате отличном от исходного. @@ -165,14 +165,14 @@ Существует несколько общих типов пуНдауна: PAL 2:2 пуНдаун: Наилучший иС всех. - Каждый кадр показывается Са время длительности двух пОНоК путем + Каждый кадр показывается Са время длительности двух пОНоК путем извлечения чётных и нечётных строк и их попеременного пОкаСа. Если в исходном материале 24 fps, то это ускоряет воспроизведение фильма на 4%. PAL 2:2:2:2:2:2:2:2:2:2:2:3 пуНдаун: - Каждый 12-Đš кадр показывается Са время длительности трёх пОНоК, + Каждый 12-Đš кадр показывается Са время длительности трёх пОНоК, вместо двух. Это помогает избежать проблемы 4%-гО ускорения, нО делает обращение процесса существенно йОНоо сложным. @@ -183,7 +183,7 @@ NTSC 3:2 телесин: Кадры показываются попеременно Са время длительности 3-х пОНоК иНи 2-х пОНоК. Это даёт частоту пОНоК в 2.5 раза больше исходной частоты кадров. - Результат также очень незначительно замедляется от 60 Đ´Đž 60000/1001 + Результат также очень незначительно замедляется от 60 Đ´Đž 60000/1001 пОНоК в сокунду для поддержания частоты пОНоК NTSC. @@ -205,19 +205,19 @@ -Когда видоО находится на DVD, последовательные пары пОНоК +Когда видоО находится на DVD, последовательные пары пОНоК группируются как кадр, даМо осНи Они но предназначены для одновременного отображения. Стандарт MPEG-2, используемый на DVD и цифровом TV предоставляет возможность одновременно кодировать исходные кадры с построчной -развёрткой и сохранять число пОНоК, в течении которых кадр +развёрткой и сохранять число пОНоК, в течении которых кадр дОНМон быть пОкаСан, в огО СагОНОвко. Если был использован такой метод, фильм часто будет называться как "мягкий телесин", т.Đş. процесс только указывает DVD-плееру Đž необходимости применения пуНдауна Đş фильму, но изменяя при этом саП фильм. Этот случай существенно предпочтителен, т.Đş. Он может быть НогкО обращён -(в действительности, проигнорирован) кодером и т.Đş. Он сохраняет +(в действительности, проигнорирован) кодером и т.Đş. Он сохраняет максимальное качество. Однако, ПнОгио широковещательные и DVD студии но используют надлежащую технологию кодирования и вместо этого производят @@ -226,28 +226,28 @@ -Порядок действия в таких случаях будет Описан +Порядок действия в таких случаях будет Описан пОСМо в даннОП руководстве. -Сейчас мы дадиП Вам несколько советов пО идентификации типа +Сейчас мы дадиП Вам несколько советов пО идентификации типа материала, с которым Вы работаете: -Области NTSC: +Регионы NTSC: - Если при просмотре Вашего фильма MPlayer + Если при просмотре Вашего фильма MPlayer выводит, что частота кадров была иСПонона Đ´Đž 24000/1001 и Она никОгда но меняется обратно, то это почти наверняка содержимое - с построчной развёрткой, которое было подвергнуто + с построчной развёрткой, которое было подвергнуто "мягкому телесину". - Если MPlayer отображает попеременные - переключения частоты кадров ПоМду 24000/1001 и 30000/1001, и Вы + Если MPlayer отображает попеременные + переключения частоты кадров ПоМду 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 @@ Если MPlayer никОгда но показывает изменения кадровой частоты и каждый отдельный кадр, гдо есть - двиМонио, оказывается гребёнкой, Ваш фильм есть NTSC видоО с + двиМонио, оказывается гребёнкой, Ваш фильм есть NTSC видоО с 60000/1001 полями в сокунду. @@ -267,7 +267,7 @@ -Области PAL: +Регионы PAL: Если Вы но видите никакОК гребёнки, Ваш фильм есть 2:2 пуНдаун. @@ -276,18 +276,18 @@ Ваш фильм представляет сОйОК 2:2:2:2:2:2:2:2:2:2:2:3 пуНдаун. - Если Вы всогда видите гребёнки вО время движения, значит Ваш + Если Вы всогда видите гребёнки вО время движения, значит Ваш фильм является PAL видоО с 50 полями в сокунду. Подсказка: - MPlayer может замедлить воспроизведение + MPlayer может замедлить воспроизведение фильма с опцией -speed иНи воспроизводить огО покадрово. - Попробуйте использовать опцию для - очень ПодНоннОгО просмотра фильма иНи несколько раз нажмите - кНавишу "." для воспроизведения ОднОгО кадра + Попробуйте использовать опцию для + очень ПодНоннОгО просмотра фильма иНи нажимайте + кНавишу "." для воспроизведения ОднОгО кадра Са раз и идетнифицируйте образец, осНи но можете огО увидеть на пОНнОК скорости. @@ -298,7 +298,7 @@ -Постоянный квантователь против многопроходности +Постоянный квантователь в сравнении с многопроходностью Возможно кодировать Ваш фильм, широко варьируя качество. @@ -310,7 +310,7 @@ -Есть три подхода при кодировании видоО: постоянный битпоток (CBR), +Есть три подхода при кодировании видоО: постоянный битпоток (CBR), постоянный квантователь и многопроходность (ABR иНи усреднённый битпоток). @@ -322,8 +322,8 @@ Однако, в таких простых режимах как CBR кодеры но знают загруженность битпотока в последующих сценах и т.Đž. но могут превысить затребованный битпоток для больших промежутков времени. -Более продвинутые режимы, такие как многопроходный режим, могут -учитывать статистику предыдущих проходов; это решает проблему, +Более совершенные режимы, такие как многопроходный режим, могут +учитывать статистику предыдущих проходов; это решает проблему, упомянутую выше. @@ -346,10 +346,10 @@ В каМдОП иС этих режимов видоОкОдок (такой как libavcodec) разбивает видеокадр на макроблоки размером 16х16 пиксоНоК и потом -применяет квантователь Đş каМдОПу макроблоку. ЧоП меньше квантоваль, +применяет квантователь Đş каМдОПу макроблоку. ЧоП меньше квантоваль, тем лучше качество и выше битпоток. Метод, используемый видоО кодером для определения того, какОК -квантователь использовать для даннОгО макроблока, варьируется и +квантователь использовать для даннОгО макроблока, варьируется и подлежит тонкой настройке. (Это крайнее упрощение реального процесса, нО основная концепция пОНоСна для понимания.) @@ -361,7 +361,7 @@ Если Вас действительно но волнует размер файла, Вы можете также использовать CBR и указать бесконечный битпоток. (На практике это означает значение, достаточно большое для обозначения отсутствия -предела, например, 10000 Кбит.) В результате, йоС реального ограничения +предела, например, 10000 Кбит.) В результате, йоС реального ограничения битпотока, кОдок использует наименьший возможный квантователь для каМдОгО макроблока (как укаСанО опцией для @@ -371,27 +371,26 @@ испортите качество Вашего видоО. Чтобы избежать этого, Вам, вероятно, придётся уменьшить размеры Вашего видоО, сОгНаснО методу, ОписаннОПу даНоо в этом руководстве. -В общих чертах, Вам следует избегать CBR сОвсоП, осНи Вы заботитесь -Đž качестве. +В общем, Вам следует избегать CBR сОвсоП, осНи Вы заботитесь Đž качестве. ĐĄ постоянным квантователем кОдок использует для всех макроблоков Один и тот Мо квантователь, указанный в опции - (для + (для libavcodec). -Если Вы хотите рип наивысшего вОСПОМнОгО качества, снОва но взирая +Если Вы хотите рип наивысшего вОСПОМнОгО качества, снОва но взирая на битпоток, Вы можете использовать . -Это приведёт Đş тому Мо битпотоку и PSNR (пику отношения сигнаНа Đş шуПу), -что и CBR с -=бесконечности и значением пО умолчанию +Это приведёт Đş тому Мо битпотоку и PSNR (пику отношения сигнаНа Đş шуПу), +что и CBR с +=бесконечности и значением пО умолчанию , равным 2. Проблема с постоянным квантованием заключается в том, что кОдок использует -заданный квантователь вно зависимости от того, требуется это для +заданный квантователь вно зависимости от того, требуется это для макроблока иНи нет. ТО есть вОСПОМнО использование большего квантователя для макроблока йоС ухудшения видиПОгО качества. Зачем тратить биты на иСНишно ниСкиК квантователь? ĐŁ Вашего процессора есть столько тактов, @@ -400,13 +399,13 @@ -При двупроходном кодировании первый проход создаст рип фильма так, +При двупроходном кодировании первый проход создаст рип фильма так, как будто это был CBR, нО сохранит НОг свойств для каМдОгО кадра. Эта информация затем будет использована вО время второго прохода для принятия интеллектуальных решений Đž том, какОК квантователь -следует использовать. Во время быстрого движения иНи сцен с -высокой детализацией с большой вероятностью будут использованы -бОльшие квантователи, а вО время ПодНоннОгО движения иНи сцен +следует использовать. Во время быстрого движения иНи сцен с +высокой детализацией с большой вероятностью будут использованы +большие квантователи, а вО время ПодНоннОгО движения иНи сцен с ниСкОК детализацией — меньшие. Обычно количество движения играет существенно йОНоо важную роль, чем количество деталей. @@ -417,7 +416,7 @@ Если Вы используете , то Вы но получаете рип наивысшего качества. Предположим, Вы делаете рип DVD, используя , результат получается 1800 Кбит. -Если Вы сделаете двупроходное кодирование с +Если Вы сделаете двупроходное кодирование с , получившееся видоО будет обладать лучшим качеством для того Мо битпотока. @@ -446,8 +445,8 @@ Если Вашей целью является определённый размер, Вам нуМнО как-нибудь вычислить битпоток. Но перед этим, Вам нуМнО знать, сколько места -нуМнО зарезервировать пО аудиО дорожку(и), так что Вам необходимо -извлечь их сперва. +нуМнО зарезервировать пО аудиО дорожку(и), так что Вам необходимо +сперва извлечь их. Вы можете рассчитать битпоток с помощью следующей формулы: битпоток = (конечный_размер_в_МБайт - размер_Свука_в_МБайт) * 1024 * 1024 / длительность_в_секундах * 8 / 1000. @@ -465,14 +464,14 @@ ИС-Са особенностей MPEG-пОдОйнОгО сжатия, существуют различные -ограничения, которым Вы должны следовать для достижения +ограничения, которым Вы должны следовать для достижения максимального качества. MPEG разбивает видоО на квадраты 16х16, называемые макроблоками. Каждый макроблок состоит иС 4 йНОкОв 8х8 с информацией Đž люме (интенсивности) и двух йНОкОв 8х8 с информацией Đž хроме (цвете) пОНОвиннОгО разрешения (Один для красно-бирюзовой Оси и другой для жёлто-гОНуйОК Оси). -Даже осНи ширина и высота Вашего фильма но кратны 16, кодер +Даже осНи ширина и высота Вашего фильма но кратны 16, кодер всё равно использует нуМнОо количество макроблоков 16х16 для покрытия всоК области картинки, дополнительная область будет впустую потрачена. Так что в интересах максимизации качества при фиксированном размере @@ -481,8 +480,8 @@ MPEG разбивает видоО на квадраты 16х16, называе ĐŁ большинства DVD также есть определённое пОдОйио чёрных пОНОс на -краях. Если Вы их оставите, это может -сильно повредить качество +краях. Если Вы их оставите, это может +сильно повредить качество несколькими путями. @@ -490,7 +489,7 @@ MPEG разбивает видоО на квадраты 16х16, называе MPEG-пОдОйнОо сжатие очень чувствительно Đş преобразованиям - частотных интервалов, в частности, Đş дискретному кОсинуснОПу + частотных интервалов, в частности, Đş дискретному кОсинуснОПу преобразованию (DCT), которое аналогично преобразованию Фурье. Этот вид сжатия эффективен для представления образов и сглаженных переходов, нО у ногО возникают проблемы с острыми краями. @@ -504,22 +503,22 @@ MPEG разбивает видоО на квадраты 16х16, называе возникает только в случае попадания острого края внутрь йНОка. Если Ваши чёрные поля возникают точно на границах, кратных 16 пикселям, это но проблема. - Однако, чёрные полосы на DVD редко хорошо расположены, так что - на практике Вам всогда придётся усекать стороны для избежания - этих проблем. + Однако, чёрные полосы на DVD редко хорошо расположены, так что + на практике Вам всогда придётся усекать стороны для избежания + этих проблем. -В дОпОНнонио Đş преобразованиям частотных интервалов, MPEG-пОдОйнОо -сжатие использует векторы движения для отображения иСПонониК от +В дОпОНнонио Đş преобразованиям частотных интервалов, MPEG-пОдОйнОо +сжатие использует векторы движения для отображения иСПонониК от ОднОгО кадра Đş другому. Векторы движения, естественно, работают существенно Поноо эффективно для новых объектов, идущих от краёв картинки, поскольку Они отсутствуют в предыдущих кадрах. Пока картинка простирается вплоть Đ´Đž края кодируемой области, у векторов движения но возникает проблем с двиМониоП объектов -Са пределы картинки. Однако, при наличии черных пОНоК +Са пределы картинки. Однако, при наличии черных пОНоК могут возникнуть проблемы: @@ -529,13 +528,13 @@ MPEG разбивает видоО на квадраты 16х16, называе Для каМдОгО макроблока MPEG-пОдОйнОо сжатие сохраняет вектор, определяющий какая часть предыдущего кадра дОНМна быть скопирована в этот макроблок как ОснОва для предсказания следующего кадра. - Кодированию подлежит только оставшаяся разность. Если макроблок + Кодированию подлежит только оставшаяся разность. Если макроблок простирается Đ´Đž края картинки и содержит часть чёрной полосы, то векторы движения других частей картинки перепишут чёрную пОНОсу. - Это означает, что ПнОгО битов нуМнО потратить НийО на повторное - чернение переписанной полосы, НийО (что йОНоо вероятно) вектор - движения но будет использован вОвсо и всо изменения для этого - макроблока будут явно кодированы. Другими сНОваПи, эффективность + Это означает, что ПнОгО битов нуМнО потратить НийО на повторное + чернение переписанной полосы, НийО (что йОНоо вероятно) вектор + движения но будет использован вОвсо и всо изменения для этого + макроблока будут явно кодированы. Так иНи иначе, эффективность кодирования существенно уменьшается. @@ -547,22 +546,22 @@ MPEG разбивает видоО на квадраты 16х16, называе - Наконец, предположим, что у нас есть находящийся внутри картинки + Наконец, предположим, что у нас есть находящийся внутри картинки макроблок и объект движется в этот йНОк от края изображения. - MPEG-пОдОйнОо кодирование но может сказать "скопируй ту часть, + MPEG-пОдОйнОо кодирование но может сказать "скопируй ту часть, что внутри картинки, нО но чёрную пОНОсу". Так что чёрная пОНОса - также будет скопирована внутрь, в результате чего Пасса битов + также будет скопирована внутрь, в результате чего Пасса битов будет потрачена на кодирование части изображения, которое дОНМнО быть на месте полосы. Для случаев, кОгда всё изображение движется Đş краю кодируемой - области, у MPEG есть специальные оптимизации для многократного - копирования пиксоНоК на край картинки, кОгда вектор движения - идёт иСвно области кодирования. Эта возможность становится - йоспОНоСнОК, осНи у фильма есть чёрные полосы. В отличии от - случаев 1 и 2, выравнивание границ Đ´Đž кратности 16 здесь + области, у MPEG есть специальные оптимизации для повторяющегося + копирования пиксоНоК Đş краю картинки, кОгда вектор движения + идёт иСвно области кодирования. Эта возможность становится + йоспОНоСнОК, осНи у фильма есть чёрные полосы. В отличии от + случаев 1 и 2, выравнивание границ Đ´Đž кратности 16 здесь но поможет. @@ -575,9 +574,9 @@ MPEG разбивает видоО на квадраты 16х16, называе -Благодаря всоП этим причинам, рекомендуется полностью урезать +Благодаря всоП этим причинам, рекомендуется полностью урезать чёрные полосы. Более того, осНи есть области шуПОв/искаМониК -на краях картинки, то их урезание также поспособствует улучшению +на краях картинки, то их урезание также поспособствует улучшению качества кодирования. Видеофилы, желающие сохранить оригинал как ПОМнО йОНоо точно, могут возражать против такого усечения; нО осНи Вы но планируете кодировать при постоянном квантователе, @@ -593,7 +592,7 @@ MPEG разбивает видоО на квадраты 16х16, называе Вспомните иС предыдущего раздела, что конечный размер картинки, -подлежащей кодированию, дОНМон быть кратен 16 (как высота, так +подлежащей кодированию, дОНМон быть кратен 16 (как высота, так и ширина). Это может быть достигнуто усечением, масштабированием иНи комбинацией того и другого. @@ -601,11 +600,11 @@ MPEG разбивает видоО на квадраты 16х16, называе Есть несколько рекомендаций для усечения, которым необходимо следовать для избежания повреждения фильма. -Обычный формат YUV, 4:2:0, сохраняет хрому (информацию Đž цвете) -пОНОвиннОК дискретизации, т.Đľ. хрома сохраняется в два раза реже -в каМдОП направлении, чем люма (информация Ой интенсивности). +Обычный формат YUV, 4:2:0, сохраняет цветность (информацию Đž цвете) +пОНОвиннОК дискретизации, т.Đľ. цветность сохраняется в два раза реже +в каМдОП направлении, чем яркостность (информация Ой интенсивности). Рассмотрите следующую диаграмму, гдо L обозначает точки дискретизации -люмы и C — хромы. +яркостности и C — цветности. @@ -685,15 +684,15 @@ MPEG разбивает видоО на квадраты 16х16, называе Как Вы видите, строки и столбцы изображения естественным образом идут в парах. Поэтому смещения и размеры усечения должны быть чётными числами. -Иначе хрома перестанет правильно соответствовать люме. +Иначе цветность перестанет правильно соответствовать яркостности. Теоретически вОСПОМнО усечение с нечётными смещениями, нО ОнО -потребует преобразования хромы, что потенциально является +потребует переквантования цветности, что потенциально является операцией с потерей качества и но поддерживается фильтром усечения сторон crop. -Более того, видоО с чересстрочной развёрткой дискретизируется +Более того, видоО с чересстрочной развёрткой дискретизируется следующим образом: @@ -941,7 +940,7 @@ MPEG разбивает видоО на квадраты 16х16, называе -Естественные разрешения DVD составляют 720x480 для NTSC и 720x576 +Естественные разрешения DVD составляют 720x480 для NTSC и 720x576 для PAL, нО существует флаг соотношения сторон, который указывает является Ни видоО полноэкранным (4:3) иНи широкоэкранным (16:9). Многие (осНи но большинство) широкоэкранных DVD но точно соответствуют @@ -951,14 +950,14 @@ MPEG разбивает видоО на квадраты 16х16, называе MPlayer предоставляет фильтр обнаружения -усечения, который определяет прямоугольник, Đ´Đž которго нуМнО усечь +усечения, который определяет прямоугольник, Đ´Đž которго нуМнО усечь (). Запустите MPlayer с и Он выдаст настройки усечения для удаления пОНоК. -ĐĄ целью получения точных параметров усечения, Вы должны проигрывать -фильм достаточно дОНгО для того, чтоб была использована вся область -изображения. +ĐĄ целью получения точных параметров усечения, Вы должны проигрывать +фильм достаточно дОНгО для того, чтоб была использована вся область +изображения. @@ -966,18 +965,17 @@ MPEG разбивает видоО на квадраты 16х16, называе MPlayer, используя командную строку, выведенную , и подстройте прямоугольник при необходимости. -Фильтр может быть пОНоСон, пОСвОНив +Фильтр может быть пОНоСон, пОСвОНив Вам интерактивно менять прямоугольник усечения для Вашего фильма. Не забывайте следовать указанным выше руководствам пО делимости, -чтобы но испортить выравнивание хромы. +чтобы но испортить выравнивание цветности. В ряде случаев масштабирование может быть нежелательным. Масштабирование пО вертикальному направлению затруднено для чересстрочного видоО, и осНи Вы хотите сохранить чересстрочность, -Вам в большинстве случаев будет необходимо воздерживаться от -масштабирования. +Вам, как правило, будет необходимо воздерживаться от масштабирования. Если Вы но будете масштабировать, нО всё ещё желаете размеры, кратные 16, то Вам придётся проводить иСНишноо усечение. Не проводите нопОНнОо усечение, поскольку чёрные полосы очень @@ -986,24 +984,22 @@ MPEG разбивает видоО на квадраты 16х16, называе Поскольку MPEG-4 использует макроблоки 16х16, Вы должны убедиться, -что каМдОо измерение кодируемого видоО кратно 16; иначе Вы ухудшите -качество, ОсОйоннО на малых битпотоках. Вы можете сделать это, -округлив ширину и высоту прямоугольника усечения Đ´Đž йНиМаКшогО +что каМдОо измерение кодируемого видоО кратно 16; иначе Вы ухудшите +качество, ОсОйоннО на малых битпотоках. Вы можете сделать это, +округлив ширину и высоту прямоугольника усечения Đ´Đž йНиМаКшогО меньшего целого, кратного 16. -Учитывая установленное ранее, при усечении Вы можете захотеть увеличить -смещение пО Y на пОНОвину разности старой и нОвОК высоты, так что -полученное видоО будет браться иС центра кадра. - +Как укаСанО выше, при усечении Вам необходимо увеличить смещение пО +Y на пОНОвину разности старой и нОвОК высоты, так что полученное +видоО будет браться иС центра кадра. И иС-Са спОсОйа дискретизации DVD видоО, убедитесь, что смещение -есть чётное число. (Фактически, возьмите Са правило никОгда но +есть чётное число. (Фактически, возьмите Са правило никОгда но использовать нечётные величины для любых параметров усечения иНи масштабирования видоО.) Если Вы беспокоитесь иС-Са нескольких иСНишно отброшенных битов, вОСПОМнО, Вы предпочтёте вСаПон масштабировать видоО. Мы рассмотрим это ниМо в нашоП примере. - В действительности, Вы можете доверить фильтру сделать для Вас всё вышеупомянутое, -т.Đş. у ногО есть необязательный параметр округления +т.Đş. у ногО есть необязательный параметр округления , равный 16 пО умолчанию. @@ -1015,13 +1011,13 @@ MPEG разбивает видоО на квадраты 16х16, называе После всогО выше скаСаннОгО и сдоНаннОгО, Вы, вероятно, получите -видоО но точно формата 1:85.1 иНи 2.35:1, а с чем-то йНиСкиП -Đş этому. Вы можете вычислить новый коэффициент соотношения -сторон вручную, нО MEncoder +видоО но точно формата 1:85.1 иНи 2.35:1, а с чем-то йНиСкиП +Đş этому. Вы можете вычислить новый коэффициент соотношения +сторон вручную, нО MEncoder предоставляет опцию для libavcodec, называемую , которая сделает это для -Вас. Ни в кОоП случае но увеличивайте размер этого видоО с целью -квадратизации пиксоНоК, осНи Вы но желаете впустую потратить +Вас. Ни в кОоП случае но увеличивайте размер этого видоО с целью +квадратизации пиксоНоК, осНи Вы но желаете впустую потратить место на жёстком диско. Масштабирование дОНМнО выполняться при воспроизведении, и плеер использует коэффициент соотношения сторон, сохранённый в AVI, для @@ -1038,12 +1034,12 @@ MPEG разбивает видоО на квадраты 16х16, называе Если Вы но собираетесь кодировать в режиме постоянного квантователя, -Вам нуМнО выбрать битпоток. +Вам нуМнО выбрать битпоток. Понятие битпотока очень просто: это среднее число битов, которые будут использованы для сохранения Вашего фильма, в сокунду. Обычно битпоток измеряется в килобитах (1000 бит) в сокунду. -Размер Вашего фильма на диско есть битпоток, умноженный на -длительность фильма, плюс небольшие накладные расходы +Размер Вашего фильма на диско есть битпоток, умноженный на +длительность фильма, плюс небольшие накладные расходы (сП. раздел контейнер AVI для примера). @@ -1054,9 +1050,9 @@ MPEG разбивает видоО на квадраты 16х16, называе Битпоток изменяется но -пропорционально разрешению. -ТО есть файл разрешением 320х240 с 200 кбит/сок но будет -того Мо качества, что этот Мо фильм разрешением 640х480 +пропорционально разрешению. +ТО есть файл разрешением 320х240 с 200 кбит/сок но будет +того Мо качества, что этот Мо фильм разрешением 640х480 и 800 кбит/сок! Для этого есть дво причины: @@ -1065,19 +1061,19 @@ MPEG разбивает видоО на квадраты 16х16, называе замечаете MPEG артефакты, осНи Они больше! Артефакты возникают на масштабе йНОкОв (8х8). Ваш гНаС но увидит Ошийки в 4800 маленьких йНОкОв так Мо - НогкО, как и в 1200 больших йНОкОв (предполагая + НогкО, как и в 1200 больших йНОкОв (предполагая масштабирование обоих фильмов на полный экран). - Теоретическая: Когда Вы + Теоретическая: Когда Вы уменьшаете размер изображения, нО продолжаете использовать - йНОки того Мо размера (8х8) для пространственных частотных + йНОки того Мо размера (8х8) для пространственных частотных преобразований, Вы перемещаете больше данных в высокочастотные полосы. Грубо говоря, каждый пиксель содержит больше деталей, чем раньше. - Так что несмотря на то, что Ваша картинка с уменьшенным + Так что несмотря на то, что Ваша картинка с уменьшенным масштабом содержит 1/4 информации в пространственных направлениях, - Она всё ещё может содержать большУю часть информации в + Она всё ещё может содержать большУю часть информации в частотных интервалах (предполагая, что высокие частоты были но использованы в оригинальном 640х480 изображении). @@ -1086,7 +1082,7 @@ MPEG разбивает видоО на квадраты 16х16, называе Последние руководства рекомендовали выбор битпотока и разрешения, -основываясь на приближении "бит на пиксель", нО это обычно но +основываясь на приближении "бит на пиксель", нО это обычно но верно иС-Са упомянутых выше причин. Похоже, лучшей оценкой является рост битпотока пропорционально квадратному корню разрешения, так что 320х240 и 400 кбит/сок @@ -1107,7 +1103,7 @@ MPEG разбивает видоО на квадраты 16х16, называе Расчёт разрешения -Следующие шаги помогут Вам рассчитать разрешение для Вашего +Следующие шаги помогут Вам рассчитать разрешение для Вашего кодирования йоС сНишкОП сильного искажения видоО, учитывая несколько видОв информации Ой исходном видоО. Прежде всогО, Вам необходимо рассчитать коэффициент соотношения @@ -1142,21 +1138,21 @@ CQ соответствует числу битов на пиксель и на Грубо говоря, чем больше CQ, тем меньше вероятность увидеть артефакты кодирования. Однако, осНи у Вас есть заданный размер для Вашего фильма -(например, 1 иНи 2 CD), есть ограниченное общее число битов, -которые Вы можете потратить; поэтому ваМнО найти хороший +(например, 1 иНи 2 CD), есть ограниченное общее число битов, +которые Вы можете потратить; поэтому ваМнО найти хороший компромисс ПоМду сжимаемостью и качеством. CQ зависит от битпотока, эффективности видоОкОдока и разрешения фильма. Обычно, в целях увеличения CQ, Вам нуМнО будет уменьшить размер -фильма, при усНОвии, что битпоток, вычисленный как функция конечного +фильма, при усНОвии, что битпоток, вычисленный как функция конечного размера, и дНина фильма постоянны. ĐĄ MPEG-4 ASP кОдокаПи, такими как Xvid -и libavcodec, CQ +и libavcodec, CQ меньше 0.18 обычно приводит Đş изображению с большим числом сегментов "квадратиками", иС-Са недостаточного числа битов для -кодирования информации в каМдОП макроблоке. +кодирования информации в каМдОП макроблоке. (MPEG4, как и ПнОгио другие кОдоки, группирует пиксоНи в йНОки пО несколько пиксоНоК для сжатия изображения; осНи битов но хватает, границы этих йНОкОв заметны.) @@ -1169,17 +1165,17 @@ CQ зависит от битпотока, эффективности видоО Xvid должны сделать возможным получение того Мо качества с CQ в диапаСОно от 0.18 Đ´Đž 0.20 для рипа на 1 CD и 0.24-0.26 для рипа на 2 CD. -Используя MPEG-4 AVC кОдоки, такие как +Используя MPEG-4 AVC кОдоки, такие как x264, Вы можете использовать CQ в диапаСОно от 0.14 Đ´Đž 0.16 сО стандартными опциями кодирования -и должны суметь достичь таких низких значений, как 0.10 - 0.12 +и должны суметь достичь таких низких значений, как 0.10 — 0.12 с помощью продвинутых опций кодирования x264. Пожалуйста, обратите вниПанио, что CQ — лишь показательная величина, -т.Đş. Она зависит от кодируемого содержимого; CQ 0.18 может хорошо +т.Đş. Она зависит от кодируемого содержимого; CQ 0.18 может хорошо смотреться для Бергмана (Bergman), в отличии от такого фильма как Матрица (The Matrix), содержащего ПнОгО сцен с быстрым двиМониоП. ĐĄ другой стороны, йоспОНоСнО увеличивать CQ выше 0.30, т.Đş. Вы @@ -1199,7 +1195,7 @@ CQ в диапаСОно от 0.14 Đ´Đž 0.16 сО стандартными Оп Изучение использования видоО фильтров MEncoder ваМнО для получения хороших результатов кодирования. -Вся обработка видоО выполняется посредством фильтров: усечение, +Вся обработка видоО выполняется посредством фильтров: усечение, масштабирование, подстройка цвета, удаНонио шуПа, увеличение чёткости, деинтерлейс (преобразование видоО иС чересстрочной развёртки в построчную), телесин, обратный телесин и удаНонио @@ -1215,7 +1211,7 @@ CQ в диапаСОно от 0.14 Đ´Đž 0.16 сО стандартными Оп -vf фильтр1=опции,фильтр2=опции,... -Большинство фильтров используют численные значения опций, +Большинство фильтров используют численные значения опций, разделённые двоеточиями, нО синтаксис этих параметров различается у разных фильтров, так что читайте ПануаН для детальной информации Đž фильтрах, которые Вы желаете использовать. @@ -1227,7 +1223,7 @@ CQ в диапаСОно от 0.14 Đ´Đž 0.16 сО стандартными Оп -vf crop=688:464:12:4,scale=640:464 -сперва усечёт область изображения Đ´Đž 688х464 с верхним левым +сперва усечёт область изображения Đ´Đž 688х464 с верхним левым угНОП (12,4), а затем масштабирует результат Đ´Đž 640х464. @@ -1236,29 +1232,29 @@ CQ в диапаСОно от 0.14 Đ´Đž 0.16 сО стандартными Оп рядом с ниП) с целью получения преимущества от использования информации пОсНо видеодекодера, которая будет потеряна иНи искаМона другими фильтрами. -Важнейшими примерами являются: (постобработка, +Важнейшими примерами являются: (постобработка, только при выполнении операций удаления блочной сегментации (deblocking) иНи увеличения чёткости краёв (deringing)), (другой фильтр постобработки, служащий для удаления артефактов MPEG), (обратный -телесин), и (для преобразования +телесин), и (для преобразования мягкого телесина в жёсткий). -В общем случае, Вам следует делать настолько ПаНО фильтрации, +В общем случае, Вам следует делать настолько ПаНО фильтрации, насколько это вОСПОМнО, для того чтоб остаться йНиСкО Đş оригинальному DVD источнику. Усечение часто необходимо (как ОписанО выше), нО -избегайте масштабирования видоО. Несмотря на то, что уменьшение -размера инОгда предпочтительно использованию бОльших -квантователей, нуМнО избегать и того, и другого: помните, +избегайте масштабирования видоО. Несмотря на то, что уменьшение +размера инОгда предпочтительно использованию бОльших +квантователей, нуМнО избегать и того, и другого: помните, что мы с саПОгО начала решили обменять биты на качество. ТакМо но корректируйте гаППу, контрастность, яркость и т.Đż.. ТО, что хорошо выглядит на Вашем мониторе, может плохо выглядеть -на других. Эти коррекции должны выполняться только при +на других. Эти коррекции должны выполняться только при воспроизведении. @@ -1269,11 +1265,11 @@ DVD источнику. Усечение часто необходимо (как Ещё раз, причиной этому является то, что этим битам ПОМнО найти лучшее применение: зачем тратить их, кодируя шуП, осНи Вы просто можете вернуть этот шуП в процессе воспроизведения? -Увеличение параметров для дополнительно +Увеличение параметров для дополнительно улучшит сжимаемость, нО увеличив значения сНишкОП сильно, Вы рискуете -ухудшить различимость изображения. -Рекомендованные выше значения () сНогка -консервативны; но бойтесь экспериментировать с йОНоо высокими +ухудшить различимость изображения. +Рекомендованные выше значения () сНогка +консервативны; но бойтесь экспериментировать с йОНоо высокими значениями и самостоятельно оценивать результаты. @@ -1284,9 +1280,9 @@ DVD источнику. Усечение часто необходимо (как Чересстрочная развёртка и телесин -Почти всо фильмы снимаются при 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. -Поскольку видоО на PAL DVD но переделывается, Вам но стоит +Поскольку видоО на PAL DVD но переделывается, Вам но стоит беспокоится Đž частоте кадров. ĐŁ источника 25 fps и у Вашего рипа будет 25 fps. Однако, осНи Вы делаете рип NTSC DVD фильма, Вам, быть может, придётся выполнить обратный телесин. @@ -1317,7 +1313,7 @@ DVD источнику. Усечение часто необходимо (как Для фильмов, снятых на 24 fps, видоО на NTSC DVD идёт НийО с телесином -30000/1001, НийО с построчной развёрткой 24000/1001 fps и +30000/1001, НийО с построчной развёрткой 24000/1001 fps и предназначается для телесина на лету с помощью DVD плеера. ĐĄ другой стороны, TV сериалы идут обычно только с чересстрочной развёрткой, нО йоС телесина. Это но строгое правило: есть сериалы с @@ -1349,14 +1345,14 @@ pullup,softskip. Если Вы желаете кодировать фильм с чересстрочной развёрткой -(NTSC иНи PAL видоО), Вам нуМнО решить, будете Ни Вы огО +(NTSC иНи PAL видоО), Вам нуМнО решить, будете Ни Вы огО преобразовывать в построчную развёртку иНи нет. -Хотя такое преобразование (деинтерлейс) сделает Ваш фильм +Хотя такое преобразование (деинтерлейс) сделает Ваш фильм пригодным для диспНоов с построчной развёрткой, таких как компьютерные мониторы и проекторы, это будет иметь свою цену: -частота пОНоК уменьшится вдвОо от 50 иНи 60000/1001 Đ´Đž 25 иНи -30000/1001 поля в сокунду, и примерно пОНОвина информации в -Вашем фильме будет потеряна в сценах сО значительным двиМониоП. +частота пОНоК уменьшится вдвОо от 50 иНи 60000/1001 Đ´Đž 25 иНи +30000/1001 поля в сокунду, и примерно пОНОвина информации в +Вашем фильме будет потеряна в сценах сО значительным двиМониоП. @@ -1364,9 +1360,9 @@ pullup,softskip. но рекомендуется делать деинтерлейс. Вы всогда можете преобразовать развёртку фильма в процессе воспроизведения (при воспроизведении на устройствах с построчной развёрткой). -Мощность современных компьютеров вынуждает плееры использовать +Мощность современных компьютеров вынуждает плееры использовать фильтр деинтерлейса, что сНогка ухудшает качество изображения. -Но плееры будущего будут способны имитировать диспНоК TV с +Но плееры будущего будут способны имитировать диспНоК TV с чересстрочной развёрткой, выполняя деинтерлейс на пОНнОК частоте пОНоК и интерполируя 50 иНи 60000/1001 кадров в сокунду для чересстрочного видоО. @@ -1385,8 +1381,8 @@ pullup,softskip. чересстрочной развёртки. - Фильтры постобработки и удаления шуПа могут но работать как - ожидается, только осНи Вы ОсОйО но позаботитесь Ой их + Фильтры постобработки и удаления шуПа могут но работать как + ожидается, только осНи Вы ОсОйО но позаботитесь Ой их применении Đş ОднОПу полю Са раз, иначе Они могут повредить видоО при неверном использовании. @@ -1398,7 +1394,7 @@ pullup,softskip. mencoder захват.avi -mc 0 -oac lavc -ovc lavc -lavcopts \ vcodec=mpeg2video:vbitrate=6000:ilme:ildct:acodec=mp2:abitrate=224 -Обратите вниПанио на опции и . +Обратите вниПанио на опции и . @@ -1411,12 +1407,12 @@ vcodec=mpeg2video:vbitrate=6000:ilme:ildct:acodec=mp2:abitrate=224 Алгоритмы аудиО/видоО (A/V) синхронизации MEncoder были разработаны с целью восстановления файлов с повреждённой синхронизацией. -Однако, в ряде случаев Они могут привести Đş нонуМнОПу пропуску +Однако, в ряде случаев Они могут привести Đş нонуМнОПу пропуску иНи повторению кадров и, вОСПОМнО, Đş лёгкой A/V рассинхронизации -корректных входных данных (конечно, проблемы A/V синхронизации +корректных входных данных (конечно, проблемы A/V синхронизации возникают только при обработке иНи копировании аудиотрека при кодировании видоО, что настоятельно рекомендуется). -Поэтому Вы можете переключиться на базовую A/V синхронизацию +Поэтому Вы можете переключиться на базовую A/V синхронизацию с помощью опции иНи разместить это в конфигурационном файле ~/.mplayer/mencoder, осНи Вы работаете только с хорошими источниками (DVD, TV-захват, @@ -1425,13 +1421,13 @@ vcodec=mpeg2video:vbitrate=6000:ilme:ildct:acodec=mp2:abitrate=224 -Если Вы хотите дополнительно защититься от странных пропусков +Если Вы хотите дополнительно защититься от странных пропусков и повторений кадров, Вы можете одновременно использовать опции и . -Это предотвратит любую A/V коррекцию, и +Это предотвратит любую A/V коррекцию, и будет копировать кадры Один в Один, так что Вы но сможете это использовать, осНи будете применять какио-НийО фильтры, которые -непредсказуемо добавляют иНи отбрасывают кадры, НийО осНи у +непредсказуемо добавляют иНи отбрасывают кадры, НийО осНи у Вашего входного файла переменный битопоток! Поэтому использование в общем случае но рекомендуется. @@ -1442,7 +1438,7 @@ vcodec=mpeg2video:vbitrate=6000:ilme:ildct:acodec=mp2:abitrate=224 поддерживаемое MEncoder, вызывало A/V рассинхронизацию. Это наверняка произойдёт при использовании совместно с некоторыми -фильтрами, поэтому сейчас но рекомендуется +фильтрами, поэтому сейчас но рекомендуется использовать трёхпроходный аудиО режим. Эта возможность оставлена только для совместимости и для опытных пользователей, понимающих кОгда это йоСОпаснО, а кОгда нет. @@ -1453,7 +1449,7 @@ A/V рассинхронизацию. ТакМо были сообщения Ой A/V рассинхронизации при кодировании сО стандартного ввОда (stdin) с помощью MEncoder. -Не делайте этого! Всегда вСаПон используйте файл иНи CD/DVD и т.Đż. +Не делайте этого! Всегда вСаПон используйте файл иНи CD/DVD и т.Đż. устройство. @@ -1464,7 +1460,7 @@ A/V рассинхронизацию. Выбор видоОкОдока -ТО, какОК видоОкОдок лучше выбрать, зависит от нескольких +ТО, какОК видоОкОдок лучше выбрать, зависит от нескольких факторов, таких как размер, качество, устойчивость Đş ОшийкаП, практичность и распространённость, ПнОгио иС которых сильно зависят от личных предпочтений и технических ограничений. @@ -1473,13 +1469,13 @@ A/V рассинхронизацию. Эффективность сжатия: - Достаточно очевидно, что большинство кОдокОв нОвОгО поколения + Достаточно очевидно, что большинство кОдокОв нОвОгО поколения разработаны для увеличения качества и степени сжатия. Поэтому, авторы даннОгО руководства и ПнОгио другие люди полагают, что Вы но можете ошибиться - Несмотря на это, будьте осторожны: для декодирования MPEG-4 AVC - видоО с DVD разрешением необходима быстрая Пашина (например, + Несмотря на это, будьте осторожны: для декодирования MPEG-4 AVC + видоО с DVD разрешением необходима быстрая Пашина (например, Pentium 4 свыше 1.5 ГГц иНи Pentium M свыше 1 ГГц). , выбирая MPEG-4 AVC кОдоки (например, @@ -1487,24 +1483,24 @@ A/V рассинхронизацию. вместо таких MPEG-4 ASP кОдокОв, как libavcodec MPEG-4 иНи Xvid. - (Опытные разработчики кОдокОв могут быть заинтересованы в + (Опытные разработчики кОдокОв могут быть заинтересованы в ОСнакОПНонии с точкой зрения Михаэля Нидермайера (Michael Niedermayer) "почему MPEG4-ASP отстой".) Аналогично, Вы должны получить лучшее качество с MPEG-4 ASP, пО сравнению с MPEG-2 кОдокаПи. - + - Однако, новые кОдоки, находящиеся в интенсивной разработке, - могут страдать от ещё но замеченных ОшийОк, которые могут - испортить кодирование. Просто это плата Са использование + Однако, новые кОдоки, находящиеся в интенсивной разработке, + могут страдать от ещё но замеченных ОшийОк, которые могут + испортить кодирование. Просто это плата Са использование передовых технологий. - + Более существенно то, что для начала использования нОвОгО кОдока - необходимо потратить время на изучение огО опций так, чтобы Вы + необходимо потратить время на изучение огО опций так, чтобы Вы СнаНи, что нуМнО подстраивать для достижения СаданнОгО качества изображения. @@ -1512,10 +1508,10 @@ A/V рассинхронизацию. Аппаратная совместимость: - Обычно необходимо длительное время для включения поддержки + Обычно необходимо длительное время для включения поддержки последних видоОкОдокОв в автономные видеоплееры. - В итоге, большинство поддерживает только 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, libavcodec LMP4 и Xvid) @@ -1529,34 +1525,34 @@ A/V рассинхронизацию. Лучшее соотношение качества и времени кодирования: Кодеки, уМо использующиеся определённое время (например, libavcodec MPEG-4 и - Xvid) обычно сильно - оптимизированы всевозможными остроумными алгоритмами и + Xvid) обычно сильно + оптимизированы всевозможными остроумными алгоритмами и ассемблерным SIMD кОдОП. Поэтому Они обладают тенденцией достижения лучшего соотношения качества Đş времени кодирования. Однако, у них могут быть некоторые очень продвинутые опции, которые, будучи включенными, сделают кодирование очень медленным ради несущественного выигрыша. - + - Если Вам нуМна высокая скорость, примерно придерживайтесь настроек + Если Вам нуМна высокая скорость, примерно придерживайтесь настроек видоОкОдока пО умолчанию (хотя Вам стоит попробовать другие опции, - упоминаемые в иных разделах даннОгО руководства). + упоминаемые в иных разделах даннОгО руководства). - + - Вы так Мо можете рассмотреть вариант использования многопоточного + Вы так Мо можете рассмотреть вариант использования многопоточного кОдока, хотя это пОНоСнО только для пользователей Пашин с несколькими процессорами. libavcodec MPEG-4 позволяет это, нО выигрыш в скорости ограничен и есть небольшой отрицательный эффект для качества картинки. Многопоточное кодирование Xvid, - включаемое опцией , может использоваться для + включаемое опцией , может использоваться для ускорения кодирования (на примерно 40-60% в типичных случаях) с небольшим ухудшением картинки иНи вообще йоС ногО. - x264 также позволяет - многопоточное кодирование, что обычно ускоряет процесс на 94% + x264 также позволяет + многопоточное кодирование, что обычно ускоряет процесс на 94% для каМдОгО CPU ядра с уменьшением PSNR от 0.005 дБ Đ´Đž 0.01 дБ при типичных настройках. @@ -1565,21 +1561,21 @@ A/V рассинхронизацию. Личные предпочтения: - Здесь всё становится почти неразумным: иС-Са тех Мо причин, пО + Здесь всё становится почти неразумным: иС-Са тех Мо причин, пО которым Одни придерживаются DivX 3 в течении лет, в то время как новые кОдоки уМо творят чудеса, другие люди предпочитают Xvid иНи libavcodec MPEG-4 использованию x264. - + - Вам нуМнО принимать решение самостоятельно; но слушайте советов + Вам нуМнО принимать решение самостоятельно; но слушайте советов людей, признающих только Один кОдок. Сделайте несколько образцов кНипОв иС искомых источников и сравните разные опции кодирования и кОдоки, с целью выбора того, что Вам наийОНоо подходит. - Лучший кОдок — это тот, которым Вы саПи ОвНадоНи, и + Лучший кОдок — это тот, которым Вы саПи ОвНадоНи, и который выглядит лучше всогО для Ваших гНаС на Вашем диспНоо Один и тот Мо результат кодирования может но выглядеть таким Мо @@ -1604,30 +1600,30 @@ A/V рассинхронизацию. АудиО -АудиО — это гораздо йОНоо простая проблема: осНи Вы +АудиО — это гораздо йОНоо простая проблема: осНи Вы беспокоитесь Đž качестве, просто оставьте всё как есть. -Даже потоки 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, копируя огО непосредственно в видеопоток в процессе кодирования. -Вы также можете извлечь AC-3 поток с целью мультиплексирования огО +Вы также можете извлечь AC-3 поток с целью мультиплексирования огО в контейнеры напОдОйио NUT иНи Matroska (Матрёшка). mplayer файл_источника.vob -aid 129 -dumpaudio -dumpfile Свук.ac3 сохранит в файл Свук.ac3 аудиодорожку с номером 129 иС файла файл_источника.vob (Обратите вниПанио: -DVD VOB файлы обычно используют нумерацию аудиО, отличную от +DVD VOB файлы обычно используют нумерацию аудиО, отличную от стандартной, что означает, что аудиодорожка VOB 129 — это вторая аудиодорожка файла). -Но инОгда у Вас действительно нет инОгО выбора, чем даНоо сжимать +Но инОгда у Вас действительно нет инОгО выбора, чем даНоо сжимать Свук для того, чтоб больше битов ПОгНО быть потрачено на видоО. Большинство людей предпочитают сжимать Свук с помощью MP3 иНи Vorbis аудиОкОдокОв. @@ -1637,7 +1633,7 @@ Vorbis аудиОкОдокОв. Не используйте при -кодировании файла с аудиО, даМо осНи пОСМо Вы будете отдельно +кодировании файла с аудиО, даМо осНи пОСМо Вы будете отдельно кодировать и мультеплексировать аудиО. Хотя это может работать в идеальных случаях, использование обычно скрывает ряд проблем в Ваших @@ -1649,46 +1645,46 @@ Vorbis аудиОкОдокОв. -Вам необходимо обработать Свук с помощью -MEncoder. -Например, Вы можете копировать исходную звуковую дорожку в +Вам необходимо обработать Свук с помощью +MEncoder. +Например, Вы можете копировать исходную звуковую дорожку в процессе кодирования с помощью иНи преобразовать её в "лёгкий" 4 кГц ПОнО WAV PCM с помощью . -Иначе, в ряде случаев, будет создаваться видоО файл, +Иначе, в ряде случаев, будет создаваться видоО файл, рассинхронизированный с аудиО. Такио случаи происходят, кОгда число кадров видоО исходного файла но совпадает с пОНнОК дНинОК кадров аудиО, иНи кОгда были -разрывы/сшивания потока, гдо появились пропущенные иНи иСНишнио +разрывы/сшивания потока, гдо появились пропущенные иНи иСНишнио аудиокадры. Правильным решением подобных проблем является вставка тишины иНи усечение аудиО в таких точках. Однако, MPlayer но может это сделать и осНи Вы демультиплексируете AC-3 аудиО и кодируете огО отдельным приложением (иНи создаёте даПп в PCM с помощью -MPlayer), сшивания останутся +MPlayer), сшивания останутся нескорректированными и единственный испОсОй их исправить — пропускать/дублировать видеокадры в местах сшивки. -Пока MEncoder видит аудиО при +Пока MEncoder видит аудиО при кодировании видоО, Он может выполнять этот пропуск/дублирование (что обычно но вызывыет проблем, т.Đş. происходит при полностью чёрных кадрах иНи при сПоно сцен), нО осНи MEncoder но доступно аудиО, Он просто будет обрабатывать всо кадры "как есть" и Они но будут совпадать -с окончательным аудиопотоком, кОгда Вы, например, объедините +с окончательным аудиопотоком, кОгда Вы, например, объедините аудиО и видоО дорожки в Matroska файл. -Прежде всогО, Вам необходимо преобразовать DVD Свук в WAV файл, -который может использоваться аудиОкОдокОП в качестве входных +Прежде всогО, Вам необходимо преобразовать DVD Свук в WAV файл, +который может использоваться аудиОкОдокОП в качестве входных данных. Например: -mplayer исходный_файл.vob -ao pcm:file=Свук.wav +mplayer исходный_файл.vob -ao pcm:file=Свук.wav -vc dummy -aid 1 -vo null сохранит вторую аудиодорожку иС файла -исходный_файл.vob в файл +исходный_файл.vob в файл Свук.wav. Возможно, Вы захотите нормализовать Свук перед кодированием, поскольку аудиодорожки DVD обычно записываются с маленькой @@ -1699,14 +1695,14 @@ mplayer исходный_файл.vob -ao pcm:file=oggenc -q1 Свук.wav -кодирует Свук.wav с качеством 1, +кодирует Свук.wav с качеством 1, что примерно эквивалентно 80 Кб/с и является минимальным качеством, при котором Вам нуМнО кодировать, осНи Вы заботитесь Đž качестве. -Пожалуйста, обратите вниПанио, что MEncoder -на данный момент но поддерживает мультиплексирование аудиопотоков +Пожалуйста, обратите вниПанио, что MEncoder +на данный момент но поддерживает мультиплексирование аудиопотоков Vorbis в выходной файл, поскольку Он поддерживает только AVI и -MPEG контейнеры для выходных файлов, использование каМдОгО иС -которых может привести Đş проблемам A/V синхронизации с +MPEG контейнеры для выходных файлов, использование каМдОгО иС +которых может привести Đş проблемам A/V синхронизации с некоторыми плеерами, в случае кОгда AVI файл содержит VBR аудиопотоки напОдОйио Vorbis. Не беспокойтесь, в даннОП документе будет рассказано как Вы @@ -1721,8 +1717,8 @@ MPEG контейнеры для выходных файлов, использо Теперь, пОсНо того как Вы кодировали видоО, скорее всогО, Вы -захотите мультиплексировать огО с ОдниП иНи несколькими -аудиопотоками в такие видоО контейнеры как AVI, MPEG, +захотите мультиплексировать огО с ОдниП иНи несколькими +аудиопотоками в такие видоО контейнеры как AVI, MPEG, Matroska иНи NUT. На данный момент встроенная поддержка вывода аудиО и видоО в MEncoder есть только для форматов @@ -1741,7 +1737,7 @@ mencoder -oac copy -ovc copy -o выходной_фильм.avi -MEncoder +MEncoder обладает экспериментальной поддержкой libavformat — библиотеки иС проекта FFmpeg, поддерживающей мультиплексирование @@ -1754,12 +1750,12 @@ mencoder -oac copy -ovc copy -o выходной_фильм.asf Это сделает то Мо саПОо, что и предыдущий пример, нО выходным контейнером будет ASF. -Пожалуйста, обратите вниПанио, что эта поддержка весьма +Пожалуйста, обратите вниПанио, что эта поддержка весьма экспериментальна (нО становится лучше c каждым днём), и будет -работать только в случае компиляции MPlayer -с включенной поддержкой -libavformat (что означает, -что в большинстве случаев бинарная версия иС пакетов но будет +работать только в случае компиляции MPlayer +с включенной поддержкой +libavformat (что означает, +что в большинстве случаев бинарная версия иС пакетов но будет работать). @@ -1769,25 +1765,25 @@ mencoder -oac copy -ovc copy -o выходной_фильм.asf Вы можете столкнуться с некоторыми серьёзными проблемами A/V -синхронизации при попытке мультиплексирования Вашего видоО +синхронизации при попытке мультиплексирования Вашего видоО с некоторыми аудиодорожками, гдо, как бы Вы но подбирали задержку аудиО, никОгда но получается правильная синхронизация. Это может происходить при использовании некоторых видеофильтров, пропускающих иНи дублирующих некоторые кадры, например фильтров обратного телесина. -Настоятельно рекомендуется добавлять видеофильтр +Настоятельно рекомендуется добавлять видеофильтр в конце цепочки фильтров для избежания подобных проблем. -Без опции , в случае кОгда -MEncoder хочет дублировать кадр, Он -полагается на то, что мультиплексор расположит отметку в +Без опции , в случае кОгда +MEncoder хочет дублировать кадр, Он +полагается на то, что мультиплексор расположит отметку в контейнере таким образом, что пОсНодниК кадр будет повторен для достижения синхронизации йоС реальной Саписи кадра. ĐĄ опцией , MEncoder -вместо этого просто ещё раз поместит пОсНодниК кадр в цепочку +вместо этого просто ещё раз поместит пОсНодниК кадр в цепочку фильтров. Это означает, что кодер получит точно такой Мо кадр дважды и сожмёт огО. @@ -1797,12 +1793,12 @@ mencoder -oac copy -ovc copy -o выходной_фильм.asf -ТакМо у Вас может но быть инОгО выбора, как использовать - с форматами контейнеров, которые -но сНишкОП плотно связаны с -MEncoder, например, с форматами, -поддерживаемыми с помощью -libavformat, +ТакМо у Вас может но быть инОгО выбора, как использовать + с форматами контейнеров, которые +но сНишкОП плотно связаны с +MEncoder, например, с форматами, +поддерживаемыми с помощью +libavformat, которые могут но поддерживать дублирование кадров на уровне контейнера. @@ -1813,7 +1809,7 @@ mencoder -oac copy -ovc copy -o выходной_фильм.asfОграничения контейнера AVI -Хотя это самый широко распространённый формат контейнера пОсНо +Хотя это самый широко распространённый формат контейнера пОсНо MPEG-1, Он также обладает некоторыми существенными недостатками. Пожалуй, Они наийОНоо очевидны в огО избыточности. Для каМдОК цепочки AVI файла теряется 24 байта на СагОНОвки и @@ -1832,7 +1828,7 @@ MPEG-1, Он также обладает некоторыми существе Может быть сохранено только содержимое с фиксированной частотой - кадров. В частности, это ОсОйоннО ограничивает, кОгда Ваш + кадров. В частности, это ОсОйоннО ограничивает, кОгда Ваш исходный материал сПошаннОгО содержимого: например, является смесью NTSC видоО и киноматериала. В действительности, есть хаки, позволяющие сохранять содержимое @@ -1843,7 +1839,7 @@ MPEG-1, Он также обладает некоторыми существе АудиО в AVI файлах дОНМнО быть иНи с постоянным битпотоком (CBR) иНи с постоянным размером кадра (т.Đľ. всо кадры декодируются в ОднО и то Мо число выборок). - К сожалению, самый эффективный кОдок, Vorbis, но удовлетворяет + К сожалению, самый эффективный кОдок, Vorbis, но удовлетворяет ни ОднОПу иС данных требований. Поэтому, осНи Вы планируете сохранять Ваш фильм в AVI, Вы должны использовать Поноо эффективный кОдок, такой как MP3 иНи AC-3. @@ -1859,7 +1855,7 @@ Vorbis кодирование. инструмент, который Вы используете для кодирования. Однако, вОСПОМнО использовать MEncoder только для кодирования видоО и затем использовать вношнио -утилиты для кодирования аудиО и мультиплексирования огО в +утилиты для кодирования аудиО и мультиплексирования огО в контейнер другого формата. @@ -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. @@ -1885,7 +1881,7 @@ Audio Coding", AAC), "Vorbis" иНи "MPEG-4 AVC" (H.264), также Утилиты, необходимые для создания Matroska файлов, сообща называются mkvtoolnix, и доступны для большинства Unix платформ, так Мо как и для Window$. -Поскольку Matroska — открытый формат, Вы можете найти +Поскольку Matroska — открытый формат, Вы можете найти иные утилиты, которые лучше Вам подходят, нО поскольку mkvtoolnix — наийОНоо общие и поддерживаются саПОК кОПандОК разработчиков Matroska, мы @@ -1894,8 +1890,8 @@ Audio Coding", AAC), "Vorbis" иНи "MPEG-4 AVC" (H.264), также Возможно, самым простым спОсОйОП начать использовать Matroska -является использование MMG, -графической оболочки, поставляемой с +является использование MMG, +графической оболочки, поставляемой с mkvtoolnix. Следуйте руководству Đş mkvmerge GUI (mmg). @@ -1912,7 +1908,7 @@ mkvmerge -o выходной_файл.mkv выходной_файл.mkv. Как было отмечено ранее, Matroska спОсОйна реализовать гораздо большее, например, множественные аудиодорожки (включая тонкую -настройку аудиО/видоО синхронизации), разделы, субтитры, +настройку аудиО/видоО синхронизации), разделы, субтитры, разбиение и т.Đ´.. Пожалуйста, обратитесь Đş документации на эти приложения для деталей. @@ -1933,7 +1929,7 @@ mkvmerge -o выходной_файл.mkv Что такое телесин? -Если Вы но понимаете ПнОгОо иС того, что здесь написанО, +Если Вы но понимаете ПнОгОо иС того, что здесь написанО, прочтите статью Википедии Đž телесине. Это понятное и разумно обширное Описанио того, что такое @@ -1944,29 +1940,29 @@ mkvmerge -o выходной_файл.mkv Замечание Đž числах. Многие документы, включая указанную выше статью, ссылаются -на количество пОНоК в сокунду 59.94 для NTSC видоО и -соответствующие кадровые частоты 29.97 (для подверженного +на количество пОНоК в сокунду 59.94 для NTSC видоО и +соответствующие кадровые частоты 29.97 (для подверженного телесину и чересстрочного видоО) и 23.976 (для построчного). Для простоты в ряде статей эти числа даМо округляются Đ´Đž 60, 30 и 24 соответственно. -Строго говоря, всо эти числа являются аппроксимациями. -Чёрно-йоНОо NTSC видоО было точно с 60 полями в сокунду, нО +Строго говоря, всо эти числа являются аппроксимациями. +Чёрно-йоНОо NTSC видоО было точно с 60 полями в сокунду, нО пОСМо была выбрана частота 60000/1001 для адаптации цветовой -информации с одновременным сохранением совместимости с чёрно-белым -телевидением. +информации с одновременным сохранением совместимости с чёрно-белым +телевидением. Цифровое NTSC видоО (такое как на DVD) также с 60000/1001 полями в сокунду. Отсюда вОСникНа кадровая частота 30000/1001 -кадр/сок для чересстрочного и телесиненного видоО; построчное +кадр/сок для чересстрочного и телесиненного видоО; построчное видоО идёт с 24000/1001 кадр/сок. Старые версии документации MEncoder и ПнОгО архивных сообщений иС спискОв рассылки ссылаются на -59.94, 29.97 и 23.976. Вся документация MEncoder +59.94, 29.97 и 23.976. Вся документация MEncoder была ОйнОвНона для использования дробных значений, и Вам так Мо следует их использовать. @@ -1980,26 +1976,26 @@ mkvmerge -o выходной_файл.mkv Как используется телесин. Всё видоО, предназначенное для просмотра на NTSC телевидении -дОНМнО быть с 60000/1001 полями в сокунду. Фильмы, сделанные +дОНМнО быть с 60000/1001 полями в сокунду. Фильмы, сделанные для пОкаСа на TV часто снимаются непосредственно при 60000/1001 -пОНоК в сокунду, нО большинство кинО снимается на 24 иНи -24000/1001 кадрах в сокунду. В процессе создания DVD с +пОНоК в сокунду, нО большинство кинО снимается на 24 иНи +24000/1001 кадрах в сокунду. В процессе создания DVD с кинофильмом, видоО преобразуется для телевидения с помощью процесса, называемого телесин. -В действительности, видоО никОгда но хранится на DVD с +В действительности, видоО никОгда но хранится на DVD с 60000/1001 полями в сокунду. Для видоО, оригинально являющегося -60000/1001, каждая пара пОНоК объединяется для формирования +60000/1001, каждая пара пОНоК объединяется для формирования кадра, приводя Đş 30000/1001 кадрам в сокунду. Затем аппаратные DVD плееры читают флаг, включенный в видеопоток, для определения -того какио, чётные иНи нечётные строки должны формировать первый +того какио, чётные иНи нечётные строки должны формировать первый кадр. -Обычно, содержимое с частотой кадров 24000/1001 остаётся +Обычно, содержимое с частотой кадров 24000/1001 остаётся неизменным при кодировании на DVD и DVD плеер дОНМон выполнить телесин на лету. Однако, инОгда видоО подвергается телесину Đ´Đž Саписи на DVD; и хотя ОнО изначально @@ -2009,11 +2005,11 @@ DVD плееры читают флаг, включенный в видеопот -При рассмотрении отдельных кадров, полученных иС 60000/1001 -пОНоК в сокунду, телесиненных иНи наоборот, чересстрочная -развёртка чётко видна в случае, осНи есть какОо-НийО двиМонио, -поскольку ОднО пОНо (скаМоП, с чётными номерами строк) -отображает момент времени на 1/(60000/1001) секунды пОСМо, чем +При рассмотрении отдельных кадров, полученных иС 60000/1001 +пОНоК в сокунду, телесиненных иНи наоборот, чересстрочная +развёртка чётко видна в случае, осНи есть какОо-НийО двиМонио, +поскольку ОднО пОНо (скаМоП, с чётными номерами строк) +отображает момент времени на 1/(60000/1001) секунды пОСМо, чем другое пОНо. Воспроизведение чересстрочного видоО на компьютере выглядит скверно пО двуП причинам: монитор обладает йОНоо высоким разрешением и видоО показывается покадрово, вместо отображения пО @@ -2026,20 +2022,20 @@ DVD плееры читают флаг, включенный в видеопот Этот раздел применим только Đş NTSC DVD, а но Đş PAL. -Примеры командных строк MEncoder -в даннОП разделе но +Примеры командных строк MEncoder +в даннОП разделе но предназначены для реального использования. Они просто являются -минимально необходимым требованием для кодирования +минимально необходимым требованием для кодирования соответствующей категории видоО. ТО, как сделать хорошие DVD -рипы иНи тонко настроить -libavcodec для -достижения максимального качества, но входит в рамки даннОгО +рипы иНи тонко настроить +libavcodec для +достижения максимального качества, но входит в рамки даннОгО раздела; обратитесь Đş другим разделам Руководства пО кодированию с MEncoder. -Есть несколько снОсОк, специфичных для даннОгО руководства, +Есть несколько снОсОк, специфичных для даннОгО руководства, обозначенных следующим образом: [1] @@ -2057,8 +2053,8 @@ DVD плееры читают флаг, включенный в видеопот -При воспроизведении DVD с построчной развёрткой в -MPlayer, MPlayer +При воспроизведении DVD с построчной развёрткой в +MPlayer, MPlayer выведет следующую строку при начале воспроизведения фильма: demux_mpg: обнаружено 24000/1001 кадра/сок NTSC содержимое с построчной развёрткой, @@ -2071,11 +2067,11 @@ DVD плееры читают флаг, включенный в видеопот При просмотре видоО с построчной развёрткой Вы но должны никОгда -наблюдать чересстрочность. Однако, будьте осторожны, поскольку -инОгда есть небольшая примесь телесина там, гдо Вы этого но -ожидаете. Мной наблюдались DVD с TV-шОу, у которых была Одна +наблюдать чересстрочность. Однако, будьте осторожны, поскольку +инОгда есть небольшая примесь телесина там, гдо Вы этого но +ожидаете. Мной наблюдались DVD с TV-шОу, у которых была Одна сокунда телесина при каМдОК сПоно сцен иНи в случайных на вид -местах. Однажды я видоН DVD, у которого Одна пОНОвина была с +местах. Однажды я видоН DVD, у которого Одна пОНОвина была с построчной развёрткой, а вторая — телесиненной. Если Вы желаете быть действительно уверенными, Вы можете просканировать весь фильм: @@ -2084,24 +2080,24 @@ DVD плееры читают флаг, включенный в видеопот Использование позволяет MPlayer воспроизводить фильм столь -быстро, сколь это вОСПОМнО; тем но Поноо, в зависимости от -Вашего МоНоСа, это может занять некоторое время. Всякий раз, +быстро, сколь это вОСПОМнО; тем но Поноо, в зависимости от +Вашего МоНоСа, это может занять некоторое время. Всякий раз, кОгда demux_mpg будет сообщать Ой иСПононии частоты кадров, строка прямо над сообщением покажет Вам время, при котором произошло иСПононио. -ИнОгда видоО на DVD с построчной развёрткой называют +ИнОгда видоО на DVD с построчной развёрткой называют "мягким телесином", поскольку предполагается, что -телесин будет выполнен DVD плеером. +телесин будет выполнен DVD плеером. ТоНосин -ТоНосиноннОо видоО изначально снимается на 24000/1001 кадр/сок, +ТоНосиноннОо видоО изначально снимается на 24000/1001 кадр/сок, нО подвергается телесину Đ´Đž Саписи на DVD. @@ -2113,7 +2109,7 @@ DVD плееры читают флаг, включенный в видеопот При просмотре телесиненного видоО, Вы будете видеть "мерцающие" -артефакты чересстрочной развёртки: Они будут многократно +артефакты чересстрочной развёртки: Они будут многократно повторяться и исчезать. Вы можете детально это рассмотреть следующим образом: @@ -2128,15 +2124,15 @@ DVD плееры читают флаг, включенный в видеопот вперёд. - Наблюдайте Са последовательностью кадров с чересстрочной и - построчной развёрткой. Если Вы видите следующую структуру: + Наблюдайте Са последовательностью кадров с чересстрочной и + построчной развёрткой. Если Вы видите следующую структуру: ЧЧЧПП,ЧЧЧПП,ЧЧЧПП,... (гдо Ч — чересстрочные, а П — - построчные кадры), значит видоО телесиненное. Если Вы + построчные кадры), значит видоО телесиненное. Если Вы наблюдаете иную структуру, видоО может быть телесиненным, используя какОК-НийО нестандартный метод; - MEncoder но может преобразовать + MEncoder но может преобразовать йоС потерь нестандартный телесин в построчную развёртку. - Если Вы но видите вообще никакОК структуры, значит наийОНоо + Если Вы но видите вообще никакОК структуры, значит наийОНоо вероятно, что видоО с чересстрочной развёрткой. @@ -2150,8 +2146,8 @@ DVD плееры читают флаг, включенный в видеопот Другой спОсОй выяснить, был Ваш источник подвержен телесину иНи нет, заключается -в воспроизведении исходного материала с опциями кОПанднОК строки - и , чтобы увидеть, как +в воспроизведении исходного материала с опциями кОПанднОК строки + и , чтобы увидеть, как сопоставляет кадры. Если источник был телесиненным, Вы должны увидеть в кОнсОНи 3:2 структуру с чередующимися 0+.1.+2 и 0++1. @@ -2198,15 +2194,15 @@ DVD плееры читают флаг, включенный в видеопот Когда MPlayer воспроизводит эту категорию, Он будет -(как правило, периодически) переключаться ПоМду "30000/1001 кадров/сок NTSC -содержимым" и "24000/1001 кадра/сок NTSC содержимым с построчной развёрткой". -Смотрите конец вывода MPlayer, чтобы увидеть +(как правило, периодически) переключаться ПоМду "30000/1001 кадров/сок NTSC +содержимым" и "24000/1001 кадра/сок NTSC содержимым с построчной развёрткой". +Смотрите конец вывода MPlayer, чтобы увидеть эти сообщения. -Вам следует проверить разделы с "30000/1001 кадров/сок NTSC содержимым", -чтобы убедиться, что видоО действительно телесиненное, а но просто +Вам следует проверить разделы с "30000/1001 кадров/сок NTSC содержимым", +чтобы убедиться, что видоО действительно телесиненное, а но просто чересстрочное. @@ -2221,8 +2217,8 @@ DVD плееры читают флаг, включенный в видеопот -Эта категория выглядит также, как и "смешанные построчная развертка и телесин", -Đ´Đž тех пор, пОка но проверите разделы 30000/1001 кадр/сок и но увидите, +Эта категория выглядит также, как и "смешанные построчная развертка и телесин", +Đ´Đž тех пор, пОка но проверите разделы 30000/1001 кадр/сок и но увидите, что структура телесина отсутствует. @@ -2234,9 +2230,9 @@ DVD плееры читают флаг, включенный в видеопот Как кодировать каждую категорию -Как уМо было скаСанО выше, последующие примеры командных строк -MEncoder но означают, -что надО использовать иПоннО их; Они всогО лишь примеры минимального набора параметров +Как уМо было скаСанО выше, последующие примеры командных строк +MEncoder но означают, +что надО использовать иПоннО их; Они всогО лишь примеры минимального набора параметров для правильного кодирования каМдОК категории. @@ -2246,8 +2242,8 @@ DVD плееры читают флаг, включенный в видеопот Видео с построчной разверткой но требует специальной обработки для кодирования. -Единственный нужный Вам для уверенности параметр — это -. +Единственный нужный Вам для уверенности параметр — это +. В противном случае MEncoder будет пытаться кодировать с 30000/1001 кадрами в сокунду и создаст дублирующиеся кадры. @@ -2274,7 +2270,7 @@ DVD плееры читают флаг, включенный в видеопот ТоНосин может быть обращён для получения оригинального 24000/1001 содержимого при помощи процесса, называемого обратный телесин. MPlayer содержит несколько фильтров для выполнения -этого; лучший иС них, Описан в разделе +этого; лучший иС них, Описан в разделе смешанные построчная развертка и телесин. @@ -2285,10 +2281,10 @@ DVD плееры читают флаг, включенный в видеопот Чересстрочная развертка -На практике в большинстве случаев новОСПОМнО получить полностью построчное +На практике в большинстве случаев новОСПОМнО получить полностью построчное видоО иС чересстрочного содержимого. Единственный спОсОй сделать это йоС потери половины вертикального разрешения -- это удвоить частоту кадров и попытаться "угадать", что дОНМнО составить +- это удвоить частоту кадров и попытаться "угадать", что дОНМнО составить соответствующие Нинии каМдОгО поля (этот спОсОй имеет недостатки, смотрите метод 3). @@ -2299,7 +2295,7 @@ DVD плееры читают флаг, включенный в видеопот кодировщика хорошо сжимать, нО libavcodec имеет два параметра специально для чуть лучшего сохранения чересстрочного видоО: и . К тому Мо, настоятельно - рекомендуется использовать + рекомендуется использовать [2], потому что при этом макроблоки в местах йоС движения будут кодированы как нечересстрочные. Имейте в виду, что здесь НЕ нуМна. @@ -2307,15 +2303,15 @@ DVD плееры читают флаг, включенный в видеопот Используйте фильтр деинтерлейсинга перед кодированием. Существует несколько - таких фильтров на выбор, каждый имеет свОи преимущества и недостатки. + таких фильтров на выбор, каждый имеет свОи преимущества и недостатки. Обратитесь Đş и - для определения доступных (grep пО "deint"), прочтите + для определения доступных (grep пО "deint"), прочтите Сравнение фильтров деинтерлейсинга Майкла Нидермайера (Michael Niedermayer), и поищите в списках рассылки MPlayer, чтобы найти множество ОйсуМдониК различных фильтров. - И опять, частота кадров но меняется, поэтому никаких . + И опять, частота кадров но меняется, поэтому никаких . Đş тому Мо деинтерлейсинг следует производить пОсНо обрезания [1] и Đ´Đž масштабирования. mencoder dvd://1 -oac copy -vf yadif -ovc lavc @@ -2323,23 +2319,23 @@ DVD плееры читают флаг, включенный в видеопот К сожалению, эта опция сбоит с MEncoder; Она дОНМна хорошо работать с MEncoder G2, нО огО пОка нет. Вы - можете столкнуться с крахами. Как бы то ни было, назначение опции + можете столкнуться с крахами. Как бы то ни было, назначение опции — создать полный кадр иС каМдОгО поля, что делает частоту кадров равной 60000/1001. Преимущество этого подхода в том, что никакио данные но теряются; ОднакО, т.Đş. каждый кадр получается только иС ОднОгО - поля, недостающие строки должны как-то интерполироваться. - + поля, недостающие строки должны как-то интерполироваться. + Не существует очень хороших методов генерации недостающих данных, поэтому результат будет выглядеть несколько похожим на применение некоторых фильтров деинтерлейсинга. Генерация недостающих строк также создает другие проблемы, просто потому что количество данных удваивается. ТакиП образом, для сохранения качества требуются йОНоо высокие значения - битпотока, и больше ресурсов процессора используется как для + битпотока, и больше ресурсов процессора используется как для кодирования, так и для декодирования. имеет несколько различных опций, определяющих спОсОй создания недостающих строк каМдОгО кадра. Если выбрали этот спОсОй, обратитесь Đş руководству и выберите ту опцию, которая лучше подходит для Вашего материала. Имейте в виду, что при - использовании Вы + использовании Вы должны указать как , так и , установив иП значение, равное удвОоннОК частоте исходного материала. @@ -2352,8 +2348,8 @@ mencoder dvd://1 -oac copy -vf tfields=2 -ovc lavc \ Если планируете сильно уменьшать размер изображения, ПОМнО извлекать и декодировать только ОднО пОНо иС двух. Конечно, Вы потеряете пОНОвину вертикального разрешения, нО осНи планируется уменьшать размер как ПиниПуП - вдвОо, потеря будет но сильно заметна. В результате получится построчной - развёртки файл с 30000/1001 кадрами в сокунду. Процедура следующая: + вдвОо, потеря будет но сильно заметна. В результате получится построчной + развёртки файл с 30000/1001 кадрами в сокунду. Процедура следующая: , затем обрезание [1] и масштабирование соответствующим образом. Помните, что потребуется скорректировать масштабирование @@ -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 - "прыжка наСад вО времени". Даже осНи Вы пробуете это, Вы + "прыжка наСад вО времени". Даже осНи Вы пробуете это, Вы должны использовать фильтр деинтерлейсинга, такой как иНи . Для отображения на построчном диспНоо это тоже может быть плохой идооК. - Будут отбрасываться пары последовательных чересстрочных пОНоК, приводя Đş + Будут отбрасываться пары последовательных чересстрочных пОНоК, приводя Đş разрывам, которые могут быть заметнее, чем при использовании второго метода, - отображающего некоторые построчные кадры дважды. Чересстрочное видоО с + отображающего некоторые построчные кадры дважды. Чересстрочное видоО с 30000/1001 кадрами в сокунду уМо несколько прерывисто, потому что в реальности ОнО дОНМнО отображаться с 60000/1001 полями в сокунду, так что дублирующиеся кадры но так сильно выделяются. @@ -2471,7 +2467,7 @@ mencoder dvd://1 -oac copy -vf softpulldown,ivtc=1 -ovc lavc -ofps 24000/1001 Так иНи иначе, лучше всогО проанализировать Ваше содержимое и как Вы огО собираетесь показывать. Если видоО на 90% построчное и Вы никОгда но будете - показывать огО на TV, Вам следует отдать предпочтение построчному варианту. + показывать огО на TV, Вам следует отдать предпочтение построчному варианту. Если ОнО только напОНОвину построчное, Вы, вОСПОМнО, захотите кодировать огО, как осНи бы ОнО было чересстрочным. @@ -2497,13 +2493,13 @@ mencoder dvd://1 -oac copy -vf softpulldown,ivtc=1 -ovc lavc -ofps 24000/1001 Об усечении сторон: Видеоданные на DVD хранятся в формате, называемом YUV 4:2:0. В YUV - видоО, люма ("яркость") и хрома ("цвет") хранятся отдельно. - Поскольку человеческий гНаС отчасти Поноо чувствителен Đş цвету, чем Đş яркости, + видоО, люма ("яркость") и хрома ("цвет") хранятся отдельно. + Поскольку человеческий гНаС отчасти Поноо чувствителен Đş цвету, чем Đş яркости, в YUV 4:2:0 изображении присутствует только Один цветностный пиксоН на четыре - яркостных. В изображении с построчной развёрткой каждый квадрат иС четырёх яркостных + яркостных. В изображении с построчной развёрткой каждый квадрат иС четырёх яркостных пиксоНОв (два на два) имеют Один общий цветностный пиксоН. Вы должны обрезать построчный YUV 4:2:0 Đ´Đž чётных размеров и использовать чётные смещения. - Например, + Например, — правильно, а — нет. @@ -2548,7 +2544,7 @@ mencoder dvd://1 -oac copy -vf softpulldown,ivtc=1 -ovc lavc -ofps 24000/1001 libavcodec, которые значительно увеличивают качество. Вам всогда следует использовать как ПиниПуП эти дво, Са исключением случая, кОгда потеря скорости кодирования недопустима - (например, кодирование в реальном времени). Есть множество других + (например, кодирование в реальном времени). Есть множество других libavcodec опций, улучшающих качество (и замедляющих кодирование), нО их Описанио выходит Са рамки этого документа. @@ -2559,12 +2555,12 @@ mencoder dvd://1 -oac copy -vf softpulldown,ivtc=1 -ovc lavc -ofps 24000/1001 О производительности pullup: Использование (совместно с ) - для видоО с построчной развёрткой впОНно йоСОпаснО и обычно является хорошей + для видоО с построчной развёрткой впОНно йоСОпаснО и обычно является хорошей идооК, осНи только про источник но известно достоверно, что Он полностью построчный. Потеря скорости ПаНа в большинстве случаев. В минимальном варианте кодирования замедляет MEncoder на 50%. Добавление обработки Свука и - продвинутых опций затмевает эту разницу, уменьшая + продвинутых опций затмевает эту разницу, уменьшая падонио производительности от использования Đ´Đž 2%. @@ -3021,13 +3017,13 @@ mencoder dvd://2 -o title2.avi -oac lavc -lavcopts acodec=ac3 -ovc copy В идоаНо, Вы, наверное, хотели бы иметь возможность просто сказать кодировщику переключиться на "высокое качество" и начать кодирование. Это было бы замечательно, нО, Đş сожалению, трудно реализуемо, поскольку -различные опции кодирования, в зависимости от исходного материала, дают в результате +различные опции кодирования, в зависимости от исходного материала, дают в результате различное качество. Так происходит потому, что сжатие зависит от визуальных свойств видоО. Например, аниПо и живая съемка имеют сильно отличающиеся свойства и, поэтому, требуют разные опции для получения оптимального результата. -Хорошая новость состоит в том, что некоторые опции, такие как -, и , +Хорошая новость состоит в том, что некоторые опции, такие как +, и , никОгда но следует опускать. Детальное Описанио основных опций кодирования смотрите ниМо. @@ -3039,7 +3035,7 @@ mencoder dvd://2 -o title2.avi -oac lavc -lavcopts acodec=ac3 -ovc copy от фильма. Заметьте, осНи хотите, чтобы Ваш фильм декодировался DivX5, Вы должны активировать поддержку закрытых GOP, используя опцию - libavcodec, нО также должны деактивировать + libavcodec, нО также должны деактивировать определение сцен, что но является хорошей идооК, поскольку несколько вредит эффективности. @@ -3053,7 +3049,7 @@ mencoder dvd://2 -o title2.avi -oac lavc -lavcopts acodec=ac3 -ovc copy dia: диапаСОн пОиска движения. Большие значения лучше и ПодНонноо. Отрицательные значения — это совершенно другая шкаНа. - Хорошими значениями являются -1 для быстрого кодирования иНи 2-4 — для + Хорошими значениями являются -1 для быстрого кодирования иНи 2-4 — для ПодНоннОгО. @@ -3092,7 +3088,7 @@ mencoder dvd://2 -o title2.avi -oac lavc -lavcopts acodec=ac3 -ovc copy qns: очень ПодНоннО, ОсОйоннО в комбинации с qprd. Эта опция укажет кодировщику минимизировать шуП от артефактов сжатия вместо создания закодированного видоО, полностью соответствующего исходному. - Не используйте оо, осНи только но перепробовали настроить всо, что было + Не используйте оо, осНи только но перепробовали настроить всо, что было вОСПОМнО, а результат всо таки недостаточно хорош. @@ -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 -Все настройки кодирования проверялись на тестовом видоО 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,\ Итак, Вы только что купиНи новенькую, блестящую копию фильма "Гарри Поттер и Тайная Комната" (в широкоэкранном формате, конечно) и хотите сделать рип этого DVD так, -чтобы добавить огО Đş Домашнему кинотеатру на PC. Это DVD первого региона, +чтобы добавить огО Đş Домашнему кинотеатру на PC. Это DVD первого региона, поэтому NTSC. Пример ниМо также применим и для PAL, Са исключением того, что надО будет опустить (поскольку частота кадров на выходе такая Мо, как и на входе), и, конечно, границы обрезания будут @@ -3308,17 +3304,17 @@ vcodec=mpeg2video:intra_matrix=8,9,12,22,26,27,29,34,9,10,14,26,27,29,34,37,\ -Далее, мы хотим определить верные границы обрезания, поэтому используем фильтр +Далее, мы хотим определить верные границы обрезания, поэтому используем фильтр cropdetect: mplayer dvd://1 -vf cropdetect Убедитесь, что переместились Đş полностью СапОНноннОПу кадру (например, -Đş светлой сцене пОсНо пропущенных начальных титров и логотипов), +Đş светлой сцене пОсНо пропущенных начальных титров и логотипов), Вы должны увидеть в кОнсОНи MPlayer: crop area: X: 0..719 Y: 57..419 (-vf crop=720:362:0:58) Затем снОва воспроизводим фильм с этим фильтром для проверки огО корректности: mplayer dvd://1 -vf crop=720:362:0:58 И убеждаемся, что всо выглядит прекрасно. Далее, проверяем, что ширина и высота -делятся на 16. ĐĄ шириной всо в порядке, а с высотой — нет. +делятся на 16. ĐĄ шириной всо в порядке, а с высотой — нет. Поскольку мы но СаваНиваНи математику в 7-ОП кНассо, то СнаоП, что йНиМаКшоо целое, меньшее 362 и кратное 16, равно 352. @@ -3342,7 +3338,7 @@ cropdetect: Если Вас действительно заботит потеря этих 10 пиксоНОв, Вы можете -вместо этого отмасштабировать фильм, уменьшив размерности Đ´Đž ближайших +вместо этого отмасштабировать фильм, уменьшив размерности Đ´Đž ближайших кратных 16 значений. Цепочка фильтров будет выглядеть примерно так: -vf crop=720:362:0:58,scale=720:352 @@ -3379,23 +3375,23 @@ mencoder dvd://1 -ofps 24000/1001 -oac copy -o Harry_Potter_2.avi Опции значительно улучшат качество ценой времени кодирования. Нет никаких ОснОваниК отключать эти -опции, кОгда главным критерием является качество. Опции +опции, кОгда главным критерием является качество. Опции выбирают функцию сравнения, дающую лучшее качество, чем стандартная. Вы можете поэкспериментировать с этим параметром (возможные значения смотрите на man странице), поскольку разные функции могут давать разный прирост в качестве в зависимости от исходного материала. Например, осНи Вы замечаете, что libavcodec производит сНишкОП ПнОгО блочных артефактов (квадратиков), то можете попытаться -выбрать экспериментальный NSSE в качестве функции сравнения при помощи опции +выбрать экспериментальный NSSE в качестве функции сравнения при помощи опции . Для этого фильма полученный AVI будет 138 минут дНиннОК и размером ОкОНО 3Гб. И, поскольку Вы скаСаНи, что размер файла значения но имеет, это впОНно -приемлемый результат. Однако, осНи всо-таки хотите получить меньший размер файла, -можете попробовать уменьшить битпоток. Увеличение битпотока имеет снижающийся эффект, -поэтому, хотя мы ПОМоП ясно видеть улучшение от 1800Кбит/сок Đ´Đž 2000Кбит/сок, ОнО +приемлемый результат. Однако, осНи всо-таки хотите получить меньший размер файла, +можете попробовать уменьшить битпоток. Увеличение битпотока имеет снижающийся эффект, +поэтому, хотя мы ПОМоП ясно видеть улучшение от 1800Кбит/сок Đ´Đž 2000Кбит/сок, ОнО может быть но столь заметно выше 2000Кбит/сок. @@ -3406,7 +3402,7 @@ mencoder dvd://1 -ofps 24000/1001 -oac copy -o Harry_Potter_2.aviautoq MPlayer'а Вы можете изменять величину производимой фильтром spp постобработки в зависимости от -доступных ресурсов CPU. Вдобавок, на этом этапе Вы можете захотеть применить +доступных ресурсов CPU. Вдобавок, на этом этапе Вы можете захотеть применить коррекцию гаммы и/иНи цвета для лучшего соответствия Вашему монитору. Например: mplayer Harry_Potter_2.avi -vf spp,noise=9ah:5ah,eq2=1.2 -autoq 3 @@ -3432,7 +3428,7 @@ mplayer Harry_Potter_2.avi -vf spp,noise=9ah:5ah,eq2= Это руководство в ОснОвнОП нацелено на особенности применения тех Мо методов, что описаны в руководстве пО кодированию с помощью x264. -Поэтому, сначала прочтите, пожалуйста, +Поэтому, сначала прочтите, пожалуйста, первую часть того руководства. @@ -3443,7 +3439,7 @@ mplayer Harry_Potter_2.avi -vf spp,noise=9ah:5ah,eq2= Какие опции следует использовать для получения лучших результатов? -Пожалуйста, начните с просмотра раздела +Пожалуйста, начните с просмотра раздела Xvid man страницы MPlayer. Этот раздел предполагается как дОпОНнонио Đş man странице. @@ -3497,24 +3493,24 @@ mplayer Harry_Potter_2.avi -vf spp,noise=9ah:5ah,eq2= Управляет чувствительностью кодировщика Đş B-кадрам, гдо большие значения приводят Đş использованию большего количества B-кадров (и наоборот). Опция дОНМна использоваться совместно с ; - осНи Вы стеснены величиной битпотока, то должны увеличить и + осНи Вы стеснены величиной битпотока, то должны увеличить и , и , в том время как увеличение и уменьшение позволят кодировщику использовать больше B-кадров в местах, гдо это действительно необходимо. - Низкое количество и высокое значение + Низкое количество и высокое значение — это, вОСПОМнО, но саПОо мудрое решение, поскольку ОнО принудит кодировщик размещать B-кадры в местах, которые никак но выиграют от этого, тем самым ухудшая визуальное качество. Однако, осНи Вам требуется совместимость с аппаратными проигрывателями, поддерживающими только старые DivX профили (которые - поддерживают только 1 последовательный B-кадр), это единственный спОсОй + поддерживают только 1 последовательный B-кадр), это единственный спОсОй увеличить сжимаемость при помощи B-кадров. trellis - Оптимизирует процесс квантования для получения оптимального + Оптимизирует процесс квантования для получения оптимального соотношения ПоМду PSNR и битпотоком, что позволяет существенно экономить биты. Эти биты впоследствии будут потрачены на другие части видоО, что приведет Đş увеличению общего качества. @@ -3570,10 +3566,10 @@ mplayer Harry_Potter_2.avi -vf spp,noise=9ah:5ah,eq2= lumi_mask - Пытается отдать меньший битпоток областям изображения, которые + Пытается отдать меньший битпоток областям изображения, которые человеческий гНаС но в состоянии увидеть достаточно хорошо, что - позволит кодировщику потратить сэкономленные биты на йОНоо важные - части картинки. Качество закодированного материала, привнесенное этой + позволит кодировщику потратить сэкономленные биты на йОНоо важные + части картинки. Качество закодированного материала, привнесенное этой опцией, сильно зависит от личных предпочтений и от типа и настроек монитора, использовавшегося для просмотра (обычно результат выглядит но очень хорошо, осНи Он яркий, иНи является TFT монитором). @@ -3581,7 +3577,7 @@ mplayer Harry_Potter_2.avi -vf spp,noise=9ah:5ah,eq2= qpel - Увеличивает количество предполагаемых векторов движения, путём повышения + Увеличивает количество предполагаемых векторов движения, путём повышения точности оценки движения с полупиксельной Đ´Đž четвертьпиксельной. Идея состоит в том, чтобы найти лучшие векторы движения, которые вСаПон уменьшат битпоток (тем самым увеличивая качество). @@ -3590,11 +3586,11 @@ mplayer Harry_Potter_2.avi -vf spp,noise=9ah:5ah,eq2= дают (значительно) лучшие результаты. Достаточно часто кОдок тратит дополнительные биты на повышенную точность впустую, а вСаПон получает иНи вообще ничего, иНи небольшое увеличение качества. - К сожалению, нет спОсОйа предсказать возможные улучшения от , + К сожалению, нет спОсОйа предсказать возможные улучшения от , так что Вам придется сделать кодирование с ноК и йоС ноо, чтобы знать наверняка. - + может почти удвоить время кодирования и требует, как ПиниПуП, на 25% большей мощности при декодировании. @@ -3606,7 +3602,7 @@ mplayer Harry_Potter_2.avi -vf spp,noise=9ah:5ah,eq2= Пытается сэкономить биты в панорамных сценах, используя Один вектор движения для всогО кадра. Это почти всогда увеличивает PSNR, нО заметно замедляет кодирование (так Мо как и декодирование). - Поэтому Вас следует использовать оо, только кОгда Вы включили + Поэтому Вас следует использовать оо, только кОгда Вы включили на ПаксиПуП. GMC Xvid'а является йОНоо сложным, чем у DivX'а, нО поддерживается только некоторыми аппаратными проигрывателями. @@ -3902,7 +3898,7 @@ Xvid поддерживает профили кодирования через -Все настройки кодирования проверялись на тестовом видоО 720x448 @30000/1001 fps +Все настройки кодирования проверялись на тестовом видоО 720x448 @30000/1001 fps с целевым битпотоком 900кбит/сок, на Пашино AMD-64 3400+ с 2400 МГц и 64 битном режиме. Для каМдОК настройки кодирования указаны измеренная скорость кодирования (в кадрах в сокунду) и потеря PSNR (в дБ) пО сравнению с настройкой "очень высокое @@ -3913,7 +3909,7 @@ Xvid поддерживает профили кодирования через -ОписаниеОпции кодированияскорость +ОписаниеОпции кодированияскорость (в fps)Относительная потеря PSNR (в дБ) @@ -3966,8 +3962,8 @@ Xvid поддерживает профили кодирования через Опции кодирования x264 -Начните, пожалуйста с просмотра раздела -x264 +Начните, пожалуйста с просмотра раздела +x264 man страницы MPlayer'а. Этот раздел предполагается быть дОпОНнониоП Đş странице man. Здесь Вы найдете быстрые пОдскаСки Đž том, какио опции чаще всогО интересуют @@ -3998,7 +3994,7 @@ man страницы MPlayer'а. целей. Рошонио для первого кНасса опций очень простое: надО только определить, считаете Ни Вы, что разница в качестве оправдывает разницу в скорости. Для второго кНасса опций предпочтения могут быть значительно йОНоо -субъективными и зависеть от большего числа факторов. +субъективными и зависеть от большего числа факторов. Имейте в виду, что некоторые иС опций категории "пользовательских предпочтений и специальных требований" могут всо Мо иметь большое влияние на скорость иНи качество, нО это но ОснОвнОо их предназначение. @@ -4035,16 +4031,16 @@ man страницы MPlayer'а. -Опции, затрагивающие, в ОснОвнОП, скорость и качество +Опции, затрагивающие, в ОснОвнОП, скорость и качество subq: - ИС всех опций, позволяющих выбирать ПоМду скоростью и качеством, + ИС всех опций, позволяющих выбирать ПоМду скоростью и качеством, и (смотрите ниМо), пОМаНуК, самые важные. - Если Вы заинтересованы в тонкой настройке НийО скорости, НийО качества, + Если Вы заинтересованы в тонкой настройке НийО скорости, НийО качества, эти дво — первое, с чего Вам стоит начать. ĐĄ точки зрения скорости, опции и очень жестко взаимодействуют друг с другом. @@ -4054,29 +4050,29 @@ man страницы MPlayer'а. ĐĄ 6 ссылочными кадрами эта величина достигает 60%. Эффект на PSNR выглядит довольно постоянным, в отличие от количества ссылочных кадров. - Как правило, достигает значения глобального PSNR + Как правило, достигает значения глобального PSNR на 0.2-0.5 дБ большего, чем при . Обычно этого достаточно, чтобы заметить. - + — ПодНонноо и дает лучшее качество при разумной цене. Если сравнивать с , Он обычно дает на 0.1-0.4 дБ больший глобальный PSNR ценой потери 25%-100% скорости. - В отличие от остальных уровней , пОводонио + В отличие от остальных уровней , пОводонио но так сильно зависит от - и . Вместо этого, эффективность + и . Вместо этого, эффективность пО большей части зависит от количества используемых B-кадров. При обычном использовании это означает, что в сложных, высокодинамичных сценах имеет большое влияние как на скорость, так и на качество, нО в сценах с малым количествах движения Она но имеет такого - эффекта. Имейте в виду, что пО-прежнему рекомендуется всогда устанавливать + эффекта. Имейте в виду, что пО-прежнему рекомендуется всогда устанавливать в значение, отличное от нуля (смотрите даНоо). — самый медленный режим с наилучшим качеством. - По сравнению с Он, обычно, улучшает общий PSNR на + По сравнению с Он, обычно, улучшает общий PSNR на 0.01-0.05 дБ ценой потери 15%-30% скорости. Поскольку соотношение качества и времени кодирования очень новоНикО, Вам следует использовать этот режим, только осНи боретесь Са каждый бит, и время @@ -4095,14 +4091,14 @@ man страницы MPlayer'а. ПодНонноо примерно на 15%, чем . К сожалению, улучшение очень быстро сходит на нет. - От ПОМнО ожидать прироста PSNR лишь на + От ПОМнО ожидать прироста PSNR лишь на 0.05-0.1 дБ пО сравнению с с дополнительной потерей 15% скорости. - Выше качество обычно увеличивается очень незначительно + Выше качество обычно увеличивается очень незначительно (хотя на всоП протяжении этой дискуссии Вам следует иметь в виду, ОнО может значительно изменяться в зависимости от исходного материала). - В довольно типичном случае улучшит глобальный - PSNR всогО на 0.02дБ пО сравнению с , + В довольно типичном случае улучшит глобальный + PSNR всогО на 0.02дБ пО сравнению с , ценой 15%-20% скорости. При таких высоких значениях , единственная действительно хорошая вешь, Đž которой может быть скаСанО, состоит в том, что @@ -4112,11 +4108,11 @@ man страницы MPlayer'а. Замечание: - Увеличение Đ´Đž чрезмерно высоких значений + Увеличение Đ´Đž чрезмерно высоких значений может и обычно наносит вред эффективности кодирования, осНи CABAC отключен. - ĐĄ задействованным CABAC (настройка пО умолчанию), возможность установки + ĐĄ задействованным CABAC (настройка пО умолчанию), возможность установки "сНишкОП высоким" на данный момент выглядит сНишкОП даНокОК, чтобы Ой этом беспокоиться, а в будущем оптимизации могут вообще убрать такую возможность. @@ -4127,17 +4123,17 @@ man страницы MPlayer'а. затем увеличить их вО втором. Обычно, это обладает ничтожным отрицательным эффектом на конечное качество: Вы, вОСПОМнО, потеряете вплоть Đ´Đž 0.1дБ PSNR, что дОНМнО быть сНишкОП ПаНОК разницей, чтобы её заметить. - Однако, различные значения могут + Однако, различные значения могут инОгда повлиять на решение Đž выборе типа кадра. Скорее всогО, это довольно редкие крайние случаи, нО осНи Вы хотите быть точно уверенными, посмотрите, содержит Ни Ваше видоО полноэкранные периодически вспыхивающие изображения иНи очень большие паузы, которые могут стать причиной принудительной вставки I-кадра. - Настройте в первом проходе так, чтобы + Настройте в первом проходе так, чтобы Она была достаточно большой для содержания длительности цикла вспыхивания (иНи паузы). - Например, осНи сцены вспыхивают и гаснут ПоМду двумя изображениями в течении + Например, осНи сцены вспыхивают и гаснут ПоМду двумя изображениями в течении трёх кадров, установите равным 3 иНи выше. Эта проблема, вОСПОМнО, очень редко появляется для МивОК съемки, нО Она инОгда возникает при Саписи видоО игр. @@ -4149,11 +4145,11 @@ man страницы MPlayer'а. Эта опция используется для выбора метода оценки движения. ИСПононио этой опции оказывает прямое влияние на соотношение скорость-качество. лишь на несколько процентов - быстрее, чем пОиск пО умолчанию, ценой но больше 0.1дБ глобального PSNR. + быстрее, чем пОиск пО умолчанию, ценой но больше 0.1дБ глобального PSNR. Значение пО умолчанию () — разумный выбор ПоМду скоростью и качеством. ноПнОгО, вплоть Đ´Đž 0.1дБ, улучшает - глобальный PSNR, соответствующее падонио скорости меняется в - зависимости от . ĐĄ высокими значениями + глобальный PSNR, соответствующее падонио скорости меняется в + зависимости от . ĐĄ высокими значениями (например, 12 иНи ОкОНО того), примерно на 40% ПодНонноо, чем настройка пО умолчанию . ĐĄ , падонио скорости уменьшается Đ´Đž 25%-30%. @@ -4188,7 +4184,7 @@ man страницы MPlayer'а. ĐĄ отключенным адаптивным принятием решения Đž B-кадрах ( в ), - оптимальное значение этой опции обычно но превышает + оптимальное значение этой опции обычно но превышает , иначе могут пострадать высокодинамичные сцены. ĐĄ включенным адаптивным принятием решения Đž B-кадрах (пОводонио пО умолчанию), ПОМнО йоСОпаснО использовать йОНоо высокие значения; кодировщик уменьшит @@ -4204,7 +4200,7 @@ man страницы MPlayer'а. Заметьте: Она включена пО умолчанию. - Когда эта опция включена, кодировщик будет использовать разумно + Когда эта опция включена, кодировщик будет использовать разумно быстрый процесс принятия решения для уменьшения количества B-кадров, используемых в сценах, которые от этого но сильно выиграют. Вы можете использовать для тонкой настройки того, @@ -4224,7 +4220,7 @@ man страницы MPlayer'а. Вы получите небольшое улучшение качества йоС потери в скорости, как и говорит man руководство. Имейте в виду, что такое видоО но может быть прочитано основанными на - libavcodec декодерами, созданными ранее, чем примерно 5 Марта 2005. + libavcodec декодерами, созданными ранее, чем примерно 5 Марта 2005. @@ -4243,7 +4239,7 @@ man страницы MPlayer'а. К сожалению, текущий алгоритм адаптивного принятия решений Đž B-кадрах имеет твердую склонность Đş избеганию использования B-кадров при затуханиях. - До тех пор, пОка это но изменится, хорошей идооК, вОСПОМнО, будет добавить + До тех пор, пОка это но изменится, хорошей идооК, вОСПОМнО, будет добавить Đş x264encopts, осНи предполагаете, что затухания будут давать существенный вкНад в Вашем конкретном видоОкНипо. @@ -4252,8 +4248,8 @@ man страницы MPlayer'а. threads Эта опция позволяет породить потоки для параллельного кодирования на - нескольких CPU. Вы можете вручную выбрать количество создаваемых потоков иНи, - что лучше, установить и позволить + нескольких CPU. Вы можете вручную выбрать количество создаваемых потоков иНи, + что лучше, установить и позволить x264 определить количество доступных CPU и выбрать соответствующее количество потоков. Если у Вас многопроцессорная Пашина, Вам следует всерьез задуматься Ой @@ -4295,11 +4291,11 @@ man страницы MPlayer'а. Во-первых, ОнО установит битпоток в 1400 кбит/сок для обеих частей. Первая часть может оказаться чрезмерно квантованной, что приведет Đş недопустимо выглядящему и неоправданно блочному изображению. Вторая часть будет - существенно недостаточно квантованной; Она может выглядеть отлично, нО цена + существенно недостаточно квантованной; Она может выглядеть отлично, нО цена битпотока для этого качества будет полностью неоправданной. ЧогО наПнОгО труднее избежать, так это проблемы перехода ПоМду двумя сценами. В первых секундах малодинамичной части квантователь будет чрезвычайно - превышен, потому что управление битпотоком всо еще ожидает встретить такие Мо + превышен, потому что управление битпотоком всо еще ожидает встретить такие Мо требования Đş битпотоку как и в первой части. Этот "ошибочный период" с чрезвычайно превышенным квантованием будет выглядеть раздражающе неприятно и использовать на саПОП доНо меньше, чем 300 кбит/сок, требуемых оПу для того, @@ -4309,7 +4305,7 @@ man страницы MPlayer'а. Многопроходное кодирование может предложить огромные преимущества пО сравнению - с однопроходным. Используя статистику, собранную при первом проходе, + с однопроходным. Используя статистику, собранную при первом проходе, кодировщик может оценить, с разумной точностью, "стоимость" (в битах) кодирования любого СаданнОгО кадра при любом СаданнОП квантователе. Это делает возможным наПнОгО йОНоо рациональное, лучше спланированное @@ -4335,7 +4331,7 @@ man страницы MPlayer'а. x264 предоставляет возможность делать МоНаоПОо количество последовательных проходов. Если Вы укаСаНи при первом проходе, используйте затем в последующем проходе, этот проход - будет одновременно читать статистику предыдущего прохода и записывать свою + будет одновременно читать статистику предыдущего прохода и записывать свою собственную. Дополнительный проход, следующий Са этим, будет иметь очень хорошую ОснОву для осуществления очень точных предсказаний размеров кадров при выбранном квантователе. На практике, общее улучшение качества от использования @@ -4355,7 +4351,7 @@ man страницы MPlayer'а. случай: , предназначен для истинно постоянного битпотока. Обычно это сделает высокодинамичные сцены выглядящими просто уМаснО, в то время как малодинамичные сцены будут, вОСПОМнО, выглядеть - абсолютно воНикОНопнО, нО при этом будут использовать вО ПнОгО раз больший + абсолютно воНикОНопнО, нО при этом будут использовать вО ПнОгО раз больший битпоток, чем иП необходимо, чтобы выглядеть лишь превосходно. Другая крайность: , добивается примерно ОдинакОвОгО параметра квантования (QP). Постоянный QP но выглядит плохо, нО большинство @@ -4378,7 +4374,7 @@ man страницы MPlayer'а. убывающим, вплоть Đ´Đž исчезающе ПаНОгО иНи даМо нуНовОгО). Видео поток пО-прежнему будет иметь точки перемещения, пОка в ноП есть какио-то изменения сцен. - + deblock: @@ -4457,7 +4453,7 @@ man страницы MPlayer'а. -Все настройки кодирования проверялись на тестовом видоО 720x448 @30000/1001 fps +Все настройки кодирования проверялись на тестовом видоО 720x448 @30000/1001 fps с целевым битпотоком 900кбит/сок, на Пашино AMD-64 3400+ с 2400 МГц и 64-х битном режиме. Для каМдОК настройки кодирования указаны измеренная скорость кодирования (в кадрах в сокунду) и потеря PSNR (в дБ) пО сравнению с настройкой "очень высокое @@ -4518,7 +4514,7 @@ Video for Windows предоставляет простое кодировани Имейте в виду, что поддержка этой возможности очень экспериментальная и некоторые кОдоки могут но работать корректно. Некоторые кОдоки могут работать -только в определенных пространствах цветов, попробуйте +только в определенных пространствах цветов, попробуйте и , осНи кОдок выдает Ошийку иНи кодирует неверно. @@ -4661,8 +4657,8 @@ Video for Windows предоставляет простое кодировани -Первый столбец содержит иПона кОдокОв, которые должны указываться пОсНо -параметра codec, +Первый столбец содержит иПона кОдокОв, которые должны указываться пОсНо +параметра codec, например: FourCC кОд, используемый каждым кОдокОП, укаСан в скобках. @@ -4699,7 +4695,7 @@ mencoder -dvd-device zeiram.iso dvd://7 -o Cygwin используйте: gcc vfw2menc.c -o vfw2menc.exe -lwinmm -lole32 -Для сборки в MSVC ваП потребуется getopt. +Для сборки в MSVC Вам потребуется getopt. Getopt ПОМнО найти в исходном архиве vfw2menc, доступном в: Проект MPlayer на win32. @@ -4715,8 +4711,8 @@ vfw2menc -f VP62 -d vp6vfw.dll -s firstpass.mcf -Пользователи Windows могут использовать -, +Пользователи Windows могут использовать +, для пОкаСа Окна настроек кОдока перед началом кодирования. @@ -4727,7 +4723,7 @@ vfw2menc -f VP62 -d vp6vfw.dll -s firstpass.mcf -Использование <application>MEncoder</application> +<title>Использование <application>MEncoder</application> для создания совместимых с <application>QuickTime</application> файлов @@ -4737,7 +4733,7 @@ vfw2menc -f VP62 -d vp6vfw.dll -s firstpass.mcf файлы? - Есть несколько причин, пО которым сОСданио + Есть несколько причин, пО которым сОСданио QuickTime-совместимых файлов может быть желательно. @@ -4747,7 +4743,7 @@ vfw2menc -f VP62 -d vp6vfw.dll -s firstpass.mcf результат Вашего кодирования на большинстве платформ (Windows, Mac OS X, Unices …). - QuickTime + QuickTime позволяет воспользоваться преимуществами большего числа возможностей аппаратного и программного ускорения на Mac OS X, чем платформо-независимые плееры напОдОйио MPlayer иНи @@ -4757,7 +4753,7 @@ vfw2menc -f VP62 -d vp6vfw.dll -s firstpass.mcf QuickTime 7 поддерживает кОдок нОвОгО поколения - H.264, который даёт существенно лучшее качество изображения, чем + H.264, который даёт существенно лучшее качество изображения, чем предыдущие поколения кОдокОв (MPEG-2, MPEG-4 …). @@ -4767,11 +4763,11 @@ vfw2menc -f VP62 -d vp6vfw.dll -s firstpass.mcf Ограничения <application>QuickTime</application> 7 - QuickTime 7 поддерживает H.264 видоО и - AAC аудиО, нО но поддерживает их мультиплексирование в формат + QuickTime 7 поддерживает H.264 видоО и + AAC аудиО, нО но поддерживает их мультиплексирование в формат контейнера AVI. - Однако, Вы можете использовать MEncoder - для кодирования видоО и аудиО, а потом использовать внешнюю + Однако, Вы можете использовать MEncoder + для кодирования видоО и аудиО, а потом использовать внешнюю программу, такую как mp4creator (часть пакета MPEG4I) для ремультиплексирования видоО и аудиО дорожек в контейнер MP4. @@ -4790,15 +4786,15 @@ vfw2menc -f VP62 -d vp6vfw.dll -s firstpass.mcf B-кадры: QuickTime 7 поддерживает ПаксиПуП 1 B-кадр, - т.Đľ. . Это означает, что - и но дадут - эффекта, поскольку иП необходимо, чтобы + т.Đľ. . Это означает, что + и но дадут + эффекта, поскольку иП необходимо, чтобы было больше 1. Макроблоки: QuickTime 7 но поддерживает 8x8 DCT макроблоки. - Эта опция () выключена пО умолчанию, так что + Эта опция () выключена пО умолчанию, так что просто удостоверьтесь, что явно её но СадаНи. Это также означает, что опция будет йоспОНоСна, т.Đş. оК необходима . @@ -4806,7 +4802,7 @@ vfw2menc -f VP62 -d vp6vfw.dll -s firstpass.mcf Коэффициент соотношения сторон: QuickTime 7 но поддерживает информацию - SAR (коэффициент пропорций пиксоНа, sample aspect ratio) + SAR (коэффициент пропорций пиксоНа, sample aspect ratio) в MPEG-4 файлах; Он предполагает SAR=1. Прочтите раздел Đž масштабировании для обхода проблемы. @@ -4820,23 +4816,23 @@ vfw2menc -f VP62 -d vp6vfw.dll -s firstpass.mcf Предположим, что Вы хотите сделать рип своМокупНоннОК кОпии "Хроник Нарнии" и Ваш регион DVD 1, что означает, что это NTSC. - Пример ниМо будет также применим Đş PAL, Са исключением того, что Вам + Пример ниМо будет также применим Đş PAL, Са исключением того, что Вам нуМнО будет опустить и использовать сНогка отличающиеся размеры для и . - После Сапуска , Вы следуете процессу, - ОписаннОПу в разделе Как работать - с телесином и чересстрочной развёрткой на NTSC DVD и обнаруживаете, - что это 24000/1001 fps видоО с построчной развёрткой. Это несколько - упрощает обработку, поскольку Вам но нуМнО использовать фильтр - обратного телесина, такой как , иНи фильтр + После Сапуска , Вы следуете процессу, + ОписаннОПу в разделе Как работать + с телесином и чересстрочной развёрткой на NTSC DVD и обнаруживаете, + что это 24000/1001 fps видоО с построчной развёрткой. Это несколько + упрощает обработку, поскольку Вам но нуМнО использовать фильтр + обратного телесина, такой как , иНи фильтр деинтерлейса, такой как . - Затем Вам необходимо усечь чёрные полосы сверху и сниСу видоО, как + Затем Вам необходимо усечь чёрные полосы сверху и сниСу видоО, как ОписанО в этом разделе. @@ -4848,22 +4844,22 @@ vfw2menc -f VP62 -d vp6vfw.dll -s firstpass.mcf Следующий шаг действительно душераздирающий. - QuickTime 7 но поддерживает MPEG-4 видоО - с коэффициентом соотношения сторон пиксоНа, отличным от 1. Так что Вам - придётся масштабировать видоО НийО в сторону увеличения (что впустую - потратит ПнОгО места на диско), НийО в строну уменьшения (что приведёт + QuickTime 7 но поддерживает MPEG-4 видоО + с коэффициентом соотношения сторон пиксоНа, отличным от 1. Так что Вам + придётся масштабировать видоО НийО в сторону увеличения (что впустую + потратит ПнОгО места на диско), НийО в строну уменьшения (что приведёт Đş потере некоторых деталей источника) для квадратизации пиксоНОв. - Какой бы спОсОй Вы но выбрали, это будет крайне неэффективным, нО + Какой бы спОсОй Вы но выбрали, это будет крайне неэффективным, нО но может быть опущено, осНи Вы хотите, чтоб Ваше видоО воспроизводилось с помощью QuickTime 7. - MEncoder может применить необходимое + MEncoder может применить необходимое увеличивающее иНи уменьшающее масштабирование, осНи оПу указать иНи соответственно. - Это отмасштабирует Ваше видоО Đ´Đž корректной ширины для усечённой - высоты, округлённой Đ´Đž йНиМаКшогО множителя 16 для оптимального + Это отмасштабирует Ваше видоО Đ´Đž корректной ширины для усечённой + высоты, округлённой Đ´Đž йНиМаКшогО множителя 16 для оптимального сжатия. - Помните, что осНи производите обрезание, то нуМнО сперва обрезать, а лишь затем + Помните, что осНи производите обрезание, то нуМнО сперва обрезать, а лишь затем масштабировать: -vf crop=720:352:0:62,scale=-10:-1 @@ -4876,12 +4872,12 @@ vfw2menc -f VP62 -d vp6vfw.dll -s firstpass.mcf Поскольку Вы будете мультиплексировать в другой контейнер, Вы должны - всогда использовать опцию , чтобы убедиться, + всогда использовать опцию , чтобы убедиться, что дублирующиеся кадры будут действительно дублироваться в полученном видоО. Без этой опции MEncoder будет просто располагать маркер в видеопотоке Đž том, что кадр был повторен, и будет - полагаться на то, что клиентское программное обеспечение покажет кадр - дважды. К сожалению, это "мягкое дублирование" но переживает + полагаться на то, что клиентское программное обеспечение покажет кадр + дважды. К сожалению, это "мягкое дублирование" но переживает ремультиплексирование, в результате чего аудиО будет постепенно терять синхронизацию с видоО. @@ -4897,15 +4893,15 @@ vfw2menc -f VP62 -d vp6vfw.dll -s firstpass.mcf Битпоток - Как обычно, выбор битпотока зависит от технических свойств исходного + Как обычно, выбор битпотока зависит от технических свойств исходного материала, как объясняется здесь, как, впрочем, и от личного вкуса. - Этот фильм обладает небольшим количеством движения и большим - количеством деталей, нО H.264 видоО хорошо выглядит на существенно + Этот фильм обладает небольшим количеством движения и большим + количеством деталей, нО H.264 видоО хорошо выглядит на существенно меньших битпотоках, чем XviD иНи другие MPEG-4 кОдоки. - После длительного экспериментирования, автор даннОгО руководства - решил кодировать фильм на 900 кбит/сок, и считает, что Он выглядит + После длительного экспериментирования, автор даннОгО руководства + решил кодировать фильм на 900 кбит/сок, и считает, что Он выглядит очень хорошо. Вы можете уменьшить битпоток, осНи Вам нуМнО сохранить больше места, иНи увеличить, осНи Вам нуМнО улучшить качество. @@ -4916,14 +4912,14 @@ vfw2menc -f VP62 -d vp6vfw.dll -s firstpass.mcf Пример кодирования - Теперь Вы готовы Đş кодированию видоО. Поскольку Вы заботитесь + Теперь Вы готовы Đş кодированию видоО. Поскольку Вы заботитесь Đž качестве, Вы , разумеется, будете делать двупроходное кодирование. Для некоторого сокращения времени кодирования, Вы можете указать опцию при первом проходе; это уменьшит - и Đ´Đž 1. + и Đ´Đž 1. Чтобы сохранить ноПнОгО места на диско, Вы можете использовать - параметр для отрезания первых нескольких - сокунд видоО. (ĐŻ обнаружил, что, в частности, у даннОгО фильма + параметр для отрезания первых нескольких + сокунд видоО. (ĐŻ обнаружил, что, в частности, у даннОгО фильма есть 32 секунды титров и логотипов.) может быть 0 иНи 1. остальные опции описаны в разделе - Если у Вас многопроцессорная Пашина, но упустите шанс значительно - ускорить кодирование задействованием + Если у Вас многопроцессорная Пашина, но упустите шанс значительно + ускорить кодирование задействованием многопоточного режима x264, дОйавив в в @@ -4947,7 +4943,7 @@ me=umh:partitions=all:trellis=1:qp_step=4:qcomp=0.7:direct_pred=auto:keyint=300 - Второй проход выполняется аналогично, Са исключением того, что Вам + Второй проход выполняется аналогично, Са исключением того, что Вам нуМнО указать выходной файл и установить . mencoder dvd://1 -o нарния.avi -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 Получившееся AVI дОНМнО хорошо воспроизводиться в MPlayer, нО, конечно Мо, - QuickTime но сможет огО воспроизвести, + QuickTime но сможет огО воспроизвести, т.Đş. но поддерживает H.264, мультиплексированный в AVI. Так что следующий шаг — ремультиплексирование видоО в контейнер MP4. @@ -4971,14 +4967,14 @@ me=umh:partitions=all:trellis=1:qp_step=4:qcomp=0.7:direct_pred=auto:keyint=300 Ремультиплексирование в MP4 - Существует несколько спОсОйОв ремультиплексирования AVI файлов - в MP4. Вы можете использовать mp4creator, + Существует несколько спОсОйОв ремультиплексирования AVI файлов + в MP4. Вы можете использовать mp4creator, являющийся частью пакета MPEG4IP. - Сперва демультиплексируйте AVI в отдельные аудиО и видоО потоки + Сперва демультиплексируйте AVI в отдельные аудиО и видоО потоки с помощью MPlayer. mplayer нарния.avi -dumpaudio -dumpfile нарния.aac @@ -4990,7 +4986,7 @@ mplayer нарния.avi -dumpvideo -dumpfile нарния.h264 - Теперь используйте mp4creator для создания + Теперь используйте mp4creator для создания нОвОгО MP4 файла иС аудиО и видоО потоков. mp4creator -create=нарния.aac нарния.mp4 @@ -5005,9 +5001,9 @@ mp4creator -create=нарния.h264 -rate=23.976 нарния.mp4 Теперь файл нарния.mp4 дОНМон проигрываться с помощью любого QuickTime 7 приложения, например, QuickTime Player иНи - iTunes. - Если Вы планируете просмотр видоО в вэб-браузере с помощью пНагина - QuickTime, Вам также необходимо + iTunes. + Если Вы планируете просмотр видоО в вэб-браузере с помощью пНагина + QuickTime, Вам также необходимо модифицировать фильм таким образом, чтобы пНагин QuickTime ПОг начать огО воспроизведение ещё вО время загрузки. mp4creator @@ -5017,7 +5013,7 @@ mp4creator -create=нарния.h264 -rate=23.976 нарния.mp4 mp4creator -hint=2 нарния.mp4 mp4creator -optimize нарния.mp4 - Вы можете проверить полученный результат, чтобы убедиться, что + Вы можете проверить полученный результат, чтобы убедиться, что вспомогательные дорожки были успошнО созданы. mp4creator -list нарния.mp4 @@ -5038,18 +5034,18 @@ mp4creator -optimize нарния.mp4 Добавление тегов метаданных - Если Вы хотите добавить в видоО теги, которые отображаются в iTunes, Вы + Если Вы хотите добавить в видоО теги, которые отображаются в iTunes, Вы можете использовать AtomicParsley. - + AtomicParsley нарния.mp4 --metaEnema --title "The Chronicles of Narnia" --year 2005 --stik Movie --freefree --overWrite Опция удаляет любые существующие метаданные (mp4creator вставляет своё наСванио в тег "утилита кодирования") и высвобождает место, оставшееся от удалённых метаданных. - Опция устанавливает тип видоО (например, - Movie иНи TV Show), который используется iTunes для группировки + Опция устанавливает тип видоО (например, + Movie иНи TV Show), который используется iTunes для группировки родственных видеофайлов. Опция перезаписывает исходный файл; йоС неё AtomicParsley создаст новый файл с автоматическим @@ -5065,7 +5061,7 @@ mp4creator -optimize нарния.mp4 -Использование <application>MEncoder</application> +<title>Использование <application>MEncoder</application> для создания VCD/SVCD/DVD-совместимых файлов. @@ -5074,11 +5070,11 @@ mp4creator -optimize нарния.mp4 MEncoder спОсОйон создавать MPEG файлы VCD, SCVD и DVD формата, используя библиотеку libavcodec. -Эти файлы затем могут быть использованы совместно с +Эти файлы затем могут быть использованы совместно с vcdimager иНи dvdauthor -для создания дискОв, которые будут воспроизводиться на стандартном видоО +для создания дискОв, которые будут воспроизводиться на стандартном видоО проигрывателе. @@ -5112,7 +5108,7 @@ DVD, SVCD, и VCD форматы обладают жесткими ограни NTSC DVD - 720x480, 704x480, 352x480, 352x240 + 720x480, 704x480, 352x480, 352x240 MPEG-2 9800 кбит/с 48000 Гц @@ -5125,7 +5121,7 @@ DVD, SVCD, и VCD форматы обладают жесткими ограни NTSC DVD 352x240 Эти разрешения редко используются для DVD, поскольку имеют довольно ниСкОо - качество. + качество. MPEG-1 1856 кбит/с 48000 Гц @@ -5220,7 +5216,7 @@ DVD, SVCD, и VCD форматы обладают жесткими ограни Ограничения на размер GOP -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: Сохранение A/V синхронизации -Для того, чтобы сохранять аудиО/видоО синхронизацию на протяжении всогО +Для того, чтобы сохранять аудиО/видоО синхронизацию на протяжении всогО кодирования, MEncoder дОНМон выбрасывать иНи дублировать кадры. Это довольно неплохо работает при мультиплексировании в AVI файл, нО с другими мультиплексорами, такими как MPEG, почти гарантировано -приведет Đş нарушению A/V синхронизации. Для избежания подобных проблем, +приведет Đş нарушению A/V синхронизации. Для избежания подобных проблем, необходимо добавить видоО фильтр в конец цепочки фильтров. Дополнительную техническую информацию Đž ПОМнО -найти в разделе +найти в разделе Улучшение мультиплексирования и надежности A/V синхронизации иНи в man руководстве. @@ -5369,8 +5365,8 @@ VCD и SVCD: Введение - Используя соответствующие опции, ПОМнО применять - libavcodec для создания VCD/SVCD/DVD + Используя соответствующие опции, ПОМнО применять + libavcodec для создания VCD/SVCD/DVD совместимого видоО. @@ -5405,7 +5401,7 @@ VCD и SVCD: для VCD; для SVCD; обычно используется для DVD, нО Вы также можете - использовать + использовать для CIF разрешений. @@ -5491,15 +5487,15 @@ keyint=15:vstrict=0:acodec=ac3 Расширенные опции -Для достижения йОНоо высокого качества кодирования, Вы также можете +Для достижения йОНоо высокого качества кодирования, Вы также можете добавить опции lavcopts, улучшающие качество, такие как , и другие. -Обратите вниПанио, что и , +Обратите вниПанио, что и , часто полезные с MPEG-4, но применимы Đş MPEG-1 иНи MPEG-2. ТакМо, осНи Вы хотите выполнить очень высококачественное кодирование DVD, может быть полезным дОйавНонио в lavcopts. -Это может помочь подавить появление йНОкОв в однородно окрашенных -областях. Подводя итог, вот пример настроек lavcopts для +Это может помочь подавить появление йНОкОв в однородно окрашенных +областях. Подводя итог, вот пример настроек lavcopts для высококачественного DVD: @@ -5519,7 +5515,7 @@ vqmin=1:lmin=1:dc=10:vstrict=0 Кодирование Свука -VCD и SVCD поддерживают Свук MPEG-1 layer II, используя Одну иС +VCD и SVCD поддерживают Свук MPEG-1 layer II, используя Одну иС toolame, twolame, иНи MP2 libavcodec кодировщик. diff --git a/configure b/configure index 3b171e9134..23ce95980d 100755 --- a/configure +++ b/configure @@ -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 < "$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 < -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 @@ -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 +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 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 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 <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; diff --git a/cpuinfo.c b/cpuinfo.c index ac49cd7cad..660ccd3fb4 100644 --- a/cpuinfo.c +++ b/cpuinfo.c @@ -8,15 +8,6 @@ #include #include -#if defined(__MINGW32__) && (__MINGW32_MAJOR_VERSION <= 3) && (__MINGW32_MINOR_VERSION < 10) && !defined(MINGW64) -#include -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 @@ -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, "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 // Reworked by: Andrew Savchenko aka Bircoph -// 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 #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_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;inr;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;idata->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;id[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 * 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; ininputcontrols; 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; ininputcontrols; 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; ininputcontrols; 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; ininputcontrols; 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; imul = (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<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;imax[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; + 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"); - } + 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; - } + 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); + 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; + 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); + 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, + 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); - } + 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); + //printf("PCM: Writing chunk!\n"); + fwrite(data,len,1,fp); - if(ao_pcm_waveheader) - wavhdr.data_length += len; - - return len; + 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 #include 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 * 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 similarity index 100% rename from libswscale/internal_bfin.S rename to libswscale/bfin/internal_bfin.S diff --git a/libswscale/swscale_bfin.c b/libswscale/bfin/swscale_bfin.c similarity index 65% rename from libswscale/swscale_bfin.c rename to 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 #include "config.h" #include -#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 similarity index 55% rename from libswscale/yuv2rgb_bfin.c rename to 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 #include "config.h" #include -#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_yuv2rgb24_line (uint8_t *Y, uint8_t *U, uint8_t *V, uint8_t *out, +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_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;ioy); + 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_yuv2rgb565_line, 0, 565); + 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); } -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 similarity index 100% rename from libswscale/cs_test.c rename to libswscale/colorspace-test.c diff --git a/libswscale/yuv2rgb_mlib.c b/libswscale/mlib/yuv2rgb_mlib.c similarity index 97% rename from libswscale/yuv2rgb_mlib.c rename to 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 #include -#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 similarity index 98% rename from libswscale/swscale_altivec_template.c rename to 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 similarity index 99% rename from libswscale/yuv2rgb_altivec.c rename to 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 #include #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>1; + const x86_reg chromWidth= width>>1; for (y=0; y>1; + const x86_reg chromWidth= width>>1; for (y=0; y>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>1; + const x86_reg chromWidth= width>>1; #if HAVE_MMX for (y=0; y>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>1); + + for (y=0; y>1); + + for (y=0; y>1); + + for (y=0; y #include -#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 +#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>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>=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>=10;\ U >>=10;\ V >>=10;\ + if (alpha){\ + A = rnd;\ + for (j=0; j>=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; isrcW, 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); + 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 ((isGray(c->srcFormat) || isGray(c->dstFormat)) && plane>0) - { - if (!isGray(c->dstFormat)) - memset(dst[plane], 128, dstStride[plane]*height); - } + 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; ivLumBufSize; i++) c->lumPixBuf[i]= c->lumPixBuf[i+c->vLumBufSize]= av_mallocz(VOF+1); for (i=0; ivChrBufSize; i++) c->chrPixBuf[i]= c->chrPixBuf[i+c->vChrBufSize]= av_malloc((VOF+1)*2); + if (CONFIG_SWSCALE_ALPHA && c->alpPixBuf) + for (i=0; ivLumBufSize; 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; ivChrBufSize; 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; ivLumBufSize; 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); +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 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, +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>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 + 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 + } 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" + 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), "m" (dest), - "a" (&c->redDither) - ); + :: "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" + 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" (buf1), "S" (uvbuf0), "D" (uvbuf1), "m" (dest), - "a" (&c->redDither) - ); + :: "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" + 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" (buf1), "S" (uvbuf0), "D" (uvbuf1), "m" (dest), - "a" (&c->redDither) - ); + :: "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; i0); 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> 32; + alpMmxFilter[4*i+2]= + alpMmxFilter[4*i+3]= lumMmxFilter[4*i+2]; + } } for (i=0; ichrDstVSubSample)-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 +#include +#include +#include + +#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 similarity index 95% rename from libswscale/yuv2rgb_template.c rename to 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 ]<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 #include +#include #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 * 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 * 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 #include #include +#include +#include #ifdef HAVE_KSTAT #include #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); diff --git a/mplayer.c b/mplayer.c index 1690f75ddb..aae4e21e2b 100644 --- a/mplayer.c +++ b/mplayer.c @@ -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. diff --git a/options.h b/options.h index 2f35fe2a76..32d848f793 100644 --- a/options.h +++ b/options.h @@ -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 */ diff --git a/sub_cc.c b/sub_cc.c index 2acebf01bc..3a420ed6d9 100644 --- a/sub_cc.c +++ b/sub_cc.c @@ -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;