1
+ var parseStringUntilNullChar = function ( data ) {
2
+ var index = 0 ;
3
+ var curChar = String . fromCharCode ( data [ index ] ) ;
4
+ var retString = '' ;
5
+ while ( curChar !== '\0' ) {
6
+ retString += curChar ;
7
+ index ++ ;
8
+ curChar = String . fromCharCode ( data [ index ] ) ;
9
+ }
10
+ // Add nullChar
11
+ retString += curChar ;
12
+ return retString ;
13
+ } ;
14
+
15
+ var parseEmsgBox = function ( boxData ) {
16
+ var offset = 0
17
+ var version = boxData [ offset ] ;
18
+ var scheme_id_uri , value , timescale , presentation_time , presentation_time_delta , event_duration , id ;
19
+ // version 0 vs version 1 have different formats.
20
+ if ( version === 0 ) {
21
+ // Parse id and value strings first.
22
+ scheme_id_uri = parseStringUntilNullChar ( boxData ) ;
23
+ offset += scheme_id_uri . length - 1 ;
24
+ value = parseStringUntilNullChar ( boxData . subarray ( offset ) ) ;
25
+
26
+ var dv = new DataView ( boxData ) ;
27
+ timescale = dv . getUint32 ( 12 ) ;
28
+ presentation_time_delta = dv . getUint32 ( 16 ) ;
29
+ event_duration = dv . getUint32 ( 20 ) ;
30
+ id = dv . getUint32 ( 24 ) ;
31
+ offset = 28 ;
32
+ } else if ( version === 1 ) {
33
+ var dv = new DataView ( boxData ) ;
34
+ timescale = dv . getUint32 ( 0 ) ;
35
+ presentation_time = dv . getBigUint64 ( 4 ) ;
36
+ event_duration = dv . getUint32 ( 12 ) ;
37
+ id = dv . getUint32 ( 16 ) ;
38
+
39
+ offset = 20 ;
40
+ scheme_id_uri = parseStringUntilNullChar ( boxData . subarray ( offset ) ) ;
41
+ offset += scheme_id_uri . length - 1 ;
42
+ value = parseStringUntilNullChar ( boxData . subarray ( offset ) ) ;
43
+ offset += value . length - 1 ;
44
+
45
+ }
46
+ var message_data = boxData . subarray ( offset , boxData . byteLength ) ;
47
+ return { scheme_id_uri, value,
48
+ timescale, presentation_time,
49
+ presentation_time_delta,
50
+ event_duration, id,
51
+ message_data } ;
52
+ } ;
53
+
54
+ var scaleTime = function ( presentationTime , timescale , timeDelta , offset ) {
55
+ return presentationTime ? presentationTime / timescale : offset + timeDelta / timescale ;
56
+ } ;
57
+
58
+ // TODO: This may need to return more ID3 specific data rather than just data, pts, duration.
59
+ var getEmsgData = function ( data , ptOffset ) {
60
+ var emsgBoxes = findBox ( data , [ 'emsg' ] ) ;
61
+ var parsedBoxes = [ ] ;
62
+ emsgBoxes . forEach ( function ( boxData ) {
63
+ // TODO: We may need to check for ID3 specific schemeIdURI before returning data.
64
+ var parsedBox = parseEmsgBox ( boxData ) ;
65
+ var pts = scaleTime ( parsedBox . presentation_time , parsedBox . timescale , parsedBox . presentation_time_delta , ptOffset ) ;
66
+ var duration = scaleTime ( parsedBox . duration , parsedBox . timescale ) ;
67
+ parsedBoxes . push ( {
68
+ data : parsedBox . message_data ,
69
+ pts,
70
+ duration,
71
+ } ) ;
72
+ } ) ;
73
+ return parsedBoxes ;
74
+ } ;
75
+
76
+ module . exports = getEmsgData ;
0 commit comments