Mercurial > hg > minimon
annotate jpg.c @ 11:8fadd7877f6b default tip
build only minimon per default
author | Peter Meerwald <pmeerw@pmeerw.net> |
---|---|
date | Sun, 15 May 2011 18:58:44 +0200 |
parents | 078dc69945ad |
children |
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> |
3 | 3 #include <unistd.h> |
2
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
4 #include <string.h> |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
5 #include "jpeglib.h" |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
6 #include "jerror.h" |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
7 |
3 | 8 #include "common.h" |
9 | |
2
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
10 typedef struct { |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
11 struct jpeg_destination_mgr pub; /* public fields */ |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
12 |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
13 unsigned char ** outbuffer; /* target buffer */ |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
14 unsigned long * outsize; |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
15 unsigned char * newbuffer; /* newly allocated buffer */ |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
16 JOCTET * buffer; /* start of buffer */ |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
17 size_t bufsize; |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
18 } mem_dest_mgr; |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
19 |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
20 typedef mem_dest_mgr * mem_dest_mgr_ptr; |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
21 |
3 | 22 static void init_mem_destination (j_compress_ptr cinfo) { |
2
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
23 } |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
24 |
3 | 25 static boolean empty_mem_output_buffer(j_compress_ptr cinfo) { |
2
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
26 size_t nextsize; |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
27 JOCTET * nextbuffer; |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
28 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
|
29 |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
30 /* Try to allocate new buffer with double size */ |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
31 nextsize = dest->bufsize * 2; |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
32 nextbuffer = malloc(nextsize); |
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 if (nextbuffer == NULL) |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
35 ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 10); |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
36 |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
37 memcpy(nextbuffer, dest->buffer, dest->bufsize); |
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 if (dest->newbuffer != NULL) |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
40 free(dest->newbuffer); |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
41 |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
42 dest->newbuffer = nextbuffer; |
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->pub.next_output_byte = nextbuffer + dest->bufsize; |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
45 dest->pub.free_in_buffer = dest->bufsize; |
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 dest->buffer = nextbuffer; |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
48 dest->bufsize = nextsize; |
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 return TRUE; |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
51 } |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
52 |
3 | 53 static void term_mem_destination(j_compress_ptr cinfo) { |
2
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
54 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
|
55 |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
56 *dest->outbuffer = dest->buffer; |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
57 *dest->outsize = dest->bufsize - dest->pub.free_in_buffer; |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
58 } |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
59 |
6
3819ecaf0f14
avoiding clash with latest libjpeg
Peter Meerwald <pmeerw@pmeerw.net>
parents:
3
diff
changeset
|
60 static void my_jpeg_mem_dest(j_compress_ptr cinfo, unsigned char ** outbuffer, unsigned long * outsize) { |
2
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
61 mem_dest_mgr_ptr dest; |
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 if (outbuffer == NULL || outsize == NULL) /* sanity check */ |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
64 ERREXIT(cinfo, JERR_BUFFER_SIZE); |
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 /* 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
|
67 * 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
|
68 */ |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
69 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
|
70 cinfo->dest = (struct jpeg_destination_mgr *) |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
71 (*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
|
72 sizeof(mem_dest_mgr)); |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
73 } |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
74 |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
75 dest = (mem_dest_mgr_ptr) cinfo->dest; |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
76 dest->pub.init_destination = init_mem_destination; |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
77 dest->pub.empty_output_buffer = empty_mem_output_buffer; |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
78 dest->pub.term_destination = term_mem_destination; |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
79 dest->outbuffer = outbuffer; |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
80 dest->outsize = outsize; |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
81 dest->newbuffer = NULL; |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
82 |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
83 if (*outbuffer == NULL || *outsize == 0) { |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
84 /* Allocate initial buffer */ |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
85 dest->newbuffer = *outbuffer = malloc(65536); |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
86 if (dest->newbuffer == NULL) |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
87 ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 10); |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
88 *outsize = 65536; |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
89 } |
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 dest->pub.next_output_byte = dest->buffer = *outbuffer; |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
92 dest->pub.free_in_buffer = dest->bufsize = *outsize; |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
93 } |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
94 |
10
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
95 #ifdef HAVE_LIBJPEG_TURBO |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
96 jpg_buf_t build_jpg_from_fb(unsigned char *fb_mem, int fb_width, int fb_height, int bits_per_pixel, int mon_width, int mon_height) { |
2
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
97 int scanline; |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
98 struct jpeg_compress_struct cinfo; |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
99 struct jpeg_error_mgr jerr; |
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 cinfo.err = jpeg_std_error(&jerr); |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
102 jpeg_create_compress(&cinfo); |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
103 |
3 | 104 jpg_buf_t jpg_buf; |
105 jpg_buf.size = 1 << 20; | |
106 jpg_buf.ptr = NULL; | |
107 | |
6
3819ecaf0f14
avoiding clash with latest libjpeg
Peter Meerwald <pmeerw@pmeerw.net>
parents:
3
diff
changeset
|
108 my_jpeg_mem_dest(&cinfo, &jpg_buf.ptr, &jpg_buf.size); |
2
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
109 |
10
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
110 cinfo.image_width = mon_width; |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
111 cinfo.image_height = mon_height; |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
112 cinfo.input_components = 4; |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
113 cinfo.in_color_space = JCS_EXT_BGRX; |
2
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
114 jpeg_set_defaults(&cinfo); |
10
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
115 cinfo.dct_method = JDCT_FASTEST; |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
116 jpeg_set_quality(&cinfo, 70, TRUE); |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
117 |
2
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
118 jpeg_start_compress(&cinfo, TRUE); |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
119 |
10
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
120 unsigned char buf[mon_width * 4]; |
8 | 121 JSAMPROW row_ptr[1] = {buf}; |
10
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
122 memset(buf, 0, mon_width*4); |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
123 if (fb_width >= mon_width) |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
124 for (scanline = 0; scanline < MIN(fb_height, mon_height); scanline++) { |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
125 row_ptr[0] = &fb_mem[scanline * fb_width * 4]; |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
126 jpeg_write_scanlines(&cinfo, row_ptr, 1); |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
127 } |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
128 else { |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
129 for (scanline = 0; scanline < MIN(fb_height, mon_height); scanline++) { |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
130 memcpy(buf, &fb_mem[scanline * fb_width * 4], fb_width * 4); |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
131 jpeg_write_scanlines(&cinfo, row_ptr, 1); |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
132 } |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
133 } |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
134 memset(buf, 0, mon_width*4); |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
135 for (scanline = fb_height; scanline < mon_height; scanline++) { |
2
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
136 jpeg_write_scanlines(&cinfo, row_ptr, 1); |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
137 } |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
138 |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
139 jpeg_finish_compress(&cinfo); |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
140 |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
141 jpeg_destroy_compress(&cinfo); |
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
142 |
3 | 143 return jpg_buf; |
2
bac8ed8d6eb9
add jpeg coding and test stuff
Peter Meerwald <pmeerw@pmeerw.net>
parents:
diff
changeset
|
144 } |
10
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
145 #else |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
146 static void convert_rgba_to_rgb(unsigned char *buf, unsigned char *fb_mem, int width) { |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
147 int i; |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
148 for (i = 0; i < width; i++) { |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
149 // BGRX |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
150 unsigned int x = *(unsigned int *)fb_mem; |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
151 *buf++ = (x >> 16) & 0xff; |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
152 *buf++ = (x >> 8) & 0xff; |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
153 *buf++ = (x) & 0xff; |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
154 fb_mem += 4; |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
155 } |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
156 } |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
157 |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
158 jpg_buf_t build_jpg_from_fb(unsigned char *fb_mem, int fb_width, int fb_height, int bits_per_pixel, int mon_width, int mon_height) { |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
159 int scanline; |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
160 struct jpeg_compress_struct cinfo; |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
161 struct jpeg_error_mgr jerr; |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
162 |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
163 cinfo.err = jpeg_std_error(&jerr); |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
164 jpeg_create_compress(&cinfo); |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
165 |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
166 jpg_buf_t jpg_buf; |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
167 jpg_buf.size = 1 << 20; |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
168 jpg_buf.ptr = NULL; |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
169 |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
170 my_jpeg_mem_dest(&cinfo, &jpg_buf.ptr, &jpg_buf.size); |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
171 |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
172 cinfo.image_width = mon_width; |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
173 cinfo.image_height = mon_height; |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
174 cinfo.input_components = 3; |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
175 cinfo.in_color_space = JCS_RGB; |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
176 jpeg_set_defaults(&cinfo); |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
177 cinfo.dct_method = JDCT_FASTEST; |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
178 jpeg_set_quality(&cinfo, 70, TRUE); |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
179 |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
180 jpeg_start_compress(&cinfo, TRUE); |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
181 |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
182 JSAMPLE buf[mon_width * 3]; |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
183 JSAMPROW row_ptr[1] = {buf}; |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
184 memset(buf, 0, mon_width*3); |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
185 for (scanline = 0; scanline < MIN(fb_height, mon_height); scanline++) { |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
186 convert_rgba_to_rgb(buf, &fb_mem[scanline * fb_width * 4], mon_width); |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
187 jpeg_write_scanlines(&cinfo, row_ptr, 1); |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
188 } |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
189 memset(buf, 0, mon_width*3); |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
190 for (scanline = fb_height; scanline < mon_height; scanline++) { |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
191 jpeg_write_scanlines(&cinfo, row_ptr, 1); |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
192 } |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
193 |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
194 jpeg_finish_compress(&cinfo); |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
195 |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
196 jpeg_destroy_compress(&cinfo); |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
197 |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
198 return jpg_buf; |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
199 } |
078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
Peter Meerwald <pmeerw@pmeerw.net>
parents:
8
diff
changeset
|
200 #endif |