2013-09-03 6 views
5

... o devo approfondire il flusso di dati alla ricerca della sequenza 0xFF 0xD8?Dovrei aspettarmi un indicatore JPEG SOI all'inizio del flusso di dati?

Da this Q, ho appreso cosa APPn non deve seguire immediatamente SOI. Ci sono casi JPEG conformi alle specifiche dove posizione SOI! = Inizio del flusso?


Una citazione dalle specifiche (allegato B, § 1.1.2):

Marcatori servono per identificare le varie parti strutturali delle formati di dati compressi. La maggior parte dei marcatori inizia segmenti di marcatori contenenti un gruppo correlato di parametri; alcuni indicatori stanno da soli. Tutti i marcatori sono codici a due byte assegnati: un byte X'FF 'seguito da un byte che è diverso da 0 o X'FF' (vedere la Tabella B.1). Qualsiasi marker può essere opzionalmente preceduto da un numero qualsiasi di byte di riempimento, a cui sono assegnati byte codice X'FF '.

risposta

3

libjpeg non permette spazzatura prima che la 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. 
*/ 

Da: Random libjpeg mirror.

E.g. anche lo go implementation non consente la garbage precedente.

Tuttavia, in caso di dubbio, il bastone di legge di Postel:

essere liberale in ciò che accetti, e conservatore in ciò che si invia

Anche se, non si vuole essere troppo liberale, o potresti finire per estrarre non il vero JPEG dallo stream ma la miniatura EXIF ​​incorporata o qualcosa del genere.

+0

È piuttosto logico se i byte della spazzatura casuali all'inizio invalida l'intero flusso, ma stavo parlando dei byte di riempimento, che sembra essere consentito dalle specifiche (vedere la modifica). –

+0

Sì, la specifica potrebbe dirlo, ma molte implementazioni inclusa l'implementazione di riferimento gestiscono SOI in modo diverso (ho dato libjpeg, come esempi). Tuttavia, i byte di riempimento (e talvolta anche la spazzatura casuale) che precedono il marcatore sono accettati volentieri per tutti gli altri marcatori nella maggior parte delle implementazioni che ho incontrato ... fino ad un certo punto almeno. – nmaier

Problemi correlati