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 // demuxer_bench is a standalone benchmarking tool for FFmpegDemuxer. It | 5 // demuxer_bench is a standalone benchmarking tool for FFmpegDemuxer. It |
6 // simulates the reading requirements for playback by reading from the stream | 6 // simulates the reading requirements for playback by reading from the stream |
7 // that has the earliest timestamp. | 7 // that has the earliest timestamp. |
8 | 8 |
9 #include <iostream> | 9 #include <iostream> |
10 | 10 |
(...skipping 19 matching lines...) Expand all Loading... |
30 | 30 |
31 // DataSourceHost implementation. | 31 // DataSourceHost implementation. |
32 virtual void SetTotalBytes(int64 total_bytes) OVERRIDE {} | 32 virtual void SetTotalBytes(int64 total_bytes) OVERRIDE {} |
33 virtual void AddBufferedByteRange(int64 start, int64 end) OVERRIDE {} | 33 virtual void AddBufferedByteRange(int64 start, int64 end) OVERRIDE {} |
34 virtual void AddBufferedTimeRange(base::TimeDelta start, | 34 virtual void AddBufferedTimeRange(base::TimeDelta start, |
35 base::TimeDelta end) OVERRIDE {} | 35 base::TimeDelta end) OVERRIDE {} |
36 | 36 |
37 // DemuxerHost implementation. | 37 // DemuxerHost implementation. |
38 virtual void SetDuration(base::TimeDelta duration) OVERRIDE {} | 38 virtual void SetDuration(base::TimeDelta duration) OVERRIDE {} |
39 virtual void OnDemuxerError(media::PipelineStatus error) OVERRIDE {} | 39 virtual void OnDemuxerError(media::PipelineStatus error) OVERRIDE {} |
| 40 virtual void AddTextStream(media::DemuxerStream* text_stream, |
| 41 media::TextKind kind, |
| 42 const std::string& label, |
| 43 const std::string& language) OVERRIDE {} |
40 | 44 |
41 private: | 45 private: |
42 DISALLOW_COPY_AND_ASSIGN(DemuxerHostImpl); | 46 DISALLOW_COPY_AND_ASSIGN(DemuxerHostImpl); |
43 }; | 47 }; |
44 | 48 |
45 void QuitLoopWithStatus(base::MessageLoop* message_loop, | 49 void QuitLoopWithStatus(base::MessageLoop* message_loop, |
46 media::PipelineStatus status) { | 50 media::PipelineStatus status) { |
47 CHECK_EQ(status, media::PIPELINE_OK); | 51 CHECK_EQ(status, media::PIPELINE_OK); |
48 message_loop->PostTask(FROM_HERE, base::MessageLoop::QuitWhenIdleClosure()); | 52 message_loop->PostTask(FROM_HERE, base::MessageLoop::QuitWhenIdleClosure()); |
49 } | 53 } |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
191 base::FilePath file_path(cmd_line->GetArgs()[0]); | 195 base::FilePath file_path(cmd_line->GetArgs()[0]); |
192 | 196 |
193 // Setup. | 197 // Setup. |
194 media::FileDataSource data_source; | 198 media::FileDataSource data_source; |
195 CHECK(data_source.Initialize(file_path)); | 199 CHECK(data_source.Initialize(file_path)); |
196 | 200 |
197 media::Demuxer::NeedKeyCB need_key_cb = base::Bind(&NeedKey); | 201 media::Demuxer::NeedKeyCB need_key_cb = base::Bind(&NeedKey); |
198 media::FFmpegDemuxer demuxer(message_loop.message_loop_proxy(), | 202 media::FFmpegDemuxer demuxer(message_loop.message_loop_proxy(), |
199 &data_source, | 203 &data_source, |
200 need_key_cb, | 204 need_key_cb, |
| 205 true, // enable inband text tracks |
201 new media::MediaLog()); | 206 new media::MediaLog()); |
202 | 207 |
203 demuxer.Initialize(&demuxer_host, base::Bind( | 208 demuxer.Initialize(&demuxer_host, base::Bind( |
204 &QuitLoopWithStatus, &message_loop)); | 209 &QuitLoopWithStatus, &message_loop)); |
205 message_loop.Run(); | 210 message_loop.Run(); |
206 | 211 |
207 StreamReader stream_reader( | 212 StreamReader stream_reader( |
208 &demuxer, cmd_line->HasSwitch(switches::kEnableBitstreamConverter)); | 213 &demuxer, cmd_line->HasSwitch(switches::kEnableBitstreamConverter)); |
209 | 214 |
210 // Benchmark. | 215 // Benchmark. |
211 base::TimeTicks start = base::TimeTicks::HighResNow(); | 216 base::TimeTicks start = base::TimeTicks::HighResNow(); |
212 while (!stream_reader.IsDone()) { | 217 while (!stream_reader.IsDone()) { |
213 stream_reader.Read(); | 218 stream_reader.Read(); |
214 } | 219 } |
215 base::TimeTicks end = base::TimeTicks::HighResNow(); | 220 base::TimeTicks end = base::TimeTicks::HighResNow(); |
216 | 221 |
217 // Results. | 222 // Results. |
218 std::cout << "Time: " << (end - start).InMillisecondsF() << " ms\n"; | 223 std::cout << "Time: " << (end - start).InMillisecondsF() << " ms\n"; |
219 for (int i = 0; i < stream_reader.number_of_streams(); ++i) { | 224 for (int i = 0; i < stream_reader.number_of_streams(); ++i) { |
220 media::DemuxerStream* stream = stream_reader.streams()[i]; | 225 media::DemuxerStream* stream = stream_reader.streams()[i]; |
221 std::cout << "Stream #" << i << ": "; | 226 std::cout << "Stream #" << i << ": "; |
222 | 227 |
223 if (stream->type() == media::DemuxerStream::AUDIO) { | 228 if (stream->type() == media::DemuxerStream::AUDIO) { |
224 std::cout << "audio"; | 229 std::cout << "audio"; |
225 } else if (stream->type() == media::DemuxerStream::VIDEO) { | 230 } else if (stream->type() == media::DemuxerStream::VIDEO) { |
226 std::cout << "video"; | 231 std::cout << "video"; |
| 232 } else if (stream->type() == media::DemuxerStream::TEXT) { |
| 233 std::cout << "text"; |
227 } else { | 234 } else { |
228 std::cout << "unknown"; | 235 std::cout << "unknown"; |
229 } | 236 } |
230 | 237 |
231 std::cout << ", " << stream_reader.counts()[i] << " packets" << std::endl; | 238 std::cout << ", " << stream_reader.counts()[i] << " packets" << std::endl; |
232 } | 239 } |
233 | 240 |
234 // Teardown. | 241 // Teardown. |
235 demuxer.Stop(base::Bind( | 242 demuxer.Stop(base::Bind( |
236 &QuitLoopWithStatus, &message_loop, media::PIPELINE_OK)); | 243 &QuitLoopWithStatus, &message_loop, media::PIPELINE_OK)); |
237 message_loop.Run(); | 244 message_loop.Run(); |
238 | 245 |
239 return 0; | 246 return 0; |
240 } | 247 } |
OLD | NEW |