Forum: FPGA, VHDL & Co. MPEG-2 Signal via FPGA auslesen..


von Mike (Gast)


Lesenswert?

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...

von Peter II (Gast)


Lesenswert?

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.

von Mike (Gast)


Lesenswert?

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

von Peter II (Gast)


Lesenswert?

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.

von Peter II (Gast)


Lesenswert?


von Peter II (Gast)


Lesenswert?

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.

von Mike (Gast)


Angehängte Dateien:

Lesenswert?

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...

von Peter II (Gast)


Lesenswert?

Mike schrieb:
> Was genau bedeuten die Schleifen mit "j" und "i"?

das es hier N-Stück dieser einträge gibt.

von Mike (Gast)


Lesenswert?

=) 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

von Peter II (Gast)


Lesenswert?

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.

von Mike (Gast)


Lesenswert?

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

von Peter II (Gast)


Lesenswert?

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

von Artikel (Gast)


Lesenswert?

Für Linux gibt es dvbsnoop, dvbstream.

Vielleicht sind diese Tools auch in Deinem
Fall nützlich.

von Mike (Gast)


Lesenswert?

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

von Peter II (Gast)


Lesenswert?

Mike schrieb:
> Finde aber leider kaum Infos über die Berechnung der Checksumme.

merkwürdig, google findet einiges:

http://forums.dvbowners.com/index.php?showtopic=10773

von Mike (Gast)


Lesenswert?

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...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.