void jpeg_data_dump (JPEGData *data) { unsigned int i; JPEGContent content; JPEGMarker marker; if (!data) return; printf ("Dumping JPEG data (%i bytes of data)...\n", data->size); for (i = 0; i < data->count; i++) { marker = data->sections[i].marker; content = data->sections[i].content; printf ("Section %i (marker 0x%x - %s):\n", i, marker, jpeg_marker_get_name (marker)); printf (" Description: %s\n", jpeg_marker_get_description (marker)); switch (marker) { case JPEG_MARKER_SOI: case JPEG_MARKER_EOI: break; case JPEG_MARKER_APP1: exif_data_dump (content.app1); break; default: printf (" Size: %i\n", content.generic.size); printf (" Unknown content.\n"); break; } } }
void jpeg_data_load_data (JPEGData *data, const unsigned char *d, unsigned int size) { unsigned int i, o, len; JPEGSection *s; JPEGMarker marker; if (!data) return; if (!d) return; #ifdef DEBUG printf ("Parsing %i bytes...\n", size); #endif for (o = 0; o < size;) { /* * JPEG sections start with 0xff. The first byte that is * not 0xff is a marker (hopefully). */ for (i = 0; i < 7; i++) if (d[o + i] != 0xff) break; if (!JPEG_IS_MARKER (d[o + i])) return; marker = d[o + i]; #ifdef DEBUG printf ("Found marker 0x%x ('%s') at %i.\n", marker, jpeg_marker_get_name (marker), o + i); #endif /* Append this section */ jpeg_data_append_section (data); s = &data->sections[data->count - 1]; s->marker = marker; s->content.generic.data = NULL; o += i + 1; switch (s->marker) { case JPEG_MARKER_SOI: case JPEG_MARKER_EOI: break; default: /* Read the length of the section */ len = ((d[o] << 8) | d[o + 1]) - 2; if (len > size) { o = size; break; } o += 2; if (o + len > size) { o = size; break; } switch (s->marker) { case JPEG_MARKER_APP1: s->content.app1 = exif_data_new_from_data ( d + o - 4, len + 4); break; default: s->content.generic.size = len; s->content.generic.data = malloc (sizeof (char) * len); memcpy (s->content.generic.data, &d[o], len); /* In case of SOS, image data will follow. */ if (s->marker == JPEG_MARKER_SOS) { data->size = size - 2 - o - len; data->data = malloc ( sizeof (char) * data->size); memcpy (data->data, d + o + len, data->size); o += data->size; } break; } o += len; break; } } }