blob: 773dcb97864096206b697efc920554a80feb9135 [file] [log] [blame]
// Copyright 2019 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 SERVICES_MEDIA_SESSION_PUBLIC_CPP_MEDIA_POSITION_H_
#define SERVICES_MEDIA_SESSION_PUBLIC_CPP_MEDIA_POSITION_H_
#include "base/component_export.h"
#include "base/gtest_prod_util.h"
#include "base/time/time.h"
#include "build/build_config.h"
#if BUILDFLAG(IS_ANDROID)
#include <jni.h>
#include "base/android/scoped_java_ref.h"
#endif // BUILDFLAG(IS_ANDROID)
namespace IPC {
template <class P>
struct ParamTraits;
}
namespace ipc_fuzzer {
template <class T>
struct FuzzTraits;
} // namespace ipc_fuzzer
namespace mojo {
template <typename DataViewType, typename T>
struct StructTraits;
}
namespace media_session {
namespace mojom {
class MediaPositionDataView;
}
struct COMPONENT_EXPORT(MEDIA_SESSION_BASE_CPP) MediaPosition {
public:
MediaPosition();
MediaPosition(double playback_rate,
base::TimeDelta duration,
base::TimeDelta position,
bool end_of_media);
~MediaPosition();
#if BUILDFLAG(IS_ANDROID)
// Creates a Java MediaPosition instance and returns the JNI ref.
base::android::ScopedJavaLocalRef<jobject> CreateJavaObject(
JNIEnv* env) const;
#endif
// Return the duration of the media.
base::TimeDelta duration() const;
// Return the current position of the media.
base::TimeDelta GetPosition() const;
// Return the current playback rate of the media.
double playback_rate() const;
// Return the time the position state was last updated.
base::TimeTicks last_updated_time() const;
// Return whether playback has reached the end of media. This can be true
// even when GetPosition() < duration(), because the duration is not exact in
// general.
bool end_of_media() const { return end_of_media_; }
// Return the updated position of the media, assuming current time is
// |time|.
base::TimeDelta GetPositionAtTime(base::TimeTicks time) const;
bool operator==(const MediaPosition&) const;
bool operator!=(const MediaPosition&) const;
std::string ToString() const;
private:
friend struct IPC::ParamTraits<media_session::MediaPosition>;
friend struct ipc_fuzzer::FuzzTraits<media_session::MediaPosition>;
friend struct mojo::StructTraits<mojom::MediaPositionDataView, MediaPosition>;
friend class MediaPositionTest;
FRIEND_TEST_ALL_PREFIXES(MediaPositionTest, TestPositionUpdated);
FRIEND_TEST_ALL_PREFIXES(MediaPositionTest, TestPositionUpdatedTwice);
FRIEND_TEST_ALL_PREFIXES(MediaPositionTest, TestPositionUpdatedPastDuration);
FRIEND_TEST_ALL_PREFIXES(MediaPositionTest, TestNegativePosition);
FRIEND_TEST_ALL_PREFIXES(MediaPositionTest,
TestPositionUpdatedFasterPlayback);
FRIEND_TEST_ALL_PREFIXES(MediaPositionTest,
TestPositionUpdatedSlowerPlayback);
FRIEND_TEST_ALL_PREFIXES(MediaPositionTest,
TestNotEquals_DifferentEndOfMedia);
FRIEND_TEST_ALL_PREFIXES(MediaPositionTest, TestEquals_AllSame);
FRIEND_TEST_ALL_PREFIXES(MediaPositionTest, TestEquals_SameButDifferentTime);
FRIEND_TEST_ALL_PREFIXES(MediaPositionTest, TestNotEquals_DifferentDuration);
FRIEND_TEST_ALL_PREFIXES(MediaPositionTest,
TestNotEquals_DifferentPlaybackRate);
// Playback rate of the media.
double playback_rate_ = 0;
// Duration of the media.
base::TimeDelta duration_;
// Last updated position of the media.
base::TimeDelta position_;
// Last time |position_| was updated.
base::TimeTicks last_updated_time_;
// Whether playback has reached the end of media.
bool end_of_media_ = false;
};
} // namespace media_session
#endif // SERVICES_MEDIA_SESSION_PUBLIC_CPP_MEDIA_POSITION_H_