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 > } > > /*************************************************************************/