- From: Johannes Odland <johannes.odland@gmail.com>
- Date: Thu, 30 May 2013 06:58:32 +0200
- To: Rob Manson <roBman@mob-labs.com>
- Cc: "public-media-capture@w3.org" <public-media-capture@w3.org>
Isn't this the exact use case for the ImageCapture API? Johannes Odland Den 30. mai 2013 kl. 06:52 skrev Rob Manson <roBman@mob-labs.com>: > Since this is being discussed I wondered if there had been any more > discussion on this frame capture thread. > > http://lists.w3.org/Archives/Public/public-media-capture/2013Feb/0099.html > > NOTE: I've searched all the archives but that seems to be the last point > in the discussion (please feel free to point me at a link if I'm wrong). > > I know it's not "exactly" related, but it would be very nice to be able > to directly assign a stream src to a typed array and just get a > notification every time it is updated. > > And it would be awesome if this worked for both video and audio streams > in the same way. > > Just to recap - the current pipeline for video frame processing is: > > step 1. > getUserMedia(options, success, error) > > step 2. > function success(stream) { > videoElement.src = window.URL.createObjectURL(stream) > //setupSomeEventModelOfYourChoiceToCallProcess() > //a. videoElement.onloadedmetadata > //b. requestAnimationFrame() > //c. setTimeout() > } > > step 3. > function process() { > canvasContext.drawImage(videoElement, top, left, width, height) > typedArray = canvasContext.getImageData(top, left, width, height) > //finallyDoStuffWithTheImageDataTypeArray > } > > > step 1 and 2 are not so bad because they're only used once to setup the > pipeline. > > But step 3 is called 10s or even 100s of times per second...and this > seems to be copying data a lot more than it needs to be...at least: > - into the videoElement > - then into the canvas context > - then into a typed array > (probably more under the hood depending upon the implementation) > > Ideally we could just pour a stream directly into a typed array and have > a way to only process it when it is actually updated (if we choose). > > Even better would be something like if we were just handed a new typed > array for each frame as they were created so we could minimise the > copying of the data and do things like pass it to a worker as a > transferable object using postMessage so we can do image processing off > the main thread. This would reduce data copying even further while > allowing us to keep the main browser UI more responsive. > > Thoughts? > > roBman > > > On 29/05/13 05:35, Jim Barnett wrote: >> It’s time to revise section 8 of the spec, which deals with how to pass >> a MediaStream to an HTML5 <audio> or <video> element (see >> http://dev.w3.org/2011/webrtc/editor/getusermedia.html#mediastreams-as-media-elements >> ) One question is how to deal with readyState and networkState >> attributes of the media element. The HTML5 spec has a media element >> load algorithm which first resolves the URI of the src, and then >> attempts to fetch the source. The current gUM spec says that when the >> algorithm reaches the fetch phase, if the resource is a MediaStream, the >> algorithm should terminate and set readyState to HAVE_ENOUGH_DATA. I >> think that this is correct in the case of a MediaStream that is >> streaming data, but: >> >> 1.The spec should also say that networkState gets set to NETWORK_IDLE. >> >> 2.Does it matter if the Tracks in the MediaStream are muted or >> disabled? My guess is that it doesn’t – the output will just be silence >> or black frames, but we should clarify this. (By the way, the current >> spec says that the output of a muted Track is silence or black frames, >> but doesn’t say what the output is for a disabled Track. Shouldn’t it >> be the same?) >> >> 3.What happens if the MediaStream that is fetched has ended = true? >> Should we silently continue to use the dead stream and let HTML5 >> figure out what to do, or should we raise an error? In the latter case, >> the HTML5 spec defines a MediaError Media_ERR_Aborted , which we might >> be able to use. It is defined as “The fetching process for the media >> resource >> <http://www.w3.org/TR/2012/CR-html5-20121217/embedded-content-0.html#media-resource> >> was aborted by the user agent at the user's request.” Isn’t that sort >> of what happens when a local MediaStream is ended? >> >> 4.Do we want to say anything about remote MediaStreams? In the case of >> a local MediaStream, NETWORK_IDLE makes sense for the networkState, >> because there is no network traffic. But for a remote stream the >> NETWORK_LOADING state might be relevant. On the other hand, the Media >> Capture spec seems implicitly to deal with local streams (created by >> gUM). If we want to explicitly allow remote streams, we have to explain >> how they are created, etc. I suppose we could say that streams can be >> remote, but the method of creating such a stream is outside the scope of >> this spec. But then we’d at least have to say how the UA determines if >> a MediaStream is local or remote. >> >> 5.What do we say if a MediaStream with no Tracks is passed to a media >> element (i.e., in the fetch phase of the algorithm)? Do we treat this >> as if the media element had fetched unplayable data? There is a >> |/MEDIA_ERR_SRC_NOT_SUPPORTED/| that we could use in this case. Or is >> it another Media_ERR_Aborted? The fetch algorithm checks for the >> presence of audio and video tracks at a certain point, and any Tracks >> added after that won’t be detected (until load() is called again.) >> >> I also have questions about how direct assignment should work, but I >> will send them in a separate email. >> >> -Jim >
Received on Thursday, 30 May 2013 04:59:05 UTC