Skip to content

Commit d477baf

Browse files
shi-suShi Su
and
Shi Su
authored
Disable redundant audio for Chrome 106 and earlier (#2841)
Co-authored-by: Shi Su <[email protected]>
1 parent 5794e34 commit d477baf

File tree

15 files changed

+2699
-2612
lines changed

15 files changed

+2699
-2612
lines changed

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
2020
### Fixed
2121

2222
- Fix reconnections when setting audio Attendee Capability to 'None' or 'Send' mid call. The connection health monitor will now look at all packets received on all candidate pairs instead of just audio received media packets.
23-
- Setup passthrough streams for insertable streams case in the redundant audio worker so that passthrough streams do not get blocked on the main thread
23+
- Setup passthrough streams for insertable streams case in the redundant audio worker so that passthrough streams do not get blocked on the main thread.
24+
- Disable redundant audio for Chrome 106 and earlier to fix video decoder failure on old Chrome versions with redundant audio turned on.
2425

2526
## [3.19.0] - 2023-09-20
2627

demos/browser/app/meetingV2/meetingV2.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -637,7 +637,7 @@ export class DemoMeetingApp
637637
}
638638
);
639639

640-
if (this.defaultBrowserBehavior.hasFirefoxWebRTC()) {
640+
if (!this.defaultBrowserBehavior.supportsAudioRedundancy()) {
641641
// Firefox currently does not support audio redundancy through insertable streams or
642642
// script transform so disable the redundancy checkbox
643643
(document.getElementById('disable-audio-redundancy') as HTMLInputElement).disabled = true;

docs/assets/js/search.js

Lines changed: 2590 additions & 2582 deletions
Large diffs are not rendered by default.

docs/classes/defaultbrowserbehavior.html

Lines changed: 41 additions & 19 deletions
Large diffs are not rendered by default.

docs/interfaces/extendedbrowserbehavior.html

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ <h3>Methods</h3>
122122
<li class="tsd-kind-method tsd-parent-kind-interface"><a href="extendedbrowserbehavior.html#supportdownlinkbandwidthestimation" class="tsd-kind-icon">support<wbr>Downlink<wbr>Bandwidth<wbr>Estimation</a></li>
123123
<li class="tsd-kind-method tsd-parent-kind-interface tsd-is-inherited"><a href="extendedbrowserbehavior.html#supportstring" class="tsd-kind-icon">support<wbr>String</a></li>
124124
<li class="tsd-kind-method tsd-parent-kind-interface tsd-is-inherited"><a href="extendedbrowserbehavior.html#supportedvideocodecs" class="tsd-kind-icon">supported<wbr>Video<wbr>Codecs</a></li>
125+
<li class="tsd-kind-method tsd-parent-kind-interface"><a href="extendedbrowserbehavior.html#supportsaudioredundancy" class="tsd-kind-icon">supports<wbr>Audio<wbr>Redundancy</a></li>
125126
<li class="tsd-kind-method tsd-parent-kind-interface"><a href="extendedbrowserbehavior.html#supportsbackgroundfilter" class="tsd-kind-icon">supports<wbr>Background<wbr>Filter</a></li>
126127
<li class="tsd-kind-method tsd-parent-kind-interface tsd-is-inherited"><a href="extendedbrowserbehavior.html#supportscanvascapturedstreamplayback" class="tsd-kind-icon">supports<wbr>Canvas<wbr>Captured<wbr>Stream<wbr>Playback</a></li>
127128
<li class="tsd-kind-method tsd-parent-kind-interface"><a href="extendedbrowserbehavior.html#supportsdependencydescriptorrtpheaderextension" class="tsd-kind-icon">supports<wbr>Dependency<wbr>Descriptor<wbr>Rtp<wbr>Header<wbr>Extension</a></li>
@@ -146,7 +147,7 @@ <h3>disable480p<wbr>Resolution<wbr>Scale<wbr>Down</h3>
146147
<li class="tsd-description">
147148
<aside class="tsd-sources">
148149
<ul>
149-
<li>Defined in <a href="https://github.com/aws/amazon-chime-sdk-js/blob/main/src/browserbehavior/ExtendedBrowserBehavior.ts#L35">src/browserbehavior/ExtendedBrowserBehavior.ts:35</a></li>
150+
<li>Defined in <a href="https://github.com/aws/amazon-chime-sdk-js/blob/main/src/browserbehavior/ExtendedBrowserBehavior.ts#L36">src/browserbehavior/ExtendedBrowserBehavior.ts:36</a></li>
150151
</ul>
151152
</aside>
152153
<h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4>
@@ -438,7 +439,7 @@ <h3>requires<wbr>Playback<wbr>Latency<wbr>Hint<wbr>For<wbr>Audio<wbr>Context</h3
438439
<li class="tsd-description">
439440
<aside class="tsd-sources">
440441
<ul>
441-
<li>Defined in <a href="https://github.com/aws/amazon-chime-sdk-js/blob/main/src/browserbehavior/ExtendedBrowserBehavior.ts#L39">src/browserbehavior/ExtendedBrowserBehavior.ts:39</a></li>
442+
<li>Defined in <a href="https://github.com/aws/amazon-chime-sdk-js/blob/main/src/browserbehavior/ExtendedBrowserBehavior.ts#L40">src/browserbehavior/ExtendedBrowserBehavior.ts:40</a></li>
442443
</ul>
443444
</aside>
444445
<div class="tsd-comment tsd-typography">
@@ -552,6 +553,23 @@ <h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">Promise</
552553
</li>
553554
</ul>
554555
</section>
556+
<section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-interface">
557+
<a name="supportsaudioredundancy" class="tsd-anchor"></a>
558+
<h3>supports<wbr>Audio<wbr>Redundancy</h3>
559+
<ul class="tsd-signatures tsd-kind-method tsd-parent-kind-interface">
560+
<li class="tsd-signature tsd-kind-icon">supports<wbr>Audio<wbr>Redundancy<span class="tsd-signature-symbol">(</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">boolean</span></li>
561+
</ul>
562+
<ul class="tsd-descriptions">
563+
<li class="tsd-description">
564+
<aside class="tsd-sources">
565+
<ul>
566+
<li>Defined in <a href="https://github.com/aws/amazon-chime-sdk-js/blob/main/src/browserbehavior/ExtendedBrowserBehavior.ts#L35">src/browserbehavior/ExtendedBrowserBehavior.ts:35</a></li>
567+
</ul>
568+
</aside>
569+
<h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4>
570+
</li>
571+
</ul>
572+
</section>
555573
<section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-interface">
556574
<a name="supportsbackgroundfilter" class="tsd-anchor"></a>
557575
<h3>supports<wbr>Background<wbr>Filter</h3>
@@ -763,6 +781,9 @@ <h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">string</s
763781
<li class=" tsd-kind-method tsd-parent-kind-interface tsd-is-inherited">
764782
<a href="extendedbrowserbehavior.html#supportedvideocodecs" class="tsd-kind-icon">supported<wbr>Video<wbr>Codecs</a>
765783
</li>
784+
<li class=" tsd-kind-method tsd-parent-kind-interface">
785+
<a href="extendedbrowserbehavior.html#supportsaudioredundancy" class="tsd-kind-icon">supports<wbr>Audio<wbr>Redundancy</a>
786+
</li>
766787
<li class=" tsd-kind-method tsd-parent-kind-interface">
767788
<a href="extendedbrowserbehavior.html#supportsbackgroundfilter" class="tsd-kind-icon">supports<wbr>Background<wbr>Filter</a>
768789
</li>

src/audioprofile/AudioProfile.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ export default class AudioProfile {
3131
constructor(audioBitrateBps: number | null = null, enableAudioRedundancy: boolean = true) {
3232
this.audioBitrateBps = audioBitrateBps;
3333
this.enableAudioRedundancy =
34-
!new DefaultBrowserBehavior().hasFirefoxWebRTC() && enableAudioRedundancy;
34+
new DefaultBrowserBehavior().supportsAudioRedundancy() && enableAudioRedundancy;
3535
}
3636

3737
/**

src/browserbehavior/DefaultBrowserBehavior.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,15 @@ export default class DefaultBrowserBehavior implements BrowserBehavior, Extended
153153
);
154154
}
155155

156+
supportsAudioRedundancy(): boolean {
157+
if (this.hasChromiumWebRTC()) {
158+
// Audio redundancy may cause video decoding failure for Chromium version 106 and
159+
// earlier. Marking such Chromium versions as not supporting audio redundancy.
160+
return this.engineMajorVersion() >= 107;
161+
}
162+
return !this.hasFirefoxWebRTC();
163+
}
164+
156165
requiresResolutionAlignment(width: number, height: number): [number, number] {
157166
if (this.isAndroid() && this.isPixel3()) {
158167
return [Math.ceil(width / 64) * 64, Math.ceil(height / 64) * 64];

src/browserbehavior/ExtendedBrowserBehavior.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ export default interface ExtendedBrowserBehavior extends BrowserBehavior {
3232
supportsVideoLayersAllocationRtpHeaderExtension(): boolean;
3333
supportsDependencyDescriptorRtpHeaderExtension(): boolean;
3434
supportsScalableVideoCoding(): boolean;
35+
supportsAudioRedundancy(): boolean;
3536
disable480pResolutionScaleDown(): boolean;
3637
/**
3738
* Returns whether the browser requires the "playback" latency hint for Web Audio.

test/audioprofile/AudioProfile.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ describe('AudioProfile', () => {
1616
});
1717

1818
describe('constructor', () => {
19-
it('can be constructed correctly in chrome', () => {
19+
it('can be constructed correctly in chrome 107 and later', () => {
2020
const domMockBehavior: DOMMockBehavior = new DOMMockBehavior();
21-
domMockBehavior.browserName = 'chrome';
21+
domMockBehavior.browserName = 'chrome116';
2222
domMockBuilder = new DOMMockBuilder(domMockBehavior);
2323
expect(new AudioProfile().audioBitrateBps).to.equal(null);
2424
expect(new AudioProfile().hasRedundancyEnabled()).to.equal(true);

test/audiovideocontroller/DefaultAudioVideoController.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4435,7 +4435,7 @@ describe('DefaultAudioVideoController', () => {
44354435

44364436
it('can be started', async () => {
44374437
configuration.enableSimulcastForUnifiedPlanChromiumBasedBrowsers = true;
4438-
domMockBehavior.browserName = 'chrome';
4438+
domMockBehavior.browserName = 'chrome116';
44394439
domMockBuilder = new DOMMockBuilder(domMockBehavior);
44404440
audioVideoController = new DefaultAudioVideoController(
44414441
configuration,

test/browserbehavior/DefaultBrowserBehavior.test.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -357,4 +357,26 @@ describe('DefaultBrowserBehavior', () => {
357357
expect(new DefaultBrowserBehavior().supportsScalableVideoCoding()).to.be.true;
358358
});
359359
});
360+
361+
describe('Audio redundancy support', () => {
362+
it('Does not support audio redundancy for firefox', () => {
363+
setUserAgent(FIREFOX_MAC_USER_AGENT);
364+
expect(new DefaultBrowserBehavior().supportsAudioRedundancy()).to.be.false;
365+
});
366+
367+
it('Does not support audio redundancy for chrome earlier than version 107', () => {
368+
setUserAgent(CHROMIUM_EDGE_WINDOWS_USER_AGENT);
369+
expect(new DefaultBrowserBehavior().supportsAudioRedundancy()).to.be.false;
370+
});
371+
372+
it('Supports audio redundancy for chrome version 107 or later', () => {
373+
setUserAgent(CHROME_116_MAC_USER_AGENT);
374+
expect(new DefaultBrowserBehavior().supportsAudioRedundancy()).to.be.true;
375+
});
376+
377+
it('Supports audio redundancy for Safari', () => {
378+
setUserAgent(SAFARI_USER_AGENT);
379+
expect(new DefaultBrowserBehavior().supportsAudioRedundancy()).to.be.true;
380+
});
381+
});
360382
});

test/dommock/DOMMockBuilder.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -647,9 +647,12 @@ export default class DOMMockBuilder {
647647
'Mozilla/5.0 (iPhone; CPU iPhone OS 15_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.1 Mobile/15E148 Safari/604.1';
648648
const SAMSUNG_INTERNET_USERAGENT =
649649
'Mozilla/5.0 (Linux; Android 11; Pixel 3a XL) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/13.0 Chrome/83.0.4103.106 Mobile Safari/537.36';
650+
const CHROME_116_MAC_USER_AGENT =
651+
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36';
650652

651653
const USER_AGENTS = new Map<string, string>();
652654
USER_AGENTS.set('chrome', CHROME_USERAGENT);
655+
USER_AGENTS.set('chrome116', CHROME_116_MAC_USER_AGENT);
653656
USER_AGENTS.set('firefox', FIREFOX_USERAGENT);
654657
USER_AGENTS.set('safari', SAFARI_USERAGENT);
655658
USER_AGENTS.set('safari12', SAFARI12_USERAGENT);

test/task/AttachMediaInputTask.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ describe('AttachMediaInputTask', () => {
193193

194194
it('sets the correct audio codec preference if audio redundancy is enabled', done => {
195195
domMockBehavior = new DOMMockBehavior();
196-
domMockBehavior.browserName = 'chrome';
196+
domMockBehavior.browserName = 'chrome116';
197197
domMockBehavior.supportsAudioRedCodec = true;
198198
domMockBuilder = new DOMMockBuilder(domMockBehavior);
199199
context.audioProfile = new AudioProfile();

test/task/SetLocalDescriptionTask.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ describe('SetLocalDescriptionTask', () => {
136136

137137
it('will call setAudioPayloadTypes of transceiverController', async () => {
138138
domMockBehavior = new DOMMockBehavior();
139-
domMockBehavior.browserName = 'chrome';
139+
domMockBehavior.browserName = 'chrome116';
140140
domMockBuilder = new DOMMockBuilder(domMockBehavior);
141141
context.transceiverController = new DefaultTransceiverController(
142142
context.logger,

test/transceivercontroller/DefaultTransceiverController.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ describe('DefaultTransceiverController', () => {
8585
const context: AudioVideoControllerState = new AudioVideoControllerState();
8686

8787
beforeEach(() => {
88-
domMockBehavior.browserName = 'chrome';
88+
domMockBehavior.browserName = 'chrome116';
8989
domMockBuilder = new DOMMockBuilder(domMockBehavior);
9090

9191
// Wrap the mock worker to initialize the RED worker since the worker code at the URL is not actually executed.

0 commit comments

Comments
 (0)