2016-05-16 6 views
0

Ich versuche, eine NAL-Einheit mit einer SEI-Benutzerdatennachricht zu schreiben. Mein Code sieht so aus:h264: Benutzer nicht registrierte SEI-Nachricht hinzufügen

typedef struct { 
    unsigned char type_code; 
    unsigned char countryCode; 
    unsigned char countryCodeExtension[2]; 
    unsigned char user_identifier[4]; 
    unsigned char payloadBytes[20]; 
    unsigned char marker_bits; 
} userdata_reg_t35; 

unsigned char begin[5] = {0x00, 0x00, 0x00, 0x01, 0x06}; 
unsigned char end[3] = {0x00, sizeof(userdata_reg_t35), 0x80}; 

userdata_reg_t35 m_userSEIData; 
m_userSEIData.countryCode = 0xB5; 
m_userSEIData.countryCodeExtension[0] = 0x31; 
m_userSEIData.countryCodeExtension[1] = 0x00; 
m_userSEIData.user_identifier[0] = 0x34; 
m_userSEIData.user_identifier[1] = 0x39; 
m_userSEIData.user_identifier[2] = 0x41; 
m_userSEIData.user_identifier[3] = 0x47; 
m_userSEIData.type_code = 0x03; 
m_userSEIData.marker_bits = 0xFF; 
sprintf((char*)m_userSEIData.payloadBytes, "%s", "My Payload"); 

memcpy(target, begin, 5); 
memcpy(target + 5, &m_userSEIData, sizeof(userdata_reg_t35)); 
memcpy(target + 5 + sizeof(userdata_reg_t35), end, 3); 

Wenn ich die Datei in MPlayer oder vlc wiedergeben, erhalte ich Fehler:

[h264 @ 0x7f5860c20720] SEI type 3 truncated at 216 

Was mache ich falsch?

** EDIT **

ich den Code geändert haben, nachdem http://git.videolan.org/?p=x264.git;a=blob;f=encoder/set.c#l563

static const uint8_t uuid[16] = {0xdc, 0x45, 0xe9, 0xbd, 0xe6, 0xd9, 0x48, 0xb7, 
    0x96, 0x2c, 0xd8, 0x20, 0xd9, 0x23, 0xee, 0xef}; 
unsigned char begin[7] = {0x00, 0x00, 0x00, 0x01, 0x06, 0x05, 16 + 20}; 
char szPayload[20]; 
memset(szPayload, 0, 20); 
sprintf(szPayload, "%s", "My payload"); 
memcpy(target, begin, 7); 
memcpy(target + 7, uuid, 16); 
memcpy(target + 7 + 16, szPayload, 20); 

gelesen hatte, aber ich bin immer noch der libav Störung zu erhalten: https://ffmpeg.org/doxygen/2.6/h264__sei_8c_source.html, Zeile # 306. Was mache ich noch falsch?

Antwort

0

Das sieht nicht gut aus und es ist nicht gut auf die H.264 Annex D-Spezifikation abgebildet.

Sie fügen SEI NAL-Typ hinzu, dann wird erwartet, dass Sie payloadType, payloadSize-Werte hinzufügen - Sie haben sie nicht. Dann haben Sie angegeben, dass Sie eine unregistrierte SEI-Nachricht (Typ 5) möchten und Ihr Inhalt eher wie Payload-Typ 4 aussieht (anscheinend fügen Sie Untertitel hinzu). Also müssen Sie das einschließen und type_code ausschließen, dann würde es ungefähr richtig aussehen.

Das heißt, Ihr nicht benötigter type_code 3 ersetzt den erwarteten Wert von 5/4, und dann gibt es keine Länge. VLC stolpert genau auf diese ...

Siehe H.264 D.1 SEI Nutzlast Syntax für Details.

UPDATE. Ihr aktualisierter Code ist [auch] aus einem anderen Grund falsch. Sie tun Annex B Bytestream mit Startcodes und gleichzeitig 20 Nullbytes Payload, die unter normalen Bedingungen mit Emulation Prevention Bytes aktualisiert werden sollten.

Um zu vergleichen, was Sie erhalten, was x264 produziert, öffnen Sie einfach die Ausgabe von x264 mit dem Binäreditor und überprüfen Sie die SEI NALs, dann vergleichen Sie mit Ihren.

+0

Danke. Ich habe den Code geändert, bekomme aber immer noch einen Fehler. Irgendeine Idee von was ist falsch? Ist das ein Alignment-Problem? – gregoiregentil

Verwandte Themen