Forum: PC-Programmierung Dekodieren von H.264 Daten


von skha (Gast)


Lesenswert?

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

von Clemens L. (c_l)


Lesenswert?

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.

von skha (Gast)


Lesenswert?

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.

von Clemens L. (c_l)


Lesenswert?

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.

von skha (Gast)


Lesenswert?

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?

von Clemens L. (c_l)


Lesenswert?

Was genau meinst du mit "Paket"? Ein Byte-Stream hat keine Pakete.

von skha (Gast)


Lesenswert?

Mein Videostream ist in einen Transportstream eingepackt der aus je 188 
Byte Paketen besteht. Ich dachte das wäre die 
Standartübertragungsmethode.

von Georg A. (georga)


Lesenswert?

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

von skha (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.