annotate DOCS/tech/tech-hun.txt @ 5451:b716977c47d9

added vfw uninit
author alex
date Mon, 01 Apr 2002 13:26:38 +0000
parents 9c13e907f284
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1263
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
1 Nos, akkor leírom, hogyan is működik ez az egész.
86
f61bcfc02d2d how does mplayer works - hungarian doc
arpi_esp
parents:
diff changeset
2
f61bcfc02d2d how does mplayer works - hungarian doc
arpi_esp
parents:
diff changeset
3 A fő modulok:
f61bcfc02d2d how does mplayer works - hungarian doc
arpi_esp
parents:
diff changeset
4
861
c80faaa2c2c1 some updates
arpi_esp
parents: 544
diff changeset
5 1. streamer.c: ez az input layer, azaz ez olvassa a filet, VCD-t vagy stdin-t.
1263
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
6 amit tudnia kell: megfelelő sectoronkénti bufferelés, seek, skip funkciók,
86
f61bcfc02d2d how does mplayer works - hungarian doc
arpi_esp
parents:
diff changeset
7 byte-onkénti ill. tetszőleges méretű blockonkénti olvasás.
1263
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
8 Egy stream (input device/file) leírására a stream_t struktúra szolgál.
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
9
86
f61bcfc02d2d how does mplayer works - hungarian doc
arpi_esp
parents:
diff changeset
10 2. demuxer.c: ez végzi az input szétszedését audio és video csatornákra,
861
c80faaa2c2c1 some updates
arpi_esp
parents: 544
diff changeset
11 és a kiválasztott csatornák bufferelt package-enkénti olvasását.
86
f61bcfc02d2d how does mplayer works - hungarian doc
arpi_esp
parents:
diff changeset
12 A demuxer.c inkább csak egy framework, ami közös minden input
1263
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
13 formátumra, és az egyes formátumokhoz (mpeg-es, mpeg-ps, avi, avi-ni,
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
14 asf) külön parser van, ezek a demux_*.c file-okban vannak.
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
15 A hozzá tartozó struktúra a demuxer_t. Összesen egy demuxer van.
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
16
544
b6cfefccd071 some updates, and libvo description completed
arpi_esp
parents: 404
diff changeset
17 2.a. demux_packet_t, azaz dp.
1263
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
18 ez egy darab chunk-ot (avi) vagy packet-et (asf, mpg) tartalmaz.
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
19 memóriában ezek láncolt listában vannak, mivel különböző méretűek.
86
f61bcfc02d2d how does mplayer works - hungarian doc
arpi_esp
parents:
diff changeset
20
861
c80faaa2c2c1 some updates
arpi_esp
parents: 544
diff changeset
21 2.b. demuxer stream, azaz ds.
c80faaa2c2c1 some updates
arpi_esp
parents: 544
diff changeset
22 struct: demux_stream_t
1263
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
23 minden egyes csatornához (a/v) tartozik egy ilyen.
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
24 ez tartalmazza a stream-hez tartozó packeteket (lásd. 2.a.)
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
25 egyelőre demuxer-enként 3 ilyen lehet:
861
c80faaa2c2c1 some updates
arpi_esp
parents: 544
diff changeset
26 - hang (d_audio)
1263
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
27 - kép (d_video)
861
c80faaa2c2c1 some updates
arpi_esp
parents: 544
diff changeset
28 - DVD felirat (d_dvdsub)
544
b6cfefccd071 some updates, and libvo description completed
arpi_esp
parents: 404
diff changeset
29
1263
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
30 2.c. stream header. 2 féle van (egyelőre): sh_audio_t és sh_video_t
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
31 ez tartalmaz minden, a dekódoláshoz szükséges paramétert, így az input
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
32 és output buffereket, kiválasztott codecet, fps/framerate stb adatokat.
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
33 Annyi van belőle, ahány stream van a file-ban tárolva. Lesz minimum egy
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
34 a videohoz, ha van hang akkor ahhoz is, de ha több audio/video stream
544
b6cfefccd071 some updates, and libvo description completed
arpi_esp
parents: 404
diff changeset
35 is van, akkor mindegyikhez lesz egy ilyen struct.
1263
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
36 Ezeket avi/asf esetén a header alapján tölti fel a header beolvasó,
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
37 mpeg esetén pedig a demux_mpg.c fogja létrehozni, ha egy új streamet
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
38 talál. Új stream esetén ====> Found audio/video stream: <id> jelenik meg.
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
39
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
40 A kiválasztott stream header és a hozzá tartozó demuxer stream kölcsönösen
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
41 hivatkoznak egymásra (ds->sh és sh->ds) az egyszerűbb használat végett.
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
42 (így a funkciótól függően elég vagy csak a ds vagy csak az sh átadása)
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
43
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
44 Példa: van egy .asf file-unk, abban 6 db stream, ebből 1 audio és 5 video.
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
45 A header beolvasásakor létre fog jönni 6 db sh struct, 1 audio és 5 video.
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
46 Amikor elkezdi olvasni a packeteket, az első talált audio és video
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
47 packethez tartozó streamet kivalasztja, es ezekre allitja be a d_audio
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
48 és d_video sh pointereit.
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
49 Így a későbbiekben már csak ezeket a streameket olvassa, a többit nem.
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
50 Persze, ha a user másik streameket szeretne kiválasztani, akkor
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
51 force-olhatja az -aid és -vid kapcsolókkal.
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
52 Jó pelda erre a DVD, ahol nem mindig az angol szinkron hang az első
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
53 megtalált stream, és így random minden vob más nyelven szólalhat meg :)
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
54 Ilyenkor kell pl. az -aid 128 kapcsolót használni.
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
55
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
56 hogy is műxik ez a beolvasósdi?
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
57 - meghívódik a demuxer.c/demux_read_data(), megkapja melyik ds-ből
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
58 (audio vagy video), mennyi byte-ot és hova (memóriacím) szeretnénk
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
59 beolvasni. Ezt hívogatják gyakorlatilag a codec-ek.
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
60 - ez megnézi, hogy az adott ds bufferében van-e valami, ha igen akkor
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
61 onnan olvas, amennyit kell. Ha nincs/nincs elég, akkor meghívja
86
f61bcfc02d2d how does mplayer works - hungarian doc
arpi_esp
parents:
diff changeset
62 a ds_fill_buffer()-t ami:
1263
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
63 - megnézi, hogy az adott ds-ben vannak-e bufferelve csomagok (dp-k)
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
64 ha igen, akkor a legrégebbit átrakja a bufferbe és olvas tovább. Ha
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
65 üres a láncolt lista, akkor meghívja a demux_fill_buffer()-t:
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
66 - ez az input formátumnak megfelelő parser-t hívja meg, ami továbbol-
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
67 vassa a file-t, és a talált csomagokat berakja a megfelelő bufferbe.
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
68 Na, ha mondjuk audio csomagot szeretnénk, de csak egy rakat
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
69 video csomag van, akkor jön előbb-utóbb a DEMUXER: Too many
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
70 (%d in %d bytes) audio packets in the buffer... hibaüzenet.
86
f61bcfc02d2d how does mplayer works - hungarian doc
arpi_esp
parents:
diff changeset
71
1263
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
72 Eddig kb. tiszta ügy, ezt akarom majd átrakni külön lib-be.
86
f61bcfc02d2d how does mplayer works - hungarian doc
arpi_esp
parents:
diff changeset
73
1263
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
74 na nézzuk tovább:
86
f61bcfc02d2d how does mplayer works - hungarian doc
arpi_esp
parents:
diff changeset
75
1263
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
76 3. mplayer.c - igen, ő a főnök :)
1484
14af3106c359 updated
arpi
parents: 1263
diff changeset
77
14af3106c359 updated
arpi
parents: 1263
diff changeset
78 Fő feladata a különböző modulok összekapcsolása, illetve az A-V
14af3106c359 updated
arpi
parents: 1263
diff changeset
79 szinkron biztosítása.
861
c80faaa2c2c1 some updates
arpi_esp
parents: 544
diff changeset
80
1484
14af3106c359 updated
arpi
parents: 1263
diff changeset
81 Az adott stream aktuális pozíciója a megfelelo stream header
14af3106c359 updated
arpi
parents: 1263
diff changeset
82 (sh_audio / sh_video) timer field-ben van.
14af3106c359 updated
arpi
parents: 1263
diff changeset
83 (Régen ez volt az a_frame és egy v_frame nevű float változó)
1263
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
84
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
85 A lejátszó ciklus felépítése:
861
c80faaa2c2c1 some updates
arpi_esp
parents: 544
diff changeset
86 while(not EOF) {
c80faaa2c2c1 some updates
arpi_esp
parents: 544
diff changeset
87 fill audio buffer (read & decode audio) + increase a_frame
c80faaa2c2c1 some updates
arpi_esp
parents: 544
diff changeset
88 read & decode a single video frame + increase v_frame
c80faaa2c2c1 some updates
arpi_esp
parents: 544
diff changeset
89 sleep (wait until a_frame>=v_frame)
c80faaa2c2c1 some updates
arpi_esp
parents: 544
diff changeset
90 display the frame
c80faaa2c2c1 some updates
arpi_esp
parents: 544
diff changeset
91 apply A-V PTS correction to a_frame
c80faaa2c2c1 some updates
arpi_esp
parents: 544
diff changeset
92 check for keys -> pause,seek,...
c80faaa2c2c1 some updates
arpi_esp
parents: 544
diff changeset
93 }
1263
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
94
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
95 amikor lejátszik (hang/kép) akkor a lejátszott valami időtartamával
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
96 növeli a megfelelő változót:
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
97 - audionál ez a lejátszott byte-ok / sh_audio->o_bps
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
98 megj.: i_bps = tömörített byte-ok széma egy másodpercnyi hanghoz
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
99 o_bps = tömörítetlen byte-ok száma egy másodpercnyi hanghoz
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
100 (ez utóbbi == bps*samplerate*channels)
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
101 - videonál ez általában az sh_video->frametime.
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
102 Ez általában == 1.0/fps, persze meg kell jegyeznem, hogy videonál nem
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
103 igazán számít az fps, asf-nél pl. nincs is olyan, ahelyett duration
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
104 van és frame-enként változhat.
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
105 mpeg2-nél pedig repeat_count van, ami 1-2.5 időtartamban elnyújtja
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
106 a frame-et... avi-nál van talán egyedül fix fps, meg mpeg1-nél.
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
107
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
108 Na most ez addig nagyon szépen működik, amíg a hang és kép tökéletes
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
109 szinkronban van, mivel így végülis a hang szól, az adja az időzítést,
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
110 és amikor eltelt egy frame-nyi idő, akkor kirakja a következő frame-et.
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
111 De mi van, ha valamiért az input file-ban csúszik a kettő?
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
112 Akkor jön be a PTS correction. Az input demuxer-ek olvassák a
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
113 csomagokkal együtt a hozzájuk tartozó PTS-t (presentation timestamp)
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
114 is, ami alapján észrevehető, ha el van csúszva a kettő. Ilyenkor egy
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
115 megadott maximális határon (lásd -mc opció) belül képes az mplayer
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
116 korrigalni az a_frame értékét. A korrekciók összege van a c_total-ban.
86
f61bcfc02d2d how does mplayer works - hungarian doc
arpi_esp
parents:
diff changeset
117
1263
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
118 Persze ez még nem minden szinkron ügyben, van még némi gáz. Pl. az,
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
119 hogy a hangkártya elég rendesen késleltet, ezt az mplayernek korrigálnia
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
120 kell! Az összes audio késleltetés másodpercben ezek összege:
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
121 - az utolsó timestamp (PTS) óta beolvasott byte-ok:
861
c80faaa2c2c1 some updates
arpi_esp
parents: 544
diff changeset
122 t1 = d_audio->pts_bytes/sh_audio->i_bps
1263
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
123 - Win32/ACM esetén az audio input bufferben tárolt byte-ok:
861
c80faaa2c2c1 some updates
arpi_esp
parents: 544
diff changeset
124 t2 = a_in_buffer_len/sh_audio->i_bps
1263
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
125 - az audio out bufferben tárolt tömörítetlen byte-ok:
861
c80faaa2c2c1 some updates
arpi_esp
parents: 544
diff changeset
126 t3 = a_buffer_len/sh_audio->o_bps
1263
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
127 - a hangkártya bufferében (vagy DMA bufferben) tárolt, még nem
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
128 lejátszott byte-ok:
861
c80faaa2c2c1 some updates
arpi_esp
parents: 544
diff changeset
129 t4 = get_audio_delay()/sh_audio->o_bps
1263
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
130
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
131 Ezekből kiszámolható egészen pontosan, hogy az épp hallható hanghoz
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
132 milyen PTS tartozik, majd ezt összevetve a video-hoz tartozo PTS-el
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
133 meg is kapjuk az A-V eltérését!
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
134
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
135 Avi-nál sem egyszerű az élet. Ott a 'hivatalos' időzítési mód a
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
136 BPS-alapú, azaz a headerben le van tárolva, hány tömörített audio
1484
14af3106c359 updated
arpi
parents: 1263
diff changeset
137 byte vagy chunk tartozik egy másodpercnyi (fps darab) képhez.
14af3106c359 updated
arpi
parents: 1263
diff changeset
138 Az AVI stream headerben van 2 fontos mezo, a dwSampleSize, es
14af3106c359 updated
arpi
parents: 1263
diff changeset
139 a dwRate/dwScale aránypár:
14af3106c359 updated
arpi
parents: 1263
diff changeset
140 - Ha a dwSampleSize 0, akkor VBR stream, tehat nem konstans a
14af3106c359 updated
arpi
parents: 1263
diff changeset
141 bitrate. Ilyenkor 1 chunk tarol 1 sample-t, es a masodpercenkenti
14af3106c359 updated
arpi
parents: 1263
diff changeset
142 chunkok szamat adja a dwRate/dwScale.
14af3106c359 updated
arpi
parents: 1263
diff changeset
143 - Ha a dwSampleSize>0, akkor constant bitrate van, es az ido igy
14af3106c359 updated
arpi
parents: 1263
diff changeset
144 szamolhato: time = (bytepos/dwSampleSize) / (dwRate/dwScale)
14af3106c359 updated
arpi
parents: 1263
diff changeset
145 (tehat a sample sorszamat elosztjuk a samplerate-el)
14af3106c359 updated
arpi
parents: 1263
diff changeset
146 Ilyenkor stream-kent kezelheto az audio, ami tetszolegesen
14af3106c359 updated
arpi
parents: 1263
diff changeset
147 chunk-okra van darabolva, de lehet akar 1 db chunk is az egesz.
14af3106c359 updated
arpi
parents: 1263
diff changeset
148
14af3106c359 updated
arpi
parents: 1263
diff changeset
149 A másik lehetőség csak az interleaved fileoknál használható: a
14af3106c359 updated
arpi
parents: 1263
diff changeset
150 chunk-ok sorrendjéből számolható egy timestamp (PTS) érték.
14af3106c359 updated
arpi
parents: 1263
diff changeset
151 A video chunkok PTS-e egyszerű: chunk száma * fps
14af3106c359 updated
arpi
parents: 1263
diff changeset
152 Az audio pedig az előtte levő video chunk-éval azonos.
14af3106c359 updated
arpi
parents: 1263
diff changeset
153 Ilyenkor viszont szamolni kell az ugynev. "audio preload"-al is,
14af3106c359 updated
arpi
parents: 1263
diff changeset
154 azaz van egy fix kesleltetes az audio es video stream-ek kozott.
14af3106c359 updated
arpi
parents: 1263
diff changeset
155 Ez altalaban 0.5-1.0 sec, de van amikor egeszen mas.
14af3106c359 updated
arpi
parents: 1263
diff changeset
156 A pontos erteket regen mertuk, most a demux_avi.c kezeli le:
14af3106c359 updated
arpi
parents: 1263
diff changeset
157 az elso video utani audio chunknal kiszamolja az A-V elterest,
14af3106c359 updated
arpi
parents: 1263
diff changeset
158 es ezt veszi az audio preload mertekenek.
14af3106c359 updated
arpi
parents: 1263
diff changeset
159
861
c80faaa2c2c1 some updates
arpi_esp
parents: 544
diff changeset
160 3.a. audio playback:
1263
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
161 pár szó az audio lejátszásról:
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
162 az egészben nem maga a lejátszás a nehéz, hanem:
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
163 1. hogy tudjuk, mikor lehet írni a bufferbe, blocking nélkül
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
164 2. hogy tudjuk, mennyit játszott már le abból, amit a bufferbe írtunk
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
165 Az 1. az audio dekódoláshoz kell, valamint hogy a buffert mindig teli
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
166 állapotban tudjuk tartani (így sose fog megakadni a hang).
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
167 A 2. pedig a korrekt időzítéshez szükséges, ugyanis némely hangkártya
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
168 akár 3-7 másodpercet is késleltet, ami azért nem elhanyagolható!
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
169 Ezek megvalósítására az OSS többféle lehetőséget is kínál:
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
170 - ioctl(SNDCTL_DSP_GETODELAY): megmondja, hány lejátszatlan byte
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
171 várakozik a hangkártya bufferében -> időzítéshez kiváló,
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
172 de nem minden driver támogatja :(
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
173 - ioctl(SNDCTL_DSP_GETOSPACE): megmondja, mennyit írhatunk a kártya
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
174 bufferébe blocking nélkül. Ha a driver nem tudja a GETODELAY-t,
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
175 akkor ezt hasznalhatjuk arra is, hogy megtudjuk a késleltetést.
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
176 - select(): meg kéne mondja, hogy írhatunk-e a kártya bufferébe
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
177 blocking nélkül. Azt, hogy mennyit írhatunk, nem mondja meg :(
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
178 valamint sok driverrel egyáltalán nem, vagy rosszul működik :((
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
179 csak akkor használom, ha egyik fenti ioctl() sem működik.
861
c80faaa2c2c1 some updates
arpi_esp
parents: 544
diff changeset
180
1263
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
181 4. codecek. ezek különböző lib-ek szanaszét mindenfelől.
86
f61bcfc02d2d how does mplayer works - hungarian doc
arpi_esp
parents:
diff changeset
182 mint pl. libac3, libmpeg2, xa/*, alaw.c, opendivx/*, loader, mp3lib.
1484
14af3106c359 updated
arpi
parents: 1263
diff changeset
183
14af3106c359 updated
arpi
parents: 1263
diff changeset
184 Az mplayer.c nem kozvetlenul hivja oket, hanem a dec_audio.c es a
14af3106c359 updated
arpi
parents: 1263
diff changeset
185 dec_video.c fileokon keresztul, igy az mplayer.c-nek nem kell semmit
14af3106c359 updated
arpi
parents: 1263
diff changeset
186 sem tudnia a codecrol.
14af3106c359 updated
arpi
parents: 1263
diff changeset
187
1263
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
188 5. libvo: ez végzi a kép kirakását.
544
b6cfefccd071 some updates, and libvo description completed
arpi_esp
parents: 404
diff changeset
189
1263
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
190 Az img_format.h-ban definiálva vannak konstansok a különböző pixel-
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
191 formátumokhoz, ezeket kötelező használni.
544
b6cfefccd071 some updates, and libvo description completed
arpi_esp
parents: 404
diff changeset
192
1263
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
193 1-1 vo drivernek a következőket kell kötelezően implementálnia:
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
194
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
195 query_format() - lekérdezi, hogy egy adott pixelformat támogatott-e.
544
b6cfefccd071 some updates, and libvo description completed
arpi_esp
parents: 404
diff changeset
196 return value: flags:
b6cfefccd071 some updates, and libvo description completed
arpi_esp
parents: 404
diff changeset
197 0x1 - supported (by hardware or with conversion)
b6cfefccd071 some updates, and libvo description completed
arpi_esp
parents: 404
diff changeset
198 0x2 - supported (by hardware, without conversion)
b6cfefccd071 some updates, and libvo description completed
arpi_esp
parents: 404
diff changeset
199 0x4 - sub/osd supported (has draw_alpha)
1263
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
200 FONTOS: minden vo drivernek kötelező támogatnia az YV12 formátumot, és
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
201 egyiket (vagy mindkettőt) a BGR15 és BGR24 közül, ha kell, konvertálással.
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
202 Ha ezeket nem támogatja, akkor nem fog minden codec-kel működni!
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
203 Ennek az az oka, hogy az mpeg codecek csak YV12-t tudnak előállítani,
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
204 a régebbi Win32 DLL codecek pedig csak 15 és 24bpp-t tudnak.
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
205 Van egy gyors MMX-es 15->16bpp konvertáló, így az nem okoz különösebb
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
206 sebességcsökkenést!
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
207
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
208 A BPP táblázat, ha a driver nem tud bpp-t váltani:
544
b6cfefccd071 some updates, and libvo description completed
arpi_esp
parents: 404
diff changeset
209 jelenlegi bpp: ezeket kell elfogadni:
b6cfefccd071 some updates, and libvo description completed
arpi_esp
parents: 404
diff changeset
210 15 15
b6cfefccd071 some updates, and libvo description completed
arpi_esp
parents: 404
diff changeset
211 16 15,16
b6cfefccd071 some updates, and libvo description completed
arpi_esp
parents: 404
diff changeset
212 24 24
b6cfefccd071 some updates, and libvo description completed
arpi_esp
parents: 404
diff changeset
213 24,32 24,32
b6cfefccd071 some updates, and libvo description completed
arpi_esp
parents: 404
diff changeset
214
1263
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
215 Ha tud bpp-t váltani (pl. DGA 2, fbdev, svgalib) akkor, ha lehet, be kell
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
216 váltani a kért bpp-re. Ha azt a hardver nem támogatja, akkor a legközelebbi
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
217 módra (15 esetén 16-ra, 24 esetén 32-re) kell váltani és konvertálni!
544
b6cfefccd071 some updates, and libvo description completed
arpi_esp
parents: 404
diff changeset
218
1263
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
219 init() - ez hívódik meg a legelső frame kirakása előtt - bufferek foglalása
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
220 stb a célja.
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
221 van egy flags paraméter is (régen fullscreen volt a neve):
861
c80faaa2c2c1 some updates
arpi_esp
parents: 544
diff changeset
222 0x01 - fullscreen (-fs)
c80faaa2c2c1 some updates
arpi_esp
parents: 544
diff changeset
223 0x02 - vidmode switch (-vm)
c80faaa2c2c1 some updates
arpi_esp
parents: 544
diff changeset
224 0x04 - scaling enabled (-zoom)
c80faaa2c2c1 some updates
arpi_esp
parents: 544
diff changeset
225 0x08 - flip image (upside-down)
544
b6cfefccd071 some updates, and libvo description completed
arpi_esp
parents: 404
diff changeset
226
1263
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
227 draw_slice(): ez planar YV12 képet rak ki (3 db plane, egy teljes
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
228 méretű, ami a fényerőt (Y) tartalmazza, és 2 negyedakkora, ami a
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
229 szín (U,V) infót). ezt használják az mpeg codecek (libmpeg2, opendivx).
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
230 ez már tud olyat, hogy nem az egész kép kirakása, hanem csak kis
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
231 részletek update-elése: ilyenkor a sarkának és a darabka méretének
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
232 megadásával lehet használni.
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
233
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
234 draw_frame(): ez a régebbi interface, ez csak komplett frame-et rak ki,
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
235 és csak packed formátumot (YUY2 stb, RGB/BGR) tud.
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
236 ezt használják a win32 codecek (divx, indeo stb).
544
b6cfefccd071 some updates, and libvo description completed
arpi_esp
parents: 404
diff changeset
237
1263
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
238 draw_alpha(): ez rakja ki a subtitle-t és az OSD-t.
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
239 használata kicsit cseles, mivel ez nem a libvo API része, hanem egy
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
240 callback jellegű cucc. a flip_page() kell meghívja a vo_draw_text()-et
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
241 úgy, hogy paraméterként átadja a képernyő méreteit és a pixel-
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
242 formátumnak megfelelő draw_alpha() implementációt (function pointer).
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
243 Ezután a vo_draw_text() végigmegy a kirajzolandó karaktereken, és
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
244 egyenként meghívja minden karakterre a draw_alpha()-t.
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
245 Segítség képpen az osd.c-ben meg van írva a draw_alpha mindenféle
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
246 pixelformátumhoz, ha lehet ezt használd!
544
b6cfefccd071 some updates, and libvo description completed
arpi_esp
parents: 404
diff changeset
247
1263
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
248 flip_page(): ez meghívódik minden frame után, ennek kell ténylegesen meg-
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
249 jeleníteni a buffert. double buffering esetén ez lesz a 'swapbuffers'.
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
250
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
251 6. libao2: ez vezérli a hang lejátszást
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
252
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
253 A libvo-hoz (lásd 5.) hasonlóan itt is különböző driverek vannak, amik
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
254 egy közös API-t (interface) valósítanak meg:
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
255
971
dcf8d81eed48 Gabucino oruljel :)
arpi_esp
parents: 861
diff changeset
256 static int control(int cmd,int arg);
1263
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
257 Ez egy általános célú függvény, a driverfüggő és egyéb speciális paraméterek
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
258 olvasására/beállítására. Egyelőre nem nagyon használt.
544
b6cfefccd071 some updates, and libvo description completed
arpi_esp
parents: 404
diff changeset
259
971
dcf8d81eed48 Gabucino oruljel :)
arpi_esp
parents: 861
diff changeset
260 static int init(int rate,int channels,int format,int flags);
1263
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
261 Driver initje, ilyenkor kell megnyitni a device-t, beállítani samplerate,
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
262 channels, sample format paramétereket.
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
263 Sample format: általában AFMT_S16_LE vagy AFMT_U8, további definíciókért
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
264 lásd. dec_audio.c ill. linux/soundcard.h file-okat!
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
265
971
dcf8d81eed48 Gabucino oruljel :)
arpi_esp
parents: 861
diff changeset
266 static void uninit();
1263
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
267 Találd ki!
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
268 Na jó, segítek: lezárja a device-t, kilépéskor (még nem) hívódik meg.
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
269
971
dcf8d81eed48 Gabucino oruljel :)
arpi_esp
parents: 861
diff changeset
270 static void reset();
1263
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
271 Reseteli a device-t. Egész pontosan a bufferek törlésére szolgál,
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
272 tehát hogy a reset() után már ne szóljon tovább az, amit előtte kapott.
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
273 (pause ill. seek esetén hívódik meg)
971
dcf8d81eed48 Gabucino oruljel :)
arpi_esp
parents: 861
diff changeset
274
dcf8d81eed48 Gabucino oruljel :)
arpi_esp
parents: 861
diff changeset
275 static int get_space();
1263
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
276 Vissza kell adja, hogy hány byte írható az audio bufferbe anélkül, hogy
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
277 blockolna (várakoztatná a hívó processt). Amennyiben a buffer (majdnem)
971
dcf8d81eed48 Gabucino oruljel :)
arpi_esp
parents: 861
diff changeset
278 tele van, 0-t kell visszaadni!
1263
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
279 Ha sosem ad vissza 0-t, akkor nem fog működni az MPlayer!
971
dcf8d81eed48 Gabucino oruljel :)
arpi_esp
parents: 861
diff changeset
280
dcf8d81eed48 Gabucino oruljel :)
arpi_esp
parents: 861
diff changeset
281 static int play(void* data,int len,int flags);
1263
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
282 Lejátszik egy adag hangot, amit a data című memóriaterületen kap és len
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
283 a mérete. a flags még nem használt. Az adatokat át kell másolnia, mert a
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
284 hívás után felülíródhatnak! Nem kell feltétlen minden byte-ot felhasználni,
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
285 hanem azt kell visszaadnia, mennyit használt fel (másolt a bufferbe).
971
dcf8d81eed48 Gabucino oruljel :)
arpi_esp
parents: 861
diff changeset
286
dcf8d81eed48 Gabucino oruljel :)
arpi_esp
parents: 861
diff changeset
287 static int get_delay();
4582
9c13e907f284 applied patch from Andres Johansson
gabucino
parents: 1484
diff changeset
288 Visszaadja meddig fog tartani az éppen az audio bufferben levő adat
9c13e907f284 applied patch from Andres Johansson
gabucino
parents: 1484
diff changeset
289 lejátszása. Lehetőleg minél pontosabban, mert ettől függ az egész időzítés!
9c13e907f284 applied patch from Andres Johansson
gabucino
parents: 1484
diff changeset
290 Legrosszabb esetben adja vissza a maximális időzítést.
971
dcf8d81eed48 Gabucino oruljel :)
arpi_esp
parents: 861
diff changeset
291
1263
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
292 !!! Mivel a kép a hanghoz (hangkártyához) van szinkronizálva, így nagyon fontos,
4f61dc71a8e2 accented by Tibcu
arpi
parents: 986
diff changeset
293 !!! hogy a get_space ill. get_delay függvények korrektül legyenek megírva!
971
dcf8d81eed48 Gabucino oruljel :)
arpi_esp
parents: 861
diff changeset
294
4582
9c13e907f284 applied patch from Andres Johansson
gabucino
parents: 1484
diff changeset
295 6.a Audio plugin-ek
9c13e907f284 applied patch from Andres Johansson
gabucino
parents: 1484
diff changeset
296 Remélem tudsz angolul.