diff --git a/jpegli.go b/jpegli.go index 4b5faa0..fd1a59c 100644 --- a/jpegli.go +++ b/jpegli.go @@ -34,6 +34,10 @@ const ( DCTFloat ) +const ( + alignSize = 16 +) + // EncodingOptions are the encoding parameters. type EncodingOptions struct { // Quality in the range [0,100]. Default is 75. @@ -198,9 +202,18 @@ func yCbCrSize(r image.Rectangle, subsampleRatio image.YCbCrSubsampleRatio) (w, ch = h } + w = pad(w, alignSize) + alignSize + h = pad(h, alignSize) + alignSize + cw = pad(cw, alignSize) + alignSize + ch = pad(ch, alignSize) + alignSize + return } +func pad(a int, b int) int { + return (a + (b - 1)) & (^(b - 1)) +} + func init() { image.RegisterFormat("jpeg", "\xff\xd8", Decode, DecodeConfig) } diff --git a/jpegli_wazero.go b/jpegli_wazero.go index 9c1e806..708a4cd 100644 --- a/jpegli_wazero.go +++ b/jpegli_wazero.go @@ -39,7 +39,7 @@ func decode(r io.Reader, configOnly, fancyUpsampling, blockSmoothing, arithCode var data []byte if configOnly { - data = make([]byte, 512) + data = make([]byte, 1024) _, err = r.Read(data) if err != nil { return nil, cfg, fmt.Errorf("read: %w", err) diff --git a/lib/jpegli.c b/lib/jpegli.c index 0b84f4c..e10a077 100644 --- a/lib/jpegli.c +++ b/lib/jpegli.c @@ -26,6 +26,10 @@ typedef enum { YCbCr410 } chroma; +void error_exit(j_common_ptr info) { + (*info->err->output_message)(info); +} + int decode(uint8_t *jpeg_in, int jpeg_in_size, int config_only, uint32_t *width, uint32_t *height, uint32_t *colorspace, uint32_t *chroma, uint8_t *out, int fancy_upsampling, int block_smoothing, int arith_code, int dct_method, int tw, int th) { @@ -33,6 +37,7 @@ int decode(uint8_t *jpeg_in, int jpeg_in_size, int config_only, uint32_t *width, struct jpeg_error_mgr jerr; dinfo.err = jpegli_std_error(&jerr); + dinfo.err->error_exit = error_exit; jpegli_create_decompress(&dinfo); jpegli_mem_src(&dinfo, jpeg_in, jpeg_in_size); @@ -233,6 +238,7 @@ uint8_t* encode(uint8_t *in, int width, int height, int colorspace, int chroma, struct jpeg_error_mgr jerr; cinfo.err = jpegli_std_error(&jerr); + cinfo.err->error_exit = error_exit; jpegli_create_compress(&cinfo); diff --git a/lib/jpegli.wasm.gz b/lib/jpegli.wasm.gz index 2bdb618..7464f56 100644 Binary files a/lib/jpegli.wasm.gz and b/lib/jpegli.wasm.gz differ