Skip to content

Commit a3093f2

Browse files
shi-suShi Su
and
Shi Su
authored
Match framerate in DefaultVideoFrameProcessorPipeline with input stream (#3028)
Co-authored-by: Shi Su <[email protected]>
1 parent 9a5de7b commit a3093f2

File tree

6 files changed

+25
-10
lines changed

6 files changed

+25
-10
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1414
### Changed
1515

1616
### Fixed
17+
- Match framerate in `DefaultVideoFrameProcessorPipeline` with input stream
1718

1819
## [3.26.0] - 2024-10-07
1920

docs/classes/defaultvideoframeprocessorpipeline.html

+3-3
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ <h3>processors</h3>
237237
<aside class="tsd-sources">
238238
<p>Implementation of <a href="../interfaces/videoframeprocessorpipeline.html">VideoFrameProcessorPipeline</a>.<a href="../interfaces/videoframeprocessorpipeline.html#processors">processors</a></p>
239239
<ul>
240-
<li>Defined in <a href="https://github.com/aws/amazon-chime-sdk-js/blob/main/src/videoframeprocessor/DefaultVideoFrameProcessorPipeline.ts#L193">src/videoframeprocessor/DefaultVideoFrameProcessorPipeline.ts:193</a></li>
240+
<li>Defined in <a href="https://github.com/aws/amazon-chime-sdk-js/blob/main/src/videoframeprocessor/DefaultVideoFrameProcessorPipeline.ts#L194">src/videoframeprocessor/DefaultVideoFrameProcessorPipeline.ts:194</a></li>
241241
</ul>
242242
</aside>
243243
<div class="tsd-comment tsd-typography">
@@ -251,7 +251,7 @@ <h4 class="tsd-returns-title">Returns <a href="../interfaces/videoframeprocessor
251251
<aside class="tsd-sources">
252252
<p>Implementation of <a href="../interfaces/videoframeprocessorpipeline.html">VideoFrameProcessorPipeline</a>.<a href="../interfaces/videoframeprocessorpipeline.html#processors">processors</a></p>
253253
<ul>
254-
<li>Defined in <a href="https://github.com/aws/amazon-chime-sdk-js/blob/main/src/videoframeprocessor/DefaultVideoFrameProcessorPipeline.ts#L189">src/videoframeprocessor/DefaultVideoFrameProcessorPipeline.ts:189</a></li>
254+
<li>Defined in <a href="https://github.com/aws/amazon-chime-sdk-js/blob/main/src/videoframeprocessor/DefaultVideoFrameProcessorPipeline.ts#L190">src/videoframeprocessor/DefaultVideoFrameProcessorPipeline.ts:190</a></li>
255255
</ul>
256256
</aside>
257257
<div class="tsd-comment tsd-typography">
@@ -380,7 +380,7 @@ <h3>process</h3>
380380
<li class="tsd-description">
381381
<aside class="tsd-sources">
382382
<ul>
383-
<li>Defined in <a href="https://github.com/aws/amazon-chime-sdk-js/blob/main/src/videoframeprocessor/DefaultVideoFrameProcessorPipeline.ts#L197">src/videoframeprocessor/DefaultVideoFrameProcessorPipeline.ts:197</a></li>
383+
<li>Defined in <a href="https://github.com/aws/amazon-chime-sdk-js/blob/main/src/videoframeprocessor/DefaultVideoFrameProcessorPipeline.ts#L198">src/videoframeprocessor/DefaultVideoFrameProcessorPipeline.ts:198</a></li>
384384
</ul>
385385
</aside>
386386
<h4 class="tsd-parameters-title">Parameters</h4>

src/videoframeprocessor/DefaultVideoFrameProcessorPipeline.ts

+1
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@ export default class DefaultVideoFrameProcessorPipeline implements VideoFramePro
144144
this.inputVideoStream = inputMediaStream;
145145
const settings = this.inputVideoStream.getVideoTracks()[0].getSettings();
146146
this.logger.info(`processing pipeline input stream settings ${JSON.stringify(settings)}`);
147+
this.framerate = settings.frameRate;
147148
this.canvasOutput.width = settings.width;
148149
this.canvasOutput.height = settings.height;
149150
this.videoInput.addEventListener('loadedmetadata', this.process);

test/dommock/DOMMockBuilder.ts

+10
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import UserMediaState from './UserMediaState';
1717

1818
export interface StoppableMediaStreamTrack extends MediaStreamTrack {
1919
streamDeviceID: string | undefined;
20+
framerate: number;
2021

2122
// This stops the track _and dispatches 'ended'_.
2223
// https://stackoverflow.com/a/55960232
@@ -30,6 +31,9 @@ export interface StoppableMediaStreamTrack extends MediaStreamTrack {
3031

3132
// Tracks know their source device ID. This lets us fake it in tests.
3233
setStreamDeviceID(id: string | undefined): void;
34+
35+
// Tracks know their framerate as a setting, this lets us fake it in tests.
36+
setFramerate(framerate: number): void;
3337
}
3438

3539
// eslint-disable-next-line
@@ -287,6 +291,7 @@ export default class DOMMockBuilder {
287291
readyState: MediaStreamTrackState = 'live';
288292

289293
streamDeviceID = mockBehavior.mediaStreamTrackSettings?.deviceId || uuidv1();
294+
framerate = 15;
290295

291296
readonly id: string;
292297
readonly kind: string = '';
@@ -364,6 +369,10 @@ export default class DOMMockBuilder {
364369
this.streamDeviceID = id;
365370
}
366371

372+
setFramerate(framerate: number): void {
373+
this.framerate = framerate;
374+
}
375+
367376
// This stops the track _and dispatches 'ended'_.
368377
// https://stackoverflow.com/a/55960232
369378
externalStop(): void {
@@ -397,6 +406,7 @@ export default class DOMMockBuilder {
397406
height: mockBehavior.mediaStreamTrackSettings.height,
398407
facingMode: mockBehavior.mediaStreamTrackSettings.facingMode,
399408
groupId: mockBehavior.mediaStreamTrackSettings.groupId,
409+
frameRate: this.framerate,
400410
};
401411
}
402412

test/videoframeprocessor/DefaultVideoFrameProcessorPipeline.test.ts

+7-4
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import VideoFrameProcessor from '../../src/videoframeprocessor/VideoFrameProcess
1414
import VideoFrameProcessorPipelineObserver from '../../src/videoframeprocessor/VideoFrameProcessorPipelineObserver';
1515
import VideoFrameProcessorTimer from '../../src/videoframeprocessor/VideoFrameProcessorTimer';
1616
import DOMMockBehavior from '../dommock/DOMMockBehavior';
17-
import DOMMockBuilder from '../dommock/DOMMockBuilder';
17+
import DOMMockBuilder, { StoppableMediaStreamTrack } from '../dommock/DOMMockBuilder';
1818

1919
/**
2020
* [[MockVideoFrameProcessorTimer]] uses just `setTimeout` to avoid the complexity of
@@ -40,7 +40,7 @@ describe('DefaultVideoFrameProcessorPipeline', () => {
4040
let domMockBehavior: DOMMockBehavior;
4141
let domMockBuilder: DOMMockBuilder;
4242
let mockVideoStream: MediaStream;
43-
let mockVideoTrack: MediaStreamTrack;
43+
let mockVideoTrack: StoppableMediaStreamTrack;
4444
let proc: VideoFrameProcessor;
4545
const mockTimer = new MockVideoFrameProcessorTimer();
4646

@@ -73,8 +73,11 @@ describe('DefaultVideoFrameProcessorPipeline', () => {
7373
mockVideoStream = new MediaStream();
7474
// @ts-ignore
7575
mockVideoStream.id = mockStreamId;
76-
// @ts-ignore
77-
mockVideoTrack = new MediaStreamTrack('attach-media-input-task-video-track-id', 'video');
76+
mockVideoTrack = new MediaStreamTrack(
77+
// @ts-ignore
78+
'attach-media-input-task-video-track-id',
79+
'video'
80+
) as StoppableMediaStreamTrack;
7881
mockVideoStream.addTrack(mockVideoTrack);
7982
proc = new NoOpVideoFrameProcessor();
8083
pipe = new DefaultVideoFrameProcessorPipeline(logger, [proc], mockTimer);

test/videoframeprocessor/DefaultVideoTransformDevice.test.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import VideoFxProcessor from '../../src/videofx/VideoFxProcessor';
2222
import MockEngineWorker from '../../test/videofx/MockEngineWorker';
2323
import MockFxLib from '../../test/videofx/MockFxLib';
2424
import DOMMockBehavior from '../dommock/DOMMockBehavior';
25-
import DOMMockBuilder from '../dommock/DOMMockBuilder';
25+
import DOMMockBuilder, { StoppableMediaStreamTrack } from '../dommock/DOMMockBuilder';
2626

2727
describe('DefaultVideoTransformDevice', () => {
2828
const assert: Chai.AssertStatic = chai.assert;
@@ -31,7 +31,7 @@ describe('DefaultVideoTransformDevice', () => {
3131
let domMockBehavior: DOMMockBehavior;
3232
let domMockBuilder: DOMMockBuilder;
3333
let mockVideoStream: MediaStream;
34-
let mockVideoTrack: MediaStreamTrack;
34+
let mockVideoTrack: StoppableMediaStreamTrack;
3535

3636
class MockObserver implements DefaultVideoTransformDeviceObserver {
3737
processingDidStart = sinon.stub();
@@ -77,7 +77,7 @@ describe('DefaultVideoTransformDevice', () => {
7777
// @ts-ignore
7878
mockVideoStream.id = 'sample';
7979
// @ts-ignore
80-
mockVideoTrack = new MediaStreamTrack('test', 'video');
80+
mockVideoTrack = new MediaStreamTrack('test', 'video') as StoppableMediaStreamTrack;
8181
mockVideoStream.addTrack(mockVideoTrack);
8282
});
8383

0 commit comments

Comments
 (0)