- From: guest271314 via GitHub <sysbot+gh@w3.org>
- Date: Wed, 01 Jul 2020 19:55:03 +0000
- To: public-webrtc@w3.org
guest271314 has just created a new issue for https://github.com/w3c/mediacapture-fromelement:
== Make requestFrame() observable as a Promise resolving with frame metadata ==
Currently `requestFrame()` is not observable. 
At some implementations of `captureStream()` it might be necessary to execute `requestFrame()` twice to get the current frame drawn onto the canvas captured in the `MediaStreamTrack`, see https://bugs.chromium.org/p/chromium/issues/detail?id=1047984.
Given `requestFrame()` operation necessarily asynchronous make `requestFrame()` a `Promise` that resolves with a plain JavaScript object containing metadata about the frame request and image, for example, from [HTMLVideoElement.requestVideoFrameCallback()](https://wicg.github.io/video-rvfc/) we find this language
> Drawing operations (e.g. drawing a video frame to a canvas via drawImage()) made through this API will be synchronized as a _best effort_ with the video playing on screen. _Best effort_ in this case means that, even with a normal work load, a callback can occasionally be fired one v-sync late, relative to when the new video frame was presented. This means that drawing operations might occasionally appear on screen one v-sync after the video frame does. Additionally, if there is a heavy load on the main thread, we might not get a callback for every frame (as measured by a discontinuity in the presentedFrames).
where _best effort_ is a realistic description of drawing frames onto the `<canvas>` that will make it to the `MediaStreamTrack`, as there is no guarantee that `requestFrame()` will be executed in the current "event loop" or "tick" or "v-sync".
[2. VideoFrameMetadata](https://wicg.github.io/video-rvfc/#video-frame-metadata)
```
dictionary VideoFrameMetadata {
  required DOMHighResTimeStamp presentationTime;
  required DOMHighResTimeStamp expectedDisplayTime;
  required unsigned long width;
  required unsigned long height;
  required double mediaTime;
  required unsigned long presentedFrames;
  double processingDuration;
  DOMHighResTimeStamp captureTime;
  DOMHighResTimeStamp receiveTime;
  unsigned long rtpTimestamp;
};
```
and 
[3. VideoFrameRequestCallback](https://wicg.github.io/video-rvfc/#video-frame-request-callback)
```
callback VideoFrameRequestCallback = void(DOMHighResTimeStamp now, VideoFrameMetadata metadata);
```
so that users may gain some observable metadata about the result of the transactional procedure of drawing an image onto the `<canvas>` and capturing that image into a `MediaStreamTrack`. 
The resulting change could look something like
```
await track.requestFrame()
/*
[
  3104.6,
  {
    "expectedDisplayTime": 3089.1200000000003,
    "height": 150,
    "mediaTime": 2.805395,
    "presentationTime": 3089.1200000000003,
    "presentedFrames": 3,
    "width": 300
  }
]
*/
```
Please view or discuss this issue at https://github.com/w3c/mediacapture-fromelement/issues/86 using your GitHub account
Received on Wednesday, 1 July 2020 19:55:05 UTC