調査

HugFlash で抽出した画像。 
% jpeg_segment  ~/top_0.jpg
marker=SOI(FFD8): length=0
marker=APP0(FFE0): length=14
marker=DQT(FFDB): length=65
marker=DQT(FFDB): length=65
marker=DHT(FFC4): length=29
marker=DHT(FFC4): length=179
marker=DHT(FFC4): length=29
marker=DHT(FFC4): length=179
marker=SOF0(FFC0): length=15
marker=SOS(FFDA): length=159023
marker=EOI(FFD9): length=0

失敗した画像。

% jpeg_segment  ~/top_0-fail.jpg
marker=SOI(FFD8): length=0
marker=APP0(FFE0): length=14
marker=DQT(FFDB): length=65
marker=DQT(FFDB): length=65
marker=SOF0(FFC0): length=15
marker=DHT(FFC4): length=29
marker=DHT(FFC4): length=179
marker=DHT(FFC4): length=29
marker=DHT(FFC4): length=179
marker=SOS(FFDA): length=27951
marker=EOI(FFD9): length=0

見た目のまんまで、データ部が途中で切れてます。
って、あれ…
159023 と 27951 って キリがよさそうに見える。(*'ω'*)

 dec    hex
159023 26D2F
 27951  6D2F

やっぱり…
JPEG セグメントの長さを入れるフィールドが 2byte なので、
セグメントの長さを unsigned short で保存してたけど、 SOS は
長さフィールドで指定しないストリームなデータになっていて、
unsigned short を超える事があるのね…