diff options
author | Wu-cheng Li <wuchengli@google.com> | 2012-10-16 23:40:03 +0800 |
---|---|---|
committer | Wu-cheng Li <wuchengli@google.com> | 2012-10-17 18:06:59 +0800 |
commit | 4b63f14c96841d02b6bffce987f7705b6aa8e2a9 (patch) | |
tree | ba0661a2e2d0fbe65b12cddc1c43c87daf610556 /core/jni | |
parent | 1f0752993ffd4339cdf0e7d69b96093503bd2e24 (diff) | |
download | frameworks_base-4b63f14c96841d02b6bffce987f7705b6aa8e2a9.zip frameworks_base-4b63f14c96841d02b6bffce987f7705b6aa8e2a9.tar.gz frameworks_base-4b63f14c96841d02b6bffce987f7705b6aa8e2a9.tar.bz2 |
Fix native crash while saving a panorama.
YuvToJpegEncoder should handle the case when the height is not
multiples of 16.
bug:7165606
Change-Id: I02f142b233c4f5c0cd8df5e3d1eaebbf62d28052
Diffstat (limited to 'core/jni')
-rw-r--r-- | core/jni/android/graphics/YuvToJpegEncoder.cpp | 14 | ||||
-rw-r--r-- | core/jni/android/graphics/YuvToJpegEncoder.h | 2 |
2 files changed, 11 insertions, 5 deletions
diff --git a/core/jni/android/graphics/YuvToJpegEncoder.cpp b/core/jni/android/graphics/YuvToJpegEncoder.cpp index 8333e00..f386905 100644 --- a/core/jni/android/graphics/YuvToJpegEncoder.cpp +++ b/core/jni/android/graphics/YuvToJpegEncoder.cpp @@ -90,8 +90,9 @@ void Yuv420SpToJpegEncoder::compress(jpeg_compress_struct* cinfo, // process 16 lines of Y and 8 lines of U/V each time. while (cinfo->next_scanline < cinfo->image_height) { //deitnerleave u and v - deinterleave(vuPlanar, uRows, vRows, cinfo->next_scanline, width); + deinterleave(vuPlanar, uRows, vRows, cinfo->next_scanline, width, height); + // Jpeg library ignores the rows whose indices are greater than height. for (int i = 0; i < 16; i++) { // y row y[i] = yPlanar + (cinfo->next_scanline + i) * fStrides[0]; @@ -112,8 +113,10 @@ void Yuv420SpToJpegEncoder::compress(jpeg_compress_struct* cinfo, } void Yuv420SpToJpegEncoder::deinterleave(uint8_t* vuPlanar, uint8_t* uRows, - uint8_t* vRows, int rowIndex, int width) { - for (int row = 0; row < 8; ++row) { + uint8_t* vRows, int rowIndex, int width, int height) { + int numRows = (height - rowIndex) / 2; + if (numRows > 8) numRows = 8; + for (int row = 0; row < numRows; ++row) { int offset = ((rowIndex >> 1) + row) * fStrides[1]; uint8_t* vu = vuPlanar + offset; for (int i = 0; i < (width >> 1); ++i) { @@ -164,6 +167,7 @@ void Yuv422IToJpegEncoder::compress(jpeg_compress_struct* cinfo, while (cinfo->next_scanline < cinfo->image_height) { deinterleave(yuvOffset, yRows, uRows, vRows, cinfo->next_scanline, width, height); + // Jpeg library ignores the rows whose indices are greater than height. for (int i = 0; i < 16; i++) { // y row y[i] = yRows + i * width; @@ -185,7 +189,9 @@ void Yuv422IToJpegEncoder::compress(jpeg_compress_struct* cinfo, void Yuv422IToJpegEncoder::deinterleave(uint8_t* yuv, uint8_t* yRows, uint8_t* uRows, uint8_t* vRows, int rowIndex, int width, int height) { - for (int row = 0; row < 16; ++row) { + int numRows = height - rowIndex; + if (numRows > 16) numRows = 16; + for (int row = 0; row < numRows; ++row) { uint8_t* yuvSeg = yuv + (rowIndex + row) * fStrides[0]; for (int i = 0; i < (width >> 1); ++i) { int indexY = row * width + (i << 1); diff --git a/core/jni/android/graphics/YuvToJpegEncoder.h b/core/jni/android/graphics/YuvToJpegEncoder.h index 97106ce..0d418ed 100644 --- a/core/jni/android/graphics/YuvToJpegEncoder.h +++ b/core/jni/android/graphics/YuvToJpegEncoder.h @@ -55,7 +55,7 @@ private: void deinterleaveYuv(uint8_t* yuv, int width, int height, uint8_t*& yPlanar, uint8_t*& uPlanar, uint8_t*& vPlanar); void deinterleave(uint8_t* vuPlanar, uint8_t* uRows, uint8_t* vRows, - int rowIndex, int width); + int rowIndex, int width, int height); void compress(jpeg_compress_struct* cinfo, uint8_t* yuv, int* offsets); }; |