Mercurial > hg > minimon
comparison jpg.c @ 10:078dc69945ad
working: libjpeg-turbo support, handle fb and monitor with different size
author | Peter Meerwald <pmeerw@pmeerw.net> |
---|---|
date | Sun, 15 May 2011 17:48:57 +0200 |
parents | 66c77f9ba9b9 |
children |
comparison
equal
deleted
inserted
replaced
9:c7af696b6221 | 10:078dc69945ad |
---|---|
90 | 90 |
91 dest->pub.next_output_byte = dest->buffer = *outbuffer; | 91 dest->pub.next_output_byte = dest->buffer = *outbuffer; |
92 dest->pub.free_in_buffer = dest->bufsize = *outsize; | 92 dest->pub.free_in_buffer = dest->bufsize = *outsize; |
93 } | 93 } |
94 | 94 |
95 #ifdef HAVE_LIBJPEG_TURBO | |
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) { | |
97 int scanline; | |
98 struct jpeg_compress_struct cinfo; | |
99 struct jpeg_error_mgr jerr; | |
100 | |
101 cinfo.err = jpeg_std_error(&jerr); | |
102 jpeg_create_compress(&cinfo); | |
103 | |
104 jpg_buf_t jpg_buf; | |
105 jpg_buf.size = 1 << 20; | |
106 jpg_buf.ptr = NULL; | |
107 | |
108 my_jpeg_mem_dest(&cinfo, &jpg_buf.ptr, &jpg_buf.size); | |
109 | |
110 cinfo.image_width = mon_width; | |
111 cinfo.image_height = mon_height; | |
112 cinfo.input_components = 4; | |
113 cinfo.in_color_space = JCS_EXT_BGRX; | |
114 jpeg_set_defaults(&cinfo); | |
115 cinfo.dct_method = JDCT_FASTEST; | |
116 jpeg_set_quality(&cinfo, 70, TRUE); | |
117 | |
118 jpeg_start_compress(&cinfo, TRUE); | |
119 | |
120 unsigned char buf[mon_width * 4]; | |
121 JSAMPROW row_ptr[1] = {buf}; | |
122 memset(buf, 0, mon_width*4); | |
123 if (fb_width >= mon_width) | |
124 for (scanline = 0; scanline < MIN(fb_height, mon_height); scanline++) { | |
125 row_ptr[0] = &fb_mem[scanline * fb_width * 4]; | |
126 jpeg_write_scanlines(&cinfo, row_ptr, 1); | |
127 } | |
128 else { | |
129 for (scanline = 0; scanline < MIN(fb_height, mon_height); scanline++) { | |
130 memcpy(buf, &fb_mem[scanline * fb_width * 4], fb_width * 4); | |
131 jpeg_write_scanlines(&cinfo, row_ptr, 1); | |
132 } | |
133 } | |
134 memset(buf, 0, mon_width*4); | |
135 for (scanline = fb_height; scanline < mon_height; scanline++) { | |
136 jpeg_write_scanlines(&cinfo, row_ptr, 1); | |
137 } | |
138 | |
139 jpeg_finish_compress(&cinfo); | |
140 | |
141 jpeg_destroy_compress(&cinfo); | |
142 | |
143 return jpg_buf; | |
144 } | |
145 #else | |
95 static void convert_rgba_to_rgb(unsigned char *buf, unsigned char *fb_mem, int width) { | 146 static void convert_rgba_to_rgb(unsigned char *buf, unsigned char *fb_mem, int width) { |
96 int i; | 147 int i; |
97 for (i = 0; i < width; i++) { | 148 for (i = 0; i < width; i++) { |
98 *buf++ = *fb_mem++; | 149 // BGRX |
99 *buf++ = *fb_mem++; | 150 unsigned int x = *(unsigned int *)fb_mem; |
100 *buf++ = *fb_mem++; | 151 *buf++ = (x >> 16) & 0xff; |
101 fb_mem++; | 152 *buf++ = (x >> 8) & 0xff; |
102 } | 153 *buf++ = (x) & 0xff; |
103 } | 154 fb_mem += 4; |
104 | 155 } |
105 jpg_buf_t build_jpg_from_fb(unsigned char *fb_mem, int width, int height, int bits_per_pixel) { | 156 } |
157 | |
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) { | |
106 int scanline; | 159 int scanline; |
107 struct jpeg_compress_struct cinfo; | 160 struct jpeg_compress_struct cinfo; |
108 struct jpeg_error_mgr jerr; | 161 struct jpeg_error_mgr jerr; |
109 | 162 |
110 cinfo.err = jpeg_std_error(&jerr); | 163 cinfo.err = jpeg_std_error(&jerr); |
114 jpg_buf.size = 1 << 20; | 167 jpg_buf.size = 1 << 20; |
115 jpg_buf.ptr = NULL; | 168 jpg_buf.ptr = NULL; |
116 | 169 |
117 my_jpeg_mem_dest(&cinfo, &jpg_buf.ptr, &jpg_buf.size); | 170 my_jpeg_mem_dest(&cinfo, &jpg_buf.ptr, &jpg_buf.size); |
118 | 171 |
119 cinfo.image_width = width; | 172 cinfo.image_width = mon_width; |
120 cinfo.image_height = height; | 173 cinfo.image_height = mon_height; |
121 cinfo.input_components = 3; | 174 cinfo.input_components = 3; |
122 cinfo.in_color_space = JCS_RGB; | 175 cinfo.in_color_space = JCS_RGB; |
123 jpeg_set_defaults(&cinfo); | 176 jpeg_set_defaults(&cinfo); |
124 | 177 cinfo.dct_method = JDCT_FASTEST; |
178 jpeg_set_quality(&cinfo, 70, TRUE); | |
179 | |
125 jpeg_start_compress(&cinfo, TRUE); | 180 jpeg_start_compress(&cinfo, TRUE); |
126 | 181 |
127 JSAMPLE *buf = (JSAMPLE *) malloc(width * 3); | 182 JSAMPLE buf[mon_width * 3]; |
128 JSAMPROW row_ptr[1] = {buf}; | 183 JSAMPROW row_ptr[1] = {buf}; |
129 for (scanline = 0; scanline < height; scanline++) { | 184 memset(buf, 0, mon_width*3); |
130 convert_rgba_to_rgb(buf, &fb_mem[scanline * width * 4], width); | 185 for (scanline = 0; scanline < MIN(fb_height, mon_height); scanline++) { |
186 convert_rgba_to_rgb(buf, &fb_mem[scanline * fb_width * 4], mon_width); | |
131 jpeg_write_scanlines(&cinfo, row_ptr, 1); | 187 jpeg_write_scanlines(&cinfo, row_ptr, 1); |
132 } | 188 } |
133 free(buf); | 189 memset(buf, 0, mon_width*3); |
190 for (scanline = fb_height; scanline < mon_height; scanline++) { | |
191 jpeg_write_scanlines(&cinfo, row_ptr, 1); | |
192 } | |
134 | 193 |
135 jpeg_finish_compress(&cinfo); | 194 jpeg_finish_compress(&cinfo); |
136 | 195 |
137 jpeg_destroy_compress(&cinfo); | 196 jpeg_destroy_compress(&cinfo); |
138 | 197 |
139 return jpg_buf; | 198 return jpg_buf; |
140 } | 199 } |
200 #endif |