diff options
Diffstat (limited to 'chromium/media/fuchsia')
13 files changed, 69 insertions, 469 deletions
diff --git a/chromium/media/fuchsia/audio/fuchsia_audio_renderer.cc b/chromium/media/fuchsia/audio/fuchsia_audio_renderer.cc index b4f6476516c..0b1c04bca4c 100644 --- a/chromium/media/fuchsia/audio/fuchsia_audio_renderer.cc +++ b/chromium/media/fuchsia/audio/fuchsia_audio_renderer.cc @@ -7,7 +7,6 @@ #include <lib/sys/cpp/component_context.h> #include "base/bind.h" -#include "base/fuchsia/default_context.h" #include "base/fuchsia/fuchsia_logging.h" #include "base/logging.h" #include "base/sequenced_task_runner.h" @@ -235,6 +234,8 @@ void FuchsiaAudioRenderer::SetLatencyHint( // shape and usefulness outside of fuchsia. } +void FuchsiaAudioRenderer::SetPreservesPitch(bool preserves_pitch) {} + void FuchsiaAudioRenderer::StartTicking() { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); @@ -290,8 +291,10 @@ void FuchsiaAudioRenderer::SetMediaTime(base::TimeDelta time) { base::TimeDelta FuchsiaAudioRenderer::CurrentMediaTime() { base::AutoLock lock(timeline_lock_); - if (state_ != PlaybackState::kPlaying) + if (state_ != PlaybackState::kPlaying && + state_ != PlaybackState::kEndOfStream) { return media_pos_; + } return CurrentMediaTimeLocked(); } @@ -304,7 +307,8 @@ bool FuchsiaAudioRenderer::GetWallClockTimes( base::AutoLock lock(timeline_lock_); - const bool is_time_moving = state_ == PlaybackState::kPlaying; + const bool is_time_moving = state_ == PlaybackState::kPlaying || + state_ == PlaybackState::kEndOfStream; if (media_timestamps.empty()) { wall_clock_times->push_back(is_time_moving ? now : base::TimeTicks()); @@ -428,8 +432,7 @@ void FuchsiaAudioRenderer::OnAudioConsumerStatusChanged( void FuchsiaAudioRenderer::ScheduleReadDemuxerStream() { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - if (!demuxer_stream_ || read_timer_.IsRunning() || - demuxer_stream_->IsReadPending() || + if (!demuxer_stream_ || read_timer_.IsRunning() || is_demuxer_read_pending_ || GetPlaybackState() == PlaybackState::kEndOfStream || num_pending_packets_ >= stream_sink_buffers_.size()) { return; @@ -456,7 +459,9 @@ void FuchsiaAudioRenderer::ScheduleReadDemuxerStream() { void FuchsiaAudioRenderer::ReadDemuxerStream() { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); DCHECK(demuxer_stream_); + DCHECK(!is_demuxer_read_pending_); + is_demuxer_read_pending_ = true; demuxer_stream_->Read( base::BindOnce(&FuchsiaAudioRenderer::OnDemuxerStreamReadDone, weak_factory_.GetWeakPtr())); @@ -466,6 +471,9 @@ void FuchsiaAudioRenderer::OnDemuxerStreamReadDone( DemuxerStream::Status read_status, scoped_refptr<DecoderBuffer> buffer) { DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); + DCHECK(is_demuxer_read_pending_); + + is_demuxer_read_pending_ = false; if (read_status != DemuxerStream::kOk) { if (read_status == DemuxerStream::kError) { diff --git a/chromium/media/fuchsia/audio/fuchsia_audio_renderer.h b/chromium/media/fuchsia/audio/fuchsia_audio_renderer.h index b22ff67d179..fec88cb1a2f 100644 --- a/chromium/media/fuchsia/audio/fuchsia_audio_renderer.h +++ b/chromium/media/fuchsia/audio/fuchsia_audio_renderer.h @@ -43,6 +43,7 @@ class FuchsiaAudioRenderer : public AudioRenderer, public TimeSource { void StartPlaying() final; void SetVolume(float volume) final; void SetLatencyHint(base::Optional<base::TimeDelta> latency_hint) final; + void SetPreservesPitch(bool preserves_pitch) final; // TimeSource implementation. void StartTicking() final; @@ -132,6 +133,8 @@ class FuchsiaAudioRenderer : public AudioRenderer, public TimeSource { fuchsia::media::audio::VolumeControlPtr volume_control_; DemuxerStream* demuxer_stream_ = nullptr; + bool is_demuxer_read_pending_ = false; + RendererClient* client_ = nullptr; // Initialize() completion callback. diff --git a/chromium/media/fuchsia/camera/fake_fuchsia_camera.cc b/chromium/media/fuchsia/camera/fake_fuchsia_camera.cc index 921a1b6cfb1..cae3ecab9f6 100644 --- a/chromium/media/fuchsia/camera/fake_fuchsia_camera.cc +++ b/chromium/media/fuchsia/camera/fake_fuchsia_camera.cc @@ -7,7 +7,7 @@ #include <fuchsia/sysmem/cpp/fidl.h> #include <lib/sys/cpp/component_context.h> -#include "base/fuchsia/default_context.h" +#include "base/fuchsia/process_context.h" #include "base/memory/platform_shared_memory_region.h" #include "base/memory/writable_shared_memory_region.h" #include "base/message_loop/message_loop_current.h" @@ -290,7 +290,7 @@ void FakeCameraStream::SetBufferCollection( SendBufferCollection(); // Initialize the new collection using |local_token|. - auto allocator = base::fuchsia::ComponentContextForCurrentProcess() + auto allocator = base::ComponentContextForProcess() ->svc() ->Connect<fuchsia::sysmem::Allocator>(); diff --git a/chromium/media/fuchsia/cdm/fuchsia_cdm_factory.cc b/chromium/media/fuchsia/cdm/fuchsia_cdm_factory.cc index a95c5e3e597..0f2e5828ffb 100644 --- a/chromium/media/fuchsia/cdm/fuchsia_cdm_factory.cc +++ b/chromium/media/fuchsia/cdm/fuchsia_cdm_factory.cc @@ -25,7 +25,6 @@ FuchsiaCdmFactory::~FuchsiaCdmFactory() = default; void FuchsiaCdmFactory::Create( const std::string& key_system, - const url::Origin& security_origin, const CdmConfig& cdm_config, const SessionMessageCB& session_message_cb, const SessionClosedCB& session_closed_cb, @@ -35,11 +34,6 @@ void FuchsiaCdmFactory::Create( CdmCreatedCB bound_cdm_created_cb = BindToCurrentLoop(std::move(cdm_created_cb)); - if (security_origin.opaque()) { - std::move(bound_cdm_created_cb).Run(nullptr, "Invalid origin."); - return; - } - if (CanUseAesDecryptor(key_system)) { auto cdm = base::MakeRefCounted<AesDecryptor>( session_message_cb, session_closed_cb, session_keys_change_cb, diff --git a/chromium/media/fuchsia/cdm/fuchsia_cdm_factory.h b/chromium/media/fuchsia/cdm/fuchsia_cdm_factory.h index ad8cd9248e9..76f4c05d6da 100644 --- a/chromium/media/fuchsia/cdm/fuchsia_cdm_factory.h +++ b/chromium/media/fuchsia/cdm/fuchsia_cdm_factory.h @@ -22,7 +22,6 @@ class MEDIA_EXPORT FuchsiaCdmFactory : public CdmFactory { // CdmFactory implementation. void Create(const std::string& key_system, - const url::Origin& security_origin, const CdmConfig& cdm_config, const SessionMessageCB& session_message_cb, const SessionClosedCB& session_closed_cb, diff --git a/chromium/media/fuchsia/common/sysmem_buffer_pool.cc b/chromium/media/fuchsia/common/sysmem_buffer_pool.cc index 94c1a1f43d9..2b4b0b5487a 100644 --- a/chromium/media/fuchsia/common/sysmem_buffer_pool.cc +++ b/chromium/media/fuchsia/common/sysmem_buffer_pool.cc @@ -8,8 +8,8 @@ #include <algorithm> #include "base/bind.h" -#include "base/fuchsia/default_context.h" #include "base/fuchsia/fuchsia_logging.h" +#include "base/fuchsia/process_context.h" #include "media/fuchsia/common/sysmem_buffer_reader.h" #include "media/fuchsia/common/sysmem_buffer_writer.h" @@ -126,7 +126,7 @@ void SysmemBufferPool::OnError() { } BufferAllocator::BufferAllocator() { - allocator_ = base::fuchsia::ComponentContextForCurrentProcess() + allocator_ = base::ComponentContextForProcess() ->svc() ->Connect<fuchsia::sysmem::Allocator>(); diff --git a/chromium/media/fuchsia/common/sysmem_buffer_writer.cc b/chromium/media/fuchsia/common/sysmem_buffer_writer.cc index addfafb6e94..0942b9f5337 100644 --- a/chromium/media/fuchsia/common/sysmem_buffer_writer.cc +++ b/chromium/media/fuchsia/common/sysmem_buffer_writer.cc @@ -70,16 +70,30 @@ class SysmemBufferWriter::Buffer { size_t bytes_to_fill = std::min(size_, data.size()); memcpy(base_address_ + offset_, data.data(), bytes_to_fill); - // Flush CPU cache if StreamProcessor reads from RAM. - if (coherency_domain_ == fuchsia::sysmem::CoherencyDomain::RAM) { - zx_status_t status = zx_cache_flush(base_address_ + offset_, - bytes_to_fill, ZX_CACHE_FLUSH_DATA); - ZX_DCHECK(status == ZX_OK, status) << "zx_cache_flush"; - } + FlushBuffer(0, bytes_to_fill); return bytes_to_fill; } + base::span<uint8_t> ReserveAndMapBuffer() { + DCHECK(!is_used_); + is_used_ = true; + return base::make_span(base_address_ + offset_, size_); + } + + void FlushBuffer(size_t flush_offset, size_t flush_size) { + DCHECK(is_used_); + DCHECK_LE(flush_size, size_ - flush_offset); + + if (coherency_domain_ != fuchsia::sysmem::CoherencyDomain::RAM) + return; + + uint8_t* address = base_address_ + offset_ + flush_offset; + zx_status_t status = + zx_cache_flush(address, flush_size, ZX_CACHE_FLUSH_DATA); + ZX_DCHECK(status == ZX_OK, status) << "zx_cache_flush"; + } + void Release() { is_used_ = false; } private: @@ -187,4 +201,16 @@ SysmemBufferWriter::GetRecommendedConstraints( return buffer_constraints; } +base::span<uint8_t> SysmemBufferWriter::ReserveAndMapBuffer(size_t index) { + DCHECK_LT(index, buffers_.size()); + return buffers_[index].ReserveAndMapBuffer(); +} + +void SysmemBufferWriter::FlushBuffer(size_t index, + size_t flush_offset, + size_t flush_size) { + DCHECK_LT(index, buffers_.size()); + return buffers_[index].FlushBuffer(flush_offset, flush_size); +} + } // namespace media diff --git a/chromium/media/fuchsia/common/sysmem_buffer_writer.h b/chromium/media/fuchsia/common/sysmem_buffer_writer.h index 9aed936f2b2..aaee25c1449 100644 --- a/chromium/media/fuchsia/common/sysmem_buffer_writer.h +++ b/chromium/media/fuchsia/common/sysmem_buffer_writer.h @@ -11,6 +11,7 @@ #include <memory> #include "base/containers/span.h" +#include "base/memory/shared_memory_mapping.h" #include "base/optional.h" namespace media { @@ -30,11 +31,24 @@ class SysmemBufferWriter { explicit SysmemBufferWriter(std::vector<Buffer> buffers); ~SysmemBufferWriter(); - // Write the content of |data| into buffer at |index|. Return num of bytes - // written into the buffer. Write a used buffer will fail. It will mark the - // buffer as "used". + SysmemBufferWriter(const SysmemBufferWriter&) = delete; + SysmemBufferWriter& operator=(const SysmemBufferWriter&) = delete; + + // Write the content of |data| into the buffer at |index|. Return num of bytes + // written into the buffer. Can be called only for an unused buffer. Marks + // the buffer as used. size_t Write(size_t index, base::span<const uint8_t> data); + // Returns a span for the memory-mapping of the buffer with the specified + // |index|. Can be called only for an unused buffer. Marks the buffer as used. + // Callers must call FlushCache() after they are finished updating the buffer. + base::span<uint8_t> ReserveAndMapBuffer(size_t index); + + // Flushes CPU cache for specified range in the buffer with the specified + // |index| in case the buffer collection uses RAM coherency. No-op for + // collections with RAM coherency. + void FlushBuffer(size_t index, size_t flush_offset, size_t flush_size); + // Acquire unused buffer for write. If |min_size| is provided, the returned // buffer will have available size larger than |min_size|. This will NOT // mark the buffer as "used". @@ -50,8 +64,6 @@ class SysmemBufferWriter { private: std::vector<Buffer> buffers_; - - DISALLOW_COPY_AND_ASSIGN(SysmemBufferWriter); }; } // namespace media diff --git a/chromium/media/fuchsia/metrics/BUILD.gn b/chromium/media/fuchsia/metrics/BUILD.gn deleted file mode 100644 index ee6952ba233..00000000000 --- a/chromium/media/fuchsia/metrics/BUILD.gn +++ /dev/null @@ -1,28 +0,0 @@ -# Copyright 2020 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -source_set("metrics") { - sources = [ - "fuchsia_playback_events_recorder.cc", - "fuchsia_playback_events_recorder.h", - ] - deps = [ - "//media/mojo/mojom", - "//mojo/public/cpp/bindings", - ] -} - -source_set("unittests") { - testonly = true - - deps = [ - ":metrics", - "//base", - "//base/test:test_support", - "//media", - "//testing/gtest", - ] - - sources = [ "fuchsia_playback_events_recorder_test.cc" ] -} diff --git a/chromium/media/fuchsia/metrics/DEPS b/chromium/media/fuchsia/metrics/DEPS deleted file mode 100644 index ef8ad28d9d4..00000000000 --- a/chromium/media/fuchsia/metrics/DEPS +++ /dev/null @@ -1,3 +0,0 @@ -include_rules = [ - "+mojo/public", -] diff --git a/chromium/media/fuchsia/metrics/fuchsia_playback_events_recorder.cc b/chromium/media/fuchsia/metrics/fuchsia_playback_events_recorder.cc deleted file mode 100644 index d883b08b38a..00000000000 --- a/chromium/media/fuchsia/metrics/fuchsia_playback_events_recorder.cc +++ /dev/null @@ -1,139 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "media/fuchsia/metrics/fuchsia_playback_events_recorder.h" - -#include "base/metrics/user_metrics.h" -#include "base/strings/stringprintf.h" -#include "mojo/public/cpp/bindings/self_owned_receiver.h" - -namespace media { - -namespace { - -void RecordEventWithValueAt(const char* name, - int64_t value, - base::TimeTicks time) { - base::RecordComputedActionAt( - base::StringPrintf("WebEngine.Media.%s:%ld", name, value), time); -} - -void RecordEventWithValue(const char* name, int64_t value) { - RecordEventWithValueAt(name, value, base::TimeTicks::Now()); -} - -constexpr base::TimeDelta kBitrateReportPeriod = - base::TimeDelta::FromSeconds(5); - -} // namespace - -FuchsiaPlaybackEventsRecorder::BitrateEstimator::BitrateEstimator() {} -FuchsiaPlaybackEventsRecorder::BitrateEstimator::~BitrateEstimator() {} - -void FuchsiaPlaybackEventsRecorder::BitrateEstimator::Update( - const PipelineStatistics& stats) { - base::TimeTicks now = base::TimeTicks::Now(); - - // The code below trusts that |stats| are valid even though they came from an - // untrusted process. That's accepable because the stats are used only to - // record metrics. - if (last_stats_) { - time_elapsed_ += now - last_stats_time_; - audio_bytes_ += - stats.audio_bytes_decoded - last_stats_->audio_bytes_decoded; - video_bytes_ += - stats.video_bytes_decoded - last_stats_->video_bytes_decoded; - if (time_elapsed_ >= kBitrateReportPeriod) { - size_t audio_bitrate_kbps = - 8 * audio_bytes_ / time_elapsed_.InMilliseconds(); - RecordEventWithValueAt("AudioBitrate", audio_bitrate_kbps, now); - - size_t video_bitrate_kbps = - 8 * video_bytes_ / time_elapsed_.InMilliseconds(); - RecordEventWithValueAt("VideoBitrate", video_bitrate_kbps, now); - - time_elapsed_ = base::TimeDelta(); - audio_bytes_ = 0; - video_bytes_ = 0; - } - } - - last_stats_ = stats; - last_stats_time_ = now; -} - -void FuchsiaPlaybackEventsRecorder::BitrateEstimator::OnPause() { - last_stats_ = {}; -} - -// static -void FuchsiaPlaybackEventsRecorder::Create( - mojo::PendingReceiver<mojom::PlaybackEventsRecorder> receiver) { - mojo::MakeSelfOwnedReceiver(std::make_unique<FuchsiaPlaybackEventsRecorder>(), - std::move(receiver)); -} - -FuchsiaPlaybackEventsRecorder::FuchsiaPlaybackEventsRecorder() = default; -FuchsiaPlaybackEventsRecorder::~FuchsiaPlaybackEventsRecorder() = default; - -void FuchsiaPlaybackEventsRecorder::OnPlaying() { - base::RecordComputedAction("WebEngine.Media.Playing"); -} - -void FuchsiaPlaybackEventsRecorder::OnPaused() { - base::RecordComputedAction("WebEngine.Media.Pause"); - bitrate_estimator_.OnPause(); -} - -void FuchsiaPlaybackEventsRecorder::OnSeeking() { - buffering_state_ = BufferingState::kInitialBuffering; -} - -void FuchsiaPlaybackEventsRecorder::OnEnded() { - base::RecordComputedAction("WebEngine.Media.Ended"); -} - -void FuchsiaPlaybackEventsRecorder::OnBuffering() { - DCHECK(buffering_state_ == BufferingState::kBuffered); - - buffering_start_time_ = base::TimeTicks::Now(); - buffering_state_ = BufferingState::kBuffering; - - bitrate_estimator_.OnPause(); -} - -void FuchsiaPlaybackEventsRecorder::OnBufferingComplete() { - auto now = base::TimeTicks::Now(); - - if (buffering_state_ == BufferingState::kBuffering) { - base::TimeDelta time_between_buffering = - buffering_start_time_ - last_buffering_end_time_; - RecordEventWithValueAt("PlayTimeBeforeAutoPause", - time_between_buffering.InMilliseconds(), now); - - base::TimeDelta buffering_user_time = now - buffering_start_time_; - RecordEventWithValueAt("AutoPauseTime", - buffering_user_time.InMilliseconds(), now); - } - - buffering_state_ = BufferingState::kBuffered; - last_buffering_end_time_ = now; -} - -void FuchsiaPlaybackEventsRecorder::OnError(PipelineStatus status) { - RecordEventWithValue("Error", status); -} - -void FuchsiaPlaybackEventsRecorder::OnNaturalSizeChanged( - const gfx::Size& size) { - base::RecordComputedAction(base::StringPrintf( - "WebEngine.Media.VideoResolution:%dx%d", size.width(), size.height())); -} - -void FuchsiaPlaybackEventsRecorder::OnPipelineStatistics( - const PipelineStatistics& stats) { - bitrate_estimator_.Update(stats); -} - -} // namespace media diff --git a/chromium/media/fuchsia/metrics/fuchsia_playback_events_recorder.h b/chromium/media/fuchsia/metrics/fuchsia_playback_events_recorder.h deleted file mode 100644 index 2686bafec9e..00000000000 --- a/chromium/media/fuchsia/metrics/fuchsia_playback_events_recorder.h +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MEDIA_FUCHSIA_METRICS_FUCHSIA_PLAYBACK_EVENTS_RECORDER_H_ -#define MEDIA_FUCHSIA_METRICS_FUCHSIA_PLAYBACK_EVENTS_RECORDER_H_ - -#include "media/mojo/mojom/playback_events_recorder.mojom.h" -#include "mojo/public/cpp/bindings/pending_remote.h" -#include "mojo/public/cpp/bindings/remote.h" - -namespace media { - -class FuchsiaPlaybackEventsRecorder : public mojom::PlaybackEventsRecorder { - public: - static void Create( - mojo::PendingReceiver<mojom::PlaybackEventsRecorder> receiver); - - FuchsiaPlaybackEventsRecorder(); - ~FuchsiaPlaybackEventsRecorder() final; - - FuchsiaPlaybackEventsRecorder(const FuchsiaPlaybackEventsRecorder&) = delete; - FuchsiaPlaybackEventsRecorder& operator=( - const FuchsiaPlaybackEventsRecorder&) = delete; - - // mojom::PlaybackEventsRecorder implementation. - void OnPlaying() final; - void OnPaused() final; - void OnSeeking() final; - void OnEnded() final; - void OnBuffering() final; - void OnBufferingComplete() final; - void OnError(PipelineStatus status) final; - void OnNaturalSizeChanged(const gfx::Size& size) final; - void OnPipelineStatistics(const PipelineStatistics& stats) final; - - private: - class BitrateEstimator { - public: - BitrateEstimator(); - ~BitrateEstimator(); - - void Update(const PipelineStatistics& stats); - void OnPause(); - - private: - base::TimeDelta time_elapsed_; - size_t audio_bytes_ = 0; - size_t video_bytes_ = 0; - - base::Optional<PipelineStatistics> last_stats_; - base::TimeTicks last_stats_time_; - }; - - enum class BufferingState { - kInitialBuffering, - kBuffering, - kBuffered, - }; - - BufferingState buffering_state_ = BufferingState::kInitialBuffering; - base::TimeTicks buffering_start_time_; - base::TimeTicks last_buffering_end_time_; - - BitrateEstimator bitrate_estimator_; -}; - -} // namespace media - -#endif // MEDIA_FUCHSIA_METRICS_FUCHSIA_PLAYBACK_EVENTS_RECORDER_H_
\ No newline at end of file diff --git a/chromium/media/fuchsia/metrics/fuchsia_playback_events_recorder_test.cc b/chromium/media/fuchsia/metrics/fuchsia_playback_events_recorder_test.cc deleted file mode 100644 index a18704575a2..00000000000 --- a/chromium/media/fuchsia/metrics/fuchsia_playback_events_recorder_test.cc +++ /dev/null @@ -1,202 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "media/fuchsia/metrics/fuchsia_playback_events_recorder.h" - -#include "base/metrics/user_metrics.h" -#include "base/test/simple_test_tick_clock.h" -#include "base/test/task_environment.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace media { - -constexpr base::TimeDelta kSecond = base::TimeDelta::FromSeconds(1); - -class FuchsiaPlaybackEventsRecorderTest : public testing::Test { - public: - FuchsiaPlaybackEventsRecorderTest() - : task_environment_(base::test::TaskEnvironment::MainThreadType::IO, - base::test::TaskEnvironment::TimeSource::MOCK_TIME) { - time_base_ = base::TimeTicks::Now(); - - base::SetRecordActionTaskRunner( - task_environment_.GetMainThreadTaskRunner()); - action_callback_ = base::BindRepeating( - &FuchsiaPlaybackEventsRecorderTest::OnAction, base::Unretained(this)); - base::AddActionCallback(action_callback_); - } - - ~FuchsiaPlaybackEventsRecorderTest() override { - base::RemoveActionCallback(action_callback_); - } - - protected: - struct Event { - base::TimeTicks time; - std::string name; - - bool operator==(const Event& other) const { - return time == other.time && name == other.name; - } - }; - - void OnAction(const std::string& name, base::TimeTicks time) { - recorded_events_.push_back({time, name}); - } - - void ExpectEvents(const std::vector<Event>& expected) { - EXPECT_EQ(recorded_events_.size(), expected.size()); - size_t end = std::min(recorded_events_.size(), expected.size()); - for (size_t i = 0; i < end; ++i) { - SCOPED_TRACE(i); - EXPECT_EQ(recorded_events_[i].time, expected[i].time); - EXPECT_EQ(recorded_events_[i].name, expected[i].name); - } - } - - base::test::TaskEnvironment task_environment_; - - base::SimpleTestTickClock test_clock_; - base::TimeTicks time_base_; - - base::ActionCallback action_callback_; - FuchsiaPlaybackEventsRecorder recorder_; - std::vector<Event> recorded_events_; -}; - -TEST_F(FuchsiaPlaybackEventsRecorderTest, PlayPause) { - recorder_.OnNaturalSizeChanged(gfx::Size(640, 480)); - recorder_.OnPlaying(); - task_environment_.AdvanceClock(2 * kSecond); - recorder_.OnPaused(); - - ExpectEvents({ - {time_base_, "WebEngine.Media.VideoResolution:640x480"}, - {time_base_, "WebEngine.Media.Playing"}, - {time_base_ + 2 * kSecond, "WebEngine.Media.Pause"}, - }); -} - -TEST_F(FuchsiaPlaybackEventsRecorderTest, Error) { - recorder_.OnPlaying(); - task_environment_.AdvanceClock(2 * kSecond); - recorder_.OnError(PIPELINE_ERROR_DECODE); - - ExpectEvents({ - {time_base_, "WebEngine.Media.Playing"}, - {time_base_ + 2 * kSecond, "WebEngine.Media.Error:3"}, - }); -} - -TEST_F(FuchsiaPlaybackEventsRecorderTest, Buffering) { - recorder_.OnPlaying(); - recorder_.OnBufferingComplete(); - task_environment_.AdvanceClock(2 * kSecond); - recorder_.OnBuffering(); - task_environment_.AdvanceClock(3 * kSecond); - recorder_.OnBufferingComplete(); - - ExpectEvents({ - {time_base_, "WebEngine.Media.Playing"}, - {time_base_ + 5 * kSecond, - "WebEngine.Media.PlayTimeBeforeAutoPause:2000"}, - {time_base_ + 5 * kSecond, "WebEngine.Media.AutoPauseTime:3000"}, - }); -} - -TEST_F(FuchsiaPlaybackEventsRecorderTest, Bitrate) { - recorder_.OnPlaying(); - recorder_.OnBufferingComplete(); - - PipelineStatistics stats; - recorder_.OnPipelineStatistics(stats); - - for (int i = 0; i < 5; ++i) { - stats.audio_bytes_decoded += 5000; - stats.video_bytes_decoded += 10000; - - task_environment_.AdvanceClock(kSecond); - recorder_.OnPipelineStatistics(stats); - } - - ExpectEvents({ - {time_base_, "WebEngine.Media.Playing"}, - {time_base_ + 5 * kSecond, "WebEngine.Media.AudioBitrate:40"}, - {time_base_ + 5 * kSecond, "WebEngine.Media.VideoBitrate:80"}, - }); -} - -TEST_F(FuchsiaPlaybackEventsRecorderTest, BitrateAfterPause) { - recorder_.OnPlaying(); - recorder_.OnBufferingComplete(); - - PipelineStatistics stats; - recorder_.OnPipelineStatistics(stats); - - for (int i = 0; i < 3; ++i) { - stats.audio_bytes_decoded += 5000; - stats.video_bytes_decoded += 10000; - - task_environment_.AdvanceClock(kSecond); - recorder_.OnPipelineStatistics(stats); - } - - recorder_.OnPaused(); - task_environment_.AdvanceClock(10 * kSecond); - recorder_.OnPlaying(); - - for (int i = 0; i < 3; ++i) { - stats.audio_bytes_decoded += 5000; - stats.video_bytes_decoded += 10000; - - task_environment_.AdvanceClock(kSecond); - recorder_.OnPipelineStatistics(stats); - } - - ExpectEvents({ - {time_base_, "WebEngine.Media.Playing"}, - {time_base_ + 3 * kSecond, "WebEngine.Media.Pause"}, - {time_base_ + 13 * kSecond, "WebEngine.Media.Playing"}, - {time_base_ + 16 * kSecond, "WebEngine.Media.AudioBitrate:40"}, - {time_base_ + 16 * kSecond, "WebEngine.Media.VideoBitrate:80"}, - }); -} - -TEST_F(FuchsiaPlaybackEventsRecorderTest, BitrateAfterBuffering) { - recorder_.OnPlaying(); - recorder_.OnBufferingComplete(); - - PipelineStatistics stats; - recorder_.OnPipelineStatistics(stats); - - for (int i = 0; i < 3; ++i) { - stats.audio_bytes_decoded += 5000; - stats.video_bytes_decoded += 10000; - - task_environment_.AdvanceClock(kSecond); - recorder_.OnPipelineStatistics(stats); - } - - recorder_.OnBuffering(); - task_environment_.AdvanceClock(10 * kSecond); - recorder_.OnBufferingComplete(); - - for (int i = 0; i < 3; ++i) { - stats.audio_bytes_decoded += 5000; - stats.video_bytes_decoded += 10000; - - task_environment_.AdvanceClock(kSecond); - recorder_.OnPipelineStatistics(stats); - } - - ExpectEvents({ - {time_base_, "WebEngine.Media.Playing"}, - {time_base_ + 13 * kSecond, - "WebEngine.Media.PlayTimeBeforeAutoPause:3000"}, - {time_base_ + 13 * kSecond, "WebEngine.Media.AutoPauseTime:10000"}, - {time_base_ + 16 * kSecond, "WebEngine.Media.AudioBitrate:40"}, - {time_base_ + 16 * kSecond, "WebEngine.Media.VideoBitrate:80"}, - }); -} -} // namespace media
\ No newline at end of file |