Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(663)

Unified Diff: src/images/SkImageDecoder_libjpeg.cpp

Issue 1010983004: Lazy SKP image decoding in DM. (Closed) Base URL: https://skia.googlesource.com/skia@master
Patch Set: double check Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « dm/DMSrcSink.cpp ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/images/SkImageDecoder_libjpeg.cpp
diff --git a/src/images/SkImageDecoder_libjpeg.cpp b/src/images/SkImageDecoder_libjpeg.cpp
index d32e2a21c91bea0fe06e472a5e6cce22518f41c5..5eb827122f29e322cb7d20be8b35dcc841dd90d9 100644
--- a/src/images/SkImageDecoder_libjpeg.cpp
+++ b/src/images/SkImageDecoder_libjpeg.cpp
@@ -768,14 +768,31 @@ static SkISize compute_yuv_size(const jpeg_decompress_struct& info, int componen
info.cur_comp_info[component]->downsampled_height);
}
+static bool appears_to_be_yuv(const jpeg_decompress_struct& info) {
+ return (info.jpeg_color_space == JCS_YCbCr)
+ && (DCTSIZE == 8)
+ && (info.num_components == 3)
+ && (info.comps_in_scan >= info.num_components)
+ && (info.scale_denom <= 8)
+ && (info.cur_comp_info[0])
+ && (info.cur_comp_info[1])
+ && (info.cur_comp_info[2])
+ && (info.cur_comp_info[1]->h_samp_factor == 1)
+ && (info.cur_comp_info[1]->v_samp_factor == 1)
+ && (info.cur_comp_info[2]->h_samp_factor == 1)
+ && (info.cur_comp_info[2]->v_samp_factor == 1);
+}
+
static void update_components_sizes(const jpeg_decompress_struct& cinfo, SkISize componentSizes[3],
SizeType sizeType) {
+ SkASSERT(appears_to_be_yuv(cinfo));
for (int i = 0; i < 3; ++i) {
componentSizes[i] = compute_yuv_size(cinfo, i, sizeType);
}
}
static bool output_raw_data(jpeg_decompress_struct& cinfo, void* planes[3], size_t rowBytes[3]) {
+ SkASSERT(appears_to_be_yuv(cinfo));
// U size and V size have to be the same if we're calling output_raw_data()
SkISize uvSize = compute_yuv_size(cinfo, 1, kSizeForMemoryAllocation_SizeType);
SkASSERT(uvSize == compute_yuv_size(cinfo, 2, kSizeForMemoryAllocation_SizeType));
@@ -861,7 +878,6 @@ bool SkJPEGImageDecoder::onDecodeYUV8Planes(SkStream* stream, SkISize componentS
#ifdef TIME_DECODE
SkAutoTime atm("JPEG YUV8 Decode");
#endif
-
if (this->getSampleSize() != 1) {
return false; // Resizing not supported
}
@@ -888,7 +904,7 @@ bool SkJPEGImageDecoder::onDecodeYUV8Planes(SkStream* stream, SkISize componentS
return return_false(cinfo, "read_header YUV8");
}
- if (cinfo.jpeg_color_space != JCS_YCbCr) {
+ if (!appears_to_be_yuv(cinfo)) {
// It's not an error to not be encoded in YUV, so no need to use return_false()
return false;
}
@@ -920,6 +936,12 @@ bool SkJPEGImageDecoder::onDecodeYUV8Planes(SkStream* stream, SkISize componentS
return return_false(cinfo, "start_decompress YUV8");
}
+ // Seems like jpeg_start_decompress is updating our opinion of whether cinfo represents YUV.
msarett 2015/12/21 22:35:57 Mike, I realize this is a shot in the dark, but is
mtklein 2015/12/21 23:44:52 Not sure what image triggered this, but I'm pretty
+ // Again, not really an error.
+ if (!appears_to_be_yuv(cinfo)) {
+ return false;
+ }
+
if (!output_raw_data(cinfo, planes, rowBytes)) {
return return_false(cinfo, "output_raw_data");
}
« no previous file with comments | « dm/DMSrcSink.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698