playable
Version:
Video player based on HTML5Video
52 lines (46 loc) • 1.51 kB
text/typescript
import { IFramesData, IFramesQuality, INormalizedFramesQuality } from './types';
function normalizeFramesQuality(
framesCount: number,
quality: IFramesQuality,
neededFrame: number,
): INormalizedFramesQuality {
const framesInSprite =
quality.framesInSprite.vert * quality.framesInSprite.horz;
const frameNumberInSprite = neededFrame % framesInSprite;
const spriteNumber = Math.floor(neededFrame / framesInSprite);
const horzPositionInSprite =
frameNumberInSprite % quality.framesInSprite.horz;
const vertPositionInSprite = Math.floor(
frameNumberInSprite / quality.framesInSprite.vert,
);
const url = quality.spriteUrlMask.replace('%d', spriteNumber.toString());
return {
frameSize: quality.frameSize,
framesInSprite:
(spriteNumber + 1) * framesInSprite <= framesCount
? quality.framesInSprite
: {
horz: quality.framesInSprite.horz,
vert: Math.ceil(
(framesCount % framesInSprite) / quality.framesInSprite.vert,
),
},
framePositionInSprite: {
vert: vertPositionInSprite,
horz: horzPositionInSprite,
},
spriteUrl: url,
};
}
function getAt(
data: IFramesData,
second: number,
duration: number,
): INormalizedFramesQuality[] {
const { framesCount } = data;
const neededFrame = Math.floor((second * framesCount) / duration);
return data.qualities.map(quality =>
normalizeFramesQuality(framesCount, quality, neededFrame),
);
}
export { getAt };