bare-ffmpeg 1.0.0-16 → 1.0.0-18

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.
package/README.md CHANGED
@@ -339,6 +339,12 @@ Gets the sample rate for audio codecs.
339
339
 
340
340
  **Returns**: `number`
341
341
 
342
+ ##### `CodecParameters.extraData`
343
+
344
+ Out-of-band global headers that may be used by some codecs.
345
+
346
+ **Returns**: `Buffer`
347
+
342
348
  #### Methods
343
349
 
344
350
  ##### `CodecParameters.fromContext(context)`
@@ -636,6 +642,36 @@ Gets the denominator.
636
642
 
637
643
  **Returns**: `number`
638
644
 
645
+ ##### `Rational.valid`
646
+
647
+ Returns if true if rational describes a non-zero & non-negative quantity.
648
+
649
+ **Returns**: `number`
650
+
651
+ ##### `Rational.uninitialized`
652
+
653
+ Returns if true when is not set.
654
+
655
+ **Returns**: `number`
656
+
657
+ ##### `Rational.toNumber()`
658
+
659
+ see `av_q2d()`
660
+
661
+ **Returns**: `number`
662
+
663
+ ##### `static Rational.from(number)`
664
+
665
+ see `av_d2q()`
666
+
667
+ **Returns**: `Rational`
668
+
669
+ ##### `Rational.rescaleQ(number, timebaseA, timebaseB)`
670
+
671
+ see `av_rescale_q()`
672
+
673
+ **Returns**: `number`
674
+
639
675
  ### `Stream`
640
676
 
641
677
  The `Stream` API provides functionality to access media stream information and create decoders/encoders.
package/binding.cc CHANGED
@@ -1338,6 +1338,62 @@ bare_ffmpeg_codec_parameters_get_framerate(
1338
1338
  return result;
1339
1339
  }
1340
1340
 
1341
+ static js_arraybuffer_t
1342
+ bare_ffmpeg_codec_parameters_get_extra_data(
1343
+ js_env_t *env,
1344
+ js_receiver_t,
1345
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_parameters_t, 1> parameters
1346
+ ) {
1347
+ int err;
1348
+
1349
+ js_arraybuffer_t buffer;
1350
+
1351
+ assert(parameters->handle->extradata_size >= 0);
1352
+
1353
+ err = js_create_arraybuffer(
1354
+ env,
1355
+ parameters->handle->extradata,
1356
+ static_cast<size_t>(parameters->handle->extradata_size),
1357
+ buffer
1358
+ );
1359
+ assert(err == 0);
1360
+
1361
+ return buffer;
1362
+ }
1363
+
1364
+ void
1365
+ bare_ffmpeg_codec_parameters_set_extra_data(
1366
+ js_env_t *env,
1367
+ js_receiver_t,
1368
+ js_arraybuffer_span_of_t<bare_ffmpeg_codec_parameters_t, 1> parameters,
1369
+ js_arraybuffer_t buffer,
1370
+ uint32_t offset,
1371
+ uint32_t len
1372
+ ) {
1373
+ int err;
1374
+
1375
+ std::span<uint8_t> view;
1376
+
1377
+ err = js_get_arraybuffer_info(env, buffer, view);
1378
+ assert(err == 0);
1379
+
1380
+ if (parameters->handle->extradata_size) {
1381
+ assert(parameters->handle->extradata_size > 0);
1382
+ assert(parameters->handle->extradata);
1383
+
1384
+ av_free(parameters->handle->extradata);
1385
+ }
1386
+
1387
+ size_t min_size = len + AV_INPUT_BUFFER_PADDING_SIZE;
1388
+
1389
+ parameters->handle->extradata = reinterpret_cast<uint8_t *>(av_malloc(min_size));
1390
+ memset(&parameters->handle->extradata[len], 0, AV_INPUT_BUFFER_PADDING_SIZE);
1391
+
1392
+ memcpy(parameters->handle->extradata, &view[offset], len);
1393
+
1394
+ parameters->handle->extradata_size = static_cast<int>(len);
1395
+ }
1396
+
1341
1397
  static js_arraybuffer_t
