comparison jpg.c @ 3:e8957085fe8a

working
author Peter Meerwald <pmeerw@pmeerw.net>
date Sun, 08 May 2011 23:08:45 +0200
parents bac8ed8d6eb9
children 3819ecaf0f14
comparison
equal deleted inserted replaced
2:bac8ed8d6eb9 3:e8957085fe8a
1 #include <stdlib.h> 1 #include <stdlib.h>
2 #include <stdio.h> 2 #include <stdio.h>
3 #include <unistd.h>
3 #include <string.h> 4 #include <string.h>
4 #include "jpeglib.h" 5 #include "jpeglib.h"
5 #include "jerror.h" 6 #include "jerror.h"
7
8 #include "common.h"
6 9
7 typedef struct { 10 typedef struct {
8 struct jpeg_destination_mgr pub; /* public fields */ 11 struct jpeg_destination_mgr pub; /* public fields */
9 12
10 unsigned char ** outbuffer; /* target buffer */ 13 unsigned char ** outbuffer; /* target buffer */
14 size_t bufsize; 17 size_t bufsize;
15 } mem_dest_mgr; 18 } mem_dest_mgr;
16 19
17 typedef mem_dest_mgr * mem_dest_mgr_ptr; 20 typedef mem_dest_mgr * mem_dest_mgr_ptr;
18 21
19 void init_mem_destination (j_compress_ptr cinfo) { 22 static void init_mem_destination (j_compress_ptr cinfo) {
20 } 23 }
21 24
22 boolean empty_mem_output_buffer(j_compress_ptr cinfo) { 25 static boolean empty_mem_output_buffer(j_compress_ptr cinfo) {
23 size_t nextsize; 26 size_t nextsize;
24 JOCTET * nextbuffer; 27 JOCTET * nextbuffer;
25 mem_dest_mgr_ptr dest = (mem_dest_mgr_ptr) cinfo->dest; 28 mem_dest_mgr_ptr dest = (mem_dest_mgr_ptr) cinfo->dest;
26 29
27 /* Try to allocate new buffer with double size */ 30 /* Try to allocate new buffer with double size */
45 dest->bufsize = nextsize; 48 dest->bufsize = nextsize;
46 49
47 return TRUE; 50 return TRUE;
48 } 51 }
49 52
50 void term_mem_destination(j_compress_ptr cinfo) { 53 static void term_mem_destination(j_compress_ptr cinfo) {
51 mem_dest_mgr_ptr dest = (mem_dest_mgr_ptr) cinfo->dest; 54 mem_dest_mgr_ptr dest = (mem_dest_mgr_ptr) cinfo->dest;
52 55
53 *dest->outbuffer = dest->buffer; 56 *dest->outbuffer = dest->buffer;
54 *dest->outsize = dest->bufsize - dest->pub.free_in_buffer; 57 *dest->outsize = dest->bufsize - dest->pub.free_in_buffer;
55 } 58 }
56 59
57 void jpeg_mem_dest(j_compress_ptr cinfo, unsigned char ** outbuffer, unsigned long * outsize) { 60 static void jpeg_mem_dest(j_compress_ptr cinfo, unsigned char ** outbuffer, unsigned long * outsize) {
58 mem_dest_mgr_ptr dest; 61 mem_dest_mgr_ptr dest;
59 62
60 if (outbuffer == NULL || outsize == NULL) /* sanity check */ 63 if (outbuffer == NULL || outsize == NULL) /* sanity check */
61 ERREXIT(cinfo, JERR_BUFFER_SIZE); 64 ERREXIT(cinfo, JERR_BUFFER_SIZE);
62 65
88 dest->pub.next_output_byte = dest->buffer = *outbuffer; 91 dest->pub.next_output_byte = dest->buffer = *outbuffer;
89 dest->pub.free_in_buffer = dest->bufsize = *outsize; 92 dest->pub.free_in_buffer = dest->bufsize = *outsize;
90 } 93 }
91 94
92 95
93 int build_jpg(JSAMPLE *image_buf, int width, int height) { 96
97 jpg_buf_t build_jpg_from_fb(int fb, int width, int height) {
94 int scanline; 98 int scanline;
95 struct jpeg_compress_struct cinfo; 99 struct jpeg_compress_struct cinfo;
96 struct jpeg_error_mgr jerr; 100 struct jpeg_error_mgr jerr;
97 101
98 cinfo.err = jpeg_std_error(&jerr); 102 cinfo.err = jpeg_std_error(&jerr);
99 jpeg_create_compress(&cinfo); 103 jpeg_create_compress(&cinfo);
100 104
101 unsigned long out_size = 1<<20; 105 jpg_buf_t jpg_buf;
102 unsigned char *out_buf = NULL; 106 jpg_buf.size = 1 << 20;
103 jpeg_mem_dest(&cinfo, &out_buf, &out_size); 107 jpg_buf.ptr = NULL;
108
109 jpeg_mem_dest(&cinfo, &jpg_buf.ptr, &jpg_buf.size);
104 110
105 cinfo.image_width = width; 111 cinfo.image_width = width;
106 cinfo.image_height = height; 112 cinfo.image_height = height;
107 cinfo.input_components = 3; 113 cinfo.input_components = 3;
108 cinfo.in_color_space = JCS_RGB; 114 cinfo.in_color_space = JCS_RGB;
109 jpeg_set_defaults(&cinfo); 115 jpeg_set_defaults(&cinfo);
110 116
111 jpeg_start_compress(&cinfo, TRUE); 117 jpeg_start_compress(&cinfo, TRUE);
112 118
119 JSAMPLE *buf = malloc(width * 4);
120 JSAMPROW row_ptr[1];
121 row_ptr[0] = buf;
113 for (scanline = 0; scanline < height; scanline++) { 122 for (scanline = 0; scanline < height; scanline++) {
114 JSAMPROW *row_ptr; 123 read(fb, buf, width*4);
115 row_ptr = &image_buf[scanline * width];
116 jpeg_write_scanlines(&cinfo, row_ptr, 1); 124 jpeg_write_scanlines(&cinfo, row_ptr, 1);
117 } 125 }
126 free(buf);
118 127
119 jpeg_finish_compress(&cinfo); 128 jpeg_finish_compress(&cinfo);
120 129
121 jpeg_destroy_compress(&cinfo); 130 jpeg_destroy_compress(&cinfo);
122 131
123 return 0; 132 return jpg_buf;
124 } 133 }

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