From: EmbeddedMicro <ju...@em...> - 2009-01-28 04:30:13
|
I have a program where I can capture JPEG images from my AXIS 206 camera but now I need them in a form I can manage. I have looked into jpeglib (libjpeg?) but it looks as if it takes its input from a file not a buffer. I did some googling around and it seems like you can supply your own "source manager" to make it work however I could not find any examples to do this. I could write them to a file then read the file, but that seems like it would take a lot of extra time (lower FPS) and extra wear on the microSD card. Anyone have any ideas? Thanks, Justin -- View this message in context: http://www.nabble.com/Decompress-JPEG-from-buffer-tp21699805p21699805.html Sent from the Gumstix mailing list archive at Nabble.com. |
From: Dave H. <dhy...@gm...> - 2009-01-28 05:00:03
|
Hi Justin, > I have a program where I can capture JPEG images from my AXIS 206 camera but > now I need them in a form I can manage. I have looked into jpeglib > (libjpeg?) but it looks as if it takes its input from a file not a buffer. I > did some googling around and it seems like you can supply your own "source > manager" to make it work however I could not find any examples to do this. I > could write them to a file then read the file, but that seems like it would > take a lot of extra time (lower FPS) and extra wear on the microSD card. > Anyone have any ideas? Yep - libjpeg allows for arbitrary buffers of input data. I've written memory-to-memory compression and decompression routines using libjpeg many years ago. I did a quick google search for jpeg_source_mgr and the first one contains a version which uses a memory region as a source: http://www.koders.com/cpp/fid4D587C8DF436693E5889D1CD7897C9E584050F1A.aspx -- Dave Hylands Shuswap, BC, Canada http://www.DaveHylands.com/ |
From: EmbeddedMicro <ju...@em...> - 2009-01-29 05:33:45
|
Thanks a lot! It can be difficult to find that "magic" word to make google come up with what you want. I copied jmemsrc.c/.h into my project and now I need some help with what exactly to input into jpeg_mem_src(). The function reads GLOBAL(void) jpeg_mem_src ( j_decompress_ptr cinfo, JOCTET * pData, int FileSize, void *pDataSrc, JMETHOD(void, notifyCppWorld, (j_common_ptr)) ) What does it need to contain? Also what does GLOBAL(void) do? I have the JPEG image stored in a char array called imgbuf and the size in imglen. I am guessing pData is the output, FileSize would be imglen, pDataSrc is the input buffer, but I have no idea what to put for JMETHOD and cinfo. Once again thanks a lot, Justin -- View this message in context: http://www.nabble.com/Decompress-JPEG-from-buffer-tp21699805p21721177.html Sent from the Gumstix mailing list archive at Nabble.com. |
From: Dave H. <dhy...@gm...> - 2009-01-29 06:12:34
|
Hi Justin, > I copied jmemsrc.c/.h into my project and now I need some help with what > exactly to input into jpeg_mem_src(). > > The function reads > GLOBAL(void) > jpeg_mem_src ( > j_decompress_ptr cinfo, > JOCTET * pData, > int FileSize, > void *pDataSrc, > JMETHOD(void, notifyCppWorld, (j_common_ptr)) > ) > What does it need to contain? Also what does GLOBAL(void) do? This library has been around for a long time, and it works on a large variety of C compilers, including the old ones, like K&R which doesn't do function prototypes, etc. GLOBAL is defined in jmorecfg.h. It's really a no-op. So GLOBAL(void) is the same thing as void. JMETHOD is also defined in the same place. It's used to create a function pointer. So, what it's really doing is this: void jpeg_mem_src ( j_decompress_ptr cinfo, JOCTET * pData, int FileSize, void *pDataSrc, void (*notifyCppWorld)(j_common_ptr) ) Reading through the comments, pDataSrc appears to be "client data" which is available to be used by the notifyCppWorld function. pData and FileSize describe the input buffer. You don't need to use the progress monitor stuff. libjpeg.doc has fairly detailed information on using the library and has the following pseudo code for decompressing: Allocate and initialize a JPEG decompression object Specify the source of the compressed data (eg, a file) Call jpeg_read_header() to obtain image info Set parameters for decompression jpeg_start_decompress(...); while (scan lines remain to be read) jpeg_read_scanlines(...); jpeg_finish_decompress(...); Release the JPEG decompression object > I have the JPEG image stored in a char array called imgbuf and the size in > imglen. > > I am guessing pData is the output, FileSize would be imglen, pDataSrc is the > input buffer, but I have no idea what to put for JMETHOD and cinfo. When you call jpeg_read_scanlines, you'll pass in a pointer into yout imgbuf. Look at the read_JPEG_file function in example.c (from libjpeg) for the general flow of decompressing an image. -- Dave Hylands Shuswap, BC, Canada http://www.DaveHylands.com/ |
From: EmbeddedMicro <ju...@em...> - 2009-01-30 23:37:34
|
I read through libjpeg.doc and I think I understand what needs to happen. However I declare cinfo as struct jpeg_decompress_struct cinfo; that is how it is shown in libjpeg.doc. When I try to compile the code. I get | axmjpeg.c:234: error: incompatible type for argument 1 of 'jpeg_mem_src' line 234 is jpeg_mem_src(cinfo,imgbuf,imglen,NULL,NULL); and as you know in jpeg_mem_src cinfo is declared as j_decompress_ptr cinfo changing my code to be the sames gives me other errors. Thanks, Justin -- View this message in context: http://www.nabble.com/Decompress-JPEG-from-buffer-tp21699805p21757791.html Sent from the Gumstix mailing list archive at Nabble.com. |
From: EmbeddedMicro <ju...@em...> - 2009-01-31 02:15:08
|
I got it to work my adding a '&'. It all compiles, now I need to add the rest of the code and test it out. -- View this message in context: http://www.nabble.com/Decompress-JPEG-from-buffer-tp21699805p21758863.html Sent from the Gumstix mailing list archive at Nabble.com. |
From: Dave H. <dhy...@gm...> - 2009-01-31 02:18:17
|
Hi Justin, > I read through libjpeg.doc and I think I understand what needs to happen. > However I declare cinfo as > struct jpeg_decompress_struct cinfo; This cinfo is a structure. > that is how it is shown in libjpeg.doc. When I try to compile the code. I > get > | axmjpeg.c:234: error: incompatible type for argument 1 of 'jpeg_mem_src' > line 234 is > jpeg_mem_src(cinfo,imgbuf,imglen,NULL,NULL); > and as you know in jpeg_mem_src cinfo is declared as > j_decompress_ptr cinfo This cinfo is a pointer to a jpeg_decompress_struct. So you need to use: jpeg_mem_src(&cinfo,imgbuf,imglen,NULL,NULL); -- Dave Hylands Shuswap, BC, Canada http://www.DaveHylands.com/ |
From: EmbeddedMicro <ju...@em...> - 2009-01-31 07:39:19
|
Another problem I can't seem to figure out. I keep getting Segmentation Fault when I run my program. It seems to be from jpeg_read_scanlines(). Here is what I have for code ... JSAMPARRAY buffer; ... printf("start JPEG!\n\r"); jpeg_mem_src(&cinfo,imgbuf,imglen,NULL,NULL); jpeg_read_header(&cinfo, TRUE); jpeg_start_decompress(&cinfo); i=0; row_stride = cinfo.output_width * cinfo.output_components; buffer = (*cinfo.mem->alloc_sarray) ((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1); while (cinfo.output_scanline < cinfo.output_height) { printf("read!\n\r"); (void) jpeg_read_scanlines(&cinfo, buffer, 1); } printf("done!\n\r"); jpeg_finish_decompress(&cinfo); printf("finished decompress!\n\r"); Running this code gives me. start JPEG! read! Segmentation fault I tried everything I could think of for "buffer", but I'm new with Linux (I used AVRs) so I must of missed something. Maybe that is not the problem. I don't know. I got the while loop and buffer from example.c that came with the source for libjpeg. Thanks a lot, Justin -- View this message in context: http://www.nabble.com/Decompress-JPEG-from-buffer-tp21699805p21760766.html Sent from the Gumstix mailing list archive at Nabble.com. |
From: Dave H. <dhy...@gm...> - 2009-01-31 08:42:43
|
Hi Justin, On Fri, Jan 30, 2009 at 11:39 PM, EmbeddedMicro <ju...@em...> wrote: > > Another problem I can't seem to figure out. I keep getting Segmentation Fault > when I run my program. It seems to be from jpeg_read_scanlines(). Here is > what I have for code > > ... > JSAMPARRAY buffer; > ... > printf("start JPEG!\n\r"); > jpeg_mem_src(&cinfo,imgbuf,imglen,NULL,NULL); > jpeg_read_header(&cinfo, TRUE); > jpeg_start_decompress(&cinfo); > i=0; row_stride = cinfo.output_width * cinfo.output_components; > buffer = (*cinfo.mem->alloc_sarray) > ((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1); > while (cinfo.output_scanline < cinfo.output_height) { > printf("read!\n\r"); > (void) jpeg_read_scanlines(&cinfo, buffer, 1); > } > printf("done!\n\r"); > jpeg_finish_decompress(&cinfo); > printf("finished decompress!\n\r"); > > Running this code gives me. > start JPEG! > read! > Segmentation fault > > I tried everything I could think of for "buffer", but I'm new with Linux (I > used AVRs) so I must of missed something. Maybe that is not the problem. I > don't know. Nothing jumps out at me. I'd debug this on a regular linux machine under gdb, and the segmentation fault will probably become obvious. You need to check stuff like imgbuf and imglen. Also check row_stride. Does it make sense? Did you try example.c and store your raw JPEG data into a file? -- Dave Hylands Shuswap, BC, Canada http://www.DaveHylands.com/ |
From: EmbeddedMicro <ju...@em...> - 2009-01-31 17:33:41
|
A quick update. row_stride = 1920 which is correct as 640*3=1920 imglen varies but is between 17593-19470 The width and hight dimensions are correct, 640*480. I just got it to work as I was writing this! I removed /* Jo Hagelberg 15.4.99 * added progress notification for JPEG */ if ( cinfo->progress == NULL) { /* first time and progress notification wanted? */ cinfo->progress = (struct jpeg_progress_mgr *) (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT, sizeof(struct jpeg_progress_mgr)); /* static callback function in JpegDecoder */ cinfo->progress->progress_monitor = notifyCppWorld; } /* Jo Hagelberg 15.4.99 * put CDataSource instance ptr into client data, so we can use it in the callback * NOTE: define a client data struct if this should be needed for other stuff, too */ cinfo->client_data = pDataSrc ; from jpeg_mem_src(); I also removed the two last arguments for it as they are no longer needed. Dave Hylands wrote: > > Hi Justin, > > On Fri, Jan 30, 2009 at 11:39 PM, EmbeddedMicro > <ju...@em...> wrote: >> >> Another problem I can't seem to figure out. I keep getting Segmentation >> Fault >> when I run my program. It seems to be from jpeg_read_scanlines(). Here is >> what I have for code >> >> ... >> JSAMPARRAY buffer; >> ... >> printf("start JPEG!\n\r"); >> jpeg_mem_src(&cinfo,imgbuf,imglen,NULL,NULL); >> jpeg_read_header(&cinfo, TRUE); >> jpeg_start_decompress(&cinfo); >> i=0; row_stride = cinfo.output_width * cinfo.output_components; >> buffer = (*cinfo.mem->alloc_sarray) >> ((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1); >> while (cinfo.output_scanline < cinfo.output_height) { >> printf("read!\n\r"); >> (void) jpeg_read_scanlines(&cinfo, buffer, 1); >> } >> printf("done!\n\r"); >> jpeg_finish_decompress(&cinfo); >> printf("finished decompress!\n\r"); >> >> Running this code gives me. >> start JPEG! >> read! >> Segmentation fault >> >> I tried everything I could think of for "buffer", but I'm new with Linux >> (I >> used AVRs) so I must of missed something. Maybe that is not the problem. >> I >> don't know. > > Nothing jumps out at me. I'd debug this on a regular linux machine > under gdb, and the segmentation fault will probably become obvious. > > You need to check stuff like imgbuf and imglen. Also check row_stride. > Does it make sense? > > Did you try example.c and store your raw JPEG data into a file? > > -- > Dave Hylands > Shuswap, BC, Canada > http://www.DaveHylands.com/ > > ------------------------------------------------------------------------------ > This SF.net email is sponsored by: > SourcForge Community > SourceForge wants to tell your story. > http://p.sf.net/sfu/sf-spreadtheword > _______________________________________________ > gumstix-users mailing list > gum...@li... > https://lists.sourceforge.net/lists/listinfo/gumstix-users > > -- View this message in context: http://www.nabble.com/Decompress-JPEG-from-buffer-tp21699805p21766151.html Sent from the Gumstix mailing list archive at Nabble.com. |