git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@1485 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
arpi 2001-08-11 17:05:35 +00:00
parent 56cb8a2d3a
commit 5a09680795
1 changed files with 34 additions and 29 deletions

View File

@ -74,11 +74,13 @@ Eddig kb. tiszta
na nézzuk tovább: na nézzuk tovább:
3. mplayer.c - igen, ő a főnök :) 3. mplayer.c - igen, ő a főnök :)
az időzítes élég érdekesen van megoldva, főleg azért mert minden file-
formátumnál másképp kell/célszerű, és néha többféle képpen is lehet.
van egy a_frame és egy v_frame nevű float változó, ez tárolja az épp Fő feladata a különböző modulok összekapcsolása, illetve az A-V
látható/hallható a/v pozícióját másodpercben. szinkron biztosítása.
Az adott stream aktuális pozíciója a megfelelo stream header
(sh_audio / sh_video) timer field-ben van.
(Régen ez volt az a_frame és egy v_frame nevű float változó)
A lejátszó ciklus felépítése: A lejátszó ciklus felépítése:
while(not EOF) { while(not EOF) {
@ -132,19 +134,29 @@ na n
Avi-nál sem egyszerű az élet. Ott a 'hivatalos' időzítési mód a Avi-nál sem egyszerű az élet. Ott a 'hivatalos' időzítési mód a
BPS-alapú, azaz a headerben le van tárolva, hány tömörített audio BPS-alapú, azaz a headerben le van tárolva, hány tömörített audio
byte tartozik egy másodpercnyi (fps darab) képhez. byte vagy chunk tartozik egy másodpercnyi (fps darab) képhez.
ez persze nem mindig működik... miért is működne :) Az AVI stream headerben van 2 fontos mezo, a dwSampleSize, es
Ezért én megcsináltam, hogy az mpeg-nél használatos sectoronkénti a dwRate/dwScale aránypár:
PTS értéket emulálom avi-ra is, azaz az AVI parser minden beolvasott - Ha a dwSampleSize 0, akkor VBR stream, tehat nem konstans a
chunk-nál számol egy kamu PTS-t a frame-ek típusa alapján, és ez bitrate. Ilyenkor 1 chunk tarol 1 sample-t, es a masodpercenkenti
alapjan idozitek. És van amikor ez működik jobban. chunkok szamat adja a dwRate/dwScale.
Persze itt még bejátszik az is, hogy AVI-nál általában előre - Ha a dwSampleSize>0, akkor constant bitrate van, es az ido igy
letárolnak egy nagyobb adag hangot, és csak utána kezdődik a kép. szamolhato: time = (bytepos/dwSampleSize) / (dwRate/dwScale)
Ezt persze bele kell számolni a késleltetésbe, ez az Initial PTS delay. (tehat a sample sorszamat elosztjuk a samplerate-el)
Ilyen persze 2 is van, az egyik a headerben le is van írva, és Ilyenkor stream-kent kezelheto az audio, ami tetszolegesen
nem nagyon használják. :) A másik sehol nincs leírva, de használják, chunk-okra van darabolva, de lehet akar 1 db chunk is az egesz.
ezt csak mérni lehet...
A másik lehetőség csak az interleaved fileoknál használható: a
chunk-ok sorrendjéből számolható egy timestamp (PTS) érték.
A video chunkok PTS-e egyszerű: chunk száma * fps
Az audio pedig az előtte levő video chunk-éval azonos.
Ilyenkor viszont szamolni kell az ugynev. "audio preload"-al is,
azaz van egy fix kesleltetes az audio es video stream-ek kozott.
Ez altalaban 0.5-1.0 sec, de van amikor egeszen mas.
A pontos erteket regen mertuk, most a demux_avi.c kezeli le:
az elso video utani audio chunknal kiszamolja az A-V elterest,
es ezt veszi az audio preload mertekenek.
3.a. audio playback: 3.a. audio playback:
pár szó az audio lejátszásról: pár szó az audio lejátszásról:
az egészben nem maga a lejátszás a nehéz, hanem: az egészben nem maga a lejátszás a nehéz, hanem:
@ -168,18 +180,11 @@ na n
4. codecek. ezek különböző lib-ek szanaszét mindenfelől. 4. codecek. ezek különböző lib-ek szanaszét mindenfelől.
mint pl. libac3, libmpeg2, xa/*, alaw.c, opendivx/*, loader, mp3lib. mint pl. libac3, libmpeg2, xa/*, alaw.c, opendivx/*, loader, mp3lib.
az mplayer.c hívogatja őket, amikor egy-egy darab hangot vagy frame-et
kell lejátszani (lásd 3. pont elején). Az mplayer.c nem kozvetlenul hivja oket, hanem a dec_audio.c es a
ezek pedig hívják a megfelelő demuxert, hogy megkapják a tömörített dec_video.c fileokon keresztul, igy az mplayer.c-nek nem kell semmit
adatokat (lásd 2. pont). sem tudnia a codecrol.
paraméterként a megfelelő stream headert (sh_audio/sh_video) kell
átadni, ez elvileg tartalmaz minden infót, ami szükséges a
dekódoláshoz (többek között a demuxert is: sh->ds).
A codecek szeparálasa folyamatban van, az audio már el van különítve
(lásd. dec_audio.c), a videon még dolgozunk. Cél, hogy ne az mplayer.c
kelljen tudja, milyen codecek vannak és hogy kell őket használni, hanem
egy közös init/decode audio/video functiont kelljen csak meghívnia.
5. libvo: ez végzi a kép kirakását. 5. libvo: ez végzi a kép kirakását.
Az img_format.h-ban definiálva vannak konstansok a különböző pixel- Az img_format.h-ban definiálva vannak konstansok a különböző pixel-