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
341
Promise<undefined> sendKeyFrameRequest();
342
342
};
343
343
@@ -381,9 +381,9 @@ Each RTCRtpScriptTransform has the following set of [=association steps=], given
381
381
1. Set |transformer|.`[[encoder]]` to |encoder|.
382
382
1. Set |transformer|.`[[depacketizer]]` to |depacketizer|.
383
383
384
-
The <dfn method for="RTCRtpScriptTransformer">generateKeyFrame(|rids|)</dfn> method steps are:
384
+
The <dfn method for="RTCRtpScriptTransformer">generateKeyFrame(|rid|)</dfn> method steps are:
385
385
1. Let |promise| be a new promise.
386
-
1. Run the [=generate key frame algorithm=] with |promise|, |this|.`[[encoder]]` and |rids|.
386
+
1. Run the [=generate key frame algorithm=] with |promise|, |this|.`[[encoder]]` and |rid|.
387
387
1. Return |promise|.
388
388
389
389
The <dfn method for="RTCRtpScriptTransformer">sendKeyFrameRequest()</dfn> method steps are:
@@ -408,23 +408,24 @@ The <dfn attribute for="RTCRtpScriptTransformer">writable</dfn> getter steps are
408
408
409
409
## KeyFrame Algorithms ## {#KeyFrame-algorithms}
410
410
411
-
The <dfn>generate key frame algorithm</dfn>, given |promise|, |encoder| and |rids|, is defined by running these steps:
411
+
The <dfn>generate key frame algorithm</dfn>, given |promise|, |encoder| and |rid|, is defined by running these steps:
412
412
1. If |encoder| is undefined, reject |promise| with {{InvalidStateError}}, abort these steps.
413
413
1. If |encoder| is not processing video frames, reject |promise| with {{InvalidStateError}}, abort these steps.
414
-
1. If |rids| is defined, validate each of the RID values in |rids|.
415
-
If any RID value is invalid, reject |promise| with {{NotAllowedError}} and abort these steps.
414
+
1. If |rid| is defined, validate its value. If invalid, reject |promise| with {{NotAllowedError}} and abort these steps.
416
415
1. [=In parallel=], run the following steps:
417
-
1. Gather a list of video encoders, named |videoEncoders| from |encoder|.
418
-
1. If |rids| is not empty, remove from |videoEncoders| any video encoder that does not match a value in |rids|.
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
419
1. If |videoEncoders| is empty, reject |promise| with {{NotFoundError}} and abort these steps.
420
420
|videoEncoders| is expected to be empty if the corresponding {{RTCRtpSender}} is not active, or the corresponding {{RTCRtpSender}} track is ended.
421
-
1. For each |rid| in |rids|, run the following substeps:
422
-
1. Create a pending key frame task called |task| with ||task|.`[[rid]]` set to rid and |task|.`[[promise]]`| set to |promise|.
423
-
1. If |encoder|.`[[pendingKeyFrameTasks]]` is undefined, initialize |encoder|.`[[pendingKeyFrameTasks]]` to an empty set.
424
-
1. If |encoder|.`[[pendingKeyFrameTasks]]` contains a task which is matching |rid|, remove |rid| from |rids|.
425
-
1. Add |task| to |encoder|.`[[pendingKeyFrameTasks]]`.
426
-
1. If |rids| is not empty, remove from |videoEncoders| any video encoder that does not match a value in |rids|.
427
-
1. For each |videoEncoder| in |videoEncoders|, instruct |videoEncoder| to generate a key frame for the next provided video frame.
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.
428
429
429
430
For any {{RTCRtpScriptTransformer}} named |transformer|, the following steps are run just before any |frame| is enqueued in |transformer|.`[[readable]]`:
430
431
1. Let |encoder| be |transformer|.`[[encoder]]`.
@@ -433,7 +434,7 @@ For any {{RTCRtpScriptTransformer}} named |transformer|, the following steps are
433
434
1. For each |task| in |encoder|.`[[pendingKeyFrameTasks]]`, run the following steps:
434
435
1. If |frame| was generated by a video encoder identified by |task|.`[[rid]]`, run the following steps:
435
436
1. Remove |task| from |encoder|.`[[pendingKeyFrameTasks]]`.
436
-
1. Resolve |task|.`[[promise]]` with undefined.
437
+
1. Resolve |task|.`[[promise]]` with |frame|'s timestamp.
437
438
438
439
By resolving the promises just before enqueuing the corresponding key frame in a {{RTCRtpScriptTransformer}}'s readable,
439
440
the resolution callbacks of the promises are always executed just before the corresponding key frame is exposed.
0 commit comments