On Tue, Mar 04, 2003 at 11:45:34AM +0200, Turos Laszlo wrote:
>
> Hi
>
> I have installed the The Independent JPEG Group's JPEG library to my
> linux to use it for compressing captured video to JPEG format.
> Version:release 6b of 26-Mar-1998
Good.
>
> It seems to me that it has this function jpeg_stdio_dest which takes a
> FILE* pointer as argument for selecting destination.
> My problem is that I don't want to use a file as a destination for the
> compressed image.
> Is it possible to set somehow a buffer for the JPEG compressor to use it
> instead a FILE* stream?
Yes - it's possible.
Look at this code snippet, it compresses to dynamically allocated memory
buffer:
static void memory_init_destination (j_compress_ptr cinfo);
static boolean memory_empty_output_buffer (j_compress_ptr cinfo);
static void memory_term_destination (j_compress_ptr cinfo);
struct my_destination_manager {
struct jpeg_destination_mgr base;
JOCTET *buffer;
size_t currentBufferSize;
};
...
struct jpeg_compress_struct cinfo;
struct jpeg_error_mgr jerr;
cinfo.err = jpeg_std_error (&jerr);
jpeg_create_compress (&cinfo);
struct my_destination_manager destmgr;
destmgr.base.init_destination = memory_init_destination;
destmgr.base.empty_output_buffer = memory_empty_output_buffer;
destmgr.base.term_destination = memory_term_destination;
destmgr.buffer = 0;
cinfo.dest = (jpeg_destination_mgr *)&destmgr;
cinfo.image_width = ...;
cinfo.image_height = ...;
cinfo.input_components = 3;
cinfo.in_color_space = JCS_RGB;
jpeg_set_defaults (&cinfo);
if (quality < 5) quality = 5;
if (quality > 100) quality = 100;
jpeg_set_quality (&cinfo, quality, TRUE);
jpeg_start_compress (&cinfo, TRUE);
jpeg_write_marker (&cinfo, JPEG_APP0 + 7,
(const JOCTET *)markertext,
strlen (markertext));
while (cinfo.next_scanline < cinfo.image_height) {
...
JSAMPROW row_pointer [1];
row_pointer[0] = (JSAMPLE *)linebuf; // output a line of pixels to codec
jpeg_write_scanlines (&cinfo, row_pointer, 1);
}
jpeg_finish_compress (&cinfo);
// Get compressed image
*jpgstorage = ((my_destination_manager *)(cinfo.dest))->buffer;
*jpgstorsize = cinfo.dest->next_output_byte -
((my_destination_manager *)(cinfo.dest))->buffer;
jpeg_destroy_compress (&cinfo);
...
static void memory_init_destination (j_compress_ptr cinfo) {
struct my_destination_manager *mydstmgr;
mydstmgr = (struct my_destination_manager *)(cinfo->dest);
if (mydstmgr->buffer != 0) {
delete [] (mydstmgr->buffer);
}
mydstmgr->buffer = new JOCTET [INITIAL_BUFSIZE];
mydstmgr->currentBufferSize = INITIAL_BUFSIZE;
cinfo->dest->next_output_byte = mydstmgr->buffer;
cinfo->dest->free_in_buffer = INITIAL_BUFSIZE;
}
static boolean memory_empty_output_buffer (j_compress_ptr cinfo) {
// Allocate some more memory - it's dumb, but simple
struct my_destination_manager *mydstmgr;
mydstmgr = (struct my_destination_manager *)(cinfo->dest);
JOCTET *oldbuffer;
oldbuffer = mydstmgr->buffer;
size_t delta = mydstmgr->currentBufferSize / 2;
if (delta == 0) delta = 1;
mydstmgr->buffer = new JOCTET [mydstmgr->currentBufferSize + delta];
memcpy (mydstmgr->buffer, oldbuffer, mydstmgr->currentBufferSize);
delete [] oldbuffer;
cinfo->dest->next_output_byte =
mydstmgr->buffer + mydstmgr->currentBufferSize;
cinfo->dest->free_in_buffer = delta;
mydstmgr->currentBufferSize = mydstmgr->currentBufferSize + delta;
return TRUE;
}
static void memory_term_destination (j_compress_ptr cinfo) {
// The buffer now contains full compressed JPEG image
}
> Or do I have an old library?
No - I'm using it too :)
--
Andrey Vasilyev
--
video4linux-list mailing list
Unsubscribe mailto:[EMAIL PROTECTED]
https://listman.redhat.com/mailman/listinfo/video4linux-list