Skip to content

Commit f15d627

Browse files
authored
perf: Optimize getAllThumbnails() (#8525)
Use segment references from `forEachTopLevelReference()` callback to avoid unnecessary linear search on every possible thumbnail.
1 parent 015c101 commit f15d627

File tree

1 file changed

+21
-20
lines changed

1 file changed

+21
-20
lines changed

lib/player.js

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5277,12 +5277,10 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
52775277
const duration = reference.trueEndTime - reference.startTime;
52785278
for (let i = 0; i < numThumbnails; i++) {
52795279
const sampleTime = reference.startTime + duration * i / numThumbnails;
5280-
const thumbnail =
5281-
this.getThumbnailsByStream_(
5282-
/** @type {shaka.extern.Stream} */ (imageStream), sampleTime);
5283-
if (thumbnail) {
5284-
thumbnails.push(thumbnail);
5285-
}
5280+
const thumbnail = this.getThumbnailByReference_(reference,
5281+
/** @type {shaka.extern.Stream} */ (imageStream), sampleTime,
5282+
dimensions);
5283+
thumbnails.push(thumbnail);
52865284
}
52875285
}
52885286
});
@@ -5334,7 +5332,18 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
53345332
if (!imageStream) {
53355333
return null;
53365334
}
5337-
return this.getThumbnailsByStream_(imageStream, time);
5335+
const referencePosition = imageStream.segmentIndex.find(time);
5336+
if (referencePosition == null) {
5337+
return null;
5338+
}
5339+
const reference = imageStream.segmentIndex.get(referencePosition);
5340+
const dimensions = this.parseTilesLayout_(
5341+
reference.getTilesLayout() || imageStream.tilesLayout);
5342+
if (!dimensions) {
5343+
return null;
5344+
}
5345+
return this.getThumbnailByReference_(reference, imageStream, time,
5346+
dimensions);
53385347
}
53395348

53405349
/**
@@ -5373,24 +5382,16 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
53735382
}
53745383

53755384
/**
5376-
* Return a Thumbnail object from a image stream and time.
5385+
* Return a Thumbnail object from a reference.
53775386
*
5387+
* @param {shaka.media.SegmentReference} reference
53785388
* @param {shaka.extern.Stream} imageStream
53795389
* @param {number} time
5380-
* @return {?shaka.extern.Thumbnail}
5390+
* @param {{columns: number, rows: number}} dimensions
5391+
* @return {!shaka.extern.Thumbnail}
53815392
* @private
53825393
*/
5383-
getThumbnailsByStream_(imageStream, time) {
5384-
const referencePosition = imageStream.segmentIndex.find(time);
5385-
if (referencePosition == null) {
5386-
return null;
5387-
}
5388-
const reference = imageStream.segmentIndex.get(referencePosition);
5389-
const dimensions = this.parseTilesLayout_(
5390-
reference.getTilesLayout() || imageStream.tilesLayout);
5391-
if (!dimensions) {
5392-
return null;
5393-
}
5394+
getThumbnailByReference_(reference, imageStream, time, dimensions) {
53945395
const fullImageWidth = imageStream.width || 0;
53955396
const fullImageHeight = imageStream.height || 0;
53965397
let width = fullImageWidth / dimensions.columns;

0 commit comments

Comments
 (0)