Android jpeg_read_header crash

Started by
2 comments, last by polyfrag 11 years ago
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); 
}
Advertisement

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.

Fixed SEEK_SET to SEEK_CUR but still getting the problem.

For some reason using jpeg_mem_src makes it work.

http://d.hatena.ne.jp/andyroid/?of=5

This topic is closed to new replies.

Advertisement