bare-ffmpeg 1.0.0-15 → 1.0.0-17
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/binding.cc +765 -17
- package/index.d.ts +46 -0
- package/index.js +5 -3
- package/lib/audio-fifo.d.ts +20 -0
- package/lib/channel-layout.d.ts +9 -0
- package/lib/channel-layout.js +11 -0
- package/lib/codec-context.d.ts +34 -0
- package/lib/codec-context.js +43 -1
- package/lib/codec-parameters.d.ts +20 -0
- package/lib/codec-parameters.js +38 -0
- package/lib/codec.d.ts +20 -0
- package/lib/codec.js +14 -0
- package/lib/constants.d.ts +74 -0
- package/lib/constants.js +49 -3
- package/lib/decoder.d.ts +7 -0
- package/lib/dictionary.d.ts +11 -0
- package/lib/dictionary.js +2 -0
- package/lib/encoder.d.ts +7 -0
- package/lib/format-context.d.ts +43 -0
- package/lib/format-context.js +28 -5
- package/lib/frame.d.ts +28 -0
- package/lib/frame.js +46 -0
- package/lib/image.d.ts +30 -0
- package/lib/input-format.d.ts +5 -0
- package/lib/input-format.js +4 -0
- package/lib/io-context.d.ts +10 -0
- package/lib/io-context.js +24 -6
- package/lib/log.js +16 -0
- package/lib/output-format.d.ts +5 -0
- package/lib/output-format.js +4 -0
- package/lib/packet.d.ts +16 -0
- package/lib/packet.js +77 -0
- package/lib/rational.d.ts +8 -0
- package/lib/rational.js +27 -1
- package/lib/resampler.d.ts +26 -0
- package/lib/resampler.js +2 -2
- package/lib/samples.d.ts +16 -0
- package/lib/scaler.d.ts +26 -0
- package/lib/scaler.js +2 -2
- package/lib/stream.d.ts +18 -0
- package/lib/stream.js +38 -5
- package/package.json +17 -3
- package/prebuilds/android-arm/bare-ffmpeg.bare +0 -0
- package/prebuilds/android-arm64/bare-ffmpeg.bare +0 -0
- package/prebuilds/android-ia32/bare-ffmpeg.bare +0 -0
- package/prebuilds/android-x64/bare-ffmpeg.bare +0 -0
- package/prebuilds/darwin-arm64/bare-ffmpeg.bare +0 -0
- package/prebuilds/darwin-x64/bare-ffmpeg.bare +0 -0
- package/prebuilds/ios-arm64/bare-ffmpeg.bare +0 -0
- package/prebuilds/ios-arm64-simulator/bare-ffmpeg.bare +0 -0
- package/prebuilds/ios-x64-simulator/bare-ffmpeg.bare +0 -0
- package/prebuilds/linux-arm64/bare-ffmpeg.bare +0 -0
- package/prebuilds/linux-x64/bare-ffmpeg.bare +0 -0
- package/prebuilds/win32-arm64/bare-ffmpeg.bare +0 -0
- package/prebuilds/win32-x64/bare-ffmpeg.bare +0 -0
package/binding.cc
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
#include <assert.h>
|
|
2
|
+
#include <cstdint>
|
|
2
3
|
#include <stddef.h>
|
|
3
4
|
#include <stdint.h>
|
|
4
5
|
#include <string.h>
|
|
@@ -31,8 +32,13 @@ extern "C" {
|
|
|
31
32
|
#include <libswscale/swscale.h>
|
|
32
33
|
}
|
|
33
34
|
|
|
35
|
+
using bare_ffmpeg_io_context_on_write_cb_t = js_function_t<void, js_arraybuffer_t>;
|
|
36
|
+
|
|
34
37
|
typedef struct {
|
|
35
38
|
AVIOContext *handle;
|
|
39
|
+
|
|
40
|
+
js_env_t *env;
|
|
41
|
+
js_persistent_t<bare_ffmpeg_io_context_on_write_cb_t> on_write;
|
|
36
42
|
} bare_ffmpeg_io_context_t;
|
|
37
43
|
|
|
38
44
|
typedef struct {
|
|
@@ -93,6 +99,12 @@ typedef struct {
|
|
|
93
99
|
|
|
94
100
|
static uv_once_t bare_ffmpeg__init_guard = UV_ONCE_INIT;
|
|
95
101
|
|
|
102
|
+
static inline bool
|
|
103
|
+
bad_timebase(const AVRational r) {
|
|
104
|
+
return r.den < 1 || // invalid denominator
|
|
105
|
+
av_q2d(r) == 0; // detect initial state: (0 / 1)
|
|
106
|
+
}
|
|
107
|
+
|
|
96
108
|
static void
|
|
97
109
|
bare_ffmpeg__on_init(void) {
|
|
98
110
|
av_log_set_level(AV_LOG_ERROR);
|
|
@@ -100,13 +112,45 @@ bare_ffmpeg__on_init(void) {
|
|
|
100
112
|
avdevice_register_all();
|
|
101
113
|
}
|
|
102
114
|
|
|
115
|
+
static int32_t
|
|
116
|
+
bare_ffmpeg_log_get_level(js_env_t *) {
|
|
117
|
+
return av_log_get_level();
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
static void
|
|
121
|
+
bare_ffmpeg_log_set_level(js_env_t *, int32_t level) {
|
|
122
|
+
av_log_set_level(level);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
static int
|
|
126
|
+
io_context_write_packet(void *opaque, const uint8_t *chunk, int len) {
|
|
127
|
+
auto context = reinterpret_cast<bare_ffmpeg_io_context_t *>(opaque);
|
|
128
|
+
auto env = context->env;
|
|
129
|
+
|
|
130
|
+
bare_ffmpeg_io_context_on_write_cb_t callback;
|
|
131
|
+
|
|
132
|
+
int err = js_get_reference_value(env, context->on_write, callback);
|
|
133
|
+
assert(err == 0);
|
|
134
|
+
|
|
135
|
+
js_arraybuffer_t data;
|
|
136
|
+
err = js_create_arraybuffer(env, chunk, static_cast<size_t>(len), data);
|
|
137
|
+
|
|
138
|
+
assert(err == 0);
|
|
139
|
+
|
|
140
|
+
// TODO: running on js-stack during avformat_write_header()
|
|
141
|
+
// trace other invocations, pray singlethread.
|
|
142
|
+
err = js_call_function(env, callback, data);
|
|
143
|
+
return err;
|
|
144
|
+
}
|
|
145
|
+
|
|
103
146
|
static js_arraybuffer_t
|
|
104
147
|
bare_ffmpeg_io_context_init(
|
|
105
148
|
js_env_t *env,
|
|
106
149
|
js_receiver_t,
|
|
107
|
-
js_arraybuffer_span_t data,
|
|
150
|
+
std::optional<js_arraybuffer_span_t> data,
|
|
108
151
|
uint64_t offset,
|
|
109
|
-
uint64_t len
|
|
152
|
+
uint64_t len,
|
|
153
|
+
std::optional<bare_ffmpeg_io_context_on_write_cb_t> on_write
|
|
110
154
|
) {
|
|
111
155
|
int err;
|
|
112
156
|
|
|
@@ -116,18 +160,39 @@ bare_ffmpeg_io_context_init(
|
|
|
116
160
|
err = js_create_arraybuffer(env, context, handle);
|
|
117
161
|
assert(err == 0);
|
|
118
162
|
|
|
119
|
-
|
|
163
|
+
context->env = env;
|
|
164
|
+
|
|
165
|
+
int write_flag = 0;
|
|
166
|
+
if (on_write) {
|
|
167
|
+
write_flag = 1;
|
|
168
|
+
err = js_create_reference(env, *on_write, context->on_write);
|
|
169
|
+
assert(err == 0);
|
|
170
|
+
}
|
|
171
|
+
|
|
120
172
|
size_t size = static_cast<size_t>(len);
|
|
121
173
|
|
|
122
|
-
|
|
123
|
-
|
|
174
|
+
uint8_t *io = NULL;
|
|
175
|
+
|
|
176
|
+
if (size) {
|
|
124
177
|
io = reinterpret_cast<uint8_t *>(av_malloc(size));
|
|
178
|
+
}
|
|
125
179
|
|
|
126
|
-
|
|
180
|
+
if (data) {
|
|
181
|
+
memcpy(io, &data.value()[static_cast<size_t>(offset)], size);
|
|
127
182
|
}
|
|
128
183
|
|
|
129
|
-
|
|
130
|
-
|
|
184
|
+
// TODO: for stream read support provide read/seek callbacks
|
|
185
|
+
|
|
186
|
+
context->handle = avio_alloc_context(
|
|
187
|
+
io,
|
|
188
|
+
static_cast<int>(len),
|
|
189
|
+
write_flag,
|
|
190
|
+
context,
|
|
191
|
+
NULL, // io_context_read_packet
|
|
192
|
+
io_context_write_packet,
|
|
193
|
+
NULL // io_context_seek
|
|
194
|
+
);
|
|
195
|
+
assert(context->handle->opaque == context);
|
|
131
196
|
|
|
132
197
|
return handle;
|
|
133
198
|
}
|
|
@@ -141,6 +206,7 @@ bare_ffmpeg_io_context_destroy(
|
|
|
141
206
|
av_free(context->handle->buffer);
|
|
142
207
|
|
|
143
208
|
avio_context_free(&context->handle);
|
|
209
|
+
context->on_write.reset();
|
|
144
210
|
}
|
|
145
211
|
|
|
146
212
|
static js_arraybuffer_t
|
|
@@ -167,6 +233,15 @@ bare_ffmpeg_output_format_init(js_env_t *env, js_receiver_t, std::string name) {
|
|
|
167
233
|
return handle;
|
|
168
234
|
}
|
|
169
235
|
|
|
236
|
+
static int32_t
|
|
237
|
+
bare_ffmpeg_output_format_get_flags(
|
|
238
|
+
js_env_t *,
|
|
239
|
+
js_receiver_t,
|
|
240
|
+
js_arraybuffer_span_of_t<bare_ffmpeg_output_format_t, 1> format
|
|
241
|
+
) {
|
|
242
|
+
return format->handle->flags;
|
|
243
|
+
}
|
|
244
|
+
|
|
170
245
|
static js_arraybuffer_t
|
|
171
246
|
bare_ffmpeg_input_format_init(js_env_t *env, js_receiver_t, std::string name) {
|
|
172
247
|
int err;
|
|
@@ -191,6 +266,15 @@ bare_ffmpeg_input_format_init(js_env_t *env, js_receiver_t, std::string name) {
|
|
|
191
266
|
return handle;
|
|
192
267
|
}
|
|
193
268
|
|
|
269
|
+
static int32_t
|
|
270
|
+
bare_ffmpeg_input_format_get_flags(
|
|
271
|
+
js_env_t *,
|
|
272
|
+
js_receiver_t,
|
|
273
|
+
js_arraybuffer_span_of_t<bare_ffmpeg_input_format_t, 1> format
|
|
274
|
+
) {
|
|
275
|
+
return format->handle->flags;
|
|
276
|
+
}
|
|
277
|
+
|
|
194
278
|
static js_arraybuffer_t
|
|
195
279
|
bare_ffmpeg_format_context_open_input_with_io(
|
|
196
280
|
js_env_t *env,
|
|
@@ -369,8 +453,7 @@ static js_arraybuffer_t
|
|
|
369
453
|
bare_ffmpeg_format_context_create_stream(
|
|
370
454
|
js_env_t *env,
|
|
371
455
|
js_receiver_t,
|
|
372
|
-
js_arraybuffer_span_of_t<bare_ffmpeg_format_context_t, 1> context
|
|
373
|
-
js_arraybuffer_span_of_t<bare_ffmpeg_codec_t, 1> codec
|
|
456
|
+
js_arraybuffer_span_of_t<bare_ffmpeg_format_context_t, 1> context
|
|
374
457
|
) {
|
|
375
458
|
int err;
|
|
376
459
|
|
|
@@ -380,7 +463,7 @@ bare_ffmpeg_format_context_create_stream(
|
|
|
380
463
|
err = js_create_arraybuffer(env, stream, handle);
|
|
381
464
|
assert(err == 0);
|
|
382
465
|
|
|
383
|
-
stream->handle = avformat_new_stream(context->handle,
|
|
466
|
+
stream->handle = avformat_new_stream(context->handle, NULL);
|
|
384
467
|
|
|
385
468
|
return handle;
|
|
386
469
|
}
|
|
@@ -407,13 +490,175 @@ bare_ffmpeg_format_context_read_frame(
|
|
|
407
490
|
return err == 0;
|
|
408
491
|
}
|
|
409
492
|
|
|
493
|
+
static bool
|
|
494
|
+
bare_ffmpeg_format_context_write_header(
|
|
495
|
+
js_env_t *env,
|
|
496
|
+
js_receiver_t,
|
|
497
|
+
js_arraybuffer_span_of_t<bare_ffmpeg_format_context_t, 1> context,
|
|
498
|
+
std::optional<js_arraybuffer_span_of_t<bare_ffmpeg_dictionary_t, 1>> muxer_options
|
|
499
|
+
) {
|
|
500
|
+
int err;
|
|
501
|
+
|
|
502
|
+
if (!muxer_options) {
|
|
503
|
+
err = avformat_write_header(context->handle, NULL);
|
|
504
|
+
} else {
|
|
505
|
+
auto dict = *muxer_options;
|
|
506
|
+
err = avformat_write_header(context->handle, &dict->handle);
|
|
507
|
+
|
|
508
|
+
const AVDictionaryEntry *option = NULL;
|
|
509
|
+
while ((option = av_dict_iterate(dict->handle, option))) {
|
|
510
|
+
av_log(context->handle, AV_LOG_WARNING, "Ignored option key='%s' value='%s'\n", option->key, option->value);
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
if (err < 0) {
|
|
515
|
+
err = js_throw_error(env, NULL, av_err2str(err));
|
|
516
|
+
assert(err == 0);
|
|
517
|
+
|
|
518
|
+
throw js_pending_exception;
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
return err;
|
|
522
|
+
}
|
|
523
|
+
static void
|
|
524
|
+
bare_ffmpeg_format_context_write_frame(
|
|
525
|
+
js_env_t *env,
|
|
526
|
+
js_receiver_t,
|
|
527
|
+
js_arraybuffer_span_of_t<bare_ffmpeg_format_context_t, 1> context,
|
|
528
|
+
js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet
|
|
529
|
+
) {
|
|
530
|
+
int err = av_interleaved_write_frame(context->handle, packet->handle);
|
|
531
|
+
|
|
532
|
+
if (err < 0) {
|
|
533
|
+
err = js_throw_error(env, NULL, av_err2str(err));
|
|
534
|
+
assert(err == 0);
|
|
535
|
+
|
|
536
|
+
throw js_pending_exception;
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
static void
|
|
541
|
+
bare_ffmpeg_format_context_write_trailer(
|
|
542
|
+
js_env_t *env,
|
|
543
|
+
js_receiver_t,
|
|
544
|
+
js_arraybuffer_span_of_t<bare_ffmpeg_format_context_t, 1> context
|
|
545
|
+
) {
|
|
546
|
+
int err = av_write_trailer(context->handle);
|
|
547
|
+
if (err < 0) {
|
|
548
|
+
err = js_throw_error(env, NULL, av_err2str(err));
|
|
549
|
+
assert(err == 0);
|
|
550
|
+
|
|
551
|
+
throw js_pending_exception;
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
static void
|
|
556
|
+
bare_ffmpeg_format_context_dump(
|
|
557
|
+
js_env_t *env,
|
|
558
|
+
js_receiver_t,
|
|
559
|
+
js_arraybuffer_span_of_t<bare_ffmpeg_format_context_t, 1> context,
|
|
560
|
+
bool is_output,
|
|
561
|
+
int32_t index,
|
|
562
|
+
std::string url
|
|
563
|
+
) {
|
|
564
|
+
av_dump_format(context->handle, index, url.c_str(), is_output);
|
|
565
|
+
|
|
566
|
+
for (int i = 0; i < context->handle->nb_streams; i++) {
|
|
567
|
+
auto stream = context->handle->streams[i];
|
|
568
|
+
av_log(NULL, AV_LOG_INFO, " - stream=%i timebase=(%i / %i)\n", i, stream->time_base.num, stream->time_base.den);
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
static int32_t
|
|
573
|
+
bare_ffmpeg_stream_get_index(
|
|
574
|
+
js_env_t *env,
|
|
575
|
+
js_receiver_t,
|
|
576
|
+
js_arraybuffer_span_of_t<bare_ffmpeg_stream_t, 1> stream
|
|
577
|
+
) {
|
|
578
|
+
return stream->handle->index;
|
|
579
|
+
}
|
|
580
|
+
|
|
410
581
|
static int32_t
|
|
411
|
-
|
|
582
|
+
bare_ffmpeg_stream_get_id(
|
|
412
583
|
js_env_t *env,
|
|
413
584
|
js_receiver_t,
|
|
414
585
|
js_arraybuffer_span_of_t<bare_ffmpeg_stream_t, 1> stream
|
|
415
586
|
) {
|
|
416
|
-
return stream->handle->
|
|
587
|
+
return stream->handle->id;
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
static void
|
|
591
|
+
bare_ffmpeg_stream_set_id(
|
|
592
|
+
js_env_t *env,
|
|
593
|
+
js_receiver_t,
|
|
594
|
+
js_arraybuffer_span_of_t<bare_ffmpeg_stream_t, 1> stream,
|
|
595
|
+
int32_t id
|
|
596
|
+
) {
|
|
597
|
+
stream->handle->id = id;
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
static js_arraybuffer_t
|
|
601
|
+
bare_ffmpeg_stream_get_time_base(
|
|
602
|
+
js_env_t *env,
|
|
603
|
+
js_receiver_t,
|
|
604
|
+
js_arraybuffer_span_of_t<bare_ffmpeg_stream_t, 1> stream
|
|
605
|
+
) {
|
|
606
|
+
int err;
|
|
607
|
+
|
|
608
|
+
js_arraybuffer_t result;
|
|
609
|
+
|
|
610
|
+
int32_t *data;
|
|
611
|
+
err = js_create_arraybuffer(env, 2, data, result);
|
|
612
|
+
assert(err == 0);
|
|
613
|
+
|
|
614
|
+
data[0] = stream->handle->time_base.num;
|
|
615
|
+
data[1] = stream->handle->time_base.den;
|
|
616
|
+
|
|
617
|
+
return result;
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
static void
|
|
621
|
+
bare_ffmpeg_stream_set_time_base(
|
|
622
|
+
js_env_t *env,
|
|
623
|
+
js_receiver_t,
|
|
624
|
+
js_arraybuffer_span_of_t<bare_ffmpeg_stream_t, 1> stream,
|
|
625
|
+
int num,
|
|
626
|
+
int den
|
|
627
|
+
) {
|
|
628
|
+
stream->handle->time_base.num = num;
|
|
629
|
+
stream->handle->time_base.den = den;
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
static js_arraybuffer_t
|
|
633
|
+
bare_ffmpeg_stream_get_avg_framerate(
|
|
634
|
+
js_env_t *env,
|
|
635
|
+
js_receiver_t,
|
|
636
|
+
js_arraybuffer_span_of_t<bare_ffmpeg_stream_t, 1> stream
|
|
637
|
+
) {
|
|
638
|
+
int err;
|
|
639
|
+
|
|
640
|
+
js_arraybuffer_t result;
|
|
641
|
+
|
|
642
|
+
int32_t *data;
|
|
643
|
+
err = js_create_arraybuffer(env, 2, data, result);
|
|
644
|
+
assert(err == 0);
|
|
645
|
+
|
|
646
|
+
data[0] = stream->handle->avg_frame_rate.num;
|
|
647
|
+
data[1] = stream->handle->avg_frame_rate.den;
|
|
648
|
+
|
|
649
|
+
return result;
|
|
650
|
+
}
|
|
651
|
+
|
|
652
|
+
static void
|
|
653
|
+
bare_ffmpeg_stream_set_avg_framerate(
|
|
654
|
+
js_env_t *env,
|
|
655
|
+
js_receiver_t,
|
|
656
|
+
js_arraybuffer_span_of_t<bare_ffmpeg_stream_t, 1> stream,
|
|
657
|
+
int num,
|
|
658
|
+
int den
|
|
659
|
+
) {
|
|
660
|
+
stream->handle->avg_frame_rate.num = num;
|
|
661
|
+
stream->handle->avg_frame_rate.den = den;
|
|
417
662
|
}
|
|
418
663
|
|
|
419
664
|
static js_arraybuffer_t
|
|
@@ -483,6 +728,13 @@ bare_ffmpeg_find_encoder_by_id(js_env_t *env, js_receiver_t, uint32_t id) {
|
|
|
483
728
|
return handle;
|
|
484
729
|
}
|
|
485
730
|
|
|
731
|
+
static std::string
|
|
732
|
+
bare_ffmpeg_get_codec_name_by_id(js_env_t *env, js_receiver_t, uint32_t id) {
|
|
733
|
+
auto name = avcodec_get_name((enum AVCodecID) id);
|
|
734
|
+
|
|
735
|
+
return std::string(name);
|
|
736
|
+
}
|
|
737
|
+
|
|
486
738
|
static js_arraybuffer_t
|
|
487
739
|
bare_ffmpeg_codec_context_init(
|
|
488
740
|
js_env_t *env,
|
|
@@ -521,6 +773,7 @@ bare_ffmpeg_codec_context_open(
|
|
|
521
773
|
int err;
|
|
522
774
|
|
|
523
775
|
err = avcodec_open2(context->handle, context->handle->codec, NULL);
|
|
776
|
+
|
|
524
777
|
if (err < 0) {
|
|
525
778
|
err = js_throw_error(env, NULL, av_err2str(err));
|
|
526
779
|
assert(err == 0);
|
|
@@ -531,6 +784,25 @@ bare_ffmpeg_codec_context_open(
|
|
|
531
784
|
return err == 0;
|
|
532
785
|
}
|
|
533
786
|
|
|
787
|
+
static int32_t
|
|
788
|
+
bare_ffmpeg_codec_context_get_flags(
|
|
789
|
+
js_env_t *env,
|
|
790
|
+
js_receiver_t,
|
|
791
|
+
js_arraybuffer_span_of_t<bare_ffmpeg_codec_context_t, 1> context
|
|
792
|
+
) {
|
|
793
|
+
return context->handle->flags;
|
|
794
|
+
}
|
|
795
|
+
|
|
796
|
+
static void
|
|
797
|
+
bare_ffmpeg_codec_context_set_flags(
|
|
798
|
+
js_env_t *env,
|
|
799
|
+
js_receiver_t,
|
|
800
|
+
js_arraybuffer_span_of_t<bare_ffmpeg_codec_context_t, 1> context,
|
|
801
|
+
int32_t value
|
|
802
|
+
) {
|
|
803
|
+
context->handle->flags = value;
|
|
804
|
+
}
|
|
805
|
+
|
|
534
806
|
static int64_t
|
|
535
807
|
bare_ffmpeg_frame_get_format(
|
|
536
808
|
js_env_t *env,
|
|
@@ -782,6 +1054,38 @@ bare_ffmpeg_codec_context_set_gop_size(
|
|
|
782
1054
|
context->handle->gop_size = gop_size;
|
|
783
1055
|
}
|
|
784
1056
|
|
|
1057
|
+
static js_arraybuffer_t
|
|
1058
|
+
bare_ffmpeg_codec_context_get_framerate(
|
|
1059
|
+
js_env_t *env,
|
|
1060
|
+
js_receiver_t,
|
|
1061
|
+
js_arraybuffer_span_of_t<bare_ffmpeg_codec_context_t, 1> context
|
|
1062
|
+
) {
|
|
1063
|
+
int err;
|
|
1064
|
+
|
|
1065
|
+
js_arraybuffer_t result;
|
|
1066
|
+
|
|
1067
|
+
int32_t *data;
|
|
1068
|
+
err = js_create_arraybuffer(env, 2, data, result);
|
|
1069
|
+
assert(err == 0);
|
|
1070
|
+
|
|
1071
|
+
data[0] = context->handle->framerate.num;
|
|
1072
|
+
data[1] = context->handle->framerate.den;
|
|
1073
|
+
|
|
1074
|
+
return result;
|
|
1075
|
+
}
|
|
1076
|
+
|
|
1077
|
+
static void
|
|
1078
|
+
bare_ffmpeg_codec_context_set_framerate(
|
|
1079
|
+
js_env_t *env,
|
|
1080
|
+
js_receiver_t,
|
|
1081
|
+
js_arraybuffer_span_of_t<bare_ffmpeg_codec_context_t, 1> context,
|
|
1082
|
+
int num,
|
|
1083
|
+
int den
|
|
1084
|
+
) {
|
|
1085
|
+
context->handle->framerate.num = num;
|
|
1086
|
+
context->handle->framerate.den = den;
|
|
1087
|
+
}
|
|
1088
|
+
|
|
785
1089
|
static bool
|
|
786
1090
|
bare_ffmpeg_codec_context_send_packet(
|
|
787
1091
|
js_env_t *env,
|
|
@@ -827,11 +1131,16 @@ bare_ffmpeg_codec_context_send_frame(
|
|
|
827
1131
|
js_env_t *env,
|
|
828
1132
|
js_receiver_t,
|
|
829
1133
|
js_arraybuffer_span_of_t<bare_ffmpeg_codec_context_t, 1> context,
|
|
830
|
-
js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1
|
|
1134
|
+
std::optional<js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1>> frame
|
|
831
1135
|
) {
|
|
832
1136
|
int err;
|
|
833
1137
|
|
|
834
|
-
|
|
1138
|
+
if (frame) {
|
|
1139
|
+
err = avcodec_send_frame(context->handle, (*frame)->handle);
|
|
1140
|
+
} else {
|
|
1141
|
+
err = avcodec_send_frame(context->handle, NULL); // End of stream
|
|
1142
|
+
}
|
|
1143
|
+
|
|
835
1144
|
if (err < 0 && err != AVERROR(EAGAIN) && err != AVERROR_EOF) {
|
|
836
1145
|
err = js_throw_error(env, NULL, av_err2str(err));
|
|
837
1146
|
assert(err == 0);
|
|
@@ -872,6 +1181,7 @@ bare_ffmpeg_codec_parameters_from_context(
|
|
|
872
1181
|
int err;
|
|
873
1182
|
|
|
874
1183
|
err = avcodec_parameters_from_context(parameters->handle, context->handle);
|
|
1184
|
+
|
|
875
1185
|
if (err < 0) {
|
|
876
1186
|
err = js_throw_error(env, NULL, av_err2str(err));
|
|
877
1187
|
assert(err == 0);
|
|
@@ -961,6 +1271,15 @@ bare_ffmpeg_codec_parameters_get_codec_type(
|
|
|
961
1271
|
return parameters->handle->codec_type;
|
|
962
1272
|
}
|
|
963
1273
|
|
|
1274
|
+
static int32_t
|
|
1275
|
+
bare_ffmpeg_codec_parameters_get_codec_id(
|
|
1276
|
+
js_env_t *env,
|
|
1277
|
+
js_receiver_t,
|
|
1278
|
+
js_arraybuffer_span_of_t<bare_ffmpeg_codec_parameters_t, 1> parameters
|
|
1279
|
+
) {
|
|
1280
|
+
return parameters->handle->codec_id;
|
|
1281
|
+
}
|
|
1282
|
+
|
|
964
1283
|
static js_arraybuffer_t
|
|
965
1284
|
bare_ffmpeg_codec_parameters_get_channel_layout(
|
|
966
1285
|
js_env_t *env,
|
|
@@ -981,6 +1300,44 @@ bare_ffmpeg_codec_parameters_get_channel_layout(
|
|
|
981
1300
|
return result;
|
|
982
1301
|
}
|
|
983
1302
|
|
|
1303
|
+
static int32_t
|
|
1304
|
+
bare_ffmpeg_codec_parameters_get_width(
|
|
1305
|
+
js_env_t *env,
|
|
1306
|
+
js_receiver_t,
|
|
1307
|
+
js_arraybuffer_span_of_t<bare_ffmpeg_codec_parameters_t, 1> parameters
|
|
1308
|
+
) {
|
|
1309
|
+
return parameters->handle->width;
|
|
1310
|
+
}
|
|
1311
|
+
|
|
1312
|
+
static int32_t
|
|
1313
|
+
bare_ffmpeg_codec_parameters_get_height(
|
|
1314
|
+
js_env_t *env,
|
|
1315
|
+
js_receiver_t,
|
|
1316
|
+
js_arraybuffer_span_of_t<bare_ffmpeg_codec_parameters_t, 1> parameters
|
|
1317
|
+
) {
|
|
1318
|
+
return parameters->handle->height;
|
|
1319
|
+
}
|
|
1320
|
+
|
|
1321
|
+
static js_arraybuffer_t
|
|
1322
|
+
bare_ffmpeg_codec_parameters_get_framerate(
|
|
1323
|
+
js_env_t *env,
|
|
1324
|
+
js_receiver_t,
|
|
1325
|
+
js_arraybuffer_span_of_t<bare_ffmpeg_codec_parameters_t, 1> parameters
|
|
1326
|
+
) {
|
|
1327
|
+
int err;
|
|
1328
|
+
|
|
1329
|
+
js_arraybuffer_t result;
|
|
1330
|
+
|
|
1331
|
+
int32_t *data;
|
|
1332
|
+
err = js_create_arraybuffer(env, 2, data, result);
|
|
1333
|
+
assert(err == 0);
|
|
1334
|
+
|
|
1335
|
+
data[0] = parameters->handle->framerate.num;
|
|
1336
|
+
data[1] = parameters->handle->framerate.den;
|
|
1337
|
+
|
|
1338
|
+
return result;
|
|
1339
|
+
}
|
|
1340
|
+
|
|
984
1341
|
static js_arraybuffer_t
|
|
985
1342
|
bare_ffmpeg_frame_init(js_env_t *env, js_receiver_t) {
|
|
986
1343
|
int err;
|
|
@@ -997,6 +1354,15 @@ bare_ffmpeg_frame_init(js_env_t *env, js_receiver_t) {
|
|
|
997
1354
|
return handle;
|
|
998
1355
|
}
|
|
999
1356
|
|
|
1357
|
+
static void
|
|
1358
|
+
bare_ffmpeg_frame_unref(
|
|
1359
|
+
js_env_t *env,
|
|
1360
|
+
js_receiver_t,
|
|
1361
|
+
js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame
|
|
1362
|
+
) {
|
|
1363
|
+
av_frame_unref(frame->handle);
|
|
1364
|
+
}
|
|
1365
|
+
|
|
1000
1366
|
static void
|
|
1001
1367
|
bare_ffmpeg_frame_destroy(
|
|
1002
1368
|
js_env_t *env,
|
|
@@ -1091,6 +1457,83 @@ bare_ffmpeg_frame_get_pict_type(
|
|
|
1091
1457
|
return frame->handle->pict_type;
|
|
1092
1458
|
}
|
|
1093
1459
|
|
|
1460
|
+
static int64_t
|
|
1461
|
+
bare_ffmpeg_frame_get_pts(
|
|
1462
|
+
js_env_t *env,
|
|
1463
|
+
js_receiver_t,
|
|
1464
|
+
js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame
|
|
1465
|
+
) {
|
|
1466
|
+
int64_t ts = frame->handle->pts;
|
|
1467
|
+
|
|
1468
|
+
if (ts == AV_NOPTS_VALUE) return -1;
|
|
1469
|
+
|
|
1470
|
+
return ts;
|
|
1471
|
+
}
|
|
1472
|
+
|
|
1473
|
+
static void
|
|
1474
|
+
bare_ffmpeg_frame_set_pts(
|
|
1475
|
+
js_env_t *,
|
|
1476
|
+
js_receiver_t,
|
|
1477
|
+
js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame,
|
|
1478
|
+
int64_t value
|
|
1479
|
+
) {
|
|
1480
|
+
frame->handle->pts = value;
|
|
1481
|
+
}
|
|
1482
|
+
|
|
1483
|
+
static int64_t
|
|
1484
|
+
bare_ffmpeg_frame_get_pkt_dts(
|
|
1485
|
+
js_env_t *env,
|
|
1486
|
+
js_receiver_t,
|
|
1487
|
+
js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame
|
|
1488
|
+
) {
|
|
1489
|
+
int64_t ts = frame->handle->pkt_dts;
|
|
1490
|
+
|
|
1491
|
+
if (ts == AV_NOPTS_VALUE) return -1;
|
|
1492
|
+
|
|
1493
|
+
return ts;
|
|
1494
|
+
}
|
|
1495
|
+
|
|
1496
|
+
static void
|
|
1497
|
+
bare_ffmpeg_frame_set_pkt_dts(
|
|
1498
|
+
js_env_t *,
|
|
1499
|
+
js_receiver_t,
|
|
1500
|
+
js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame,
|
|
1501
|
+
int64_t value
|
|
1502
|
+
) {
|
|
1503
|
+
frame->handle->pkt_dts = value;
|
|
1504
|
+
}
|
|
1505
|
+
|
|
1506
|
+
static js_arraybuffer_t
|
|
1507
|
+
bare_ffmpeg_frame_get_time_base(
|
|
1508
|
+
js_env_t *env,
|
|
1509
|
+
js_receiver_t,
|
|
1510
|
+
js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame
|
|
1511
|
+
) {
|
|
1512
|
+
int err;
|
|
1513
|
+
|
|
1514
|
+
js_arraybuffer_t result;
|
|
1515
|
+
|
|
1516
|
+
int32_t *data;
|
|
1517
|
+
err = js_create_arraybuffer(env, 2, data, result);
|
|
1518
|
+
assert(err == 0);
|
|
1519
|
+
|
|
1520
|
+
data[0] = frame->handle->time_base.num;
|
|
1521
|
+
data[1] = frame->handle->time_base.den;
|
|
1522
|
+
|
|
1523
|
+
return result;
|
|
1524
|
+
}
|
|
1525
|
+
static void
|
|
1526
|
+
bare_ffmpeg_frame_set_time_base(
|
|
1527
|
+
js_env_t *env,
|
|
1528
|
+
js_receiver_t,
|
|
1529
|
+
js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> frame,
|
|
1530
|
+
int num,
|
|
1531
|
+
int den
|
|
1532
|
+
) {
|
|
1533
|
+
frame->handle->time_base.num = num;
|
|
1534
|
+
frame->handle->time_base.den = den;
|
|
1535
|
+
}
|
|
1536
|
+
|
|
1094
1537
|
static void
|
|
1095
1538
|
bare_ffmpeg_frame_alloc(
|
|
1096
1539
|
js_env_t *env,
|
|
@@ -1353,6 +1796,16 @@ bare_ffmpeg_packet_get_stream_index(
|
|
|
1353
1796
|
return packet->handle->stream_index;
|
|
1354
1797
|
}
|
|
1355
1798
|
|
|
1799
|
+
static void
|
|
1800
|
+
bare_ffmpeg_packet_set_stream_index(
|
|
1801
|
+
js_env_t *env,
|
|
1802
|
+
js_receiver_t,
|
|
1803
|
+
js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet,
|
|
1804
|
+
int32_t value
|
|
1805
|
+
) {
|
|
1806
|
+
packet->handle->stream_index = value;
|
|
1807
|
+
}
|
|
1808
|
+
|
|
1356
1809
|
static js_arraybuffer_t
|
|
1357
1810
|
bare_ffmpeg_packet_get_data(
|
|
1358
1811
|
js_env_t *env,
|
|
@@ -1374,6 +1827,26 @@ bare_ffmpeg_packet_get_data(
|
|
|
1374
1827
|
return handle;
|
|
1375
1828
|
}
|
|
1376
1829
|
|
|
1830
|
+
static void
|
|
1831
|
+
bare_ffmpeg_packet_set_data(
|
|
1832
|
+
js_env_t *env,
|
|
1833
|
+
js_receiver_t,
|
|
1834
|
+
js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet,
|
|
1835
|
+
js_arraybuffer_span_t data,
|
|
1836
|
+
uint32_t offset,
|
|
1837
|
+
uint32_t len
|
|
1838
|
+
) {
|
|
1839
|
+
int err;
|
|
1840
|
+
assert(offset + len <= data.size());
|
|
1841
|
+
|
|
1842
|
+
av_packet_unref(packet->handle);
|
|
1843
|
+
|
|
1844
|
+
err = av_new_packet(packet->handle, static_cast<int>(len));
|
|
1845
|
+
assert(err == 0);
|
|
1846
|
+
|
|
1847
|
+
memcpy(packet->handle->data, &data[offset], len);
|
|
1848
|
+
}
|
|
1849
|
+
|
|
1377
1850
|
static bool
|
|
1378
1851
|
bare_ffmpeg_packet_is_keyframe(
|
|
1379
1852
|
js_env_t *,
|
|
@@ -1383,6 +1856,148 @@ bare_ffmpeg_packet_is_keyframe(
|
|
|
1383
1856
|
return packet->handle->flags & AV_PKT_FLAG_KEY;
|
|
1384
1857
|
}
|
|
1385
1858
|
|
|
1859
|
+
static int64_t
|
|
1860
|
+
bare_ffmpeg_packet_get_dts(
|
|
1861
|
+
js_env_t *env,
|
|
1862
|
+
js_receiver_t,
|
|
1863
|
+
js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet
|
|
1864
|
+
) {
|
|
1865
|
+
int64_t ts = packet->handle->dts;
|
|
1866
|
+
|
|
1867
|
+
if (ts == AV_NOPTS_VALUE) return -1;
|
|
1868
|
+
|
|
1869
|
+
return ts;
|
|
1870
|
+
}
|
|
1871
|
+
|
|
1872
|
+
static void
|
|
1873
|
+
bare_ffmpeg_packet_set_dts(
|
|
1874
|
+
js_env_t *env,
|
|
1875
|
+
js_receiver_t,
|
|
1876
|
+
js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet,
|
|
1877
|
+
int64_t value
|
|
1878
|
+
) {
|
|
1879
|
+
packet->handle->dts = value;
|
|
1880
|
+
}
|
|
1881
|
+
|
|
1882
|
+
static int64_t
|
|
1883
|
+
bare_ffmpeg_packet_get_pts(
|
|
1884
|
+
js_env_t *env,
|
|
1885
|
+
js_receiver_t,
|
|
1886
|
+
js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet
|
|
1887
|
+
) {
|
|
1888
|
+
int64_t ts = packet->handle->pts;
|
|
1889
|
+
|
|
1890
|
+
if (ts == AV_NOPTS_VALUE) return -1;
|
|
1891
|
+
|
|
1892
|
+
return ts;
|
|
1893
|
+
}
|
|
1894
|
+
|
|
1895
|
+
static void
|
|
1896
|
+
bare_ffmpeg_packet_set_pts(
|
|
1897
|
+
js_env_t *env,
|
|
1898
|
+
js_receiver_t,
|
|
1899
|
+
js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet,
|
|
1900
|
+
int64_t value
|
|
1901
|
+
) {
|
|
1902
|
+
packet->handle->pts = value;
|
|
1903
|
+
}
|
|
1904
|
+
|
|
1905
|
+
static js_arraybuffer_t
|
|
1906
|
+
bare_ffmpeg_packet_get_time_base(
|
|
1907
|
+
js_env_t *env,
|
|
1908
|
+
js_receiver_t,
|
|
1909
|
+
js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet
|
|
1910
|
+
) {
|
|
1911
|
+
int err;
|
|
1912
|
+
|
|
1913
|
+
js_arraybuffer_t result;
|
|
1914
|
+
|
|
1915
|
+
int32_t *data;
|
|
1916
|
+
err = js_create_arraybuffer(env, 2, data, result);
|
|
1917
|
+
assert(err == 0);
|
|
1918
|
+
|
|
1919
|
+
data[0] = packet->handle->time_base.num;
|
|
1920
|
+
data[1] = packet->handle->time_base.den;
|
|
1921
|
+
|
|
1922
|
+
return result;
|
|
1923
|
+
}
|
|
1924
|
+
|
|
1925
|
+
static void
|
|
1926
|
+
bare_ffmpeg_packet_set_time_base(
|
|
1927
|
+
js_env_t *env,
|
|
1928
|
+
js_receiver_t,
|
|
1929
|
+
js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet,
|
|
1930
|
+
int num,
|
|
1931
|
+
int den
|
|
1932
|
+
) {
|
|
1933
|
+
packet->handle->time_base.num = num;
|
|
1934
|
+
packet->handle->time_base.den = den;
|
|
1935
|
+
}
|
|
1936
|
+
|
|
1937
|
+
static int64_t
|
|
1938
|
+
bare_ffmpeg_packet_rescale_ts(
|
|
1939
|
+
js_env_t *env,
|
|
1940
|
+
js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet,
|
|
1941
|
+
int32_t num,
|
|
1942
|
+
int32_t den
|
|
1943
|
+
) {
|
|
1944
|
+
AVRational src = packet->handle->time_base;
|
|
1945
|
+
AVRational dst = {.num = num, .den = den};
|
|
1946
|
+
|
|
1947
|
+
if (
|
|
1948
|
+
bad_timebase(src) ||
|
|
1949
|
+
bad_timebase(dst) ||
|
|
1950
|
+
packet->handle->dts == AV_NOPTS_VALUE ||
|
|
1951
|
+
packet->handle->pts == AV_NOPTS_VALUE
|
|
1952
|
+
) {
|
|
1953
|
+
return false;
|
|
1954
|
+
}
|
|
1955
|
+
|
|
1956
|
+
av_packet_rescale_ts(packet->handle, src, dst);
|
|
1957
|
+
|
|
1958
|
+
packet->handle->time_base = dst;
|
|
1959
|
+
|
|
1960
|
+
return true;
|
|
1961
|
+
}
|
|
1962
|
+
|
|
1963
|
+
static int64_t
|
|
1964
|
+
bare_ffmpeg_packet_get_duration(
|
|
1965
|
+
js_env_t *env,
|
|
1966
|
+
js_receiver_t,
|
|
1967
|
+
js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet
|
|
1968
|
+
) {
|
|
1969
|
+
return packet->handle->duration;
|
|
1970
|
+
}
|
|
1971
|
+
|
|
1972
|
+
static void
|
|
1973
|
+
bare_ffmpeg_packet_set_duration(
|
|
1974
|
+
js_env_t *env,
|
|
1975
|
+
js_receiver_t,
|
|
1976
|
+
js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet,
|
|
1977
|
+
int64_t value
|
|
1978
|
+
) {
|
|
1979
|
+
packet->handle->duration = value;
|
|
1980
|
+
}
|
|
1981
|
+
|
|
1982
|
+
static int32_t
|
|
1983
|
+
bare_ffmpeg_packet_get_flags(
|
|
1984
|
+
js_env_t *env,
|
|
1985
|
+
js_receiver_t,
|
|
1986
|
+
js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet
|
|
1987
|
+
) {
|
|
1988
|
+
return packet->handle->flags;
|
|
1989
|
+
}
|
|
1990
|
+
|
|
1991
|
+
static void
|
|
1992
|
+
bare_ffmpeg_packet_set_flags(
|
|
1993
|
+
js_env_t *env,
|
|
1994
|
+
js_receiver_t,
|
|
1995
|
+
js_arraybuffer_span_of_t<bare_ffmpeg_packet_t, 1> packet,
|
|
1996
|
+
int32_t value
|
|
1997
|
+
) {
|
|
1998
|
+
packet->handle->flags = value;
|
|
1999
|
+
}
|
|
2000
|
+
|
|
1386
2001
|
static js_arraybuffer_t
|
|
1387
2002
|
bare_ffmpeg_scaler_init(
|
|
1388
2003
|
js_env_t *env,
|
|
@@ -1437,6 +2052,9 @@ bare_ffmpeg_scaler_scale(
|
|
|
1437
2052
|
int height,
|
|
1438
2053
|
js_arraybuffer_span_of_t<bare_ffmpeg_frame_t, 1> target
|
|
1439
2054
|
) {
|
|
2055
|
+
int err = av_frame_copy_props(target->handle, source->handle);
|
|
2056
|
+
assert(err == 0);
|
|
2057
|
+
|
|
1440
2058
|
return sws_scale(
|
|
1441
2059
|
scaler->handle,
|
|
1442
2060
|
reinterpret_cast<const uint8_t *const *>(source->handle->data),
|
|
@@ -1667,6 +2285,15 @@ bare_ffmpeg_channel_layout_get_nb_channels(
|
|
|
1667
2285
|
return layout->handle.nb_channels;
|
|
1668
2286
|
}
|
|
1669
2287
|
|
|
2288
|
+
static uint64_t
|
|
2289
|
+
bare_ffmpeg_channel_layout_get_mask(
|
|
2290
|
+
js_env_t *env,
|
|
2291
|
+
js_receiver_t,
|
|
2292
|
+
js_arraybuffer_span_of_t<bare_ffmpeg_channel_layout_t, 1> layout
|
|
2293
|
+
) {
|
|
2294
|
+
return layout->handle.u.mask;
|
|
2295
|
+
}
|
|
2296
|
+
|
|
1670
2297
|
static js_arraybuffer_t
|
|
1671
2298
|
bare_ffmpeg_channel_layout_from_mask(
|
|
1672
2299
|
js_env_t *env,
|
|
@@ -1830,6 +2457,30 @@ bare_ffmpeg_audio_fifo_space(
|
|
|
1830
2457
|
return av_audio_fifo_space(fifo->handle);
|
|
1831
2458
|
}
|
|
1832
2459
|
|
|
2460
|
+
static js_arraybuffer_t
|
|
2461
|
+
bare_ffmpeg_rational_d2q(
|
|
2462
|
+
js_env_t *env,
|
|
2463
|
+
js_receiver_t,
|
|
2464
|
+
double num
|
|
2465
|
+
) {
|
|
2466
|
+
constexpr int safe_max = 1 << 26;
|
|
2467
|
+
|
|
2468
|
+
auto rational = av_d2q(num, safe_max);
|
|
2469
|
+
|
|
2470
|
+
int err;
|
|
2471
|
+
|
|
2472
|
+
js_arraybuffer_t result;
|
|
2473
|
+
|
|
2474
|
+
int32_t *data;
|
|
2475
|
+
err = js_create_arraybuffer(env, 2, data, result);
|
|
2476
|
+
assert(err == 0);
|
|
2477
|
+
|
|
2478
|
+
data[0] = rational.num;
|
|
2479
|
+
data[1] = rational.den;
|
|
2480
|
+
|
|
2481
|
+
return result;
|
|
2482
|
+
}
|
|
2483
|
+
|
|
1833
2484
|
static js_value_t *
|
|
1834
2485
|
bare_ffmpeg_exports(js_env_t *env, js_value_t *exports) {
|
|
1835
2486
|
uv_once(&bare_ffmpeg__init_guard, bare_ffmpeg__on_init);
|
|
@@ -1840,11 +2491,16 @@ bare_ffmpeg_exports(js_env_t *env, js_value_t *exports) {
|
|
|
1840
2491
|
err = js_set_property<fn>(env, exports, name); \
|
|
1841
2492
|
assert(err == 0);
|
|
1842
2493
|
|
|
2494
|
+
V("getLogLevel", bare_ffmpeg_log_get_level);
|
|
2495
|
+
V("setLogLevel", bare_ffmpeg_log_set_level);
|
|
2496
|
+
|
|
1843
2497
|
V("initIOContext", bare_ffmpeg_io_context_init)
|
|
1844
2498
|
V("destroyIOContext", bare_ffmpeg_io_context_destroy)
|
|
1845
2499
|
|
|
1846
2500
|
V("initOutputFormat", bare_ffmpeg_output_format_init)
|
|
1847
2501
|
V("initInputFormat", bare_ffmpeg_input_format_init)
|
|
2502
|
+
V("getOutputFormatFlags", bare_ffmpeg_output_format_get_flags)
|
|
2503
|
+
V("getInputFormatFlags", bare_ffmpeg_input_format_get_flags)
|
|
1848
2504
|
|
|
1849
2505
|
V("openInputFormatContextWithIO", bare_ffmpeg_format_context_open_input_with_io)
|
|
1850
2506
|
V("openInputFormatContextWithFormat", bare_ffmpeg_format_context_open_input_with_format)
|
|
@@ -1855,17 +2511,30 @@ bare_ffmpeg_exports(js_env_t *env, js_value_t *exports) {
|
|
|
1855
2511
|
V("getFormatContextBestStreamIndex", bare_ffmpeg_format_context_get_best_stream_index)
|
|
1856
2512
|
V("createFormatContextStream", bare_ffmpeg_format_context_create_stream)
|
|
1857
2513
|
V("readFormatContextFrame", bare_ffmpeg_format_context_read_frame)
|
|
1858
|
-
|
|
1859
|
-
V("
|
|
2514
|
+
V("writeFormatContextHeader", bare_ffmpeg_format_context_write_header)
|
|
2515
|
+
V("writeFormatContextFrame", bare_ffmpeg_format_context_write_frame)
|
|
2516
|
+
V("writeFormatContextTrailer", bare_ffmpeg_format_context_write_trailer)
|
|
2517
|
+
V("dumpFormatContext", bare_ffmpeg_format_context_dump)
|
|
2518
|
+
|
|
2519
|
+
V("getStreamIndex", bare_ffmpeg_stream_get_index)
|
|
2520
|
+
V("getStreamId", bare_ffmpeg_stream_get_id)
|
|
2521
|
+
V("setStreamId", bare_ffmpeg_stream_set_id)
|
|
2522
|
+
V("getStreamTimeBase", bare_ffmpeg_stream_get_time_base)
|
|
2523
|
+
V("setStreamTimeBase", bare_ffmpeg_stream_set_time_base)
|
|
2524
|
+
V("getStreamAverageFramerate", bare_ffmpeg_stream_get_avg_framerate)
|
|
2525
|
+
V("setStreamAverageFramerate", bare_ffmpeg_stream_set_avg_framerate)
|
|
1860
2526
|
V("getStreamCodecParameters", bare_ffmpeg_stream_get_codec_parameters)
|
|
1861
2527
|
|
|
1862
2528
|
V("findDecoderByID", bare_ffmpeg_find_decoder_by_id)
|
|
1863
2529
|
V("findEncoderByID", bare_ffmpeg_find_encoder_by_id)
|
|
2530
|
+
V("getCodecNameByID", bare_ffmpeg_get_codec_name_by_id)
|
|
1864
2531
|
|
|
1865
2532
|
V("initCodecContext", bare_ffmpeg_codec_context_init)
|
|
1866
2533
|
V("destroyCodecContext", bare_ffmpeg_codec_context_destroy)
|
|
1867
2534
|
V("openCodecContext", bare_ffmpeg_codec_context_open)
|
|
1868
2535
|
V("openCodecContextWithOptions", bare_ffmpeg_codec_context_open_with_options)
|
|
2536
|
+
V("getCodecContextFlags", bare_ffmpeg_codec_context_get_flags)
|
|
2537
|
+
V("setCodecContextFlags", bare_ffmpeg_codec_context_set_flags)
|
|
1869
2538
|
V("getCodecContextPixelFormat", bare_ffmpeg_codec_context_get_pixel_format)
|
|
1870
2539
|
V("setCodecContextPixelFormat", bare_ffmpeg_codec_context_set_pixel_format)
|
|
1871
2540
|
V("getCodecContextWidth", bare_ffmpeg_codec_context_get_width)
|
|
@@ -1882,6 +2551,8 @@ bare_ffmpeg_exports(js_env_t *env, js_value_t *exports) {
|
|
|
1882
2551
|
V("setCodecContextSampleRate", bare_ffmpeg_codec_context_set_sample_rate);
|
|
1883
2552
|
V("getCodecContextGOPSize", bare_ffmpeg_codec_context_get_gop_size)
|
|
1884
2553
|
V("setCodecContextGOPSize", bare_ffmpeg_codec_context_set_gop_size)
|
|
2554
|
+
V("getCodecContextFramerate", bare_ffmpeg_codec_context_get_framerate)
|
|
2555
|
+
V("setCodecContextFramerate", bare_ffmpeg_codec_context_set_framerate)
|
|
1885
2556
|
|
|
1886
2557
|
V("sendCodecContextPacket", bare_ffmpeg_codec_context_send_packet)
|
|
1887
2558
|
V("receiveCodecContextPacket", bare_ffmpeg_codec_context_receive_packet)
|
|
@@ -1897,10 +2568,15 @@ bare_ffmpeg_exports(js_env_t *env, js_value_t *exports) {
|
|
|
1897
2568
|
V("getCodecParametersSampleRate", bare_ffmpeg_codec_parameters_get_sample_rate)
|
|
1898
2569
|
V("getCodecParametersNbChannels", bare_ffmpeg_codec_parameters_get_nb_channels)
|
|
1899
2570
|
V("getCodecParametersCodecType", bare_ffmpeg_codec_parameters_get_codec_type)
|
|
2571
|
+
V("getCodecParametersCodecId", bare_ffmpeg_codec_parameters_get_codec_id)
|
|
1900
2572
|
V("getCodecParametersChannelLayout", bare_ffmpeg_codec_parameters_get_channel_layout)
|
|
2573
|
+
V("getCodecParametersWidth", bare_ffmpeg_codec_parameters_get_width)
|
|
2574
|
+
V("getCodecParametersHeight", bare_ffmpeg_codec_parameters_get_height)
|
|
2575
|
+
V("getCodecParametersFramerate", bare_ffmpeg_codec_parameters_get_framerate)
|
|
1901
2576
|
|
|
1902
2577
|
V("initFrame", bare_ffmpeg_frame_init)
|
|
1903
2578
|
V("destroyFrame", bare_ffmpeg_frame_destroy)
|
|
2579
|
+
V("unrefFrame", bare_ffmpeg_frame_unref)
|
|
1904
2580
|
V("getFrameWidth", bare_ffmpeg_frame_get_width)
|
|
1905
2581
|
V("setFrameWidth", bare_ffmpeg_frame_set_width)
|
|
1906
2582
|
V("getFrameHeight", bare_ffmpeg_frame_get_height)
|
|
@@ -1914,6 +2590,12 @@ bare_ffmpeg_exports(js_env_t *env, js_value_t *exports) {
|
|
|
1914
2590
|
V("getFrameNbSamples", bare_ffmpeg_frame_get_nb_samples)
|
|
1915
2591
|
V("setFrameNbSamples", bare_ffmpeg_frame_set_nb_samples)
|
|
1916
2592
|
V("getFramePictType", bare_ffmpeg_frame_get_pict_type)
|
|
2593
|
+
V("getFramePTS", bare_ffmpeg_frame_get_pts)
|
|
2594
|
+
V("setFramePTS", bare_ffmpeg_frame_set_pts)
|
|
2595
|
+
V("getFramePacketDTS", bare_ffmpeg_frame_get_pkt_dts)
|
|
2596
|
+
V("setFramePacketDTS", bare_ffmpeg_frame_set_pkt_dts)
|
|
2597
|
+
V("getFrameTimeBase", bare_ffmpeg_frame_get_time_base)
|
|
2598
|
+
V("setFrameTimeBase", bare_ffmpeg_frame_set_time_base)
|
|
1917
2599
|
V("allocFrame", bare_ffmpeg_frame_alloc)
|
|
1918
2600
|
|
|
1919
2601
|
V("initImage", bare_ffmpeg_image_init)
|
|
@@ -1928,8 +2610,21 @@ bare_ffmpeg_exports(js_env_t *env, js_value_t *exports) {
|
|
|
1928
2610
|
V("initPacketFromBuffer", bare_ffmpeg_packet_init_from_buffer)
|
|
1929
2611
|
V("unrefPacket", bare_ffmpeg_packet_unref)
|
|
1930
2612
|
V("getPacketStreamIndex", bare_ffmpeg_packet_get_stream_index)
|
|
2613
|
+
V("setPacketStreamIndex", bare_ffmpeg_packet_set_stream_index)
|
|
1931
2614
|
V("getPacketData", bare_ffmpeg_packet_get_data)
|
|
2615
|
+
V("setPacketData", bare_ffmpeg_packet_set_data)
|
|
1932
2616
|
V("isPacketKeyframe", bare_ffmpeg_packet_is_keyframe)
|
|
2617
|
+
V("getPacketDTS", bare_ffmpeg_packet_get_dts)
|
|
2618
|
+
V("setPacketDTS", bare_ffmpeg_packet_set_dts)
|
|
2619
|
+
V("getPacketPTS", bare_ffmpeg_packet_get_pts)
|
|
2620
|
+
V("setPacketPTS", bare_ffmpeg_packet_set_pts)
|
|
2621
|
+
V("getPacketTimeBase", bare_ffmpeg_packet_get_time_base)
|
|
2622
|
+
V("setPacketTimeBase", bare_ffmpeg_packet_set_time_base)
|
|
2623
|
+
V("rescalePacketTimestamps", bare_ffmpeg_packet_rescale_ts)
|
|
2624
|
+
V("getPacketDuration", bare_ffmpeg_packet_get_duration)
|
|
2625
|
+
V("setPacketDuration", bare_ffmpeg_packet_set_duration)
|
|
2626
|
+
V("getPacketFlags", bare_ffmpeg_packet_get_flags)
|
|
2627
|
+
V("setPacketFlags", bare_ffmpeg_packet_set_flags)
|
|
1933
2628
|
|
|
1934
2629
|
V("initScaler", bare_ffmpeg_scaler_init)
|
|
1935
2630
|
V("destroyScaler", bare_ffmpeg_scaler_destroy)
|
|
@@ -1948,6 +2643,7 @@ bare_ffmpeg_exports(js_env_t *env, js_value_t *exports) {
|
|
|
1948
2643
|
|
|
1949
2644
|
V("copyChannelLayout", bare_ffmpeg_channel_layout_copy)
|
|
1950
2645
|
V("getChannelLayoutNbChannels", bare_ffmpeg_channel_layout_get_nb_channels)
|
|
2646
|
+
V("getChannelLayoutMask", bare_ffmpeg_channel_layout_get_mask)
|
|
1951
2647
|
V("channelLayoutFromMask", bare_ffmpeg_channel_layout_from_mask)
|
|
1952
2648
|
|
|
1953
2649
|
V("initAudioFifo", bare_ffmpeg_audio_fifo_init)
|
|
@@ -1959,6 +2655,8 @@ bare_ffmpeg_exports(js_env_t *env, js_value_t *exports) {
|
|
|
1959
2655
|
V("resetAudioFifo", bare_ffmpeg_audio_fifo_reset)
|
|
1960
2656
|
V("getAudioFifoSize", bare_ffmpeg_audio_fifo_size)
|
|
1961
2657
|
V("getAudioFifoSpace", bare_ffmpeg_audio_fifo_space)
|
|
2658
|
+
|
|
2659
|
+
V("rationalD2Q", bare_ffmpeg_rational_d2q)
|
|
1962
2660
|
#undef V
|
|
1963
2661
|
|
|
1964
2662
|
#define V(name) \
|
|
@@ -1970,11 +2668,38 @@ bare_ffmpeg_exports(js_env_t *env, js_value_t *exports) {
|
|
|
1970
2668
|
assert(err == 0); \
|
|
1971
2669
|
}
|
|
1972
2670
|
|
|
2671
|
+
V(AV_LOG_QUIET)
|
|
2672
|
+
V(AV_LOG_PANIC)
|
|
2673
|
+
V(AV_LOG_FATAL)
|
|
2674
|
+
V(AV_LOG_ERROR)
|
|
2675
|
+
V(AV_LOG_WARNING)
|
|
2676
|
+
V(AV_LOG_INFO)
|
|
2677
|
+
V(AV_LOG_VERBOSE)
|
|
2678
|
+
V(AV_LOG_DEBUG)
|
|
2679
|
+
V(AV_LOG_TRACE)
|
|
2680
|
+
|
|
1973
2681
|
V(AV_CODEC_ID_MJPEG)
|
|
1974
2682
|
V(AV_CODEC_ID_H264)
|
|
1975
2683
|
V(AV_CODEC_ID_AAC)
|
|
1976
2684
|
V(AV_CODEC_ID_OPUS)
|
|
1977
2685
|
V(AV_CODEC_ID_AV1)
|
|
2686
|
+
V(AV_CODEC_ID_FLAC)
|
|
2687
|
+
V(AV_CODEC_ID_MP3)
|
|
2688
|
+
|
|
2689
|
+
V(AV_CODEC_FLAG_COPY_OPAQUE)
|
|
2690
|
+
V(AV_CODEC_FLAG_FRAME_DURATION)
|
|
2691
|
+
V(AV_CODEC_FLAG_PASS1)
|
|
2692
|
+
V(AV_CODEC_FLAG_PASS2)
|
|
2693
|
+
V(AV_CODEC_FLAG_LOOP_FILTER)
|
|
2694
|
+
V(AV_CODEC_FLAG_GRAY)
|
|
2695
|
+
V(AV_CODEC_FLAG_PSNR)
|
|
2696
|
+
V(AV_CODEC_FLAG_INTERLACED_DCT)
|
|
2697
|
+
V(AV_CODEC_FLAG_LOW_DELAY)
|
|
2698
|
+
V(AV_CODEC_FLAG_GLOBAL_HEADER)
|
|
2699
|
+
V(AV_CODEC_FLAG_BITEXACT)
|
|
2700
|
+
V(AV_CODEC_FLAG_AC_PRED)
|
|
2701
|
+
V(AV_CODEC_FLAG_INTERLACED_ME)
|
|
2702
|
+
V(AV_CODEC_FLAG_CLOSED_GOP)
|
|
1978
2703
|
|
|
1979
2704
|
V(AV_PIX_FMT_RGBA)
|
|
1980
2705
|
V(AV_PIX_FMT_RGB24)
|
|
@@ -2022,6 +2747,29 @@ bare_ffmpeg_exports(js_env_t *env, js_value_t *exports) {
|
|
|
2022
2747
|
V(AV_PICTURE_TYPE_SI)
|
|
2023
2748
|
V(AV_PICTURE_TYPE_SP)
|
|
2024
2749
|
V(AV_PICTURE_TYPE_BI)
|
|
2750
|
+
|
|
2751
|
+
// InputFormat flags
|
|
2752
|
+
V(AVFMT_SHOW_IDS)
|
|
2753
|
+
V(AVFMT_GENERIC_INDEX)
|
|
2754
|
+
V(AVFMT_TS_DISCONT)
|
|
2755
|
+
V(AVFMT_NOBINSEARCH)
|
|
2756
|
+
V(AVFMT_NOGENSEARCH)
|
|
2757
|
+
V(AVFMT_NO_BYTE_SEEK)
|
|
2758
|
+
V(AVFMT_SEEK_TO_PTS)
|
|
2759
|
+
|
|
2760
|
+
// OutputFormat flags
|
|
2761
|
+
V(AVFMT_GLOBALHEADER)
|
|
2762
|
+
V(AVFMT_VARIABLE_FPS)
|
|
2763
|
+
V(AVFMT_NODIMENSIONS)
|
|
2764
|
+
V(AVFMT_NOSTREAMS)
|
|
2765
|
+
V(AVFMT_TS_NONSTRICT)
|
|
2766
|
+
V(AVFMT_TS_NEGATIVE)
|
|
2767
|
+
|
|
2768
|
+
// Common format flags
|
|
2769
|
+
V(AVFMT_NOFILE)
|
|
2770
|
+
V(AVFMT_NEEDNUMBER)
|
|
2771
|
+
V(AVFMT_NOTIMESTAMPS)
|
|
2772
|
+
|
|
2025
2773
|
#undef V
|
|
2026
2774
|
|
|
2027
2775
|
return exports;
|