Sign in to follow this  
polyfrag

Android jpeg_read_header crash

Recommended Posts

Why is it crashing on jpeg_read_header?

libc is complaining:

03-28 00:53:21.293: A/libc(26952): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 26967 (engame.pathogen)


struct jpeg_decompress_struct cinfo; 
    jpeg_error_mgr jerr;
    if (!source_init(strFileName)) 
  { 
    LOGE("Error opening jpeg %s", strFileName); 
    return NULL; 
  }

    cinfo.err = jpeg_std_error(&jerr); 
    jpeg_create_decompress(&cinfo); 
    jpegSource.pub.init_source = init_sourceFunc; 
    jpegSource.pub.fill_input_buffer = fill_input_bufferFunc; 
    jpegSource.pub.skip_input_data = skip_input_dataFunc; 
    jpegSource.pub.resync_to_restart = jpeg_resync_to_restart; 
    jpegSource.pub.term_source = term_sourceFunc; 
    jpegSource.pub.next_input_byte = NULL; 
    jpegSource.pub.bytes_in_buffer = 0; 
    cinfo.src = (struct jpeg_source_mgr*)&jpegSource; 
  
  //LOGI("JPG %s 3", strFileName);

    jpeg_read_header(&cinfo, TRUE);

#define JPEG_BUFFER_SIZE (8 << 10)
typedef struct 
{ 
    struct jpeg_source_mgr  pub; 
} JPEGSource;

static char jpegBuffer[JPEG_BUFFER_SIZE]; 
static JPEGSource  jpegSource;

static void init_sourceFunc(j_decompress_ptr cinfo) 
{ 
    ((JPEGSource*)cinfo->src)->pub.bytes_in_buffer = 0; 
}

static boolean fill_input_bufferFunc(j_decompress_ptr cinfo) 
{ 
    JPEGSource  *src = (JPEGSource*)cinfo->src;

    src->pub.bytes_in_buffer = source_read(jpegBuffer);

    src->pub.next_input_byte = (const unsigned char*)jpegBuffer;

    return TRUE; 
}

void skip_input_dataFunc(j_decompress_ptr cinfo, long num_bytes) 
{ 
    JPEGSource  *src = (JPEGSource*)cinfo->src;

    if (num_bytes > 0) 
  { 
        source_seek(num_bytes);

        if (num_bytes > src->pub.bytes_in_buffer) src->pub.bytes_in_buffer = 0;

        else 
    { 
            src->pub.next_input_byte += num_bytes; 
            src->pub.bytes_in_buffer -= num_bytes; 
        } 
    } 
}

void term_sourceFunc(j_decompress_ptr cinfo) 
{ 
}

bool source_init(const char *filename) 
{ 
  g_src = CFile(filename);
  if(!g_src.mFile) 
    return false;

    return true; 
}

void source_close() 
{ 
  g_src.close(); 
}

int source_read(char* buffer) 
{ 
  return g_src.read((void*)buffer, JPEG_BUFFER_SIZE); 
}

void source_seek(int num) 
{ 
  g_src.seek(num); 
}
Edited by polyfrag

Share this post


Link to post
Share on other sites

I added debug info leading up to the crash:

 

03-28 13:38:08.827: I/NDK_MainActivity(32384): source_init size=157506

03-28 13:38:08.827: I/NDK_MainActivity(32384): JPG models/human2.jpg 2
03-28 13:38:08.827: I/NDK_MainActivity(32384): JPG models/human2.jpg 3
03-28 13:38:08.827: I/NDK_MainActivity(32384): init_sourceFunc
03-28 13:38:08.827: I/NDK_MainActivity(32384): fill_input_bufferFunc
03-28 13:38:08.827: I/NDK_MainActivity(32384): source_read...
03-28 13:38:08.827: I/NDK_MainActivity(32384): source_read 8192
03-28 13:38:08.827: I/NDK_MainActivity(32384): read 8192
03-28 13:38:08.827: I/NDK_MainActivity(32384): skip_input_dataFunc 8282
03-28 13:38:08.835: I/NDK_MainActivity(32384): source_seek 8282
03-28 13:38:08.835: I/NDK_MainActivity(32384): fill_input_bufferFunc
03-28 13:38:08.835: I/NDK_MainActivity(32384): source_read...
03-28 13:38:08.835: I/NDK_MainActivity(32384): source_read 8192
03-28 13:38:08.835: I/NDK_MainActivity(32384): read 8192
03-28 13:38:08.835: A/libc(32384): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 32397 (engame.pathogen)

 

It crashes when it returns to jpeg_read_header from the second read of 8192 bytes.

Edited by polyfrag

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this