| 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..206e959d3b8a2468d576afec379cba3ac91b5441 | 
| --- /dev/null | 
| +++ b/examples/media_test/media_test.cc | 
| @@ -0,0 +1,111 @@ | 
| +// 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 mojo { | 
| +namespace media { | 
| +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_(MediaState::UNPREPARED) { | 
| +  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); | 
| +} | 
| + | 
| +MediaState MediaTest::state() const { | 
| +  return state_; | 
| +} | 
| + | 
| +int64_t MediaTest::position_ns() const { | 
| +  // Apply the transform to the current time. | 
| +  int64_t position; | 
| +  transform_.DoForwardTransform( | 
| +      LocalClock::now().time_since_epoch().count(), | 
| +      &position); | 
| + | 
| +  MOJO_DCHECK(position >= 0); | 
| + | 
| +  if (metadata_ && | 
| +      static_cast<uint64_t>(position) > metadata_->duration) { | 
| +    position = metadata_->duration; | 
| +  } | 
| + | 
| +  return position; | 
| +} | 
| + | 
| +const MediaMetadataPtr& MediaTest::metadata() const { | 
| +  return metadata_; | 
| +} | 
| + | 
| +void MediaTest::HandleStatusUpdates( | 
| +    uint64_t version, | 
| +    MediaPlayerStatusPtr status) { | 
| +  if (status) { | 
| +    // Process status received from the player. | 
| +    state_ = status->state; | 
| + | 
| +    // 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. | 
| +    if (status->timeline_transform) { | 
| +      transform_ = LinearTransform( | 
| +          status->timeline_transform->quad->target_offset, | 
| +          status->timeline_transform->quad->reference_delta, | 
| +          status->timeline_transform->quad->target_delta, | 
| +          status->timeline_transform->quad->reference_offset); | 
| +    } | 
| + | 
| +    metadata_ = status->metadata.Pass(); | 
| + | 
| +    if (update_callback_ != nullptr) { | 
| +      update_callback_(); | 
| +    } | 
| +  } | 
| + | 
| +  // Request a status update. | 
| +  media_player_->GetStatus( | 
| +      version, | 
| +      [this](uint64_t version, MediaPlayerStatusPtr status) { | 
| +        HandleStatusUpdates(version, status.Pass()); | 
| +      }); | 
| +} | 
| + | 
| +}  // namespace examples | 
| +}  // namespace media | 
| +}  // namespace mojo | 
|  |