Chromium Code Reviews| Index: examples/media_test/media_test.cc |
| diff --git a/examples/media_test/media_test.cc b/examples/media_test/media_test.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..e93063735c47c9a88eec50b1a447f65e8de76c35 |
| --- /dev/null |
| +++ b/examples/media_test/media_test.cc |
| @@ -0,0 +1,101 @@ |
| +// Copyright 2015 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 "examples/media_test/media_test.h" |
| +#include "mojo/services/media/common/cpp/linear_transform.h" |
| +#include "mojo/services/media/common/cpp/local_time.h" |
| +#include "mojo/services/media/control/interfaces/media_factory.mojom.h" |
| + |
| +namespace examples { |
| + |
| +// static |
| +std::unique_ptr<MediaTest> MediaTest::Create( |
| + mojo::ApplicationImpl* app, |
| + const std::string& input_file_name) { |
| + return std::unique_ptr<MediaTest>(new MediaTest(app, input_file_name)); |
| +} |
| + |
| +MediaTest::MediaTest( |
| + mojo::ApplicationImpl* app, |
| + const std::string& input_file_name) : |
| + state_(mojo::media::MediaState::UNPREPARED) { |
| + mojo::media::MediaFactoryPtr factory; |
| + app->ConnectToService("mojo:media_factory", &factory); |
| + |
| + factory->CreatePlayer(input_file_name, GetProxy(&media_player_)); |
| + |
| + HandleStatusUpdates(); |
| +} |
| + |
| +MediaTest::~MediaTest() {} |
| + |
| +void MediaTest::RegisterUpdateCallback(const UpdateCallback& callback) { |
| + update_callback_ = callback; |
| +} |
| + |
| +void MediaTest::Play() { |
| + media_player_->Play(); |
| +} |
| + |
| +void MediaTest::Pause() { |
| + media_player_->Pause(); |
| +} |
| + |
| +void MediaTest::Seek(int64_t position_ns) { |
| + media_player_->Seek(position_ns); |
| +} |
| + |
| +mojo::media::MediaState MediaTest::state() const { |
| + return state_; |
| +} |
| + |
| +int64_t MediaTest::position_ns() const { |
| + if (!transform_) { |
| + return 0; |
| + } |
| + |
| + // Create a linear transform that translates local time to presentation time. |
| + // Note that 'reference' here refers to the presentation time, and 'target' |
| + // refers to the local time. |
| + mojo::media::LinearTransform transform( |
|
johngro
2016/03/21 22:10:46
transform_ does not appear to be getting used for
dalesat
2016/03/21 23:58:35
Done.
|
| + transform_->quad->target_offset, |
| + transform_->quad->reference_delta, |
| + transform_->quad->target_delta, |
| + transform_->quad->reference_offset); |
| + |
| + // Apply the transform to the current time. |
| + int64_t position; |
| + transform.DoForwardTransform( |
| + mojo::media::LocalClock::now().time_since_epoch().count(), |
| + &position); |
| + |
| + return position; |
|
johngro
2016/03/21 22:10:46
if you have an idea of what the asset's duration i
dalesat
2016/03/21 23:58:35
Done.
|
| +} |
| + |
| +const mojo::media::MediaMetadataPtr& MediaTest::metadata() const { |
| + return metadata_; |
| +} |
| + |
| +void MediaTest::HandleStatusUpdates( |
| + uint64_t version, |
| + mojo::media::MediaPlayerStatusPtr status) { |
| + if (status) { |
| + // Process status received from the player. |
| + state_ = status->state; |
| + transform_ = status->timeline_transform.Pass(); |
| + metadata_ = status->metadata.Pass(); |
| + if (update_callback_ != nullptr) { |
| + update_callback_(); |
| + } |
| + } |
| + |
| + // Request a status update. |
| + media_player_->GetStatus( |
| + version, |
| + [this](uint64_t version, mojo::media::MediaPlayerStatusPtr status) { |
| + HandleStatusUpdates(version, status.Pass()); |
| + }); |
| +} |
| + |
| +} // namespace examples |