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
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>
3
e8957085fe8a working
Peter Meerwald <pmeerw@pmeerw.net>
parents: 2
diff changeset
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
e8957085fe8a working
Peter Meerwald <pmeerw@pmeerw.net>
parents: 2
diff changeset
8 #include "common.h"
e8957085fe8a working
Peter Meerwald <pmeerw@pmeerw.net>
parents: 2
diff changeset
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
e8957085fe8a working
Peter Meerwald <pmeerw@pmeerw.net>
parents: 2
diff changeset
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
e8957085fe8a working
Peter Meerwald <pmeerw@pmeerw.net>
parents: 2
diff changeset
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
e8957085fe8a working
Peter Meerwald <pmeerw@pmeerw.net>
parents: 2
diff changeset
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
e8957085fe8a working
Peter Meerwald <pmeerw@pmeerw.net>
parents: 2
diff changeset
104 jpg_buf_t jpg_buf;
e8957085fe8a working
Peter Meerwald <pmeerw@pmeerw.net>
parents: 2
diff changeset
105 jpg_buf.size = 1 << 20;
e8957085fe8a working
Peter Meerwald <pmeerw@pmeerw.net>
parents: 2
diff changeset
106 jpg_buf.ptr = NULL;
e8957085fe8a working
Peter Meerwald <pmeerw@pmeerw.net>
parents: 2
diff changeset
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
66c77f9ba9b9 convert rgba -> rgb
Peter Meerwald <pmeerw@pmeerw.net>
parents: 6
diff changeset
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
e8957085fe8a working
Peter Meerwald <pmeerw@pmeerw.net>
parents: 2
diff changeset
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

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