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 length
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);
170 jpg->lSof.NbComponent=fgetc(jpg->infp);
171 //printf("NbComponent %d\n", jpg->lSof.NbComponent);
173 jpg->lSof.SofTabPos=ftell(jpg->infp);
175 isLossLess=1; // TRUE
179 ClbJpegFillHuffTable(jpg);
182 jpg->lSos.CompCount=fgetc(jpg->infp);
183 for (tp=0;tp<jpg->lSos.CompCount;tp++) {
184 jpg->lSos.CompId=fgetc(jpg->infp);
185 jpg->lSos.CompDc=fgetc(jpg->infp);
187 jpg->lSos.SpectralSelStart=fgetc(jpg->infp);
188 jpg->lSos.SpectralSelEnd=fgetc(jpg->infp);
189 jpg->lSos.SuccessiveAp=fgetc(jpg->infp);
190 jpg->lSos.Sospttrans=(jpg->lSos.SuccessiveAp & 16);
196 jpg->RestartInterval=(l1*256)+l2;
199 fseek(jpg->infp,(ouca+sztag),0);
204 printf("NOT isLossLess\n");
210 static int ClbJpegReadBit(ClbJpeg *jpg) {
213 if(jpg->PosCurBit>8) // need lire octet suivant
215 jpg->ValCurByte=fgetc(jpg->infp);
216 if (jpg->ValCurByte==0xFF)
218 c=fgetc(jpg->infp);// est 00 ou restart marker: a skiper
221 jpg->ValCurByte=fgetc(jpg->infp);
228 return (jpg->ValCurByte>>7);
232 r=(1&(jpg->ValCurByte>>(8-jpg->PosCurBit)));
239 static BOOL ClbJpegDecodeData(ClbJpeg *jpg)
246 int lPredicted=(1<<(jpg->lSof.precision-1-jpg->lSos.Sospttrans));
249 jpg->ValCurByte=jpg->lSos.SuccessiveAp;
252 if (jpg->lSof.precision==8)
254 if (jpg->lSof.precision==12)
256 if (jpg->lSof.precision==16)
259 //printf("jpg->lSof.precision : %d\n",jpg->lSof.precision );
260 //printf("sizeof(*jpg->DataImg) : %d\n",sizeof(*jpg->DataImg) );
262 jpg->DataImg=(int*)malloc(jpg->lSof.Himg*dimX*sizeof(*jpg->DataImg)*jpg->lSof.NbComponent); // *3
263 memset( jpg->DataImg,0,(jpg->lSof.Himg * dimX * sizeof(*jpg->DataImg)*jpg->lSof.NbComponent)); // *3
265 if (!jpg->RestartInterval)
267 //printf("il N'y a PAS un define interval\n");
268 for(iX=0;iX<dimX*jpg->lSof.NbComponent;iX++) // lit première ligne // *3
272 lPredicted= jpg->DataImg[lbInc-1];
273 jpg->DataImg[lbInc]=lPredicted+ClbJpegDecodeDiff(jpg);
275 if ( jpg->DataImg[lbInc] > ((1<<(jpg->lSof.precision))-1) )
276 jpg->DataImg[lbInc]= jpg->DataImg[lbInc]&mask;
277 if ( jpg->DataImg[lbInc]<0)
278 jpg->DataImg[lbInc]= jpg->DataImg[lbInc]&mask;
281 for (iY=1;iY<jpg->lSof.Himg;iY++) //lit la suite
284 if (lbInc>(jpg->lSof.Himg*dimX*jpg->lSof.NbComponent-1)) break; //*3
285 lPredicted= jpg->DataImg[lbInc-jpg->lSof.Wimg*jpg->lSof.NbComponent];//*3 // se base % premier é ligne d'avant
286 jpg->DataImg[lbInc]=lPredicted+ClbJpegDecodeDiff(jpg);
288 if ( jpg->DataImg[lbInc] > ((1<<(jpg->lSof.precision))-1) )
289 jpg->DataImg[lbInc]= jpg->DataImg[lbInc]&mask;
290 if ( jpg->DataImg[lbInc]<0)
291 jpg->DataImg[lbInc]= jpg->DataImg[lbInc]&mask;
293 for(iX=1;iX<jpg->lSof.Wimg*jpg->lSof.NbComponent;iX++) //*3
296 if (lbInc>(jpg->lSof.Himg*jpg->lSof.Wimg*jpg->lSof.NbComponent-1)) break;//*3
297 if (jpg->lSos.SpectralSelStart==7) // si spectral
298 lPredicted=( jpg->DataImg[lbInc-1]+ jpg->DataImg[lbInc-jpg->lSof.Wimg*jpg->lSof.NbComponent])>>1; //*3
300 lPredicted= jpg->DataImg[lbInc-1]; // se base%pixel juste avant
301 jpg->DataImg[lbInc]=lPredicted+ClbJpegDecodeDiff(jpg);
303 if ( jpg->DataImg[lbInc] > ((1<<(jpg->lSof.precision))-1) )
304 jpg->DataImg[lbInc]= jpg->DataImg[lbInc]&mask;
305 if ( jpg->DataImg[lbInc]<0)
306 jpg->DataImg[lbInc]= jpg->DataImg[lbInc]&mask;
311 else // il y a un define interval
313 //printf("il y a un define interval\n");
317 lPredicted=(1<<(jpg->lSof.precision - 1 - jpg->lSos.Sospttrans));
318 for (iY=0;iY<jpg->RestartInterval;iY++)
320 jpg->DataImg[lbInc]=lPredicted+ClbJpegDecodeDiff(jpg);
322 if ( jpg->DataImg[lbInc] > ((1<<(jpg->lSof.precision))-1) )
323 jpg->DataImg[lbInc]= jpg->DataImg[lbInc]&mask;
324 if ( jpg->DataImg[lbInc]<0)
325 jpg->DataImg[lbInc]= jpg->DataImg[lbInc]&mask;
328 if (lbInc>(jpg->lSof.Himg*jpg->lSof.Wimg*jpg->lSof.NbComponent-1)) return 1; //*3
330 if (jpg->lSos.SpectralSelStart==7) // si spectral
331 lPredicted=( jpg->DataImg[lbInc-1]+ jpg->DataImg[lbInc-jpg->lSof.Wimg*jpg->lSof.NbComponent])>>1; //*3
333 lPredicted= jpg->DataImg[lbInc-1];
335 while (!jpg->MarkerFound)
337 ClbJpegReadBit(jpg); // skip bits restant avant restart marker
344 static int ClbJpegDecodeDiff(ClbJpeg *jpg) {
357 lInput=(lInput<<1)+ClbJpegReadBit(jpg);
358 if (jpg->RawDHT[lInputBits]!=0) {
359 for(lI=jpg->RawDHTstart[lInputBits];lI<(jpg->RawDHTstart[lInputBits]+jpg->RawDHT[lInputBits]);lI++) {
360 if (lInput==jpg->lHuffTable[lI].HufCode)
361 lHufVal=jpg->lHuffTable[lI].HufVal;
364 if (lInputBits>=jpg->MaxHuffSz)
365 lHufVal=jpg->MaxHuffVal;
366 if (lHufVal<255) break;
368 if (lHufVal==0) resultat= 0;
370 if ( (lHufVal>0) && (lHufVal<16)) {
372 if( ClbJpegReadBit(jpg)==1) {
373 for (lI=1;lI<lHufVal;lI++) {
374 lDiff=(lDiff<<1)+ClbJpegReadBit(jpg);
376 resultat= (lDiff+(1<<(lHufVal-1)));
378 for (lI=1;lI<lHufVal;lI++)
379 lDiff=(lDiff<<1)+1-ClbJpegReadBit(jpg);
380 resultat= -(lDiff+(1<<(lHufVal-1)));