Hallo, ich beschäftige mich gerade damit H.264 Daten zu dekodieren und bin mir nicht ganz sicher ob ich hier etwas falsch verstanden habe. So wie ich das aufgenommen habe wird eine Startsequenz von 2 oder 3 Null-Bytes + einem 0x01 Byte gesucht, welcher den Start einer NAL_unit() darstellt. Die Funktion NAL_unit() nutzt die Anzal Bytes der Startsequenz als Wert um die Anzahl der nun auszuwertenden Bytes für die NAL_unit zu ermitteln "NumBytesInNALunit". Jetzt habe ich aber folgende Squenz "...0x00 0x00 0x00 0x01 0x09 0xF0 0x00 0x00 0x00 0x01 0x67 ..." Für mich wäre der erste Teil bis zur 0x01 die Startsequenz. Die 0x09 das Byte welches unter anderem den Nal_unit_Type enthält und das 0xF0 noch ein weiteres auszuwertendes Byte. Dann geht es mit der nächsten Startsequenz los. Beziehe ich aber die "NumBytesInNALunit" mit ein, wird diese Startsequenz mit in die erste Auswertung einbezogen und kann nun nicht mehr als eigeneständige Sequenz ermittelt werden. Hat jemand Erfahrung mit diesen Thema und kann mir sagen wo mein Fehler liegt? Eventuell habe ich da mit der "NumBytesInNALunit" durcheinander gebracht? Ich hoffe ich habe das gerade halbwegs verständig rüber bringen können. Grüße
skha schrieb: > Die Funktion NAL_unit() ... vielen Dank für den übersichtlichen und leicht verständlichen Quellcode ... > nutzt die Anzal Bytes der Startsequenz als Wert um die Anzahl der nun > auszuwertenden Bytes für die NAL_unit zu ermitteln "NumBytesInNALunit" Ein NAL besteht aus den Bytes zwischen zwei Startsequenzen. Wenn dein Code etwas anderes macht, macht er es falsch.
Clemens L. schrieb: > skha schrieb: >> Die Funktion NAL_unit() > > ... vielen Dank für den übersichtlichen und leicht verständlichen > Quellcode ... Die Funktion trägt diesen Namen in der Spezifikation bzw. beschreibt das auslesen der NAL Unit, daher hab ich diese auch so erwähnt. Clemens L. schrieb: > Ein NAL besteht aus den Bytes zwischen zwei Startsequenzen. Wenn dein > Code etwas anderes macht, macht er es falsch. Ich ging davon aus dass jedes Paket, PSE oder PSI eine NAL Unit vorangestellt hat und die Art des Paketes sich anhand des "nal_unit_type" ergibt, dass die Länge durch die Funktion bzw. die length Parameter bestimmt werden und das Ende nicht markiert ist, sondern nur der jeweilige Anfang eines Pakets bzw. einer neuen NAL Unit.
skha schrieb: >> ... NAL_unit() ... > > Die Funktion trägt diesen Namen in der Spezifikation Das ist keine Funktion, sondern eine Datenstruktur. > Die Funktion NAL_unit() nutzt die Anzal Bytes der Startsequenz > als Wert um die Anzahl der nun auszuwertenden Bytes für > die NAL_unit zu ermitteln "NumBytesInNALunit". Nein. Hier wird nichts ermittelt; "NumBytesInNALunit" muss vorher schon bekannt sein. Die Spezifikation sagt: > 7.4.1 NAL unit semantics > > NumBytesInNALunit specifies the size of the NAL unit in bytes. This > value is required for decoding of the NAL unit. Some form of > demarcation of NAL unit boundaries is necessary to enable inference > of NumBytesInNALunit. One such demarcation method is specified in > Annex B for the byte stream format. > B.2 Byte stream NAL unit decoding process > > 3. NumBytesInNALunit is set equal to the number of bytes starting > with the byte at the current position in the byte stream up to and > including the last byte that precedes the location of any of the > following conditions: > a. A subsequent byte-aligned three-byte sequence equal to 0x000000, or > b. A subsequent byte-aligned three-byte sequence equal to 0x000001, or > c. The end of the byte stream, as determined by unspecified means.
Ah ok, ich hatte den Satz damals vollkommen missverstanden. Eine weitere Frage hätte ich noch: Ich hatte letztens eine NAL_unit die kurz vor dem Ende eines 188 Byte Pakets anfing (bei ca. Byte 183). Wird dann einfach mitten in der Auswertung der Datensturktur abgebrochen oder setzt sich das im nächsten Paket fort?
Mein Videostream ist in einen Transportstream eingepackt der aus je 188 Byte Paketen besteht. Ich dachte das wäre die Standartübertragungsmethode.
Der TS hilft eigentlich nur, mit den PIDs verschiedene Streams zu übertragen. Die höheren Schichten ( PES, ES) wissen davon nichts. Mit dem PES-Start-Bit kann man zwar signalisieren, das "was Wichtiges" in dem TS-Paket anfängt, ist aber eher nur eine Hilfestellung...
Ich hätte noch weite weitere Frage bezüglich der Slices. Ich hatte gelesen dass es möglich ist ein komplettes (farbiges) Bild in nur einen Slice zu packen. Da muss es doch ein Flag, Counter oder sonstigen Parameter geben der sowas festlegt? Meist wird nur die Darstellung durch mindestens zwei Slices gezeigt.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.