On 10/24/07, Kees Bakker <[EMAIL PROTECTED]> wrote:
>
> Hi guys,
>
> On my system transcode gives a segfault when export to dv.
> After analyzing the problem I found to cause to be here:
>
Hi, can you please test the attached patch? It's against vanilla
1.0.5rc2but it should apply against
1.0.4 too.
Thanks and best regards,
--
Francesco Romani // Ikitt
Index: export/export_dv.c
===================================================================
RCS file: /cvstc/transcode/export/export_dv.c,v
retrieving revision 1.10
diff -r1.10 export_dv.c
53,77d52
< static unsigned char *bufalloc(size_t size)
< {
<
< #ifdef HAVE_GETPAGESIZE
< long buffer_align=getpagesize();
< #else
< long buffer_align=0;
< #endif
<
< char *buf = malloc(size + buffer_align);
<
< long adjust;
<
< if (buf == NULL) {
< fprintf(stderr, "(%s) out of memory", __FILE__);
< }
<
< adjust = buffer_align - ((long) buf) % buffer_align;
<
< if (adjust == buffer_align)
< adjust = 0;
<
< return (unsigned char *) (buf + adjust);
< }
<
90c65
< target = bufalloc(TC_FRAME_DV_PAL);
---
> target = tc_bufalloc(TC_FRAME_DV_PAL);
93,94c68,69
< tmp_buf = bufalloc(PAL_W*PAL_H*2); //max frame
< dv_yuy2_mode=1;
---
> tmp_buf = tc_bufalloc(PAL_W*PAL_H*2); //max frame
> dv_yuy2_mode=1;
Index: export/export_dvraw.c
===================================================================
RCS file: /cvstc/transcode/export/export_dvraw.c,v
retrieving revision 1.27.2.1
diff -r1.27.2.1 export_dvraw.c
58,122d57
< static unsigned char *bufalloc(size_t size)
< {
<
< #ifdef HAVE_GETPAGESIZE
< long buffer_align=getpagesize();
< #else
< long buffer_align=0;
< #endif
<
< char *buf = malloc(size + buffer_align);
<
< long adjust;
<
< if (buf == NULL) {
< fprintf(stderr, "(%s) out of memory", __FILE__);
< }
<
< adjust = buffer_align - ((long) buf) % buffer_align;
<
< if (adjust == buffer_align)
< adjust = 0;
<
< return (unsigned char *) (buf + adjust);
< }
<
< #if 0 /* get this from ioaux.c */
< static int p_write (int fd, char *buf, size_t len)
< {
< size_t n = 0;
< size_t r = 0;
<
< while (r < len) {
< n = write (fd, buf + r, len - r);
< if (n < 0)
< return n;
<
< r += n;
< }
< return r;
< }
< #endif
<
< #if 0
< static void pcm_swap(char *buffer, int len)
< {
< char *in, *out;
<
< int n;
<
< char tt;
<
< in = buffer;
< out = buffer;
<
< for(n=0; n<len; n=n+2) {
<
< tt = *(in+1);
< *(out+1) = *in;
< *out = tt;
<
< in = in+2;
< out = out+2;
< }
< }
< #endif
137,138c72,73
< target = bufalloc(TC_FRAME_DV_PAL);
< vbuf = bufalloc(PAL_W*PAL_H*3);
---
> target = tc_bufalloc(TC_FRAME_DV_PAL);
> vbuf = tc_bufalloc(PAL_W*PAL_H*3);
141c76
< tmp_buf = bufalloc(PAL_W*PAL_H*2); //max frame
---
> tmp_buf = tc_bufalloc(PAL_W*PAL_H*2); //max frame
146c81
< tmp_buf = bufalloc(PAL_W*PAL_H*2); //max frame
---
> tmp_buf = tc_bufalloc(PAL_W*PAL_H*2); //max frame
Index: libtc/libtc.h
===================================================================
RCS file: /cvstc/transcode/libtc/libtc.h,v
retrieving revision 1.5.2.1
diff -r1.5.2.1 libtc.h
87a88,130
> /*
> * Allocate a buffer aligned to the machine's page size, if known. The
> * buffer must be freed with buffree() (not free()).
> */
>
> #define tc_bufalloc(size) \
> _tc_bufalloc(__FILE__, __LINE__, size)
>
> /*
> * _tc_bufalloc:
> * do the real work behind _tc_bufalloc macro
> *
> * Parameters:
> * file: name of the file on which call occurs
> * line: line of above file on which call occurs
> * (above two parameters are intended to be, and usually
> * are, filled by tc_malloc macro)
> * size: size of desired chunk of memory
> * Return Value:
> * a pointer of acquired, aligned, memory, or NULL if acquisition fails
> * Side effects:
> * a message is printed on stderr (20051017)
> * Preconditions:
> * file param not null
> */
> void *_tc_bufalloc(const char *file, int line, size_t size);
>
> /*
> * tc_buffree:
> * release a memory buffer acquired using tc_bufalloc
> *
> * Parameters:
> * ptr: pointer obtained as return value of a succesfull
> * tc_bufalloc() call
> * Return Value:
> * none
> * Preconditions:
> * ptr is acquired via tc_bufalloc(). Really BAD things will happen
> * if a buffer acquired via tc_bufalloc() is released using anything
> * but tc_buffree(), or vice versa.
> */
> void tc_buffree(void *ptr);
>
Index: libtc/tc_functions.c
===================================================================
RCS file: /cvstc/transcode/libtc/tc_functions.c,v
retrieving revision 1.6.2.1
diff -r1.6.2.1 tc_functions.c
247a248,289
>
> /*************************************************************************/
> /* Allocate a buffer aligned to the machine's page size, if known. The
> * buffer must be freed with buffree() (not free()). */
>
> void *_tc_bufalloc(const char *file, int line, size_t size)
> {
> #ifdef HAVE_GETPAGESIZE
> unsigned long pagesize = getpagesize();
> int8_t *base = malloc(size + sizeof(void *) + pagesize);
> int8_t *ptr = NULL;
> unsigned long offset = 0;
>
> if (base == NULL) {
> fprintf(stderr, "[%s:%d] tc_bufalloc(): can't allocate %lu bytes\n",
> file, line, (unsigned long)size);
> } else {
> ptr = base + sizeof(void *);
> offset = (unsigned long)ptr % pagesize;
>
> if (offset)
> ptr += (pagesize - offset);
> ((void **)ptr)[-1] = base; /* save the base pointer for freeing */
> }
> return ptr;
> #else /* !HAVE_GETPAGESIZE */
> return malloc(size);
> #endif
> }
>
> /* Free a buffer allocated with tc_bufalloc(). */
> void tc_buffree(void *ptr)
> {
> #ifdef HAVE_GETPAGESIZE
> if (ptr)
> free(((void **)ptr)[-1]);
> #else
> free(ptr);
> #endif
> }
>
> /*************************************************************************/