diff options
| -rw-r--r-- | core/jni/android/graphics/YuvToJpegEncoder.cpp | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/core/jni/android/graphics/YuvToJpegEncoder.cpp b/core/jni/android/graphics/YuvToJpegEncoder.cpp index 5eecd9cf76ef..09adc824e520 100644 --- a/core/jni/android/graphics/YuvToJpegEncoder.cpp +++ b/core/jni/android/graphics/YuvToJpegEncoder.cpp @@ -23,16 +23,28 @@ YuvToJpegEncoder* YuvToJpegEncoder::create(int format, int* strides) { YuvToJpegEncoder::YuvToJpegEncoder(int* strides) : fStrides(strides) { } +struct ErrorMgr { + struct jpeg_error_mgr pub; + jmp_buf jmp; +}; + +void error_exit(j_common_ptr cinfo) { + ErrorMgr* err = (ErrorMgr*) cinfo->err; + (*cinfo->err->output_message) (cinfo); + longjmp(err->jmp, 1); +} + bool YuvToJpegEncoder::encode(SkWStream* stream, void* inYuv, int width, int height, int* offsets, int jpegQuality) { jpeg_compress_struct cinfo; - jpeg_error_mgr err; + ErrorMgr err; skjpeg_destination_mgr sk_wstream(stream); - cinfo.err = jpeg_std_error(&err); - err.error_exit = skjpeg_error_exit; - jmp_buf jmp; - if (setjmp(jmp)) { + cinfo.err = jpeg_std_error(&err.pub); + err.pub.error_exit = error_exit; + + if (setjmp(err.jmp)) { + jpeg_destroy_compress(&cinfo); return false; } jpeg_create_compress(&cinfo); @@ -47,6 +59,8 @@ bool YuvToJpegEncoder::encode(SkWStream* stream, void* inYuv, int width, jpeg_finish_compress(&cinfo); + jpeg_destroy_compress(&cinfo); + return true; } |