OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/image_decoder.h" | 5 #include "chrome/browser/image_decoder.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/callback.h" | 10 #include "base/callback.h" |
11 #include "base/threading/thread_task_runner_handle.h" | 11 #include "base/threading/thread_task_runner_handle.h" |
12 #include "build/build_config.h" | 12 #include "build/build_config.h" |
13 #include "content/public/browser/browser_thread.h" | 13 #include "content/public/browser/browser_thread.h" |
14 #include "content/public/common/service_manager_connection.h" | 14 #include "content/public/common/service_manager_connection.h" |
15 #include "ipc/ipc_channel.h" | 15 #include "ipc/ipc_channel.h" |
16 #include "services/image_decoder/public/cpp/decode.h" | 16 #include "services/data_decoder/public/cpp/decode_image.h" |
17 #include "services/service_manager/public/cpp/connector.h" | 17 #include "services/service_manager/public/cpp/connector.h" |
18 #include "third_party/skia/include/core/SkBitmap.h" | 18 #include "third_party/skia/include/core/SkBitmap.h" |
19 #include "ui/gfx/geometry/size.h" | 19 #include "ui/gfx/geometry/size.h" |
20 | 20 |
21 namespace { | 21 namespace { |
22 | 22 |
23 const int64_t kMaxImageSizeInBytes = | 23 const int64_t kMaxImageSizeInBytes = |
24 static_cast<int64_t>(IPC::Channel::kMaximumMessageSize); | 24 static_cast<int64_t>(IPC::Channel::kMaximumMessageSize); |
25 | 25 |
26 // Note that this is always called on the thread which initiated the | 26 // Note that this is always called on the thread which initiated the |
27 // corresponding image_decoder::Decode request. | 27 // corresponding data_decoder::DecodeImage request. |
28 void OnDecodeImageDone( | 28 void OnDecodeImageDone( |
29 base::Callback<void(int)> fail_callback, | 29 base::Callback<void(int)> fail_callback, |
30 base::Callback<void(const SkBitmap&, int)> success_callback, | 30 base::Callback<void(const SkBitmap&, int)> success_callback, |
31 int request_id, | 31 int request_id, |
32 const SkBitmap& image) { | 32 const SkBitmap& image) { |
33 if (!image.isNull() && !image.empty()) | 33 if (!image.isNull() && !image.empty()) |
34 success_callback.Run(image, request_id); | 34 success_callback.Run(image, request_id); |
35 else | 35 else |
36 fail_callback.Run(request_id); | 36 fail_callback.Run(request_id); |
37 } | 37 } |
38 | 38 |
39 void BindToBrowserConnector(service_manager::mojom::ConnectorRequest request) { | 39 void BindToBrowserConnector(service_manager::mojom::ConnectorRequest request) { |
40 if (!content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)) { | 40 if (!content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)) { |
41 content::BrowserThread::PostTask( | 41 content::BrowserThread::PostTask( |
42 content::BrowserThread::UI, FROM_HERE, | 42 content::BrowserThread::UI, FROM_HERE, |
43 base::Bind(&BindToBrowserConnector, base::Passed(&request))); | 43 base::Bind(&BindToBrowserConnector, base::Passed(&request))); |
44 return; | 44 return; |
45 } | 45 } |
46 | 46 |
47 content::ServiceManagerConnection::GetForProcess()->GetConnector() | 47 content::ServiceManagerConnection::GetForProcess()->GetConnector() |
48 ->BindConnectorRequest(std::move(request)); | 48 ->BindConnectorRequest(std::move(request)); |
49 } | 49 } |
50 | 50 |
51 void RunDecodeCallbackOnTaskRunner( | 51 void RunDecodeCallbackOnTaskRunner( |
52 const image_decoder::mojom::ImageDecoder::DecodeImageCallback& callback, | 52 const data_decoder::mojom::ImageDecoder::DecodeImageCallback& callback, |
53 scoped_refptr<base::SequencedTaskRunner> task_runner, | 53 scoped_refptr<base::SequencedTaskRunner> task_runner, |
54 const SkBitmap& image) { | 54 const SkBitmap& image) { |
55 task_runner->PostTask(FROM_HERE, base::Bind(callback, image)); | 55 task_runner->PostTask(FROM_HERE, base::Bind(callback, image)); |
56 } | 56 } |
57 | 57 |
58 void DecodeImage( | 58 void DecodeImage( |
59 std::vector<uint8_t> image_data, | 59 std::vector<uint8_t> image_data, |
60 image_decoder::mojom::ImageCodec codec, | 60 data_decoder::mojom::ImageCodec codec, |
61 bool shrink_to_fit, | 61 bool shrink_to_fit, |
62 const gfx::Size& desired_image_frame_size, | 62 const gfx::Size& desired_image_frame_size, |
63 const image_decoder::mojom::ImageDecoder::DecodeImageCallback& callback, | 63 const data_decoder::mojom::ImageDecoder::DecodeImageCallback& callback, |
64 scoped_refptr<base::SequencedTaskRunner> callback_task_runner) { | 64 scoped_refptr<base::SequencedTaskRunner> callback_task_runner) { |
65 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); | 65 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
66 | 66 |
67 service_manager::mojom::ConnectorRequest connector_request; | 67 service_manager::mojom::ConnectorRequest connector_request; |
68 std::unique_ptr<service_manager::Connector> connector = | 68 std::unique_ptr<service_manager::Connector> connector = |
69 service_manager::Connector::Create(&connector_request); | 69 service_manager::Connector::Create(&connector_request); |
70 BindToBrowserConnector(std::move(connector_request)); | 70 BindToBrowserConnector(std::move(connector_request)); |
71 | 71 |
72 image_decoder::Decode(connector.get(), image_data, codec, shrink_to_fit, | 72 data_decoder::DecodeImage(connector.get(), image_data, codec, shrink_to_fit, |
73 kMaxImageSizeInBytes, desired_image_frame_size, | 73 kMaxImageSizeInBytes, desired_image_frame_size, |
74 base::Bind(&RunDecodeCallbackOnTaskRunner, callback, | 74 base::Bind(&RunDecodeCallbackOnTaskRunner, callback, |
75 callback_task_runner)); | 75 callback_task_runner)); |
76 } | 76 } |
77 | 77 |
78 } // namespace | 78 } // namespace |
79 | 79 |
80 ImageDecoder::ImageRequest::ImageRequest() | 80 ImageDecoder::ImageRequest::ImageRequest() |
81 : task_runner_(base::ThreadTaskRunnerHandle::Get()) { | 81 : task_runner_(base::ThreadTaskRunnerHandle::Get()) { |
82 DCHECK(sequence_checker_.CalledOnValidSequence()); | 82 DCHECK(sequence_checker_.CalledOnValidSequence()); |
83 } | 83 } |
84 | 84 |
85 ImageDecoder::ImageRequest::ImageRequest( | 85 ImageDecoder::ImageRequest::ImageRequest( |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
145 DCHECK(image_request); | 145 DCHECK(image_request); |
146 DCHECK(image_request->task_runner()); | 146 DCHECK(image_request->task_runner()); |
147 | 147 |
148 int request_id; | 148 int request_id; |
149 { | 149 { |
150 base::AutoLock lock(map_lock_); | 150 base::AutoLock lock(map_lock_); |
151 request_id = image_request_id_counter_++; | 151 request_id = image_request_id_counter_++; |
152 image_request_id_map_.insert(std::make_pair(request_id, image_request)); | 152 image_request_id_map_.insert(std::make_pair(request_id, image_request)); |
153 } | 153 } |
154 | 154 |
155 image_decoder::mojom::ImageCodec codec = | 155 data_decoder::mojom::ImageCodec codec = |
156 image_decoder::mojom::ImageCodec::DEFAULT; | 156 data_decoder::mojom::ImageCodec::DEFAULT; |
157 #if defined(OS_CHROMEOS) | 157 #if defined(OS_CHROMEOS) |
158 if (image_codec == ROBUST_JPEG_CODEC) | 158 if (image_codec == ROBUST_JPEG_CODEC) |
159 codec = image_decoder::mojom::ImageCodec::ROBUST_JPEG; | 159 codec = data_decoder::mojom::ImageCodec::ROBUST_JPEG; |
160 if (image_codec == ROBUST_PNG_CODEC) | 160 if (image_codec == ROBUST_PNG_CODEC) |
161 codec = image_decoder::mojom::ImageCodec::ROBUST_PNG; | 161 codec = data_decoder::mojom::ImageCodec::ROBUST_PNG; |
162 #endif // defined(OS_CHROMEOS) | 162 #endif // defined(OS_CHROMEOS) |
163 | 163 |
164 auto callback = base::Bind( | 164 auto callback = base::Bind( |
165 &OnDecodeImageDone, | 165 &OnDecodeImageDone, |
166 base::Bind(&ImageDecoder::OnDecodeImageFailed, base::Unretained(this)), | 166 base::Bind(&ImageDecoder::OnDecodeImageFailed, base::Unretained(this)), |
167 base::Bind(&ImageDecoder::OnDecodeImageSucceeded, base::Unretained(this)), | 167 base::Bind(&ImageDecoder::OnDecodeImageSucceeded, base::Unretained(this)), |
168 request_id); | 168 request_id); |
169 | 169 |
170 // NOTE: There exist ImageDecoder consumers which implicitly rely on this | 170 // NOTE: There exist ImageDecoder consumers which implicitly rely on this |
171 // operation happening on a thread which always has a ThreadTaskRunnerHandle. | 171 // operation happening on a thread which always has a ThreadTaskRunnerHandle. |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
220 auto it = image_request_id_map_.find(request_id); | 220 auto it = image_request_id_map_.find(request_id); |
221 if (it == image_request_id_map_.end()) | 221 if (it == image_request_id_map_.end()) |
222 return; | 222 return; |
223 image_request = it->second; | 223 image_request = it->second; |
224 image_request_id_map_.erase(it); | 224 image_request_id_map_.erase(it); |
225 } | 225 } |
226 | 226 |
227 DCHECK(image_request->task_runner()->RunsTasksOnCurrentThread()); | 227 DCHECK(image_request->task_runner()->RunsTasksOnCurrentThread()); |
228 image_request->OnDecodeImageFailed(); | 228 image_request->OnDecodeImageFailed(); |
229 } | 229 } |
OLD | NEW |