You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Promise<unsigned long long> generateKeyFrame(optional DOMString rid);
341
+
Promise<undefined> sendKeyFrameRequest();
335
342
};
336
343
337
344
[Exposed=Window]
@@ -365,9 +372,30 @@ The <dfn constructor for="RTCRtpScriptTransform" lt="RTCRtpScriptTransform(worke
365
372
366
373
// FIXME: Describe error handling (worker closing flag true at RTCRtpScriptTransform creation time. And worker being terminated while transform is processing data).
367
374
375
+
Each RTCRtpScriptTransform has the following set of [=association steps=], given |rtcObject|:
376
+
1. Let |transform| be the {{RTCRtpScriptTransform}} object that owns the [=association steps=].
377
+
1. Let |encoder| be |rtcObject|'s encoder if |rtcObject| is a {{RTCRtpSender}} or undefined otherwise.
378
+
1. Let |depacketizer| be |rtcObject|'s depacketizer if |rtcObject| is a {{RTCRtpReceiver}} or undefined otherwise.
379
+
1. [=Queue a task=] on the DOM manipulation [=task source=] |worker|'s global scope to run the following steps:
380
+
1. Let |transformer| be the {{RTCRtpScriptTransformer}} object associated to |transform|.
381
+
1. Set |transformer|.`[[encoder]]` to |encoder|.
382
+
1. Set |transformer|.`[[depacketizer]]` to |depacketizer|.
383
+
384
+
The <dfn method for="RTCRtpScriptTransformer">generateKeyFrame(|rid|)</dfn> method steps are:
385
+
1. Let |promise| be a new promise.
386
+
1. Run the [=generate key frame algorithm=] with |promise|, |this|.`[[encoder]]` and |rid|.
387
+
1. Return |promise|.
388
+
389
+
The <dfn method for="RTCRtpScriptTransformer">sendKeyFrameRequest()</dfn> method steps are:
390
+
1. Let |promise| be a new promise.
391
+
1. Run the [=send request key frame algorithm=] with |promise| and |this|.`[[depacketizer]]`.
A RTCRtpScriptTransformer has three private slots called `[[options]]`, `[[readable]]` and `[[writable]]`.
396
+
A {{RTCRtpScriptTransformer}} has the following private slots called `[[depacketizer]]`, `[[encoder]]`, `[[options]]`, `[[readable]]` and `[[writable]]`.
397
+
In addition, a {{RTCRtpScriptTransformer}} is always associated with its parent {{RTCRtpScriptTransform}} transform.
398
+
This allows algorithms to go from an {{RTCRtpScriptTransformer}} object to its {{RTCRtpScriptTransform}} parent and vice versa.
371
399
372
400
The <dfn attribute for="RTCRtpScriptTransformer">options</dfn> getter steps are:
373
401
1. Return [=this=].`[[options]]`.
@@ -378,6 +406,66 @@ The <dfn attribute for="RTCRtpScriptTransformer">readable</dfn> getter steps are
378
406
The <dfn attribute for="RTCRtpScriptTransformer">writable</dfn> getter steps are:
379
407
1. Return [=this=].`[[writable]]`.
380
408
409
+
## KeyFrame Algorithms ## {#KeyFrame-algorithms}
410
+
411
+
The <dfn>generate key frame algorithm</dfn>, given |promise|, |encoder| and |rid|, is defined by running these steps:
412
+
1. If |encoder| is undefined, reject |promise| with {{InvalidStateError}}, abort these steps.
413
+
1. If |encoder| is not processing video frames, reject |promise| with {{InvalidStateError}}, abort these steps.
414
+
1. If |rid| is defined, validate its value. If invalid, reject |promise| with {{NotAllowedError}} and abort these steps.
415
+
1. [=In parallel=], run the following steps:
416
+
1. Gather a list of video encoders, named |videoEncoders| from |encoder|, ordered according negotiated RIDs if any.
417
+
1. If |rid| is defined, remove from |videoEncoders| any video encoder that does not match |rid|.
418
+
1. If |rid| is undefined, remove from |videoEncoders| all video encoders except the first one.
419
+
1. If |videoEncoders| is empty, reject |promise| with {{NotFoundError}} and abort these steps.
420
+
|videoEncoders| is expected to be empty if the corresponding {{RTCRtpSender}} is not active, or the corresponding {{RTCRtpSender}} track is ended.
421
+
1. Let |videoEncoder| be the first encoder in |videoEncoders|.
422
+
1. If |rid| is undefined, set |rid| to the RID value corresponding to |videoEncoder|.
423
+
1. Create a pending key frame task called |task| with |task|.`[[rid]]` set to rid and |task|.`[[promise]]`| set to |promise|.
424
+
1. If |encoder|.`[[pendingKeyFrameTasks]]` is undefined, initialize |encoder|.`[[pendingKeyFrameTasks]]` to an empty set.
425
+
1. Let |shouldTriggerKeyFrame| be <code>true</code> if |encoder|.`[[pendingKeyFrameTasks]]` contains a task whose `[[rid]]`
426
+
value is equal to |rid|, and <code>false</code> otherwise.
427
+
1. Add |task| to |encoder|.`[[pendingKeyFrameTasks]]`.
428
+
1. If |shouldTriggerKeyFrame| is <code>true</code>, instruct |videoEncoder| to generate a key frame for the next provided video frame.
429
+
430
+
For any {{RTCRtpScriptTransformer}} named |transformer|, the following steps are run just before any |frame| is enqueued in |transformer|.`[[readable]]`:
431
+
1. Let |encoder| be |transformer|.`[[encoder]]`.
432
+
1. If |encoder| or |encoder|.`[[pendingKeyFrameTasks]]` is undefined, abort these steps.
433
+
1. If |frame| is not a video key frame, abort these steps.
434
+
1. For each |task| in |encoder|.`[[pendingKeyFrameTasks]]`, run the following steps:
435
+
1. If |frame| was generated by a video encoder identified by |task|.`[[rid]]`, run the following steps:
436
+
1. Remove |task| from |encoder|.`[[pendingKeyFrameTasks]]`.
437
+
1. Resolve |task|.`[[promise]]` with |frame|'s timestamp.
438
+
439
+
By resolving the promises just before enqueuing the corresponding key frame in a {{RTCRtpScriptTransformer}}'s readable,
440
+
the resolution callbacks of the promises are always executed just before the corresponding key frame is exposed.
441
+
If the promise is associated to several rid values, it will be resolved when the first key frame corresponding to one the rid value is enqueued.
442
+
443
+
The <dfn>send request key frame algorithm</dfn>, given |promise| and |depacketizer|, is defined by running these steps:
444
+
1. If |depacketizer| is undefined, reject |promise| with {{InvalidStateError}}, abort these steps.
445
+
1. If |depacketizer| is not processing video packets, reject |promise| with {{InvalidStateError}}, abort these steps.
446
+
1. [=In parallel=], run the following steps:
447
+
1. If sending a Full Intra Request (FIR) by |depacketizer|'s receiver is not deemed appropriate, [=resolve=] |promise| with undefined and abort these steps.
448
+
Section 4.3.1 of [[RFC5104]] provides guidelines of how and when it is appropriate to sending a Full Intra Request.
449
+
1. Generate a Full Intra Request (FIR) packet as defined in section 4.3.1 of [[RFC5104]] and send it through |depacketizer|'s receiver.
0 commit comments