]> git.vomp.tv Git - vompclient.git/blob - wjpeg.cc
Zero length recording segfault fixed
[vompclient.git] / wjpeg.cc
1 /*
2     Copyright 2004-2005 Chris Tallon
3
4     This file is part of VOMP.
5
6     VOMP is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10
11     VOMP is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15
16     You should have received a copy of the GNU General Public License
17     along with VOMP; if not, write to the Free Software
18     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19 */
20
21 #include "wjpeg.h"
22
23 int WJpeg::init(char* tfileName)
24 {
25   fileName = tfileName;
26   return 1;
27 }
28
29 void WJpeg::draw()
30 {
31   Log* logger = Log::getInstance();
32
33   FILE* infile = fopen(fileName, "r");
34   if (infile == NULL)
35   {
36     logger->log("BJpeg", Log::ERR, "Can't open JPEG");
37     return;
38   }
39   logger->log("BJpeg", Log::DEBUG, "File opened");
40
41   struct jpeg_decompress_struct cinfo;
42   struct jpeg_error_mgr jerr;
43   cinfo.err = jpeg_std_error(&jerr);
44   jpeg_create_decompress(&cinfo);
45   jpeg_stdio_src(&cinfo, infile);
46   jpeg_read_header(&cinfo, TRUE);
47   jpeg_start_decompress(&cinfo);
48
49   logger->log("BJpeg", Log::DEBUG, "JPEG startup done %i %i", cinfo.output_width, cinfo.output_height);
50
51   // Init the surface
52   setDimensions(cinfo.output_width, cinfo.output_height);
53
54
55   // MAKE THE 2D ARRAY
56
57   unsigned char* buffer = (unsigned char*)malloc(area.w * area.h * 3);
58   logger->log("BJpeg", Log::DEBUG, "Buffer allocated at %p, width = %i height = %i", buffer, area.w, area.h);
59
60   unsigned char* bufferPointers[area.h];
61   for(UINT ps = 0; ps < area.h; ps++) bufferPointers[ps] = buffer + (ps * area.w * 3);
62
63   logger->log("BJpeg", Log::DEBUG, "done array check");
64
65   int rowsread = 0;
66   while (cinfo.output_scanline < cinfo.output_height)
67   {
68 //  logger->log("BJpeg", Log::DEBUG, "%i", rowsread);
69     rowsread += jpeg_read_scanlines(&cinfo, &bufferPointers[rowsread], area.h);
70   }
71
72   logger->log("BJpeg", Log::DEBUG, "Done all jpeg_read");
73
74   jpeg_finish_decompress(&cinfo);
75   jpeg_destroy_decompress(&cinfo);
76
77   fclose(infile);
78
79   logger->log("BJpeg", Log::DEBUG, "jpeg shutdown done, x, y %u %u", area.w, area.h);
80
81   Colour c;
82   UINT x, y, xoff;
83   unsigned char* p;
84
85   for (y = 0; y < area.h; y++)
86   {
87     p = bufferPointers[y];
88
89     for (x = 0; x < area.w; x++)
90     {
91       xoff = x * 3;
92
93 //      c = (  (0xFF000000        )
94 //           | (p[xoff    ]  << 16)
95 //           | (p[xoff + 1]  <<  8)
96 //           | (p[xoff + 2]       ) );
97
98       c.red = p[xoff];
99       c.green = p[xoff + 1];
100       c.blue = p[xoff + 2];
101
102       drawPixel(x, y, c);
103     }
104   }
105
106   free(buffer);
107   logger->log("BJpeg", Log::DEBUG, "deleted buffer");
108
109 }
110