Fix for DSS scaling error on very small screens
[apps/dual-camera-demo.git] / jpeg.cpp
1 #include <malloc.h>
2 #include <sys/mman.h>
3 #include <jpeglib.h>
5 void jpegWrite(unsigned char* yuv, int index, int width, int height)
6 {
7     struct jpeg_compress_struct cinfo;
8     struct jpeg_error_mgr jerr;
10     unsigned char *img = (unsigned char *)malloc(width*height*3*sizeof(char));
12     char jpegFilename[256];
14     sprintf(jpegFilename, "/usr/share/camera-images/image%d.jpg", index);
16     JSAMPROW row_pointer[1];
17     FILE *outfile = fopen( jpegFilename, "wb" );
19     // try to open file for saving
20     if (!outfile) {
21             printf("Can't open file!\n");
22     }
24     // create jpeg data
25     cinfo.err = jpeg_std_error( &jerr );
26     jpeg_create_compress(&cinfo);
27     jpeg_stdio_dest(&cinfo, outfile);
29     // set image parameters
30     cinfo.image_width = width;
31     cinfo.image_height = height;
32     cinfo.input_components = 3;
33     cinfo.in_color_space = JCS_YCbCr;
35     // set jpeg compression parameters to default
36     jpeg_set_defaults(&cinfo);
37     // and then adjust quality setting
38     jpeg_set_quality(&cinfo, 90, TRUE);
40     // start compress
41     jpeg_start_compress(&cinfo, TRUE);
43     // feed data
44     row_pointer[0] = img;
45     while (cinfo.next_scanline < cinfo.image_height) {
46         unsigned i, j;
47         unsigned offset = cinfo.next_scanline * cinfo.image_width * 2;
48         for (i = 0, j = 0; i < cinfo.image_width*2; i += 4, j += 6) {
49             img[j + 0] = yuv[offset + i + 0]; // Y
50             img[j + 1] = yuv[offset + i + 1]; // U
51             img[j + 2] = yuv[offset + i + 3]; // V
52             img[j + 3] = yuv[offset + i + 2]; // Y
53             img[j + 4] = yuv[offset + i + 1]; // U
54             img[j + 5] = yuv[offset + i + 3]; // V
55         }
56         jpeg_write_scanlines(&cinfo, row_pointer, 1);
57     }
59     // finish compression
60     jpeg_finish_compress(&cinfo);
62     // destroy jpeg data
63     jpeg_destroy_compress(&cinfo);
65     // close output file
66     fclose(outfile);
68     munmap(img, width*height*3*sizeof(char));
70     return;
71 }