changeset 86:f61bcfc02d2d

how does mplayer works - hungarian doc
author arpi_esp
date Sun, 11 Mar 2001 19:44:15 +0000
parents eef63c5da277
children 061aab88aa9e
files DOCS/tech/tech-hun.txt
diffstat 1 files changed, 156 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DOCS/tech/tech-hun.txt	Sun Mar 11 19:44:15 2001 +0000
@@ -0,0 +1,156 @@
+[yes, this is hungarian. maybe someone will translate this to russian or
+something else...]
+
+Nos, akkor leirom, hogyan is működik ez az egész.
+
+Az ékezetekkel majd lesz valami, nem nagyon vagyok hozzászokva az
+ékezetes gépeléshez...
+
+A program felépítése alapjaiban logikus, de eleg gányul van megirva :)
+
+A fő modulok:
+
+1. streamer.c: ez az input, azaz ez olvassa a filet vagy VCD-t.
+   amit tudnia kell: megfelelő bufferelés, seek, skip funkciók,
+	 byte-onkénti ill. tetszőleges méretű blockonkénti olvasás.
+	 Egy stream (input device/file) leírására a stream_t struktura szolgál.
+	 
+2. demuxer.c: ez végzi az input szétszedését audio és video csatornákra,
+   és a kiválasztott scatornák bufferelt package-nkénti olvasását.
+	 A demuxer.c inkább csak egy framework, ami közös minden input
+	 formátumra, és az egyes formátumokhoz (mpeg-es,mpeg-ps, avi, avi-ni, asf)
+	 külön parser van, ezek a demux_*.c fileokban vannak.
+	 A hozza tartozo struktura a demuxer_t. osszesen egy demuxer van.
+	 
+2.a. demuxer stream, azaz ds. struct: demux_stream_t
+   minden egyes csatornahoz (a/v) tartozik egy ilyen.
+	 egyelore demuxer-enkent 2 ilyen lehet, egy a hanghoz es egy a kephez.
+	 
+2.b. demux_packet_t, azaz dp.
+   ez egy darab chunk-ot (avi) vagy packet-et (asf,mpg) tartalmaz.
+	 memoriaban ezek lancolt listaban vannak, mivel kulonbozo meretuek.
+
+  hogy is muxik ez a beolvasosdi?
+	 - meghivodik a demuxer.c/demux_read_data(), megkapja melyik ds-bol
+	   (audio vagy video), mennyi byteot es hova (memoriacim) szeretnenk 
+		 beolvasni. ezt hivogatjak gyakorlatilag a codec-ek.
+	 - ez megenzi,hogy az adott ds bufferében van-e valami, ha igen akkor 
+	   onnan olvas amennyit kell. ha nincs/nincs eleg, akkor meghivja
+		 a ds_fill_buffer()-t ami:
+	 - megnezi hogy az adott ds-ben vannak-e bufferelve csomagok (dp-k)
+	   ha igen, akkor a legregebbit atrakja a bufferbe es olvas tovabb.
+		 ha ures a lancolt lista, akkor meghivja a demux_fill_buffer()-t:
+	 - ez az input formatumnak megfelelo parset meghivja ami olvassa
+	   tovabb a filet, es a talalt csomagokat rakja be a megfelelo bufferbe.
+		 na ha mondjuk audio csomagot szeretennk, de csak egy rakat video csomag
+		 van, akkor jon elobb-utobb a DEMUXER: Too many (%d in %d bytes) audio 
+		 packets in the buffer... hibauzenet.
+
+Eddig kb tiszta ugy, ezt akarom majd atrakni kulon lib-be.
+
+na nezzuk tovabb:
+
+3. mplayer.c - igen, o a fonok :)
+   az idozites eleg erdekesen van megoldva, foleg azert mert minden
+	 fileformatumnal maskepp kell/celszeru, es neha tobbfele keppen is lehet.
+	 van egy a_frame es egy v_frame nevu float valtozo, ez tarolja az epp
+	 lathato/hallhato a/v poziciojat masodpercben.
+	 akkor jelenit meg ujabb video frame-t, ha v_frame<a_frame, es akkor
+	 dekodol tovabb hangot ha a_frame<v_frame.
+	 amikor lejatszik (hang/kep) akkor a lejatszott valami idotartamaval
+	 noveli a megfelelo valtozot. videonal ez altalaban 1.0/fps, persze
+	 meg kell jegyeznem hogy videonal nem igazna szamit az fps, asf-nel
+	 pl. nincs is olyan, ahelyett duration van es framenkent valtozhat.
+	 mpeg2-nel pedig repeat_count van ami 1-2.5 idotartamban elnyujtja
+	 a framet... avi-nal van talan egyedul fix fps, meg mpeg1-nel.
+
+	 Na most ez addig nagyon szepen mukodik, amig a hang es kep tokeletes
+	 szinkronban van, mivel igy vegulis a hang szol, az adja az idozitest,
+	 es amikor eltelt egy framenyi ido akkor kirakja a kovetkezo framet.
+	 de mi van ha valamiert az input fileban csuszik a ketto?
+	 Akkor jon be a PTS correction. az input demuxer-ek olvassak a csomagokkal
+	 egyutt a hozzajuk tartozo PTS-t (presentation timestamp) is, ami alapjan
+	 eszreveheto ha el van csuszva a ketto. ilyenkor egy megadott maximalis
+	 hataron (alsd -mc opcio) belul kepes az mplayer korrigalni az a_frame 
+	 erteket. a korrekciok osszege van a c_total-ban.
+	 
+	 persze ez meg nem minden szinkron ugyben, van meg nemi gaz.
+	 pl. az hogy a hangkartya eleg rendesen kesleltet, ezt az mplayernek
+	 korrigalnia kepp: ezert kell enki az audio buffer merete. amit a
+	 select()-e tud lemerni amit viszont nem tdu minden kartya...
+	 ilyenkor kell a -abs opcioval megadni.
+	 
+	 aztan van olyan gond is, hogy pl. mpegnel nem framenkent van PTS
+	 hanem szektoronkent, ami tartalmazhat 10 framet is de 0.1-et is.
+	 hogy ez nem csessze el az idozitest, atlagoljuk 5 framenkent a 
+	 PTS-t es ezt az atlag erteket vesszuk figyelembe korrekcional.
+	 
+	 avi-nal sem egyszeru az elet. ott a 'hivatalos' idozitesi mod a
+	 BPS-alapu, azaz a headerben le va tarolva hany tomoritett audio
+	 byte tartozik egy masodpercnyi (fps darab) kephez.
+	 ez persze nem mindig mukodik... miert is mukodne :)
+	 ezer en megcsinaltam hogy az mpeg-nel hasznalatos sectoronkenti
+	 PTS erteket emulalom avi-ra is, azaz az AVI parser minden beolvasott
+	 chunk-nal szamol egy kamu PTS-t a framek tipusa alapjan. es ez
+	 alapjan idozitek. es van amikor ez mukodik jobban.
+	 persze itt meg bejatszik az is, hogy AVI-nal altalaban elore letarolnak
+	 egy nagyobb adag hangot, es csak utana kezdodik a kep. ezt persze
+	 bele kell szamolni a kesleltetesbe, ez az Initial PTS delay.
+	 ilyen persze 2 is van, az egyik a headerben le is van irva, es
+	 nem nagyon hasznlajak :) a masik sehol nincs leirva de hasznaljak, ezt
+	 csak merni lehet...
+	 
+4. codecek. ezek kulonbozo lib-ek szanaszet mindenfelol.
+   mint pl. libac3, libmpeg2, xa/*, alaw.c, opendivx/*, loader, mp3lib.
+	 az mplayer.c hivogatja oket amikor egy egy darab hangot vagy framet
+	 kell lejatszani (lasd 3. pont elejen)
+	 ezek pedig hivjak a megfelelo demuxert hogy megkapjak a tomoritett
+	 adatokat (lasd 2. pont).
+	 
+4.a codec controller: na ez a legnagypbb gány az egeszben :)
+	 a libmpeg2 ugyanis annyira instabil hogy az mar hatareset.
+	 persze ezt nem ugy kell erteni hogy szar :) hanem ugy, hogy csak
+	 teljesen szabvanyos, hibatlan mpeg steramet eszik meg. ha hibat
+	 talal, egyszeruen segfault ;)  es enm rohogni, ez nagyon jo igy,
+	 teljesitmeny szempontbol 50-100%-al lasabb lenne ha teleraknak
+	 ellenorzesekkel. ezert csinaltam azt a megoldast, hogy kulon
+	 processzben futtatom, es ha elszall, hat kit izgat, majd inditok
+	 egy masikat. ehhez azert kell par dolog:
+	 - codec controller process: egy kulon processz, ami sleep-el, de
+	   ha a gyereke (a libmpeg2 processze) meghal, akkor indit gyorsan
+		 egy masikat. igy az mplayer-nek nem kell ezzel fogallkoznia, o
+		 csak pumpalja a gyerekbe a tomoritett adatot az meg rakja kifele.
+	 - shmem: a tomoritett adatok, es a kitomoritett framek is shared
+	   memoryban vannak, tehat mind a 3 processz (mplayer, codeccontrol,
+		 libmpeg2 codec) is latja. igy tudnak gyorsan adatot cserelni.
+	 - a koztuk levo kommunikaciora meg FIFO van.
+	 - valamint ha dekodolas kozben meghal a gyerek, az altala sikeresen
+		 dekodolt adatok nem vesznek el, hanem a shmem-en keresztul oroklodik
+		 az uj gyereknek! ezert max egy pici hiba latszik a kepen, nem tunik
+		 el az egesz meg zoldul be, mint a regi verzioban.
+	 hatranya ennek az egesznek, hogy a libvo-libmpeg2 szoros kapcsolodasa
+	 miatt a libvo is abban a processzben kell fusson, amiben a libmpeg2,
+	 tehat abban ami allandoan megdolgik-ujraszuletik, es nem abban amiben
+	 a vezerlo processz, az mplayer fut. ez eleg sok gondot okozik, foleg
+	 a libvo ablakban tortent esemenyek (billentyunyomas pl) kezelesekor.
+	 erre mindenfele workaroundok vannak, FIFO-k minden mennyisegben, meg
+	 trukk ami kihasznalja hogy az X-nek mind1 melyik processz kerdezi
+	 le az Event-jeit.
+	 
+	 szeretnem a kozeljovoben ezt megszuntetni, es az mpeg2dec-devel
+	 listan kidolgozott signal/longjmp (szinten gány :)) modszert hasznalni.
+
+5. libvo: ez vegzi a kep kirakasat. jelenleg 2 kulonbozo kepkirako
+   van benne:
+5.a draw_slice(): ez planar YV12 kepet rak ki (3 db frame, egy teljes
+	 meretu ami a fenyerot tartalmazza, es 2 negyedakkora, ami a
+	 szin infot). ezt hasznaljak az mpeg codecek (libmpeg2,opendivx).
+	 ez mar tud olyat hogy nem az egesz kep kirakasa, hanem csak kis
+	 reszletek updatelese: ilyenkor a sarkanak es a darabka meretenek
+	 megadasaval lehet csinalni.
+5.b draw_frame(): ez a regebbi interface, ez csak komplett framet rak ki,
+   es csak packed formatumot (YUY2, RGB/BGR) tud.
+	 ezt hasznaljak a win32 codecek (divx,indeo stb).
+	 
+
+