mpeg-4 player api - Überblick inhalt vorstellung des iso-modells für einen mpeg4-player: objekte...
TRANSCRIPT
MPEG-4 Player API - Überblick
Inhalt
Vorstellung des ISO-Modells für einen MPEG4-Player:•Objekte•Wichtigen Funktionen und Nachrichten
Schwerpunkt Öffnen und Schließen einer Datei sowie Datentransferwege. Erwähnung von Besonderheiten der Implementierung des IM1.
Textlegende
Blau Objekte des ISO-ReferenzmodellsFett Hervorhebung von Überschriften und für den IM1 abgeleiteten Objekten.
Diagrammlegende
Hervorhebung des erläuterten ISO-Referenzobjekts.
Erzeugt…Ruft Funktion auf…Schickt Daten an…
Benachrichtigung über ein Ereignis/eigenen Status
Objekt enthält die Funktionen/Methoden: F1(), F2(), …
„Objektname“
„Objektname“
F1()
F2()
...
Network
Layer
AL Layer
ALManager
DataChannel
Decompression Composition andRendering
Scene Description(BIFS Decoder)
H263Decoder
G723Decoder
JPEGDecoder
BIFSDecoder
MediaObject::Parse()
NodeField ::Parse()
MediaObject::Render()
Presenter
VisualRenderer
AudioRenderer
Elementary streambuffers (EBs)implemented byMediaStream
Composition buffers (CBs)implemented byMediaStream
DMIF
Service
FileService
RemoteService
FlexDemux
MPEG-4 Player API - Überblick
Komponenten eines MPEG-4 Players
MediaObject NodeField
StreamConsumer
Application
Executive
PresenterBase
Service
Decoder xxx1Decoder
xxx2Decoder
MediaStream ClockReference
Capabilities
xxx1Service
xxx2Service
DataChannel
FlexDemux
Solid lines mean inheritance (lower class derived from the upper class). Dotted lines mean instantiation (lower class is instantiated by upper class).
ALManager
…
Presenter
…
BIFSDecoder
MPEG-4 Player API - Überblick
Klassen
MPEG-4 Player API - Überblick
Application
ISO: Application
Basisklasse für das Objekt, welches beim Aufruf der Applikation instanziiert wird.
Aufgaben/Ablauf• Ein Ausgabefenster erzeugen• Executive instaziieren• Name der Quelle ermitteln. Entweder eine lokale Datei oder eine IP für
eine „remote session“• Executive-Sitzung starten• Steuerungsnachrichten an Executive weitergeben (Paint, Stop,…)• Sitzung beenden• Executive löschen• Beenden
Executive
ErzeugenSteuernLöschen
Status
…mpoApp = new OpenGLApplication(hWnd);…mpoExec = new Executive3d(this, mpoApp, hWnd);
MPEG-4 Player API - Überblick
IM1-Implementierung: Application
class Application{ … }
<Application.h>Die Klassen CMmiDoc und OpenGLApplication teilen sich die Funktionalität von Application.
Die Klasse CMmiDoc erfüllt weitestgehend die eben genannten Funktionen von Application (Fenster, Executive instanziieren, etc.). Deren Basisklasse CDocument beschreibt eine Dokumentenklasse für ein MDI-Fenster. Dadurch ist der IM1 dafür angelegt mehrere MP4-Dateien parallel zu öffnen.
OpenGLApplication ist direkt von Application abgeleitet. Die Klasse kümmert sich um die Behandlung der OnXxx()-Nachrichten. OnConnect() z.B. initialisiert unter anderem OpenGL für das Darstellungsfenster.
CMmiDoc (CDocument)
CMmiView(CView)
CWinApp
class OpenGLApplication: public Application{ … }
<OpenGLApplication.h>
CMmiView::OnInitialUpdate
CMmiDoc::CreateExecutive()
MPEG-4 Player API - Überblick
ISO/IM1: Application – Wichtige Mitteilungen
void OnConnect (CONNECTION_RESULT result = CONNECTION_SUCCESS)Aufgerufen von Executive, wenn eine Sitzung erfolgreich eingerichtet oder fehlgeschlagen ist.
void OnFinish (SERVICE_TERMINATION reason = END_OF_SERVICE)Aufgerufen von Executive, wenn eine Sitzung beendet wird, das heißt, wenn das Ende der Datei erreicht ist oder der Server das Ende der Sitzung anzeigt.
void OnError (NON_FATAL_ERROR error)Aufgerufen von Executive wenn ein unkritischer Fehler auftritt, das heißt, wenn der Fehler nicht das erstellen der Hauptsitzung und Konstruieren der anfänglichen Szene verhindert.
Application
OnConnect()
OnFinish()
OnError()
ExecutiveSession established
Session is terminated
Non-fatal error
Application(=OpenGLApplication)
OnConnect()
OnFinish()
OnError()
Executive
Executive3dCMmiDoc
OnFinish() OnFinish()
Start()
Error()
ISO: IM1:
FlexDemux
MPEG-4 Player API - Überblick
ISO: Executive
Application Executive
Dieses Objekt kontrolliert den Datenfluss einer Sitzung. Es läuft in einem eigenen Thread.
Ablauf• Presenter instanziieren• Den primären ALManager (Adaption Layer) und den passenden Service instanziieren• Den ersten OD (Object Descriptor) analysieren der beim Verbinden mit einem Service ankommt• BIFSDecoder(s) instanziieren• Die DataChannels, von BIFS und „OD stream“, über MediaStreams mit BIFSDecoder verbinden.• Wenn nötig weitere ALManager erzeugen für Streams die eine eigene URL haben.• Steuerungsnachrichten an Presenter weitergeben (Paint, user-events,…)• Sitzung beenden• Application benachrichtigen wenn Sitzung beendet (OnFinish())
OnConnect()OnFinish()OnError()
Presenter
ALManagerService
Erzeugen
DataChannel
DataChannel
DataChannel
BIFSDecoder
Decoder
MediaStream
MediaStream
MPEG-4 Player API - Überblick
IM1: Executive
class CMmiDoc : public CDocument{
…Executive3d * mpoExec;
}
<mmiDoc.h>
class Executive3d : public Executive{
…}
<Executive3d.h>Player3d (IM1)
class Executive : Application_Sink{
…}
<Executive.h>
Core
void CMmiView::OnInitialUpdate() {
…if (GetDocument()->mpoExec==NULL) {
GetDocument()->CreateExecutive(m_hWnd);}
CDocument
CViewExecutive3d
Im Projekt Core wird eine Klasse Executive deklariert.
Der IM1 leitet eine eigene Klasse Executive3d davon ab und deklariert diese als Element von CMmiDoc.
Executive3d wird von CMmiView erzeugt wenn diese Klasse initialisiert wird.
new
MPEG-4 Player API - Überblick
ISO: Executive – Wichtige Funktionen
void Start (LPCSTR szURL)Von Application aufgerufen um eine Sitzung zu starten. Erzeugt einen ALManager und ruft dessen Connect() auf. Der ALManager erzeugt einen passenden Service.Diese Funktion arbeitet asynchron. Erfolg oder Misserfolg werden über OnConnect() an Application mitgeteilt.
void Stop ()Initiiert das Ende der Sitzung (asynchron). Nur so wird voller logischer Stop und „Cleanup“ erreicht. Das endgültige Sitzungsende wird über OnFinish() an Application mitgeteilt.
void OnConnect (ALManager *pAL, CONNECTION_RESULT result, const ZString &initOD)Aufgerufen von ALManager, wenn ein Service eingerichtet wurde oder fehlgeschlagen ist. Bei einem Fehlschlag wird Executive gelöscht.
void OnFinish (ALManager *pAL, SESSION_TERMINATION reason = END_OF_SESSION)Aufgerufen von ALManager, wenn die zugehörige Sitzung beendet wird/ist, das heißt, wenn das Ende der lokalen Datei erreicht ist oder der Server das Ende der Sitzung anzeigt. Wenn die Hauptsitzung beendet ist wartet die Funktion bis alle Streams zuende gespielt sind und ruft Application::OnFinish() auf.
Application Executive
Start()
Stop()
ALManager
Connect()
Service• Local file• Remote-
service• …
OnConnect()
OnFinish()
Serviceestablished
Session isterminated
Remote-service
…
File-service
MPEG-4 Player API - Überblick
ISO: Service
Diese Klasse implementiert die DMIF-Schicht (Delivery Multimedia Integration Framework). Die Applikation öffnet über die Dienste dieser Schicht ein odere mehrere Datenkanäle, durch die dann elementary-streams übertragen werden. Von der Basisklasse Service werden spezifische Klassen abgeleitet die spezielle Protokolle implementieren (z.B. das File-Protokoll für lokale Dateien, usw.).
Ablauf• ALManager::Connect() erzeugt ein passendes Service-Objekt in Abhängigkeit vom benötigten Protokoll (Im Dateinamen enthalten) und ruft dann Service::Connect() auf.
• Service::Connect() erzeugt ein oder mehrere Threads und initiiert die Bereitstellung der Dienste durch diese Threads.
• Datenkanäle werden angefordert mit Service::OpenChannels().• Die Threads initialisieren die Dienste, erzeugen die Datenkanäle, empfangen Daten und beenden schließlich die Dienste wieder ordnungsgemäß.
• Vorfälle beim Lesen aus Dateien/dem Netzwerk werden der Basisklasse oder dem ALManager über OnXXX()-Funktionen mitgeteilt.
Application
Executive
ALManager
Connect()
Service
Connect()
DataChannel
DataChannel
DataChannel
…OnXXX() OnXXX()
MPEG-4 Player API - Überblick
ISO: ALManagerImplementiert die “Anpassungs- oder Zwischenschicht” (adaption-layer) des Players. Der ALManager empfängt über Services Datenpakete aus elementary-streams, interpretiert die Packet-Header und gibt diese über MediaStreams an die passenden Objekte weiter.
FlexDemux
ALManagerService
DataChannel
DataChannel
DataChannel
MediaStream
MediaStream
MPEG-4 Player API - Überblick
ISO: ALManager – Wichtige Funktionen
Executive
Start()
Stop()
ALManager
Connect()
Service• Local file• Remote-
service• …
OnConnect()
OnFinish()
Serviceestablished
Session isterminated
AttachStream()
RequestChannels ()
DataChannel
DataChannel
Instantiate Open
void AttachStream (int nESid, MediaStream *pStream, ALConfigDescriptor *pConfigParams, … )Fordert das Anhängen von einem Stream an. Erzeugt ein DataChannel-Objekt und verbindet es mit dem angegebenen MediaStream.
void RequestChannels ()Fordert das Öffnen aller Kanäle für Streams die angehängt, aber noch nicht geöffnet worden sind. Die Funktion ruft Service :: RequestChannels() mit einer Liste von ES-IDs auf.
Die Trennung von AttachStream und RequestChannels erfolgt für:
• Eine bessere Synchronisierung – es werden zuerst alle ODs interpretiert und die Decoder initialisiert. Ist die Szene fertig konstruiert, wird die Bereitschaft signalisiert mit dem Datenempfang zu beginnen.
• Einige Server entscheiden dynamisch, bei Anforderung von Streams, wie diese in ein oder mehrere FlexMux-Kanäle zu gruppieren sind.
MediaStream
MediaStream
RequestChannels ()
Confirm request
MPEG-4 Player API - Überblick
ISO: ALManager – Wichtige Funktionen
ALManager Service
OnChannelOpen()
confirm
preempt
NULL orpointer toDataChannel
DataChannel *OnChannelOpen (int nESid, int nTag)Aufgerufen von Service wenn eine Kanal eingerichtet ist. Entweder nachdem ein solcher Kanal angefordert wurde oder der Server bietet von sich aus einen Kanal an.ALManager gibt entweder einen Zeiger auf ein DataChannel-Objekt zurück oder NULL, um anzuzeigen, dass die Applikation an diesem Stream nicht interessiert ist.
void OnFinish (SERVICE_TERMINATION reason = END_OF_SERVICE)Aufgerufen von Service wenn der Service beendet ist, das heißt das Dateiende erreicht ist oder der Server das Ende. Die Information wird an Executive weitergegeben. Executive benachrichtigt Application und löscht den Service.
DataChannel
OnFinish()
Executive
serviceterminated
delete
MPEG-4 Player API - Überblick
ISO: DataChannelImplementiert die “Anpassungs- oder Zwischenschicht” (adaption-layer) des Players, d.h. empfängt über Services Datenpakete aus elementary-streams, interpretiert die AU-Header und gibt Header und Daten auf MediaStreams aus.
Das Einrichten von Datenkanälen erfolgt in 4 Schritten
• Die Applikation erhält Informationen über einen elementary-stream in einem Object Descriptor (OD). Sie ruft ALManager :: AttachStream() auf. Die Funktionen erzeugt ein passendes DataChannel-Objekt, verbindet es mit einem MediaStream.
• Wenn die Applikation mit dem Datenempfang beginnen will, ruft sie ALManager :: RequestChannels() auf (siehe oben).
• Um das Öffnen eines Kanals zu bestätigen ruft Service die Funktion ALManager :: OnChannelOpen() auf und erhält einen Zeiger auf ein DataChannel-Objekt.
• Wenn die Applikation mit der Datenübertragung beginnen will, ruft sie die Funktion DataChannel::ChannelReady() auf.
ALManager
DataChannel
RequestChannels()
AttachStream()
MediaStream
ChannelReady()
OnChannelOpen()
MPEG-4 Player API - Überblick
ISO: FlexDemux
Das Objekt implementiert die FlexMux-Schicht. Es empfängt FlexMux-Pakete, “demultiplext” sie in elementary-stream packets und leitet Sie an entsprechende DataChannel-Objekte weiter.
FlexDemux
ALManagerService
DataChannel
DataChannel
DataChannel
MediaStream
MediaStream
MPEG-4 Player API - Überblick
ISO: BIFSDecoder
Das Objekt läuft in einem eigenen Thread und interpretiert entweder BIFS oder ODs. Der BIFSDecoder konstruiert die Szene (plattformunabhängig), die dann vom Presenter dargestellt wird (plattformabhängig).
DecoderMediaStream
Media TStream
MediaObject
PresenterBIFSDecoder Root Scene
ObjectMediaStream
MPEG-4 Player API - Überblick
ISO: Decoder
Basisklasse für alle speziellen Dekoder. Jeder Dekoder läuft in seinem eigenen Thread. Er ist mit zwei MediaStreams verbunden, einem Eingabe-Stream und einem Ausgabe-Stream. Die Basisklasse empfängt coded units aus dem Eingabe-Stream (EBs, Elementary stream buffers) und sendet deise an den Ausgabe-Stream (PBs).
DecoderMediaStream
Media TStream
MediaObject
PresenterBIFSDecoder Root Scene
ObjectMediaStream
MPEG-4 Player API - Überblick
ISO: PresenterBase
Plattformunabhängige Basisklasse für die plattformabhängige Presenter-Klasse. Läuft in einem eigenen Thread und kontrolliert die Präsentation der Szene.
Ablauf
• Executive instanziiert einen Presenter
• Wenn der BIFSDecoder die Szene fertig konstruiert hat, wird Presenter::Init() aufgerufen. Diese Funktion muß PresenterBase::Init() aufrufen, diese startet den Presenter-Thread.
• Der Presenter-Thread läuft in einer Schleife die alle x Millisekunden die Funktion Render() der Szene aufruft (scene-root).
• Jedes MediaObject rendert sich selbst und seine Unterknoten
• Am Ende wird Presenter::Terminate() aufgerufen. Dies beinhaltet Aufräumarbeiten wie das löschen des Fensters und das Aufrufen der Funktion von PresenterBase::Terminate(). Diese beendet den Thread. Nach Terminate(), löscht Executive die Szene!!
MediaObject
PresenterRoot SceneObject
MPEG-4 Player API - Überblick
ISO: ClockReference
Media streams transportieren Daten die einen “Zeitstempel” tragen können. Diese Zeitstempel werden für jeden Stream mit einem eigenen Zeitgeber abgeglichen. Die Implementierung liefert die Klasse ClockReference.
MediaStreams die zusammen den Weg eines Streams bilden bekommen den gleichen Zeitgeber zugewiesen.
DecoderMedia TStream
Media TStream
ClockReference
ISO: MediaStream
Diese Objekt kontrolliert die Pufferung und die Weiterleitung von Datenströmen. MediaStream beinhaltet einen Zwischenspeicher, der nach dem FIFO-Prinzip Daten speichert und weiterleitet. Das Objekt stellt auch Dienste für die zeitliche Kontrolle des Datenstroms zur Verfügung. Gespeicherte Daten können einen Zeitstempel tragen, und es werden nur “gereife” Daten weitergeleitet.
MPEG-4 Player API - Überblick
ISO: Capabilities
Diese Objekt liefert Informationen über die Leistungen eines Decoder, eines Presenter oder eines bestimmten Knotens. Wird verwendet um einen Decoder so einzurichten, daß er mit dem Leistungsumfang des Presenter kompatibel ist.
MPEG-4 Player API - Überblick
Ende
Vielen Dank für Ihre Aufmerksamkeit!
CMmiDoc
Restart()
Executive (Executive3d)
Start()
URL/Filename
MPEG-4 Player API - Überblick
IM1-Implementierung: Executive – Wichtige Funktionen• void Start (LPCSTR szURL)Von CMmiDoc aufgerufen um eine Sitzung zu starten.
• void OnConnect (ALManager *pAL, CONNECTION_RESULT result, const ZString &initOD)Nicht implementiert. ServiceAttach() könnte als Ersatz angesehen werden.
• void OnFinish (ALManager *pAL, SESSION_TERMINATION reason = END_OF_SESSION)ALManager zeigt an, dass Datei zuende oder Serververbindung beendet. Implementiert aber nicht genutzt. ~ALManager ruft ALManager::Disconnect auf. Nur so wird dieser aus Liste bei Executive gelöscht.
• void Stop ()Löscht den Presenter. Schließt alle Streams. Kein direkter Zugriff auf ALManager. (?)
ALManager
Connect()
Service
URL bestimmt das Protokoll, d.h. den Service der verwendet wird.
Form:Protocol: address
OnConnect()Failure/success
• Local file• Remote-
service• …
Stop()
OnFinish()OnFinish()
OnConnect()
CloseDocument(), DeleteContents(),
Finish()
CreateService()
Application (OpenGLApplication)
DeleteService() Disconnect()
ServiceAttach()
~ALManager()