Skip to content

Commit

Permalink
Disable H264 send for iOS 1.15.1
Browse files Browse the repository at this point in the history
  • Loading branch information
hensmi-amazon authored and ltrung committed Nov 17, 2021
1 parent e408bed commit 60b29cb
Show file tree
Hide file tree
Showing 18 changed files with 3,516 additions and 5,837 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Fixed

- Fix priority downlink policy bandwidth estimation metrics to work with Safari.
- Add a workaround to switch to VP8 for iOS 15.1 due to Safari bug that causes crash with H.264 encoding.

### Changed

Expand Down
3,165 changes: 148 additions & 3,017 deletions demos/browser/package-lock.json

Large diffs are not rendered by default.

5,640 changes: 2,828 additions & 2,812 deletions docs/assets/js/search.json

Large diffs are not rendered by default.

22 changes: 22 additions & 0 deletions docs/classes/defaultbrowserbehavior.html
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ <h3>Methods</h3>
<li class="tsd-kind-method tsd-parent-kind-class"><a href="defaultbrowserbehavior.html#requiresbundlepolicy" class="tsd-kind-icon">requires<wbr>Bundle<wbr>Policy</a></li>
<li class="tsd-kind-method tsd-parent-kind-class"><a href="defaultbrowserbehavior.html#requirescheckforsdpconnectionattributes" class="tsd-kind-icon">requires<wbr>Check<wbr>For<wbr>Sdp<wbr>Connection<wbr>Attributes</a></li>
<li class="tsd-kind-method tsd-parent-kind-class"><a href="defaultbrowserbehavior.html#requirescontextrecreationforaudioworklet" class="tsd-kind-icon">requires<wbr>Context<wbr>Recreation<wbr>For<wbr>Audio<wbr>Worklet</a></li>
<li class="tsd-kind-method tsd-parent-kind-class"><a href="defaultbrowserbehavior.html#requiresdisablingh264encoding" class="tsd-kind-icon">requires<wbr>Disabling<wbr>H264<wbr>Encoding</a></li>
<li class="tsd-kind-method tsd-parent-kind-class"><a href="defaultbrowserbehavior.html#requiresgroupidmediastreamconstraints" class="tsd-kind-icon">requires<wbr>Group<wbr>IdMedia<wbr>Stream<wbr>Constraints</a></li>
<li class="tsd-kind-method tsd-parent-kind-class"><a href="defaultbrowserbehavior.html#requiresicecandidategatheringtimeoutworkaround" class="tsd-kind-icon">requires<wbr>Ice<wbr>Candidate<wbr>Gathering<wbr>Timeout<wbr>Workaround</a></li>
<li class="tsd-kind-method tsd-parent-kind-class"><a href="defaultbrowserbehavior.html#requiresnoexactmediastreamconstraints" class="tsd-kind-icon">requires<wbr>NoExact<wbr>Media<wbr>Stream<wbr>Constraints</a></li>
Expand Down Expand Up @@ -394,6 +395,24 @@ <h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</
</li>
</ul>
</section>
<section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class">
<a name="requiresdisablingh264encoding" class="tsd-anchor"></a>
<h3>requires<wbr>Disabling<wbr>H264<wbr>Encoding</h3>
<ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class">
<li class="tsd-signature tsd-kind-icon">requires<wbr>Disabling<wbr>H264<wbr>Encoding<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>
</ul>
<ul class="tsd-descriptions">
<li class="tsd-description">
<aside class="tsd-sources">
<p>Implementation of <a href="../interfaces/extendedbrowserbehavior.html">ExtendedBrowserBehavior</a>.<a href="../interfaces/extendedbrowserbehavior.html#requiresdisablingh264encoding">requiresDisablingH264Encoding</a></p>
<ul>
<li>Defined in <a href="https://github.com/aws/amazon-chime-sdk-js/blob/master/src/browserbehavior/DefaultBrowserBehavior.ts#L281">src/browserbehavior/DefaultBrowserBehavior.ts:281</a></li>
</ul>
</aside>
<h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4>
</li>
</ul>
</section>
<section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class">
<a name="requiresgroupidmediastreamconstraints" class="tsd-anchor"></a>
<h3>requires<wbr>Group<wbr>IdMedia<wbr>Stream<wbr>Constraints</h3>
Expand Down Expand Up @@ -785,6 +804,9 @@ <h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">string</s
<li class=" tsd-kind-method tsd-parent-kind-class">
<a href="defaultbrowserbehavior.html#requirescontextrecreationforaudioworklet" class="tsd-kind-icon">requires<wbr>Context<wbr>Recreation<wbr>For<wbr>Audio<wbr>Worklet</a>
</li>
<li class=" tsd-kind-method tsd-parent-kind-class">
<a href="defaultbrowserbehavior.html#requiresdisablingh264encoding" class="tsd-kind-icon">requires<wbr>Disabling<wbr>H264<wbr>Encoding</a>
</li>
<li class=" tsd-kind-method tsd-parent-kind-class">
<a href="defaultbrowserbehavior.html#requiresgroupidmediastreamconstraints" class="tsd-kind-icon">requires<wbr>Group<wbr>IdMedia<wbr>Stream<wbr>Constraints</a>
</li>
Expand Down
22 changes: 22 additions & 0 deletions docs/classes/defaultsdp.html
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,7 @@ <h3>Methods</h3>
<li class="tsd-kind-method tsd-parent-kind-class"><a href="defaultsdp.html#hasvideo" class="tsd-kind-icon">has<wbr>Video</a></li>
<li class="tsd-kind-method tsd-parent-kind-class"><a href="defaultsdp.html#lines" class="tsd-kind-icon">lines</a></li>
<li class="tsd-kind-method tsd-parent-kind-class"><a href="defaultsdp.html#preferh264ifexists" class="tsd-kind-icon">prefer<wbr>H264<wbr>IfExists</a></li>
<li class="tsd-kind-method tsd-parent-kind-class"><a href="defaultsdp.html#removeh264supportfromsendsection" class="tsd-kind-icon">remove<wbr>H264<wbr>Support<wbr>From<wbr>Send<wbr>Section</a></li>
<li class="tsd-kind-method tsd-parent-kind-class"><a href="defaultsdp.html#ssrcforvideosendingsection" class="tsd-kind-icon">ssrc<wbr>For<wbr>Video<wbr>Sending<wbr>Section</a></li>
<li class="tsd-kind-method tsd-parent-kind-class"><a href="defaultsdp.html#videosendsectionhasdifferentssrc" class="tsd-kind-icon">video<wbr>Send<wbr>Section<wbr>Has<wbr>DifferentSSRC</a></li>
<li class="tsd-kind-method tsd-parent-kind-class"><a href="defaultsdp.html#withaudiomaxaveragebitrate" class="tsd-kind-icon">with<wbr>Audio<wbr>Max<wbr>Average<wbr>Bitrate</a></li>
Expand Down Expand Up @@ -357,6 +358,24 @@ <h4 class="tsd-returns-title">Returns <a href="defaultsdp.html" class="tsd-signa
</li>
</ul>
</section>
<section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class">
<a name="removeh264supportfromsendsection" class="tsd-anchor"></a>
<h3>remove<wbr>H264<wbr>Support<wbr>From<wbr>Send<wbr>Section</h3>
<ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class">
<li class="tsd-signature tsd-kind-icon">remove<wbr>H264<wbr>Support<wbr>From<wbr>Send<wbr>Section<span class="tsd-signature-symbol">(</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><a href="defaultsdp.html" class="tsd-signature-type">DefaultSDP</a></li>
</ul>
<ul class="tsd-descriptions">
<li class="tsd-description">
<aside class="tsd-sources">
<p>Implementation of <a href="../interfaces/sdp.html">SDP</a>.<a href="../interfaces/sdp.html#removeh264supportfromsendsection">removeH264SupportFromSendSection</a></p>
<ul>
<li>Defined in <a href="https://github.com/aws/amazon-chime-sdk-js/blob/master/src/sdp/DefaultSDP.ts#L484">src/sdp/DefaultSDP.ts:484</a></li>
</ul>
</aside>
<h4 class="tsd-returns-title">Returns <a href="defaultsdp.html" class="tsd-signature-type">DefaultSDP</a></h4>
</li>
</ul>
</section>
<section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class">
<a name="ssrcforvideosendingsection" class="tsd-anchor"></a>
<h3>ssrc<wbr>For<wbr>Video<wbr>Sending<wbr>Section</h3>
Expand Down Expand Up @@ -876,6 +895,9 @@ <h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">string</s
<li class=" tsd-kind-method tsd-parent-kind-class">
<a href="defaultsdp.html#preferh264ifexists" class="tsd-kind-icon">prefer<wbr>H264<wbr>IfExists</a>
</li>
<li class=" tsd-kind-method tsd-parent-kind-class">
<a href="defaultsdp.html#removeh264supportfromsendsection" class="tsd-kind-icon">remove<wbr>H264<wbr>Support<wbr>From<wbr>Send<wbr>Section</a>
</li>
<li class=" tsd-kind-method tsd-parent-kind-class">
<a href="defaultsdp.html#ssrcforvideosendingsection" class="tsd-kind-icon">ssrc<wbr>For<wbr>Video<wbr>Sending<wbr>Section</a>
</li>
Expand Down
8 changes: 4 additions & 4 deletions docs/classes/setlocaldescriptiontask.html
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ <h3>constructor</h3>
<aside class="tsd-sources">
<p>Overrides <a href="basetask.html">BaseTask</a>.<a href="basetask.html#constructor">constructor</a></p>
<ul>
<li>Defined in <a href="https://github.com/aws/amazon-chime-sdk-js/blob/master/src/task/SetLocalDescriptionTask.ts#L14">src/task/SetLocalDescriptionTask.ts:14</a></li>
<li>Defined in <a href="https://github.com/aws/amazon-chime-sdk-js/blob/master/src/task/SetLocalDescriptionTask.ts#L15">src/task/SetLocalDescriptionTask.ts:15</a></li>
</ul>
</aside>
<h4 class="tsd-parameters-title">Parameters</h4>
Expand Down Expand Up @@ -164,7 +164,7 @@ <h3><span class="tsd-flag ts-flagProtected">Protected</span> task<wbr>Name</h3>
<aside class="tsd-sources">
<p>Overrides <a href="basetask.html">BaseTask</a>.<a href="basetask.html#taskname">taskName</a></p>
<ul>
<li>Defined in <a href="https://github.com/aws/amazon-chime-sdk-js/blob/master/src/task/SetLocalDescriptionTask.ts#L12">src/task/SetLocalDescriptionTask.ts:12</a></li>
<li>Defined in <a href="https://github.com/aws/amazon-chime-sdk-js/blob/master/src/task/SetLocalDescriptionTask.ts#L13">src/task/SetLocalDescriptionTask.ts:13</a></li>
</ul>
</aside>
</section>
Expand All @@ -183,7 +183,7 @@ <h3>cancel</h3>
<p>Implementation of <a href="../interfaces/task.html">Task</a>.<a href="../interfaces/task.html#cancel">cancel</a></p>
<p>Overrides <a href="basetask.html">BaseTask</a>.<a href="basetask.html#cancel">cancel</a></p>
<ul>
<li>Defined in <a href="https://github.com/aws/amazon-chime-sdk-js/blob/master/src/task/SetLocalDescriptionTask.ts#L20">src/task/SetLocalDescriptionTask.ts:20</a></li>
<li>Defined in <a href="https://github.com/aws/amazon-chime-sdk-js/blob/master/src/task/SetLocalDescriptionTask.ts#L21">src/task/SetLocalDescriptionTask.ts:21</a></li>
</ul>
</aside>
<h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4>
Expand Down Expand Up @@ -287,7 +287,7 @@ <h3>run</h3>
<p>Implementation of <a href="../interfaces/task.html">Task</a>.<a href="../interfaces/task.html#run">run</a></p>
<p>Overrides <a href="basetask.html">BaseTask</a>.<a href="basetask.html#run">run</a></p>
<ul>
<li>Defined in <a href="https://github.com/aws/amazon-chime-sdk-js/blob/master/src/task/SetLocalDescriptionTask.ts#L30">src/task/SetLocalDescriptionTask.ts:30</a></li>
<li>Defined in <a href="https://github.com/aws/amazon-chime-sdk-js/blob/master/src/task/SetLocalDescriptionTask.ts#L31">src/task/SetLocalDescriptionTask.ts:31</a></li>
</ul>
</aside>
<h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol">&lt;</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">&gt;</span></h4>
Expand Down
21 changes: 21 additions & 0 deletions docs/interfaces/extendedbrowserbehavior.html
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,7 @@ <h3>Methods</h3>
<li class="tsd-kind-method tsd-parent-kind-interface tsd-is-inherited"><a href="extendedbrowserbehavior.html#requiresbundlepolicy" class="tsd-kind-icon">requires<wbr>Bundle<wbr>Policy</a></li>
<li class="tsd-kind-method tsd-parent-kind-interface tsd-is-inherited"><a href="extendedbrowserbehavior.html#requirescheckforsdpconnectionattributes" class="tsd-kind-icon">requires<wbr>Check<wbr>For<wbr>Sdp<wbr>Connection<wbr>Attributes</a></li>
<li class="tsd-kind-method tsd-parent-kind-interface tsd-is-overwrite"><a href="extendedbrowserbehavior.html#requirescontextrecreationforaudioworklet" class="tsd-kind-icon">requires<wbr>Context<wbr>Recreation<wbr>For<wbr>Audio<wbr>Worklet</a></li>
<li class="tsd-kind-method tsd-parent-kind-interface"><a href="extendedbrowserbehavior.html#requiresdisablingh264encoding" class="tsd-kind-icon">requires<wbr>Disabling<wbr>H264<wbr>Encoding</a></li>
<li class="tsd-kind-method tsd-parent-kind-interface"><a href="extendedbrowserbehavior.html#requiresgroupidmediastreamconstraints" class="tsd-kind-icon">requires<wbr>Group<wbr>IdMedia<wbr>Stream<wbr>Constraints</a></li>
<li class="tsd-kind-method tsd-parent-kind-interface tsd-is-inherited"><a href="extendedbrowserbehavior.html#requiresicecandidategatheringtimeoutworkaround" class="tsd-kind-icon">requires<wbr>Ice<wbr>Candidate<wbr>Gathering<wbr>Timeout<wbr>Workaround</a></li>
<li class="tsd-kind-method tsd-parent-kind-interface tsd-is-inherited"><a href="extendedbrowserbehavior.html#requiresnoexactmediastreamconstraints" class="tsd-kind-icon">requires<wbr>NoExact<wbr>Media<wbr>Stream<wbr>Constraints</a></li>
Expand Down Expand Up @@ -351,6 +352,23 @@ <h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</
</li>
</ul>
</section>
<section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-interface">
<a name="requiresdisablingh264encoding" class="tsd-anchor"></a>
<h3>requires<wbr>Disabling<wbr>H264<wbr>Encoding</h3>
<ul class="tsd-signatures tsd-kind-method tsd-parent-kind-interface">
<li class="tsd-signature tsd-kind-icon">requires<wbr>Disabling<wbr>H264<wbr>Encoding<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>
</ul>
<ul class="tsd-descriptions">
<li class="tsd-description">
<aside class="tsd-sources">
<ul>
<li>Defined in <a href="https://github.com/aws/amazon-chime-sdk-js/blob/master/src/browserbehavior/ExtendedBrowserBehavior.ts#L22">src/browserbehavior/ExtendedBrowserBehavior.ts:22</a></li>
</ul>
</aside>
<h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">boolean</span></h4>
</li>
</ul>
</section>
<section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-interface">
<a name="requiresgroupidmediastreamconstraints" class="tsd-anchor"></a>
<h3>requires<wbr>Group<wbr>IdMedia<wbr>Stream<wbr>Constraints</h3>
Expand Down Expand Up @@ -780,6 +798,9 @@ <h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">string</s
<li class=" tsd-kind-method tsd-parent-kind-interface tsd-is-overwrite">
<a href="extendedbrowserbehavior.html#requirescontextrecreationforaudioworklet" class="tsd-kind-icon">requires<wbr>Context<wbr>Recreation<wbr>For<wbr>Audio<wbr>Worklet</a>
</li>
<li class=" tsd-kind-method tsd-parent-kind-interface">
<a href="extendedbrowserbehavior.html#requiresdisablingh264encoding" class="tsd-kind-icon">requires<wbr>Disabling<wbr>H264<wbr>Encoding</a>
</li>
<li class=" tsd-kind-method tsd-parent-kind-interface">
<a href="extendedbrowserbehavior.html#requiresgroupidmediastreamconstraints" class="tsd-kind-icon">requires<wbr>Group<wbr>IdMedia<wbr>Stream<wbr>Constraints</a>
</li>
Expand Down
26 changes: 26 additions & 0 deletions docs/interfaces/sdp.html
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@ <h3>Methods</h3>
<li class="tsd-kind-method tsd-parent-kind-interface"><a href="sdp.html#hascandidatesforallmlines" class="tsd-kind-icon">has<wbr>Candidates<wbr>For<wbr>AllMLines</a></li>
<li class="tsd-kind-method tsd-parent-kind-interface"><a href="sdp.html#lines" class="tsd-kind-icon">lines</a></li>
<li class="tsd-kind-method tsd-parent-kind-interface"><a href="sdp.html#preferh264ifexists" class="tsd-kind-icon">prefer<wbr>H264<wbr>IfExists</a></li>
<li class="tsd-kind-method tsd-parent-kind-interface"><a href="sdp.html#removeh264supportfromsendsection" class="tsd-kind-icon">remove<wbr>H264<wbr>Support<wbr>From<wbr>Send<wbr>Section</a></li>
<li class="tsd-kind-method tsd-parent-kind-interface"><a href="sdp.html#ssrcforvideosendingsection" class="tsd-kind-icon">ssrc<wbr>For<wbr>Video<wbr>Sending<wbr>Section</a></li>
<li class="tsd-kind-method tsd-parent-kind-interface"><a href="sdp.html#videosendsectionhasdifferentssrc" class="tsd-kind-icon">video<wbr>Send<wbr>Section<wbr>Has<wbr>DifferentSSRC</a></li>
<li class="tsd-kind-method tsd-parent-kind-interface"><a href="sdp.html#withaudiomaxaveragebitrate" class="tsd-kind-icon">with<wbr>Audio<wbr>Max<wbr>Average<wbr>Bitrate</a></li>
Expand Down Expand Up @@ -253,6 +254,28 @@ <h4 class="tsd-returns-title">Returns <a href="sdp.html" class="tsd-signature-ty
</li>
</ul>
</section>
<section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-interface">
<a name="removeh264supportfromsendsection" class="tsd-anchor"></a>
<h3>remove<wbr>H264<wbr>Support<wbr>From<wbr>Send<wbr>Section</h3>
<ul class="tsd-signatures tsd-kind-method tsd-parent-kind-interface">
<li class="tsd-signature tsd-kind-icon">remove<wbr>H264<wbr>Support<wbr>From<wbr>Send<wbr>Section<span class="tsd-signature-symbol">(</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><a href="sdp.html" class="tsd-signature-type">SDP</a></li>
</ul>
<ul class="tsd-descriptions">
<li class="tsd-description">
<aside class="tsd-sources">
<ul>
<li>Defined in <a href="https://github.com/aws/amazon-chime-sdk-js/blob/master/src/sdp/SDP.ts#L86">src/sdp/SDP.ts:86</a></li>
</ul>
</aside>
<div class="tsd-comment tsd-typography">
<div class="lead">
<p>Removes H.264 from the send section.</p>
</div>
</div>
<h4 class="tsd-returns-title">Returns <a href="sdp.html" class="tsd-signature-type">SDP</a></h4>
</li>
</ul>
</section>
<section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-interface">
<a name="ssrcforvideosendingsection" class="tsd-anchor"></a>
<h3>ssrc<wbr>For<wbr>Video<wbr>Sending<wbr>Section</h3>
Expand Down Expand Up @@ -493,6 +516,9 @@ <h4 class="tsd-returns-title">Returns <a href="sdp.html" class="tsd-signature-ty
<li class=" tsd-kind-method tsd-parent-kind-interface">
<a href="sdp.html#preferh264ifexists" class="tsd-kind-icon">prefer<wbr>H264<wbr>IfExists</a>
</li>
<li class=" tsd-kind-method tsd-parent-kind-interface">
<a href="sdp.html#removeh264supportfromsendsection" class="tsd-kind-icon">remove<wbr>H264<wbr>Support<wbr>From<wbr>Send<wbr>Section</a>
</li>
<li class=" tsd-kind-method tsd-parent-kind-interface">
<a href="sdp.html#ssrcforvideosendingsection" class="tsd-kind-icon">ssrc<wbr>For<wbr>Video<wbr>Sending<wbr>Section</a>
</li>
Expand Down
16 changes: 15 additions & 1 deletion src/browserbehavior/DefaultBrowserBehavior.ts
Original file line number Diff line number Diff line change
Expand Up @@ -278,10 +278,24 @@ export default class DefaultBrowserBehavior implements BrowserBehavior, Extended
return this.isAndroid();
}

requiresDisablingH264Encoding(): boolean {
return (
(this.isIOSSafari() && this.version() === '15.1.0') ||
((this.isIOSChrome() || this.isIOSFirefox()) && /( OS 15_1 )/i.test(navigator.userAgent))
);
}

// These helpers should be kept private to encourage
// feature detection instead of browser detection.
private isIOSSafari(): boolean {
return this.browser.name === 'ios' || this.browser.name === 'ios-webview';
return (
this.browser.name === 'ios' ||
this.browser.name === 'ios-webview' ||
(this.browser.name === 'safari' &&
/( Mac )/i.test(navigator.userAgent) &&
!!navigator.maxTouchPoints &&
navigator.maxTouchPoints > 1) //Ipad
);
}

private isSafari(): boolean {
Expand Down
1 change: 1 addition & 0 deletions src/browserbehavior/ExtendedBrowserBehavior.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,5 @@ export default interface ExtendedBrowserBehavior extends BrowserBehavior {
isSimulcastSupported(): boolean;
supportsBackgroundFilter(): boolean;
disableResolutionScaleDown(): boolean;
requiresDisablingH264Encoding(): boolean;
}

0 comments on commit 60b29cb

Please sign in to comment.