annotate jpg.c @ 2:bac8ed8d6eb9

add jpeg coding and test stuff
author Peter Meerwald <pmeerw@pmeerw.net>
date Sun, 08 May 2011 18:22:22 +0200
parents
children e8957085fe8a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
1 #include <stdlib.h>
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
2 #include <stdio.h>
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
3 #include <string.h>
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
4 #include "jpeglib.h"
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
5 #include "jerror.h"
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
6
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
7 typedef struct {
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
8 struct jpeg_destination_mgr pub; /* public fields */
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
9
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
10 unsigned char ** outbuffer; /* target buffer */
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
11 unsigned long * outsize;
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
12 unsigned char * newbuffer; /* newly allocated buffer */
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
13 JOCTET * buffer; /* start of buffer */
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
14 size_t bufsize;
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
15 } mem_dest_mgr;
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
16
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
17 typedef mem_dest_mgr * mem_dest_mgr_ptr;
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
18
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
19 void init_mem_destination (j_compress_ptr cinfo) {
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
20 }
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
21
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
22 boolean empty_mem_output_buffer(j_compress_ptr cinfo) {
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
23 size_t nextsize;
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
24 JOCTET * nextbuffer;
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
25 mem_dest_mgr_ptr dest = (mem_dest_mgr_ptr) cinfo->dest;
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
26
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
27 /* Try to allocate new buffer with double size */
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
28 nextsize = dest->bufsize * 2;
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
29 nextbuffer = malloc(nextsize);
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
30
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
31 if (nextbuffer == NULL)
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
32 ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 10);
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
33
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
34 memcpy(nextbuffer, dest->buffer, dest->bufsize);
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
35
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
36 if (dest->newbuffer != NULL)
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
37 free(dest->newbuffer);
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
38
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
39 dest->newbuffer = nextbuffer;
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
40
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
41 dest->pub.next_output_byte = nextbuffer + dest->bufsize;
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
42 dest->pub.free_in_buffer = dest->bufsize;
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
43
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
44 dest->buffer = nextbuffer;
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
45 dest->bufsize = nextsize;
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
46
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
47 return TRUE;
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
48 }
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
49
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
50 void term_mem_destination(j_compress_ptr cinfo) {
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
51 mem_dest_mgr_ptr dest = (mem_dest_mgr_ptr) cinfo->dest;
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
52
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
53 *dest->outbuffer = dest->buffer;
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
54 *dest->outsize = dest->bufsize - dest->pub.free_in_buffer;
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
55 }
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
56
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
57 void jpeg_mem_dest(j_compress_ptr cinfo, unsigned char ** outbuffer, unsigned long * outsize) {
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
58 mem_dest_mgr_ptr dest;
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
59
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
60 if (outbuffer == NULL || outsize == NULL) /* sanity check */
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
61 ERREXIT(cinfo, JERR_BUFFER_SIZE);
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
62
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
63 /* The destination object is made permanent so that multiple JPEG images
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
64 * can be written to the same buffer without re-executing jpeg_mem_dest.
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
65 */
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
66 if (cinfo->dest == NULL) { /* first time for this JPEG object? */
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
67 cinfo->dest = (struct jpeg_destination_mgr *)
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
68 (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
69 sizeof(mem_dest_mgr));
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
70 }
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
71
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
72 dest = (mem_dest_mgr_ptr) cinfo->dest;
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
73 dest->pub.init_destination = init_mem_destination;
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
74 dest->pub.empty_output_buffer = empty_mem_output_buffer;
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
75 dest->pub.term_destination = term_mem_destination;
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
76 dest->outbuffer = outbuffer;
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
77 dest->outsize = outsize;
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
78 dest->newbuffer = NULL;
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
79
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
80 if (*outbuffer == NULL || *outsize == 0) {
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
81 /* Allocate initial buffer */
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
82 dest->newbuffer = *outbuffer = malloc(65536);
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
83 if (dest->newbuffer == NULL)
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
84 ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 10);
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
85 *outsize = 65536;
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
86 }
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
87
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
88 dest->pub.next_output_byte = dest->buffer = *outbuffer;
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
89 dest->pub.free_in_buffer = dest->bufsize = *outsize;
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
90 }
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
91
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
92
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
93 int build_jpg(JSAMPLE *image_buf, int width, int height) {
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
94 int scanline;
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
95 struct jpeg_compress_struct cinfo;
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
96 struct jpeg_error_mgr jerr;
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
97
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
98 cinfo.err = jpeg_std_error(&jerr);
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
99 jpeg_create_compress(&cinfo);
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
100
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
101 unsigned long out_size = 1<<20;
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
102 unsigned char *out_buf = NULL;
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
103 jpeg_mem_dest(&cinfo, &out_buf, &out_size);
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
104
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
105 cinfo.image_width = width;
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
106 cinfo.image_height = height;
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
107 cinfo.input_components = 3;
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
108 cinfo.in_color_space = JCS_RGB;
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
109 jpeg_set_defaults(&cinfo);
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
110
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
111 jpeg_start_compress(&cinfo, TRUE);
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
112
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
113 for (scanline = 0; scanline < height; scanline++) {
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
114 JSAMPROW *row_ptr;
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
115 row_ptr = &image_buf[scanline * width];
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
116 jpeg_write_scanlines(&cinfo, row_ptr, 1);
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
117 }
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
118
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
119 jpeg_finish_compress(&cinfo);
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
120
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
121 jpeg_destroy_compress(&cinfo);
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
122
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
123 return 0;
bac8ed8d6eb9 add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff changeset
124 }

Repositories maintained by Peter Meerwald, pmeerw@pmeerw.net.