seq_bit_stream.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.SeqBitStream = void 0;
  4. const bit_stream_1 = require("./bit_stream");
  5. class SeqBitStream {
  6. constructor(parameters = {}) {
  7. var _a;
  8. this._length = 0;
  9. this._start = 0;
  10. this.prevLength = 0;
  11. this.prevStart = 0;
  12. this.stream = ((_a = parameters.stream) === null || _a === void 0 ? void 0 : _a.slice()) || new bit_stream_1.BitStream();
  13. this.appendBlock = parameters.appendBlock || 0;
  14. if (parameters.start && parameters.start > 0) {
  15. this.start = parameters.start;
  16. }
  17. if (parameters.length && parameters.length > 0) {
  18. this.length = parameters.length;
  19. }
  20. this.backward = parameters.backward || false;
  21. }
  22. set start(value) {
  23. if (value > this.stream.bitsCount) {
  24. return;
  25. }
  26. this._length -= ((this.backward) ? (this._start - value) : (value - this._start));
  27. this._start = value;
  28. this.prevStart = this._start;
  29. this.prevLength = this._length;
  30. }
  31. get start() {
  32. return this._start;
  33. }
  34. set length(value) {
  35. if (value > this.stream.bitsCount) {
  36. return;
  37. }
  38. this.prevLength = this._length;
  39. this._length = value;
  40. }
  41. get length() {
  42. return this._length;
  43. }
  44. set stream(value) {
  45. this._stream = value;
  46. this.prevLength = this._length;
  47. this._length = value.bitsCount;
  48. this.prevStart = this._start;
  49. this._start = (this.backward) ? this.length : 0;
  50. }
  51. get stream() {
  52. return this._stream;
  53. }
  54. getBits(length = null) {
  55. if (length === null) {
  56. length = 0;
  57. }
  58. else if (length === 0) {
  59. return new bit_stream_1.BitStream();
  60. }
  61. if ((this.start + length) > this.stream.bitsCount) {
  62. length = (this.stream.bitsCount - this.start);
  63. }
  64. let result;
  65. if (this.backward) {
  66. result = this.stream.copy(this.start - length, length);
  67. this.start -= result.bitsCount;
  68. }
  69. else {
  70. result = this.stream.copy(this.start, length);
  71. this.start += result.bitsCount;
  72. }
  73. return result;
  74. }
  75. getBitsString(length) {
  76. return this.getBits(length).toString();
  77. }
  78. getBitsReversedValue(length) {
  79. const initialValue = this.getBitsString(length);
  80. const initialValueLength = initialValue.length;
  81. let byteIndex;
  82. const initialOffset = 8 - (initialValueLength % 8);
  83. const reversedValue = new Array(initialValueLength);
  84. const value = new Uint32Array(1);
  85. const valueView = new Uint8Array(value.buffer, 0, 4);
  86. let i;
  87. if (initialValueLength > 32) {
  88. return (-1);
  89. }
  90. if (length == 32) {
  91. byteIndex = 3;
  92. }
  93. else {
  94. byteIndex = ((initialValueLength - 1) >> 3);
  95. }
  96. for (i = 0; i < initialValueLength; i++) {
  97. reversedValue[initialValueLength - 1 - i] = initialValue[i];
  98. }
  99. for (i = initialOffset; i < (initialOffset + initialValueLength); i++) {
  100. if (reversedValue[i - initialOffset] == "1") {
  101. valueView[byteIndex] |= 0x01 << (7 - (i % 8));
  102. }
  103. if (i && (((i + 1) % 8) == 0)) {
  104. byteIndex--;
  105. }
  106. }
  107. return value[0];
  108. }
  109. toString() {
  110. const streamToDisplay = this.stream.copy(this.start, this.length);
  111. return streamToDisplay.toString();
  112. }
  113. }
  114. exports.SeqBitStream = SeqBitStream;