Quoting "Steven M. Schultz" <[EMAIL PROTECTED]>:

>       But even after doing that there is the same type of error that
>       was found in yuvdeinterlace.

OK, so I will drop in here... :-)

All buffers in yuvdeinterlace, yuvdenoise and most probably  
yuvmotionfps (as it is based on an old yuvdeinterlace-version *need*  
*far* bigger buffers.

>       There is a HUGE difference between:
>
> nframe[0] = buff_offset + (uint8_t *) bufalloc (buff_size);
>
>       and
>
> inframe[0] = (uint8_t *) bufalloc (buff_offset + buff_size);
>
>       The FIRST one is what was being done.  It allocates a buffer of
>       buff_size bytes and THEN modifies the pointer.

And that one was correct as buffsize was modified *before* to be  
bigger. buff_size was added with the size of some lines above and  
below the buffer. As the functions all rely on a pointer pointing  
*inside* the buffer to the beginning of the data, the first line was  
correct for yuvdeinterlace.

Steven, your malloc-bugfix introduced that bug...

// before the bugfix...
// code fragment (Revision 1.9 yuvdeinterlace.cc):
//-------------------------------------------------------------

void initialize_memory (int w, int h, int cw, int ch)
{
   int luma_size;
   int chroma_size;

   // Some functions need some vertical overshoot area
   // above and below the image. So we make the buffer
   // a little bigger...
   vertical_overshot_luma = 32*w;
   vertical_overshot_chroma = 32*cw;
   luma_size = ( w * h ) + 2 * vertical_overshot_luma;
   chroma_size = ( cw * ch ) + 2 * vertical_overshot_chroma;

   inframe[0] = (uint8_t *) malloc (luma_size) + vertical_overshot_luma;
   inframe[1] = (uint8_t *) malloc (chroma_size) + vertical_overshot_chroma;
   inframe[2] = (uint8_t *) malloc (chroma_size) + vertical_overshot_chroma;
...
...
...
   }

~deinterlacer ()
   {
   int vertical_overshot_luma = 32*YUVdeint.width;
   int vertical_overshot_chroma = 32*YUVdeint.cwidth;

   free (inframe[0] - vertical_overshot_luma);
   free (inframe[1] - vertical_overshot_chroma);
   free (inframe[2] - vertical_overshot_chroma);
   ...
   ...
   ...
}
//-------------------------------------------------------------

This worked as follows:

The plain image-planes need a size of just w*h. As some functions  
dramaticaly overshot (eg. the MC-functions, ELA and  
antialiasing-filters...) by far more than just 1 or 2 lines of pixels,  
a save-area is defined of 32 lines top of and below of the buffer. So  
the buffer-size is increased by two times vertical_overshot. *But* to  
make this work, it is absolutly required, that the pointer is shifted,  
so it points *inside* the allocated memory and not to the beginnig of  
it...

This is the code *after* your "bugfix":

// code fragment (Revision 1.0 yuvdeinterlace.cc):
//-------------------------------------------------------------

void initialize_memory (int w, int h, int cw, int ch)
{
   int luma_size;
   int chroma_size;

   // Some functions need some vertical overshoot area
   // above and below the image. So we make the buffer
   // a little bigger...
   vertical_overshot_luma = 32*w;
   vertical_overshot_chroma = 32*cw;
   luma_size = ( w * h ) + 2 * vertical_overshot_luma;
   chroma_size = ( cw * ch ) + 2 * vertical_overshot_chroma;

   inframe[0] = (uint8_t *) malloc (luma_size + vertical_overshot_luma);
   inframe[1] = (uint8_t *) malloc (chroma_size + vertical_overshot_chroma);
   inframe[2] = (uint8_t *) malloc (chroma_size + vertical_overshot_chroma);
...
...
...
   }

~deinterlacer ()
   {
   free (inframe[0]);
   free (inframe[1]);
   free (inframe[2]);
   ...
   ...
   ...
}
//-------------------------------------------------------------

This makes the buffers even bigger than than in 1.9, but the pointer  
is directing to the *beginning* of the malloced area. This make every  
single function which need the overshot barf on machines with strict  
memory-protection as they *will* now try to access memory outside of  
the buffer...

>       There is a HUGE difference between:

You are right. There *is* a big difference between these two...  
:-))))) Could you please fix your fix?

cu
Stefan


-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
Mjpeg-users mailing list
Mjpeg-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mjpeg-users

Reply via email to