Date: Wed, 6 May 1998 20:49:02 -0400 From: Randall Hopper <rhh@ct.picker.com> To: Tomi.Vainio@Sun.COM Cc: multimedia@FreeBSD.ORG Subject: Fxtv 0.46 XImages FIX (Re: problem capturing video with BT848/Hauppauge Win/TV) Message-ID: <19980506204902.A615@ct.picker.com> In-Reply-To: <13647.31488.492948.498930@ultrahot>; from Tomi Vainio - Sun Finland - on Tue, May 05, 1998 at 11:48:00PM %2B0300 References: <13647.31488.492948.498930@ultrahot>
next in thread | previous in thread | raw e-mail | index | archive | help
[-- Attachment #1 --]
Ok Tomi, I "think" I've got it :-) (at least for your XImages core dump)
In summary:
PROBLEM #1 SYMPTOMS:
- Core dump building/processing an XImage
- Only occurs in -bpp 32
- Core dump appears to happen with either Standard or
Shared (Shm) XImages
There was a bug in the allocation of standard XImages that could result in
underallocation of the image buffer leading to a core dump.
Please try:
1. Apply the 1st attached patch (*TST*.patch) to unmodified Fxtv 0.46
source, build, and then do this:
> gdb ./fxtv
(gdb) run -synchronous -disableDirectV
(gdb) where
Play with it, maximize it, move it around, try to core dump it. If
you can't, skip the "where" command. If it core dumps though I'd
appreciate you mailing the stack printout as well as the program output.
2. If it dumps, try:
> gdb ./fxtv
(gdb) run -synchronous -disableDirectV -xrm "*Bpp32bit: 4" -xrm "*Bpp24bit: 4"
(gdb) where
Again, try to core dump it.
If this works for you as I suspect it will, here's the "real" fix:
3. Apply 2nd attached patch (*FIX*.patch) to unmodified Fxtv 0.46
source, build, and give the fxtv binary a whirl.
This is the same thing minus the printfs and the gratuitous quadrupling of
the image buffer size in the *TST*.patch patch. :-)
Let me know how it goes.
Randall
[-- Attachment #2 --]
--- ORIG/Makefile Wed Nov 5 01:14:25 1997
+++ Makefile Wed May 6 20:36:19 1998
@@ -7,10 +7,10 @@
override CF_VERS = -DVERS_STR=\"0.46\"
override INC = -I$(X11BASE)/include -I/usr/local/include
override LD_INC = -L$(X11BASE)/lib -L/usr/local/lib
-override CFLAGS = -O2 -m486 $(INC) $(CF_VERS)
-#override CFLAGS = -g $(INC) $(CF_VERS)
-override LDFLAGS = $(LD_INC)
-#override LDFLAGS = -g $(LD_INC)
+#override CFLAGS = -O2 -m486 $(INC) $(CF_VERS)
+override CFLAGS = -g $(INC) $(CF_VERS)
+#override LDFLAGS = $(LD_INC)
+override LDFLAGS = -g $(LD_INC)
override LIBS = -ltiff -lXaw3d -lXmu -lXt -lXpm -lXxf86dga \
-lXxf86vm -lSM -lICE -lXext -lX11
@@ -30,7 +30,7 @@
$(EXEC) : $(CSRCOBJ)
$(CC) $(LDFLAGS) -o $@ $^ $(LIBS)
- strip $(EXEC)
+# strip $(EXEC)
tv.o : tv.c app_rsrc.h
--- ORIG/tvscreen.c Wed Nov 5 01:01:57 1997
+++ tvscreen.c Wed May 6 20:37:00 1998
@@ -2308,6 +2308,8 @@
d->ximage_use_for_expose = FALSE;
+ printf( "---\n" );
+
/* Free the old */
if ( image->ximg )
if ( image->is_shm ) {
@@ -2338,15 +2340,22 @@
if ( c->xfer_mode == TV_TRANSFER_SHMEM_IMAGE ) {
/* FIXME: Clean up shared mem segments on exit and on */
/* next run. */
- image->ximg = XShmCreateImage( TVDISPLAY, v->visual, v->depth,
+ printf( "SHM: WxH, Depth = %dx%d, %d\n", g->w, g->h, v->depth );
+ image->ximg = XShmCreateImage( TVDISPLAY, v->visual, v->depth,
ZPixmap, NULL, &image->shm_info,
g->w, g->h );
if ( image->ximg == NULL ) {
fprintf( stderr, "XShmCreateImage() failed\n" );
exit(1);
}
+ printf( "SHM: Bytes/line, Height = %d, %d\n",
+ image->ximg->bytes_per_line, image->ximg->height );
image->shm_info.shmid = shmget( IPC_PRIVATE,
+#ifdef OLD
image->ximg->bytes_per_line * image->ximg->height,
+#else
+ 4 * image->ximg->bytes_per_line * image->ximg->height,
+#endif
IPC_CREAT | 0777 );
if ( image->shm_info.shmid < 0 ) {
fprintf( stderr, "shmget() failed: %s\n", strerror(errno));
@@ -2372,14 +2381,31 @@
if ( bpp_adj == 24 )
bpp_adj = 32;
+ printf( "STD: WxH, Depth = %dx%d, %d\n", g->w, g->h, v->depth );
image->ximg = XCreateImage( TVDISPLAY, v->visual, v->depth,
ZPixmap, 0, NULL, g->w, g->h,
+#ifdef OLD
bpp_adj, 0 );
+#else
+ BitmapPad(TVDISPLAY), 0 );
+#endif
if ( image->ximg == NULL ) {
fprintf( stderr, "XCreateImage() failed\n" );
exit(1);
}
+ printf( "STD: WxH, Bpp = %dx%d, %d\n",
+ g->w, g->h, bpp_adj/8 );
+ printf( "STD: Bytes/line, Height = %d, %d\n",
+ image->ximg->bytes_per_line, image->ximg->height );
+#ifdef OLD
image->ximg->data = malloc( g->w * g->h * (bpp_adj / 8) );
+#elif defined(CORRECT)
+ image->ximg->data = malloc( image->ximg->bytes_per_line *
+ image->ximg->height );
+#else
+ image->ximg->data = malloc( 4 * image->ximg->bytes_per_line *
+ image->ximg->height );
+#endif
if ( image->ximg->data == NULL )
TVUTILOutOfMemory();
image->is_shm = False;
[-- Attachment #3 --]
--- ORIG/Makefile Wed Nov 5 01:14:25 1997
+++ Makefile Wed May 6 20:36:19 1998
@@ -7,10 +7,10 @@
override CF_VERS = -DVERS_STR=\"0.46\"
override INC = -I$(X11BASE)/include -I/usr/local/include
override LD_INC = -L$(X11BASE)/lib -L/usr/local/lib
-override CFLAGS = -O2 -m486 $(INC) $(CF_VERS)
-#override CFLAGS = -g $(INC) $(CF_VERS)
-override LDFLAGS = $(LD_INC)
-#override LDFLAGS = -g $(LD_INC)
+#override CFLAGS = -O2 -m486 $(INC) $(CF_VERS)
+override CFLAGS = -g $(INC) $(CF_VERS)
+#override LDFLAGS = $(LD_INC)
+override LDFLAGS = -g $(LD_INC)
override LIBS = -ltiff -lXaw3d -lXmu -lXt -lXpm -lXxf86dga \
-lXxf86vm -lSM -lICE -lXext -lX11
@@ -30,7 +30,7 @@
$(EXEC) : $(CSRCOBJ)
$(CC) $(LDFLAGS) -o $@ $^ $(LIBS)
- strip $(EXEC)
+# strip $(EXEC)
tv.o : tv.c app_rsrc.h
--- ORIG/tvscreen.c Wed Nov 5 01:01:57 1997
+++ tvscreen.c Wed May 6 20:34:22 1998
@@ -2366,20 +2366,15 @@
image->is_shm = True;
}
else if ( c->xfer_mode == TV_TRANSFER_STD_IMAGE ) {
- /* FIXME: Handle 3Bpp 24bpp */
- int bpp_adj = (v->depth+7)/8*8;
-
- if ( bpp_adj == 24 )
- bpp_adj = 32;
-
image->ximg = XCreateImage( TVDISPLAY, v->visual, v->depth,
ZPixmap, 0, NULL, g->w, g->h,
- bpp_adj, 0 );
+ BitmapPad(TVDISPLAY), 0 );
if ( image->ximg == NULL ) {
fprintf( stderr, "XCreateImage() failed\n" );
exit(1);
}
- image->ximg->data = malloc( g->w * g->h * (bpp_adj / 8) );
+ image->ximg->data = malloc( image->ximg->bytes_per_line *
+ image->ximg->height );
if ( image->ximg->data == NULL )
TVUTILOutOfMemory();
image->is_shm = False;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?19980506204902.A615>
