bare-ffmpeg 1.0.0-0 → 1.0.0-1
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/CMakeLists.txt +1 -0
- package/binding.c +929 -72
- package/index.js +37 -12
- package/lib/codec-context.js +42 -10
- package/lib/codec-parameters.js +34 -1
- package/lib/codec.js +3 -0
- package/lib/constants.js +6 -1
- package/lib/dictionary.js +33 -0
- package/lib/format-context.js +66 -14
- package/lib/frame.js +39 -5
- package/lib/input-format.js +24 -0
- package/lib/io-context.js +6 -8
- package/lib/output-format.js +7 -0
- package/lib/packet.js +8 -9
- package/lib/rational.js +6 -0
- package/lib/reference-counted.js +39 -0
- package/lib/scaler.js +5 -7
- package/lib/stream.js +15 -3
- package/package.json +1 -1
- 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.c
CHANGED
|
@@ -6,14 +6,17 @@
|
|
|
6
6
|
#include <libavcodec/codec_id.h>
|
|
7
7
|
#include <libavcodec/codec_par.h>
|
|
8
8
|
#include <libavcodec/packet.h>
|
|
9
|
+
#include <libavdevice/avdevice.h>
|
|
9
10
|
#include <libavformat/avformat.h>
|
|
10
11
|
#include <libavformat/avio.h>
|
|
12
|
+
#include <libavutil/dict.h>
|
|
11
13
|
#include <libavutil/error.h>
|
|
12
14
|
#include <libavutil/frame.h>
|
|
13
15
|
#include <libavutil/imgutils.h>
|
|
14
16
|
#include <libavutil/log.h>
|
|
15
17
|
#include <libavutil/mem.h>
|
|
16
18
|
#include <libavutil/pixfmt.h>
|
|
19
|
+
#include <libavutil/rational.h>
|
|
17
20
|
#include <libswscale/swscale.h>
|
|
18
21
|
#include <stddef.h>
|
|
19
22
|
#include <stdint.h>
|
|
@@ -23,6 +26,14 @@ typedef struct {
|
|
|
23
26
|
AVIOContext *handle;
|
|
24
27
|
} bare_ffmpeg_io_context_t;
|
|
25
28
|
|
|
29
|
+
typedef struct {
|
|
30
|
+
const AVOutputFormat *handle;
|
|
31
|
+
} bare_ffmpeg_output_format_t;
|
|
32
|
+
|
|
33
|
+
typedef struct {
|
|
34
|
+
const AVInputFormat *handle;
|
|
35
|
+
} bare_ffmpeg_input_format_t;
|
|
36
|
+
|
|
26
37
|
typedef struct {
|
|
27
38
|
AVFormatContext *handle;
|
|
28
39
|
} bare_ffmpeg_format_context_t;
|
|
@@ -55,11 +66,16 @@ typedef struct {
|
|
|
55
66
|
struct SwsContext *handle;
|
|
56
67
|
} bare_ffmpeg_scaler_t;
|
|
57
68
|
|
|
69
|
+
typedef struct {
|
|
70
|
+
struct AVDictionary *handle;
|
|
71
|
+
} bare_ffmpeg_dictionary_t;
|
|
72
|
+
|
|
58
73
|
static uv_once_t bare_ffmpeg__init_guard = UV_ONCE_INIT;
|
|
59
74
|
|
|
60
75
|
static void
|
|
61
76
|
bare_ffmpeg__on_init(void) {
|
|
62
77
|
av_log_set_level(AV_LOG_ERROR);
|
|
78
|
+
avdevice_register_all();
|
|
63
79
|
}
|
|
64
80
|
|
|
65
81
|
static js_value_t *
|
|
@@ -125,7 +141,95 @@ bare_ffmpeg_io_context_destroy(js_env_t *env, js_callback_info_t *info) {
|
|
|
125
141
|
}
|
|
126
142
|
|
|
127
143
|
static js_value_t *
|
|
128
|
-
|
|
144
|
+
bare_ffmpeg_output_format_init(js_env_t *env, js_callback_info_t *info) {
|
|
145
|
+
int err;
|
|
146
|
+
|
|
147
|
+
size_t argc = 1;
|
|
148
|
+
js_value_t *argv[1];
|
|
149
|
+
|
|
150
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
|
|
151
|
+
assert(err == 0);
|
|
152
|
+
|
|
153
|
+
assert(argc == 1);
|
|
154
|
+
|
|
155
|
+
size_t len;
|
|
156
|
+
err = js_get_value_string_utf8(env, argv[0], NULL, 0, &len);
|
|
157
|
+
assert(err == 0);
|
|
158
|
+
|
|
159
|
+
len += +1 /* NULL */;
|
|
160
|
+
|
|
161
|
+
utf8_t *name = malloc(len);
|
|
162
|
+
err = js_get_value_string_utf8(env, argv[0], name, len, NULL);
|
|
163
|
+
assert(err == 0);
|
|
164
|
+
|
|
165
|
+
const AVOutputFormat *format = av_guess_format((const char *) name, NULL, NULL);
|
|
166
|
+
|
|
167
|
+
if (format == NULL) {
|
|
168
|
+
err = js_throw_errorf(env, NULL, "No output format found for name '%s'", name);
|
|
169
|
+
assert(err == 0);
|
|
170
|
+
free(name);
|
|
171
|
+
|
|
172
|
+
return NULL;
|
|
173
|
+
}
|
|
174
|
+
free(name);
|
|
175
|
+
|
|
176
|
+
js_value_t *handle;
|
|
177
|
+
|
|
178
|
+
bare_ffmpeg_output_format_t *context;
|
|
179
|
+
err = js_create_arraybuffer(env, sizeof(bare_ffmpeg_output_format_t), (void **) &context, &handle);
|
|
180
|
+
assert(err == 0);
|
|
181
|
+
|
|
182
|
+
context->handle = format;
|
|
183
|
+
|
|
184
|
+
return handle;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
static js_value_t *
|
|
188
|
+
bare_ffmpeg_input_format_init(js_env_t *env, js_callback_info_t *info) {
|
|
189
|
+
int err;
|
|
190
|
+
|
|
191
|
+
size_t argc = 1;
|
|
192
|
+
js_value_t *argv[1];
|
|
193
|
+
|
|
194
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
|
|
195
|
+
assert(err == 0);
|
|
196
|
+
|
|
197
|
+
assert(argc == 1);
|
|
198
|
+
|
|
199
|
+
size_t len;
|
|
200
|
+
err = js_get_value_string_utf8(env, argv[0], NULL, 0, &len);
|
|
201
|
+
assert(err == 0);
|
|
202
|
+
|
|
203
|
+
len += +1 /* NULL */;
|
|
204
|
+
|
|
205
|
+
utf8_t *name = malloc(len);
|
|
206
|
+
err = js_get_value_string_utf8(env, argv[0], name, len, NULL);
|
|
207
|
+
assert(err == 0);
|
|
208
|
+
|
|
209
|
+
const AVInputFormat *format = av_find_input_format((const char *) name);
|
|
210
|
+
|
|
211
|
+
if (format == NULL) {
|
|
212
|
+
err = js_throw_errorf(env, NULL, "No input format found for name '%s'", name);
|
|
213
|
+
assert(err == 0);
|
|
214
|
+
free(name);
|
|
215
|
+
|
|
216
|
+
return NULL;
|
|
217
|
+
}
|
|
218
|
+
free(name);
|
|
219
|
+
|
|
220
|
+
js_value_t *handle;
|
|
221
|
+
|
|
222
|
+
bare_ffmpeg_input_format_t *context;
|
|
223
|
+
err = js_create_arraybuffer(env, sizeof(bare_ffmpeg_input_format_t), (void **) &context, &handle);
|
|
224
|
+
assert(err == 0);
|
|
225
|
+
|
|
226
|
+
context->handle = format;
|
|
227
|
+
|
|
228
|
+
return handle;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
static js_value_t *
|
|
232
|
+
bare_ffmpeg_format_context_open_input(js_env_t *env, js_callback_info_t *info) {
|
|
129
233
|
int err;
|
|
130
234
|
|
|
131
235
|
size_t argc = 1;
|
|
@@ -177,7 +281,7 @@ bare_ffmpeg_format_context_init(js_env_t *env, js_callback_info_t *info) {
|
|
|
177
281
|
}
|
|
178
282
|
|
|
179
283
|
static js_value_t *
|
|
180
|
-
|
|
284
|
+
bare_ffmpeg_format_context_close_input(js_env_t *env, js_callback_info_t *info) {
|
|
181
285
|
int err;
|
|
182
286
|
|
|
183
287
|
size_t argc = 1;
|
|
@@ -197,6 +301,68 @@ bare_ffmpeg_format_context_destroy(js_env_t *env, js_callback_info_t *info) {
|
|
|
197
301
|
return NULL;
|
|
198
302
|
}
|
|
199
303
|
|
|
304
|
+
static js_value_t *
|
|
305
|
+
bare_ffmpeg_format_context_open_output(js_env_t *env, js_callback_info_t *info) {
|
|
306
|
+
int err;
|
|
307
|
+
|
|
308
|
+
size_t argc = 2;
|
|
309
|
+
js_value_t *argv[2];
|
|
310
|
+
|
|
311
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
|
|
312
|
+
assert(err == 0);
|
|
313
|
+
|
|
314
|
+
assert(argc == 2);
|
|
315
|
+
|
|
316
|
+
bare_ffmpeg_output_format_t *format;
|
|
317
|
+
err = js_get_arraybuffer_info(env, argv[0], (void **) &format, NULL);
|
|
318
|
+
assert(err == 0);
|
|
319
|
+
|
|
320
|
+
bare_ffmpeg_io_context_t *io;
|
|
321
|
+
err = js_get_arraybuffer_info(env, argv[1], (void **) &io, NULL);
|
|
322
|
+
assert(err == 0);
|
|
323
|
+
|
|
324
|
+
js_value_t *handle;
|
|
325
|
+
|
|
326
|
+
bare_ffmpeg_format_context_t *context;
|
|
327
|
+
err = js_create_arraybuffer(env, sizeof(bare_ffmpeg_format_context_t), (void **) &context, &handle);
|
|
328
|
+
assert(err == 0);
|
|
329
|
+
|
|
330
|
+
err = avformat_alloc_output_context2(&context->handle, format->handle, NULL, NULL);
|
|
331
|
+
|
|
332
|
+
if (err < 0) {
|
|
333
|
+
err = js_throw_error(env, NULL, av_err2str(err));
|
|
334
|
+
assert(err == 0);
|
|
335
|
+
|
|
336
|
+
return NULL;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
context->handle->pb = io->handle;
|
|
340
|
+
context->handle->opaque = (void *) context;
|
|
341
|
+
|
|
342
|
+
return handle;
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
static js_value_t *
|
|
346
|
+
bare_ffmpeg_format_context_close_output(js_env_t *env, js_callback_info_t *info) {
|
|
347
|
+
int err;
|
|
348
|
+
|
|
349
|
+
size_t argc = 1;
|
|
350
|
+
js_value_t *argv[1];
|
|
351
|
+
|
|
352
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
|
|
353
|
+
assert(err == 0);
|
|
354
|
+
|
|
355
|
+
assert(argc == 1);
|
|
356
|
+
|
|
357
|
+
bare_ffmpeg_format_context_t *context;
|
|
358
|
+
err = js_get_arraybuffer_info(env, argv[0], (void **) &context, NULL);
|
|
359
|
+
assert(err == 0);
|
|
360
|
+
|
|
361
|
+
avformat_free_context(context->handle);
|
|
362
|
+
|
|
363
|
+
return NULL;
|
|
364
|
+
}
|
|
365
|
+
|
|
200
366
|
static js_value_t *
|
|
201
367
|
bare_ffmpeg_format_context_get_streams(js_env_t *env, js_callback_info_t *info) {
|
|
202
368
|
int err;
|
|
@@ -235,6 +401,44 @@ bare_ffmpeg_format_context_get_streams(js_env_t *env, js_callback_info_t *info)
|
|
|
235
401
|
return result;
|
|
236
402
|
}
|
|
237
403
|
|
|
404
|
+
static js_value_t *
|
|
405
|
+
bare_ffmpeg_format_context_create_stream(js_env_t *env, js_callback_info_t *info) {
|
|
406
|
+
int err;
|
|
407
|
+
|
|
408
|
+
size_t argc = 2;
|
|
409
|
+
js_value_t *argv[2];
|
|
410
|
+
|
|
411
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
|
|
412
|
+
assert(err == 0);
|
|
413
|
+
|
|
414
|
+
assert(argc == 2);
|
|
415
|
+
|
|
416
|
+
bare_ffmpeg_format_context_t *context;
|
|
417
|
+
err = js_get_arraybuffer_info(env, argv[0], (void **) &context, NULL);
|
|
418
|
+
assert(err == 0);
|
|
419
|
+
|
|
420
|
+
bare_ffmpeg_codec_t *codec;
|
|
421
|
+
err = js_get_arraybuffer_info(env, argv[1], (void **) &codec, NULL);
|
|
422
|
+
assert(err == 0);
|
|
423
|
+
|
|
424
|
+
js_value_t *handle;
|
|
425
|
+
|
|
426
|
+
bare_ffmpeg_stream_t *stream;
|
|
427
|
+
err = js_create_arraybuffer(env, sizeof(bare_ffmpeg_stream_t), (void **) &stream, &handle);
|
|
428
|
+
assert(err == 0);
|
|
429
|
+
|
|
430
|
+
stream->handle = avformat_new_stream(context->handle, codec->handle);
|
|
431
|
+
|
|
432
|
+
if (stream->handle == NULL) {
|
|
433
|
+
err = js_throw_error(env, NULL, av_err2str(err));
|
|
434
|
+
assert(err == 0);
|
|
435
|
+
|
|
436
|
+
return NULL;
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
return handle;
|
|
440
|
+
}
|
|
441
|
+
|
|
238
442
|
static js_value_t *
|
|
239
443
|
bare_ffmpeg_format_context_read_frame(js_env_t *env, js_callback_info_t *info) {
|
|
240
444
|
int err;
|
|
@@ -259,12 +463,16 @@ bare_ffmpeg_format_context_read_frame(js_env_t *env, js_callback_info_t *info) {
|
|
|
259
463
|
|
|
260
464
|
err = av_read_frame(context->handle, &packet->handle);
|
|
261
465
|
|
|
262
|
-
if (err < 0) {
|
|
466
|
+
if (err < 0 && err != AVERROR(EAGAIN) && err != AVERROR_EOF) {
|
|
263
467
|
err = js_throw_error(env, NULL, av_err2str(err));
|
|
264
468
|
assert(err == 0);
|
|
265
469
|
}
|
|
266
470
|
|
|
267
|
-
|
|
471
|
+
js_value_t *result;
|
|
472
|
+
err = js_get_boolean(env, err == 0, &result);
|
|
473
|
+
assert(err == 0);
|
|
474
|
+
|
|
475
|
+
return result;
|
|
268
476
|
}
|
|
269
477
|
|
|
270
478
|
static js_value_t *
|
|
@@ -393,22 +601,18 @@ static js_value_t *
|
|
|
393
601
|
bare_ffmpeg_codec_context_init(js_env_t *env, js_callback_info_t *info) {
|
|
394
602
|
int err;
|
|
395
603
|
|
|
396
|
-
size_t argc =
|
|
397
|
-
js_value_t *argv[
|
|
604
|
+
size_t argc = 1;
|
|
605
|
+
js_value_t *argv[1];
|
|
398
606
|
|
|
399
607
|
err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
|
|
400
608
|
assert(err == 0);
|
|
401
609
|
|
|
402
|
-
assert(argc ==
|
|
610
|
+
assert(argc == 1);
|
|
403
611
|
|
|
404
612
|
bare_ffmpeg_codec_t *codec;
|
|
405
613
|
err = js_get_arraybuffer_info(env, argv[0], (void **) &codec, NULL);
|
|
406
614
|
assert(err == 0);
|
|
407
615
|
|
|
408
|
-
bare_ffmpeg_codec_parameters_t *parameters;
|
|
409
|
-
err = js_get_arraybuffer_info(env, argv[1], (void **) ¶meters, NULL);
|
|
410
|
-
assert(err == 0);
|
|
411
|
-
|
|
412
616
|
js_value_t *handle;
|
|
413
617
|
|
|
414
618
|
bare_ffmpeg_codec_context_t *context;
|
|
@@ -419,33 +623,32 @@ bare_ffmpeg_codec_context_init(js_env_t *env, js_callback_info_t *info) {
|
|
|
419
623
|
|
|
420
624
|
context->handle->opaque = (void *) context;
|
|
421
625
|
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
if (err < 0) {
|
|
425
|
-
avcodec_free_context(&context->handle);
|
|
626
|
+
return handle;
|
|
627
|
+
}
|
|
426
628
|
|
|
427
|
-
|
|
428
|
-
|
|
629
|
+
static js_value_t *
|
|
630
|
+
bare_ffmpeg_codec_context_destroy(js_env_t *env, js_callback_info_t *info) {
|
|
631
|
+
int err;
|
|
429
632
|
|
|
430
|
-
|
|
431
|
-
|
|
633
|
+
size_t argc = 1;
|
|
634
|
+
js_value_t *argv[1];
|
|
432
635
|
|
|
433
|
-
err =
|
|
636
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
|
|
637
|
+
assert(err == 0);
|
|
434
638
|
|
|
435
|
-
|
|
436
|
-
avcodec_free_context(&context->handle);
|
|
639
|
+
assert(argc == 1);
|
|
437
640
|
|
|
438
|
-
|
|
439
|
-
|
|
641
|
+
bare_ffmpeg_codec_context_t *context;
|
|
642
|
+
err = js_get_arraybuffer_info(env, argv[0], (void **) &context, NULL);
|
|
643
|
+
assert(err == 0);
|
|
440
644
|
|
|
441
|
-
|
|
442
|
-
}
|
|
645
|
+
avcodec_free_context(&context->handle);
|
|
443
646
|
|
|
444
|
-
return
|
|
647
|
+
return NULL;
|
|
445
648
|
}
|
|
446
649
|
|
|
447
650
|
static js_value_t *
|
|
448
|
-
|
|
651
|
+
bare_ffmpeg_codec_context_open(js_env_t *env, js_callback_info_t *info) {
|
|
449
652
|
int err;
|
|
450
653
|
|
|
451
654
|
size_t argc = 1;
|
|
@@ -460,7 +663,12 @@ bare_ffmpeg_codec_context_destroy(js_env_t *env, js_callback_info_t *info) {
|
|
|
460
663
|
err = js_get_arraybuffer_info(env, argv[0], (void **) &context, NULL);
|
|
461
664
|
assert(err == 0);
|
|
462
665
|
|
|
463
|
-
|
|
666
|
+
err = avcodec_open2(context->handle, context->handle->codec, NULL);
|
|
667
|
+
|
|
668
|
+
if (err < 0) {
|
|
669
|
+
err = js_throw_error(env, NULL, av_err2str(err));
|
|
670
|
+
assert(err == 0);
|
|
671
|
+
}
|
|
464
672
|
|
|
465
673
|
return NULL;
|
|
466
674
|
}
|
|
@@ -489,30 +697,32 @@ bare_ffmpeg_codec_context_get_pixel_format(js_env_t *env, js_callback_info_t *in
|
|
|
489
697
|
}
|
|
490
698
|
|
|
491
699
|
static js_value_t *
|
|
492
|
-
|
|
700
|
+
bare_ffmpeg_codec_context_set_pixel_format(js_env_t *env, js_callback_info_t *info) {
|
|
493
701
|
int err;
|
|
494
702
|
|
|
495
|
-
size_t argc =
|
|
496
|
-
js_value_t *argv[
|
|
703
|
+
size_t argc = 2;
|
|
704
|
+
js_value_t *argv[2];
|
|
497
705
|
|
|
498
706
|
err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
|
|
499
707
|
assert(err == 0);
|
|
500
708
|
|
|
501
|
-
assert(argc ==
|
|
709
|
+
assert(argc == 2);
|
|
502
710
|
|
|
503
711
|
bare_ffmpeg_codec_context_t *context;
|
|
504
712
|
err = js_get_arraybuffer_info(env, argv[0], (void **) &context, NULL);
|
|
505
713
|
assert(err == 0);
|
|
506
714
|
|
|
507
|
-
|
|
508
|
-
err =
|
|
715
|
+
int64_t value;
|
|
716
|
+
err = js_get_value_int64(env, argv[1], &value);
|
|
509
717
|
assert(err == 0);
|
|
510
718
|
|
|
511
|
-
|
|
719
|
+
context->handle->pix_fmt = value;
|
|
720
|
+
|
|
721
|
+
return NULL;
|
|
512
722
|
}
|
|
513
723
|
|
|
514
724
|
static js_value_t *
|
|
515
|
-
|
|
725
|
+
bare_ffmpeg_codec_context_get_width(js_env_t *env, js_callback_info_t *info) {
|
|
516
726
|
int err;
|
|
517
727
|
|
|
518
728
|
size_t argc = 1;
|
|
@@ -528,14 +738,14 @@ bare_ffmpeg_codec_context_get_height(js_env_t *env, js_callback_info_t *info) {
|
|
|
528
738
|
assert(err == 0);
|
|
529
739
|
|
|
530
740
|
js_value_t *result;
|
|
531
|
-
err = js_create_int64(env, context->handle->
|
|
741
|
+
err = js_create_int64(env, context->handle->width, &result);
|
|
532
742
|
assert(err == 0);
|
|
533
743
|
|
|
534
744
|
return result;
|
|
535
745
|
}
|
|
536
746
|
|
|
537
747
|
static js_value_t *
|
|
538
|
-
|
|
748
|
+
bare_ffmpeg_codec_context_set_width(js_env_t *env, js_callback_info_t *info) {
|
|
539
749
|
int err;
|
|
540
750
|
|
|
541
751
|
size_t argc = 2;
|
|
@@ -550,69 +760,460 @@ bare_ffmpeg_codec_context_send_packet(js_env_t *env, js_callback_info_t *info) {
|
|
|
550
760
|
err = js_get_arraybuffer_info(env, argv[0], (void **) &context, NULL);
|
|
551
761
|
assert(err == 0);
|
|
552
762
|
|
|
553
|
-
|
|
554
|
-
err =
|
|
763
|
+
int64_t value;
|
|
764
|
+
err = js_get_value_int64(env, argv[1], &value);
|
|
555
765
|
assert(err == 0);
|
|
556
766
|
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
if (err < 0) {
|
|
560
|
-
err = js_throw_error(env, NULL, av_err2str(err));
|
|
561
|
-
assert(err == 0);
|
|
562
|
-
}
|
|
767
|
+
context->handle->width = value;
|
|
563
768
|
|
|
564
769
|
return NULL;
|
|
565
770
|
}
|
|
566
771
|
|
|
567
772
|
static js_value_t *
|
|
568
|
-
|
|
773
|
+
bare_ffmpeg_codec_context_get_height(js_env_t *env, js_callback_info_t *info) {
|
|
569
774
|
int err;
|
|
570
775
|
|
|
571
|
-
size_t argc =
|
|
572
|
-
js_value_t *argv[
|
|
776
|
+
size_t argc = 1;
|
|
777
|
+
js_value_t *argv[1];
|
|
573
778
|
|
|
574
779
|
err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
|
|
575
780
|
assert(err == 0);
|
|
576
781
|
|
|
577
|
-
assert(argc ==
|
|
782
|
+
assert(argc == 1);
|
|
578
783
|
|
|
579
784
|
bare_ffmpeg_codec_context_t *context;
|
|
580
785
|
err = js_get_arraybuffer_info(env, argv[0], (void **) &context, NULL);
|
|
581
786
|
assert(err == 0);
|
|
582
787
|
|
|
583
|
-
|
|
584
|
-
err =
|
|
788
|
+
js_value_t *result;
|
|
789
|
+
err = js_create_int64(env, context->handle->height, &result);
|
|
585
790
|
assert(err == 0);
|
|
586
791
|
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
if (err < 0) {
|
|
590
|
-
err = js_throw_error(env, NULL, av_err2str(err));
|
|
591
|
-
assert(err == 0);
|
|
592
|
-
}
|
|
593
|
-
|
|
594
|
-
return NULL;
|
|
792
|
+
return result;
|
|
595
793
|
}
|
|
596
794
|
|
|
597
795
|
static js_value_t *
|
|
598
|
-
|
|
796
|
+
bare_ffmpeg_codec_context_set_height(js_env_t *env, js_callback_info_t *info) {
|
|
599
797
|
int err;
|
|
600
798
|
|
|
601
|
-
|
|
602
|
-
|
|
799
|
+
size_t argc = 2;
|
|
800
|
+
js_value_t *argv[2];
|
|
801
|
+
|
|
802
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
|
|
803
|
+
assert(err == 0);
|
|
804
|
+
|
|
805
|
+
assert(argc == 2);
|
|
806
|
+
|
|
807
|
+
bare_ffmpeg_codec_context_t *context;
|
|
808
|
+
err = js_get_arraybuffer_info(env, argv[0], (void **) &context, NULL);
|
|
809
|
+
assert(err == 0);
|
|
810
|
+
|
|
811
|
+
int64_t value;
|
|
812
|
+
err = js_get_value_int64(env, argv[1], &value);
|
|
813
|
+
assert(err == 0);
|
|
814
|
+
|
|
815
|
+
context->handle->height = value;
|
|
816
|
+
|
|
817
|
+
return NULL;
|
|
818
|
+
}
|
|
819
|
+
|
|
820
|
+
static js_value_t *
|
|
821
|
+
bare_ffmpeg_codec_context_get_time_base(js_env_t *env, js_callback_info_t *info) {
|
|
822
|
+
int err;
|
|
823
|
+
|
|
824
|
+
size_t argc = 1;
|
|
825
|
+
js_value_t *argv[1];
|
|
826
|
+
|
|
827
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
|
|
828
|
+
assert(err == 0);
|
|
829
|
+
|
|
830
|
+
assert(argc == 1);
|
|
831
|
+
|
|
832
|
+
bare_ffmpeg_codec_context_t *context;
|
|
833
|
+
err = js_get_arraybuffer_info(env, argv[0], (void **) &context, NULL);
|
|
834
|
+
assert(err == 0);
|
|
835
|
+
|
|
836
|
+
js_value_t *result;
|
|
837
|
+
|
|
838
|
+
int32_t *data;
|
|
839
|
+
err = js_create_arraybuffer(env, 2 * sizeof(int32_t), (void **) &data, &result);
|
|
840
|
+
assert(err == 0);
|
|
841
|
+
|
|
842
|
+
data[0] = context->handle->time_base.num;
|
|
843
|
+
data[1] = context->handle->time_base.den;
|
|
844
|
+
|
|
845
|
+
return result;
|
|
846
|
+
}
|
|
847
|
+
|
|
848
|
+
static js_value_t *
|
|
849
|
+
bare_ffmpeg_codec_context_set_time_base(js_env_t *env, js_callback_info_t *info) {
|
|
850
|
+
int err;
|
|
851
|
+
|
|
852
|
+
size_t argc = 2;
|
|
853
|
+
js_value_t *argv[2];
|
|
854
|
+
|
|
855
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
|
|
856
|
+
assert(err == 0);
|
|
857
|
+
|
|
858
|
+
assert(argc == 2);
|
|
859
|
+
|
|
860
|
+
bare_ffmpeg_codec_context_t *context;
|
|
861
|
+
err = js_get_arraybuffer_info(env, argv[0], (void **) &context, NULL);
|
|
862
|
+
assert(err == 0);
|
|
863
|
+
|
|
864
|
+
int32_t *value;
|
|
865
|
+
err = js_get_arraybuffer_info(env, argv[1], (void **) &value, NULL);
|
|
866
|
+
assert(err == 0);
|
|
867
|
+
|
|
868
|
+
context->handle->time_base.num = value[0];
|
|
869
|
+
context->handle->time_base.den = value[1];
|
|
870
|
+
|
|
871
|
+
return NULL;
|
|
872
|
+
}
|
|
873
|
+
|
|
874
|
+
static js_value_t *
|
|
875
|
+
bare_ffmpeg_codec_context_send_packet(js_env_t *env, js_callback_info_t *info) {
|
|
876
|
+
int err;
|
|
877
|
+
|
|
878
|
+
size_t argc = 2;
|
|
879
|
+
js_value_t *argv[2];
|
|
880
|
+
|
|
881
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
|
|
882
|
+
assert(err == 0);
|
|
883
|
+
|
|
884
|
+
assert(argc == 2);
|
|
885
|
+
|
|
886
|
+
bare_ffmpeg_codec_context_t *context;
|
|
887
|
+
err = js_get_arraybuffer_info(env, argv[0], (void **) &context, NULL);
|
|
888
|
+
assert(err == 0);
|
|
889
|
+
|
|
890
|
+
bare_ffmpeg_packet_t *packet;
|
|
891
|
+
err = js_get_arraybuffer_info(env, argv[1], (void **) &packet, NULL);
|
|
892
|
+
assert(err == 0);
|
|
893
|
+
|
|
894
|
+
err = avcodec_send_packet(context->handle, &packet->handle);
|
|
895
|
+
|
|
896
|
+
if (err < 0) {
|
|
897
|
+
err = js_throw_error(env, NULL, av_err2str(err));
|
|
898
|
+
assert(err == 0);
|
|
899
|
+
}
|
|
900
|
+
|
|
901
|
+
return NULL;
|
|
902
|
+
}
|
|
903
|
+
|
|
904
|
+
static js_value_t *
|
|
905
|
+
bare_ffmpeg_codec_context_receive_frame(js_env_t *env, js_callback_info_t *info) {
|
|
906
|
+
int err;
|
|
907
|
+
|
|
908
|
+
size_t argc = 2;
|
|
909
|
+
js_value_t *argv[2];
|
|
910
|
+
|
|
911
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
|
|
912
|
+
assert(err == 0);
|
|
913
|
+
|
|
914
|
+
assert(argc == 2);
|
|
915
|
+
|
|
916
|
+
bare_ffmpeg_codec_context_t *context;
|
|
917
|
+
err = js_get_arraybuffer_info(env, argv[0], (void **) &context, NULL);
|
|
918
|
+
assert(err == 0);
|
|
919
|
+
|
|
920
|
+
bare_ffmpeg_frame_t *frame;
|
|
921
|
+
err = js_get_arraybuffer_info(env, argv[1], (void **) &frame, NULL);
|
|
922
|
+
assert(err == 0);
|
|
923
|
+
|
|
924
|
+
err = avcodec_receive_frame(context->handle, frame->handle);
|
|
925
|
+
|
|
926
|
+
if (err < 0 && err != AVERROR(EAGAIN) && err != AVERROR_EOF) {
|
|
927
|
+
err = js_throw_error(env, NULL, av_err2str(err));
|
|
928
|
+
assert(err == 0);
|
|
929
|
+
|
|
930
|
+
return NULL;
|
|
931
|
+
}
|
|
932
|
+
|
|
933
|
+
js_value_t *result;
|
|
934
|
+
err = js_get_boolean(env, err == 0, &result);
|
|
935
|
+
assert(err == 0);
|
|
936
|
+
|
|
937
|
+
return result;
|
|
938
|
+
}
|
|
939
|
+
|
|
940
|
+
static js_value_t *
|
|
941
|
+
bare_ffmpeg_codec_parameters_from_context(js_env_t *env, js_callback_info_t *info) {
|
|
942
|
+
int err;
|
|
943
|
+
|
|
944
|
+
size_t argc = 2;
|
|
945
|
+
js_value_t *argv[2];
|
|
946
|
+
|
|
947
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
|
|
948
|
+
assert(err == 0);
|
|
949
|
+
|
|
950
|
+
assert(argc == 2);
|
|
951
|
+
|
|
952
|
+
bare_ffmpeg_codec_parameters_t *parameters;
|
|
953
|
+
err = js_get_arraybuffer_info(env, argv[0], (void **) ¶meters, NULL);
|
|
954
|
+
assert(err == 0);
|
|
955
|
+
|
|
956
|
+
bare_ffmpeg_codec_context_t *context;
|
|
957
|
+
err = js_get_arraybuffer_info(env, argv[1], (void **) &context, NULL);
|
|
958
|
+
assert(err == 0);
|
|
959
|
+
|
|
960
|
+
err = avcodec_parameters_from_context(parameters->handle, context->handle);
|
|
961
|
+
|
|
962
|
+
if (err < 0) {
|
|
963
|
+
err = js_throw_error(env, NULL, av_err2str(err));
|
|
964
|
+
assert(err == 0);
|
|
965
|
+
|
|
966
|
+
return NULL;
|
|
967
|
+
}
|
|
968
|
+
|
|
969
|
+
return NULL;
|
|
970
|
+
}
|
|
971
|
+
|
|
972
|
+
static js_value_t *
|
|
973
|
+
bare_ffmpeg_codec_parameters_to_context(js_env_t *env, js_callback_info_t *info) {
|
|
974
|
+
int err;
|
|
975
|
+
|
|
976
|
+
size_t argc = 2;
|
|
977
|
+
js_value_t *argv[2];
|
|
978
|
+
|
|
979
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
|
|
980
|
+
assert(err == 0);
|
|
981
|
+
|
|
982
|
+
assert(argc == 2);
|
|
983
|
+
|
|
984
|
+
bare_ffmpeg_codec_context_t *context;
|
|
985
|
+
err = js_get_arraybuffer_info(env, argv[0], (void **) &context, NULL);
|
|
986
|
+
assert(err == 0);
|
|
987
|
+
|
|
988
|
+
bare_ffmpeg_codec_parameters_t *parameters;
|
|
989
|
+
err = js_get_arraybuffer_info(env, argv[1], (void **) ¶meters, NULL);
|
|
990
|
+
assert(err == 0);
|
|
991
|
+
|
|
992
|
+
err = avcodec_parameters_to_context(context->handle, parameters->handle);
|
|
993
|
+
|
|
994
|
+
if (err < 0) {
|
|
995
|
+
err = js_throw_error(env, NULL, av_err2str(err));
|
|
996
|
+
assert(err == 0);
|
|
997
|
+
|
|
998
|
+
return NULL;
|
|
999
|
+
}
|
|
1000
|
+
|
|
1001
|
+
return NULL;
|
|
1002
|
+
}
|
|
1003
|
+
|
|
1004
|
+
static js_value_t *
|
|
1005
|
+
bare_ffmpeg_codec_parameters_get_bit_rate(js_env_t *env, js_callback_info_t *info) {
|
|
1006
|
+
int err;
|
|
1007
|
+
|
|
1008
|
+
size_t argc = 1;
|
|
1009
|
+
js_value_t *argv[1];
|
|
1010
|
+
|
|
1011
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
|
|
1012
|
+
assert(err == 0);
|
|
1013
|
+
|
|
1014
|
+
assert(argc == 1);
|
|
1015
|
+
|
|
1016
|
+
bare_ffmpeg_codec_parameters_t *parameters;
|
|
1017
|
+
err = js_get_arraybuffer_info(env, argv[0], (void **) ¶meters, NULL);
|
|
1018
|
+
assert(err == 0);
|
|
1019
|
+
|
|
1020
|
+
js_value_t *result;
|
|
1021
|
+
err = js_create_int64(env, parameters->handle->bit_rate, &result);
|
|
1022
|
+
assert(err == 0);
|
|
1023
|
+
|
|
1024
|
+
return result;
|
|
1025
|
+
}
|
|
1026
|
+
|
|
1027
|
+
static js_value_t *
|
|
1028
|
+
bare_ffmpeg_codec_parameters_get_bits_per_coded_sample(js_env_t *env, js_callback_info_t *info) {
|
|
1029
|
+
int err;
|
|
1030
|
+
|
|
1031
|
+
size_t argc = 1;
|
|
1032
|
+
js_value_t *argv[1];
|
|
1033
|
+
|
|
1034
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
|
|
1035
|
+
assert(err == 0);
|
|
1036
|
+
|
|
1037
|
+
assert(argc == 1);
|
|
1038
|
+
|
|
1039
|
+
bare_ffmpeg_codec_parameters_t *parameters;
|
|
1040
|
+
err = js_get_arraybuffer_info(env, argv[0], (void **) ¶meters, NULL);
|
|
1041
|
+
assert(err == 0);
|
|
1042
|
+
|
|
1043
|
+
js_value_t *result;
|
|
1044
|
+
err = js_create_int64(env, parameters->handle->bits_per_coded_sample, &result);
|
|
1045
|
+
assert(err == 0);
|
|
1046
|
+
|
|
1047
|
+
return result;
|
|
1048
|
+
}
|
|
1049
|
+
|
|
1050
|
+
static js_value_t *
|
|
1051
|
+
bare_ffmpeg_codec_parameters_get_bits_per_raw_sample(js_env_t *env, js_callback_info_t *info) {
|
|
1052
|
+
int err;
|
|
1053
|
+
|
|
1054
|
+
size_t argc = 1;
|
|
1055
|
+
js_value_t *argv[1];
|
|
1056
|
+
|
|
1057
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
|
|
1058
|
+
assert(err == 0);
|
|
1059
|
+
|
|
1060
|
+
assert(argc == 1);
|
|
1061
|
+
|
|
1062
|
+
bare_ffmpeg_codec_parameters_t *parameters;
|
|
1063
|
+
err = js_get_arraybuffer_info(env, argv[0], (void **) ¶meters, NULL);
|
|
1064
|
+
assert(err == 0);
|
|
1065
|
+
|
|
1066
|
+
js_value_t *result;
|
|
1067
|
+
err = js_create_int64(env, parameters->handle->bits_per_raw_sample, &result);
|
|
1068
|
+
assert(err == 0);
|
|
1069
|
+
|
|
1070
|
+
return result;
|
|
1071
|
+
}
|
|
1072
|
+
|
|
1073
|
+
static js_value_t *
|
|
1074
|
+
bare_ffmpeg_codec_parameters_get_sample_rate(js_env_t *env, js_callback_info_t *info) {
|
|
1075
|
+
int err;
|
|
1076
|
+
|
|
1077
|
+
size_t argc = 1;
|
|
1078
|
+
js_value_t *argv[1];
|
|
1079
|
+
|
|
1080
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
|
|
1081
|
+
assert(err == 0);
|
|
1082
|
+
|
|
1083
|
+
assert(argc == 1);
|
|
1084
|
+
|
|
1085
|
+
bare_ffmpeg_codec_parameters_t *parameters;
|
|
1086
|
+
err = js_get_arraybuffer_info(env, argv[0], (void **) ¶meters, NULL);
|
|
1087
|
+
assert(err == 0);
|
|
1088
|
+
|
|
1089
|
+
js_value_t *result;
|
|
1090
|
+
err = js_create_int64(env, parameters->handle->sample_rate, &result);
|
|
1091
|
+
assert(err == 0);
|
|
1092
|
+
|
|
1093
|
+
return result;
|
|
1094
|
+
}
|
|
1095
|
+
|
|
1096
|
+
static js_value_t *
|
|
1097
|
+
bare_ffmpeg_frame_init(js_env_t *env, js_callback_info_t *info) {
|
|
1098
|
+
int err;
|
|
1099
|
+
|
|
1100
|
+
js_value_t *handle;
|
|
1101
|
+
|
|
1102
|
+
bare_ffmpeg_frame_t *frame;
|
|
1103
|
+
err = js_create_arraybuffer(env, sizeof(bare_ffmpeg_frame_t), (void **) &frame, &handle);
|
|
1104
|
+
assert(err == 0);
|
|
1105
|
+
|
|
1106
|
+
frame->handle = av_frame_alloc();
|
|
1107
|
+
|
|
1108
|
+
frame->handle->opaque = (void *) frame;
|
|
1109
|
+
|
|
1110
|
+
return handle;
|
|
1111
|
+
}
|
|
1112
|
+
|
|
1113
|
+
static js_value_t *
|
|
1114
|
+
bare_ffmpeg_frame_destroy(js_env_t *env, js_callback_info_t *info) {
|
|
1115
|
+
int err;
|
|
1116
|
+
|
|
1117
|
+
size_t argc = 1;
|
|
1118
|
+
js_value_t *argv[1];
|
|
1119
|
+
|
|
1120
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
|
|
1121
|
+
assert(err == 0);
|
|
1122
|
+
|
|
1123
|
+
assert(argc == 1);
|
|
1124
|
+
|
|
603
1125
|
bare_ffmpeg_frame_t *frame;
|
|
604
|
-
err =
|
|
1126
|
+
err = js_get_arraybuffer_info(env, argv[0], (void **) &frame, NULL);
|
|
605
1127
|
assert(err == 0);
|
|
606
1128
|
|
|
607
|
-
frame->handle
|
|
1129
|
+
av_frame_free(&frame->handle);
|
|
608
1130
|
|
|
609
|
-
|
|
1131
|
+
return NULL;
|
|
1132
|
+
}
|
|
610
1133
|
|
|
611
|
-
|
|
1134
|
+
static js_value_t *
|
|
1135
|
+
bare_ffmpeg_frame_get_channel(js_env_t *env, js_callback_info_t *info) {
|
|
1136
|
+
int err;
|
|
1137
|
+
|
|
1138
|
+
size_t argc = 2;
|
|
1139
|
+
js_value_t *argv[2];
|
|
1140
|
+
|
|
1141
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
|
|
1142
|
+
assert(err == 0);
|
|
1143
|
+
|
|
1144
|
+
assert(argc == 2);
|
|
1145
|
+
|
|
1146
|
+
bare_ffmpeg_frame_t *frame;
|
|
1147
|
+
err = js_get_arraybuffer_info(env, argv[0], (void **) &frame, NULL);
|
|
1148
|
+
assert(err == 0);
|
|
1149
|
+
|
|
1150
|
+
uint32_t i;
|
|
1151
|
+
err = js_get_value_uint32(env, argv[1], &i);
|
|
1152
|
+
assert(err == 0);
|
|
1153
|
+
|
|
1154
|
+
assert(i < AV_NUM_DATA_POINTERS);
|
|
1155
|
+
|
|
1156
|
+
js_value_t *result;
|
|
1157
|
+
|
|
1158
|
+
size_t len = frame->handle->linesize[i];
|
|
1159
|
+
|
|
1160
|
+
void *data;
|
|
1161
|
+
err = js_create_unsafe_arraybuffer(env, len, &data, &result);
|
|
1162
|
+
assert(err == 0);
|
|
1163
|
+
|
|
1164
|
+
memcpy(data, frame->handle->data[i], len);
|
|
1165
|
+
|
|
1166
|
+
return result;
|
|
612
1167
|
}
|
|
613
1168
|
|
|
614
1169
|
static js_value_t *
|
|
615
|
-
|
|
1170
|
+
bare_ffmpeg_frame_get_width(js_env_t *env, js_callback_info_t *info) {
|
|
1171
|
+
int err;
|
|
1172
|
+
|
|
1173
|
+
size_t argc = 1;
|
|
1174
|
+
js_value_t *argv[1];
|
|
1175
|
+
|
|
1176
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
|
|
1177
|
+
assert(err == 0);
|
|
1178
|
+
assert(argc == 1);
|
|
1179
|
+
|
|
1180
|
+
bare_ffmpeg_frame_t *frame;
|
|
1181
|
+
err = js_get_arraybuffer_info(env, argv[0], (void **) &frame, NULL);
|
|
1182
|
+
assert(err == 0);
|
|
1183
|
+
|
|
1184
|
+
js_value_t *result;
|
|
1185
|
+
err = js_create_int32(env, frame->handle->width, &result);
|
|
1186
|
+
assert(err == 0);
|
|
1187
|
+
|
|
1188
|
+
return result;
|
|
1189
|
+
}
|
|
1190
|
+
|
|
1191
|
+
static js_value_t *
|
|
1192
|
+
bare_ffmpeg_frame_set_width(js_env_t *env, js_callback_info_t *info) {
|
|
1193
|
+
int err;
|
|
1194
|
+
|
|
1195
|
+
size_t argc = 2;
|
|
1196
|
+
js_value_t *argv[2];
|
|
1197
|
+
|
|
1198
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
|
|
1199
|
+
assert(err == 0);
|
|
1200
|
+
assert(argc == 2);
|
|
1201
|
+
|
|
1202
|
+
bare_ffmpeg_frame_t *frame;
|
|
1203
|
+
err = js_get_arraybuffer_info(env, argv[0], (void **) &frame, NULL);
|
|
1204
|
+
assert(err == 0);
|
|
1205
|
+
|
|
1206
|
+
int32_t width;
|
|
1207
|
+
err = js_get_value_int32(env, argv[1], &width);
|
|
1208
|
+
assert(err == 0);
|
|
1209
|
+
|
|
1210
|
+
frame->handle->width = width;
|
|
1211
|
+
|
|
1212
|
+
return NULL;
|
|
1213
|
+
}
|
|
1214
|
+
|
|
1215
|
+
static js_value_t *
|
|
1216
|
+
bare_ffmpeg_frame_get_height(js_env_t *env, js_callback_info_t *info) {
|
|
616
1217
|
int err;
|
|
617
1218
|
|
|
618
1219
|
size_t argc = 1;
|
|
@@ -620,14 +1221,116 @@ bare_ffmpeg_frame_destroy(js_env_t *env, js_callback_info_t *info) {
|
|
|
620
1221
|
|
|
621
1222
|
err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
|
|
622
1223
|
assert(err == 0);
|
|
1224
|
+
assert(argc == 1);
|
|
1225
|
+
|
|
1226
|
+
bare_ffmpeg_frame_t *frame;
|
|
1227
|
+
err = js_get_arraybuffer_info(env, argv[0], (void **) &frame, NULL);
|
|
1228
|
+
assert(err == 0);
|
|
1229
|
+
|
|
1230
|
+
js_value_t *result;
|
|
1231
|
+
err = js_create_int32(env, frame->handle->height, &result);
|
|
1232
|
+
assert(err == 0);
|
|
1233
|
+
|
|
1234
|
+
return result;
|
|
1235
|
+
}
|
|
1236
|
+
|
|
1237
|
+
static js_value_t *
|
|
1238
|
+
bare_ffmpeg_frame_set_height(js_env_t *env, js_callback_info_t *info) {
|
|
1239
|
+
int err;
|
|
1240
|
+
|
|
1241
|
+
size_t argc = 2;
|
|
1242
|
+
js_value_t *argv[2];
|
|
1243
|
+
|
|
1244
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
|
|
1245
|
+
assert(err == 0);
|
|
1246
|
+
assert(argc == 2);
|
|
1247
|
+
|
|
1248
|
+
bare_ffmpeg_frame_t *frame;
|
|
1249
|
+
err = js_get_arraybuffer_info(env, argv[0], (void **) &frame, NULL);
|
|
1250
|
+
assert(err == 0);
|
|
1251
|
+
|
|
1252
|
+
int32_t height;
|
|
1253
|
+
err = js_get_value_int32(env, argv[1], &height);
|
|
1254
|
+
assert(err == 0);
|
|
623
1255
|
|
|
1256
|
+
frame->handle->height = height;
|
|
1257
|
+
|
|
1258
|
+
return NULL;
|
|
1259
|
+
}
|
|
1260
|
+
|
|
1261
|
+
static js_value_t *
|
|
1262
|
+
bare_ffmpeg_frame_get_pixel_format(js_env_t *env, js_callback_info_t *info) {
|
|
1263
|
+
int err;
|
|
1264
|
+
|
|
1265
|
+
size_t argc = 1;
|
|
1266
|
+
js_value_t *argv[1];
|
|
1267
|
+
|
|
1268
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
|
|
1269
|
+
assert(err == 0);
|
|
624
1270
|
assert(argc == 1);
|
|
625
1271
|
|
|
626
1272
|
bare_ffmpeg_frame_t *frame;
|
|
627
1273
|
err = js_get_arraybuffer_info(env, argv[0], (void **) &frame, NULL);
|
|
628
1274
|
assert(err == 0);
|
|
629
1275
|
|
|
630
|
-
|
|
1276
|
+
js_value_t *result;
|
|
1277
|
+
err = js_create_int64(env, frame->handle->format, &result);
|
|
1278
|
+
assert(err == 0);
|
|
1279
|
+
|
|
1280
|
+
return result;
|
|
1281
|
+
}
|
|
1282
|
+
|
|
1283
|
+
static js_value_t *
|
|
1284
|
+
bare_ffmpeg_frame_set_pixel_format(js_env_t *env, js_callback_info_t *info) {
|
|
1285
|
+
int err;
|
|
1286
|
+
|
|
1287
|
+
size_t argc = 2;
|
|
1288
|
+
js_value_t *argv[2];
|
|
1289
|
+
|
|
1290
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
|
|
1291
|
+
assert(err == 0);
|
|
1292
|
+
assert(argc == 2);
|
|
1293
|
+
|
|
1294
|
+
bare_ffmpeg_frame_t *frame;
|
|
1295
|
+
err = js_get_arraybuffer_info(env, argv[0], (void **) &frame, NULL);
|
|
1296
|
+
assert(err == 0);
|
|
1297
|
+
|
|
1298
|
+
int64_t pixel_format;
|
|
1299
|
+
err = js_get_value_int64(env, argv[1], &pixel_format);
|
|
1300
|
+
assert(err == 0);
|
|
1301
|
+
|
|
1302
|
+
frame->handle->format = (enum AVPixelFormat) pixel_format;
|
|
1303
|
+
|
|
1304
|
+
return NULL;
|
|
1305
|
+
}
|
|
1306
|
+
|
|
1307
|
+
static js_value_t *
|
|
1308
|
+
bare_ffmpeg_frame_alloc(js_env_t *env, js_callback_info_t *info) {
|
|
1309
|
+
int err;
|
|
1310
|
+
|
|
1311
|
+
size_t argc = 2;
|
|
1312
|
+
js_value_t *argv[2];
|
|
1313
|
+
|
|
1314
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
|
|
1315
|
+
assert(err == 0);
|
|
1316
|
+
assert(argc == 2);
|
|
1317
|
+
|
|
1318
|
+
bare_ffmpeg_frame_t *frame;
|
|
1319
|
+
err = js_get_arraybuffer_info(env, argv[0], (void **) &frame, NULL);
|
|
1320
|
+
assert(err == 0);
|
|
1321
|
+
assert(frame->handle != NULL);
|
|
1322
|
+
|
|
1323
|
+
int align;
|
|
1324
|
+
err = js_get_value_int32(env, argv[1], &align);
|
|
1325
|
+
assert(err == 0);
|
|
1326
|
+
assert(frame->handle != NULL);
|
|
1327
|
+
|
|
1328
|
+
err = av_frame_get_buffer(frame->handle, align);
|
|
1329
|
+
if (err < 0) {
|
|
1330
|
+
err = js_throw_error(env, NULL, av_err2str(err));
|
|
1331
|
+
assert(err == 0);
|
|
1332
|
+
return NULL;
|
|
1333
|
+
}
|
|
631
1334
|
|
|
632
1335
|
return NULL;
|
|
633
1336
|
}
|
|
@@ -892,6 +1595,124 @@ bare_ffmpeg_scaler_scale(js_env_t *env, js_callback_info_t *info) {
|
|
|
892
1595
|
return result;
|
|
893
1596
|
}
|
|
894
1597
|
|
|
1598
|
+
static js_value_t *
|
|
1599
|
+
bare_ffmpeg_dictionary_init(js_env_t *env, js_callback_info_t *info) {
|
|
1600
|
+
int err;
|
|
1601
|
+
js_value_t *handle;
|
|
1602
|
+
|
|
1603
|
+
bare_ffmpeg_dictionary_t *dict;
|
|
1604
|
+
err = js_create_arraybuffer(env, sizeof(bare_ffmpeg_dictionary_t), (void **) &dict, &handle);
|
|
1605
|
+
assert(err == 0);
|
|
1606
|
+
|
|
1607
|
+
dict->handle = NULL;
|
|
1608
|
+
|
|
1609
|
+
return handle;
|
|
1610
|
+
}
|
|
1611
|
+
|
|
1612
|
+
static js_value_t *
|
|
1613
|
+
bare_ffmpeg_dictionary_destroy(js_env_t *env, js_callback_info_t *info) {
|
|
1614
|
+
int err;
|
|
1615
|
+
|
|
1616
|
+
size_t argc = 1;
|
|
1617
|
+
js_value_t *argv[1];
|
|
1618
|
+
|
|
1619
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
|
|
1620
|
+
assert(err == 0);
|
|
1621
|
+
assert(argc == 1);
|
|
1622
|
+
|
|
1623
|
+
bare_ffmpeg_dictionary_t *dict;
|
|
1624
|
+
err = js_get_arraybuffer_info(env, argv[0], (void **) &dict, NULL);
|
|
1625
|
+
assert(err == 0);
|
|
1626
|
+
|
|
1627
|
+
av_dict_free(&dict->handle);
|
|
1628
|
+
|
|
1629
|
+
return NULL;
|
|
1630
|
+
}
|
|
1631
|
+
|
|
1632
|
+
static js_value_t *
|
|
1633
|
+
bare_ffmpeg_dictionary_set_entry(js_env_t *env, js_callback_info_t *info) {
|
|
1634
|
+
int err;
|
|
1635
|
+
|
|
1636
|
+
size_t argc = 3;
|
|
1637
|
+
js_value_t *argv[3];
|
|
1638
|
+
|
|
1639
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
|
|
1640
|
+
assert(err == 0);
|
|
1641
|
+
assert(argc == 3);
|
|
1642
|
+
|
|
1643
|
+
bare_ffmpeg_dictionary_t *dict;
|
|
1644
|
+
err = js_get_arraybuffer_info(env, argv[0], (void **) &dict, NULL);
|
|
1645
|
+
assert(err == 0);
|
|
1646
|
+
|
|
1647
|
+
size_t len;
|
|
1648
|
+
err = js_get_value_string_utf8(env, argv[1], NULL, 0, &len);
|
|
1649
|
+
assert(err == 0);
|
|
1650
|
+
|
|
1651
|
+
len += +1 /* NULL */;
|
|
1652
|
+
|
|
1653
|
+
utf8_t *key = malloc(len);
|
|
1654
|
+
err = js_get_value_string_utf8(env, argv[1], key, len, NULL);
|
|
1655
|
+
assert(err == 0);
|
|
1656
|
+
|
|
1657
|
+
err = js_get_value_string_utf8(env, argv[2], NULL, 0, &len);
|
|
1658
|
+
assert(err == 0);
|
|
1659
|
+
|
|
1660
|
+
len += +1 /* NULL */;
|
|
1661
|
+
|
|
1662
|
+
utf8_t *value = malloc(len);
|
|
1663
|
+
err = js_get_value_string_utf8(env, argv[2], value, len, NULL);
|
|
1664
|
+
assert(err == 0);
|
|
1665
|
+
|
|
1666
|
+
err = av_dict_set(&dict->handle, (const char *) key, (const char *) value, 0);
|
|
1667
|
+
assert(err == 0);
|
|
1668
|
+
free(key);
|
|
1669
|
+
free(value);
|
|
1670
|
+
|
|
1671
|
+
return NULL;
|
|
1672
|
+
}
|
|
1673
|
+
|
|
1674
|
+
static js_value_t *
|
|
1675
|
+
bare_ffmpeg_dictionary_get_entry(js_env_t *env, js_callback_info_t *info) {
|
|
1676
|
+
int err;
|
|
1677
|
+
|
|
1678
|
+
size_t argc = 2;
|
|
1679
|
+
js_value_t *argv[2];
|
|
1680
|
+
|
|
1681
|
+
err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
|
|
1682
|
+
assert(err == 0);
|
|
1683
|
+
assert(argc == 2);
|
|
1684
|
+
|
|
1685
|
+
bare_ffmpeg_dictionary_t *dict;
|
|
1686
|
+
err = js_get_arraybuffer_info(env, argv[0], (void **) &dict, NULL);
|
|
1687
|
+
assert(err == 0);
|
|
1688
|
+
|
|
1689
|
+
size_t len;
|
|
1690
|
+
err = js_get_value_string_utf8(env, argv[1], NULL, 0, &len);
|
|
1691
|
+
assert(err == 0);
|
|
1692
|
+
|
|
1693
|
+
len += +1 /* NULL */;
|
|
1694
|
+
|
|
1695
|
+
utf8_t *key = malloc(len);
|
|
1696
|
+
err = js_get_value_string_utf8(env, argv[1], key, len, NULL);
|
|
1697
|
+
assert(err == 0);
|
|
1698
|
+
|
|
1699
|
+
AVDictionaryEntry *entry = av_dict_get(dict->handle, (const char *) key, NULL, 0);
|
|
1700
|
+
free(key);
|
|
1701
|
+
|
|
1702
|
+
if (entry == NULL) {
|
|
1703
|
+
js_value_t *result;
|
|
1704
|
+
err = js_get_null(env, &result);
|
|
1705
|
+
assert(err == 0);
|
|
1706
|
+
return result;
|
|
1707
|
+
}
|
|
1708
|
+
|
|
1709
|
+
js_value_t *result;
|
|
1710
|
+
err = js_create_string_utf8(env, (const utf8_t *) entry->value, -1, &result);
|
|
1711
|
+
assert(err == 0);
|
|
1712
|
+
|
|
1713
|
+
return result;
|
|
1714
|
+
}
|
|
1715
|
+
|
|
895
1716
|
static js_value_t *
|
|
896
1717
|
bare_ffmpeg_exports(js_env_t *env, js_value_t *exports) {
|
|
897
1718
|
uv_once(&bare_ffmpeg__init_guard, bare_ffmpeg__on_init);
|
|
@@ -910,9 +1731,15 @@ bare_ffmpeg_exports(js_env_t *env, js_value_t *exports) {
|
|
|
910
1731
|
V("initIOContext", bare_ffmpeg_io_context_init)
|
|
911
1732
|
V("destroyIOContext", bare_ffmpeg_io_context_destroy)
|
|
912
1733
|
|
|
913
|
-
V("
|
|
914
|
-
V("
|
|
1734
|
+
V("initOutputFormat", bare_ffmpeg_output_format_init)
|
|
1735
|
+
V("initInputFormat", bare_ffmpeg_input_format_init)
|
|
1736
|
+
|
|
1737
|
+
V("openInputFormatContext", bare_ffmpeg_format_context_open_input)
|
|
1738
|
+
V("closeInputFormatContext", bare_ffmpeg_format_context_close_input)
|
|
1739
|
+
V("openOutputFormatContext", bare_ffmpeg_format_context_open_output)
|
|
1740
|
+
V("closeOutputFormatContext", bare_ffmpeg_format_context_close_output)
|
|
915
1741
|
V("getFormatContextStreams", bare_ffmpeg_format_context_get_streams)
|
|
1742
|
+
V("createFormatContextStream", bare_ffmpeg_format_context_create_stream)
|
|
916
1743
|
V("readFormatContextFrame", bare_ffmpeg_format_context_read_frame)
|
|
917
1744
|
|
|
918
1745
|
V("getStreamCodec", bare_ffmpeg_stream_get_codec)
|
|
@@ -923,14 +1750,35 @@ bare_ffmpeg_exports(js_env_t *env, js_value_t *exports) {
|
|
|
923
1750
|
|
|
924
1751
|
V("initCodecContext", bare_ffmpeg_codec_context_init)
|
|
925
1752
|
V("destroyCodecContext", bare_ffmpeg_codec_context_destroy)
|
|
1753
|
+
V("openCodecContext", bare_ffmpeg_codec_context_open)
|
|
926
1754
|
V("getCodecContextPixelFormat", bare_ffmpeg_codec_context_get_pixel_format)
|
|
1755
|
+
V("setCodecContextPixelFormat", bare_ffmpeg_codec_context_set_pixel_format)
|
|
927
1756
|
V("getCodecContextWidth", bare_ffmpeg_codec_context_get_width)
|
|
1757
|
+
V("setCodecContextWidth", bare_ffmpeg_codec_context_set_width)
|
|
928
1758
|
V("getCodecContextHeight", bare_ffmpeg_codec_context_get_height)
|
|
1759
|
+
V("setCodecContextHeight", bare_ffmpeg_codec_context_set_height)
|
|
1760
|
+
V("getCodecContextTimeBase", bare_ffmpeg_codec_context_get_time_base)
|
|
1761
|
+
V("setCodecContextTimeBase", bare_ffmpeg_codec_context_set_time_base)
|
|
929
1762
|
V("sendCodecContextPacket", bare_ffmpeg_codec_context_send_packet)
|
|
930
1763
|
V("receiveCodecContextFrame", bare_ffmpeg_codec_context_receive_frame)
|
|
931
1764
|
|
|
1765
|
+
V("codecParametersFromContext", bare_ffmpeg_codec_parameters_from_context)
|
|
1766
|
+
V("codecParametersToContext", bare_ffmpeg_codec_parameters_to_context)
|
|
1767
|
+
V("getCodecParametersBitRate", bare_ffmpeg_codec_parameters_get_bit_rate)
|
|
1768
|
+
V("getCodecParametersBitsPerCodedSample", bare_ffmpeg_codec_parameters_get_bits_per_coded_sample)
|
|
1769
|
+
V("getCodecParametersBitsPerRawSample", bare_ffmpeg_codec_parameters_get_bits_per_raw_sample)
|
|
1770
|
+
V("getCodecParametersSampleRate", bare_ffmpeg_codec_parameters_get_sample_rate)
|
|
1771
|
+
|
|
932
1772
|
V("initFrame", bare_ffmpeg_frame_init)
|
|
933
1773
|
V("destroyFrame", bare_ffmpeg_frame_destroy)
|
|
1774
|
+
V("getFrameChannel", bare_ffmpeg_frame_get_channel)
|
|
1775
|
+
V("getFrameWidth", bare_ffmpeg_frame_get_width)
|
|
1776
|
+
V("setFrameWidth", bare_ffmpeg_frame_set_width)
|
|
1777
|
+
V("getFrameHeight", bare_ffmpeg_frame_get_height)
|
|
1778
|
+
V("setFrameHeight", bare_ffmpeg_frame_set_height)
|
|
1779
|
+
V("getFramePixelFormat", bare_ffmpeg_frame_get_pixel_format)
|
|
1780
|
+
V("setFramePixelFormat", bare_ffmpeg_frame_set_pixel_format)
|
|
1781
|
+
V("allocFrame", bare_ffmpeg_frame_alloc)
|
|
934
1782
|
|
|
935
1783
|
V("initImage", bare_ffmpeg_image_init)
|
|
936
1784
|
V("fillImage", bare_ffmpeg_image_fill)
|
|
@@ -942,6 +1790,11 @@ bare_ffmpeg_exports(js_env_t *env, js_value_t *exports) {
|
|
|
942
1790
|
V("initScaler", bare_ffmpeg_scaler_init)
|
|
943
1791
|
V("destroyScaler", bare_ffmpeg_scaler_destroy)
|
|
944
1792
|
V("scaleScaler", bare_ffmpeg_scaler_scale)
|
|
1793
|
+
|
|
1794
|
+
V("initDictionary", bare_ffmpeg_dictionary_init)
|
|
1795
|
+
V("destroyDictionary", bare_ffmpeg_dictionary_destroy)
|
|
1796
|
+
V("getDictionaryEntry", bare_ffmpeg_dictionary_get_entry)
|
|
1797
|
+
V("setDictionaryEntry", bare_ffmpeg_dictionary_set_entry)
|
|
945
1798
|
#undef V
|
|
946
1799
|
|
|
947
1800
|
#define V(name) \
|
|
@@ -953,7 +1806,11 @@ bare_ffmpeg_exports(js_env_t *env, js_value_t *exports) {
|
|
|
953
1806
|
assert(err == 0); \
|
|
954
1807
|
}
|
|
955
1808
|
|
|
1809
|
+
V(AV_CODEC_ID_MJPEG)
|
|
1810
|
+
|
|
956
1811
|
V(AV_PIX_FMT_RGBA)
|
|
1812
|
+
V(AV_PIX_FMT_YUVJ420P)
|
|
1813
|
+
V(AV_PIX_FMT_YUV420P)
|
|
957
1814
|
#undef V
|
|
958
1815
|
|
|
959
1816
|
return exports;
|