xgplayer-mp4 1.2.4 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/browser/index.js +1 -1
  2. package/browser/index.js.map +1 -1
  3. package/dist/index.js +1 -1
  4. package/dist/index.js.map +1 -1
  5. package/package.json +5 -4
  6. package/src/constants.js +14 -0
  7. package/src/fmp4/buffer.js +6 -0
  8. package/src/fmp4/mp4.js +181 -84
  9. package/src/gap_jump.js +151 -0
  10. package/src/index.js +550 -315
  11. package/src/media/mse.js +77 -22
  12. package/src/media/task.js +68 -17
  13. package/src/mp4.js +284 -268
  14. package/src/parse/box/MP4DecConfigDescrTag.js +3 -0
  15. package/src/parse/box/MP4DecSpecificDescrTag.js +4 -0
  16. package/src/parse/box/avcC.js +4 -1
  17. package/src/parse/box/elst.js +0 -13
  18. package/src/parse/box/esds.js +9 -4
  19. package/src/parse/box/frma.js +10 -0
  20. package/src/parse/box/golomb.js +88 -0
  21. package/src/parse/box/hvc1.js +30 -0
  22. package/src/parse/box/hvcC.js +55 -0
  23. package/src/parse/box/pasp.js +2 -3
  24. package/src/parse/box/schm.js +18 -0
  25. package/src/parse/box/sps.js +286 -0
  26. package/src/parse/box/stsz.js +6 -1
  27. package/src/parse/box/tfhd.js +43 -0
  28. package/src/parse/box.js +5 -1
  29. package/src/parse/stream.js +4 -0
  30. package/src/util/getHeaders.js +18 -0
  31. package/src/util/index.js +138 -20
  32. package/src/util/intervalTimer.js +36 -0
  33. package/src/util/isSupport.js +20 -0
  34. package/src/util/proxyPromise.js +27 -0
  35. package/src/util/timer.js +46 -0
  36. package/src/util/xhr.js +46 -0
  37. package/version.json +1 -1
  38. package/webpack.config.js +45 -39
  39. package/src/util/download.js +0 -13
  40. package/src/write/box/MP4DecConfigDescrTag.js +0 -21
  41. package/src/write/box/MP4DecSpecificDescrTag.js +0 -19
  42. package/src/write/box/MP4ESDescrTag.js +0 -19
  43. package/src/write/box/SLConfigDescriptor.js +0 -16
  44. package/src/write/box/avc1.js +0 -33
  45. package/src/write/box/avcC.js +0 -32
  46. package/src/write/box/btrt.js +0 -14
  47. package/src/write/box/co64.js +0 -17
  48. package/src/write/box/ctts.js +0 -19
  49. package/src/write/box/dref.js +0 -25
  50. package/src/write/box/elst.js +0 -27
  51. package/src/write/box/esds.js +0 -11
  52. package/src/write/box/ftyp.js +0 -17
  53. package/src/write/box/hdlr.js +0 -15
  54. package/src/write/box/iods.js +0 -14
  55. package/src/write/box/mdat.js +0 -5
  56. package/src/write/box/mdhd.js +0 -27
  57. package/src/write/box/mehd.js +0 -12
  58. package/src/write/box/mfhd.js +0 -12
  59. package/src/write/box/mfro.js +0 -14
  60. package/src/write/box/mp4a.js +0 -26
  61. package/src/write/box/mvhd.js +0 -34
  62. package/src/write/box/pasp.js +0 -10
  63. package/src/write/box/smhd.js +0 -17
  64. package/src/write/box/stco.js +0 -17
  65. package/src/write/box/stsc.js +0 -19
  66. package/src/write/box/stsd.js +0 -23
  67. package/src/write/box/stss.js +0 -17
  68. package/src/write/box/stsz.js +0 -18
  69. package/src/write/box/stts.js +0 -18
  70. package/src/write/box/tfdt.js +0 -16
  71. package/src/write/box/tfhd.js +0 -18
  72. package/src/write/box/tfra.js +0 -29
  73. package/src/write/box/tkhd.js +0 -44
  74. package/src/write/box/trex.js +0 -16
  75. package/src/write/box/trun.js +0 -40
  76. package/src/write/box/udta.js +0 -5
  77. package/src/write/box/url.js +0 -16
  78. package/src/write/box/vmhd.js +0 -19
  79. package/src/write/box/wide.js +0 -12
  80. package/src/write/box.js +0 -37
  81. package/src/write/buffer.js +0 -12
  82. package/src/write/index.js +0 -33
  83. package/src/write/stream.js +0 -99
  84. package/webpack.config.test.js +0 -8
