Динамическое выделение памяти через callback-функцию - C (СИ)
Формулировка задачи:
всем привет. в общем задача такая. в libjpeg есть возможность через callback функцию выделять память под изображение, если ее не хватает.
а вот вызов, из другой функции
так вот, получается что в функции empty_buffer у нас доступен только указатель на след. байт в который будет идти запись cinfo->dest->next_output_byte ну и сколько сейчас осталось в буфере свободного места (а его не осталось). как в этой функции получить указатель на начало буфера и размер, если не подходит вариант с глобал переменной (т.к. возможен запуск в потоках). что посоветуете?
вот что в документации
http://www.opensource.apple.com/sour...eg/libjpeg.doc
но блин, что это за "private fields"?
/* what to do when the buffer is full; this should almost never * happen since we allocated our buffer to be big to start with */ boolean empty_buffer(jpeg_compress_struct* cinfo) { // для конвертации в jpg нужна еще память size_t buf_new_size = buf_size+102400; // как получить buf_size и указатель на начало буфера buf_start = (JOCTET *) realloc (buf_start, buf_new_size); cinfo->dest->next_output_byte = (buf_start+buf_size) - cinfo->dest->free_in_buffer; cinfo->dest->free_in_buffer = cinfo->dest->free_in_buffer + (buf_new_size-buf_size); return true; }
/* ... */ size_t out_buffer_size = 256000; // стартовый буфер для jpeg (JOCTET*) out_buffer = (JOCTET*) malloc(out_buffer_size); if(!out_buffer) return NULL; dmgr.init_destination = init_buffer; dmgr.empty_output_buffer = empty_buffer; dmgr.term_destination = term_buffer; dmgr.next_output_byte = out_buffer; dmgr.free_in_buffer = out_buffer_size; /* ... */
The manager is expected to remember the buffer's starting address
and total size in private fields not visible to the library.
можно записать в конец адрес начала и размер, а free_in_buffer намеренно поставить меньше, но зачем надо было так усложнять жизнь программисту, если изначально можно было в jpeg_compress_struct предусмотреть эти поля?
Решение задачи: «Динамическое выделение памяти через callback-функцию»
textual
Листинг программы
struct mem_destination_mgr dest = (struct mem_destination_mgr*) cinfo->dest; dest->pub.next_output_byte = dest->buf; dest->pub.free_in_buffer = dest->bufsize;
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д