View previous topic :: View next topic |
Author |
Message |
conio123 n00b
Joined: 06 Nov 2008 Posts: 24
|
Posted: Sat Nov 15, 2008 10:43 pm Post subject: [SOLVED] Reading JPG file - segmentation fault. |
|
|
I am making a program which is using JpegLib that I have installed in my Gentoo.
Here is a code of a testing program:
Code: |
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <jpeglib.h>
#include <jerror.h>
typedef struct jpeg_decompress_struct decInfo;
typedef struct imgSize {
int width;
int height;
} imgSize;
imgSize getImageSize(const char* filename) {
decInfo cinfo;
FILE* readMe;
imgSize returningValue;
if(!(readMe=fopen(filename, "rb")))
exit(0);
jpeg_create_decompress(&cinfo);
jpeg_stdio_src(&cinfo, readMe);
printf("Before reading a header\n");
jpeg_read_header(&cinfo, TRUE);
printf("After reading a header\n");
returningValue.width=cinfo.output_width;
returningValue.height=cinfo.output_height;
return returningValue;
}
int main(int argc, char** argv) {
if(argc!=2) {
printf("ARGC\n");
return 0;
}
imgSize picture;
picture=getImageSize(argv[1]);
return 0;
}
|
When I run it with test.jpg file (it's a jpg file I downloaded from the Internet) I get:
Code: |
konrad@kater ~/programJPG $ ./cinfo test.jpg
Before reading a header
Segmentation fault
|
What is wrong with it? Why do I get segmentation fault?
Last edited by conio123 on Sun Nov 16, 2008 12:23 pm; edited 1 time in total |
|
Back to top |
|
|
MotivatedTea Apprentice
Joined: 06 Nov 2006 Posts: 269 Location: Toronto, Canada
|
Posted: Sun Nov 16, 2008 12:20 am Post subject: |
|
|
You're missing some steps. The jpeglib source ships with example code showing how to read and write JPG files. Find jpegsrc.v6b.tar.gz in your distfiles directory, unpack it somewhere, and read through the file "example.c". Start by reading through the read_JPEG_file() function. |
|
Back to top |
|
|
conio123 n00b
Joined: 06 Nov 2008 Posts: 24
|
Posted: Sun Nov 16, 2008 9:28 am Post subject: |
|
|
Well, I did like that. The only thing I didn't "copy" from example file is error handling procedure with setjmp() functions - one of variables in cinfo struct was uninitialised. But, in my opinion, it shouldn't have an influence on a program. |
|
Back to top |
|
|
TNorthover Guru
Joined: 25 Jan 2004 Posts: 434 Location: Edinburgh, UK
|
Posted: Sun Nov 16, 2008 10:03 am Post subject: |
|
|
conio123 wrote: | Well, I did like that. The only thing I didn't "copy" from example file is error handling procedure with setjmp() functions - one of variables in cinfo struct was uninitialised. But, in my opinion, it shouldn't have an influence on a program. |
Have you tried initializing that to make sure? My experience of jpeglib is that it's ridiculously fragile. |
|
Back to top |
|
|
conio123 n00b
Joined: 06 Nov 2008 Posts: 24
|
Posted: Sun Nov 16, 2008 12:22 pm Post subject: |
|
|
Ok, setting jmp_buffer and initialising proper variables made the program working. Thanks |
|
Back to top |
|
|
otmane n00b
Joined: 21 Jun 2010 Posts: 1
|
Posted: Mon Jun 21, 2010 2:53 pm Post subject: |
|
|
Hi, i m interested in what you did to find the make the program work. I tested with the piece of code you sent and i had the same behaviour : A segfault when we call the jpeg_read_headers.
Could you plz post the corrected code?
Thanks in advance |
|
Back to top |
|
|
ritzmax72 Tux's lil' helper
Joined: 10 Aug 2014 Posts: 84
|
Posted: Sat May 11, 2024 12:18 am Post subject: |
|
|
otmane wrote: | Hi, i m interested in what you did to find the make the program work. I tested with the piece of code you sent and i had the same behaviour : A segfault when we call the jpeg_read_headers.
Could you plz post the corrected code?
Thanks in advance |
He added these
Code: |
dInfo.err = jpeg_std_error(&jerr.pub);
jerr.pub.error_exit = my_error_exit;
if (setjmp(jerr.setjmp_buffer)) {
/* If we get here, the JPEG code has signaled an error.
* We need to clean up the JPEG object, close the input file, and return.
*/
jpeg_destroy_decompress(&dInfo);
fclose(infile);
fclose(outthumbfile);
return;
}
|
and defined my_error_exit
Code: |
METHODDEF(void)
my_error_exit(j_common_ptr cinfo)
{
/* cinfo->err really points to a my_error_mgr struct, so coerce pointer */
my_error_ptr myerr = (my_error_ptr)cinfo->err;
/* Always display the message. */
/* We could postpone this until after returning, if we chose. */
(*cinfo->err->output_message) (cinfo);
/* Return control to the setjmp point */
longjmp(myerr->setjmp_buffer, 1);
}
|
Don't forget to include header:
|
|
Back to top |
|
|
|