10f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/at_exit.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind.h" 7ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/message_loop/message_loop.h" 8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_number_conversions.h" 90f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "base/time/time.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/base/media.h" 11a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "media/base/media_log.h" 120f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "media/base/test_data_util.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/filters/ffmpeg_demuxer.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/filters/file_data_source.h" 150f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 160f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "testing/perf/perf_test.h" 170f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)namespace media { 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)static const int kBenchmarkIterations = 500; 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DemuxerHostImpl : public media::DemuxerHost { 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DemuxerHostImpl() {} 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~DemuxerHostImpl() {} 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // DataSourceHost implementation. 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetTotalBytes(int64 total_bytes) OVERRIDE {} 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AddBufferedByteRange(int64 start, int64 end) OVERRIDE {} 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void AddBufferedTimeRange(base::TimeDelta start, 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta end) OVERRIDE {} 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // DemuxerHost implementation. 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetDuration(base::TimeDelta duration) OVERRIDE {} 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnDemuxerError(media::PipelineStatus error) OVERRIDE {} 36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void AddTextStream(media::DemuxerStream* text_stream, 37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const media::TextTrackConfig& config) OVERRIDE {} 38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void RemoveTextStream(media::DemuxerStream* text_stream) OVERRIDE {} 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DemuxerHostImpl); 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 440f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)static void QuitLoopWithStatus(base::MessageLoop* message_loop, 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) media::PipelineStatus status) { 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK_EQ(status, media::PIPELINE_OK); 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) message_loop->PostTask(FROM_HERE, base::MessageLoop::QuitWhenIdleClosure()); 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 50424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)static void NeedKey(const std::string& type, 51424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) const std::vector<uint8>& init_data) { 52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) VLOG(0) << "File is encrypted."; 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)typedef std::vector<media::DemuxerStream* > Streams; 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Simulates playback reading requirements by reading from each stream 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// present in |demuxer| in as-close-to-monotonically-increasing timestamp order. 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class StreamReader { 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) StreamReader(media::Demuxer* demuxer, bool enable_bitstream_converter); 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ~StreamReader(); 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Performs a single step read. 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void Read(); 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns true when all streams have reached end of stream. 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool IsDone(); 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int number_of_streams() { return static_cast<int>(streams_.size()); } 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const Streams& streams() { return streams_; } 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<int>& counts() { return counts_; } 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void OnReadDone(base::MessageLoop* message_loop, 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool* end_of_stream, 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta* timestamp, 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) media::DemuxerStream::Status status, 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const scoped_refptr<media::DecoderBuffer>& buffer); 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int GetNextStreamIndexToRead(); 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Streams streams_; 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<bool> end_of_stream_; 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<base::TimeDelta> last_read_timestamp_; 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<int> counts_; 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(StreamReader); 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)StreamReader::StreamReader(media::Demuxer* demuxer, 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool enable_bitstream_converter) { 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) media::DemuxerStream* stream = 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) demuxer->GetStream(media::DemuxerStream::AUDIO); 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (stream) { 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) streams_.push_back(stream); 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) end_of_stream_.push_back(false); 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_read_timestamp_.push_back(media::kNoTimestamp()); 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) counts_.push_back(0); 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) stream = demuxer->GetStream(media::DemuxerStream::VIDEO); 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (stream) { 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) streams_.push_back(stream); 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) end_of_stream_.push_back(false); 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_read_timestamp_.push_back(media::kNoTimestamp()); 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) counts_.push_back(0); 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (enable_bitstream_converter) 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) stream->EnableBitstreamConverter(); 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)StreamReader::~StreamReader() {} 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void StreamReader::Read() { 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int index = GetNextStreamIndexToRead(); 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool end_of_stream = false; 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta timestamp; 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) streams_[index]->Read(base::Bind( 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) &StreamReader::OnReadDone, base::Unretained(this), 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop::current(), &end_of_stream, ×tamp)); 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop::current()->Run(); 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CHECK(end_of_stream || timestamp != media::kNoTimestamp()); 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) end_of_stream_[index] = end_of_stream; 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_read_timestamp_[index] = timestamp; 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) counts_[index]++; 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool StreamReader::IsDone() { 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < end_of_stream_.size(); ++i) { 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!end_of_stream_[i]) 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void StreamReader::OnReadDone( 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop* message_loop, 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool* end_of_stream, 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta* timestamp, 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) media::DemuxerStream::Status status, 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const scoped_refptr<media::DecoderBuffer>& buffer) { 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK_EQ(status, media::DemuxerStream::kOk); 146868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) CHECK(buffer.get()); 147ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch *end_of_stream = buffer->end_of_stream(); 148ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch *timestamp = *end_of_stream ? media::kNoTimestamp() : buffer->timestamp(); 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) message_loop->PostTask(FROM_HERE, base::MessageLoop::QuitWhenIdleClosure()); 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int StreamReader::GetNextStreamIndexToRead() { 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int index = -1; 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (int i = 0; i < number_of_streams(); ++i) { 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Ignore streams at EOS. 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (end_of_stream_[i]) 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Use a stream if it hasn't been read from yet. 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (last_read_timestamp_[i] == media::kNoTimestamp()) 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return i; 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (index < 0 || 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_read_timestamp_[i] < last_read_timestamp_[index]) { 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) index = i; 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK_GE(index, 0) << "Couldn't find a stream to read"; 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return index; 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1720f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)static void RunDemuxerBenchmark(const std::string& filename) { 1730f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) base::FilePath file_path(GetTestDataFilePath(filename)); 1740f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) double total_time = 0.0; 1750f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) for (int i = 0; i < kBenchmarkIterations; ++i) { 1760f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // Setup. 1770f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) base::MessageLoop message_loop; 1780f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) DemuxerHostImpl demuxer_host; 1790f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) FileDataSource data_source; 1800f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) ASSERT_TRUE(data_source.Initialize(file_path)); 1810f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 1820f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) Demuxer::NeedKeyCB need_key_cb = base::Bind(&NeedKey); 1830f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) FFmpegDemuxer demuxer(message_loop.message_loop_proxy(), 1840f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) &data_source, 1850f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) need_key_cb, 1860f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) new MediaLog()); 1870f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 188f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) demuxer.Initialize(&demuxer_host, 189f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::Bind(&QuitLoopWithStatus, &message_loop), 190f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) false); 1910f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) message_loop.Run(); 1920f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) StreamReader stream_reader(&demuxer, false); 1930f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 1940f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // Benchmark. 1950f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) base::TimeTicks start = base::TimeTicks::HighResNow(); 1960f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) while (!stream_reader.IsDone()) { 1970f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) stream_reader.Read(); 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1990f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) base::TimeTicks end = base::TimeTicks::HighResNow(); 2000f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) total_time += (end - start).InSecondsF(); 2010f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) demuxer.Stop(base::Bind( 2020f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) &QuitLoopWithStatus, &message_loop, PIPELINE_OK)); 2030f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) message_loop.Run(); 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2060f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) perf_test::PrintResult("demuxer_bench", 2070f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) "", 2080f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) filename, 2090f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) kBenchmarkIterations / total_time, 2100f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) "runs/s", 2110f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) true); 2120f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2140f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)TEST(DemuxerPerfTest, Demuxer) { 215f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RunDemuxerBenchmark("bear.ogv"); 216f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RunDemuxerBenchmark("bear-640x360.webm"); 217f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RunDemuxerBenchmark("sfx_s16le.wav"); 2180f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#if defined(USE_PROPRIETARY_CODECS) 219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RunDemuxerBenchmark("bear-1280x720.mp4"); 220f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RunDemuxerBenchmark("sfx.mp3"); 2210f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#endif 2220f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#if defined(OS_CHROMEOS) 223f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RunDemuxerBenchmark("bear.flac"); 2240f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#endif 2250f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#if defined(USE_PROPRIETARY_CODECS) && defined(OS_CHROMEOS) 226f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RunDemuxerBenchmark("bear.avi"); 2270f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#endif 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2290f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 2300f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} // namespace media 231