remove uneccessary multiplications from jpeg compression.
parent
0e9da28a97
commit
4ecfa32601
|
@ -196,14 +196,20 @@ Image::Image(const AVFrame *frame) {
|
||||||
text[0] = '\0';
|
text[0] = '\0';
|
||||||
|
|
||||||
width = frame->width;
|
width = frame->width;
|
||||||
linesize = frame->linesize[0];
|
|
||||||
height = frame->height;
|
height = frame->height;
|
||||||
pixels = width*height;
|
pixels = width*height;
|
||||||
|
|
||||||
colours = ZM_COLOUR_RGB32;
|
colours = ZM_COLOUR_RGB32;
|
||||||
subpixelorder = ZM_SUBPIX_ORDER_RGBA;
|
subpixelorder = ZM_SUBPIX_ORDER_RGBA;
|
||||||
|
|
||||||
size = linesize * height;
|
#if LIBAVUTIL_VERSION_CHECK(54, 6, 0, 6, 0)
|
||||||
|
size = av_image_get_buffer_size(AV_PIX_FMT_RGBA, width, height, 32);
|
||||||
|
// av_image_get_linesize isn't aligned, so we have to do that.
|
||||||
|
linesize = FFALIGN(av_image_get_linesize(AV_PIX_FMT_RGBA, width, 0), 32);
|
||||||
|
#else
|
||||||
|
linesize = FFALIGN(av_image_get_linesize(AV_PIX_FMT_RGBA, width, 0), 1);
|
||||||
|
size = avpicture_get_size(AV_PIX_FMT_RGBA, width, height);
|
||||||
|
#endif
|
||||||
|
|
||||||
buffer = 0;
|
buffer = 0;
|
||||||
holdbuffer = 0;
|
holdbuffer = 0;
|
||||||
AllocImgBuffer(size);
|
AllocImgBuffer(size);
|
||||||
|
@ -577,14 +583,15 @@ void Image::AssignDirect(
|
||||||
width = p_width;
|
width = p_width;
|
||||||
height = p_height;
|
height = p_height;
|
||||||
colours = p_colours;
|
colours = p_colours;
|
||||||
linesize = width*colours;
|
linesize = width * colours;
|
||||||
subpixelorder = p_subpixelorder;
|
subpixelorder = p_subpixelorder;
|
||||||
pixels = height*width;
|
pixels = height*width;
|
||||||
size = new_buffer_size; // was pixels*colours, but we already calculated it above as new_buffer_size
|
size = new_buffer_size; // was pixels*colours, but we already calculated it above as new_buffer_size
|
||||||
|
|
||||||
/* Copy into the held buffer */
|
/* Copy into the held buffer */
|
||||||
if ( new_buffer != buffer )
|
if ( new_buffer != buffer ) {
|
||||||
(*fptr_imgbufcpy)(buffer, new_buffer, size);
|
(*fptr_imgbufcpy)(buffer, new_buffer, size);
|
||||||
|
}
|
||||||
|
|
||||||
/* Free the new buffer */
|
/* Free the new buffer */
|
||||||
DumpBuffer(new_buffer, p_buffertype);
|
DumpBuffer(new_buffer, p_buffertype);
|
||||||
|
@ -962,11 +969,10 @@ cinfo->out_color_space = JCS_RGB;
|
||||||
|
|
||||||
jpeg_start_decompress(cinfo);
|
jpeg_start_decompress(cinfo);
|
||||||
|
|
||||||
JSAMPROW row_pointer; /* pointer to a single row */
|
JSAMPROW row_pointer = buffer;
|
||||||
int row_stride = width * colours; /* physical row width in buffer */
|
|
||||||
while ( cinfo->output_scanline < cinfo->output_height ) {
|
while ( cinfo->output_scanline < cinfo->output_height ) {
|
||||||
row_pointer = &buffer[cinfo->output_scanline * row_stride];
|
|
||||||
jpeg_read_scanlines(cinfo, &row_pointer, 1);
|
jpeg_read_scanlines(cinfo, &row_pointer, 1);
|
||||||
|
row_pointer += linesize;
|
||||||
}
|
}
|
||||||
|
|
||||||
jpeg_finish_decompress(cinfo);
|
jpeg_finish_decompress(cinfo);
|
||||||
|
@ -1060,13 +1066,16 @@ bool Image::WriteJpeg(const char *filename, int quality_override, struct timeval
|
||||||
case ZM_COLOUR_RGB32:
|
case ZM_COLOUR_RGB32:
|
||||||
#ifdef JCS_EXTENSIONS
|
#ifdef JCS_EXTENSIONS
|
||||||
cinfo->input_components = 4;
|
cinfo->input_components = 4;
|
||||||
if ( subpixelorder == ZM_SUBPIX_ORDER_BGRA ) {
|
if ( subpixelorder == ZM_SUBPIX_ORDER_RGBA ) {
|
||||||
|
cinfo->in_color_space = JCS_EXT_RGBX;
|
||||||
|
} else if ( subpixelorder == ZM_SUBPIX_ORDER_BGRA ) {
|
||||||
cinfo->in_color_space = JCS_EXT_BGRX;
|
cinfo->in_color_space = JCS_EXT_BGRX;
|
||||||
} else if ( subpixelorder == ZM_SUBPIX_ORDER_ARGB ) {
|
} else if ( subpixelorder == ZM_SUBPIX_ORDER_ARGB ) {
|
||||||
cinfo->in_color_space = JCS_EXT_XRGB;
|
cinfo->in_color_space = JCS_EXT_XRGB;
|
||||||
} else if ( subpixelorder == ZM_SUBPIX_ORDER_ABGR ) {
|
} else if ( subpixelorder == ZM_SUBPIX_ORDER_ABGR ) {
|
||||||
cinfo->in_color_space = JCS_EXT_XBGR;
|
cinfo->in_color_space = JCS_EXT_XBGR;
|
||||||
} else {
|
} else {
|
||||||
|
Warning("Unknwon subpixelorder %d", subpixelorder);
|
||||||
/* Assume RGBA */
|
/* Assume RGBA */
|
||||||
cinfo->in_color_space = JCS_EXT_RGBX;
|
cinfo->in_color_space = JCS_EXT_RGBX;
|
||||||
}
|
}
|
||||||
|
@ -1137,14 +1146,11 @@ cinfo->out_color_space = JCS_RGB;
|
||||||
}
|
}
|
||||||
|
|
||||||
JSAMPROW row_pointer; /* pointer to a single row */
|
JSAMPROW row_pointer; /* pointer to a single row */
|
||||||
//cinfo->image_width * colours; /* physical row width in buffer */
|
|
||||||
while ( cinfo->next_scanline < cinfo->image_height ) {
|
while ( cinfo->next_scanline < cinfo->image_height ) {
|
||||||
row_pointer = &buffer[cinfo->next_scanline * linesize];
|
|
||||||
jpeg_write_scanlines(cinfo, &row_pointer, 1);
|
jpeg_write_scanlines(cinfo, &row_pointer, 1);
|
||||||
|
row_pointer += linesize;
|
||||||
}
|
}
|
||||||
|
|
||||||
jpeg_finish_compress(cinfo);
|
jpeg_finish_compress(cinfo);
|
||||||
|
|
||||||
fclose(outfile);
|
fclose(outfile);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -1258,11 +1264,10 @@ cinfo->out_color_space = JCS_RGB;
|
||||||
|
|
||||||
jpeg_start_decompress(cinfo);
|
jpeg_start_decompress(cinfo);
|
||||||
|
|
||||||
JSAMPROW row_pointer; /* pointer to a single row */
|
JSAMPROW row_pointer = buffer; /* pointer to a single row */
|
||||||
int row_stride = width * colours; /* physical row width in buffer */
|
|
||||||
while ( cinfo->output_scanline < cinfo->output_height ) {
|
while ( cinfo->output_scanline < cinfo->output_height ) {
|
||||||
row_pointer = &buffer[cinfo->output_scanline * row_stride];
|
|
||||||
jpeg_read_scanlines(cinfo, &row_pointer, 1);
|
jpeg_read_scanlines(cinfo, &row_pointer, 1);
|
||||||
|
row_pointer += linesize;
|
||||||
}
|
}
|
||||||
|
|
||||||
jpeg_finish_decompress(cinfo);
|
jpeg_finish_decompress(cinfo);
|
||||||
|
@ -1294,7 +1299,7 @@ bool Image::EncodeJpeg(JOCTET *outbuffer, int *outbuffer_size, int quality_overr
|
||||||
cinfo->image_width = width; /* image width and height, in pixels */
|
cinfo->image_width = width; /* image width and height, in pixels */
|
||||||
cinfo->image_height = height;
|
cinfo->image_height = height;
|
||||||
|
|
||||||
switch (colours) {
|
switch ( colours ) {
|
||||||
case ZM_COLOUR_GRAY8:
|
case ZM_COLOUR_GRAY8:
|
||||||
cinfo->input_components = 1;
|
cinfo->input_components = 1;
|
||||||
cinfo->in_color_space = JCS_GRAYSCALE;
|
cinfo->in_color_space = JCS_GRAYSCALE;
|
||||||
|
@ -1302,13 +1307,16 @@ bool Image::EncodeJpeg(JOCTET *outbuffer, int *outbuffer_size, int quality_overr
|
||||||
case ZM_COLOUR_RGB32:
|
case ZM_COLOUR_RGB32:
|
||||||
#ifdef JCS_EXTENSIONS
|
#ifdef JCS_EXTENSIONS
|
||||||
cinfo->input_components = 4;
|
cinfo->input_components = 4;
|
||||||
if ( subpixelorder == ZM_SUBPIX_ORDER_BGRA ) {
|
if ( subpixelorder == ZM_SUBPIX_ORDER_RGBA ) {
|
||||||
|
cinfo->in_color_space = JCS_EXT_RGBX;
|
||||||
|
} else if ( subpixelorder == ZM_SUBPIX_ORDER_BGRA ) {
|
||||||
cinfo->in_color_space = JCS_EXT_BGRX;
|
cinfo->in_color_space = JCS_EXT_BGRX;
|
||||||
} else if ( subpixelorder == ZM_SUBPIX_ORDER_ARGB ) {
|
} else if ( subpixelorder == ZM_SUBPIX_ORDER_ARGB ) {
|
||||||
cinfo->in_color_space = JCS_EXT_XRGB;
|
cinfo->in_color_space = JCS_EXT_XRGB;
|
||||||
} else if ( subpixelorder == ZM_SUBPIX_ORDER_ABGR ) {
|
} else if ( subpixelorder == ZM_SUBPIX_ORDER_ABGR ) {
|
||||||
cinfo->in_color_space = JCS_EXT_XBGR;
|
cinfo->in_color_space = JCS_EXT_XBGR;
|
||||||
} else {
|
} else {
|
||||||
|
Warning("unknown subpixelorder %d", subpixelorder);
|
||||||
/* Assume RGBA */
|
/* Assume RGBA */
|
||||||
cinfo->in_color_space = JCS_EXT_RGBX;
|
cinfo->in_color_space = JCS_EXT_RGBX;
|
||||||
}
|
}
|
||||||
|
@ -1349,11 +1357,10 @@ cinfo->out_color_space = JCS_RGB;
|
||||||
|
|
||||||
jpeg_start_compress(cinfo, TRUE);
|
jpeg_start_compress(cinfo, TRUE);
|
||||||
|
|
||||||
JSAMPROW row_pointer; /* pointer to a single row */
|
JSAMPROW row_pointer = buffer;
|
||||||
int row_stride = linesize; /* physical row width in buffer */
|
|
||||||
while ( cinfo->next_scanline < cinfo->image_height ) {
|
while ( cinfo->next_scanline < cinfo->image_height ) {
|
||||||
row_pointer = &buffer[cinfo->next_scanline * row_stride];
|
|
||||||
jpeg_write_scanlines(cinfo, &row_pointer, 1);
|
jpeg_write_scanlines(cinfo, &row_pointer, 1);
|
||||||
|
row_pointer += linesize;
|
||||||
}
|
}
|
||||||
|
|
||||||
jpeg_finish_compress(cinfo);
|
jpeg_finish_compress(cinfo);
|
||||||
|
@ -1638,7 +1645,6 @@ void Image::Overlay( const Image &image, unsigned int x, unsigned int y ) {
|
||||||
} else {
|
} else {
|
||||||
Error("Overlay called with unexpected colours: %d", colours);
|
Error("Overlay called with unexpected colours: %d", colours);
|
||||||
}
|
}
|
||||||
Debug(1, "Overlay");
|
|
||||||
} // end void Image::Overlay( const Image &image, unsigned int x, unsigned int y )
|
} // end void Image::Overlay( const Image &image, unsigned int x, unsigned int y )
|
||||||
|
|
||||||
void Image::Blend( const Image &image, int transparency ) {
|
void Image::Blend( const Image &image, int transparency ) {
|
||||||
|
@ -2351,9 +2357,7 @@ void Image::Outline( Rgb colour, const Polygon &polygon ) {
|
||||||
|
|
||||||
double grad;
|
double grad;
|
||||||
|
|
||||||
//Debug( 9, "dx: %.2lf, dy: %.2lf", dx, dy );
|
|
||||||
if ( fabs(dx) <= fabs(dy) ) {
|
if ( fabs(dx) <= fabs(dy) ) {
|
||||||
//Debug( 9, "dx <= dy" );
|
|
||||||
if ( y1 != y2 )
|
if ( y1 != y2 )
|
||||||
grad = dx/dy;
|
grad = dx/dy;
|
||||||
else
|
else
|
||||||
|
@ -2363,9 +2367,7 @@ void Image::Outline( Rgb colour, const Polygon &polygon ) {
|
||||||
int y, yinc = (y1<y2)?1:-1;
|
int y, yinc = (y1<y2)?1:-1;
|
||||||
grad *= yinc;
|
grad *= yinc;
|
||||||
if ( colours == ZM_COLOUR_GRAY8 ) {
|
if ( colours == ZM_COLOUR_GRAY8 ) {
|
||||||
//Debug( 9, "x1:%d, x2:%d, y1:%d, y2:%d, gr:%.2f", x1, x2, y1, y2, grad );
|
|
||||||
for ( x = x1, y = y1; y != y2; y += yinc, x += grad ) {
|
for ( x = x1, y = y1; y != y2; y += yinc, x += grad ) {
|
||||||
//Debug( 9, "x:%.2f, y:%d", x, y );
|
|
||||||
buffer[(y*width)+int(round(x))] = colour;
|
buffer[(y*width)+int(round(x))] = colour;
|
||||||
}
|
}
|
||||||
} else if ( colours == ZM_COLOUR_RGB24 ) {
|
} else if ( colours == ZM_COLOUR_RGB24 ) {
|
||||||
|
@ -2452,7 +2454,8 @@ void Image::Fill(Rgb colour, int density, const Polygon &polygon) {
|
||||||
#ifndef ZM_DBG_OFF
|
#ifndef ZM_DBG_OFF
|
||||||
if ( logLevel() >= Logger::DEBUG9 ) {
|
if ( logLevel() >= Logger::DEBUG9 ) {
|
||||||
for ( int i = 0; i < n_global_edges; i++ ) {
|
for ( int i = 0; i < n_global_edges; i++ ) {
|
||||||
Debug( 9, "%d: min_y: %d, max_y:%d, min_x:%.2f, 1/m:%.2f", i, global_edges[i].min_y, global_edges[i].max_y, global_edges[i].min_x, global_edges[i]._1_m );
|
Debug(9, "%d: min_y: %d, max_y:%d, min_x:%.2f, 1/m:%.2f",
|
||||||
|
i, global_edges[i].min_y, global_edges[i].max_y, global_edges[i].min_x, global_edges[i]._1_m);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -2475,11 +2478,12 @@ void Image::Fill(Rgb colour, int density, const Polygon &polygon) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
qsort( active_edges, n_active_edges, sizeof(*active_edges), Edge::CompareX );
|
qsort(active_edges, n_active_edges, sizeof(*active_edges), Edge::CompareX);
|
||||||
#ifndef ZM_DBG_OFF
|
#ifndef ZM_DBG_OFF
|
||||||
if ( logLevel() >= Logger::DEBUG9 ) {
|
if ( logLevel() >= Logger::DEBUG9 ) {
|
||||||
for ( int i = 0; i < n_active_edges; i++ ) {
|
for ( int i = 0; i < n_active_edges; i++ ) {
|
||||||
Debug( 9, "%d - %d: min_y: %d, max_y:%d, min_x:%.2f, 1/m:%.2f", y, i, active_edges[i].min_y, active_edges[i].max_y, active_edges[i].min_x, active_edges[i]._1_m );
|
Debug(9, "%d - %d: min_y: %d, max_y:%d, min_x:%.2f, 1/m:%.2f",
|
||||||
|
y, i, active_edges[i].min_y, active_edges[i].max_y, active_edges[i].min_x, active_edges[i]._1_m );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -2520,7 +2524,7 @@ void Image::Fill(Rgb colour, int density, const Polygon &polygon) {
|
||||||
for ( int i = n_active_edges-1; i >= 0; i-- ) {
|
for ( int i = n_active_edges-1; i >= 0; i-- ) {
|
||||||
if ( y >= active_edges[i].max_y ) {
|
if ( y >= active_edges[i].max_y ) {
|
||||||
// Or >= as per sheets
|
// Or >= as per sheets
|
||||||
Debug( 9, "Deleting active_edge" );
|
Debug(9, "Deleting active_edge");
|
||||||
if ( i < (n_active_edges-1) ) {
|
if ( i < (n_active_edges-1) ) {
|
||||||
//memcpy( &active_edges[i], &active_edges[i+1], sizeof(*active_edges)*(n_active_edges-i) );
|
//memcpy( &active_edges[i], &active_edges[i+1], sizeof(*active_edges)*(n_active_edges-i) );
|
||||||
memmove( &active_edges[i], &active_edges[i+1], sizeof(*active_edges)*(n_active_edges-i) );
|
memmove( &active_edges[i], &active_edges[i+1], sizeof(*active_edges)*(n_active_edges-i) );
|
||||||
|
@ -2533,8 +2537,8 @@ void Image::Fill(Rgb colour, int density, const Polygon &polygon) {
|
||||||
} while ( n_global_edges || n_active_edges );
|
} while ( n_global_edges || n_active_edges );
|
||||||
}
|
}
|
||||||
|
|
||||||
void Image::Fill( Rgb colour, const Polygon &polygon ) {
|
void Image::Fill(Rgb colour, const Polygon &polygon) {
|
||||||
Fill( colour, 1, polygon );
|
Fill(colour, 1, polygon);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Image::Rotate(int angle) {
|
void Image::Rotate(int angle) {
|
||||||
|
@ -2543,7 +2547,6 @@ void Image::Rotate(int angle) {
|
||||||
if ( !angle || angle%90 ) {
|
if ( !angle || angle%90 ) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int new_height = height;
|
unsigned int new_height = height;
|
||||||
unsigned int new_width = width;
|
unsigned int new_width = width;
|
||||||
uint8_t* rotate_buffer = AllocBuffer(size);
|
uint8_t* rotate_buffer = AllocBuffer(size);
|
||||||
|
@ -2706,9 +2709,9 @@ void Image::Flip( bool leftright ) {
|
||||||
unsigned char *s_ptr = buffer+(height*line_bytes);
|
unsigned char *s_ptr = buffer+(height*line_bytes);
|
||||||
unsigned char *d_ptr = flip_buffer;
|
unsigned char *d_ptr = flip_buffer;
|
||||||
|
|
||||||
while( s_ptr > buffer ) {
|
while ( s_ptr > buffer ) {
|
||||||
s_ptr -= line_bytes;
|
s_ptr -= line_bytes;
|
||||||
memcpy( d_ptr, s_ptr, line_bytes );
|
memcpy(d_ptr, s_ptr, line_bytes);
|
||||||
d_ptr += line_bytes;
|
d_ptr += line_bytes;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue