@@ -24,8 +24,18 @@ export enum OggPageFlags {
2424 * This structure provides a representation of an Ogg page header.
2525 */
2626export 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
0 commit comments