From f4cc8f1906c41a06cd69878094427fe21f7d2912 Mon Sep 17 00:00:00 2001 From: Oliver Schinagl Date: Thu, 2 Jun 2005 12:44:58 +0000 Subject: Update for reading --- src/jpeg.c | 71 +++++++++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 54 insertions(+), 17 deletions(-) diff --git a/src/jpeg.c b/src/jpeg.c index 5c779ea..c90fe5b 100644 --- a/src/jpeg.c +++ b/src/jpeg.c @@ -1,14 +1,20 @@ #define SOI_MK 0xFFD8 /* start of image */ +#define APP_MK 0xFFE0 /* custom, up to FFEF */ +#define COM_MK 0xFFFE /* commment segment */ #define SOF_MK 0xFFC0 /* start of frame */ -#define EOI_MK 0xFFD9 /* end of image */ +#define SOS_MK 0xFFDA /* start of scan */ +#define DHT_MK 0xFFC4 /* Huffman table */ +#define DQT_MK 0xFFDB /* Quant. table */ #define DRI_MK 0xFFDD /* restart interval */ +#define EOI_MK 0xFFD9 /* end of image */ +#define MK_MSK 0xFFF0 #define get_size(fi) (((unsigned int)Image[fi]) << 8) + (unsigned int)Image[fi+1] unsigned char GetJPEGHeaderInfo (unsigned char *Image,unsigned int *offset,unsigned int *x_size,unsigned int *y_size, unsigned char *depth) { unsigned int aux; - int hCounter = 0; + int hCounter = 0, hAantal; /* First find the SOI marker: */ aux = get_size(hCounter); hCounter+=2; if (aux != SOI_MK) @@ -17,13 +23,30 @@ unsigned char GetJPEGHeaderInfo (unsigned char *Image,unsigned int *offset,unsig printf("%ld:\tINFO:\tFound the SOI marker!\n", hCounter); /* Read first marker */ - while( aux != SOF_MK) + while( (aux != EOI_MK) && (aux != 0)) { aux = get_size(hCounter); hCounter+=2; - if(aux == SOF_MK) + switch(aux) { - get_size(hCounter); hCounter+=2; /* header size, don't care */ + case APP_MK: + hAantal = get_size(hCounter); + printf("\tJFIF marker - APP0 Marker size: %i Count: %i\n", hAantal,hCounter); + printf("\tversion: %02x%02x units %x Xdensity %i Ydensity %i Xthumbnail %i Ythumbnail %i", + Image[hCounter+7],Image[hCounter+8],Image[hCounter+9],get_size(hCounter+10),get_size(hCounter+12) + ,Image[hCounter+14],Image[hCounter+15]); + hCounter = hCounter + hAantal; + break; + case COM_MK: + hAantal = get_size(hCounter); + printf("\tcommment segment Marker size: %i Count: %i\n", hAantal,hCounter); + hCounter = hCounter + hAantal; + break; + case SOF_MK: + hAantal= get_size(hCounter); /* header size */ + printf("\tSOF: %i Count: %i\n", hAantal,hCounter); + hAantal= hCounter + get_size(hCounter); + hCounter+=2; /* load basic image parameters */ hCounter++; /* precision, 8bit, don't care */ *y_size = get_size(hCounter); hCounter+=2; @@ -36,27 +59,41 @@ unsigned char GetJPEGHeaderInfo (unsigned char *Image,unsigned int *offset,unsig printf("\tINFO:\t"); switch (*depth) { - case 1: - printf("Monochrome"); - break; - case 3: - printf("Color"); - break; - default: - printf("Not a"); - break; + case 1: printf("Monochrome"); break; + case 3: printf("Color"); break; + default: printf("Not a"); break; } printf(" JPEG image!\n"); + hCounter = hAantal; - return 0; - } - else + break; + case DHT_MK: + hAantal = get_size(hCounter); + printf("\tHuffman table size: %i Count: %i\n", hAantal,hCounter); + hCounter = hCounter + hAantal; + break; + case DQT_MK: + hAantal = get_size(hCounter); + printf("\tQuant. table size: %i Count: %i\n", hAantal,hCounter); + hCounter = hCounter + hAantal; + break; + default: + hAantal = get_size(hCounter); + printf("\tOverig nl: %04X Count: %i, aantal: %i\n", aux,hCounter, hAantal); hCounter = hCounter + get_size(hCounter); + } } + printf("\tEinde op: aux: %04X Count: %i \n", aux, hCounter); return 1; } unsigned char WriteJPEGHeaderInfo (unsigned char *Image,unsigned int offset,unsigned int x_size,unsigned int y_size, unsigned char depth) { + // SOI marker + JFIF marker - APP0 Marker size: 16 Count: 4 + + // version: 0102 units 1 Xdensity 300 Ydensity 300 Xthumbnail 0 Ythumbnail 0 + // FF,D8,FF,E0,00,10,4A,46,49,46,00,01,02,01,01,2C,01,2C,00,00 + + return 0; } -- cgit v0.12