Mercurial > mplayer.hg
comparison DOCS/tech/tech-hun.txt @ 861:c80faaa2c2c1
some updates
author | arpi_esp |
---|---|
date | Thu, 24 May 2001 18:33:51 +0000 |
parents | b6cfefccd071 |
children | dcf8d81eed48 |
comparison
equal
deleted
inserted
replaced
860:edc6758694ed | 861:c80faaa2c2c1 |
---|---|
1 [yes, this is hungarian. maybe someone will translate this to russian or | |
2 something else...] | |
3 | |
4 Nos, akkor leirom, hogyan is működik ez az egész. | 1 Nos, akkor leirom, hogyan is működik ez az egész. |
5 | 2 |
6 Az ékezetekkel majd lesz valami, nem nagyon vagyok hozzászokva az | |
7 ékezetes gépeléshez... | |
8 | |
9 A program felépítése alapjaiban logikus, de eleg gányul van megirva :) | |
10 | |
11 A fő modulok: | 3 A fő modulok: |
12 | 4 |
13 1. streamer.c: ez az input, azaz ez olvassa a filet vagy VCD-t. | 5 1. streamer.c: ez az input layer, azaz ez olvassa a filet, VCD-t vagy stdin-t. |
14 amit tudnia kell: megfelelő sectoronkenti bufferelés, seek, skip funkciók, | 6 amit tudnia kell: megfelelő sectoronkenti bufferelés, seek, skip funkciók, |
15 byte-onkénti ill. tetszőleges méretű blockonkénti olvasás. | 7 byte-onkénti ill. tetszőleges méretű blockonkénti olvasás. |
16 Egy stream (input device/file) leírására a stream_t struktura szolgál. | 8 Egy stream (input device/file) leírására a stream_t struktura szolgál. |
17 | 9 |
18 2. demuxer.c: ez végzi az input szétszedését audio és video csatornákra, | 10 2. demuxer.c: ez végzi az input szétszedését audio és video csatornákra, |
19 és a kiválasztott csatornák bufferelt package-nkénti olvasását. | 11 és a kiválasztott csatornák bufferelt package-enkénti olvasását. |
20 A demuxer.c inkább csak egy framework, ami közös minden input | 12 A demuxer.c inkább csak egy framework, ami közös minden input |
21 formátumra, és az egyes formátumokhoz (mpeg-es,mpeg-ps, avi, avi-ni, asf) | 13 formátumra, és az egyes formátumokhoz (mpeg-es,mpeg-ps, avi, avi-ni, asf) |
22 külön parser van, ezek a demux_*.c fileokban vannak. | 14 külön parser van, ezek a demux_*.c fileokban vannak. |
23 A hozza tartozo struktura a demuxer_t. osszesen egy demuxer van. | 15 A hozza tartozo struktura a demuxer_t. osszesen egy demuxer van. |
24 | 16 |
25 2.a. demux_packet_t, azaz dp. | 17 2.a. demux_packet_t, azaz dp. |
26 ez egy darab chunk-ot (avi) vagy packet-et (asf,mpg) tartalmaz. | 18 ez egy darab chunk-ot (avi) vagy packet-et (asf,mpg) tartalmaz. |
27 memoriaban ezek lancolt listaban vannak, mivel kulonbozo meretuek. | 19 memoriaban ezek lancolt listaban vannak, mivel kulonbozo meretuek. |
28 | 20 |
29 2.b. demuxer stream, azaz ds. struct: demux_stream_t | 21 2.b. demuxer stream, azaz ds. |
22 struct: demux_stream_t | |
30 minden egyes csatornahoz (a/v) tartozik egy ilyen. | 23 minden egyes csatornahoz (a/v) tartozik egy ilyen. |
31 ez tartalmazza a stream-hez tartozo packeteket (lasd. 2.a.) | 24 ez tartalmazza a stream-hez tartozo packeteket (lasd. 2.a.) |
32 egyelore demuxer-enkent 2 ilyen lehet, egy a hanghoz es egy a kephez. | 25 egyelore demuxer-enkent 3 ilyen lehet: |
26 - hang (d_audio) | |
27 - kep (d_video) | |
28 - DVD felirat (d_dvdsub) | |
33 | 29 |
34 2.c. stream header. 2 fele van (egyelore): sh_audio_t es sh_video_t | 30 2.c. stream header. 2 fele van (egyelore): sh_audio_t es sh_video_t |
35 ez tartalmaz minden, a dekodolashoz szukseges parametert, igy az input | 31 ez tartalmaz minden, a dekodolashoz szukseges parametert, igy az input |
36 es output buffereket, kivalasztott codecet, fps/framerate stb adatokat. | 32 es output buffereket, kivalasztott codecet, fps/framerate stb adatokat. |
37 Annyi van belole, ahany stream van a fileban tarolva. Lesz minimum egy | 33 Annyi van belole, ahany stream van a fileban tarolva. Lesz minimum egy |
45 hivatkoznak egymasra (ds->sh es sh->ds) az egyszerubb hasznalat miatt. | 41 hivatkoznak egymasra (ds->sh es sh->ds) az egyszerubb hasznalat miatt. |
46 (igy a funkciotol fuggoen eleg vagy csak a ds vagy csak az sh atadasa) | 42 (igy a funkciotol fuggoen eleg vagy csak a ds vagy csak az sh atadasa) |
47 | 43 |
48 Pelda: van egy .asf fileunk, abban 6 db stream, ebbol 1 audio es 5 video. | 44 Pelda: van egy .asf fileunk, abban 6 db stream, ebbol 1 audio es 5 video. |
49 A header beolvasasakor letre fog jonni 6 db sh struct, 1 audio es 5 video. | 45 A header beolvasasakor letre fog jonni 6 db sh struct, 1 audio es 5 video. |
50 Amikor elkezdi olvasni a packeteket, az elso talalt audio es video streamet | 46 Amikor elkezdi olvasni a packeteket, az elso talalt audio es video |
47 packethez tartozo streamet | |
51 kivalasztja, es ezekre allitja be a d_audio es d_video sh pointereit. | 48 kivalasztja, es ezekre allitja be a d_audio es d_video sh pointereit. |
52 Igy kesobbiekben mar csak ezeket a streameket olvassa, a tobbit nem. | 49 Igy kesobbiekben mar csak ezeket a streameket olvassa, a tobbit nem. |
53 Persze ha az user masik streameket szeretne kivalasztani, akkor | 50 Persze ha az user masik streameket szeretne kivalasztani, akkor |
54 force-olhatja a -aid es -vid kapcsolokkal. | 51 force-olhatja a -aid es -vid kapcsolokkal. |
55 Jo pelda erre a DVD, ahol nem mindig az angol szinkron hang az elso | 52 Jo pelda erre a DVD, ahol nem mindig az angol szinkron hang az elso |
58 | 55 |
59 hogy is muxik ez a beolvasosdi? | 56 hogy is muxik ez a beolvasosdi? |
60 - meghivodik a demuxer.c/demux_read_data(), megkapja melyik ds-bol | 57 - meghivodik a demuxer.c/demux_read_data(), megkapja melyik ds-bol |
61 (audio vagy video), mennyi byteot es hova (memoriacim) szeretnenk | 58 (audio vagy video), mennyi byteot es hova (memoriacim) szeretnenk |
62 beolvasni. ezt hivogatjak gyakorlatilag a codec-ek. | 59 beolvasni. ezt hivogatjak gyakorlatilag a codec-ek. |
63 - ez megenzi,hogy az adott ds bufferében van-e valami, ha igen akkor | 60 - ez megnezi,hogy az adott ds bufferében van-e valami, ha igen akkor |
64 onnan olvas amennyit kell. ha nincs/nincs eleg, akkor meghivja | 61 onnan olvas amennyit kell. ha nincs/nincs eleg, akkor meghivja |
65 a ds_fill_buffer()-t ami: | 62 a ds_fill_buffer()-t ami: |
66 - megnezi hogy az adott ds-ben vannak-e bufferelve csomagok (dp-k) | 63 - megnezi hogy az adott ds-ben vannak-e bufferelve csomagok (dp-k) |
67 ha igen, akkor a legregebbit atrakja a bufferbe es olvas tovabb. | 64 ha igen, akkor a legregebbit atrakja a bufferbe es olvas tovabb. |
68 ha ures a lancolt lista, akkor meghivja a demux_fill_buffer()-t: | 65 ha ures a lancolt lista, akkor meghivja a demux_fill_buffer()-t: |
69 - ez az input formatumnak megfelelo parset meghivja ami olvassa | 66 - ez az input formatumnak megfelelo parser-t meghivja ami olvassa |
70 tovabb a filet, es a talalt csomagokat rakja be a megfelelo bufferbe. | 67 tovabb a filet, es a talalt csomagokat rakja be a megfelelo bufferbe. |
71 na ha mondjuk audio csomagot szeretennk, de csak egy rakat video csomag | 68 na ha mondjuk audio csomagot szeretnenk, de csak egy rakat video csomag |
72 van, akkor jon elobb-utobb a DEMUXER: Too many (%d in %d bytes) audio | 69 van, akkor jon elobb-utobb a DEMUXER: Too many (%d in %d bytes) audio |
73 packets in the buffer... hibauzenet. | 70 packets in the buffer... hibauzenet. |
74 | 71 |
75 Eddig kb tiszta ugy, ezt akarom majd atrakni kulon lib-be. | 72 Eddig kb tiszta ugy, ezt akarom majd atrakni kulon lib-be. |
76 | 73 |
77 na nezzuk tovabb: | 74 na nezzuk tovabb: |
78 | 75 |
79 3. mplayer.c - igen, o a fonok :) | 76 3. mplayer.c - igen, o a fonok :) |
80 az idozites eleg erdekesen van megoldva, foleg azert mert minden | 77 az idozites eleg erdekesen van megoldva, foleg azert mert minden |
81 fileformatumnal maskepp kell/celszeru, es neha tobbfele keppen is lehet. | 78 fileformatumnal maskepp kell/celszeru, es neha tobbfele keppen is lehet. |
79 | |
82 van egy a_frame es egy v_frame nevu float valtozo, ez tarolja az epp | 80 van egy a_frame es egy v_frame nevu float valtozo, ez tarolja az epp |
83 lathato/hallhato a/v poziciojat masodpercben. | 81 lathato/hallhato a/v poziciojat masodpercben. |
84 akkor jelenit meg ujabb video frame-t, ha v_frame<a_frame, es akkor | 82 |
85 dekodol tovabb hangot ha a_frame<v_frame. | 83 A lejatszo ciklus felepitese: |
84 while(not EOF) { | |
85 fill audio buffer (read & decode audio) + increase a_frame | |
86 read & decode a single video frame + increase v_frame | |
87 sleep (wait until a_frame>=v_frame) | |
88 display the frame | |
89 apply A-V PTS correction to a_frame | |
90 check for keys -> pause,seek,... | |
91 } | |
92 | |
86 amikor lejatszik (hang/kep) akkor a lejatszott valami idotartamaval | 93 amikor lejatszik (hang/kep) akkor a lejatszott valami idotartamaval |
87 noveli a megfelelo valtozot. videonal ez altalaban 1.0/fps, persze | 94 noveli a megfelelo valtozot: |
88 meg kell jegyeznem hogy videonal nem igazna szamit az fps, asf-nel | 95 - audional ez a lejatszott byteok / sh_audio->o_bps |
89 pl. nincs is olyan, ahelyett duration van es framenkent valtozhat. | 96 megj: i_bps = tomoritett byteok szama egy masodpercnyi hanghoz |
97 o_bps = tomoritetlen byteok szama egy masodpercnyi hanghoz | |
98 (ez utobbi == bps*samplerate*channels) | |
99 - videonal ez altalaban az sh_video->frametime. | |
100 Ez altalaban == 1.0/fps, persze meg kell jegyeznem hogy videonal nem | |
101 igazan szamit az fps, asf-nel pl. nincs is olyan, ahelyett duration | |
102 van es framenkent valtozhat. | |
90 mpeg2-nel pedig repeat_count van ami 1-2.5 idotartamban elnyujtja | 103 mpeg2-nel pedig repeat_count van ami 1-2.5 idotartamban elnyujtja |
91 a framet... avi-nal van talan egyedul fix fps, meg mpeg1-nel. | 104 a framet... avi-nal van talan egyedul fix fps, meg mpeg1-nel. |
92 | 105 |
93 Na most ez addig nagyon szepen mukodik, amig a hang es kep tokeletes | 106 Na most ez addig nagyon szepen mukodik, amig a hang es kep tokeletes |
94 szinkronban van, mivel igy vegulis a hang szol, az adja az idozitest, | 107 szinkronban van, mivel igy vegulis a hang szol, az adja az idozitest, |
100 hataron (lasd -mc opcio) belul kepes az mplayer korrigalni az a_frame | 113 hataron (lasd -mc opcio) belul kepes az mplayer korrigalni az a_frame |
101 erteket. a korrekciok osszege van a c_total-ban. | 114 erteket. a korrekciok osszege van a c_total-ban. |
102 | 115 |
103 persze ez meg nem minden szinkron ugyben, van meg nemi gaz. | 116 persze ez meg nem minden szinkron ugyben, van meg nemi gaz. |
104 pl. az hogy a hangkartya eleg rendesen kesleltet, ezt az mplayernek | 117 pl. az hogy a hangkartya eleg rendesen kesleltet, ezt az mplayernek |
105 korrigalnia kell: ezert kell neki az audio buffer merete. amit a | 118 korrigalnia kell! Az osszes audio kesleltetes masodpercben ezek osszege: |
106 select()-e tud lemerni amit viszont nem tud minden kartya... | 119 - az utolso timestamp (PTS) ota beolvasott byteok: |
107 ilyenkor kell a -abs opcioval megadni. | 120 t1 = d_audio->pts_bytes/sh_audio->i_bps |
108 | 121 - Win32/ACM eseten az audio input bufferben tarolt byteok: |
109 aztan van olyan gond is, hogy pl. mpegnel nem framenkent van PTS | 122 t2 = a_in_buffer_len/sh_audio->i_bps |
110 hanem szektoronkent, ami tartalmazhat 10 framet is de 0.1-et is. | 123 - az audio out bufferben tarolt tomoritetlen byteok: |
111 hogy ez ne csessze el az idozitest, atlagoljuk 5 framenkent a | 124 t3 = a_buffer_len/sh_audio->o_bps |
112 PTS-t es ezt az atlag erteket vesszuk figyelembe korrekcional. | 125 - a hangkartya buffereben (vagy DMA bufferben) tarolt, meg nem |
126 lejatszott byteok: | |
127 t4 = get_audio_delay()/sh_audio->o_bps | |
128 | |
129 Ezekbol kiszamolhato egeszen pontosan, hogy az epp hallhato hanghoz | |
130 milyen PTS tartozik, majd ezt osszevetve a video-hoz tartozo PTS-el | |
131 meg is kapjuk az A-V eltereset! | |
113 | 132 |
114 avi-nal sem egyszeru az elet. ott a 'hivatalos' idozitesi mod a | 133 avi-nal sem egyszeru az elet. ott a 'hivatalos' idozitesi mod a |
115 BPS-alapu, azaz a headerben le van tarolva hany tomoritett audio | 134 BPS-alapu, azaz a headerben le van tarolva hany tomoritett audio |
116 byte tartozik egy masodpercnyi (fps darab) kephez. | 135 byte tartozik egy masodpercnyi (fps darab) kephez. |
117 ez persze nem mindig mukodik... miert is mukodne :) | 136 ez persze nem mindig mukodik... miert is mukodne :) |
123 egy nagyobb adag hangot, es csak utana kezdodik a kep. ezt persze | 142 egy nagyobb adag hangot, es csak utana kezdodik a kep. ezt persze |
124 bele kell szamolni a kesleltetesbe, ez az Initial PTS delay. | 143 bele kell szamolni a kesleltetesbe, ez az Initial PTS delay. |
125 ilyen persze 2 is van, az egyik a headerben le is van irva, es | 144 ilyen persze 2 is van, az egyik a headerben le is van irva, es |
126 nem nagyon hasznlajak :) a masik sehol nincs leirva de hasznaljak, ezt | 145 nem nagyon hasznlajak :) a masik sehol nincs leirva de hasznaljak, ezt |
127 csak merni lehet... | 146 csak merni lehet... |
128 | 147 |
148 3.a. audio playback: | |
149 par szo az audio lejatszasrol: | |
150 az egeszben nem maga a lejatszas a nehez, hanem: | |
151 1. hogy tudjuk mikor lehet irni a bufferbe, blocking nelkul | |
152 2. hogy tudjuk, mennyit jatszott mar le abbol amit a bufferbe irtunk | |
153 Az 1. az audio dekodolashoz kell, valamint hogy a buffert mindig teli | |
154 allapotban tudjuk tartani (igy sose fog megakadni a hang). | |
155 A 2. pedig a korrekt idoziteshez szukseges, ugyanis nemely hangkartya | |
156 akar 3-7 masodpercet is kesleltet, ami azert nem elhanyagolhato! | |
157 Ezek megvalositasara az OSS tobbfele lehetoseget is kinal: | |
158 - ioctl(SNDCTL_DSP_GETODELAY): megmondja hany lejatszatlan byte | |
159 varakozik a hangkartya bufferjeben -> idoziteshez kivallo, | |
160 de nem minden driver tamogatja :( | |
161 - ioctl(SNDCTL_DSP_GETOSPACE): megmondja mennyit irhatunk a kartya | |
162 bufferebe blocking nelkul. ha a driver nem tudja a GETODELAY-t, | |
163 akkor ezt hasznalhatjuk arra is, hogy megtudjuk a kesleltetest. | |
164 - select(): meg kene mondja, hogy irhatunk-e a kartya bufferebe | |
165 blocking nelkul. azt, hogy emnnyit irhatunk, nem mondja meg :( | |
166 valamint sok driverrel egyaltalan nem, vagy rosszul mukodik :(( | |
167 csak akkor hasznalom, ha egyik fenti ioctl() sem mukodik. | |
168 | |
129 4. codecek. ezek kulonbozo lib-ek szanaszet mindenfelol. | 169 4. codecek. ezek kulonbozo lib-ek szanaszet mindenfelol. |
130 mint pl. libac3, libmpeg2, xa/*, alaw.c, opendivx/*, loader, mp3lib. | 170 mint pl. libac3, libmpeg2, xa/*, alaw.c, opendivx/*, loader, mp3lib. |
131 az mplayer.c hivogatja oket amikor egy egy darab hangot vagy framet | 171 az mplayer.c hivogatja oket amikor egy egy darab hangot vagy framet |
132 kell lejatszani (lasd 3. pont elejen). | 172 kell lejatszani (lasd 3. pont elejen). |
133 ezek pedig hivjak a megfelelo demuxert hogy megkapjak a tomoritett | 173 ezek pedig hivjak a megfelelo demuxert hogy megkapjak a tomoritett |
171 valtani a kert bpp-re. Ha azt a hardver nem tamogatja, akkor a legkozelebbi | 211 valtani a kert bpp-re. Ha azt a hardver nem tamogatja, akkor a legkozelebbi |
172 modra (15 eseten 16-ra, 24 eseten 32-re) kell valtani es konvertalni! | 212 modra (15 eseten 16-ra, 24 eseten 32-re) kell valtani es konvertalni! |
173 | 213 |
174 init() - ez hivodik meg a legelso frame kirakasa elott - bufferek foglalasa | 214 init() - ez hivodik meg a legelso frame kirakasa elott - bufferek foglalasa |
175 stb a celja. | 215 stb a celja. |
216 van egy flags parameter is (regen fullscreen volt a neve): | |
217 0x01 - fullscreen (-fs) | |
218 0x02 - vidmode switch (-vm) | |
219 0x04 - scaling enabled (-zoom) | |
220 0x08 - flip image (upside-down) | |
176 | 221 |
177 draw_slice(): ez planar YV12 kepet rak ki (3 db plane, egy teljes | 222 draw_slice(): ez planar YV12 kepet rak ki (3 db plane, egy teljes |
178 meretu ami a fenyerot (Y) tartalmazza, es 2 negyedakkora, ami a | 223 meretu ami a fenyerot (Y) tartalmazza, es 2 negyedakkora, ami a |
179 szin (U,V) infot). ezt hasznaljak az mpeg codecek (libmpeg2,opendivx). | 224 szin (U,V) infot). ezt hasznaljak az mpeg codecek (libmpeg2,opendivx). |
180 ez mar tud olyat hogy nem az egesz kep kirakasa, hanem csak kis | 225 ez mar tud olyat hogy nem az egesz kep kirakasa, hanem csak kis |