Skip to content

Commit 26997fe

Browse files
committed
Merge branch 'hotfix/ogg-bigint-comparison'
2 parents a9313f7 + d27e711 commit 26997fe

3 files changed

Lines changed: 62 additions & 9 deletions

File tree

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "node-taglib-sharp",
33
"description": "Read and write audio/video/picture tags using a similar interface to TagLib#",
4-
"version": "5.0.0",
4+
"version": "5.0.1",
55
"license": "LGPL-2.1-or-later",
66
"author": "Ben Russell <benrr101@outlook.com> (https://github.com/benrr101)",
77
"repository": "github:benrr101/node-taglib-sharp",

src/ogg/oggPageHeader.ts

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,18 @@ export enum OggPageFlags {
2424
* This structure provides a representation of an Ogg page header.
2525
*/
2626
export class OggPageHeader {
27-
public static readonly MINIMUM_SIZE = 27;
2827
public static readonly HEADER_IDENTIFIER = ByteVector.fromString("OggS", StringType.Latin1).makeReadOnly();
28+
public static readonly MINIMUM_SIZE = 27;
29+
public static readonly NO_PACKETS_END_IN_PAGE = ByteVector.fromByteArray([
30+
0xFF,
31+
0xFF,
32+
0xFF,
33+
0xFF,
34+
0xFF,
35+
0xFF,
36+
0xFF,
37+
0xFF
38+
]);
2939

3040
private _absoluteGranularPosition: number;
3141
private _dataSize: number;
@@ -64,13 +74,20 @@ export class OggPageHeader {
6474
header._version = data.get(4);
6575
header._flags = data.get(5);
6676

67-
const absoluteGranularPosition = data.subarray(6, 8).toUlong(false);
68-
if (absoluteGranularPosition > Number.MAX_SAFE_INTEGER) {
69-
throw new UnsupportedFormatError(
70-
"Granular position is too large to be handled with this version of node-taglib-sharp"
71-
);
77+
const absoluteGranularPositionBytes = data.subarray(6, 8);
78+
if (absoluteGranularPositionBytes.equals(this.NO_PACKETS_END_IN_PAGE)) {
79+
// Handle special condition where no packets end in the current page
80+
header._absoluteGranularPosition = -1;
81+
} else {
82+
const absoluteGranularPosition = absoluteGranularPositionBytes.toUlong(false);
83+
if (absoluteGranularPosition > Number.MAX_SAFE_INTEGER ) {
84+
throw new UnsupportedFormatError(
85+
"Granular position is too large to be handled with this version of node-taglib-sharp"
86+
);
87+
}
88+
header._absoluteGranularPosition = Number(absoluteGranularPosition);
7289
}
73-
header._absoluteGranularPosition = Number(absoluteGranularPosition);
90+
7491
header._streamSerialNumber = data.subarray(14, 4).toUint(false);
7592
header._pageSequenceNumber = data.subarray(18, 4).toUint(false);
7693

@@ -245,11 +262,15 @@ export class OggPageHeader {
245262
}, <Array<ByteVector|number>> []);
246263
const lacingBytes = ByteVector.concatenate(...lacingValues);
247264

265+
const absoluteGranularPositionBytes = this._absoluteGranularPosition === -1
266+
? OggPageHeader.NO_PACKETS_END_IN_PAGE
267+
: ByteVector.fromUlong(this._absoluteGranularPosition, false);
268+
248269
return ByteVector.concatenate(
249270
OggPageHeader.HEADER_IDENTIFIER,
250271
this._version,
251272
this._flags,
252-
ByteVector.fromUlong(this._absoluteGranularPosition, false),
273+
absoluteGranularPositionBytes,
253274
ByteVector.fromUint(this._streamSerialNumber, false),
254275
ByteVector.fromUint(this._pageSequenceNumber, false),
255276
ByteVector.fromSize(4), // Checksum to be filled later

test-unit/ogg/oggPageHeaderTests.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,38 @@ import {Testers} from "../utilities/testers";
143143
assert.strictEqual(header.streamSerialNumber, 0x1234);
144144
}
145145

146+
@test
147+
public fromFile_noPacketsEndInFile() {
148+
// Arrange
149+
const data = ByteVector.concatenate(
150+
ByteVector.fromSize(10), // Buffer
151+
OggPageHeader.HEADER_IDENTIFIER,
152+
0x05, // Version
153+
0x07, // Flags
154+
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // Absolute granular position
155+
ByteVector.fromUint(0x1234, false), // Stream serial number
156+
ByteVector.fromUint(0x2345, false), // Page sequence number
157+
ByteVector.fromSize(4), // Checksum
158+
0x01, // Page segment count
159+
0xFF // Page segment 1 (partial)
160+
);
161+
const file = TestFile.getFile(data);
162+
163+
// Act
164+
const header = OggPageHeader.fromFile(file, 10);
165+
166+
// Assert
167+
assert.ok(header);
168+
assert.strictEqual(header.absoluteGranularPosition, -1);
169+
assert.strictEqual(header.dataSize, 255);
170+
assert.strictEqual(header.flags, 0x07);
171+
assert.isFalse(header.lastPacketComplete);
172+
assert.deepStrictEqual(header.packetSizes, [0xFF]);
173+
assert.strictEqual(header.pageSequenceNumber, 0x2345);
174+
assert.strictEqual(header.size, 28);
175+
assert.strictEqual(header.streamSerialNumber, 0x1234);
176+
}
177+
146178
@test
147179
public fromInfo_invalidParameters() {
148180
// Arrange

0 commit comments

Comments
 (0)