seq_bit_stream.js 3.4 KB

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