セグメント入れ替えの処理

マーカーの並び順を定義して

int jpeg_std_marker_order[] =
{
    0xE0 /* APP0 */, 0xE1 /* APP1 */, 0xE2 /* APP2 */, 0xE3 /* APP3 */,
    0xE4 /* APP4 */, 0xE5 /* APP5 */, 0xE6 /* APP6 */, 0xE7 /* APP7 */,
	<略>
    0xDD /* DRI */ ,
};

その順番でセグメントを追加していきます。

jpeg_segment_t *jpeg_data,
jpeg_data = jpeg_segment_parse(data, data_len);
for(i=0; i< jpeg_std_marker_order_num; i++) {
    int m = jpeg_std_marker_order[i];
    unsigned char *d;
    unsigned short d_len;
    while(d = jpeg_segment_steal_node(jpeg_data, m, &d_len)) {
        jpeg_segment_append(jpeg_output, m, d, d_len);
    }
}