transcoderManager.ts 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import { transcodeTarget, sourceTextureFormat, Transcoder } from './transcoder';
  2. import { WASMMemoryManager } from './wasmMemoryManager';
  3. /**
  4. * @hidden
  5. */
  6. export class TranscoderManager {
  7. public static _Transcoders: Array<typeof Transcoder> = [];
  8. public static RegisterTranscoder(transcoder: typeof Transcoder) {
  9. TranscoderManager._Transcoders.push(transcoder);
  10. }
  11. private static _transcoderInstances: { [key: string]: Array<Transcoder> } = {};
  12. private _wasmMemoryManager: WASMMemoryManager;
  13. public findTranscoder(src: sourceTextureFormat, dst: transcodeTarget, isInGammaSpace: boolean, bypass?: string[]): Transcoder | null {
  14. let transcoder: Transcoder | null = null;
  15. const key = sourceTextureFormat[src] + "_" + transcodeTarget[dst];
  16. for (let i = 0; i < TranscoderManager._Transcoders.length; ++i) {
  17. if (TranscoderManager._Transcoders[i].CanTranscode(src, dst, isInGammaSpace) && (!bypass || bypass.indexOf(TranscoderManager._Transcoders[i].Name) < 0)) {
  18. transcoder = this._getExistingTranscoder(key, TranscoderManager._Transcoders[i].Name);
  19. if (!transcoder) {
  20. transcoder = new TranscoderManager._Transcoders[i]();
  21. transcoder!.initialize();
  22. if (transcoder!.needMemoryManager()) {
  23. if (!this._wasmMemoryManager) {
  24. this._wasmMemoryManager = new WASMMemoryManager();
  25. }
  26. transcoder!.setMemoryManager(this._wasmMemoryManager);
  27. }
  28. if (!TranscoderManager._transcoderInstances[key]) {
  29. TranscoderManager._transcoderInstances[key] = [];
  30. }
  31. TranscoderManager._transcoderInstances[key].push(transcoder);
  32. }
  33. break;
  34. }
  35. }
  36. return transcoder;
  37. }
  38. private _getExistingTranscoder(key: string, transcoderName: string): Transcoder | null {
  39. let transcoders = TranscoderManager._transcoderInstances[key];
  40. if (transcoders) {
  41. for (let t = 0; t < transcoders.length; ++t) {
  42. const transcoder = transcoders[t];
  43. if (transcoderName === transcoder.getName()) {
  44. return transcoder;
  45. }
  46. }
  47. }
  48. return null;
  49. }
  50. }