W3C home > Mailing lists > Public > public-webrtc@w3.org > July 2015

Re: Add "MediaStream with worker" for video processing into the new working items of WebRTC WG

From: Chia-Hung Tai <ctai@mozilla.com>
Date: Wed, 29 Jul 2015 14:46:56 +0800
Message-ID: <CACBucrG3YXdLKh=XF8VDW_SE5wFJbTACEFwQoZRG94hpSVCeeg@mail.gmail.com>
To: Mathieu Hofman <Mathieu.Hofman@citrix.com>
Cc: "robert@ocallahan.org" <robert@ocallahan.org>, "public-media-capture@w3.org" <public-media-capture@w3.org>, "public-webrtc@w3.org" <public-webrtc@w3.org>
So in current Web technology, we already have two kinds of pull mechanism,
Canvas2D::drawImage and ImageCapture::grabFrame.
And ImageCapture::grabFrame might fit what you want. And there is not push
mechanism in current Web technology. So I would not address pull mechanism
and focus on push mechanism in this specification.


2015-07-29 11:59 GMT+08:00 Mathieu Hofman <Mathieu.Hofman@citrix.com>:

>  Canvas drawImage has indeed the potential to generate duplicate frames
> because it's a synchronous pull API.
>  What I'm suggesting is an *asynchronous pull *API that completes only
> when there is a new frame available that is different from the previous
> frame provided.
>  Something similar to the ImageCapture::grabFrame()
> <http://www.w3.org/TR/image-capture/#widl-ImageCapture-grabFrame-Promise>
> API that has the clear requirement of only generating a grab event with a
> frame not previously returned (and ensures the source won't be temporarily
> switched into a special "grab photo" mode).
>  Blindly constraining the frameRate is not back-pressure and is not an
> acceptable solution as:
> - The consumption needs might not be known ahead of time and can vary over
> time
> - Some sources such as screen sharing have a variable framerate
>  A combination of Canvas::drawImage
> and CanvasCaptureMediaStream::requestFrame would simply generate a new
> stream that provides no back-pressure to the source. It has no advantages
> over simply skipping frames.
>  Mathieu
>  ------------------------------
> *From:* Chia-Hung Tai [ctai@mozilla.com]
> *Sent:* Tuesday, July 28, 2015 8:24 PM
> *To:* Mathieu Hofman
> *Cc:* robert@ocallahan.org; public-media-capture@w3.org;
> public-webrtc@w3.org
> *Subject:* Re: Add "MediaStream with worker" for video processing into
> the new working items of WebRTC WG
>   For your case, I think combination of [1] and [2] is what you want. One
> of the reason we choose push mechanism is the existing [1] is pull
> mechanism. And there is some limitations in pull mechanism. For example,
> one of problem is processed duplicated frame in video editor case.
>  And is the frameRate properties in [3] +
> |MediaStreamTrack::applyConstraints| not enough to slow down the internal
> production of frames? Thanks.
>  [1]:
> http://secure-web.cisco.com/1Xy4R4-EgriH8N8X1o0Evssv7S9Bl9_cVa6coy_nNzQjWkK4VmEl5ECR1JtgjtzAGW6ZHeBWWJstJjsm4e2bgYwZLa4Jbt94wIikBWC5v5gh-FnWSD7Wl1TseIByxInnx-c0CKEz98QfZKKo6yzFMwFG_cKds35pDL6KxZi_AkIUeWpvdETYo9HckHNWTKHGv/http%3A%2F%2Fwww.w3.org%2FTR%2F2dcontext%2F#drawing-images-to-the-canvas
> [2]:
> http://secure-web.cisco.com/1nvPuu7yc9SySYfgzYOnXHjjZ-Pj3X79pRMoV9u34kDRwzM8D_6G9g8li-SObekTDBwtRWmiGIDYWO2-_ea5GlBTCtuJyr8s93xP5IOq8VhQnNueJB-Tsx7EL4ywbDzlAd4gw2WwC2BiMK0DKy7kJahGjjYWrJssNKUzuvqJQSaeRO1LbRS0VjAfZGHgPr9AI/http%3A%2F%2Fwww.w3.org%2FTR%2Fmediacapture-fromelement%2F#the-canvascapturemediastream
> [3]:
> http://secure-web.cisco.com/18oBT_DP5wv2Yfi3wSlSm4eedi5ynC56-GD6i4JdZ1bErSJbX28Dd_yFvibLsYCzBOA1-vYCYv4e5m17FqyA7esI9UJaTT8IZUVAgmx-eXc8BghDLOPR7dRExAMGnllMHvKKh4QDo89PT33xCOEj-bS-t94PS1xuVPBuTp6Cc_Q7lIF-GjZbjD1Wfsp-yXBx0/http%3A%2F%2Fwww.w3.org%2FTR%2Fmediacapture-streams%2F#track-constrainable-property-registrations
>   BR,
> CTai
> 2015-07-29 10:21 GMT+08:00 Mathieu Hofman <Mathieu.Hofman@citrix.com>:
>>  I think we're not talking about the same thing. What I'm looking for is
>> a feedback mechanism that can notify the browser that new frames are not
>> needed right now. Simply ignoring produced frames in the consumer app is
>> different.
>> Some sources like screen sharing do not have to produce a constant stream
>> of frames. It's can be quite expensive to capture the screen for no reason.
>>  An asynchronous pull mechanism solves both problems of the app
>> notifying the browser a frame is wanted, thus only producing when the app
>> needs it (backpressure), and providing frames when the browser producer has
>> a new one, avoiding the app having to diff frames or guess framerate.
>>  The browser implementation under the hood doesn't have to slow down the
>> internal production of frames if it cannot or doesn't want to, and can
>> simply drop frames internally, but it can also use the frame request as a
>> signal to match the production of frames to the demand.
>>  Makes sense?
>>  Mathieu
>>  ------------------------------
>> *From:* Chia-Hung Tai [ctai@mozilla.com]
>> *Sent:* Tuesday, July 28, 2015 6:49 PM
>> *To:* Mathieu Hofman
>> *Cc:* robert@ocallahan.org; public-media-capture@w3.org;
>> public-webrtc@w3.org
>> *Subject:* Re: Add "MediaStream with worker" for video processing into
>> the new working items of WebRTC WG
>>    Hi, Mathieu,
>>  As for backpressure, you can just use early return strategy to reach
>> what you want. See [1] for an example. In [2], we use a worker pool to
>> reduce the drop frame rate. We don't address too much frame drop mechanism
>> in the specification. The logic behind it is simple. There is no way to
>> design a drop frame mechanism which fulfilled all kind of web developer
>> needs. So the implementation in User Agent could be simple. And Web
>> developer can manage the flow control on their own like [1] and [2]. So I
>> think the case you mentioned could be resolved by skip the event until you
>> get the acked by the remote side.  Thanks!
>> [1]:
>> https://github.com/kakukogou/foxeye-demo/blob/master/Sample_Monitor/control_worker.js
>> [2]:
>> https://github.com/kakukogou/foxeye-demo/blob/master/Sample_Monitor_Multiple_ProcessorWorker/control_worker.js
>>   BR,
>> CTai
Received on Wednesday, 29 July 2015 06:47:25 UTC

This archive was generated by hypermail 2.4.0 : Friday, 17 January 2020 19:18:08 UTC