1342
1398
  bare_ffmpeg_frame_init(js_env_t *env, js_receiver_t) {
1343
1399
  int err;
@@ -1354,6 +1410,15 @@ bare_ffmpeg_frame_init(js_env_t *env, js_receiver_t) {
1354
1410
  return handle;
1355
1411
  }
1356
1412
 
1413
+ static void
1414
+ bare_ffmpeg_frame_unref(
1415
+ js_env_t *env,
1416
+ js_receiver_t,
1417
+ js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame
1418
+ ) {
1419
+ av_frame_unref(frame->handle);
1420
+ }
1421
+
1357
1422
  static void
1358
1423
  bare_ffmpeg_frame_destroy(
1359
1424
  js_env_t *env,
@@ -2564,9 +2629,12 @@ bare_ffmpeg_exports(js_env_t *env, js_value_t *exports) {
2564
2629
  V("getCodecParametersWidth", bare_ffmpeg_codec_parameters_get_width)
2565
2630
  V("getCodecParametersHeight", bare_ffmpeg_codec_parameters_get_height)
2566
2631
  V("getCodecParametersFramerate", bare_ffmpeg_codec_parameters_get_framerate)
2632
+ V("getCodecParametersExtraData", bare_ffmpeg_codec_parameters_get_extra_data)
2633
+ V("setCodecParametersExtraData", bare_ffmpeg_codec_parameters_set_extra_data)
2567
2634
 
2568
2635
  V("initFrame", bare_ffmpeg_frame_init)
2569
2636
  V("destroyFrame", bare_ffmpeg_frame_destroy)
2637
+ V("unrefFrame", bare_ffmpeg_frame_unref)
2570
2638
  V("getFrameWidth", bare_ffmpeg_frame_get_width)
2571
2639
  V("setFrameWidth", bare_ffmpeg_frame_set_width)
2572
2640
  V("getFrameHeight", bare_ffmpeg_frame_get_height)
@@ -10,6 +10,7 @@ declare class FFmpegCodecParameters {
10
10
  readonly nbChannels: number
11
11
  readonly codecType: number
12
12
  readonly channelLayout: FFmpegChannelLayout
13
+ extraData: Buffer
13
14
 
14
15
  constructor(handle: ArrayBuffer)
15
16
 
@@ -60,6 +60,19 @@ module.exports = class FFmpegCodecParameters {
60
60
  return binding.getCodecParametersHeight(this._handle)
61
61
  }
62
62
 
63
+ get extraData() {
64
+ return Buffer.from(binding.getCodecParametersExtraData(this._handle))
65
+ }
66
+
67
+ set extraData(value) {
68
+ binding.setCodecParametersExtraData(
69
+ this._handle,
70
+ value.buffer,
71
+ value.byteOffset,
72
+ value.byteLength
73
+ )
74
+ }
75
+
63
76
  fromContext(context) {
64
77
  binding.codecParametersFromContext(this._handle, context._handle)
65
78
  }
@@ -82,7 +95,8 @@ module.exports = class FFmpegCodecParameters {
82
95
  sampleRate: this.sampleRate,
83
96
  nbChannels: this.nbChannels,
84
97
  channelLayout: this.channelLayout,
85
- frameRate: this.frameRate
98
+ frameRate: this.frameRate,
99
+ extraData: this.extraData
86
100
  }
87
101
  }
88
102
  }
package/lib/frame.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import FFmpegChannelLayout from './channel-layout'
2
+ import FFmpegRational from './rational'
2
3
 
3
4
  declare class FFmpegFrame {
4
5
  readonly pictType: number
@@ -11,10 +12,14 @@ declare class FFmpegFrame {
11
12
  pixelFormat: number
12
13
  format: number
13
14
  nbSamples: number
15
+ pts: number
16
+ packetDTS: number
17
+ timeBase: FFmpegRational
14
18
 
15
19
  constructor()
16
20
 
17
21
  alloc(): void
22
+ unref(): void
18
23
 
19
24
  destroy(): void
20
25
  [Symbol.dispose](): void
package/lib/frame.js CHANGED
@@ -12,6 +12,10 @@ module.exports = class FFmpegFrame {
12
12
  this._handle = null
13
13
  }
14
14
 
15
+ unref() {
16
+ binding.unrefFrame(this._handle)
17
+ }
18
+
15
19
  get width() {
16
20
  return binding.getFrameWidth(this._handle)
17
21
  }
package/lib/rational.d.ts CHANGED
@@ -1,8 +1,14 @@
1
1
  declare class FFmpegRational {
2
2
  numerator: number
3
3
  denominator: number
4
+ valid: boolean
5
+ unintialized: boolean
4
6
 
5
7
  constructor(numerator: number, denominator: number)
8
+
9
+ toNumber(): number
10
+ static from(number: number): Rational
11
+ static rescaleQ(n: Number, a: Rational, b: Rational)
6
12
  }
7
13
 
8
14
  export = FFmpegRational
package/lib/rational.js CHANGED
@@ -7,21 +7,22 @@ module.exports = class FFmpegRational {
7
7
  }
8
8
 
9
9
  get valid() {
10
- // don't support negative denominators unless
11
- // required by codec or format
12
- if (this.denominator < 1) return false
10
+ // don't support negative denominators for now
11
+ if (this.denominator < 0) return false
13
12
 
14
- // common initial value for AVRational(0, 1)
15
- if (this.q2d === 0) return false
13
+ const n = this.toNumber()
14
+
15
+ if (Number.isNaN(n) || n === 0) return false
16
16
 
17
17
  return true
18
18
  }
19
19
 
20
20
  get uninitialized() {
21
+ // common initial value for AVRational(0, 1)
21
22
  return this.numerator === 0 && this.denominator === 1
22
23
  }
23
24
 
24
- get q2d() {
25
+ toNumber() {
25
26
  return this.numerator / this.denominator
26
27
  }
27
28
 
@@ -29,4 +30,11 @@ module.exports = class FFmpegRational {
29
30
  const view = new Int32Array(binding.rationalD2Q(num))
30
31
  return new FFmpegRational(view[0], view[1])
31
32
  }
33
+
34
+ static rescaleQ(n, src, dst) {
35
+ return (
36
+ (n * (src.numerator / src.denominator)) /
37
+ (dst.numerator / dst.denominator)
38
+ )
39
+ }
32
40
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bare-ffmpeg",
3
- "version": "1.0.0-16",
3
+ "version": "1.0.0-18",
4
4
  "description": "Low-level FFmpeg bindings for Bare",
5
5
  "exports": {
6
6
  ".": {