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