Skip to content

Commit

Permalink
could sometimes double-free. push now works with all buffer types (rg…
Browse files Browse the repository at this point in the history
…b, bgr, rgba, bgra)
  • Loading branch information
pkrumins committed Jul 20, 2010
1 parent f0ced11 commit 01fa97a
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 6 deletions.
42 changes: 38 additions & 4 deletions src/dynamic_jpeg_stack.cc
Expand Up @@ -31,6 +31,11 @@ DynamicJpegStack::DynamicJpegStack(int qquality, buffer_type bbuf_type) :
dyn_rect(-1, -1, 0, 0),
bg_width(0), bg_height(0), data(NULL) {}

DynamicJpegStack::~DynamicJpegStack()
{
free(data);
}

void
DynamicJpegStack::UpdateOptimalDimension(int x, int y, int w, int h)
{
Expand Down Expand Up @@ -79,7 +84,7 @@ DynamicJpegStack::Push(unsigned char *data_buf, int x, int y, int w, int h)

int start = y*bg_width*3 + x*3;

if (buf_type == BUF_RGB || buf_type == BUF_BGR) {
if (buf_type == BUF_RGB) {
for (int i = 0; i < h; i++) {
for (int j = 0; j < 3*w; j+=3) {
data[start + i*bg_width*3 + j] = data_buf[i*w*3 + j];
Expand All @@ -88,7 +93,16 @@ DynamicJpegStack::Push(unsigned char *data_buf, int x, int y, int w, int h)
}
}
}
else {
else if (buf_type == BUF_BGR) {
for (int i = 0; i < h; i++) {
for (int j = 0; j < 3*w; j+=3) {
data[start + i*bg_width*3 + j] = data_buf[i*w*3 + j + 2];
data[start + i*bg_width*3 + j + 1] = data_buf[i*w*3 + j + 1];
data[start + i*bg_width*3 + j + 2] = data_buf[i*w*3 + j];
}
}
}
else if (buf_type == BUF_RGBA) {
for (int i = 0; i < h; i++) {
for (int j = 0, k = 0; j < 3*w; j+=3, k+=4) {
data[start + i*bg_width*3 + j] = data_buf[i*w*4 + k];
Expand All @@ -97,22 +111,42 @@ DynamicJpegStack::Push(unsigned char *data_buf, int x, int y, int w, int h)
}
}
}
else if (buf_type == BUF_BGRA) {
for (int i = 0; i < h; i++) {
for (int j = 0, k = 0; j < 3*w; j+=3, k+=4) {
data[start + i*bg_width*3 + j] = data_buf[i*w*4 + k + 2];
data[start + i*bg_width*3 + j + 1] = data_buf[i*w*4 + k + 1];
data[start + i*bg_width*3 + j + 2] = data_buf[i*w*4 + k];
}
}
}
}

void
DynamicJpegStack::SetBackground(unsigned char *data_buf, int w, int h)
{
if (data) free(data);
if (data) {
free(data);
data = NULL;
}

if (buf_type == BUF_RGB) {
data = (unsigned char *)malloc(sizeof(*data)*w*h*3);
if (!data) throw "malloc failed in DynamicJpegStack::SetBackground";
memcpy(data, data_buf, w*h*3);
}
else {
else if (buf_type == BUF_BGR) {
data = bgr_to_rgb(data_buf, w*h*3);
if (!data) throw "malloc failed in DynamicJpegStack::SetBackground";
}
else if (buf_type == BUF_RGBA) {
data = rgba_to_rgb(data_buf, w*h*4);
if (!data) throw "malloc failed in DynamicJpegStack::SetBackground";
}
else if (buf_type == BUF_BGRA) {
data = bgra_to_rgb(data_buf, w*h*4);
if (!data) throw "malloc failed in DynamicJpegStack::SetBackground";
}
bg_width = w;
bg_height = h;
}
Expand Down
1 change: 1 addition & 0 deletions src/dynamic_jpeg_stack.h
Expand Up @@ -23,6 +23,7 @@ class DynamicJpegStack : public node::ObjectWrap {

public:
DynamicJpegStack(int qquality, buffer_type bbuf_type);
~DynamicJpegStack();

v8::Handle<v8::Value> JpegEncode();
void Push(unsigned char *data_buf, int x, int y, int w, int h);
Expand Down
22 changes: 20 additions & 2 deletions src/fixed_jpeg_stack.cc
Expand Up @@ -52,7 +52,7 @@ FixedJpegStack::Push(unsigned char *data_buf, int x, int y, int w, int h)
{
int start = y*width*3 + x*3;

if (buf_type == BUF_RGB || buf_type == BUF_BGR) {
if (buf_type == BUF_RGB) {
for (int i = 0; i < h; i++) {
for (int j = 0; j < 3*w; j+=3) {
data[start + i*width*3 + j] = data_buf[i*w*3 + j];
Expand All @@ -61,7 +61,16 @@ FixedJpegStack::Push(unsigned char *data_buf, int x, int y, int w, int h)
}
}
}
else {
else if (buf_type == BUF_BGR) {
for (int i = 0; i < h; i++) {
for (int j = 0; j < 3*w; j+=3) {
data[start + i*width*3 + j] = data_buf[i*w*3 + j + 2];
data[start + i*width*3 + j + 1] = data_buf[i*w*3 + j + 1];
data[start + i*width*3 + j + 2] = data_buf[i*w*3 + j];
}
}
}
else if (buf_type == BUF_RGBA) {
for (int i = 0; i < h; i++) {
for (int j = 0, k = 0; j < 3*w; j+=3, k+=4) {
data[start + i*width*3 + j] = data_buf[i*w*4 + k];
Expand All @@ -70,6 +79,15 @@ FixedJpegStack::Push(unsigned char *data_buf, int x, int y, int w, int h)
}
}
}
else if (buf_type == BUF_BGRA) {
for (int i = 0; i < h; i++) {
for (int j = 0, k = 0; j < 3*w; j+=3, k+=4) {
data[start + i*width*3 + j] = data_buf[i*w*4 + k + 2];
data[start + i*width*3 + j + 1] = data_buf[i*w*4 + k + 1];
data[start + i*width*3 + j + 2] = data_buf[i*w*4 + k];
}
}
}
}

Handle<Value>
Expand Down

0 comments on commit 01fa97a

Please sign in to comment.