Motown: Convert MediaSink to expose MediaTimelineControlSite
1) Remove play/pause and status from MediaSink.
2) Support GetTimelineControlSite on MediaSink so player has access to
the MediaTimelineControlSite on the underlying renderer.
3) Remove unneeded MediaState in favor of the current transform and
an end-of-stream indication.
4) Make AudioTrack report end-of-stream (by way of TimelineControlSite),
removing this logic from the MediaProducer.
5) Eliminate unneeded logic from MediaProducer now that timeline control
no longer requires packet PTS.
R=kulakowski@chromium.org
Review URL: https://codereview.chromium.org/2006093004 .
diff --git a/examples/media_test/media_test.cc b/examples/media_test/media_test.cc
index c1f0d19..5d76004 100644
--- a/examples/media_test/media_test.cc
+++ b/examples/media_test/media_test.cc
@@ -20,8 +20,7 @@
}
MediaTest::MediaTest(mojo::ApplicationImpl* app,
- const std::string& input_file_name)
- : state_(MediaState::UNPREPARED) {
+ const std::string& input_file_name) {
MediaFactoryPtr factory;
ConnectToService(app->shell(), "mojo:media_factory", GetProxy(&factory));
@@ -57,13 +56,19 @@
MediaPlayerStatusPtr status) {
if (status) {
// Process status received from the player.
- previous_state_ = state_;
- state_ = status->state;
-
if (status->timeline_transform) {
timeline_function_ = status->timeline_transform.To<TimelineFunction>();
}
+ previous_state_ = state_;
+ if (status->end_of_stream) {
+ state_ = State::kEnded;
+ } else if (timeline_function_.subject_delta() == 0) {
+ state_ = State::kPaused;
+ } else {
+ state_ = State::kPlaying;
+ }
+
metadata_ = status->metadata.Pass();
if (update_callback_ != nullptr) {
diff --git a/examples/media_test/media_test.h b/examples/media_test/media_test.h
index da5473e..fc17161 100644
--- a/examples/media_test/media_test.h
+++ b/examples/media_test/media_test.h
@@ -19,6 +19,8 @@
// Model for media test application.
class MediaTest {
public:
+ enum class State { kPaused, kPlaying, kEnded };
+
using UpdateCallback = std::function<void()>;
static std::unique_ptr<MediaTest> Create(mojo::ApplicationImpl* app,
@@ -41,10 +43,10 @@
void Seek(int64_t position_ns) { media_player_->Seek(position_ns); }
// Returns the previous state of the player.
- MediaState previous_state() const { return previous_state_; }
+ State previous_state() const { return previous_state_; }
// Returns the current state of the player.
- MediaState state() const { return state_; }
+ State state() const { return state_; }
// Returns the current presentation time in nanoseconds.
int64_t position_ns() const;
@@ -61,8 +63,8 @@
MediaPlayerStatusPtr status = nullptr);
MediaPlayerPtr media_player_;
- MediaState previous_state_ = MediaState::UNPREPARED;
- MediaState state_ = MediaState::UNPREPARED;
+ State previous_state_ = State::kPaused;
+ State state_ = State::kPaused;
TimelineFunction timeline_function_;
MediaMetadataPtr metadata_;
UpdateCallback update_callback_;
diff --git a/examples/media_test/media_test_app.cc b/examples/media_test/media_test_app.cc
index 0c42f22..ff4ba3d 100644
--- a/examples/media_test/media_test_app.cc
+++ b/examples/media_test/media_test_app.cc
@@ -105,8 +105,8 @@
}
void HandleMediaTestUpdateCallback() {
- if (media_test_->state() == MediaState::ENDED &&
- media_test_->previous_state() != MediaState::ENDED) {
+ if (media_test_->state() == MediaTest::State::kEnded &&
+ media_test_->previous_state() != MediaTest::State::kEnded) {
// MediaTest doesn't appreciate being deleted in this callback.
// Next time Poll runs, we move on to the next file.
base::MessageLoop::current()->PostTask(
@@ -169,15 +169,11 @@
// Returns a string describing the MediaTest object's state.
const char* state_string() const {
switch (media_test_->state()) {
- case MediaState::FAULT:
- return "FAULT";
- case MediaState::UNPREPARED:
- return "unprepared";
- case MediaState::PAUSED:
+ case MediaTest::State::kPaused:
return "paused";
- case MediaState::PLAYING:
+ case MediaTest::State::kPlaying:
return "playing";
- case MediaState::ENDED:
+ case MediaTest::State::kEnded:
return "ended";
}
return "UNSUPPORTED STATE VALUE";
@@ -237,13 +233,13 @@
// Toggles between play and pause (prepared) states.
void TogglePlayPause() {
switch (media_test_->state()) {
- case MediaState::PAUSED:
+ case MediaTest::State::kPaused:
media_test_->Play();
break;
- case MediaState::PLAYING:
+ case MediaTest::State::kPlaying:
media_test_->Pause();
break;
- case MediaState::ENDED:
+ case MediaTest::State::kEnded:
if (input_file_names_.size() == 1) {
// Replaying the only file. Reuse the same MediaTest instance.
media_test_->Seek(0);
diff --git a/mojo/dart/packages/mojo_services/BUILD.gn b/mojo/dart/packages/mojo_services/BUILD.gn
index 28cd6fd..2075a2c 100644
--- a/mojo/dart/packages/mojo_services/BUILD.gn
+++ b/mojo/dart/packages/mojo_services/BUILD.gn
@@ -59,7 +59,6 @@
"lib/mojo/media/media_player.mojom.dart",
"lib/mojo/media/media_sink.mojom.dart",
"lib/mojo/media/media_source.mojom.dart",
- "lib/mojo/media/media_state.mojom.dart",
"lib/mojo/media/media_transport.mojom.dart",
"lib/mojo/media/media_type_converter.mojom.dart",
"lib/mojo/media/media_types.mojom.dart",
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/media/audio_track.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/media/audio_track.mojom.dart
index df9cd3e..7145119 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/media/audio_track.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/media/audio_track.mojom.dart
@@ -422,7 +422,7 @@
static const List<bindings.StructDataHeader> kVersions = const [
const bindings.StructDataHeader(16, 0)
];
- Object timelineControlSite = null;
+ timeline_controller_mojom.MediaTimelineControlSiteInterfaceRequest timelineControlSite = null;
_AudioTrackGetTimelineControlSiteParams() : super(kVersions.last.size);
@@ -599,8 +599,8 @@
return p;
}
dynamic describe([Function responseFactory = null]);
- void configure(AudioTrackConfiguration configuration, Object pipe);
- void getTimelineControlSite(Object timelineControlSite);
+ void configure(AudioTrackConfiguration configuration, media_transport_mojom.MediaConsumerInterfaceRequest pipe);
+ void getTimelineControlSite(timeline_controller_mojom.MediaTimelineControlSiteInterfaceRequest timelineControlSite);
void setGain(double dbGain);
static const double kMutedGain = -160.0;
static const double kMaxGain = 20.0;
@@ -719,7 +719,7 @@
ctrl.sendMessage(params,
_audioTrackMethodConfigureName);
}
- void getTimelineControlSite(Object timelineControlSite) {
+ void getTimelineControlSite(timeline_controller_mojom.MediaTimelineControlSiteInterfaceRequest timelineControlSite) {
if (!ctrl.isBound) {
ctrl.proxyError("The Proxy is closed.");
return;
@@ -878,7 +878,7 @@
void configure(AudioTrackConfiguration configuration, media_transport_mojom.MediaConsumerInterfaceRequest pipe) {
return impl.configure(configuration, pipe);
}
- void getTimelineControlSite(Object timelineControlSite) {
+ void getTimelineControlSite(timeline_controller_mojom.MediaTimelineControlSiteInterfaceRequest timelineControlSite) {
return impl.getTimelineControlSite(timelineControlSite);
}
void setGain(double dbGain) {
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/media/media_player.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/media/media_player.mojom.dart
index d570d96..07e4b28 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/media/media_player.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/media/media_player.mojom.dart
@@ -8,7 +8,6 @@
import 'package:mojo/core.dart' as core;
import 'package:mojo/mojo/bindings/types/service_describer.mojom.dart' as service_describer;
import 'package:mojo_services/mojo/media/media_metadata.mojom.dart' as media_metadata_mojom;
-import 'package:mojo_services/mojo/media/media_state.mojom.dart' as media_state_mojom;
import 'package:mojo_services/mojo/timelines.mojom.dart' as timelines_mojom;
@@ -17,8 +16,8 @@
static const List<bindings.StructDataHeader> kVersions = const [
const bindings.StructDataHeader(32, 0)
];
- media_state_mojom.MediaState state = null;
timelines_mojom.TimelineTransform timelineTransform = null;
+ bool endOfStream = false;
media_metadata_mojom.MediaMetadata metadata = null;
MediaPlayerStatus() : super(kVersions.last.size);
@@ -58,16 +57,12 @@
}
if (mainDataHeader.version >= 0) {
- result.state = media_state_mojom.MediaState.decode(decoder0, 8);
- if (result.state == null) {
- throw new bindings.MojoCodecError(
- 'Trying to decode null union for non-nullable media_state_mojom.MediaState.');
- }
+ var decoder1 = decoder0.decodePointer(8, true);
+ result.timelineTransform = timelines_mojom.TimelineTransform.decode(decoder1);
}
if (mainDataHeader.version >= 0) {
- var decoder1 = decoder0.decodePointer(16, true);
- result.timelineTransform = timelines_mojom.TimelineTransform.decode(decoder1);
+ result.endOfStream = decoder0.decodeBool(16, 0);
}
if (mainDataHeader.version >= 0) {
@@ -80,20 +75,20 @@
void encode(bindings.Encoder encoder) {
var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
try {
- encoder0.encodeEnum(state, 8);
- } on bindings.MojoCodecError catch(e) {
- e.message = "Error encountered while encoding field "
- "state of struct MediaPlayerStatus: $e";
- rethrow;
- }
- try {
- encoder0.encodeStruct(timelineTransform, 16, true);
+ encoder0.encodeStruct(timelineTransform, 8, true);
} on bindings.MojoCodecError catch(e) {
e.message = "Error encountered while encoding field "
"timelineTransform of struct MediaPlayerStatus: $e";
rethrow;
}
try {
+ encoder0.encodeBool(endOfStream, 16, 0);
+ } on bindings.MojoCodecError catch(e) {
+ e.message = "Error encountered while encoding field "
+ "endOfStream of struct MediaPlayerStatus: $e";
+ rethrow;
+ }
+ try {
encoder0.encodeStruct(metadata, 24, true);
} on bindings.MojoCodecError catch(e) {
e.message = "Error encountered while encoding field "
@@ -104,15 +99,15 @@
String toString() {
return "MediaPlayerStatus("
- "state: $state" ", "
"timelineTransform: $timelineTransform" ", "
+ "endOfStream: $endOfStream" ", "
"metadata: $metadata" ")";
}
Map toJson() {
Map map = new Map();
- map["state"] = state;
map["timelineTransform"] = timelineTransform;
+ map["endOfStream"] = endOfStream;
map["metadata"] = metadata;
return map;
}
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/media/media_sink.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/media/media_sink.mojom.dart
index 6b73e31..291fa4f 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/media/media_sink.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/media/media_sink.mojom.dart
@@ -7,103 +7,11 @@
import 'package:mojo/bindings.dart' as bindings;
import 'package:mojo/core.dart' as core;
import 'package:mojo/mojo/bindings/types/service_describer.mojom.dart' as service_describer;
-import 'package:mojo_services/mojo/media/media_state.mojom.dart' as media_state_mojom;
import 'package:mojo_services/mojo/media/media_transport.mojom.dart' as media_transport_mojom;
-import 'package:mojo_services/mojo/timelines.mojom.dart' as timelines_mojom;
+import 'package:mojo_services/mojo/media/timeline_controller.mojom.dart' as timeline_controller_mojom;
-class MediaSinkStatus extends bindings.Struct {
- static const List<bindings.StructDataHeader> kVersions = const [
- const bindings.StructDataHeader(24, 0)
- ];
- media_state_mojom.MediaState state = null;
- timelines_mojom.TimelineTransform timelineTransform = null;
-
- MediaSinkStatus() : super(kVersions.last.size);
-
- static MediaSinkStatus deserialize(bindings.Message message) {
- var decoder = new bindings.Decoder(message);
- var result = decode(decoder);
- if (decoder.excessHandles != null) {
- decoder.excessHandles.forEach((h) => h.close());
- }
- return result;
- }
-
- static MediaSinkStatus decode(bindings.Decoder decoder0) {
- if (decoder0 == null) {
- return null;
- }
- MediaSinkStatus result = new MediaSinkStatus();
-
- var mainDataHeader = decoder0.decodeStructDataHeader();
- if (mainDataHeader.version <= kVersions.last.version) {
- // Scan in reverse order to optimize for more recent versions.
- for (int i = kVersions.length - 1; i >= 0; --i) {
- if (mainDataHeader.version >= kVersions[i].version) {
- if (mainDataHeader.size == kVersions[i].size) {
- // Found a match.
- break;
- }
- throw new bindings.MojoCodecError(
- 'Header size doesn\'t correspond to known version size.');
- }
- }
- } else if (mainDataHeader.size < kVersions.last.size) {
- throw new bindings.MojoCodecError(
- 'Message newer than the last known version cannot be shorter than '
- 'required by the last known version.');
- }
- if (mainDataHeader.version >= 0) {
-
- result.state = media_state_mojom.MediaState.decode(decoder0, 8);
- if (result.state == null) {
- throw new bindings.MojoCodecError(
- 'Trying to decode null union for non-nullable media_state_mojom.MediaState.');
- }
- }
- if (mainDataHeader.version >= 0) {
-
- var decoder1 = decoder0.decodePointer(16, true);
- result.timelineTransform = timelines_mojom.TimelineTransform.decode(decoder1);
- }
- return result;
- }
-
- void encode(bindings.Encoder encoder) {
- var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
- try {
- encoder0.encodeEnum(state, 8);
- } on bindings.MojoCodecError catch(e) {
- e.message = "Error encountered while encoding field "
- "state of struct MediaSinkStatus: $e";
- rethrow;
- }
- try {
- encoder0.encodeStruct(timelineTransform, 16, true);
- } on bindings.MojoCodecError catch(e) {
- e.message = "Error encountered while encoding field "
- "timelineTransform of struct MediaSinkStatus: $e";
- rethrow;
- }
- }
-
- String toString() {
- return "MediaSinkStatus("
- "state: $state" ", "
- "timelineTransform: $timelineTransform" ")";
- }
-
- Map toJson() {
- Map map = new Map();
- map["state"] = state;
- map["timelineTransform"] = timelineTransform;
- return map;
- }
-}
-
-
class _MediaSinkGetConsumerParams extends bindings.Struct {
static const List<bindings.StructDataHeader> kVersions = const [
const bindings.StructDataHeader(16, 0)
@@ -175,15 +83,15 @@
}
-class _MediaSinkGetStatusParams extends bindings.Struct {
+class _MediaSinkGetTimelineControlSiteParams extends bindings.Struct {
static const List<bindings.StructDataHeader> kVersions = const [
const bindings.StructDataHeader(16, 0)
];
- int versionLastSeen = 0;
+ timeline_controller_mojom.MediaTimelineControlSiteInterfaceRequest timelineControlSite = null;
- _MediaSinkGetStatusParams() : super(kVersions.last.size);
+ _MediaSinkGetTimelineControlSiteParams() : super(kVersions.last.size);
- static _MediaSinkGetStatusParams deserialize(bindings.Message message) {
+ static _MediaSinkGetTimelineControlSiteParams deserialize(bindings.Message message) {
var decoder = new bindings.Decoder(message);
var result = decode(decoder);
if (decoder.excessHandles != null) {
@@ -192,11 +100,11 @@
return result;
}
- static _MediaSinkGetStatusParams decode(bindings.Decoder decoder0) {
+ static _MediaSinkGetTimelineControlSiteParams decode(bindings.Decoder decoder0) {
if (decoder0 == null) {
return null;
}
- _MediaSinkGetStatusParams result = new _MediaSinkGetStatusParams();
+ _MediaSinkGetTimelineControlSiteParams result = new _MediaSinkGetTimelineControlSiteParams();
var mainDataHeader = decoder0.decodeStructDataHeader();
if (mainDataHeader.version <= kVersions.last.version) {
@@ -218,7 +126,7 @@
}
if (mainDataHeader.version >= 0) {
- result.versionLastSeen = decoder0.decodeUint64(8);
+ result.timelineControlSite = decoder0.decodeInterfaceRequest(8, false, timeline_controller_mojom.MediaTimelineControlSiteStub.newFromEndpoint);
}
return result;
}
@@ -226,233 +134,27 @@
void encode(bindings.Encoder encoder) {
var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
try {
- encoder0.encodeUint64(versionLastSeen, 8);
+ encoder0.encodeInterfaceRequest(timelineControlSite, 8, false);
} on bindings.MojoCodecError catch(e) {
e.message = "Error encountered while encoding field "
- "versionLastSeen of struct _MediaSinkGetStatusParams: $e";
+ "timelineControlSite of struct _MediaSinkGetTimelineControlSiteParams: $e";
rethrow;
}
}
String toString() {
- return "_MediaSinkGetStatusParams("
- "versionLastSeen: $versionLastSeen" ")";
+ return "_MediaSinkGetTimelineControlSiteParams("
+ "timelineControlSite: $timelineControlSite" ")";
}
Map toJson() {
- Map map = new Map();
- map["versionLastSeen"] = versionLastSeen;
- return map;
- }
-}
-
-
-class MediaSinkGetStatusResponseParams extends bindings.Struct {
- static const List<bindings.StructDataHeader> kVersions = const [
- const bindings.StructDataHeader(24, 0)
- ];
- int version = 0;
- MediaSinkStatus status = null;
-
- MediaSinkGetStatusResponseParams() : super(kVersions.last.size);
-
- static MediaSinkGetStatusResponseParams deserialize(bindings.Message message) {
- var decoder = new bindings.Decoder(message);
- var result = decode(decoder);
- if (decoder.excessHandles != null) {
- decoder.excessHandles.forEach((h) => h.close());
- }
- return result;
- }
-
- static MediaSinkGetStatusResponseParams decode(bindings.Decoder decoder0) {
- if (decoder0 == null) {
- return null;
- }
- MediaSinkGetStatusResponseParams result = new MediaSinkGetStatusResponseParams();
-
- var mainDataHeader = decoder0.decodeStructDataHeader();
- if (mainDataHeader.version <= kVersions.last.version) {
- // Scan in reverse order to optimize for more recent versions.
- for (int i = kVersions.length - 1; i >= 0; --i) {
- if (mainDataHeader.version >= kVersions[i].version) {
- if (mainDataHeader.size == kVersions[i].size) {
- // Found a match.
- break;
- }
- throw new bindings.MojoCodecError(
- 'Header size doesn\'t correspond to known version size.');
- }
- }
- } else if (mainDataHeader.size < kVersions.last.size) {
- throw new bindings.MojoCodecError(
- 'Message newer than the last known version cannot be shorter than '
- 'required by the last known version.');
- }
- if (mainDataHeader.version >= 0) {
-
- result.version = decoder0.decodeUint64(8);
- }
- if (mainDataHeader.version >= 0) {
-
- var decoder1 = decoder0.decodePointer(16, false);
- result.status = MediaSinkStatus.decode(decoder1);
- }
- return result;
- }
-
- void encode(bindings.Encoder encoder) {
- var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
- try {
- encoder0.encodeUint64(version, 8);
- } on bindings.MojoCodecError catch(e) {
- e.message = "Error encountered while encoding field "
- "version of struct MediaSinkGetStatusResponseParams: $e";
- rethrow;
- }
- try {
- encoder0.encodeStruct(status, 16, false);
- } on bindings.MojoCodecError catch(e) {
- e.message = "Error encountered while encoding field "
- "status of struct MediaSinkGetStatusResponseParams: $e";
- rethrow;
- }
- }
-
- String toString() {
- return "MediaSinkGetStatusResponseParams("
- "version: $version" ", "
- "status: $status" ")";
- }
-
- Map toJson() {
- Map map = new Map();
- map["version"] = version;
- map["status"] = status;
- return map;
- }
-}
-
-
-class _MediaSinkPlayParams extends bindings.Struct {
- static const List<bindings.StructDataHeader> kVersions = const [
- const bindings.StructDataHeader(8, 0)
- ];
-
- _MediaSinkPlayParams() : super(kVersions.last.size);
-
- static _MediaSinkPlayParams deserialize(bindings.Message message) {
- var decoder = new bindings.Decoder(message);
- var result = decode(decoder);
- if (decoder.excessHandles != null) {
- decoder.excessHandles.forEach((h) => h.close());
- }
- return result;
- }
-
- static _MediaSinkPlayParams decode(bindings.Decoder decoder0) {
- if (decoder0 == null) {
- return null;
- }
- _MediaSinkPlayParams result = new _MediaSinkPlayParams();
-
- var mainDataHeader = decoder0.decodeStructDataHeader();
- if (mainDataHeader.version <= kVersions.last.version) {
- // Scan in reverse order to optimize for more recent versions.
- for (int i = kVersions.length - 1; i >= 0; --i) {
- if (mainDataHeader.version >= kVersions[i].version) {
- if (mainDataHeader.size == kVersions[i].size) {
- // Found a match.
- break;
- }
- throw new bindings.MojoCodecError(
- 'Header size doesn\'t correspond to known version size.');
- }
- }
- } else if (mainDataHeader.size < kVersions.last.size) {
- throw new bindings.MojoCodecError(
- 'Message newer than the last known version cannot be shorter than '
- 'required by the last known version.');
- }
- return result;
- }
-
- void encode(bindings.Encoder encoder) {
- encoder.getStructEncoderAtOffset(kVersions.last);
- }
-
- String toString() {
- return "_MediaSinkPlayParams("")";
- }
-
- Map toJson() {
- Map map = new Map();
- return map;
- }
-}
-
-
-class _MediaSinkPauseParams extends bindings.Struct {
- static const List<bindings.StructDataHeader> kVersions = const [
- const bindings.StructDataHeader(8, 0)
- ];
-
- _MediaSinkPauseParams() : super(kVersions.last.size);
-
- static _MediaSinkPauseParams deserialize(bindings.Message message) {
- var decoder = new bindings.Decoder(message);
- var result = decode(decoder);
- if (decoder.excessHandles != null) {
- decoder.excessHandles.forEach((h) => h.close());
- }
- return result;
- }
-
- static _MediaSinkPauseParams decode(bindings.Decoder decoder0) {
- if (decoder0 == null) {
- return null;
- }
- _MediaSinkPauseParams result = new _MediaSinkPauseParams();
-
- var mainDataHeader = decoder0.decodeStructDataHeader();
- if (mainDataHeader.version <= kVersions.last.version) {
- // Scan in reverse order to optimize for more recent versions.
- for (int i = kVersions.length - 1; i >= 0; --i) {
- if (mainDataHeader.version >= kVersions[i].version) {
- if (mainDataHeader.size == kVersions[i].size) {
- // Found a match.
- break;
- }
- throw new bindings.MojoCodecError(
- 'Header size doesn\'t correspond to known version size.');
- }
- }
- } else if (mainDataHeader.size < kVersions.last.size) {
- throw new bindings.MojoCodecError(
- 'Message newer than the last known version cannot be shorter than '
- 'required by the last known version.');
- }
- return result;
- }
-
- void encode(bindings.Encoder encoder) {
- encoder.getStructEncoderAtOffset(kVersions.last);
- }
-
- String toString() {
- return "_MediaSinkPauseParams("")";
- }
-
- Map toJson() {
- Map map = new Map();
- return map;
+ throw new bindings.MojoCodecError(
+ 'Object containing handles cannot be encoded to JSON.');
}
}
const int _mediaSinkMethodGetConsumerName = 0;
-const int _mediaSinkMethodGetStatusName = 1;
-const int _mediaSinkMethodPlayName = 2;
-const int _mediaSinkMethodPauseName = 3;
+const int _mediaSinkMethodGetTimelineControlSiteName = 1;
class _MediaSinkServiceDescription implements service_describer.ServiceDescription {
dynamic getTopLevelInterface([Function responseFactory]) =>
@@ -488,10 +190,7 @@
return p;
}
void getConsumer(media_transport_mojom.MediaConsumerInterfaceRequest consumer);
- dynamic getStatus(int versionLastSeen,[Function responseFactory = null]);
- void play();
- void pause();
- static const int kInitialStatus = 0;
+ void getTimelineControlSite(timeline_controller_mojom.MediaTimelineControlSiteInterfaceRequest timelineControlSite);
}
abstract class MediaSinkInterface
@@ -527,26 +226,6 @@
void handleResponse(bindings.ServiceMessage message) {
switch (message.header.type) {
- case _mediaSinkMethodGetStatusName:
- var r = MediaSinkGetStatusResponseParams.deserialize(
- message.payload);
- if (!message.header.hasRequestId) {
- proxyError("Expected a message with a valid request Id.");
- return;
- }
- Completer c = completerMap[message.header.requestId];
- if (c == null) {
- proxyError(
- "Message had unknown request Id: ${message.header.requestId}");
- return;
- }
- completerMap.remove(message.header.requestId);
- if (c.isCompleted) {
- proxyError("Response completer already completed");
- return;
- }
- c.complete(r);
- break;
default:
proxyError("Unexpected message type: ${message.header.type}");
close(immediate: true);
@@ -598,32 +277,15 @@
ctrl.sendMessage(params,
_mediaSinkMethodGetConsumerName);
}
- dynamic getStatus(int versionLastSeen,[Function responseFactory = null]) {
- var params = new _MediaSinkGetStatusParams();
- params.versionLastSeen = versionLastSeen;
- return ctrl.sendMessageWithRequestId(
- params,
- _mediaSinkMethodGetStatusName,
- -1,
- bindings.MessageHeader.kMessageExpectsResponse);
- }
- void play() {
+ void getTimelineControlSite(timeline_controller_mojom.MediaTimelineControlSiteInterfaceRequest timelineControlSite) {
if (!ctrl.isBound) {
ctrl.proxyError("The Proxy is closed.");
return;
}
- var params = new _MediaSinkPlayParams();
+ var params = new _MediaSinkGetTimelineControlSiteParams();
+ params.timelineControlSite = timelineControlSite;
ctrl.sendMessage(params,
- _mediaSinkMethodPlayName);
- }
- void pause() {
- if (!ctrl.isBound) {
- ctrl.proxyError("The Proxy is closed.");
- return;
- }
- var params = new _MediaSinkPauseParams();
- ctrl.sendMessage(params,
- _mediaSinkMethodPauseName);
+ _mediaSinkMethodGetTimelineControlSiteName);
}
}
@@ -649,12 +311,6 @@
String get serviceName => MediaSink.serviceName;
- MediaSinkGetStatusResponseParams _mediaSinkGetStatusResponseParamsFactory(int version, MediaSinkStatus status) {
- var result = new MediaSinkGetStatusResponseParams();
- result.version = version;
- result.status = status;
- return result;
- }
dynamic handleMessage(bindings.ServiceMessage message) {
if (bindings.ControlMessageHandler.isControlMessage(message)) {
@@ -671,33 +327,10 @@
message.payload);
_impl.getConsumer(params.consumer);
break;
- case _mediaSinkMethodGetStatusName:
- var params = _MediaSinkGetStatusParams.deserialize(
+ case _mediaSinkMethodGetTimelineControlSiteName:
+ var params = _MediaSinkGetTimelineControlSiteParams.deserialize(
message.payload);
- var response = _impl.getStatus(params.versionLastSeen,_mediaSinkGetStatusResponseParamsFactory);
- if (response is Future) {
- return response.then((response) {
- if (response != null) {
- return buildResponseWithId(
- response,
- _mediaSinkMethodGetStatusName,
- message.header.requestId,
- bindings.MessageHeader.kMessageIsResponse);
- }
- });
- } else if (response != null) {
- return buildResponseWithId(
- response,
- _mediaSinkMethodGetStatusName,
- message.header.requestId,
- bindings.MessageHeader.kMessageIsResponse);
- }
- break;
- case _mediaSinkMethodPlayName:
- _impl.play();
- break;
- case _mediaSinkMethodPauseName:
- _impl.pause();
+ _impl.getTimelineControlSite(params.timelineControlSite);
break;
default:
throw new bindings.MojoCodecError("Unexpected message name");
@@ -760,14 +393,8 @@
void getConsumer(media_transport_mojom.MediaConsumerInterfaceRequest consumer) {
return impl.getConsumer(consumer);
}
- dynamic getStatus(int versionLastSeen,[Function responseFactory = null]) {
- return impl.getStatus(versionLastSeen,responseFactory);
- }
- void play() {
- return impl.play();
- }
- void pause() {
- return impl.pause();
+ void getTimelineControlSite(timeline_controller_mojom.MediaTimelineControlSiteInterfaceRequest timelineControlSite) {
+ return impl.getTimelineControlSite(timelineControlSite);
}
}
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/media/media_source.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/media/media_source.mojom.dart
index 002702d..bfd80b4 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/media/media_source.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/media/media_source.mojom.dart
@@ -8,7 +8,6 @@
import 'package:mojo/core.dart' as core;
import 'package:mojo/mojo/bindings/types/service_describer.mojom.dart' as service_describer;
import 'package:mojo_services/mojo/media/media_metadata.mojom.dart' as media_metadata_mojom;
-import 'package:mojo_services/mojo/media/media_state.mojom.dart' as media_state_mojom;
import 'package:mojo_services/mojo/media/media_transport.mojom.dart' as media_transport_mojom;
import 'package:mojo_services/mojo/media/media_types.mojom.dart' as media_types_mojom;
@@ -118,9 +117,8 @@
class MediaSourceStatus extends bindings.Struct {
static const List<bindings.StructDataHeader> kVersions = const [
- const bindings.StructDataHeader(24, 0)
+ const bindings.StructDataHeader(16, 0)
];
- media_state_mojom.MediaState state = null;
media_metadata_mojom.MediaMetadata metadata = null;
MediaSourceStatus() : super(kVersions.last.size);
@@ -160,15 +158,7 @@
}
if (mainDataHeader.version >= 0) {
- result.state = media_state_mojom.MediaState.decode(decoder0, 8);
- if (result.state == null) {
- throw new bindings.MojoCodecError(
- 'Trying to decode null union for non-nullable media_state_mojom.MediaState.');
- }
- }
- if (mainDataHeader.version >= 0) {
-
- var decoder1 = decoder0.decodePointer(16, true);
+ var decoder1 = decoder0.decodePointer(8, true);
result.metadata = media_metadata_mojom.MediaMetadata.decode(decoder1);
}
return result;
@@ -177,14 +167,7 @@
void encode(bindings.Encoder encoder) {
var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
try {
- encoder0.encodeEnum(state, 8);
- } on bindings.MojoCodecError catch(e) {
- e.message = "Error encountered while encoding field "
- "state of struct MediaSourceStatus: $e";
- rethrow;
- }
- try {
- encoder0.encodeStruct(metadata, 16, true);
+ encoder0.encodeStruct(metadata, 8, true);
} on bindings.MojoCodecError catch(e) {
e.message = "Error encountered while encoding field "
"metadata of struct MediaSourceStatus: $e";
@@ -194,13 +177,11 @@
String toString() {
return "MediaSourceStatus("
- "state: $state" ", "
"metadata: $metadata" ")";
}
Map toJson() {
Map map = new Map();
- map["state"] = state;
map["metadata"] = metadata;
return map;
}
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/media/media_state.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/media/media_state.mojom.dart
deleted file mode 100644
index afeb2af..0000000
--- a/mojo/dart/packages/mojo_services/lib/mojo/media/media_state.mojom.dart
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright 2014 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.
-
-library media_state_mojom;
-import 'package:mojo/bindings.dart' as bindings;
-
-
-class MediaState extends bindings.MojoEnum {
- static const MediaState fault = const MediaState._(0);
- static const MediaState unprepared = const MediaState._(1);
- static const MediaState paused = const MediaState._(2);
- static const MediaState playing = const MediaState._(3);
- static const MediaState ended = const MediaState._(4);
-
- const MediaState._(int v) : super(v);
-
- static const Map<String, MediaState> valuesMap = const {
- "fault": fault,
- "unprepared": unprepared,
- "paused": paused,
- "playing": playing,
- "ended": ended,
- };
- static const List<MediaState> values = const [
- fault,
- unprepared,
- paused,
- playing,
- ended,
- ];
-
- static MediaState valueOf(String name) => valuesMap[name];
-
- factory MediaState(int v) {
- switch (v) {
- case 0:
- return MediaState.fault;
- case 1:
- return MediaState.unprepared;
- case 2:
- return MediaState.paused;
- case 3:
- return MediaState.playing;
- case 4:
- return MediaState.ended;
- default:
- return null;
- }
- }
-
- static MediaState decode(bindings.Decoder decoder0, int offset) {
- int v = decoder0.decodeUint32(offset);
- MediaState result = new MediaState(v);
- if (result == null) {
- throw new bindings.MojoCodecError(
- 'Bad value $v for enum MediaState.');
- }
- return result;
- }
-
- String toString() {
- switch(this) {
- case fault:
- return 'MediaState.fault';
- case unprepared:
- return 'MediaState.unprepared';
- case paused:
- return 'MediaState.paused';
- case playing:
- return 'MediaState.playing';
- case ended:
- return 'MediaState.ended';
- default:
- return null;
- }
- }
-
- int toJson() => mojoEnumValue;
-}
-
-
-
-
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/media/rate_control.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/media/rate_control.mojom.dart
deleted file mode 100644
index f810a8a..0000000
--- a/mojo/dart/packages/mojo_services/lib/mojo/media/rate_control.mojom.dart
+++ /dev/null
@@ -1,1235 +0,0 @@
-// Copyright 2014 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.
-
-library rate_control_mojom;
-import 'dart:async';
-import 'package:mojo/bindings.dart' as bindings;
-import 'package:mojo/core.dart' as core;
-import 'package:mojo/mojo/bindings/types/service_describer.mojom.dart' as service_describer;
-
-
-
-class TimelineQuad extends bindings.Struct {
- static const List<bindings.StructDataHeader> kVersions = const [
- const bindings.StructDataHeader(32, 0)
- ];
- int referenceOffset = 0;
- int targetOffset = 0;
- int referenceDelta = 0;
- int targetDelta = 1;
-
- TimelineQuad() : super(kVersions.last.size);
-
- static TimelineQuad deserialize(bindings.Message message) {
- var decoder = new bindings.Decoder(message);
- var result = decode(decoder);
- if (decoder.excessHandles != null) {
- decoder.excessHandles.forEach((h) => h.close());
- }
- return result;
- }
-
- static TimelineQuad decode(bindings.Decoder decoder0) {
- if (decoder0 == null) {
- return null;
- }
- TimelineQuad result = new TimelineQuad();
-
- var mainDataHeader = decoder0.decodeStructDataHeader();
- if (mainDataHeader.version <= kVersions.last.version) {
- // Scan in reverse order to optimize for more recent versions.
- for (int i = kVersions.length - 1; i >= 0; --i) {
- if (mainDataHeader.version >= kVersions[i].version) {
- if (mainDataHeader.size == kVersions[i].size) {
- // Found a match.
- break;
- }
- throw new bindings.MojoCodecError(
- 'Header size doesn\'t correspond to known version size.');
- }
- }
- } else if (mainDataHeader.size < kVersions.last.size) {
- throw new bindings.MojoCodecError(
- 'Message newer than the last known version cannot be shorter than '
- 'required by the last known version.');
- }
- if (mainDataHeader.version >= 0) {
-
- result.referenceOffset = decoder0.decodeInt64(8);
- }
- if (mainDataHeader.version >= 0) {
-
- result.targetOffset = decoder0.decodeInt64(16);
- }
- if (mainDataHeader.version >= 0) {
-
- result.referenceDelta = decoder0.decodeUint32(24);
- }
- if (mainDataHeader.version >= 0) {
-
- result.targetDelta = decoder0.decodeUint32(28);
- }
- return result;
- }
-
- void encode(bindings.Encoder encoder) {
- var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
- try {
- encoder0.encodeInt64(referenceOffset, 8);
- } on bindings.MojoCodecError catch(e) {
- e.message = "Error encountered while encoding field "
- "referenceOffset of struct TimelineQuad: $e";
- rethrow;
- }
- try {
- encoder0.encodeInt64(targetOffset, 16);
- } on bindings.MojoCodecError catch(e) {
- e.message = "Error encountered while encoding field "
- "targetOffset of struct TimelineQuad: $e";
- rethrow;
- }
- try {
- encoder0.encodeUint32(referenceDelta, 24);
- } on bindings.MojoCodecError catch(e) {
- e.message = "Error encountered while encoding field "
- "referenceDelta of struct TimelineQuad: $e";
- rethrow;
- }
- try {
- encoder0.encodeUint32(targetDelta, 28);
- } on bindings.MojoCodecError catch(e) {
- e.message = "Error encountered while encoding field "
- "targetDelta of struct TimelineQuad: $e";
- rethrow;
- }
- }
-
- String toString() {
- return "TimelineQuad("
- "referenceOffset: $referenceOffset" ", "
- "targetOffset: $targetOffset" ", "
- "referenceDelta: $referenceDelta" ", "
- "targetDelta: $targetDelta" ")";
- }
-
- Map toJson() {
- Map map = new Map();
- map["referenceOffset"] = referenceOffset;
- map["targetOffset"] = targetOffset;
- map["referenceDelta"] = referenceDelta;
- map["targetDelta"] = targetDelta;
- return map;
- }
-}
-
-
-class TimelineTransform extends bindings.Struct {
- static const List<bindings.StructDataHeader> kVersions = const [
- const bindings.StructDataHeader(24, 0)
- ];
- static const int kLocalTimeId = 4294967295;
- static const int kContextual = 4294967294;
- TimelineQuad quad = null;
- int referenceTimelineId = 4294967294;
- int targetTimelineId = 4294967295;
-
- TimelineTransform() : super(kVersions.last.size);
-
- static TimelineTransform deserialize(bindings.Message message) {
- var decoder = new bindings.Decoder(message);
- var result = decode(decoder);
- if (decoder.excessHandles != null) {
- decoder.excessHandles.forEach((h) => h.close());
- }
- return result;
- }
-
- static TimelineTransform decode(bindings.Decoder decoder0) {
- if (decoder0 == null) {
- return null;
- }
- TimelineTransform result = new TimelineTransform();
-
- var mainDataHeader = decoder0.decodeStructDataHeader();
- if (mainDataHeader.version <= kVersions.last.version) {
- // Scan in reverse order to optimize for more recent versions.
- for (int i = kVersions.length - 1; i >= 0; --i) {
- if (mainDataHeader.version >= kVersions[i].version) {
- if (mainDataHeader.size == kVersions[i].size) {
- // Found a match.
- break;
- }
- throw new bindings.MojoCodecError(
- 'Header size doesn\'t correspond to known version size.');
- }
- }
- } else if (mainDataHeader.size < kVersions.last.size) {
- throw new bindings.MojoCodecError(
- 'Message newer than the last known version cannot be shorter than '
- 'required by the last known version.');
- }
- if (mainDataHeader.version >= 0) {
-
- var decoder1 = decoder0.decodePointer(8, false);
- result.quad = TimelineQuad.decode(decoder1);
- }
- if (mainDataHeader.version >= 0) {
-
- result.referenceTimelineId = decoder0.decodeUint32(16);
- }
- if (mainDataHeader.version >= 0) {
-
- result.targetTimelineId = decoder0.decodeUint32(20);
- }
- return result;
- }
-
- void encode(bindings.Encoder encoder) {
- var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
- try {
- encoder0.encodeStruct(quad, 8, false);
- } on bindings.MojoCodecError catch(e) {
- e.message = "Error encountered while encoding field "
- "quad of struct TimelineTransform: $e";
- rethrow;
- }
- try {
- encoder0.encodeUint32(referenceTimelineId, 16);
- } on bindings.MojoCodecError catch(e) {
- e.message = "Error encountered while encoding field "
- "referenceTimelineId of struct TimelineTransform: $e";
- rethrow;
- }
- try {
- encoder0.encodeUint32(targetTimelineId, 20);
- } on bindings.MojoCodecError catch(e) {
- e.message = "Error encountered while encoding field "
- "targetTimelineId of struct TimelineTransform: $e";
- rethrow;
- }
- }
-
- String toString() {
- return "TimelineTransform("
- "quad: $quad" ", "
- "referenceTimelineId: $referenceTimelineId" ", "
- "targetTimelineId: $targetTimelineId" ")";
- }
-
- Map toJson() {
- Map map = new Map();
- map["quad"] = quad;
- map["referenceTimelineId"] = referenceTimelineId;
- map["targetTimelineId"] = targetTimelineId;
- return map;
- }
-}
-
-
-class _RateControlGetCurrentTransformParams extends bindings.Struct {
- static const List<bindings.StructDataHeader> kVersions = const [
- const bindings.StructDataHeader(8, 0)
- ];
-
- _RateControlGetCurrentTransformParams() : super(kVersions.last.size);
-
- static _RateControlGetCurrentTransformParams deserialize(bindings.Message message) {
- var decoder = new bindings.Decoder(message);
- var result = decode(decoder);
- if (decoder.excessHandles != null) {
- decoder.excessHandles.forEach((h) => h.close());
- }
- return result;
- }
-
- static _RateControlGetCurrentTransformParams decode(bindings.Decoder decoder0) {
- if (decoder0 == null) {
- return null;
- }
- _RateControlGetCurrentTransformParams result = new _RateControlGetCurrentTransformParams();
-
- var mainDataHeader = decoder0.decodeStructDataHeader();
- if (mainDataHeader.version <= kVersions.last.version) {
- // Scan in reverse order to optimize for more recent versions.
- for (int i = kVersions.length - 1; i >= 0; --i) {
- if (mainDataHeader.version >= kVersions[i].version) {
- if (mainDataHeader.size == kVersions[i].size) {
- // Found a match.
- break;
- }
- throw new bindings.MojoCodecError(
- 'Header size doesn\'t correspond to known version size.');
- }
- }
- } else if (mainDataHeader.size < kVersions.last.size) {
- throw new bindings.MojoCodecError(
- 'Message newer than the last known version cannot be shorter than '
- 'required by the last known version.');
- }
- return result;
- }
-
- void encode(bindings.Encoder encoder) {
- encoder.getStructEncoderAtOffset(kVersions.last);
- }
-
- String toString() {
- return "_RateControlGetCurrentTransformParams("")";
- }
-
- Map toJson() {
- Map map = new Map();
- return map;
- }
-}
-
-
-class RateControlGetCurrentTransformResponseParams extends bindings.Struct {
- static const List<bindings.StructDataHeader> kVersions = const [
- const bindings.StructDataHeader(16, 0)
- ];
- TimelineTransform trans = null;
-
- RateControlGetCurrentTransformResponseParams() : super(kVersions.last.size);
-
- static RateControlGetCurrentTransformResponseParams deserialize(bindings.Message message) {
- var decoder = new bindings.Decoder(message);
- var result = decode(decoder);
- if (decoder.excessHandles != null) {
- decoder.excessHandles.forEach((h) => h.close());
- }
- return result;
- }
-
- static RateControlGetCurrentTransformResponseParams decode(bindings.Decoder decoder0) {
- if (decoder0 == null) {
- return null;
- }
- RateControlGetCurrentTransformResponseParams result = new RateControlGetCurrentTransformResponseParams();
-
- var mainDataHeader = decoder0.decodeStructDataHeader();
- if (mainDataHeader.version <= kVersions.last.version) {
- // Scan in reverse order to optimize for more recent versions.
- for (int i = kVersions.length - 1; i >= 0; --i) {
- if (mainDataHeader.version >= kVersions[i].version) {
- if (mainDataHeader.size == kVersions[i].size) {
- // Found a match.
- break;
- }
- throw new bindings.MojoCodecError(
- 'Header size doesn\'t correspond to known version size.');
- }
- }
- } else if (mainDataHeader.size < kVersions.last.size) {
- throw new bindings.MojoCodecError(
- 'Message newer than the last known version cannot be shorter than '
- 'required by the last known version.');
- }
- if (mainDataHeader.version >= 0) {
-
- var decoder1 = decoder0.decodePointer(8, false);
- result.trans = TimelineTransform.decode(decoder1);
- }
- return result;
- }
-
- void encode(bindings.Encoder encoder) {
- var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
- try {
- encoder0.encodeStruct(trans, 8, false);
- } on bindings.MojoCodecError catch(e) {
- e.message = "Error encountered while encoding field "
- "trans of struct RateControlGetCurrentTransformResponseParams: $e";
- rethrow;
- }
- }
-
- String toString() {
- return "RateControlGetCurrentTransformResponseParams("
- "trans: $trans" ")";
- }
-
- Map toJson() {
- Map map = new Map();
- map["trans"] = trans;
- return map;
- }
-}
-
-
-class _RateControlSetCurrentQuadParams extends bindings.Struct {
- static const List<bindings.StructDataHeader> kVersions = const [
- const bindings.StructDataHeader(16, 0)
- ];
- TimelineQuad quad = null;
-
- _RateControlSetCurrentQuadParams() : super(kVersions.last.size);
-
- static _RateControlSetCurrentQuadParams deserialize(bindings.Message message) {
- var decoder = new bindings.Decoder(message);
- var result = decode(decoder);
- if (decoder.excessHandles != null) {
- decoder.excessHandles.forEach((h) => h.close());
- }
- return result;
- }
-
- static _RateControlSetCurrentQuadParams decode(bindings.Decoder decoder0) {
- if (decoder0 == null) {
- return null;
- }
- _RateControlSetCurrentQuadParams result = new _RateControlSetCurrentQuadParams();
-
- var mainDataHeader = decoder0.decodeStructDataHeader();
- if (mainDataHeader.version <= kVersions.last.version) {
- // Scan in reverse order to optimize for more recent versions.
- for (int i = kVersions.length - 1; i >= 0; --i) {
- if (mainDataHeader.version >= kVersions[i].version) {
- if (mainDataHeader.size == kVersions[i].size) {
- // Found a match.
- break;
- }
- throw new bindings.MojoCodecError(
- 'Header size doesn\'t correspond to known version size.');
- }
- }
- } else if (mainDataHeader.size < kVersions.last.size) {
- throw new bindings.MojoCodecError(
- 'Message newer than the last known version cannot be shorter than '
- 'required by the last known version.');
- }
- if (mainDataHeader.version >= 0) {
-
- var decoder1 = decoder0.decodePointer(8, false);
- result.quad = TimelineQuad.decode(decoder1);
- }
- return result;
- }
-
- void encode(bindings.Encoder encoder) {
- var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
- try {
- encoder0.encodeStruct(quad, 8, false);
- } on bindings.MojoCodecError catch(e) {
- e.message = "Error encountered while encoding field "
- "quad of struct _RateControlSetCurrentQuadParams: $e";
- rethrow;
- }
- }
-
- String toString() {
- return "_RateControlSetCurrentQuadParams("
- "quad: $quad" ")";
- }
-
- Map toJson() {
- Map map = new Map();
- map["quad"] = quad;
- return map;
- }
-}
-
-
-class _RateControlSetTargetTimelineIdParams extends bindings.Struct {
- static const List<bindings.StructDataHeader> kVersions = const [
- const bindings.StructDataHeader(16, 0)
- ];
- int id = 0;
-
- _RateControlSetTargetTimelineIdParams() : super(kVersions.last.size);
-
- static _RateControlSetTargetTimelineIdParams deserialize(bindings.Message message) {
- var decoder = new bindings.Decoder(message);
- var result = decode(decoder);
- if (decoder.excessHandles != null) {
- decoder.excessHandles.forEach((h) => h.close());
- }
- return result;
- }
-
- static _RateControlSetTargetTimelineIdParams decode(bindings.Decoder decoder0) {
- if (decoder0 == null) {
- return null;
- }
- _RateControlSetTargetTimelineIdParams result = new _RateControlSetTargetTimelineIdParams();
-
- var mainDataHeader = decoder0.decodeStructDataHeader();
- if (mainDataHeader.version <= kVersions.last.version) {
- // Scan in reverse order to optimize for more recent versions.
- for (int i = kVersions.length - 1; i >= 0; --i) {
- if (mainDataHeader.version >= kVersions[i].version) {
- if (mainDataHeader.size == kVersions[i].size) {
- // Found a match.
- break;
- }
- throw new bindings.MojoCodecError(
- 'Header size doesn\'t correspond to known version size.');
- }
- }
- } else if (mainDataHeader.size < kVersions.last.size) {
- throw new bindings.MojoCodecError(
- 'Message newer than the last known version cannot be shorter than '
- 'required by the last known version.');
- }
- if (mainDataHeader.version >= 0) {
-
- result.id = decoder0.decodeUint32(8);
- }
- return result;
- }
-
- void encode(bindings.Encoder encoder) {
- var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
- try {
- encoder0.encodeUint32(id, 8);
- } on bindings.MojoCodecError catch(e) {
- e.message = "Error encountered while encoding field "
- "id of struct _RateControlSetTargetTimelineIdParams: $e";
- rethrow;
- }
- }
-
- String toString() {
- return "_RateControlSetTargetTimelineIdParams("
- "id: $id" ")";
- }
-
- Map toJson() {
- Map map = new Map();
- map["id"] = id;
- return map;
- }
-}
-
-
-class _RateControlSetRateParams extends bindings.Struct {
- static const List<bindings.StructDataHeader> kVersions = const [
- const bindings.StructDataHeader(16, 0)
- ];
- int referenceDelta = 0;
- int targetDelta = 0;
-
- _RateControlSetRateParams() : super(kVersions.last.size);
-
- static _RateControlSetRateParams deserialize(bindings.Message message) {
- var decoder = new bindings.Decoder(message);
- var result = decode(decoder);
- if (decoder.excessHandles != null) {
- decoder.excessHandles.forEach((h) => h.close());
- }
- return result;
- }
-
- static _RateControlSetRateParams decode(bindings.Decoder decoder0) {
- if (decoder0 == null) {
- return null;
- }
- _RateControlSetRateParams result = new _RateControlSetRateParams();
-
- var mainDataHeader = decoder0.decodeStructDataHeader();
- if (mainDataHeader.version <= kVersions.last.version) {
- // Scan in reverse order to optimize for more recent versions.
- for (int i = kVersions.length - 1; i >= 0; --i) {
- if (mainDataHeader.version >= kVersions[i].version) {
- if (mainDataHeader.size == kVersions[i].size) {
- // Found a match.
- break;
- }
- throw new bindings.MojoCodecError(
- 'Header size doesn\'t correspond to known version size.');
- }
- }
- } else if (mainDataHeader.size < kVersions.last.size) {
- throw new bindings.MojoCodecError(
- 'Message newer than the last known version cannot be shorter than '
- 'required by the last known version.');
- }
- if (mainDataHeader.version >= 0) {
-
- result.referenceDelta = decoder0.decodeUint32(8);
- }
- if (mainDataHeader.version >= 0) {
-
- result.targetDelta = decoder0.decodeUint32(12);
- }
- return result;
- }
-
- void encode(bindings.Encoder encoder) {
- var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
- try {
- encoder0.encodeUint32(referenceDelta, 8);
- } on bindings.MojoCodecError catch(e) {
- e.message = "Error encountered while encoding field "
- "referenceDelta of struct _RateControlSetRateParams: $e";
- rethrow;
- }
- try {
- encoder0.encodeUint32(targetDelta, 12);
- } on bindings.MojoCodecError catch(e) {
- e.message = "Error encountered while encoding field "
- "targetDelta of struct _RateControlSetRateParams: $e";
- rethrow;
- }
- }
-
- String toString() {
- return "_RateControlSetRateParams("
- "referenceDelta: $referenceDelta" ", "
- "targetDelta: $targetDelta" ")";
- }
-
- Map toJson() {
- Map map = new Map();
- map["referenceDelta"] = referenceDelta;
- map["targetDelta"] = targetDelta;
- return map;
- }
-}
-
-
-class _RateControlSetRateAtReferenceTimeParams extends bindings.Struct {
- static const List<bindings.StructDataHeader> kVersions = const [
- const bindings.StructDataHeader(24, 0)
- ];
- int referenceDelta = 0;
- int targetDelta = 0;
- int referenceTime = 0;
-
- _RateControlSetRateAtReferenceTimeParams() : super(kVersions.last.size);
-
- static _RateControlSetRateAtReferenceTimeParams deserialize(bindings.Message message) {
- var decoder = new bindings.Decoder(message);
- var result = decode(decoder);
- if (decoder.excessHandles != null) {
- decoder.excessHandles.forEach((h) => h.close());
- }
- return result;
- }
-
- static _RateControlSetRateAtReferenceTimeParams decode(bindings.Decoder decoder0) {
- if (decoder0 == null) {
- return null;
- }
- _RateControlSetRateAtReferenceTimeParams result = new _RateControlSetRateAtReferenceTimeParams();
-
- var mainDataHeader = decoder0.decodeStructDataHeader();
- if (mainDataHeader.version <= kVersions.last.version) {
- // Scan in reverse order to optimize for more recent versions.
- for (int i = kVersions.length - 1; i >= 0; --i) {
- if (mainDataHeader.version >= kVersions[i].version) {
- if (mainDataHeader.size == kVersions[i].size) {
- // Found a match.
- break;
- }
- throw new bindings.MojoCodecError(
- 'Header size doesn\'t correspond to known version size.');
- }
- }
- } else if (mainDataHeader.size < kVersions.last.size) {
- throw new bindings.MojoCodecError(
- 'Message newer than the last known version cannot be shorter than '
- 'required by the last known version.');
- }
- if (mainDataHeader.version >= 0) {
-
- result.referenceDelta = decoder0.decodeUint32(8);
- }
- if (mainDataHeader.version >= 0) {
-
- result.targetDelta = decoder0.decodeUint32(12);
- }
- if (mainDataHeader.version >= 0) {
-
- result.referenceTime = decoder0.decodeInt64(16);
- }
- return result;
- }
-
- void encode(bindings.Encoder encoder) {
- var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
- try {
- encoder0.encodeUint32(referenceDelta, 8);
- } on bindings.MojoCodecError catch(e) {
- e.message = "Error encountered while encoding field "
- "referenceDelta of struct _RateControlSetRateAtReferenceTimeParams: $e";
- rethrow;
- }
- try {
- encoder0.encodeUint32(targetDelta, 12);
- } on bindings.MojoCodecError catch(e) {
- e.message = "Error encountered while encoding field "
- "targetDelta of struct _RateControlSetRateAtReferenceTimeParams: $e";
- rethrow;
- }
- try {
- encoder0.encodeInt64(referenceTime, 16);
- } on bindings.MojoCodecError catch(e) {
- e.message = "Error encountered while encoding field "
- "referenceTime of struct _RateControlSetRateAtReferenceTimeParams: $e";
- rethrow;
- }
- }
-
- String toString() {
- return "_RateControlSetRateAtReferenceTimeParams("
- "referenceDelta: $referenceDelta" ", "
- "targetDelta: $targetDelta" ", "
- "referenceTime: $referenceTime" ")";
- }
-
- Map toJson() {
- Map map = new Map();
- map["referenceDelta"] = referenceDelta;
- map["targetDelta"] = targetDelta;
- map["referenceTime"] = referenceTime;
- return map;
- }
-}
-
-
-class _RateControlSetRateAtTargetTimeParams extends bindings.Struct {
- static const List<bindings.StructDataHeader> kVersions = const [
- const bindings.StructDataHeader(24, 0)
- ];
- int referenceDelta = 0;
- int targetDelta = 0;
- int targetTime = 0;
-
- _RateControlSetRateAtTargetTimeParams() : super(kVersions.last.size);
-
- static _RateControlSetRateAtTargetTimeParams deserialize(bindings.Message message) {
- var decoder = new bindings.Decoder(message);
- var result = decode(decoder);
- if (decoder.excessHandles != null) {
- decoder.excessHandles.forEach((h) => h.close());
- }
- return result;
- }
-
- static _RateControlSetRateAtTargetTimeParams decode(bindings.Decoder decoder0) {
- if (decoder0 == null) {
- return null;
- }
- _RateControlSetRateAtTargetTimeParams result = new _RateControlSetRateAtTargetTimeParams();
-
- var mainDataHeader = decoder0.decodeStructDataHeader();
- if (mainDataHeader.version <= kVersions.last.version) {
- // Scan in reverse order to optimize for more recent versions.
- for (int i = kVersions.length - 1; i >= 0; --i) {
- if (mainDataHeader.version >= kVersions[i].version) {
- if (mainDataHeader.size == kVersions[i].size) {
- // Found a match.
- break;
- }
- throw new bindings.MojoCodecError(
- 'Header size doesn\'t correspond to known version size.');
- }
- }
- } else if (mainDataHeader.size < kVersions.last.size) {
- throw new bindings.MojoCodecError(
- 'Message newer than the last known version cannot be shorter than '
- 'required by the last known version.');
- }
- if (mainDataHeader.version >= 0) {
-
- result.referenceDelta = decoder0.decodeUint32(8);
- }
- if (mainDataHeader.version >= 0) {
-
- result.targetDelta = decoder0.decodeUint32(12);
- }
- if (mainDataHeader.version >= 0) {
-
- result.targetTime = decoder0.decodeInt64(16);
- }
- return result;
- }
-
- void encode(bindings.Encoder encoder) {
- var encoder0 = encoder.getStructEncoderAtOffset(kVersions.last);
- try {
- encoder0.encodeUint32(referenceDelta, 8);
- } on bindings.MojoCodecError catch(e) {
- e.message = "Error encountered while encoding field "
- "referenceDelta of struct _RateControlSetRateAtTargetTimeParams: $e";
- rethrow;
- }
- try {
- encoder0.encodeUint32(targetDelta, 12);
- } on bindings.MojoCodecError catch(e) {
- e.message = "Error encountered while encoding field "
- "targetDelta of struct _RateControlSetRateAtTargetTimeParams: $e";
- rethrow;
- }
- try {
- encoder0.encodeInt64(targetTime, 16);
- } on bindings.MojoCodecError catch(e) {
- e.message = "Error encountered while encoding field "
- "targetTime of struct _RateControlSetRateAtTargetTimeParams: $e";
- rethrow;
- }
- }
-
- String toString() {
- return "_RateControlSetRateAtTargetTimeParams("
- "referenceDelta: $referenceDelta" ", "
- "targetDelta: $targetDelta" ", "
- "targetTime: $targetTime" ")";
- }
-
- Map toJson() {
- Map map = new Map();
- map["referenceDelta"] = referenceDelta;
- map["targetDelta"] = targetDelta;
- map["targetTime"] = targetTime;
- return map;
- }
-}
-
-
-class _RateControlCancelPendingChangesParams extends bindings.Struct {
- static const List<bindings.StructDataHeader> kVersions = const [
- const bindings.StructDataHeader(8, 0)
- ];
-
- _RateControlCancelPendingChangesParams() : super(kVersions.last.size);
-
- static _RateControlCancelPendingChangesParams deserialize(bindings.Message message) {
- var decoder = new bindings.Decoder(message);
- var result = decode(decoder);
- if (decoder.excessHandles != null) {
- decoder.excessHandles.forEach((h) => h.close());
- }
- return result;
- }
-
- static _RateControlCancelPendingChangesParams decode(bindings.Decoder decoder0) {
- if (decoder0 == null) {
- return null;
- }
- _RateControlCancelPendingChangesParams result = new _RateControlCancelPendingChangesParams();
-
- var mainDataHeader = decoder0.decodeStructDataHeader();
- if (mainDataHeader.version <= kVersions.last.version) {
- // Scan in reverse order to optimize for more recent versions.
- for (int i = kVersions.length - 1; i >= 0; --i) {
- if (mainDataHeader.version >= kVersions[i].version) {
- if (mainDataHeader.size == kVersions[i].size) {
- // Found a match.
- break;
- }
- throw new bindings.MojoCodecError(
- 'Header size doesn\'t correspond to known version size.');
- }
- }
- } else if (mainDataHeader.size < kVersions.last.size) {
- throw new bindings.MojoCodecError(
- 'Message newer than the last known version cannot be shorter than '
- 'required by the last known version.');
- }
- return result;
- }
-
- void encode(bindings.Encoder encoder) {
- encoder.getStructEncoderAtOffset(kVersions.last);
- }
-
- String toString() {
- return "_RateControlCancelPendingChangesParams("")";
- }
-
- Map toJson() {
- Map map = new Map();
- return map;
- }
-}
-
-const int _rateControlMethodGetCurrentTransformName = 0;
-const int _rateControlMethodSetCurrentQuadName = 1;
-const int _rateControlMethodSetTargetTimelineIdName = 2;
-const int _rateControlMethodSetRateName = 3;
-const int _rateControlMethodSetRateAtReferenceTimeName = 4;
-const int _rateControlMethodSetRateAtTargetTimeName = 5;
-const int _rateControlMethodCancelPendingChangesName = 6;
-
-class _RateControlServiceDescription implements service_describer.ServiceDescription {
- dynamic getTopLevelInterface([Function responseFactory]) =>
- responseFactory(null);
-
- dynamic getTypeDefinition(String typeKey, [Function responseFactory]) =>
- responseFactory(null);
-
- dynamic getAllTypeDefinitions([Function responseFactory]) =>
- responseFactory(null);
-}
-
-abstract class RateControl {
- static const String serviceName = null;
-
- static service_describer.ServiceDescription _cachedServiceDescription;
- static service_describer.ServiceDescription get serviceDescription {
- if (_cachedServiceDescription == null) {
- _cachedServiceDescription = new _RateControlServiceDescription();
- }
- return _cachedServiceDescription;
- }
-
- static RateControlProxy connectToService(
- bindings.ServiceConnector s, String url, [String serviceName]) {
- RateControlProxy p = new RateControlProxy.unbound();
- String name = serviceName ?? RateControl.serviceName;
- if ((name == null) || name.isEmpty) {
- throw new core.MojoApiError(
- "If an interface has no ServiceName, then one must be provided.");
- }
- s.connectToService(url, p, name);
- return p;
- }
- dynamic getCurrentTransform([Function responseFactory = null]);
- void setCurrentQuad(TimelineQuad quad);
- void setTargetTimelineId(int id);
- void setRate(int referenceDelta, int targetDelta);
- void setRateAtReferenceTime(int referenceDelta, int targetDelta, int referenceTime);
- void setRateAtTargetTime(int referenceDelta, int targetDelta, int targetTime);
- void cancelPendingChanges();
-}
-
-abstract class RateControlInterface
- implements bindings.MojoInterface<RateControl>,
- RateControl {
- factory RateControlInterface([RateControl impl]) =>
- new RateControlStub.unbound(impl);
- factory RateControlInterface.fromEndpoint(
- core.MojoMessagePipeEndpoint endpoint,
- [RateControl impl]) =>
- new RateControlStub.fromEndpoint(endpoint, impl);
-}
-
-abstract class RateControlInterfaceRequest
- implements bindings.MojoInterface<RateControl>,
- RateControl {
- factory RateControlInterfaceRequest() =>
- new RateControlProxy.unbound();
-}
-
-class _RateControlProxyControl
- extends bindings.ProxyMessageHandler
- implements bindings.ProxyControl<RateControl> {
- _RateControlProxyControl.fromEndpoint(
- core.MojoMessagePipeEndpoint endpoint) : super.fromEndpoint(endpoint);
-
- _RateControlProxyControl.fromHandle(
- core.MojoHandle handle) : super.fromHandle(handle);
-
- _RateControlProxyControl.unbound() : super.unbound();
-
- String get serviceName => RateControl.serviceName;
-
- void handleResponse(bindings.ServiceMessage message) {
- switch (message.header.type) {
- case _rateControlMethodGetCurrentTransformName:
- var r = RateControlGetCurrentTransformResponseParams.deserialize(
- message.payload);
- if (!message.header.hasRequestId) {
- proxyError("Expected a message with a valid request Id.");
- return;
- }
- Completer c = completerMap[message.header.requestId];
- if (c == null) {
- proxyError(
- "Message had unknown request Id: ${message.header.requestId}");
- return;
- }
- completerMap.remove(message.header.requestId);
- if (c.isCompleted) {
- proxyError("Response completer already completed");
- return;
- }
- c.complete(r);
- break;
- default:
- proxyError("Unexpected message type: ${message.header.type}");
- close(immediate: true);
- break;
- }
- }
-
- RateControl get impl => null;
- set impl(RateControl _) {
- throw new core.MojoApiError("The impl of a Proxy cannot be set.");
- }
-
- @override
- String toString() {
- var superString = super.toString();
- return "_RateControlProxyControl($superString)";
- }
-}
-
-class RateControlProxy
- extends bindings.Proxy<RateControl>
- implements RateControl,
- RateControlInterface,
- RateControlInterfaceRequest {
- RateControlProxy.fromEndpoint(
- core.MojoMessagePipeEndpoint endpoint)
- : super(new _RateControlProxyControl.fromEndpoint(endpoint));
-
- RateControlProxy.fromHandle(core.MojoHandle handle)
- : super(new _RateControlProxyControl.fromHandle(handle));
-
- RateControlProxy.unbound()
- : super(new _RateControlProxyControl.unbound());
-
- static RateControlProxy newFromEndpoint(
- core.MojoMessagePipeEndpoint endpoint) {
- assert(endpoint.setDescription("For RateControlProxy"));
- return new RateControlProxy.fromEndpoint(endpoint);
- }
-
-
- dynamic getCurrentTransform([Function responseFactory = null]) {
- var params = new _RateControlGetCurrentTransformParams();
- return ctrl.sendMessageWithRequestId(
- params,
- _rateControlMethodGetCurrentTransformName,
- -1,
- bindings.MessageHeader.kMessageExpectsResponse);
- }
- void setCurrentQuad(TimelineQuad quad) {
- if (!ctrl.isBound) {
- ctrl.proxyError("The Proxy is closed.");
- return;
- }
- var params = new _RateControlSetCurrentQuadParams();
- params.quad = quad;
- ctrl.sendMessage(params,
- _rateControlMethodSetCurrentQuadName);
- }
- void setTargetTimelineId(int id) {
- if (!ctrl.isBound) {
- ctrl.proxyError("The Proxy is closed.");
- return;
- }
- var params = new _RateControlSetTargetTimelineIdParams();
- params.id = id;
- ctrl.sendMessage(params,
- _rateControlMethodSetTargetTimelineIdName);
- }
- void setRate(int referenceDelta, int targetDelta) {
- if (!ctrl.isBound) {
- ctrl.proxyError("The Proxy is closed.");
- return;
- }
- var params = new _RateControlSetRateParams();
- params.referenceDelta = referenceDelta;
- params.targetDelta = targetDelta;
- ctrl.sendMessage(params,
- _rateControlMethodSetRateName);
- }
- void setRateAtReferenceTime(int referenceDelta, int targetDelta, int referenceTime) {
- if (!ctrl.isBound) {
- ctrl.proxyError("The Proxy is closed.");
- return;
- }
- var params = new _RateControlSetRateAtReferenceTimeParams();
- params.referenceDelta = referenceDelta;
- params.targetDelta = targetDelta;
- params.referenceTime = referenceTime;
- ctrl.sendMessage(params,
- _rateControlMethodSetRateAtReferenceTimeName);
- }
- void setRateAtTargetTime(int referenceDelta, int targetDelta, int targetTime) {
- if (!ctrl.isBound) {
- ctrl.proxyError("The Proxy is closed.");
- return;
- }
- var params = new _RateControlSetRateAtTargetTimeParams();
- params.referenceDelta = referenceDelta;
- params.targetDelta = targetDelta;
- params.targetTime = targetTime;
- ctrl.sendMessage(params,
- _rateControlMethodSetRateAtTargetTimeName);
- }
- void cancelPendingChanges() {
- if (!ctrl.isBound) {
- ctrl.proxyError("The Proxy is closed.");
- return;
- }
- var params = new _RateControlCancelPendingChangesParams();
- ctrl.sendMessage(params,
- _rateControlMethodCancelPendingChangesName);
- }
-}
-
-class _RateControlStubControl
- extends bindings.StubMessageHandler
- implements bindings.StubControl<RateControl> {
- RateControl _impl;
-
- _RateControlStubControl.fromEndpoint(
- core.MojoMessagePipeEndpoint endpoint, [RateControl impl])
- : super.fromEndpoint(endpoint, autoBegin: impl != null) {
- _impl = impl;
- }
-
- _RateControlStubControl.fromHandle(
- core.MojoHandle handle, [RateControl impl])
- : super.fromHandle(handle, autoBegin: impl != null) {
- _impl = impl;
- }
-
- _RateControlStubControl.unbound([this._impl]) : super.unbound();
-
- String get serviceName => RateControl.serviceName;
-
-
- RateControlGetCurrentTransformResponseParams _rateControlGetCurrentTransformResponseParamsFactory(TimelineTransform trans) {
- var result = new RateControlGetCurrentTransformResponseParams();
- result.trans = trans;
- return result;
- }
-
- dynamic handleMessage(bindings.ServiceMessage message) {
- if (bindings.ControlMessageHandler.isControlMessage(message)) {
- return bindings.ControlMessageHandler.handleMessage(this,
- 0,
- message);
- }
- if (_impl == null) {
- throw new core.MojoApiError("$this has no implementation set");
- }
- switch (message.header.type) {
- case _rateControlMethodGetCurrentTransformName:
- var response = _impl.getCurrentTransform(_rateControlGetCurrentTransformResponseParamsFactory);
- if (response is Future) {
- return response.then((response) {
- if (response != null) {
- return buildResponseWithId(
- response,
- _rateControlMethodGetCurrentTransformName,
- message.header.requestId,
- bindings.MessageHeader.kMessageIsResponse);
- }
- });
- } else if (response != null) {
- return buildResponseWithId(
- response,
- _rateControlMethodGetCurrentTransformName,
- message.header.requestId,
- bindings.MessageHeader.kMessageIsResponse);
- }
- break;
- case _rateControlMethodSetCurrentQuadName:
- var params = _RateControlSetCurrentQuadParams.deserialize(
- message.payload);
- _impl.setCurrentQuad(params.quad);
- break;
- case _rateControlMethodSetTargetTimelineIdName:
- var params = _RateControlSetTargetTimelineIdParams.deserialize(
- message.payload);
- _impl.setTargetTimelineId(params.id);
- break;
- case _rateControlMethodSetRateName:
- var params = _RateControlSetRateParams.deserialize(
- message.payload);
- _impl.setRate(params.referenceDelta, params.targetDelta);
- break;
- case _rateControlMethodSetRateAtReferenceTimeName:
- var params = _RateControlSetRateAtReferenceTimeParams.deserialize(
- message.payload);
- _impl.setRateAtReferenceTime(params.referenceDelta, params.targetDelta, params.referenceTime);
- break;
- case _rateControlMethodSetRateAtTargetTimeName:
- var params = _RateControlSetRateAtTargetTimeParams.deserialize(
- message.payload);
- _impl.setRateAtTargetTime(params.referenceDelta, params.targetDelta, params.targetTime);
- break;
- case _rateControlMethodCancelPendingChangesName:
- _impl.cancelPendingChanges();
- break;
- default:
- throw new bindings.MojoCodecError("Unexpected message name");
- break;
- }
- return null;
- }
-
- RateControl get impl => _impl;
- set impl(RateControl d) {
- if (d == null) {
- throw new core.MojoApiError("$this: Cannot set a null implementation");
- }
- if (isBound && (_impl == null)) {
- beginHandlingEvents();
- }
- _impl = d;
- }
-
- @override
- void bind(core.MojoMessagePipeEndpoint endpoint) {
- super.bind(endpoint);
- if (!isOpen && (_impl != null)) {
- beginHandlingEvents();
- }
- }
-
- @override
- String toString() {
- var superString = super.toString();
- return "_RateControlStubControl($superString)";
- }
-
- int get version => 0;
-}
-
-class RateControlStub
- extends bindings.Stub<RateControl>
- implements RateControl,
- RateControlInterface,
- RateControlInterfaceRequest {
- RateControlStub.unbound([RateControl impl])
- : super(new _RateControlStubControl.unbound(impl));
-
- RateControlStub.fromEndpoint(
- core.MojoMessagePipeEndpoint endpoint, [RateControl impl])
- : super(new _RateControlStubControl.fromEndpoint(endpoint, impl));
-
- RateControlStub.fromHandle(
- core.MojoHandle handle, [RateControl impl])
- : super(new _RateControlStubControl.fromHandle(handle, impl));
-
- static RateControlStub newFromEndpoint(
- core.MojoMessagePipeEndpoint endpoint) {
- assert(endpoint.setDescription("For RateControlStub"));
- return new RateControlStub.fromEndpoint(endpoint);
- }
-
-
- dynamic getCurrentTransform([Function responseFactory = null]) {
- return impl.getCurrentTransform(responseFactory);
- }
- void setCurrentQuad(TimelineQuad quad) {
- return impl.setCurrentQuad(quad);
- }
- void setTargetTimelineId(int id) {
- return impl.setTargetTimelineId(id);
- }
- void setRate(int referenceDelta, int targetDelta) {
- return impl.setRate(referenceDelta, targetDelta);
- }
- void setRateAtReferenceTime(int referenceDelta, int targetDelta, int referenceTime) {
- return impl.setRateAtReferenceTime(referenceDelta, targetDelta, referenceTime);
- }
- void setRateAtTargetTime(int referenceDelta, int targetDelta, int targetTime) {
- return impl.setRateAtTargetTime(referenceDelta, targetDelta, targetTime);
- }
- void cancelPendingChanges() {
- return impl.cancelPendingChanges();
- }
-}
-
-
-
diff --git a/mojo/dart/packages/mojo_services/lib/mojo/media/timeline_controller.mojom.dart b/mojo/dart/packages/mojo_services/lib/mojo/media/timeline_controller.mojom.dart
index 8ea67ec..a457963 100644
--- a/mojo/dart/packages/mojo_services/lib/mojo/media/timeline_controller.mojom.dart
+++ b/mojo/dart/packages/mojo_services/lib/mojo/media/timeline_controller.mojom.dart
@@ -485,8 +485,46 @@
abstract class MediaTimelineController {
static const String serviceName = null;
- void addControlSite(Object controlSite);
- void getControlSite(Object controlSite);
+
+ static service_describer.ServiceDescription _cachedServiceDescription;
+ static service_describer.ServiceDescription get serviceDescription {
+ if (_cachedServiceDescription == null) {
+ _cachedServiceDescription = new _MediaTimelineControllerServiceDescription();
+ }
+ return _cachedServiceDescription;
+ }
+
+ static MediaTimelineControllerProxy connectToService(
+ bindings.ServiceConnector s, String url, [String serviceName]) {
+ MediaTimelineControllerProxy p = new MediaTimelineControllerProxy.unbound();
+ String name = serviceName ?? MediaTimelineController.serviceName;
+ if ((name == null) || name.isEmpty) {
+ throw new core.MojoApiError(
+ "If an interface has no ServiceName, then one must be provided.");
+ }
+ s.connectToService(url, p, name);
+ return p;
+ }
+ void addControlSite(MediaTimelineControlSiteInterface controlSite);
+ void getControlSite(MediaTimelineControlSiteInterfaceRequest controlSite);
+}
+
+abstract class MediaTimelineControllerInterface
+ implements bindings.MojoInterface<MediaTimelineController>,
+ MediaTimelineController {
+ factory MediaTimelineControllerInterface([MediaTimelineController impl]) =>
+ new MediaTimelineControllerStub.unbound(impl);
+ factory MediaTimelineControllerInterface.fromEndpoint(
+ core.MojoMessagePipeEndpoint endpoint,
+ [MediaTimelineController impl]) =>
+ new MediaTimelineControllerStub.fromEndpoint(endpoint, impl);
+}
+
+abstract class MediaTimelineControllerInterfaceRequest
+ implements bindings.MojoInterface<MediaTimelineController>,
+ MediaTimelineController {
+ factory MediaTimelineControllerInterfaceRequest() =>
+ new MediaTimelineControllerProxy.unbound();
}
class _MediaTimelineControllerProxyControl
@@ -555,7 +593,7 @@
ctrl.sendMessage(params,
_mediaTimelineControllerMethodAddControlSiteName);
}
- void getControlSite(Object controlSite) {
+ void getControlSite(MediaTimelineControlSiteInterfaceRequest controlSite) {
if (!ctrl.isBound) {
ctrl.proxyError("The Proxy is closed.");
return;
@@ -671,7 +709,7 @@
void addControlSite(MediaTimelineControlSiteInterface controlSite) {
return impl.addControlSite(controlSite);
}
- void getControlSite(Object controlSite) {
+ void getControlSite(MediaTimelineControlSiteInterfaceRequest controlSite) {
return impl.getControlSite(controlSite);
}
}
diff --git a/mojo/services/media/common/interfaces/BUILD.gn b/mojo/services/media/common/interfaces/BUILD.gn
index ffdb131..d3bf18d 100644
--- a/mojo/services/media/common/interfaces/BUILD.gn
+++ b/mojo/services/media/common/interfaces/BUILD.gn
@@ -9,7 +9,6 @@
sources = [
"media_common.mojom",
"media_metadata.mojom",
- "media_state.mojom",
"media_transport.mojom",
"media_types.mojom",
"timelines.mojom",
diff --git a/mojo/services/media/common/interfaces/media_state.mojom b/mojo/services/media/common/interfaces/media_state.mojom
deleted file mode 100644
index 76a6536..0000000
--- a/mojo/services/media/common/interfaces/media_state.mojom
+++ /dev/null
@@ -1,25 +0,0 @@
-// 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.
-
-[DartPackage="mojo_services"]
-module mojo.media;
-
-// Expresses the overall state of a media component.
-enum MediaState {
- // Unable to function due to error. Fault details are provided elsewhere.
- // TODO(dalesat): Eliminate this state.
- FAULT,
-
- // Requires preparation in order to function.
- UNPREPARED,
-
- // Prepared, rate zero (paused).
- PAUSED,
-
- // Prepared, rate non-zero.
- PLAYING,
-
- // Stopped playing because end-of-stream was encountered.
- ENDED,
-};
diff --git a/mojo/services/media/common/interfaces/timelines.mojom b/mojo/services/media/common/interfaces/timelines.mojom
index 39e4aef..1347712 100644
--- a/mojo/services/media/common/interfaces/timelines.mojom
+++ b/mojo/services/media/common/interfaces/timelines.mojom
@@ -40,15 +40,18 @@
// A push-mode consumer of timeline updates.
interface TimelineConsumer {
- // Sets the timeline transform at the indicated effective time. Exactly one
- // of the effective_*_time values must be kUnspecifiedTime.
+ // Sets the timeline transform at the indicated effective time. At least one
+ // of the effective_*_time values must be kUnspecifiedTime. If both are
+ // kUnspecifiedTime, the requested change is implemented as soon as possible.
// effective_subject_time can only be specified if the current subject_delta
// isn’t zero. reference_delta may not be zero. subject_time may be
// kUnspecifiedTime to indicate that the new transform subject_time should
- // be inferred from the effective time. The new transform reference_time is
- // always inferred from the effective time. The callback is called at the
- // effective time or when a pending operation is cancelled due to a
- // subsequent call, in which case the 'completed' value is false.
+ // be inferred from the effective time. The reference time for the new
+ // transform (the reference time that will correspond to the specified or
+ // inferred subject_time) is always inferred from the effective time. The
+ // callback is called at the effective time or when a pending operation is
+ // cancelled due to a subsequent call, in which case the 'completed' value is
+ // false.
SetTimelineTransform(
int64 subject_time,
uint32 reference_delta,
diff --git a/mojo/services/media/control/interfaces/media_player.mojom b/mojo/services/media/control/interfaces/media_player.mojom
index 49f4aa4..6b3d0ed 100644
--- a/mojo/services/media/control/interfaces/media_player.mojom
+++ b/mojo/services/media/control/interfaces/media_player.mojom
@@ -6,7 +6,6 @@
module mojo.media;
import "mojo/services/media/common/interfaces/media_metadata.mojom";
-import "mojo/services/media/common/interfaces/media_state.mojom";
import "mojo/services/media/common/interfaces/timelines.mojom";
// Plays media.
@@ -22,8 +21,6 @@
Pause();
// Seeks to the specified position, specified in nanoseconds.
- // TODO(dalesat): Consider adding relative vs remote flag.
- // TODO(dalesat): Consider adding parameters regarding desired precision.
Seek(int64 position);
// Gets the status. To get the status immediately, call
@@ -35,13 +32,13 @@
// MediaPlayer status information.
struct MediaPlayerStatus {
- // Current state of the player.
- MediaState state;
-
// Transform translating local time to presentation time. Reverse translation
// (presentation time to local time) is only valid when media is playing.
mojo.TimelineTransform? timeline_transform;
+ // Indicates whether presentation has reached end-of-stream.
+ bool end_of_stream;
+
// Describes the media.
MediaMetadata? metadata;
};
diff --git a/mojo/services/media/control/interfaces/media_sink.mojom b/mojo/services/media/control/interfaces/media_sink.mojom
index ac6c311..85711a1 100644
--- a/mojo/services/media/control/interfaces/media_sink.mojom
+++ b/mojo/services/media/control/interfaces/media_sink.mojom
@@ -5,11 +5,8 @@
[DartPackage="mojo_services"]
module mojo.media;
-import "mojo/services/media/common/interfaces/media_common.mojom";
-import "mojo/services/media/common/interfaces/media_state.mojom";
import "mojo/services/media/common/interfaces/media_transport.mojom";
-import "mojo/services/media/common/interfaces/media_types.mojom";
-import "mojo/services/media/common/interfaces/timelines.mojom";
+import "mojo/services/media/core/interfaces/timeline_controller.mojom";
// TODO(dalesat): Define a media sink that multiplexes streams.
@@ -17,32 +14,9 @@
interface MediaSink {
// TODO(dalesat): Support fanout to many destinations.
- // Special value for GetStatus version_last_seen parameter to get the current
- // status immediately.
- const uint64 kInitialStatus = 0;
-
// Gets the consumer for the stream to be delivered.
GetConsumer(MediaConsumer& consumer);
- // Gets the status. To get the status immediately, call
- // GetStatus(kInitialStatus). To get updates thereafter, pass the version
- // sent in the previous callback.
- GetStatus(uint64 version_last_seen)
- => (uint64 version, MediaSinkStatus status);
-
- // Starts playback.
- Play();
-
- // Pauses playback.
- Pause();
-};
-
-// MediaSink status information.
-struct MediaSinkStatus {
- // Current state of the sink.
- MediaState state;
-
- // Transform translating local time to presentation time. Reverse translation
- // (presentation time to local time) is only valid when media is playing.
- mojo.TimelineTransform? timeline_transform;
+ // Request the timeline control site for this sink
+ GetTimelineControlSite(MediaTimelineControlSite& timeline_control_site);
};
diff --git a/mojo/services/media/control/interfaces/media_source.mojom b/mojo/services/media/control/interfaces/media_source.mojom
index b1b89d0..4bac510 100644
--- a/mojo/services/media/control/interfaces/media_source.mojom
+++ b/mojo/services/media/control/interfaces/media_source.mojom
@@ -5,9 +5,7 @@
[DartPackage="mojo_services"]
module mojo.media;
-import "mojo/services/media/common/interfaces/media_common.mojom";
import "mojo/services/media/common/interfaces/media_metadata.mojom";
-import "mojo/services/media/common/interfaces/media_state.mojom";
import "mojo/services/media/common/interfaces/media_transport.mojom";
import "mojo/services/media/common/interfaces/media_types.mojom";
@@ -59,9 +57,6 @@
// Describes the media source.
struct MediaSourceStatus {
- // Current state of the source.
- MediaState state;
-
// Describes the media.
MediaMetadata? metadata;
};
diff --git a/services/media/audio/audio_pipe.cc b/services/media/audio/audio_pipe.cc
index eba55cd..476af5d 100644
--- a/services/media/audio/audio_pipe.cc
+++ b/services/media/audio/audio_pipe.cc
@@ -18,12 +18,14 @@
AudioServerImpl* server,
std::vector<Region>&& regions, // NOLINT(build/c++11)
int64_t start_pts,
- int64_t end_pts)
+ int64_t end_pts,
+ uint32_t frame_count)
: state_(std::move(state)),
server_(server),
regions_(std::move(regions)),
start_pts_(start_pts),
- end_pts_(end_pts) {
+ end_pts_(end_pts),
+ frame_count_(frame_count) {
DCHECK(state_);
DCHECK(server_);
}
@@ -130,7 +132,8 @@
server_,
std::move(regions),
start_pts,
- next_pts_)));
+ next_pts_,
+ frame_count)));
if (!prime_callback_.is_null()) {
// Prime was requested. Call the callback to indicate priming is complete.
diff --git a/services/media/audio/audio_pipe.h b/services/media/audio/audio_pipe.h
index d1fd7e2..eaf3d11 100644
--- a/services/media/audio/audio_pipe.h
+++ b/services/media/audio/audio_pipe.h
@@ -58,7 +58,10 @@
// Accessor for the regions in the shared buffer which contain the actual
// sample data.
- const std::vector<Region>& regions() const { return regions_; }
+ const std::vector<Region>& regions() const { return regions_; }
+
+ uint32_t frame_count() const { return frame_count_; }
+ const MediaPacketStatePtr& state() const { return state_; }
private:
friend class AudioPipe;
@@ -66,7 +69,8 @@
AudioServerImpl* server,
std::vector<Region>&& regions, // NOLINT(build/c++11)
int64_t start_pts,
- int64_t end_pts);
+ int64_t end_pts,
+ uint32_t frame_count);
MediaPacketStatePtr state_;
AudioServerImpl* server_;
@@ -74,6 +78,7 @@
std::vector<Region> regions_;
int64_t start_pts_;
int64_t end_pts_;
+ uint32_t frame_count_;
};
AudioPipe(AudioTrackImpl* owner, AudioServerImpl* server);
diff --git a/services/media/audio/audio_track_impl.cc b/services/media/audio/audio_track_impl.cc
index 87f3418..55519aa 100644
--- a/services/media/audio/audio_track_impl.cc
+++ b/services/media/audio/audio_track_impl.cc
@@ -331,6 +331,12 @@
DCHECK(output);
output->PushToPendingQueue(packet);
}
+
+ if (packet->state()->packet()->end_of_stream) {
+ timeline_control_site_.SetEndOfStreamPts(
+ (packet->state()->packet()->pts + packet->frame_count()) /
+ frames_per_ns_);
+ }
}
bool AudioTrackImpl::OnFlushRequested(const MediaConsumer::FlushCallback& cbk) {
diff --git a/services/media/common/timeline_control_site.cc b/services/media/common/timeline_control_site.cc
index 26dc07f..bafb5dd 100644
--- a/services/media/common/timeline_control_site.cc
+++ b/services/media/common/timeline_control_site.cc
@@ -36,7 +36,7 @@
status = MediaTimelineControlSiteStatus::New();
status->timeline_transform =
TimelineTransform::From(current_timeline_function_);
- status->end_of_stream = false; // TODO(dalesat): Provide this.
+ status->end_of_stream = ReachedEndOfStreamUnsafe();
}
callback.Run(version, status.Pass());
});
@@ -82,6 +82,29 @@
if (generation) {
*generation = generation_;
}
+
+ if (ReachedEndOfStreamUnsafe() && !end_of_stream_published_) {
+ end_of_stream_published_ = true;
+ task_runner_->PostTask(
+ FROM_HERE, base::Bind(&MojoPublisher<GetStatusCallback>::SendUpdates,
+ base::Unretained(&status_publisher_)));
+ }
+}
+
+void TimelineControlSite::SetEndOfStreamPts(int64_t end_of_stream_pts) {
+ base::AutoLock lock(lock_);
+ if (end_of_stream_pts_ != end_of_stream_pts) {
+ end_of_stream_pts_ = end_of_stream_pts;
+ end_of_stream_published_ = false;
+ }
+}
+
+bool TimelineControlSite::ReachedEndOfStreamUnsafe() {
+ lock_.AssertAcquired();
+
+ return end_of_stream_pts_ != kUnspecifiedTime &&
+ current_timeline_function_(Timeline::local_now()) >=
+ end_of_stream_pts_;
}
void TimelineControlSite::GetStatus(uint64_t version_last_seen,
@@ -115,6 +138,12 @@
current_timeline_function_.subject_delta() != 0);
RCHECK(reference_delta != 0);
+ if (subject_time != kUnspecifiedTime &&
+ end_of_stream_pts_ != kUnspecifiedTime) {
+ end_of_stream_pts_ = kUnspecifiedTime;
+ end_of_stream_published_ = false;
+ }
+
if (effective_subject_time != kUnspecifiedTime) {
// Infer effective_reference_time from effective_subject_time.
effective_reference_time =
diff --git a/services/media/common/timeline_control_site.h b/services/media/common/timeline_control_site.h
index 4b2506f..851073f 100644
--- a/services/media/common/timeline_control_site.h
+++ b/services/media/common/timeline_control_site.h
@@ -38,6 +38,9 @@
TimelineFunction* out,
uint32_t* generation = nullptr);
+ // Sets the current end_of_stream status published by the control site.
+ void SetEndOfStreamPts(int64_t end_of_stream_pts);
+
// MediaTimelineControlSite implementation.
void GetStatus(uint64_t version_last_seen,
const GetStatusCallback& callback) override;
@@ -68,6 +71,9 @@
return pending_timeline_function_.reference_time() != kUnspecifiedTime;
}
+ // Determines whether end-of-stream has been reached.
+ bool ReachedEndOfStreamUnsafe();
+
// Unbinds from clients and resets to initial state.
void ResetUnsafe();
@@ -85,6 +91,8 @@
TimelineFunction pending_timeline_function_;
SetTimelineTransformCallback set_timeline_transform_callback_;
uint32_t generation_ = 1;
+ int64_t end_of_stream_pts_ = kUnspecifiedTime;
+ bool end_of_stream_published_ = false;
// END fields synchronized using lock_.
};
diff --git a/services/media/factory_service/audio_track_controller.cc b/services/media/factory_service/audio_track_controller.cc
index 3b85597..5db316c 100644
--- a/services/media/factory_service/audio_track_controller.cc
+++ b/services/media/factory_service/audio_track_controller.cc
@@ -45,10 +45,12 @@
MediaConsumerPtr consumer;
audio_track_->Configure(config.Pass(), GetProxy(&consumer));
- MediaTimelineControlSitePtr timeline_control_site;
- audio_track_->GetTimelineControlSite(GetProxy(&timeline_control_site));
+ callback(consumer.Pass());
+}
- callback(consumer.Pass(), timeline_control_site.Pass());
+void AudioTrackController::GetTimelineControlSite(
+ InterfaceRequest<MediaTimelineControlSite> req) {
+ audio_track_->GetTimelineControlSite(req.Pass());
}
} // namespace media
diff --git a/services/media/factory_service/audio_track_controller.h b/services/media/factory_service/audio_track_controller.h
index 6a60dc9..0674e41 100644
--- a/services/media/factory_service/audio_track_controller.h
+++ b/services/media/factory_service/audio_track_controller.h
@@ -18,8 +18,7 @@
public:
using GetSupportedMediaTypesCallback = std::function<void(
std::unique_ptr<std::vector<std::unique_ptr<StreamTypeSet>>>)>;
- using ConfigureCallback =
- std::function<void(MediaConsumerPtr, MediaTimelineControlSitePtr)>;
+ using ConfigureCallback = std::function<void(MediaConsumerPtr)>;
AudioTrackController(const String& url, ApplicationImpl* app);
@@ -32,6 +31,9 @@
void Configure(const std::unique_ptr<StreamType>& stream_type,
const ConfigureCallback& callback);
+ // Gets the timeline control site for the audio track.
+ void GetTimelineControlSite(InterfaceRequest<MediaTimelineControlSite> req);
+
private:
AudioTrackPtr audio_track_;
};
diff --git a/services/media/factory_service/media_player_impl.cc b/services/media/factory_service/media_player_impl.cc
index 8fa10af..a963299 100644
--- a/services/media/factory_service/media_player_impl.cc
+++ b/services/media/factory_service/media_player_impl.cc
@@ -4,6 +4,7 @@
#include "base/logging.h"
#include "mojo/public/cpp/application/connect.h"
+#include "mojo/services/media/common/cpp/timeline.h"
#include "services/media/factory_service/media_player_impl.h"
#include "services/media/framework/parts/reader.h"
#include "services/media/framework/util/callback_joiner.h"
@@ -26,14 +27,14 @@
: MediaFactoryService::Product<MediaPlayer>(this, request.Pass(), owner) {
DCHECK(reader);
- status_publisher_.SetCallbackRunner(
- [this](const GetStatusCallback& callback, uint64_t version) {
- MediaPlayerStatusPtr status = MediaPlayerStatus::New();
- status->state = reported_media_state_;
- status->timeline_transform = transform_.Clone();
- status->metadata = metadata_.Clone();
- callback.Run(version, status.Pass());
- });
+ status_publisher_.SetCallbackRunner([this](const GetStatusCallback& callback,
+ uint64_t version) {
+ MediaPlayerStatusPtr status = MediaPlayerStatus::New();
+ status->timeline_transform = TimelineTransform::From(timeline_function_);
+ status->end_of_stream = AllSinksAtEndOfStream();
+ status->metadata = metadata_.Clone();
+ callback.Run(version, status.Pass());
+ });
state_ = State::kWaiting;
@@ -71,7 +72,6 @@
callback_joiner->WhenJoined([this]() {
// The enabled streams are prepared.
factory_.reset();
- SetReportedMediaState(MediaState::PAUSED);
state_ = State::kPaused;
Update();
});
@@ -84,63 +84,38 @@
while (true) {
switch (state_) {
case State::kPaused:
- if (target_position_ != kNotSeeking) {
+ if (target_position_ != kUnspecifiedTime) {
WhenPausedAndSeeking();
break;
}
- if (target_state_ == MediaState::PLAYING) {
+ if (target_state_ == State::kPlaying) {
if (!flushed_) {
- ChangeSinkStates(MediaState::PLAYING);
- state_ = State::kWaitingForSinksToPlay;
+ SetSinkTimelineTransforms(1, 1);
+ state_ = State::kWaiting;
break;
}
flushed_ = false;
state_ = State::kWaiting;
demux_->Prime([this]() {
- ChangeSinkStates(MediaState::PLAYING);
- state_ = State::kWaitingForSinksToPlay;
+ SetSinkTimelineTransforms(1, 1);
+ state_ = State::kWaiting;
Update();
});
}
return;
- case State::kWaitingForSinksToPlay:
- if (AllSinksAre(SinkState::kPlayingOrEnded)) {
- state_ = State::kPlaying;
- if (target_state_ == MediaState::PLAYING) {
- SetReportedMediaState(MediaState::PLAYING);
- }
- }
- return;
-
case State::kPlaying:
- if (target_position_ != kNotSeeking ||
- target_state_ == MediaState::PAUSED) {
- ChangeSinkStates(MediaState::PAUSED);
- state_ = State::kWaitingForSinksToPause;
+ if (target_position_ != kUnspecifiedTime ||
+ target_state_ == State::kPaused) {
+ SetSinkTimelineTransforms(1, 0);
+ state_ = State::kWaiting;
break;
}
- if (AllSinksAre(SinkState::kEnded)) {
- target_state_ = MediaState::ENDED;
- SetReportedMediaState(MediaState::ENDED);
- state_ = State::kPaused;
- break;
- }
- return;
-
- case State::kWaitingForSinksToPause:
- if (AllSinksAre(SinkState::kPausedOrEnded)) {
- if (target_state_ == MediaState::PAUSED) {
- if (AllSinksAre(SinkState::kEnded)) {
- SetReportedMediaState(MediaState::ENDED);
- } else {
- SetReportedMediaState(MediaState::PAUSED);
- }
- }
-
+ if (AllSinksAtEndOfStream()) {
+ target_state_ = State::kPaused;
state_ = State::kPaused;
break;
}
@@ -166,69 +141,71 @@
void MediaPlayerImpl::WhenFlushedAndSeeking() {
state_ = State::kWaiting;
- DCHECK(target_position_ != kNotSeeking);
+ DCHECK(target_position_ != kUnspecifiedTime);
demux_->Seek(target_position_, [this]() {
- target_position_ = kNotSeeking;
+ transform_subject_time_ = target_position_;
+ target_position_ = kUnspecifiedTime;
state_ = State::kPaused;
Update();
});
}
-void MediaPlayerImpl::ChangeSinkStates(MediaState media_state) {
- for (auto& stream : streams_) {
- if (stream->enabled_) {
- if (media_state == MediaState::PAUSED) {
- stream->sink_->Pause();
- } else {
- stream->sink_->Play();
- }
- }
- }
+void MediaPlayerImpl::SetSinkTimelineTransforms(uint32_t reference_delta,
+ uint32_t subject_delta) {
+ SetSinkTimelineTransforms(
+ transform_subject_time_, reference_delta, subject_delta,
+ Timeline::local_now() + kMinimumLeadTime, kUnspecifiedTime);
}
-bool MediaPlayerImpl::AllSinksAre(SinkState sink_state) {
+void MediaPlayerImpl::SetSinkTimelineTransforms(
+ int64_t subject_time,
+ uint32_t reference_delta,
+ uint32_t subject_delta,
+ int64_t effective_reference_time,
+ int64_t effective_subject_time) {
+ std::shared_ptr<CallbackJoiner> callback_joiner = CallbackJoiner::Create();
+
for (auto& stream : streams_) {
if (stream->enabled_) {
- switch (sink_state) {
- case SinkState::kPaused:
- if (stream->state_ != MediaState::PAUSED) {
- return false;
- }
- break;
- case SinkState::kPlaying:
- if (stream->state_ != MediaState::PLAYING) {
- return false;
- }
- break;
- case SinkState::kEnded:
- if (stream->state_ != MediaState::ENDED) {
- return false;
- }
- break;
- case SinkState::kPausedOrEnded:
- if (stream->state_ != MediaState::PAUSED &&
- stream->state_ != MediaState::ENDED) {
- return false;
- }
- break;
- case SinkState::kPlayingOrEnded:
- if (stream->state_ != MediaState::PLAYING &&
- stream->state_ != MediaState::ENDED) {
- return false;
- }
- break;
+ DCHECK(stream->timeline_consumer_);
+ callback_joiner->Spawn();
+ stream->timeline_consumer_->SetTimelineTransform(
+ subject_time, reference_delta, subject_delta,
+ effective_reference_time, effective_subject_time,
+ [this, callback_joiner](bool completed) {
+ callback_joiner->Complete();
+ });
+ }
+ }
+
+ transform_subject_time_ = kUnspecifiedTime;
+
+ callback_joiner->WhenJoined([this, subject_delta]() {
+ RCHECK(state_ == State::kWaiting);
+
+ if (subject_delta == 0) {
+ state_ = State::kPaused;
+ } else {
+ state_ = State::kPlaying;
+ }
+
+ Update();
+ });
+}
+
+bool MediaPlayerImpl::AllSinksAtEndOfStream() {
+ int result = false;
+
+ for (auto& stream : streams_) {
+ if (stream->enabled_) {
+ result = stream->end_of_stream_;
+ if (!result) {
+ break;
}
}
}
- return true;
-}
-
-void MediaPlayerImpl::SetReportedMediaState(MediaState media_state) {
- if (reported_media_state_ != media_state) {
- reported_media_state_ = media_state;
- status_publisher_.SendUpdates();
- }
+ return result;
}
void MediaPlayerImpl::GetStatus(uint64_t version_last_seen,
@@ -237,12 +214,12 @@
}
void MediaPlayerImpl::Play() {
- target_state_ = MediaState::PLAYING;
+ target_state_ = State::kPlaying;
Update();
}
void MediaPlayerImpl::Pause() {
- target_state_ = MediaState::PAUSED;
+ target_state_ = State::kPaused;
Update();
}
@@ -304,24 +281,22 @@
DCHECK(factory_);
factory_->CreateSink(url, input_media_type.Clone(), GetProxy(&stream->sink_));
+ stream->sink_->GetTimelineControlSite(
+ GetProxy(&stream->timeline_control_site_));
+
+ HandleTimelineControlSiteStatusUpdates(stream);
+
+ stream->timeline_control_site_->GetTimelineConsumer(
+ GetProxy(&stream->timeline_consumer_));
MediaConsumerPtr consumer;
stream->sink_->GetConsumer(GetProxy(&consumer));
- stream->decoded_producer_->Connect(
- consumer.Pass(), [this, callback, stream]() {
- stream->decoded_producer_.reset();
-
- DCHECK(stream->state_ == MediaState::UNPREPARED);
- DCHECK(reported_media_state_ == MediaState::UNPREPARED ||
- reported_media_state_ == MediaState::FAULT);
-
- stream->state_ = MediaState::PAUSED;
-
- HandleSinkStatusUpdates(stream);
-
- callback();
- });
+ stream->decoded_producer_->Connect(consumer.Pass(),
+ [this, callback, stream]() {
+ stream->decoded_producer_.reset();
+ callback();
+ });
}
void MediaPlayerImpl::HandleDemuxMetadataUpdates(uint64_t version,
@@ -337,21 +312,22 @@
});
}
-void MediaPlayerImpl::HandleSinkStatusUpdates(Stream* stream,
- uint64_t version,
- MediaSinkStatusPtr status) {
- if (status && status->state > MediaState::UNPREPARED) {
- // We transition to PAUSED when Connect completes.
- DCHECK(stream->state_ > MediaState::UNPREPARED);
- stream->state_ = status->state;
- transform_ = status->timeline_transform.Pass();
+void MediaPlayerImpl::HandleTimelineControlSiteStatusUpdates(
+ Stream* stream,
+ uint64_t version,
+ MediaTimelineControlSiteStatusPtr status) {
+ if (status) {
+ // TODO(dalesat): Why does one sink determine timeline_function_?
+ timeline_function_ = status->timeline_transform.To<TimelineFunction>();
+ stream->end_of_stream_ = status->end_of_stream;
status_publisher_.SendUpdates();
Update();
}
- stream->sink_->GetStatus(
- version, [this, stream](uint64_t version, MediaSinkStatusPtr status) {
- HandleSinkStatusUpdates(stream, version, status.Pass());
+ stream->timeline_control_site_->GetStatus(
+ version, [this, stream](uint64_t version,
+ MediaTimelineControlSiteStatusPtr status) {
+ HandleTimelineControlSiteStatusUpdates(stream, version, status.Pass());
});
}
diff --git a/services/media/factory_service/media_player_impl.h b/services/media/factory_service/media_player_impl.h
index 0a09d9c..d9b5be8 100644
--- a/services/media/factory_service/media_player_impl.h
+++ b/services/media/factory_service/media_player_impl.h
@@ -10,11 +10,14 @@
#include "mojo/public/cpp/application/application_impl.h"
#include "mojo/public/cpp/bindings/binding.h"
+#include "mojo/services/media/common/cpp/timeline.h"
+#include "mojo/services/media/common/cpp/timeline_function.h"
#include "mojo/services/media/common/interfaces/media_transport.mojom.h"
#include "mojo/services/media/control/interfaces/media_factory.mojom.h"
#include "mojo/services/media/core/interfaces/seeking_reader.mojom.h"
#include "services/media/common/mojo_publisher.h"
#include "services/media/factory_service/factory_service.h"
+#include "services/media/framework/util/callback_joiner.h"
namespace mojo {
namespace media {
@@ -41,24 +44,13 @@
void Seek(int64_t position) override;
private:
- const int64_t kNotSeeking = std::numeric_limits<int64_t>::max();
+ static constexpr int64_t kMinimumLeadTime = Timeline::ns_from_ms(30);
// Internal state.
enum class State {
kWaiting, // Waiting for some work to complete.
kPaused,
- kWaitingForSinksToPlay,
kPlaying,
- kWaitingForSinksToPause
- };
-
- // For matching sink states.
- enum class SinkState {
- kPaused,
- kPlaying,
- kEnded,
- kPausedOrEnded,
- kPlayingOrEnded
};
struct Stream {
@@ -66,10 +58,12 @@
~Stream();
size_t index_;
bool enabled_ = false;
- MediaState state_ = MediaState::UNPREPARED;
+ bool end_of_stream_ = false;
MediaTypePtr media_type_;
MediaTypeConverterPtr decoder_;
MediaSinkPtr sink_;
+ MediaTimelineControlSitePtr timeline_control_site_;
+ TimelineConsumerPtr timeline_consumer_;
MediaProducerPtr encoded_producer_;
MediaProducerPtr decoded_producer_;
};
@@ -87,14 +81,22 @@
// Handles seeking in paused state with flushed pipeline.
void WhenFlushedAndSeeking();
- // Tells the sinks to change state.
- void ChangeSinkStates(MediaState media_state);
+ // Sets the timeline transforms on all the sinks. transform_subject_time_ is
+ // used for the subject_time, and the effective_reference_time is now plus an
+ // epsilon.
+ void SetSinkTimelineTransforms(uint32_t reference_delta,
+ uint32_t subject_delta);
- // Determines if all the enabled sinks have the specified state.
- bool AllSinksAre(SinkState sink_state);
+ // Sets the timeline transforms on all the sinks.
+ void SetSinkTimelineTransforms(int64_t subject_time,
+ uint32_t reference_delta,
+ uint32_t subject_delta,
+ int64_t effective_reference_time,
+ int64_t effective_subject_time);
- // Sets the reported_media_state_ field, calling StatusUpdated as needed.
- void SetReportedMediaState(MediaState media_state);
+ // Determines if all the enabled sinks have reached end-of-stream. Returns
+ // false if there are no enabled streams.
+ bool AllSinksAtEndOfStream();
// Prepares a stream.
void PrepareStream(Stream* stream,
@@ -113,21 +115,23 @@
uint64_t version = MediaDemux::kInitialMetadata,
MediaMetadataPtr metadata = nullptr);
- // Handles a status update from a sink. When called with the default
- // argument values, initiates sink status updates.
- void HandleSinkStatusUpdates(Stream* stream,
- uint64_t version = MediaSink::kInitialStatus,
- MediaSinkStatusPtr status = nullptr);
+ // Handles a status update from a control site. When called with the default
+ // argument values, initiates control site. status updates.
+ void HandleTimelineControlSiteStatusUpdates(
+ Stream* stream,
+ uint64_t version = MediaTimelineControlSite::kInitialStatus,
+ MediaTimelineControlSiteStatusPtr status = nullptr);
MediaFactoryPtr factory_;
MediaDemuxPtr demux_;
std::vector<std::unique_ptr<Stream>> streams_;
State state_ = State::kWaiting;
+ State target_state_ = State::kPaused;
bool flushed_ = true;
- MediaState reported_media_state_ = MediaState::UNPREPARED;
- MediaState target_state_ = MediaState::PAUSED;
- int64_t target_position_ = kNotSeeking;
- TimelineTransformPtr transform_;
+ int64_t target_position_ = kUnspecifiedTime;
+ int64_t transform_subject_time_ = kUnspecifiedTime;
+ TimelineFunction timeline_function_;
+ CallbackJoiner set_transform_joiner_;
MediaMetadataPtr metadata_;
MojoPublisher<GetStatusCallback> status_publisher_;
};
diff --git a/services/media/factory_service/media_sink_impl.cc b/services/media/factory_service/media_sink_impl.cc
index 1fec5bd..e6bbeec 100644
--- a/services/media/factory_service/media_sink_impl.cc
+++ b/services/media/factory_service/media_sink_impl.cc
@@ -3,8 +3,6 @@
// found in the LICENSE file.
#include "base/logging.h"
-#include "mojo/services/media/common/cpp/timeline.h"
-#include "mojo/services/media/common/cpp/timeline_function.h"
#include "services/media/factory_service/media_sink_impl.h"
#include "services/media/framework/util/conversion_pipeline_builder.h"
#include "services/media/framework_mojo/mojo_type_conversions.h"
@@ -32,16 +30,6 @@
DCHECK(destination_url);
DCHECK(media_type);
- status_publisher_.SetCallbackRunner([this](const GetStatusCallback& callback,
- uint64_t version) {
- MediaSinkStatusPtr status = MediaSinkStatus::New();
- status->state = (producer_state_ == MediaState::PAUSED && rate_ != 0.0)
- ? MediaState::PLAYING
- : producer_state_;
- status->timeline_transform = TimelineTransform::From(timeline_function_);
- callback.Run(version, status.Pass());
- });
-
PartRef consumer_ref = graph_.Add(consumer_);
PartRef producer_ref = graph_.Add(producer_);
@@ -58,18 +46,9 @@
DCHECK(producer_);
graph_.FlushOutput(consumer_ref.output());
producer_->FlushConnection(callback);
- flushed_ = true;
});
});
- producer_->SetStatusCallback([this](MediaState state) {
- producer_state_ = state;
- status_publisher_.SendUpdates();
- if (state == MediaState::ENDED) {
- Pause();
- }
- });
-
// TODO(dalesat): Temporary, remove.
if (destination_url == "nowhere") {
// Throwing away the content.
@@ -104,38 +83,21 @@
&graph_, &out, &producer_stream_type);
if (!result) {
// Failed to build conversion pipeline.
- producer_state_ = MediaState::FAULT;
- status_publisher_.SendUpdates();
+ LOG(WARNING) << "failed to build conversion pipeline";
+ // TODO(dalesat): Add problem reporting.
return;
}
graph_.ConnectOutputToPart(out, producer_ref);
- if (producer_stream_type->medium() == StreamType::Medium::kAudio) {
- frames_per_ns_ =
- TimelineRate(producer_stream_type->audio()->frames_per_second(),
- Timeline::ns_from_seconds(1));
-
- } else {
- // Unsupported producer stream type.
- LOG(ERROR) << "unsupported producer stream type";
- abort();
- }
-
- controller_->Configure(
- std::move(producer_stream_type),
- [this](MediaConsumerPtr consumer,
- MediaTimelineControlSitePtr timeline_control_site) {
- DCHECK(consumer);
- DCHECK(timeline_control_site);
- timeline_control_site->GetTimelineConsumer(
- GetProxy(&timeline_consumer_));
- producer_->Connect(consumer.Pass(), [this]() {
- graph_.Prepare();
- ready_.Occur();
- MaybeSetRate();
- });
- });
+ controller_->Configure(std::move(producer_stream_type),
+ [this](MediaConsumerPtr consumer) {
+ DCHECK(consumer);
+ producer_->Connect(consumer.Pass(), [this]() {
+ graph_.Prepare();
+ ready_.Occur();
+ });
+ });
});
}
@@ -145,69 +107,13 @@
consumer_->AddBinding(consumer.Pass());
}
-void MediaSinkImpl::GetStatus(uint64_t version_last_seen,
- const GetStatusCallback& callback) {
- status_publisher_.Get(version_last_seen, callback);
-}
-
-void MediaSinkImpl::Play() {
- target_rate_ = 1.0;
- MaybeSetRate();
-}
-
-void MediaSinkImpl::Pause() {
- target_rate_ = 0.0;
- MaybeSetRate();
-}
-
-void MediaSinkImpl::MaybeSetRate() {
- if (producer_state_ < MediaState::PAUSED || rate_ == target_rate_) {
- return;
+void MediaSinkImpl::GetTimelineControlSite(
+ InterfaceRequest<MediaTimelineControlSite> req) {
+ if (!controller_) {
+ LOG(ERROR) << "GetTimelineControlSite not implemented for 'nowhere' case";
+ abort();
}
-
- if (!timeline_consumer_) {
- rate_ = target_rate_;
- status_publisher_.SendUpdates();
- return;
- }
-
- // TODO(dalesat): start_local_time and start_presentation_time should be
- // supplied via the mojo interface. For now, start_local_time is hard-coded
- // to be 30ms in the future, and start_presentation_time is grabbed from the
- // first primed packet or is calculated from start_local_time based on the
- // previous timeline function.
-
- // The local time when we want the rate to change.
- int64_t start_local_time = Timeline::local_now() + Timeline::ns_from_ms(30);
-
- // The media time corresponding to start_local_time.
- int64_t start_presentation_time;
- if (flushed_ && producer_->GetFirstPtsSinceFlush() != Packet::kUnknownPts) {
- // We're getting started initially or after a flush/prime, so the media
- // time corresponding to start_local_time should be the PTS of
- // the first packet converted to ns (rather than frame) units.
- start_presentation_time =
- producer_->GetFirstPtsSinceFlush() / frames_per_ns_;
- } else {
- // We're resuming, so the media time corresponding to start_local_time can
- // be calculated using the existing transform.
- start_presentation_time = timeline_function_(start_local_time);
- }
-
- flushed_ = false;
-
- // Update the transform.
- timeline_function_ = TimelineFunction(
- start_local_time, start_presentation_time, TimelineRate(target_rate_));
-
- // Set the rate.
- timeline_consumer_->SetTimelineTransform(
- timeline_function_.subject_time(), timeline_function_.reference_delta(),
- timeline_function_.subject_delta(), timeline_function_.reference_time(),
- kUnspecifiedTime, [](bool completed) {});
-
- rate_ = target_rate_;
- status_publisher_.SendUpdates();
+ controller_->GetTimelineControlSite(req.Pass());
}
} // namespace media
diff --git a/services/media/factory_service/media_sink_impl.h b/services/media/factory_service/media_sink_impl.h
index f323f62..320fad7 100644
--- a/services/media/factory_service/media_sink_impl.h
+++ b/services/media/factory_service/media_sink_impl.h
@@ -9,9 +9,8 @@
#include "mojo/public/cpp/application/application_impl.h"
#include "mojo/public/cpp/bindings/binding.h"
-#include "mojo/services/media/common/cpp/timeline_function.h"
#include "mojo/services/media/control/interfaces/media_sink.mojom.h"
-#include "services/media/common/mojo_publisher.h"
+#include "mojo/services/media/core/interfaces/timeline_controller.mojom.h"
#include "services/media/factory_service/audio_track_controller.h"
#include "services/media/factory_service/factory_service.h"
#include "services/media/framework/graph.h"
@@ -39,12 +38,8 @@
// MediaSink implementation.
void GetConsumer(InterfaceRequest<MediaConsumer> consumer) override;
- void GetStatus(uint64_t version_last_seen,
- const GetStatusCallback& callback) override;
-
- void Play() override;
-
- void Pause() override;
+ void GetTimelineControlSite(
+ InterfaceRequest<MediaTimelineControlSite> req) override;
private:
MediaSinkImpl(const String& destination_url,
@@ -52,23 +47,11 @@
InterfaceRequest<MediaSink> request,
MediaFactoryService* owner);
- // Sets the rate if the producer is ready and the target rate differs from
- // the current rate.
- void MaybeSetRate();
-
Incident ready_;
Graph graph_;
std::shared_ptr<MojoConsumer> consumer_;
std::shared_ptr<MojoProducer> producer_;
std::unique_ptr<AudioTrackController> controller_;
- TimelineConsumerPtr timeline_consumer_;
- float rate_ = 0.0f;
- float target_rate_ = 0.0f;
- MediaState producer_state_ = MediaState::UNPREPARED;
- TimelineFunction timeline_function_;
- TimelineRate frames_per_ns_;
- bool flushed_ = true;
- MojoPublisher<GetStatusCallback> status_publisher_;
};
} // namespace media
diff --git a/services/media/factory_service/media_source_impl.cc b/services/media/factory_service/media_source_impl.cc
index 10311bc..c2e38db 100644
--- a/services/media/factory_service/media_source_impl.cc
+++ b/services/media/factory_service/media_source_impl.cc
@@ -41,7 +41,6 @@
status_publisher_.SetCallbackRunner(
[this](const GetStatusCallback& callback, uint64_t version) {
MediaSourceStatusPtr status = MediaSourceStatus::New();
- status->state = state_;
status->metadata =
demux_ ? MediaMetadata::From(demux_->metadata()) : nullptr;
callback.Run(version, status.Pass());
@@ -49,15 +48,15 @@
std::shared_ptr<Reader> reader_ptr = MojoReader::Create(reader.Pass());
if (!reader_ptr) {
- NOTREACHED() << "couldn't create reader";
- state_ = MediaState::FAULT;
+ LOG(ERROR) << "couldn't create reader";
+ // TODO(dalesat): Add problem reporting.
return;
}
demux_ = Demux::Create(reader_ptr);
if (!demux_) {
- NOTREACHED() << "couldn't create demux";
- state_ = MediaState::FAULT;
+ LOG(ERROR) << "couldn't create demux";
+ // TODO(dalesat): Add problem reporting.
return;
}
@@ -138,7 +137,6 @@
stream->EnsureSink();
}
graph_.Prepare();
- state_ = MediaState::PAUSED;
callback.Run();
status_publisher_.SendUpdates();
}
diff --git a/services/media/factory_service/media_source_impl.h b/services/media/factory_service/media_source_impl.h
index d056aa4..acc3b07 100644
--- a/services/media/factory_service/media_source_impl.h
+++ b/services/media/factory_service/media_source_impl.h
@@ -118,7 +118,6 @@
std::shared_ptr<Demux> demux_;
Incident init_complete_;
std::vector<std::unique_ptr<Stream>> streams_;
- MediaState state_ = MediaState::UNPREPARED;
MojoPublisher<GetStatusCallback> status_publisher_;
};
diff --git a/services/media/framework_mojo/mojo_formatting.cc b/services/media/framework_mojo/mojo_formatting.cc
index 7dfbc86..88baa16 100644
--- a/services/media/framework_mojo/mojo_formatting.cc
+++ b/services/media/framework_mojo/mojo_formatting.cc
@@ -384,21 +384,5 @@
return "UNKNOWN FORMAT";
}
-const char* StringFromMediaState(MediaState value) {
- switch (value) {
- case MediaState::FAULT:
- return "FAULT";
- case MediaState::UNPREPARED:
- return "UNPREPARED";
- case MediaState::PAUSED:
- return "PAUSED";
- case MediaState::PLAYING:
- return "PLAYING";
- case MediaState::ENDED:
- return "ENDED";
- }
- return "UNKNOWN MEDIA STATE";
-}
-
} // namespace media
} // namespace mojo
diff --git a/services/media/framework_mojo/mojo_formatting.h b/services/media/framework_mojo/mojo_formatting.h
index 020d47e..bf17c27 100644
--- a/services/media/framework_mojo/mojo_formatting.h
+++ b/services/media/framework_mojo/mojo_formatting.h
@@ -21,7 +21,6 @@
// Mojo defines versions of operator<< for this that produce only numbers.
const char* StringFromMediaTypeMedium(MediaTypeMedium value);
const char* StringFromAudioSampleFormat(AudioSampleFormat value);
-const char* StringFromMediaState(MediaState value);
// The following overloads add newlines.
diff --git a/services/media/framework_mojo/mojo_producer.cc b/services/media/framework_mojo/mojo_producer.cc
index 7fb0ae3..f0c9c27 100644
--- a/services/media/framework_mojo/mojo_producer.cc
+++ b/services/media/framework_mojo/mojo_producer.cc
@@ -42,7 +42,6 @@
DCHECK(demand_callback_);
demand_callback_(demand);
- SetState(MediaState::PAUSED);
if (consumer_.is_bound()) {
consumer_->Prime([this, callback]() { callback.Run(); });
@@ -65,17 +64,6 @@
} else {
callback.Run();
}
-
- first_pts_since_flush_ = Packet::kUnknownPts;
- end_of_stream_ = false;
-}
-
-void MojoProducer::SetStatusCallback(const StatusCallback& callback) {
- status_callback_ = callback;
-}
-
-int64_t MojoProducer::GetFirstPtsSinceFlush() {
- return first_pts_since_flush_;
}
PayloadAllocator* MojoProducer::allocator() {
@@ -89,22 +77,9 @@
Demand MojoProducer::SupplyPacket(PacketPtr packet) {
DCHECK(packet);
- if (first_pts_since_flush_ == Packet::kUnknownPts) {
- first_pts_since_flush_ = packet->pts();
- }
-
// If we're not connected, throw the packet away.
if (!consumer_.is_bound()) {
- if (packet->end_of_stream()) {
- {
- base::AutoLock lock(lock_);
- end_of_stream_ = true;
- }
- SetState(MediaState::ENDED);
- return Demand::kNegative;
- }
-
- return Demand::kNeutral;
+ return packet->end_of_stream() ? Demand::kNegative : Demand::kNeutral;
}
Demand demand;
@@ -112,12 +87,10 @@
{
base::AutoLock lock(lock_);
DCHECK(current_pushes_outstanding_ < max_pushes_outstanding_);
- DCHECK(!end_of_stream_) << "packet pushed after end-of-stream";
++current_pushes_outstanding_;
if (packet->end_of_stream()) {
- end_of_stream_ = true;
demand = Demand::kNegative;
max_pushes_outstanding_ = 0;
} else {
@@ -153,7 +126,6 @@
void MojoProducer::Disconnect() {
DCHECK(demand_callback_);
demand_callback_(Demand::kNegative);
- SetState(MediaState::UNPREPARED);
consumer_.reset();
}
@@ -174,22 +146,9 @@
DCHECK(demand_callback_);
demand_callback_(demand);
-
- if (end_of_stream_ && packet->end_of_stream()) {
- SetState(MediaState::ENDED);
- }
});
}
-void MojoProducer::SetState(MediaState state) {
- if (state_ != state) {
- state_ = state;
- if (status_callback_) {
- status_callback_(state_);
- }
- }
-}
-
MediaPacketPtr MojoProducer::CreateMediaPacket(const PacketPtr& packet) {
DCHECK(packet);
diff --git a/services/media/framework_mojo/mojo_producer.h b/services/media/framework_mojo/mojo_producer.h
index 16865d1..fb8b12a 100644
--- a/services/media/framework_mojo/mojo_producer.h
+++ b/services/media/framework_mojo/mojo_producer.h
@@ -19,7 +19,6 @@
// Implements MediaProducer to forward a stream across mojo.
class MojoProducer : public MediaProducer, public ActiveSink {
public:
- using StatusCallback = std::function<void(MediaState)>;
using PrimeConnectionCallback = mojo::Callback<void()>;
using FlushConnectionCallback = mojo::Callback<void()>;
@@ -39,13 +38,6 @@
// Unprimes and tells the connected consumer to flush.
void FlushConnection(const FlushConnectionCallback& callback);
- // Sets a callback for reporting status updates.
- void SetStatusCallback(const StatusCallback& callback);
-
- // Gets the first presentation time seen on any packet after the most recent
- // flush or, if there has never been a flush, the first packet supplied.
- int64_t GetFirstPtsSinceFlush();
-
// ActiveSink implementation.
PayloadAllocator* allocator() override;
@@ -66,9 +58,6 @@
// TODO(dalesat): Don't use a raw pointer, if possible.
void SendPacket(Packet* packet_raw_ptr, MediaPacketPtr media_packet);
- // Sets the current state and calls the registered callback, if there is one.
- void SetState(MediaState state);
-
// Creates a MediaPacket from a Packet.
MediaPacketPtr CreateMediaPacket(const PacketPtr& packet);
@@ -77,15 +66,11 @@
BindingSet<MediaProducer> bindings_;
MediaConsumerPtr consumer_;
- StatusCallback status_callback_;
mutable base::Lock lock_;
// THE FIELDS BELOW SHOULD ONLY BE ACCESSED WITH lock_ TAKEN.
- MediaState state_ = MediaState::UNPREPARED;
- bool end_of_stream_ = false;
DemandCallback demand_callback_;
scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
- int64_t first_pts_since_flush_ = Packet::kUnknownPts;
// TODO(dalesat): Base this logic on presentation time or duration.
uint32_t max_pushes_outstanding_ = 0;
uint32_t current_pushes_outstanding_ = 0;