X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;ds=sidebyside;f=src%2Fgdcmjpeg%2Fjdpred.c;h=1e6f183cfbda3f3ce2b315fc87e2cd951b7b4b1b;hb=bd7bec4c367d671a9da358584e98a8ec29bb641e;hp=4704fc4f9c3491959c56b1a6fcfe873f35e5253b;hpb=e1830579102f036e9e558320a21990a9438ec9ef;p=gdcm.git diff --git a/src/gdcmjpeg/jdpred.c b/src/gdcmjpeg/jdpred.c index 4704fc4f..1e6f183c 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,56 @@ 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; + temp = min = max = undiff_buf[0]; + + for (xindex = 1; xindex < width; xindex++) { + Rc = Rb; + Rb = GETJSAMPLE(prev_row[xindex]); + Ra = (diff_buf[xindex] + PREDICTOR6) & 0xFFFF; + temp = Ra; + 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)