OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 // This tool can be used to measure performace of video frame scaling | 5 // This tool can be used to measure performace of video frame scaling |
6 // code. It times performance of the scaler with and without filtering. | 6 // code. It times performance of the scaler with and without filtering. |
7 // It also measures performance of the Skia scaler for comparison. | 7 // It also measures performance of the Skia scaler for comparison. |
8 | 8 |
9 #include <iostream> | 9 #include <iostream> |
10 #include <vector> | 10 #include <vector> |
11 | 11 |
12 #include "base/command_line.h" | 12 #include "base/command_line.h" |
13 #include "base/scoped_vector.h" | 13 #include "base/scoped_vector.h" |
14 #include "base/scoped_ptr.h" | 14 #include "base/scoped_ptr.h" |
15 #include "base/string_number_conversions.h" | 15 #include "base/string_number_conversions.h" |
16 #include "base/time.h" | 16 #include "base/time.h" |
17 #include "media/base/video_frame.h" | 17 #include "media/base/video_frame.h" |
18 #include "media/base/yuv_convert.h" | 18 #include "media/base/yuv_convert.h" |
19 #include "skia/ext/platform_canvas.h" | 19 #include "skia/ext/platform_canvas.h" |
20 | 20 |
21 using base::TimeDelta; | 21 using base::TimeDelta; |
22 using base::TimeTicks; | 22 using base::TimeTicks; |
23 using media::VideoFrame; | 23 using media::VideoFrame; |
24 | 24 |
25 namespace { | 25 static int source_width = 1280; |
| 26 static int source_height = 720; |
| 27 static int dest_width = 1366; |
| 28 static int dest_height = 768; |
| 29 static int num_frames = 500; |
| 30 static int num_buffers = 50; |
26 | 31 |
27 int source_width = 1280; | 32 static double BenchmarkSkia() { |
28 int source_height = 720; | |
29 int dest_width = 1366; | |
30 int dest_height = 768; | |
31 int num_frames = 500; | |
32 int num_buffers = 50; | |
33 | |
34 double BenchmarkSkia() { | |
35 std::vector<scoped_refptr<VideoFrame> > source_frames; | 33 std::vector<scoped_refptr<VideoFrame> > source_frames; |
36 ScopedVector<SkBitmap> dest_frames; | 34 ScopedVector<SkBitmap> dest_frames; |
37 for (int i = 0; i < num_buffers; i++) { | 35 for (int i = 0; i < num_buffers; i++) { |
38 scoped_refptr<VideoFrame> source_frame; | 36 scoped_refptr<VideoFrame> source_frame; |
39 VideoFrame::CreateBlackFrame(source_width, source_height, &source_frame); | 37 VideoFrame::CreateBlackFrame(source_width, source_height, &source_frame); |
40 source_frames.push_back(source_frame); | 38 source_frames.push_back(source_frame); |
41 | 39 |
42 SkBitmap* bitmap = new SkBitmap(); | 40 SkBitmap* bitmap = new SkBitmap(); |
43 bitmap->setConfig(SkBitmap::kARGB_8888_Config, | 41 bitmap->setConfig(SkBitmap::kARGB_8888_Config, |
44 dest_width, dest_height); | 42 dest_width, dest_height); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
80 SkIntToScalar(dest_height) / | 78 SkIntToScalar(dest_height) / |
81 SkIntToScalar(source_height)); | 79 SkIntToScalar(source_height)); |
82 SkPaint paint; | 80 SkPaint paint; |
83 paint.setFlags(SkPaint::kFilterBitmap_Flag); | 81 paint.setFlags(SkPaint::kFilterBitmap_Flag); |
84 canvas.drawBitmapMatrix(bitmap, matrix, &paint); | 82 canvas.drawBitmapMatrix(bitmap, matrix, &paint); |
85 } | 83 } |
86 TimeTicks end = TimeTicks::HighResNow(); | 84 TimeTicks end = TimeTicks::HighResNow(); |
87 return static_cast<double>((end - start).InMilliseconds()) / num_frames; | 85 return static_cast<double>((end - start).InMilliseconds()) / num_frames; |
88 } | 86 } |
89 | 87 |
90 double BenchmarkRGBToYUV() { | 88 static double BenchmarkRGBToYUV() { |
91 int rgb_stride = source_width * 4; | 89 int rgb_stride = source_width * 4; |
92 scoped_array<uint8> rgb_frame(new uint8[rgb_stride * source_height]); | 90 scoped_array<uint8> rgb_frame(new uint8[rgb_stride * source_height]); |
93 | 91 |
94 int y_stride = source_width; | 92 int y_stride = source_width; |
95 int uv_stride = source_width / 2; | 93 int uv_stride = source_width / 2; |
96 scoped_array<uint8> y_plane(new uint8[y_stride * source_height]); | 94 scoped_array<uint8> y_plane(new uint8[y_stride * source_height]); |
97 scoped_array<uint8> u_plane(new uint8[uv_stride * source_height / 2]); | 95 scoped_array<uint8> u_plane(new uint8[uv_stride * source_height / 2]); |
98 scoped_array<uint8> v_plane(new uint8[uv_stride * source_height / 2]); | 96 scoped_array<uint8> v_plane(new uint8[uv_stride * source_height / 2]); |
99 | 97 |
100 TimeTicks start = TimeTicks::HighResNow(); | 98 TimeTicks start = TimeTicks::HighResNow(); |
101 | 99 |
102 for (int i = 0; i < num_frames; ++i) { | 100 for (int i = 0; i < num_frames; ++i) { |
103 media::ConvertRGB32ToYUV(rgb_frame.get(), | 101 media::ConvertRGB32ToYUV(rgb_frame.get(), |
104 y_plane.get(), | 102 y_plane.get(), |
105 u_plane.get(), | 103 u_plane.get(), |
106 v_plane.get(), | 104 v_plane.get(), |
107 source_width, | 105 source_width, |
108 source_height, | 106 source_height, |
109 rgb_stride, | 107 rgb_stride, |
110 y_stride, | 108 y_stride, |
111 uv_stride); | 109 uv_stride); |
112 } | 110 } |
113 | 111 |
114 TimeTicks end = TimeTicks::HighResNow(); | 112 TimeTicks end = TimeTicks::HighResNow(); |
115 return static_cast<double>((end - start).InMilliseconds()) / num_frames; | 113 return static_cast<double>((end - start).InMilliseconds()) / num_frames; |
116 } | 114 } |
117 | 115 |
118 double BenchmarkFilter(media::ScaleFilter filter) { | 116 static double BenchmarkFilter(media::ScaleFilter filter) { |
119 std::vector<scoped_refptr<VideoFrame> > source_frames; | 117 std::vector<scoped_refptr<VideoFrame> > source_frames; |
120 std::vector<scoped_refptr<VideoFrame> > dest_frames; | 118 std::vector<scoped_refptr<VideoFrame> > dest_frames; |
121 | 119 |
122 for (int i = 0; i < num_buffers; i++) { | 120 for (int i = 0; i < num_buffers; i++) { |
123 scoped_refptr<VideoFrame> source_frame; | 121 scoped_refptr<VideoFrame> source_frame; |
124 VideoFrame::CreateBlackFrame(source_width, source_height, &source_frame); | 122 VideoFrame::CreateBlackFrame(source_width, source_height, &source_frame); |
125 source_frames.push_back(source_frame); | 123 source_frames.push_back(source_frame); |
126 | 124 |
127 scoped_refptr<VideoFrame> dest_frame; | 125 scoped_refptr<VideoFrame> dest_frame; |
128 VideoFrame::CreateFrame(VideoFrame::RGB32, | 126 VideoFrame::CreateFrame(VideoFrame::RGB32, |
(...skipping 22 matching lines...) Expand all Loading... |
151 source_frame->stride(VideoFrame::kUPlane), | 149 source_frame->stride(VideoFrame::kUPlane), |
152 dest_frame->stride(0), | 150 dest_frame->stride(0), |
153 media::YV12, | 151 media::YV12, |
154 media::ROTATE_0, | 152 media::ROTATE_0, |
155 filter); | 153 filter); |
156 } | 154 } |
157 TimeTicks end = TimeTicks::HighResNow(); | 155 TimeTicks end = TimeTicks::HighResNow(); |
158 return static_cast<double>((end - start).InMilliseconds()) / num_frames; | 156 return static_cast<double>((end - start).InMilliseconds()) / num_frames; |
159 } | 157 } |
160 | 158 |
161 } // namespace | |
162 | |
163 int main(int argc, const char** argv) { | 159 int main(int argc, const char** argv) { |
164 CommandLine::Init(argc, argv); | 160 CommandLine::Init(argc, argv); |
165 const CommandLine* cmd_line = CommandLine::ForCurrentProcess(); | 161 const CommandLine* cmd_line = CommandLine::ForCurrentProcess(); |
166 | 162 |
167 if (!cmd_line->args().empty()) { | 163 if (!cmd_line->args().empty()) { |
168 std::cerr << "Usage: " << argv[0] << " [OPTIONS]\n" | 164 std::cerr << "Usage: " << argv[0] << " [OPTIONS]\n" |
169 << " --frames=N " | 165 << " --frames=N " |
170 << "Number of frames\n" | 166 << "Number of frames\n" |
171 << " --buffers=N " | 167 << " --buffers=N " |
172 << "Number of buffers\n" | 168 << "Number of buffers\n" |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
235 << BenchmarkFilter(media::FILTER_BILINEAR_V) | 231 << BenchmarkFilter(media::FILTER_BILINEAR_V) |
236 << "ms/frame" << std::endl; | 232 << "ms/frame" << std::endl; |
237 std::cout << "Bilinear Horizontal: " | 233 std::cout << "Bilinear Horizontal: " |
238 << BenchmarkFilter(media::FILTER_BILINEAR_H) | 234 << BenchmarkFilter(media::FILTER_BILINEAR_H) |
239 << "ms/frame" << std::endl; | 235 << "ms/frame" << std::endl; |
240 std::cout << "Bilinear: " << BenchmarkFilter(media::FILTER_BILINEAR) | 236 std::cout << "Bilinear: " << BenchmarkFilter(media::FILTER_BILINEAR) |
241 << "ms/frame" << std::endl; | 237 << "ms/frame" << std::endl; |
242 | 238 |
243 return 0; | 239 return 0; |
244 } | 240 } |
OLD | NEW |