4 static ClbJpeg* ClbJpegAlloc(void);
5 static void ClbJpegInit (ClbJpeg *);
6 static int ClbJpegDecodeDiff(ClbJpeg *);
7 static BOOL ClbJpegDecodeData(ClbJpeg *);
8 static int ClbJpegReadBit(ClbJpeg *);
9 static BOOL ClbJpegReadHeader(ClbJpeg *);
10 static BOOL ClbJpegStart(ClbJpeg *,FILE *);
11 static BOOL ClbJpegFillHuffTable(ClbJpeg *);
16 void _IdDcmJpegFree(ClbJpeg *jpg)
23 ClbJpeg * _IdDcmJpegRead (FILE * fp){
27 printf("Fail to ClbJpegAlloc \n");
31 if(!ClbJpegStart(jpg, fp)) {
32 printf("Fail to ClbJpegStart \n");
40 static void ClbJpegInit (ClbJpeg *jpg) {
44 jpg->lHuffTable[n].HufCode=0;
45 jpg->lHuffTable[n].HufSz=0;
46 jpg->lHuffTable[n].HufVal=0;
51 jpg->RestartInterval=0;
54 static ClbJpeg *ClbJpegAlloc(void) {
56 jpg = (ClbJpeg *)malloc(sizeof(ClbJpeg));
63 static BOOL ClbJpegFillHuffTable(ClbJpeg *jpg)
73 jpg->RawDHTstart[c]=0;
83 jpg->RawDHT[n]=fgetc(jpg->infp);
84 NiDHT+=jpg->RawDHT[n];
85 if (jpg->RawDHT[n]!=0)
93 jpg->RawDHTstart[n]=indexY+1;
94 for (i=1;i<(jpg->RawDHT[n]+1);i++)
98 jpg->lHuffTable[indexY].HufVal=c;
100 jpg->lHuffTable[indexY].HufSz=n;
107 Si=jpg->lHuffTable[k].HufSz;
112 while( Si==jpg->lHuffTable[k].HufSz)
114 jpg->lHuffTable[k].HufCode=Code;
120 while (jpg->lHuffTable[k].HufSz>Si)
133 static BOOL ClbJpegStart(ClbJpeg *jpg, FILE *inputfp)
136 if (!ClbJpegReadHeader(jpg)) {
137 printf("Fail to ClbJpegReadHeader\n");
140 //printf("sortie ClbJpegReadHeader\n");
141 if (!ClbJpegDecodeData(jpg)) {
142 printf("Fail to ClbJpegDecodeData\n");
145 //printf("sortie ClbJpegDecodeData\n");
149 static BOOL ClbJpegReadHeader(ClbJpeg *jpg)
162 gr=fgetc(jpg->infp); //FF
163 el=fgetc(jpg->infp); //D8
169 printf("gr!=0xFF (=%02x)\n",gr);
174 if ( (el==0xFF) || (el==0x01) || (el==0xD8) ||(el==0xD9) ||( (el>=0xD0) && (el<=0xD7) ))
180 sztag=(l1*256)+l2-2; //tag lengh
181 ouca=ftell(jpg->infp);
185 jpg->lSof.precision=fgetc(jpg->infp);
189 jpg->lSof.Himg=(l1*256)+l2;
193 jpg->lSof.Wimg=(l1*256)+l2;
195 jpg->lSof.NbComponent=fgetc(jpg->infp);
197 jpg->lSof.SofTabPos=ftell(jpg->infp);
199 isLossLess=1; // TRUE
204 ClbJpegFillHuffTable(jpg);
208 jpg->lSos.CompCount=fgetc(jpg->infp);
209 for (tp=0;tp<jpg->lSos.CompCount;tp++)
211 jpg->lSos.CompId=fgetc(jpg->infp);
212 jpg->lSos.CompDc=fgetc(jpg->infp);
214 jpg->lSos.SpectralSelStart=fgetc(jpg->infp);
215 jpg->lSos.SpectralSelEnd=fgetc(jpg->infp);
216 jpg->lSos.SuccessiveAp=fgetc(jpg->infp);
217 jpg->lSos.Sospttrans=(jpg->lSos.SuccessiveAp & 16);
224 jpg->RestartInterval=(l1*256)+l2;
227 fseek(jpg->infp,(ouca+sztag),0);
232 printf("NOT isLossLess\n");
239 static int ClbJpegReadBit(ClbJpeg *jpg)
243 if(jpg->PosCurBit>8) // need lire octet suivant
245 jpg->ValCurByte=fgetc(jpg->infp);
246 if (jpg->ValCurByte==0xFF)
248 c=fgetc(jpg->infp);// est 00 ou restart marker: a skiper
251 jpg->ValCurByte=fgetc(jpg->infp);
258 return (jpg->ValCurByte>>7);
262 r=(1&(jpg->ValCurByte>>(8-jpg->PosCurBit)));
269 static BOOL ClbJpegDecodeData(ClbJpeg *jpg)
275 int lPredicted=(1<<(jpg->lSof.precision-1-jpg->lSos.Sospttrans));
277 jpg->ValCurByte=jpg->lSos.SuccessiveAp;
280 if (jpg->lSof.precision==8)
282 if (jpg->lSof.precision==12)
284 if (jpg->lSof.precision==16)
287 jpg->DataImg=(int*)malloc(jpg->lSof.Himg*jpg->lSof.Wimg*sizeof(*jpg->DataImg));
288 memset( jpg->DataImg,0,(jpg->lSof.Himg*jpg->lSof.Wimg*sizeof(*jpg->DataImg)));
290 if (!jpg->RestartInterval)
292 for(iX=0;iX<jpg->lSof.Wimg;iX++) // lit première ligne
296 lPredicted= jpg->DataImg[lbInc-1];
297 jpg->DataImg[lbInc]=lPredicted+ClbJpegDecodeDiff(jpg);
299 if ( jpg->DataImg[lbInc] > ((1<<(jpg->lSof.precision))-1) )
300 jpg->DataImg[lbInc]= jpg->DataImg[lbInc]&mask;
301 if ( jpg->DataImg[lbInc]<0)
302 jpg->DataImg[lbInc]= jpg->DataImg[lbInc]&mask;
305 for (iY=1;iY<jpg->lSof.Himg;iY++) //lit la suite
308 if (lbInc>(jpg->lSof.Himg*jpg->lSof.Wimg-1)) break;
309 lPredicted= jpg->DataImg[lbInc-jpg->lSof.Wimg]; // se base % premier é ligne d'avant
310 jpg->DataImg[lbInc]=lPredicted+ClbJpegDecodeDiff(jpg);
312 if ( jpg->DataImg[lbInc] > ((1<<(jpg->lSof.precision))-1) )
313 jpg->DataImg[lbInc]= jpg->DataImg[lbInc]&mask;
314 if ( jpg->DataImg[lbInc]<0)
315 jpg->DataImg[lbInc]= jpg->DataImg[lbInc]&mask;
317 for(iX=1;iX<jpg->lSof.Wimg;iX++)
320 if (lbInc>(jpg->lSof.Himg*jpg->lSof.Wimg-1)) break;
321 if (jpg->lSos.SpectralSelStart==7) // si spectral
322 lPredicted=( jpg->DataImg[lbInc-1]+ jpg->DataImg[lbInc-jpg->lSof.Wimg])>>1;
324 lPredicted= jpg->DataImg[lbInc-1]; // se base%pixel juste avant
325 jpg->DataImg[lbInc]=lPredicted+ClbJpegDecodeDiff(jpg);
327 if ( jpg->DataImg[lbInc] > ((1<<(jpg->lSof.precision))-1) )
328 jpg->DataImg[lbInc]= jpg->DataImg[lbInc]&mask;
329 if ( jpg->DataImg[lbInc]<0)
330 jpg->DataImg[lbInc]= jpg->DataImg[lbInc]&mask;
335 else // il y a un define interval
340 lPredicted=(1<<(jpg->lSof.precision - 1 - jpg->lSos.Sospttrans));
341 for (iY=0;iY<jpg->RestartInterval;iY++)
343 jpg->DataImg[lbInc]=lPredicted+ClbJpegDecodeDiff(jpg);
345 if ( jpg->DataImg[lbInc] > ((1<<(jpg->lSof.precision))-1) )
346 jpg->DataImg[lbInc]= jpg->DataImg[lbInc]&mask;
347 if ( jpg->DataImg[lbInc]<0)
348 jpg->DataImg[lbInc]= jpg->DataImg[lbInc]&mask;
351 if (lbInc>(jpg->lSof.Himg*jpg->lSof.Wimg-1)) return 1;
353 if (jpg->lSos.SpectralSelStart==7) // si spectral
354 lPredicted=( jpg->DataImg[lbInc-1]+ jpg->DataImg[lbInc-jpg->lSof.Wimg])>>1;
356 lPredicted= jpg->DataImg[lbInc-1];
358 while (!jpg->MarkerFound)
360 ClbJpegReadBit(jpg); // skip bits restant avant restart marker
367 static int ClbJpegDecodeDiff(ClbJpeg *jpg)
383 lInput=(lInput<<1)+ClbJpegReadBit(jpg);
384 if (jpg->RawDHT[lInputBits]!=0)
386 for(lI=jpg->RawDHTstart[lInputBits];lI<(jpg->RawDHTstart[lInputBits]+jpg->RawDHT[lInputBits]);lI++)
388 if (lInput==jpg->lHuffTable[lI].HufCode)
389 lHufVal=jpg->lHuffTable[lI].HufVal;
392 if (lInputBits>=jpg->MaxHuffSz)
393 lHufVal=jpg->MaxHuffVal;
394 if (lHufVal<255) break;
396 if (lHufVal==0) resultat= 0;
398 if ( (lHufVal>0) && (lHufVal<16))
401 if( ClbJpegReadBit(jpg)==1)
403 for (lI=1;lI<lHufVal;lI++)
405 lDiff=(lDiff<<1)+ClbJpegReadBit(jpg);
408 resultat= (lDiff+(1<<(lHufVal-1)));
412 for (lI=1;lI<lHufVal;lI++)
413 lDiff=(lDiff<<1)+1-ClbJpegReadBit(jpg);
414 resultat= -(lDiff+(1<<(lHufVal-1)));