2013-09-03 3 views
5

... oder sollte ich gehen tiefer in die Strom-Daten für 0xFF 0xD8 Sequenz suchen?Sollte ich zu Beginn des Datenstroms JPEG-SOI-Marker erwarten?

Von this Q, habe ich gelernt, was APPn SOI nicht sofort folgen muss. Gibt es spezifikationskonforme JPEG-Fälle, in denen die SOI-Position! = Anfang des Streams ist?


Ein Zitat aus der Spezifikation (Anhang B, § 1.1.2):

Markers dienen, die verschiedenen Bauteile der komprimierten Datenformate zu identifizieren. Die meisten Marker starten Markersegmente, die eine verwandte Gruppe von Parametern enthalten; einige Markierungen stehen alleine. Allen Markern sind Zwei-Byte-Codes zugeordnet: ein X'FF'-Byte, gefolgt von einem Byte, das ungleich 0 oder X'FF 'ist (siehe Tabelle B.1). Jeder Marker kann optional sein, dem eine beliebige Anzahl von Füllbytes vorangestellt ist, denen Bytes mit dem Code X'FF 'zugewiesen sind.

Antwort

3

libjpeg erlaubt es nicht, Müll vor dem SOI:

/* Like next_marker, but used to obtain the initial SOI marker. */ 
/* For this marker, we do not allow preceding garbage or fill; otherwise, 
* we might well scan an entire input file before realizing it ain't JPEG. 
* If an application wants to process non-JFIF files, it must seek to the 
* SOI before calling the JPEG library. 
*/ 

Von: Random libjpeg mirror.

z. Die go implementation erlaubt auch keine vorhergehenden Müll.

jedoch in Zweifel, wenn bleib bei Postel Gesetz:

liberal sein, in dem, was Sie akzeptieren, und konservativ in dem, was Sie

senden Obwohl Sie nicht sein wollen liberal, oder Sie könnten nicht das tatsächliche JPEG aus dem Stream extrahieren, sondern die eingebettete EXIF-Miniaturansicht oder etwas Ähnliches.

+0

Es ist ziemlich logisch, wenn zufällige Garbbytes am Anfang den gesamten Strom ungültig macht, aber ich sprach über das Auffüllen von Bytes, die von der Spezifikation erlaubt zu sein scheinen (sehen Sie die Änderung). –

+0

Ja, könnte die Spezifikation so sagen, aber viele Implementierungen der Referenzimplementierung Griff SOI anders einschließlich (I gab libjpeg als Beispiele gehen). Füll-Bytes (und manchmal sogar zufälliger Abfall), die der Markierung vorangehen, werden jedoch für alle anderen Markierungen in den meisten Implementierungen, auf die ich gestoßen bin, bis zu einem gewissen Punkt gerne akzeptiert. – nmaier