@@ -205,18 +205,25 @@ async function loadTesseract() {
205
205
return await window . _tesseractData
206
206
}
207
207
208
+ webrtcperf . processingVideoTracks = new Set ( )
209
+
208
210
/**
209
211
* recognizeVideoTimestampWatermark
210
- * @param {MediaStreamTrack } videoTrack
212
+ * @param {MediaStreamTrack } track
211
213
* @param {number } measureInterval
212
214
*/
213
- webrtcperf . recognizeVideoTimestampWatermark = async ( videoTrack , measureInterval = 5 ) => {
214
- log ( `recognizeVideoTimestampWatermark ${ videoTrack . id } ${ videoTrack . label } ` , videoTrack . getSettings ( ) )
215
+ webrtcperf . recognizeVideoTimestampWatermark = async ( track , measureInterval = 5 ) => {
216
+ if ( webrtcperf . processingVideoTracks . has ( track . id ) ) return
217
+ webrtcperf . processingVideoTracks . add ( track )
218
+ track . addEventListener ( 'ended' , ( ) => {
219
+ webrtcperf . processingVideoTracks . delete ( track )
220
+ } )
221
+ log ( `recognizeVideoTimestampWatermark ${ track . id } ${ track . label } ` , track . getSettings ( ) )
215
222
const { scheduler } = await loadTesseract ( )
216
223
let lastTimestamp = 0
217
224
218
225
const trackProcessor = new window . MediaStreamTrackProcessor ( {
219
- track : videoTrack ,
226
+ track : track ,
220
227
} )
221
228
const writableStream = new window . WritableStream (
222
229
{
@@ -226,7 +233,7 @@ webrtcperf.recognizeVideoTimestampWatermark = async (videoTrack, measureInterval
226
233
227
234
if ( timestamp - lastTimestamp > measureInterval * 1000000 && codedWidth && codedHeight ) {
228
235
lastTimestamp = timestamp
229
- const textHeight = Math . round ( Math . round ( codedHeight / 18 ) * 1.2 )
236
+ const textHeight = Math . max ( Math . round ( codedHeight / 15 ) , 24 )
230
237
const bitmap = await createImageBitmap ( videoFrame , 0 , 0 , codedWidth , textHeight )
231
238
const canvas = new OffscreenCanvas ( codedWidth , textHeight )
232
239
const ctx = canvas . getContext ( 'bitmaprenderer' )
@@ -257,12 +264,17 @@ webrtcperf.recognizeVideoTimestampWatermark = async (videoTrack, measureInterval
257
264
}
258
265
videoFrame . close ( )
259
266
} ,
260
- close ( ) { } ,
267
+ close ( ) {
268
+ webrtcperf . processingVideoTracks . delete ( track )
269
+ } ,
261
270
abort ( err ) {
262
271
log ( 'WritableStream error:' , err )
272
+ webrtcperf . processingVideoTracks . delete ( track )
263
273
} ,
264
274
} ,
265
275
new CountQueuingStrategy ( { highWaterMark : 15 } ) ,
266
276
)
267
- trackProcessor . readable . pipeTo ( writableStream )
277
+ trackProcessor . readable . pipeTo ( writableStream ) . catch ( err => {
278
+ log ( `recognizeVideoTimestampWatermark error: ${ err . message } ` )
279
+ } )
268
280
}
0 commit comments