- From: Steven Morris <smorris@Espial.com>
- Date: Mon, 12 Dec 2016 09:30:44 +0000
- To: Francois Daoust <fd@w3.org>, "public-tvcontrol@w3.org" <public-tvcontrol@w3.org>
Hi Francois,
No comments from me.
Best regards,
Steve.
> -----Original Message-----
> From: Francois Daoust [mailto:fd@w3.org]
> Sent: 09 December 2016 17:24
> To: Steven Morris; public-tvcontrol@w3.org
> Subject: Re: Thoughts on the TVTuner class in the source-centric API
>
> Hi Steve,
>
> Le 05/12/2016 à 16:04, Steven Morris a écrit :
> [...]
> > Another alternative is to fully take the approach described by
> > getUserMedia(), which does support most of what we want to do, but
> > requires using the MediaStreamTrack interface for most of the
> > operations. We would either have to extend MediaDeviceInfo to
> > introduce a getChannels() method and other TV-specific APIs and
> > events, or define our exisitng APIs in a way that is compatible with
> this approach.
>
>
> Regarding alignment with getUserMedia, I think the TV Control Working
> Group should get in touch with the Media Capture task force of the
> Device and Sensors WG and WebRTC WG for feedback. In some ways, this
> seems to be the "intended design". At the same time, some of it feels
> odd. Below is a draft message that I propose to send to that task force.
>
> Any comment on this message and questions it raises?
>
>
> =====
> The TV Control Working Group is re-modeling the TV Control API
> specification around sources. That new model is well aligned with the
> model used in Media Capture and Streams. In fact, it would seem possible
> to re-use Media Capture and Streams interfaces as-is. However, some
> details do not seem entirely right when we do that, and we would like to
> get your feedback on the following questions.
>
>
> Context
> -----
> The TV Control API specification defines an API for sourcing audio and
> video media, such as TV and radio from broadcast, IPTV, or other
> sources, and allows presentation of the media using the <video> and
> <audio> HTML elements. The API typically produces MediaStreams, with
> methods to switch from one TV/radio channel to the other, and various
> classes to retrieve associated channel and program metadata.
>
> The current API is designed around the notion of tuners but the group
> agreed to a re-design centered on the notion of sources. To keep things
> simple, a TV source is something attached to a broadcast signal (which
> could come through a cable, terrestrial antennas, satellites, etc.) that
> can be tuned to a specific channel to produce a MediaStream, composed of
> a set of MediaStreamTracks for that channel. User may switch the source
> to another channel at any time.
>
> Looking at it from a getUserMedia perspective, it seems possible to
> consider TV sources as input devices, and channels as a constraint that
> could be applied to the main video track. This would lead to the
> following code:
>
> var source = null;
>
> navigator.mediaDevices.enumerateDevices()
> .then(function (devicesInfo) {
> source = devicesInfo.find(function (deviceInfo) {
> // Or use "getCapabilities" to detect support for the
> "tvchannel"
> // constraint if kind cannot be extended?
> return deviceInfo.kind === 'tvsource';
> });
> return source.getChannels();
> })
> .then(function (channels) {})
> var channel = channels[0];
> secondChannel = channels[1];
> navigator.mediaDevices.getUserMedia({
> video: {
> deviceId: source.deviceId,
> tvchannel: channel
> }
> })
> })
> .then(function (stream) {
> tvStream = stream;
>
> // Render the stream
> document.getElementById('video').srcObject = tvStream;
>
> // Switch to another channel
> return tvStream.getVideoTracks()[0].applyConstraints({ tvchannel:
> secondChannel });
> })
> .then(function () {
> // Stop stream
> tvStream.getVideoTracks()[0].stop();
> });
>
>
> This triggers a few questions though.
>
> Questions
> -----
>
> 1. Attaching to "enumerateDevices"?
> --
> We need some way to enumerate the TV/radio sources but it feels a bit
> strange to mix TV/radio sources with camera/microphone sources. Use
> cases that want to get media from a camera are roughly disjoint from use
> cases that want to tune to a particular TV channel. Shouldn't APIs
> rather be separated?
> If not, what would be the proper way to distinguish TV sources? Should
> we introduce a new "tvsource" kind of source for instance?
>
>
> 2. Channel constraint at the track level?
> --
> Similarly, it does not seem natural to apply the constraint to change
> the channel at the track level. The channel "constraint" rather seems to
> apply at the MediaStream level, as it is going to affect all tracks. Are
> we trying to push the constraint model too far?
>
> The same comment applies to the "stop" method, which again is going to
> affect all tracks of the MediaStream in our case.
>
>
> 3. TV specific semantics?
> --
> While it works, is also seems counter-intuitive to "apply a constraint"
> to switch from one channel to another. Developers would probably rather
> expect something like a "tuneToChannel" method instead.
>
>
> 4. Extending or wrapping MediaStream?
> --
> The TV Control API extends MediaStream to add buffering. This seems to
> preserve the spirit of MediaStreams and there has already been exchanges
> about that in the past.
>
> We may need to introduce other attributes at that level, such as an
> "isRecordable" property to tell whether the channel may be recorded.
> This is also where the "stop" method mentioned above would fit. Such
> extensions seem of different nature. We're wondering whether it could be
> preferable to introduce an extra layer that wraps the MediaStream and
> exposes TV specific properties.
>
>
> Alternative proposal
> -----
> All in all, an alternative proposal that separates the APIs, moves
> operations back to the source level, and creates a wrapping tuner class
> around MediaStream could lead to the following code:
>
> var source = null;
> var secondChannel = null;
> var tvTuner = null;
>
> navigator.tv.getSources()
> .then(function (sources) {
> source = sources[0];
> return source.getChannels();
> })
> .then(function (channels) {
> var channel = channels[0];
> secondChannel = channels[1];
> return source.tuneToChannel(channel);
> })
> .then(function (tuner)) {
> tvTuner = tuner;
>
> // Render the stream
> document.getElementById('video').srcObject = tvTuner.stream;
>
> // Switch the source to another channel, re-using the same tuner
> return source.tuneToChannel(secondChannel, tuner);
> })
> .then(function () {
> // Stop stream and release resource
> tvTuner.stop();
> });
>
> Note we would be happy to schedule a call as needed to clarify our
> questions.
>
> Thanks,
> Francois.
Received on Monday, 12 December 2016 18:09:25 UTC