@@ -0,0 +1,18 @@
1
+ export default function getResponseHeaders(xhr) {
2
+ const headerMap = {};
3
+ if (xhr instanceof window.XMLHttpRequest) {
4
+ try {
5
+ const headers = xhr.getAllResponseHeaders();
6
+
7
+ const arr = headers.trim().split(/[\r\n]+/);
8
+ arr.forEach(function (line) {
9
+ const parts = line.split(': ');
10
+ const header = parts.shift();
11
+ const value = parts.join(': ');
12
+ headerMap[header] = value;
13
+ });
14
+ } catch (error) {
15
+ }
16
+ }
17
+ return headerMap;
18
+ }
package/src/util/index.js CHANGED
@@ -64,11 +64,12 @@ util.sum = function (...rst) {
64
64
  * @param {Number} sample_order [帧次序]
65
65
  * @return {Object} [块的位置和当前帧的偏移数]
66
66
  */
67
- util.stscOffset = function (stsc, sample_order) {
67
+ util.stscOffset = function (stsc, sample_order, stscObj) {
68
68
  let chunk_index; let samples_offset = ''
69
- let chunk_start = stsc.entries.filter((item) => {
70
- return item.first_sample <= sample_order && sample_order < item.first_sample + item.chunk_count * item.samples_per_chunk
71
- })[0]
69
+ // let chunk_start = stsc.entries.filter((item) => {
70
+ // return item.first_sample <= sample_order && sample_order < item.first_sample + item.chunk_count * item.samples_per_chunk
71
+ // })[0]
72
+ let chunk_start = stscObj[sample_order];
72
73
  if (!chunk_start) {
73
74
  let last_chunk = stsc.entries.pop()
74
75
  stsc.entries.push(last_chunk)
@@ -91,9 +92,11 @@ util.stscOffset = function (stsc, sample_order) {
91
92
  }
92
93
  }
93
94
 
94
- util.seekSampleOffset = function (stsc, stco, stsz, order, mdatStart) {
95
- let chunkOffset = util.stscOffset(stsc, order + 1)
96
- let result = stco.entries[chunkOffset.chunk_index - 1] + util.sum.apply(null, stsz.entries.slice(chunkOffset.samples_offset[0] - 1, chunkOffset.samples_offset[1] - 1)) - mdatStart
95
+ util.seekSampleOffset = function (stsc, stco, stsz, order, mdatStart, stscObj) {
96
+ let chunkOffset = util.stscOffset(stsc, order + 1, stscObj)
97
+ let sum = util.sum.apply(null, stsz.entries.slice(chunkOffset.samples_offset[0] - 1, chunkOffset.samples_offset[1] - 1))
98
+ let ss = stco.entries[chunkOffset.chunk_index - 1]
99
+ let result = ss + sum - mdatStart
97
100
  if (result === undefined) {
98
101
  throw `result=${result},stco.length=${stco.entries.length},sum=${util.sum.apply(null, stsz.entries.slice(0, order))}`
99
102
  } else if (result < 0) {
@@ -102,7 +105,7 @@ util.seekSampleOffset = function (stsc, stco, stsz, order, mdatStart) {
102
105
  return result
103
106
  }
104
107
 
105
- util.seekSampleTime = function (stts, ctts, order, time_offset=0) {
108
+ util.seekSampleTime = function (stts, cttsObj, order) {
106
109
  let time; let duration; let count = 0; let startTime = 0; let offset = 0
107
110
  stts.entry.every(item => {
108
111
  duration = item.sampleDuration
@@ -115,22 +118,14 @@ util.seekSampleTime = function (stts, ctts, order, time_offset=0) {
115
118
  return true
116
119
  }
117
120
  })
118
- if (ctts) {
119
- let ct = 0
120
- ctts.entry.every(item => {
121
- ct += item.count
122
- if (order < ct) {
123
- offset = item.offset
124
- return false
125
- } else {
126
- return true
127
- }
128
- })
121
+ if (cttsObj) {
122
+ if(cttsObj[order]){
123
+ offset = cttsObj[order]
124
+ }
129
125
  }
130
126
  if (!time) {
131
127
  time = startTime + (order - count) * duration
132
128
  }
133
- time -= time_offset
134
129
  return {time, duration, offset}
135
130
  }
136
131
 
@@ -159,4 +154,127 @@ util.seekTrakDuration = function (trak, timeScale) {
159
154
  return Number(duration / timeScale).toFixed(4)
160
155
  }
161
156
 
157
+ util.StringToArrayBuffer = function (str) {
158
+ let arr = new ArrayBuffer(str.length)
159
+ let view = new Uint8Array(arr)
160
+ for (let i = 0; i < str.length; i++) {
161
+ view[i] = str.charCodeAt(i)
162
+ }
163
+ return arr
164
+ }
165
+ /**
166
+ * Convert a hex string to a Uint8Array.
167
+ * @param {string} str
168
+ * @return {!Uint8Array}
169
+ * @export
170
+ */
171
+ util.fromHex = function (str) {
172
+ let arr = new Uint8Array(str.length / 2)
173
+ for (let i = 0; i < str.length; i += 2) {
174
+ arr[i / 2] = window.parseInt(str.substr(i, 2), 16)
175
+ }
176
+ return arr
177
+ }
178
+ util.fromCharCode = function (array) {
179
+ let max = 16000
180
+ let ret = ''
181
+ for (let i = 0; i < array.length; i += max) {
182
+ let subArray = array.subarray(i, i + max)
183
+ ret += String.fromCharCode.apply(null, subArray)
184
+ }
185
+
186
+ return ret
187
+ }
188
+ util.ArrayBufferToString = function (arr) {
189
+ let str = ''
190
+ let view = new Uint8Array(arr)
191
+ for (let i = 0; i < view.length; i++) {
192
+ str += String.fromCharCode(view[i])
193
+ }
194
+ return str
195
+ }
196
+ util.Base64ToHex = function (str) {
197
+ let bin = window.atob(str.replace(/-/g, '+').replace(/_/g, '/'))
198
+ let res = ''
199
+ for (let i = 0; i < bin.length; i++) {
200
+ res += ('0' + bin.charCodeAt(i).toString(16)).substr(-2)
201
+ }
202
+ return res
203
+ }
204
+
205
+ /**
206
+ * Convert a Uint8Array to a base64 string. The output will always use the
207
+ * alternate encoding/alphabet also known as "base64url".
208
+ * @param {!Uint8Array} arr
209
+ * @param {boolean=} padding If true, pad the output with equals signs.
210
+ * Defaults to true.
211
+ * @return {string}
212
+ * @export
213
+ */
214
+ util.toBase64 = function (arr, padding) {
215
+ // btoa expects a "raw string" where each character is interpreted as a byte.
216
+ let bytes = util.fromCharCode(arr)
217
+ padding = (padding === undefined) ? true : padding
218
+ let base64 = window.btoa(bytes).replace(/\+/g, '-').replace(/\//g, '_')
219
+ return padding ? base64 : base64.replace(/=*$/, '')
220
+ }
221
+
222
+ util.toUTF8 = function (str) {
223
+ // http://stackoverflow.com/a/13691499
224
+ // Converts the given string to a URI encoded string. If a character falls
225
+ // in the ASCII range, it is not converted; otherwise it will be converted to
226
+ // a series of URI escape sequences according to UTF-8.
227
+ // Example: 'g#€' -> 'g#%E3%82%AC'
228
+ let encoded = encodeURIComponent(str)
229
+ // Convert each escape sequence individually into a character. Each escape
230
+ // sequence is interpreted as a code-point, so if an escape sequence happens
231
+ // to be part of a multi-byte sequence, each byte will be converted to a
232
+ // single character.
233
+ // Example: 'g#%E3%82%AC' -> '\x67\x35\xe3\x82\xac'
234
+ let utf8 = unescape(encoded)
235
+
236
+ let result = new Uint8Array(utf8.length)
237
+ for (let i = 0; i < utf8.length; ++i) {
238
+ result[i] = utf8.charCodeAt(i)
239
+ }
240
+ return result.buffer
241
+ }
242
+
243
+ util.bufferToString = function (value) {
244
+ return ("0"+(Number(value).toString(16))).slice(-2).toUpperCase()
245
+ }
246
+ util.strToBuf = function (str) {
247
+ let buffer = []
248
+ for(let i = 0; i < str.length; i = i + 2) {
249
+ buffer.push(
250
+ parseInt(str[i] + str[i + 1], 16)
251
+ )
252
+ }
253
+ return new Uint8Array(buffer)
254
+ }
255
+ util.str2hex = function (str) {
256
+ if(str === "") {
257
+ return ""
258
+ }
259
+ let arr = [];
260
+ for(let i = 0; i < str.length; i++) {
261
+ arr.push(str.charCodeAt(i))
262
+ }
263
+ return arr
264
+ }
265
+ util.parse = function (a) {
266
+ if (!Array.isArray(a)) {
267
+ let arr = [];
268
+ let value = '';
269
+ for(let i = 0; i < a.length; i++) {
270
+ if (i % 2) {
271
+ value = a[i - 1] + a[ i ]
272
+ arr.push(parseInt(value, 16))
273
+ value = ''
274
+ }
275
+ }
276
+ return arr
277
+ }
278
+ return a.map(item => {return parseInt(item, 16)})
279
+ }
162
280
  export default util
@@ -0,0 +1,36 @@
1
+ // 替代setInterval
2
+ class IntervalTimer {
3
+ constructor() {
4
+ this.timeID = null;
5
+ this.func = null;
6
+ }
7
+
8
+ repeat(func, ms) {
9
+ this.timeID = 1;
10
+ this.repeatInterval(func, ms);
11
+ }
12
+
13
+ repeatInterval(func, ms) {
14
+ if (!this.timeID) return;
15
+ if (this.func === null) {
16
+ this.func = func;
17
+ }
18
+
19
+ if (this.func !== func) {
20
+ return;
21
+ }
22
+ if (this.timeID) clearTimeout(this.timeID);
23
+ this.timeID = null;
24
+ this.timeID = setTimeout(() => {
25
+ func();
26
+ this.repeatInterval(func, ms);
27
+ }, ms);
28
+ }
29
+
30
+ clear() {
31
+ clearTimeout(this.timeID);
32
+ this.timeID = null;
33
+ }
34
+ }
35
+
36
+ export default IntervalTimer;
@@ -0,0 +1,20 @@
1
+ exports.isMSBrowser = function () {
2
+ let ua = window.navigator.userAgent
3
+ let msie = ua.indexOf('MSIE ')
4
+ let trident = ua.indexOf('Trident/')
5
+ return msie > 0 || trident > 0
6
+ }
7
+
8
+ exports.isMediaSourceSupported = function () {
9
+ const mediaSource = (window.MediaSource = window.MediaSource || window.WebKitMediaSource)
10
+ return mediaSource && typeof mediaSource.isTypeSupported === 'function'
11
+ }
12
+
13
+ exports.isSupported = function () {
14
+ return exports.isMediaSourceSupported()
15
+ && !exports.isMSBrowser()
16
+ }
17
+
18
+ exports.isSupportedWithXgmse = function () {
19
+ return !exports.isMSBrowser()
20
+ }
@@ -0,0 +1,27 @@
1
+
2
+ export default class ProxyPromise {
3
+
4
+ constructor() {
5
+ let resolvePromise;
6
+ let rejectPromise;
7
+
8
+ const promise = new Promise(((resolve, reject) => {
9
+ resolvePromise = resolve;
10
+ rejectPromise = reject;
11
+ }));
12
+
13
+ const publicPromise = promise
14
+ publicPromise.resolve = resolvePromise;
15
+ publicPromise.reject = rejectPromise;
16
+
17
+ return publicPromise;
18
+ }
19
+
20
+
21
+ /** @param {T=} value */
22
+ resolve(value) {}
23
+
24
+
25
+ /** @param {*=} reason */
26
+ reject(reason) {}
27
+ };
@@ -0,0 +1,46 @@
1
+ export default class Timer{
2
+
3
+ constructor(onTick) {
4
+ this.onTick_ = onTick;
5
+ this.cancelPending_ = null;
6
+ }
7
+
8
+ tickAfter(delayInSeconds, callback = null) {
9
+
10
+ this.stop();
11
+ let alive = true;
12
+ let timeoutId = null;
13
+
14
+ this.cancelPending_ = () => {
15
+ window.clearTimeout(timeoutId);
16
+ alive = false;
17
+ };
18
+
19
+ const onTick = () => {
20
+ if (alive) {
21
+ this.onTick_();
22
+ if(callback){
23
+ callback();
24
+ }
25
+ }
26
+ };
27
+
28
+ timeoutId = window.setTimeout(onTick, delayInSeconds * 1000);
29
+
30
+ return this;
31
+ }
32
+
33
+ tickEvery(seconds){
34
+ this.tickAfter(seconds, ()=>{
35
+ this.tickEvery(seconds);
36
+ })
37
+ }
38
+
39
+
40
+ stop() {
41
+ if (this.cancelPending_) {
42
+ this.cancelPending_();
43
+ this.cancelPending_ = null;
44
+ }
45
+ }
46
+ }
@@ -0,0 +1,46 @@
1
+ class XHR {
2
+ constructor ({url, method = 'GET', type = 'arraybuffer', data = {}} = {}) {
3
+ return new Promise((resolve, reject) => {
4
+ let R = new window.XMLHttpRequest()
5
+ let _method = method.toUpperCase()
6
+ let _data = []
7
+ if (type) {
8
+ R.responseType = type
9
+ }
10
+ for (let k in data) {
11
+ _data.push(`k=${data[k]}`)
12
+ }
13
+ if (_method === 'GET') {
14
+ R.open(_method, `${url}?${_data.join('&')}`)
15
+ R.send()
16
+ } else if (_method === 'POST') {
17
+
18
+ // if (url.indexOf('data:application/json;base64') === 0) {
19
+ R.open(_method, url, true)
20
+ // R.timeout = 0
21
+ // R.withCredentials = false
22
+ R.setRequestHeader('Content-Type', 'application/json');
23
+ R.send(JSON.stringify(data))
24
+ // } else {
25
+ // R.open(_method, url)
26
+ // R.setRequestHeader('Content-type', 'application/x-www-form-urlencoded')
27
+ // R.send(_data.join('&'))
28
+ // }
29
+ } else {
30
+ throw new Error(`xhr ${_method} is not supported`)
31
+ }
32
+ R.onload = () => {
33
+ if (R.status === 200 || R.status === 206) {
34
+ resolve(R)
35
+ } else {
36
+ reject(R)
37
+ }
38
+ }
39
+ R.onerror = () => {
40
+ reject(R)
41
+ }
42
+ })
43
+ }
44
+ }
45
+
46
+ export default XHR
package/version.json CHANGED
@@ -1,3 +1,3 @@
1
1
  {
2
- "version": "1.2.4"
2
+ "version": "2.0.2"
3
3
  }
package/webpack.config.js CHANGED
@@ -1,4 +1,6 @@
1
+ const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
1
2
  const polyfill = []
3
+ const argv = require('yargs').argv;
2
4
 
3
5
  const umd = {
4
6
  entry: polyfill.concat(['./src/index.js']),
@@ -7,32 +9,24 @@ const umd = {
7
9
  path: `${__dirname}/dist`,
8
10
  filename: 'index.js',
9
11
  library: 'xgplayer-mp4',
12
+ globalObject: 'this',
10
13
  libraryTarget: 'umd'
11
14
  },
12
15
  mode: 'production',
13
16
  module: {
14
- rules: [{
15
- test: /\.js$/,
16
- loader: 'babel-loader'
17
- }, {
18
- test: /\.scss$/,
19
- use: [
20
- 'style-loader',
21
- {
22
- loader: 'css-loader',
23
- options: {
24
- importLoaders: 1,
25
- minimize: true
26
- }
27
- },
28
- 'postcss-loader',
29
- 'sass-loader'
30
- ]
31
- }]
17
+ rules: [
18
+ {
19
+ test: /\.js$/,
20
+ loader: 'babel-loader'
21
+ }
22
+ ]
32
23
  },
33
24
  externals: {
34
25
  'xgplayer': 'xgplayer'
35
26
  },
27
+ node: {
28
+ fs: 'empty',
29
+ },
36
30
  optimization: {
37
31
  minimize: true
38
32
  }
@@ -43,34 +37,46 @@ const client = {
43
37
  devtool: 'source-map',
44
38
  output: {
45
39
  path: `${__dirname}/browser`,
46
- filename: 'index.js'
40
+ filename: 'index.js',
41
+ library: 'Mp4Player',
42
+ libraryTarget: 'window'
47
43
  },
44
+ // devtool: argv.watch ? 'source-map' : 'none',
48
45
  module: {
49
- rules: [{
50
- test: /\.js$/,
51
- loader: 'babel-loader'
52
- }, {
53
- test: /\.scss$/,
54
- use: [
55
- 'style-loader',
56
- {
57
- loader: 'css-loader',
58
- options: {
59
- importLoaders: 1,
60
- minimize: true
61
- }
62
- },
63
- 'postcss-loader',
64
- 'sass-loader'
65
- ]
66
- }]
46
+ rules: [
47
+ {
48
+ test: /\.js$/,
49
+ loader: 'babel-loader'
50
+ }
51
+ ]
67
52
  },
53
+ mode: 'production',
68
54
  externals: {
69
55
  'xgplayer': 'Player'
70
56
  },
71
- mode: 'production',
57
+ node: {
58
+ fs: 'empty',
59
+ },
72
60
  optimization: {
73
- minimize: true
61
+ minimize: true,
62
+ minimizer: [
63
+ new UglifyJsPlugin({
64
+ test: [/\.(js|jsx)$/],
65
+ exclude: [/node_modules/],
66
+ parallel: true,
67
+ sourceMap: true,
68
+ uglifyOptions: {
69
+ warnings: false,
70
+ compress: {
71
+ inline: 1,
72
+ keep_fnames: true
73
+ },
74
+ mangle: {
75
+ keep_fnames: true
76
+ }
77
+ }
78
+ })
79
+ ],
74
80
  }
75
81
  }
76
82
 
@@ -1,13 +0,0 @@
1
- class Download {
2
- constructor (filename, content) {
3
- let aLink = document.createElement('a')
4
- let blob = new Blob([content])
5
- let evt = document.createEvent('MouseEvents')
6
- evt.initEvent('click', false, false)
7
- aLink.download = filename
8
- aLink.href = URL.createObjectURL(blob)
9
- aLink.dispatchEvent(evt)
10
- }
11
- }
12
-
13
- export default Download
@@ -1,21 +0,0 @@
1
- import Box from '../box'
2
- import Stream from '../stream'
3
- Box.MP4DecConfigDescrTag = function (data, output) {
4
- let stream = new Stream(new Uint8Array(data.size).buffer)
5
- stream.writeUint8(data.type)
6
- if (data.extend) {
7
- for (let i = 0; i < 3; i++) {
8
- stream.writeUint8(0x80)
9
- }
10
- stream.writeUint8(data.size - 5)
11
- } else {
12
- stream.writeUint8(data.size - 2)
13
- }
14
- stream.writeUint8(data.typeID)
15
- stream.writeUint8(data.streamUint)
16
- stream.writeUint24(data.bufferSize)
17
- stream.writeUint32(data.maximum)
18
- stream.writeUint32(data.average)
19
- output.write(new Uint8Array(stream.buffer.slice(0, stream.position)))
20
- Box.MP4DecSpecificDescrTag(data.subBox[0], output)
21
- }
@@ -1,19 +0,0 @@
1
- import Box from '../box'
2
- import Stream from '../stream'
3
-
4
- Box.MP4DecSpecificDescrTag = function (data, output) {
5
- let stream = new Stream(new Uint8Array(data.size).buffer)
6
- stream.writeUint8(data.type)
7
- if (data.extend) {
8
- for (let i = 0; i < 3; i++) {
9
- stream.writeUint8(0x80)
10
- }
11
- stream.writeUint8(data.size - 5)
12
- } else {
13
- stream.writeUint8(data.size - 2)
14
- }
15
- data.EScode.forEach(item => {
16
- stream.writeUint8(Number(`0x${item}`))
17
- })
18
- output.write(new Uint8Array(stream.buffer.slice(0, stream.position)))
19
- }
@@ -1,19 +0,0 @@
1
- import Box from '../box'
2
- import Stream from '../stream'
3
- Box.MP4ESDescrTag = function (data, output) {
4
- let stream = new Stream(new Uint8Array(data.size).buffer)
5
- stream.writeUint8(data.type)
6
- if (data.extend) {
7
- for (let i = 0; i < 3; i++) {
8
- stream.writeUint8(0x80)
9
- }
10
- stream.writeUint8(data.size - 5)
11
- } else {
12
- stream.writeUint8(data.size - 2)
13
- }
14
- stream.writeUint16(data.esID)
15
- stream.writeUint8(data.priority)
16
- output.write(new Uint8Array(stream.buffer.slice(0, stream.position)))
17
- Box.MP4DecConfigDescrTag(data.subBox[0], output)
18
- Box.SLConfigDescriptor(data.subBox[1], output)
19
- }
@@ -1,16 +0,0 @@
1
- import Box from '../box'
2
- import Stream from '../stream'
3
- Box.SLConfigDescriptor = function (data, output) {
4
- let stream = new Stream(new Uint8Array(data.size).buffer)
5
- stream.writeUint8(data.type)
6
- if (data.extend) {
7
- for (let i = 0; i < 3; i++) {
8
- stream.writeUint8(0x80)
9
- }
10
- stream.writeUint8(data.size - 5)
11
- } else {
12
- stream.writeUint8(data.size - 2)
13
- }
14
- stream.writeUint8(data.SL)
15
- output.write(new Uint8Array(stream.buffer.slice(0, stream.position)))
16
- }
@@ -1,33 +0,0 @@
1
- import Box from '../box'
2
- Box.avc1 = function (data, output) {
3
- let stream = this.stream
4
- stream.fill(6)
5
- stream.writeUint16(data.dataReferenceIndex)
6
- stream.fill(16)
7
- stream.writeUint16(data.width)
8
- stream.writeUint16(data.height)
9
- stream.writeUint32(data.horizresolution)
10
- stream.writeUint32(data.vertresolution)
11
- stream.fill(4)
12
- stream.writeUint16(data.frameCount)
13
- stream.fill(32)
14
- stream.writeUint16(data.depth)
15
- stream.fill(2)
16
- output.write(new Uint8Array(stream.buffer.slice(0, stream.position)))
17
- let self = this
18
- data.subBox.forEach(item => {
19
- let box = new Box(item, self.output)
20
- self.subBox.push(box)
21
- box.writeBody()
22
- })
23
- let writeSize = stream.position
24
- self.subBox.forEach(item => {
25
- writeSize += item.stream.position + 8
26
- })
27
- if (writeSize !== data.size - 8) {
28
- throw new Error(`${data.type} box incomplete`)
29
- } else {
30
- self.outputSize = writeSize
31
- }
32
- delete this.data
33
- }
@@ -1,32 +0,0 @@
1
- import Box from '../box'
2
- Box.avcC = function (data, output) {
3
- let stream = this.stream
4
- stream.writeUint8(data.configVersion)
5
- stream.writeUint8(data.profile)
6
- stream.writeUint8(data.profileCompatibility)
7
- stream.writeUint8(data.AVCLevelIndication)
8
- stream.writeUint8(data.lengthSizeMinusOne - 1)
9
- stream.writeUint8(data.numOfSequenceParameterSets)
10
- stream.writeUint16(data.sequenceLength)
11
- data.sequence.forEach(item => {
12
- stream.writeUint8(Number('0x' + item))
13
- })
14
- stream.writeUint8(data.ppsCount)
15
- stream.writeUint16(data.ppsLength)
16
- data.pps.forEach(item => {
17
- stream.writeUint8(Number('0x' + item))
18
- })
19
- if (data.last.length) {
20
- data.last.forEach(item => {
21
- stream.writeUint8(item)
22
- })
23
- }
24
-
25
- output.write(new Uint8Array(stream.buffer.slice(0, stream.position)))
26
- if (stream.position !== data.size - 8) {
27
- throw new Error(`${data.type} box incomplete`)
28
- } else {
29
- this.outputSize = stream.position
30
- }
31
- delete this.data
32
- }
@@ -1,14 +0,0 @@
1
- import Box from '../box';
2
- Box.btrt = function (data, output) {
3
- let stream = this.stream;
4
- stream.writeUint32(this.bufferSizeDB);
5
- stream.writeUint32(this.maxBitrate);
6
- stream.writeUint32(this.avgBitrate);
7
- output.write(new Uint8Array(stream.buffer.slice(0, stream.position)));
8
- if (stream.position !== data.size - 8) {
9
- throw `${data.type} box incomplete`;
10
- } else {
11
- this.outputSize = stream.position;
12
- }
13
- delete this.data;
14
- };