Page 1 of 1

failing "MAT (MatLab RGB 8-bit LSB integer) ..." test

Posted: 2013-01-11T05:15:35-07:00
by Petr
Hi,

6.7.8-8 is failing for me when MALLOC_PERTURB_ is set at least for some nonzero values. See following code derived from this test:

Code: Select all

----- read-compare.pl -----
use Image::Magick;

print("MAT (MatLab RGB 8-bit LSB integer) ...\n");
$srcimage_name = 'input_rgb_lsb_08bit.mat';
$refimage_name = 'reference/read/input_rgb_lsb_08bit_mat.miff';

$srcimage=Image::Magick->new;
$srcimage->ReadImage("$srcimage_name");
$refimage=Image::Magick->new;
$refimage->ReadImage("$refimage_name");

$srcimage->Difference($refimage);

$normalized_mean_error=$srcimage->GetAttribute('mean-error');
print("mean-error: $normalized_mean_error\n");
Mean error seems to depend on MALLOC_PERTURB_ value:

Code: Select all

$ export MALLOC_PERTURB_=0
$ perl read-compare.pl
MAT (MatLab RGB 8-bit LSB integer) ...
mean-error: 0.0354644260035022
$ export MALLOC_PERTURB_=69
$ perl read-compare.pl
MAT (MatLab RGB 8-bit LSB integer) ...
mean-error: 0.24184922359772
$ export MALLOC_PERTURB_=1
$ perl read-compare.pl
MAT (MatLab RGB 8-bit LSB integer) ...
mean-error: 0.494382340266855
$ export MALLOC_PERTURB_=71
$ perl read-compare.pl
MAT (MatLab RGB 8-bit LSB integer) ...
mean-error: 0.235857124369786

Re: failing "MAT (MatLab RGB 8-bit LSB integer) ..." test

Posted: 2013-01-11T05:22:25-07:00
by Petr
valgrind output:

Code: Select all

[...]
==24898== Conditional jump or move depends on uninitialised value(s)
==24898==    at 0x634C670: ScaleAnyToQuantum (quantum-private.h:277)
==24898==    by 0x634EE61: ImportBlueQuantum (quantum-import.c:1107)
==24898==    by 0x6355DE6: ImportQuantumPixels (quantum-import.c:3416)
==24898==    by 0x819F22E: ReadMATImage (mat.c:926)
==24898==    by 0x622B1A6: ReadImage (constitute.c:535)
==24898==    by 0x622C81A: ReadImages (constitute.c:901)
==24898==    by 0x5F48D01: XS_Image__Magick_Read (Magick.xs:13041)
==24898==    by 0x4A6F51: Perl_pp_entersub (in /usr/bin/perl)
==24898==    by 0x49F715: Perl_runops_standard (in /usr/bin/perl)
==24898==    by 0x43CBB1: perl_run (in /usr/bin/perl)
==24898==    by 0x41EC5A: main (in /usr/bin/perl)
[...]
==24898== Conditional jump or move depends on uninitialised value(s)
==24898==    at 0x6215B14: IsImagesEqual (compare.c:1650)
==24898==    by 0x5F636E3: XS_Image__Magick_Mogrify (Magick.xs:9535)
==24898==    by 0x4A6F51: Perl_pp_entersub (in /usr/bin/perl)
==24898==    by 0x49F715: Perl_runops_standard (in /usr/bin/perl)
==24898==    by 0x43CBB1: perl_run (in /usr/bin/perl)
==24898==    by 0x41EC5A: main (in /usr/bin/perl)
[...]

Re: failing "MAT (MatLab RGB 8-bit LSB integer) ..." test

Posted: 2013-01-11T06:17:28-07:00
by Petr
Don't know so far if this is relevant:

Code: Select all

