- From: Michael Probst <mprobst@irt.de>
- Date: Mon, 5 Dec 2016 18:18:10 +0100
- To: public-tvcontrol@w3.org
Hi Steve, just for my understanding, please correct me if I am wrong: in the revised proposal - the device has a set of sources, - every source stands for one of DVB-S, DVB-C, DAB, ISDB-T, etc., - a source can support concurrent tuning to multiple channels depending on available resources - additionalSessions are dynamic, e.g. if there are two sources and one is used to tune a channel, the available additionalSessions for the second source may also change. * there was a comment that the API is used also for Recordings/PVR, it might make sense to differentiate between available concurrent streams and concurrent media renderers. * DVB-? and DVB-?2 are currently different source types and a source can have only one type. I wonder if it would make sense to allow that a source has multiple types like DVB-S and DVB-S2, which are both used in a single broadcast network. Kind regards, Michael Am 05.12.2016 um 16:04 schrieb Steven Morris: > All, > > > > This is an attempt to summarise a couple of discussions that I've had > offline with various people, prompted by the edits I've been making to > the API. The thoughts of the group are very welcome. > > > > The question that prompted this is “ in our modified API, what does the > call to TVSource.tuneToChannel() return?” While a TVTuner appears to > make sense at first, there are several problems with that: > > 1) You still then have to get the TVMediaStream before you > can connect it to a <video> element and start playing the channel > > 2) There may not be a one-to-one mapping between a TVTuner > instance and a channel being played: a single hardware tuner may be able > to receive more than one channel at the same time. > > > > I thought that returning a TVMediaStream would solve this, but that then > raised other questions: > > 1) How do you find the set of channels currently being played > by the source? We've already agreed that one source may be used to play > more than one channel at a time, but that's not reflected in the API. > > 2) How can an application stop presenting a channel and free the > resources being used for it? While MediaStreamTrack.stop() could be > used to do this, that's pretty counter-intuitive. We could say that > when the TVMediaStream is garbage collected then all the resources are > freed, but that's not very predictable. > > 3) When an app starts, if a channel is already being > presented, how can the app discover that channel? The use case here is > an STB where a broadcast-related app is started and wants to resize the > video that is currently being displayed (i.e. to fit it in with the > app's UI). > > 4) What object receives notifications for channel change > events or errors, parental control events and so on? > > > > > > My thinking at the moment is that the name of the TVTuner is misleading: > while it implies that the class represents a physical tuner, that isn't > really the case given its current API. One option would be for this > object to represent a "media session", where tuning to a channel creates > a new media session which an application can register listeners on and > can get a TVMediaStream from. This would give interfaces like this: > > > > > > interface TVSource : EventTarget { > > Promise<sequence<TVChannel>> getChannels(); > > Promise<sequence<TVTuner>> getSessions(); > > Promise<TVTuner> tuneToChannel(TVChannel channel, > optional TVTuner tuner); > > Promise<TVTuner> tuneTo(DOMString tuningParams, optional > TVTuner tuner); > > Promise<void> startScanning(optional > TVStartScanningOptions options); > > Promise<void> stopScanning(); > > Promise<unsigned short> getAdditionalSessions(DOMString > qualityLevel); > > readonly attribute TVSourceType type; > > readonly attribute boolean isScanning; > > attribute EventHandler onscanningstatechanged; > > }; > > > > > > interface TVTuner : EventTarget { > > Promise<TVSource> getSource(); > > Promise<void> stop(); > > readonly attribute DOMString id; > > readonly attribute TVChannel? currentChannel; > > readonly attribute TVMediaStream? stream; > > readonly attribute double signalStrength; > > readonly attribute boolean isRecordable; > > attribute EventHandler oncurrentchannelchanged; > > attribute EventHandler oneitbroadcasted; > > attribute EventHandler onemergencyalerted; > > }; > > > > Note that some event handlers have moved from TVSource to TVTuner in > this case. > > > > The TVTuner object can then be re-used by an app that wants to change > channel but use the same resources. The stop() method stops presenting > the current channel and frees any resources used. The > getAdditionalSessions() method lets an app determine how many more > channels (of the specified quality level) can be played simultaneously > from that source. > > > > This keeps the semantics of a TVMediaStream very simple, and it's mostly > used for connecting to a media element to present a channel. > > > > > > > > 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. > > > > 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(); > > }); > > > > > > > > Thoughts and suggestions are welcome. > > > > Steve. > -- Michael Probst Platforms for Broadcast Services Tel.: +49(0)89/323 99-338 mail: mprobst@irt.de Institut fuer Rundfunktechnik GmbH Research and Development Institute of ARD, ZDF, DRadio, ORF and SRG/SSR Floriansmuehlstraße 60, 80939 Muenchen, Germany registration court Munich Commercial, Register No. B 5191 Managing Director: Dr. Klaus Illgner-Fehns
Received on Tuesday, 6 December 2016 08:34:11 UTC