Mercurial > hg > minimon
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 |
| 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 } |