$ export $MALLOC_PERTURB_=69
[...]
Breakpoint 1, IsImagesEqual (image=0x8ce730, reconstruct_image=0x8c3030) at magick/compare.c:1607
1607	  for (y=0; y < (ssize_t) image->rows; y++)
(gdb) n
1620	    p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception);
(gdb) n
1621	    q=GetCacheViewVirtualPixels(reconstruct_view,0,y,reconstruct_image->columns,
(gdb) n
1623	    if ((p == (const PixelPacket *) NULL) || (q == (const PixelPacket *) NULL))
(gdb) p *p
$1 = {blue = 47802, green = 11822, red = 10794, opacity = 47802}
(gdb) p *q
$2 = {blue = 17219, green = 11822, red = 10794, opacity = 0}

Code: Select all

$ export $MALLOC_PERTURB_=71
[...]
Breakpoint 1, IsImagesEqual (image=0x8cd290, reconstruct_image=0x8beb00) at magick/compare.c:1607
1607	  for (y=0; y < (ssize_t) image->rows; y++)
(gdb) n
1620	    p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception);
(gdb) n
1621	    q=GetCacheViewVirtualPixels(reconstruct_view,0,y,reconstruct_image->columns,
(gdb) n
1623	    if ((p == (const PixelPacket *) NULL) || (q == (const PixelPacket *) NULL))
(gdb) p *p
$29 = {blue = 47288, green = 11822, red = 10794, opacity = 47288}
(gdb) p *q
$30 = {blue = 17219, green = 11822, red = 10794, opacity = 0}

Re: failing "MAT (MatLab RGB 8-bit LSB integer) ..." test

Posted: 2013-01-11T06:39:18-07:00
by magick
We can reproduce the problem and will have a patch for it in the next point release of ImageMagick. Thanks.

Re: failing "MAT (MatLab RGB 8-bit LSB integer) ..." test

Posted: 2013-01-14T02:23:20-07:00
by Petr
Thank you!

Re: failing "MAT (MatLab RGB 8-bit LSB integer) ..." test

Posted: 2013-01-15T02:03:49-07:00
by broucaries
can you post also this patch?

Re: failing "MAT (MatLab RGB 8-bit LSB integer) ..." test

Posted: 2013-01-15T04:27:44-07:00
by magick
Here are the patches:

Code: Select all

--- ImageMagick-6.8.1~/coders/mat.c     2013-01-15 07:47:35.012032065 -0500
+++ ImageMagick-6.8.1/coders/mat.c      2013-01-15 07:48:04.631798260 -0500
@@ -887,7 +887,7 @@
     {
       for (i = 0; i < (ssize_t) MATLAB_HDR.SizeY; i++)
       {
-        q=QueueAuthenticPixels(image,0,MATLAB_HDR.SizeY-i-1,image->columns,1,ex
ception);
+        q=GetAuthenticPixels(image,0,MATLAB_HDR.SizeY-i-1,image->columns,1,exce
ption);
         if (q == (PixelPacket *)NULL)
   {
     if (logging) (void)LogMagickEvent(CoderEvent,GetMagickModule(),

Code: Select all

--- ImageMagick-6.8.1~/magick/quantum-import.c  2013-01-15 07:47:51.836171241 -0500
+++ ImageMagick-6.8.1/magick/quantum-import.c   2013-01-15 07:49:25.611094994 -0500
@@ -1032,62 +1032,86 @@
 
   switch (quantum_info->depth)
   {
-    case 10:
+    case 8:
     {
-      Quantum
-        cbcr[4];
+      unsigned char
+        pixel;
 
-      pixel=0;
-      if (quantum_info->pack == MagickFalse)
-        {
-          register ssize_t
-            i;
+      for (x=0; x < (ssize_t) number_pixels; x++)
+      {
+        p=PushCharPixel(p,&pixel);
+        SetPixelBlue(q,ScaleCharToQuantum(pixel));
+        p+=quantum_info->pad;
+        q++;
+      }
+      break;
+    }
+    case 16:
+    {
+      unsigned short
+        pixel;
 
-          size_t
-            quantum;
+      if (quantum_info->format == FloatingPointQuantumFormat)
+        {
+          for (x=0; x < (ssize_t) number_pixels; x++)
+          {
+            p=PushShortPixel(quantum_info->endian,p,&pixel);
+            SetPixelBlue(q,ClampToQuantum((MagickRealType)
+              QuantumRange*HalfToSinglePrecision(pixel)));
+            p+=quantum_info->pad;
+            q++;
+          }
+          break;
+        }
+      for (x=0; x < (ssize_t) number_pixels; x++)
+      {
+        p=PushShortPixel(quantum_info->endian,p,&pixel);
+        SetPixelBlue(q,ScaleShortToQuantum(pixel));
+        p+=quantum_info->pad;
+        q++;
+      }
+      break;
+    }
+    case 32:
+    {
+      unsigned int
+        pixel;
 
-          ssize_t
-            n;
+      if (quantum_info->format == FloatingPointQuantumFormat)
+        {
+          float
+            pixel;
 
-          n=0;
-          quantum=0;
-          for (x=0; x < (ssize_t) number_pixels; x+=2)
+          for (x=0; x < (ssize_t) number_pixels; x++)
           {
-            for (i=0; i < 4; i++)
-            {
-              switch (n % 3)
-              {
-                case 0:
-                {
-                  p=PushLongPixel(quantum_info->endian,p,&pixel);
-                  quantum=(size_t) (ScaleShortToQuantum((unsigned short)
-                    (((pixel >> 22) & 0x3ff) << 6)));
-                  break;
-                }
-                case 1:
-                {
-                  quantum=(size_t) (ScaleShortToQuantum((unsigned short)
-                    (((pixel >> 12) & 0x3ff) << 6)));
-                  break;
-                }
-                case 2:
-                {
-                  quantum=(size_t) (ScaleShortToQuantum((unsigned short)
-                    (((pixel >> 2) & 0x3ff) << 6)));
-                  break;
-                }
-              }
-              cbcr[i]=(Quantum) (quantum);
-              n++;
-            }
+            p=PushFloatPixel(quantum_info,p,&pixel);
+            SetPixelBlue(q,ClampToQuantum(pixel));
             p+=quantum_info->pad;
-            SetPixelRed(q,cbcr[1]);
-            SetPixelGreen(q,cbcr[0]);
-            SetPixelBlue(q,cbcr[2]);
             q++;
-            SetPixelRed(q,cbcr[3]);
-            SetPixelGreen(q,cbcr[0]);
-            SetPixelBlue(q,cbcr[2]);
+          }
+          break;
+        }
+      for (x=0; x < (ssize_t) number_pixels; x++)
+      {
+        p=PushLongPixel(quantum_info->endian,p,&pixel);
+        SetPixelBlue(q,ScaleLongToQuantum(pixel));
+        p+=quantum_info->pad;
+        q++;
+      }
+      break;
+    }
+    case 64:
+    {
+      if (quantum_info->format == FloatingPointQuantumFormat)
+        {
+          double
+            pixel;
+
+          for (x=0; x < (ssize_t) number_pixels; x++)
+          {
+            p=PushDoublePixel(quantum_info,p,&pixel);
+            SetPixelBlue(q,ClampToQuantum(pixel));
+            p+=quantum_info->pad;
             q++;
           }
           break;
@@ -1102,9 +1126,8 @@
       for (x=0; x < (ssize_t) number_pixels; x++)
       {
         p=PushQuantumPixel(quantum_info,p,&pixel);
-        SetPixelRed(q,ScaleAnyToQuantum(pixel,range));
-        p=PushQuantumPixel(quantum_info,p,&pixel);
-        SetPixelGreen(q,ScaleAnyToQuantum(pixel,range));
+        SetPixelBlue(q,ScaleAnyToQuantum(pixel,range));
+        p+=quantum_info->pad;
         q++;
       }
       break;

Re: failing "MAT (MatLab RGB 8-bit LSB integer) ..." test

Posted: 2013-01-16T03:43:01-07:00
by Petr
That indeed helped, thanks.