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 *);
13 void _IdDcmJpegFree(ClbJpeg *jpg) {
18 ClbJpeg * _IdDcmJpegRead (FILE * fp){
20 //printf("entree ds _IdDcmJpegRead depuis gdcm\n");
23 printf("Fail to ClbJpegAlloc \n");
27 if(!ClbJpegStart(jpg, fp)) {
28 printf("Fail to ClbJpegStart \n");
34 static void ClbJpegInit (ClbJpeg *jpg) {
37 jpg->lHuffTable[n].HufCode=0;
38 jpg->lHuffTable[n].HufSz =0;
39 jpg->lHuffTable[n].HufVal =0;
44 jpg->RestartInterval=0;
47 static ClbJpeg *ClbJpegAlloc(void) {
49 jpg = (ClbJpeg *)malloc(sizeof(ClbJpeg));
54 static BOOL ClbJpegFillHuffTable(ClbJpeg *jpg) {
63 jpg->RawDHTstart[c]=0;
71 jpg->RawDHT[n]=fgetc(jpg->infp);
72 NiDHT+=jpg->RawDHT[n];
73 if (jpg->RawDHT[n]!=0)
77 if(jpg->RawDHT[n]>0) {
78 jpg->RawDHTstart[n]=indexY+1;
79 for (i=1;i<(jpg->RawDHT[n]+1);i++) {
82 jpg->lHuffTable[indexY].HufVal=c;
84 jpg->lHuffTable[indexY].HufSz=n;
91 Si=jpg->lHuffTable[k].HufSz;
95 while( Si==jpg->lHuffTable[k].HufSz) {
96 jpg->lHuffTable[k].HufCode=Code;
101 while (jpg->lHuffTable[k].HufSz>Si) {
110 static BOOL ClbJpegStart(ClbJpeg *jpg, FILE *inputfp) {
112 if (!ClbJpegReadHeader(jpg)) {
113 printf("Fail to ClbJpegReadHeader\n");
116 //printf("sortie ClbJpegReadHeader\n");
117 if (!ClbJpegDecodeData(jpg)) {
118 printf("Fail to ClbJpegDecodeData\n");
121 //printf("sortie ClbJpegDecodeData\n");
125 static BOOL ClbJpegReadHeader(ClbJpeg *jpg) {
128 unsigned char l1, l2;
136 gr=fgetc(jpg->infp); //FF
137 el=fgetc(jpg->infp); //D8
142 printf("gr!=0xFF (=%02x)\n",gr);
147 if ( (el==0xFF) || (el==0x01) || (el==0xD8) ||(el==0xD9) ||( (el>=0xD0) && (el<=0xD7) ))
152 sztag=(l1*256)+l2-2; //tag lengh
153 ouca=ftell(jpg->infp);
156 jpg->lSof.precision=fgetc(jpg->infp);
160 jpg->lSof.Himg=(l1*256)+l2;
162 //printf("%x %x Himg %d\n",l1,l2,jpg->lSof.Himg);
166 jpg->lSof.Wimg=(l1*256)+l2;
168 //printf("%x %x Wimg %d\n",l1,l2,jpg->lSof.Wimg);
169 jpg->lSof.NbComponent=fgetc(jpg->infp);
171 jpg->lSof.SofTabPos=ftell(jpg->infp);
173 isLossLess=1; // TRUE
177 ClbJpegFillHuffTable(jpg);
180 jpg->lSos.CompCount=fgetc(jpg->infp);
181 for (tp=0;tp<jpg->lSos.CompCount;tp++) {
182 jpg->lSos.CompId=fgetc(jpg->infp);
183 jpg->lSos.CompDc=fgetc(jpg->infp);
185 jpg->lSos.SpectralSelStart=fgetc(jpg->infp);
186 jpg->lSos.SpectralSelEnd=fgetc(jpg->infp);
187 jpg->lSos.SuccessiveAp=fgetc(jpg->infp);
188 jpg->lSos.Sospttrans=(jpg->lSos.SuccessiveAp & 16);
194 jpg->RestartInterval=(l1*256)+l2;
197 fseek(jpg->infp,(ouca+sztag),0);
202 printf("NOT isLossLess\n");
208 static int ClbJpegReadBit(ClbJpeg *jpg) {
211 if(jpg->PosCurBit>8) // need lire octet suivant
213 jpg->ValCurByte=fgetc(jpg->infp);
214 if (jpg->ValCurByte==0xFF)
216 c=fgetc(jpg->infp);// est 00 ou restart marker: a skiper
219 jpg->ValCurByte=fgetc(jpg->infp);
226 return (jpg->ValCurByte>>7);
230 r=(1&(jpg->ValCurByte>>(8-jpg->PosCurBit)));
237 static BOOL ClbJpegDecodeData(ClbJpeg *jpg)
243 int lPredicted=(1<<(jpg->lSof.precision-1-jpg->lSos.Sospttrans));
245 jpg->ValCurByte=jpg->lSos.SuccessiveAp;
248 if (jpg->lSof.precision==8)
250 if (jpg->lSof.precision==12)
252 if (jpg->lSof.precision==16)
255 //printf("jpg->lSof.precision : %d\n",jpg->lSof.precision );
256 //printf("sizeof(*jpg->DataImg) : %d\n",sizeof(*jpg->DataImg) );
258 jpg->DataImg=(int*)malloc(jpg->lSof.Himg*jpg->lSof.Wimg*sizeof(*jpg->DataImg));
259 memset( jpg->DataImg,0,(jpg->lSof.Himg * jpg->lSof.Wimg * sizeof(*jpg->DataImg)));
261 if (!jpg->RestartInterval)
263 //printf("il N'y a PAS un define interval\n");
264 for(iX=0;iX<jpg->lSof.Wimg;iX++) // lit première ligne
268 lPredicted= jpg->DataImg[lbInc-1];
269 jpg->DataImg[lbInc]=lPredicted+ClbJpegDecodeDiff(jpg);
271 if ( jpg->DataImg[lbInc] > ((1<<(jpg->lSof.precision))-1) )
272 jpg->DataImg[lbInc]= jpg->DataImg[lbInc]&mask;
273 if ( jpg->DataImg[lbInc]<0)
274 jpg->DataImg[lbInc]= jpg->DataImg[lbInc]&mask;
277 for (iY=1;iY<jpg->lSof.Himg;iY++) //lit la suite
280 if (lbInc>(jpg->lSof.Himg*jpg->lSof.Wimg-1)) break;
281 lPredicted= jpg->DataImg[lbInc-jpg->lSof.Wimg]; // se base % premier é ligne d'avant
282 jpg->DataImg[lbInc]=lPredicted+ClbJpegDecodeDiff(jpg);
284 if ( jpg->DataImg[lbInc] > ((1<<(jpg->lSof.precision))-1) )
285 jpg->DataImg[lbInc]= jpg->DataImg[lbInc]&mask;
286 if ( jpg->DataImg[lbInc]<0)
287 jpg->DataImg[lbInc]= jpg->DataImg[lbInc]&mask;
289 for(iX=1;iX<jpg->lSof.Wimg;iX++)
292 if (lbInc>(jpg->lSof.Himg*jpg->lSof.Wimg-1)) break;
293 if (jpg->lSos.SpectralSelStart==7) // si spectral
294 lPredicted=( jpg->DataImg[lbInc-1]+ jpg->DataImg[lbInc-jpg->lSof.Wimg])>>1;
296 lPredicted= jpg->DataImg[lbInc-1]; // se base%pixel juste avant
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;
307 else // il y a un define interval
309 //printf("il y a un define interval\n");
313 lPredicted=(1<<(jpg->lSof.precision - 1 - jpg->lSos.Sospttrans));
314 for (iY=0;iY<jpg->RestartInterval;iY++)
316 jpg->DataImg[lbInc]=lPredicted+ClbJpegDecodeDiff(jpg);
318 if ( jpg->DataImg[lbInc] > ((1<<(jpg->lSof.precision))-1) )
319 jpg->DataImg[lbInc]= jpg->DataImg[lbInc]&mask;
320 if ( jpg->DataImg[lbInc]<0)
321 jpg->DataImg[lbInc]= jpg->DataImg[lbInc]&mask;
324 if (lbInc>(jpg->lSof.Himg*jpg->lSof.Wimg-1)) return 1;
326 if (jpg->lSos.SpectralSelStart==7) // si spectral
327 lPredicted=( jpg->DataImg[lbInc-1]+ jpg->DataImg[lbInc-jpg->lSof.Wimg])>>1;
329 lPredicted= jpg->DataImg[lbInc-1];
331 while (!jpg->MarkerFound)
333 ClbJpegReadBit(jpg); // skip bits restant avant restart marker
340 static int ClbJpegDecodeDiff(ClbJpeg *jpg) {
353 lInput=(lInput<<1)+ClbJpegReadBit(jpg);
354 if (jpg->RawDHT[lInputBits]!=0) {
355 for(lI=jpg->RawDHTstart[lInputBits];lI<(jpg->RawDHTstart[lInputBits]+jpg->RawDHT[lInputBits]);lI++) {
356 if (lInput==jpg->lHuffTable[lI].HufCode)
357 lHufVal=jpg->lHuffTable[lI].HufVal;
360 if (lInputBits>=jpg->MaxHuffSz)
361 lHufVal=jpg->MaxHuffVal;
362 if (lHufVal<255) break;
364 if (lHufVal==0) resultat= 0;
366 if ( (lHufVal>0) && (lHufVal<16)) {
368 if( ClbJpegReadBit(jpg)==1) {
369 for (lI=1;lI<lHufVal;lI++) {
370 lDiff=(lDiff<<1)+ClbJpegReadBit(jpg);
372 resultat= (lDiff+(1<<(lHufVal-1)));
374 for (lI=1;lI<lHufVal;lI++)
375 lDiff=(lDiff<<1)+1-ClbJpegReadBit(jpg);
376 resultat= -(lDiff+(1<<(lHufVal-1)));