Hallo zusammen,
ich muss für mein Praktikum einen FPGA (Altera) auf VHDL-Basis
programmieren, was nicht das größte Problem darstellt. ;-(
Über den "Expansion Header" meines Altera DE2-115 bekomme ich das 8-Bit
Signal meines MPEG-2-Datenstroms. Es handelt sich dabei um den
Transportstrom eines DVB-S-Signals, dass mehrere Sender überträgt.
Ziel ist es einen bestimmten Sender im Datenstrom zu identifizieren und
dann via VGA (oder LCD...) auszugeben.
Jedenfalls tue ich mich schwer, den 8-Bit Transportstrom von der
Struktur hier zu verstehen.
Vielleicht kann mir jemand ein paar Links zu bereits existierenden
VHDL-Beispielen mit einem MPEG-2-TRansportstrom posten?
Literatur zum MPEG-2-TRansportstrom habe ich schon (Digitale Fernseh-
und Hörfunktechnik in Theorie und Praxis von Walter Fischer), aber
vielleicht gibt es noch bessere Literatur, die noch mehr auf die
"Bit-Ebene" eingeht...
Liebe Grüße
Mike...
Mike schrieb:> die noch mehr auf die> "Bit-Ebene" eingeht...
diese spielt doch eigentlich keine Rolle. Es kommen doch immer 188 byte
als ein Packet an. Diese Packet eine ID (PID). Zum anzeigen von eines
Senders braucht du die id vom Ton und Vom Bild. Entweder gibt du sie im
code vor oder du musst erst noch die PAD auswerten.
Danach hast schon mal mal den Transportstrom eines Senders. Wie es jetzt
weiter geht hängt davon ab welches Format den MPEG codierer braucht.
Eventuell muss die die TS packet noch einen MPEG stream muxen.
Hallo Peter II,
im Grunde hast du Recht, aber ich möchte ja nicht den Sender
wiedergeben, sondern nur den Sendernamen auslesen. Soweit ich es in
Erfahrung gebracht habe, muss ich dazu die Service-Description-Table
(SDT), die anscheinend den Namen des Senders als Table mitführt,
auslesen...
Oder liege ich falsch?
LG
Mike schrieb:> ondern nur den Sendernamen auslesen. Soweit ich es in> Erfahrung gebracht habe, muss ich dazu die Service-Description-Table> (SDT), die anscheinend den Namen des Senders als Table mitführt,> auslesen...
ja, wenn du nur den namen anzeigen willst. Dafür musst du nur die Packet
für die SDT verwenden. Diese hat eine feste ID.
Mache das ganze doch erstmal am PC, einfach eine DVB karten rein und den
Datenstrom aufnehmen, dann kannst du dir mal die packet in ruhe
anschauen.
wiki: http://de.wikipedia.org/wiki/Transportstrom
PAT
PAT steht für Program Association Table. Die PAT listet alle PIDs für
alle PMTs im Strom. Pakete, die die PAT-Information enthalten, haben
immer die PID 0x0.
PMT
Die Program Map Table, (PMT) enthält Informationen über die Programme.
Für jedes Programm gibt es eine PMT, assoziiert mit seiner eigenen PID.
Die PMTs beschreiben, welche PIDs Daten für das Programm enthalten. PMTs
stellen ebenso Metadaten für die Streams und ihre einzelnen PIDs bereit.
Zum Beispiel sind bei einem Programm, bestehend aus einem
MPEG-2-Videostrom, die PID des Videostreams und zusätzlich die Art der
Daten, also in diesem Fall MPEG-2, enthalten. Die PMT kann außerdem
zusätzliche Deskriptoren zur Beschreibung der einzelnen Ströme
enthalten.
also erst die PAT auswerten und dann mit diesen Infos die PMT.
ok, ich danke dir... möchte erst einmal die SDT auslesen. In dem
Dokument, das du mir gepostet hast, wird der Aufbau der SDT beschrieben
(siehe Bild).
Was genau bedeuten die Schleifen mit "j" und "i"?
Vielen Dank für die Unterstützung...
Liebe Grüße
Mike...
=) Das habe ich mir auch schon gedacht... Vielleicht habe ich meine
Frage zu ungenau gestellt:
1. In welchen Bit/Byte steckt die Information über j und i?
2. In welchem Teil kommt dort der Payload? Nach der Checksumme?
LG
Mike schrieb:> 1. In welchen Bit/Byte steckt die Information über j und i?
i und j sind nur hilfevariabeln. Die Frage ist woher du N bekommst. Ich
weiss es nicht mehr genau. Aber ich vermute mal das es section_length
und descriptor_loop_length ist.
> 2. In welchem Teil kommt dort der Payload? Nach der Checksumme?
nein die checksumme ist bei jedem TS packet am ende. Die kannst du also
ohne wissen über den Inhalt prüfen.
Hallo Peter II,
du weißt gar nicht, wie dankbar ich bin mit jemanden über die Sache
reden zu können der Ahnung von der Materie hat. Endlich Licht am Ende
des Tunnels... ;-)
1. Ok, section_length macht Sinn, da ja sehr warscheinlich mehrere
Sender übertragen werden. Aber warum eine Loop für den Service
Descriptor, der ja nur für einen Sender gilt. Der Content des
Service-Descriptor ( z.B. Service Provider Name) muss ja theoretisch nur
einmal übertragen werden. Ein 2. Mal würde ja keinen Sinn machen, der
Name ändert sich ja nicht mehr...
2. Was passiert, wenn die Table über 188 Byte hinaus geht`? Wird dann
einfach nach dem letzten Bit des Paketes in der Tabelle abgebrochen und
nach dem "Header" der Service Description Section das nächste Bit
einfach wieder aufgenommen?
Oder wird in jedem TS-Paket mindestens die Infos eines Senders
übertragen und der REst des Paketes, falls es für eine weitere
Service-Loop nicht reicht, einfach ungenutzt übertragen?
LG
Mike schrieb:> Aber warum eine Loop für den Service> Descriptor,
warum schaust du es dir nich mal in der Praxis an, eventuell klärt es
sich ja dann schon.
> Was passiert, wenn die Table über 188 Byte hinaus geht`?
es gibt doch das flag am fang der Packetes, darin ist doch enthalten ob
das packet weiter geht oder nicht. Du musst vorher überlappende packete
zusammenbauen.
mach es in mehre schritten
1. Empfang einen 188byte packets
2. Brauche ich das packet (auswertung der PID)
3. Stimmt die checksumme
4. extrahieren des contents, wenn nicht vollständig auf das nächste
packet warten)
5. Auswertung des Contents
Ich danke euch für die hilfreichen Antworten.
Habe mir nun einen Ausschnitt eines ts-streams besorgt und analysiere
ihn gerade.
Finde aber leider kaum Infos über die Berechnung der Checksumme. Kann
mir da jemand sagen, wie diese berechnet wird?
Liebe Grüße
Mike
Hallo Peter,
danke dir, habe wohl einfach mit den falschen Keywords gesucht..
Bin nun dank meines Ts-Files um einiges weiter gekommen und habe mir die
SDT-Pakete mal genauer mit einem hex-viewer angeschaut. Dabei sind 2
Fragen aufgekommen:
1. Warum wird für die Übertragung der SDT 2 verschiedene Table-IDs
verwendet?
2. Bei der Übertragung der 188-Byte pakete der SDT ist mir folgendes
aufgefallen: Der Header besteht (ohne Adaptionfield) aus 4 Bytes, danach
sollte nach der Literatur sofort die Table_Id folgen (Fall 1), oder
(Fall 2) an der Stelle, wo das letzte Packet unterbrochen wurde, weiter
die Infornationen der letzten Table übermittelt werden.
Fall 2 ist auch nachvollziehbar. Bei Fall 1 folgt jedoch dem
4Byte-Header ein 0x00 und danach kommt erst die Table_Id 0x46.
Beispiel aus dem Hex-Code meines TS-Streams:
47 40 11 10 00 46 ... Beginn der Table...
Ist das so normal?
LG
MIke...