X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2Fgdcmjpeg%2Fjdpred.c;fp=src%2Fgdcmjpeg%2Fjdpred.c;h=abe003e17eccf0085a2e53ce63fb502ae4a4d9da;hb=a33271fe1b265854dd8ff69301a7e7777b04f2d1;hp=4704fc4f9c3491959c56b1a6fcfe873f35e5253b;hpb=b1f5f7058f0c0fdcd92aeac0ced76f1c9738daa1;p=gdcm.git diff --git a/src/gdcmjpeg/jdpred.c b/src/gdcmjpeg/jdpred.c index 4704fc4f..abe003e1 100644 --- a/src/gdcmjpeg/jdpred.c +++ b/src/gdcmjpeg/jdpred.c @@ -72,6 +72,18 @@ * logically AND the result with 0xFFFF. */ +#define UNDIFFERENCE_2D_BUG(PREDICTOR) \ + Rb = GETJSAMPLE(prev_row[0]); \ + Ra = (diff_buf[0] + PREDICTOR2) & 0xFFFF; \ + undiff_buf[0] = Ra; \ + \ + for (xindex = 1; xindex < width; xindex++) { \ + Rc = Rb; \ + Rb = GETJSAMPLE(prev_row[xindex]); \ + Ra = (diff_buf[xindex] + PREDICTOR) & 0xFFFF; \ + undiff_buf[xindex] = Ra; \ + } + #define UNDIFFERENCE_2D(PREDICTOR) \ unsigned int xindex; \ int Ra, Rb, Rc; \ @@ -141,14 +153,55 @@ jpeg_undifference5(j_decompress_ptr cinfo, int comp_index, (void)cinfo;(void)comp_index;(void)diff_buf;(void)prev_row;(void)undiff_buf;(void)width; } +#ifdef SUPPORT_DICOMOBJECTS_BUG +/* uniitialized */ +static int dicomobjectsbug = -1; /* 0 == nobug, 1 == bug */ +#endif + METHODDEF(void) jpeg_undifference6(j_decompress_ptr cinfo, int comp_index, JDIFFROW diff_buf, JDIFFROW prev_row, JDIFFROW undiff_buf, JDIMENSION width) { +#ifdef SUPPORT_DICOMOBJECTS_BUG + unsigned int xindex; + int Ra, Rb, Rc; + int min, max, temp; + SHIFT_TEMPS + if( dicomobjectsbug == -1 ) + { + dicomobjectsbug = 0; /* no bug by default */ + + Rb = GETJSAMPLE(prev_row[0]); + Ra = (diff_buf[0] + PREDICTOR2) & 0xFFFF; + undiff_buf[0] = Ra; + min = max = undiff_buf[0]; + + for (xindex = 1; xindex < width; xindex++) { + Rc = Rb; + Rb = GETJSAMPLE(prev_row[xindex]); + Ra = (diff_buf[xindex] + PREDICTOR6) & 0xFFFF; + min = temp < min ? temp : min; + max = temp > max ? temp : max; + } + if( (max - min) > 50000) /* magic number */ + { + dicomobjectsbug = 1; + } + } + if(dicomobjectsbug) + { + UNDIFFERENCE_2D_BUG(PREDICTOR6_BUG); + } + else + { + UNDIFFERENCE_2D_BUG(PREDICTOR6); + } +#else SHIFT_TEMPS UNDIFFERENCE_2D(PREDICTOR6); - (void)cinfo;(void)comp_index;(void)diff_buf;(void)prev_row;(void)undiff_buf;(void)width; +#endif + (void)comp_index;(void)cinfo; } METHODDEF(void)