predictor.js 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.applyPredictor = void 0;
  4. function decodeRowAcc(row, stride) {
  5. let length = row.length - stride;
  6. let offset = 0;
  7. do {
  8. for (let i = stride; i > 0; i--) {
  9. row[offset + stride] += row[offset];
  10. offset++;
  11. }
  12. length -= stride;
  13. } while (length > 0);
  14. }
  15. function decodeRowFloatingPoint(row, stride, bytesPerSample) {
  16. let index = 0;
  17. let count = row.length;
  18. const wc = count / bytesPerSample;
  19. while (count > stride) {
  20. for (let i = stride; i > 0; --i) {
  21. row[index + stride] += row[index];
  22. ++index;
  23. }
  24. count -= stride;
  25. }
  26. const copy = row.slice();
  27. for (let i = 0; i < wc; ++i) {
  28. for (let b = 0; b < bytesPerSample; ++b) {
  29. row[(bytesPerSample * i) + b] = copy[((bytesPerSample - b - 1) * wc) + i];
  30. }
  31. }
  32. }
  33. function applyPredictor(block, predictor, width, height, bitsPerSample, planarConfiguration) {
  34. if (!predictor || predictor === 1) {
  35. return block;
  36. }
  37. for (let i = 0; i < bitsPerSample.length; ++i) {
  38. if (bitsPerSample[i] % 8 !== 0) {
  39. throw new Error('When decoding with predictor, only multiple of 8 bits are supported.');
  40. }
  41. if (bitsPerSample[i] !== bitsPerSample[0]) {
  42. throw new Error('When decoding with predictor, all samples must have the same size.');
  43. }
  44. }
  45. const bytesPerSample = bitsPerSample[0] / 8;
  46. const stride = planarConfiguration === 2 ? 1 : bitsPerSample.length;
  47. for (let i = 0; i < height; ++i) {
  48. // Last strip will be truncated if height % stripHeight != 0
  49. if (i * stride * width * bytesPerSample >= block.byteLength) {
  50. break;
  51. }
  52. let row;
  53. if (predictor === 2) { // horizontal prediction
  54. switch (bitsPerSample[0]) {
  55. case 8:
  56. row = new Uint8Array(block, i * stride * width * bytesPerSample, stride * width * bytesPerSample);
  57. break;
  58. case 16:
  59. row = new Uint16Array(block, i * stride * width * bytesPerSample, stride * width * bytesPerSample / 2);
  60. break;
  61. case 32:
  62. row = new Uint32Array(block, i * stride * width * bytesPerSample, stride * width * bytesPerSample / 4);
  63. break;
  64. default:
  65. throw new Error(`Predictor 2 not allowed with ${bitsPerSample[0]} bits per sample.`);
  66. }
  67. decodeRowAcc(row, stride, bytesPerSample);
  68. }
  69. else if (predictor === 3) { // horizontal floating point
  70. row = new Uint8Array(block, i * stride * width * bytesPerSample, stride * width * bytesPerSample);
  71. decodeRowFloatingPoint(row, stride, bytesPerSample);
  72. }
  73. }
  74. return block;
  75. }
  76. exports.applyPredictor = applyPredictor;
  77. //# sourceMappingURL=predictor.js.map