@lumen5/beamcoder 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/.circleci/config.yml +41 -0
- package/.circleci/images/testbeam10-4.1/Dockerfile +12 -0
- package/.circleci/test_image/Dockerfile +14 -0
- package/.circleci/test_image/build.md +13 -0
- package/.eslintrc.js +27 -0
- package/.github/workflows/publish-npm.yml +33 -0
- package/LICENSE +674 -0
- package/README.md +1221 -0
- package/beamstreams.js +692 -0
- package/binding.gyp +103 -0
- package/examples/encode_h264.js +92 -0
- package/examples/jpeg_app.js +55 -0
- package/examples/jpeg_filter_app.js +101 -0
- package/examples/make_mp4.js +123 -0
- package/images/beamcoder_small.jpg +0 -0
- package/index.d.ts +83 -0
- package/index.js +44 -0
- package/install_ffmpeg.js +240 -0
- package/package.json +45 -0
- package/scratch/decode_aac.js +38 -0
- package/scratch/decode_avci.js +50 -0
- package/scratch/decode_hevc.js +38 -0
- package/scratch/decode_pcm.js +39 -0
- package/scratch/make_a_mux.js +68 -0
- package/scratch/muxer.js +74 -0
- package/scratch/read_wav.js +35 -0
- package/scratch/simple_mux.js +39 -0
- package/scratch/stream_avci.js +127 -0
- package/scratch/stream_mp4.js +78 -0
- package/scratch/stream_mux.js +47 -0
- package/scratch/stream_pcm.js +82 -0
- package/scratch/stream_wav.js +62 -0
- package/scripts/install_beamcoder_dependencies.sh +25 -0
- package/src/adaptor.h +202 -0
- package/src/beamcoder.cc +937 -0
- package/src/beamcoder_util.cc +1129 -0
- package/src/beamcoder_util.h +206 -0
- package/src/codec.cc +7386 -0
- package/src/codec.h +44 -0
- package/src/codec_par.cc +1818 -0
- package/src/codec_par.h +40 -0
- package/src/decode.cc +569 -0
- package/src/decode.h +75 -0
- package/src/demux.cc +584 -0
- package/src/demux.h +88 -0
- package/src/encode.cc +496 -0
- package/src/encode.h +72 -0
- package/src/filter.cc +1888 -0
- package/src/filter.h +30 -0
- package/src/format.cc +5287 -0
- package/src/format.h +77 -0
- package/src/frame.cc +2681 -0
- package/src/frame.h +52 -0
- package/src/governor.cc +286 -0
- package/src/governor.h +30 -0
- package/src/hwcontext.cc +378 -0
- package/src/hwcontext.h +35 -0
- package/src/log.cc +186 -0
- package/src/log.h +20 -0
- package/src/mux.cc +834 -0
- package/src/mux.h +106 -0
- package/src/packet.cc +762 -0
- package/src/packet.h +49 -0
- package/test/codecParamsSpec.js +148 -0
- package/test/decoderSpec.js +56 -0
- package/test/demuxerSpec.js +41 -0
- package/test/encoderSpec.js +69 -0
- package/test/filtererSpec.js +47 -0
- package/test/formatSpec.js +343 -0
- package/test/frameSpec.js +145 -0
- package/test/introspectionSpec.js +73 -0
- package/test/muxerSpec.js +34 -0
- package/test/packetSpec.js +122 -0
- package/types/Beamstreams.d.ts +98 -0
- package/types/Codec.d.ts +123 -0
- package/types/CodecContext.d.ts +555 -0
- package/types/CodecPar.d.ts +108 -0
- package/types/Decoder.d.ts +137 -0
- package/types/Demuxer.d.ts +113 -0
- package/types/Encoder.d.ts +94 -0
- package/types/Filter.d.ts +324 -0
- package/types/FormatContext.d.ts +380 -0
- package/types/Frame.d.ts +295 -0
- package/types/HWContext.d.ts +62 -0
- package/types/Muxer.d.ts +121 -0
- package/types/Packet.d.ts +82 -0
- package/types/PrivClass.d.ts +25 -0
- package/types/Stream.d.ts +165 -0
|
@@ -0,0 +1,1129 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Aerostat Beam Coder - Node.js native bindings for FFmpeg.
|
|
3
|
+
Copyright (C) 2019 Streampunk Media Ltd.
|
|
4
|
+
|
|
5
|
+
This program is free software: you can redistribute it and/or modify
|
|
6
|
+
it under the terms of the GNU General Public License as published by
|
|
7
|
+
the Free Software Foundation, either version 3 of the License, or
|
|
8
|
+
(at your option) any later version.
|
|
9
|
+
|
|
10
|
+
This program is distributed in the hope that it will be useful,
|
|
11
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13
|
+
GNU General Public License for more details.
|
|
14
|
+
|
|
15
|
+
You should have received a copy of the GNU General Public License
|
|
16
|
+
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
17
|
+
|
|
18
|
+
https://www.streampunk.media/ mailto:furnace@streampunk.media
|
|
19
|
+
14 Ormiscaig, Aultbea, Achnasheen, IV22 2JJ U.K.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
#include <assert.h>
|
|
23
|
+
#include <stdio.h>
|
|
24
|
+
#include <stdlib.h>
|
|
25
|
+
#include <chrono>
|
|
26
|
+
#include <string>
|
|
27
|
+
#include "beamcoder_util.h"
|
|
28
|
+
#include "node_api.h"
|
|
29
|
+
|
|
30
|
+
napi_status checkStatus(napi_env env, napi_status status,
|
|
31
|
+
const char* file, uint32_t line) {
|
|
32
|
+
|
|
33
|
+
napi_status infoStatus, throwStatus;
|
|
34
|
+
const napi_extended_error_info *errorInfo;
|
|
35
|
+
|
|
36
|
+
if (status == napi_ok) {
|
|
37
|
+
// printf("Received status OK.\n");
|
|
38
|
+
return status;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
infoStatus = napi_get_last_error_info(env, &errorInfo);
|
|
42
|
+
assert(infoStatus == napi_ok);
|
|
43
|
+
printf("NAPI error in file %s on line %i. Error %i: %s\n", file, line,
|
|
44
|
+
errorInfo->error_code, errorInfo->error_message);
|
|
45
|
+
|
|
46
|
+
if (status == napi_pending_exception) {
|
|
47
|
+
printf("NAPI pending exception. Engine error code: %i\n", errorInfo->engine_error_code);
|
|
48
|
+
return status;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
char errorCode[20];
|
|
52
|
+
sprintf(errorCode, "%d", errorInfo->error_code);
|
|
53
|
+
throwStatus = napi_throw_error(env, errorCode, errorInfo->error_message);
|
|
54
|
+
assert(throwStatus == napi_ok);
|
|
55
|
+
|
|
56
|
+
return napi_pending_exception; // Expect to be cast to void
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
long long microTime(std::chrono::high_resolution_clock::time_point start) {
|
|
60
|
+
auto elapsed = std::chrono::high_resolution_clock::now() - start;
|
|
61
|
+
return std::chrono::duration_cast<std::chrono::microseconds>(elapsed).count();
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const char* getNapiTypeName(napi_valuetype t) {
|
|
65
|
+
switch (t) {
|
|
66
|
+
case napi_undefined: return "undefined";
|
|
67
|
+
case napi_null: return "null";
|
|
68
|
+
case napi_boolean: return "boolean";
|
|
69
|
+
case napi_number: return "number";
|
|
70
|
+
case napi_string: return "string";
|
|
71
|
+
case napi_symbol: return "symbol";
|
|
72
|
+
case napi_object: return "object";
|
|
73
|
+
case napi_function: return "function";
|
|
74
|
+
case napi_external: return "external";
|
|
75
|
+
default: return "unknown";
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
napi_status checkArgs(napi_env env, napi_callback_info info, char* methodName,
|
|
80
|
+
napi_value* args, size_t argc, napi_valuetype* types) {
|
|
81
|
+
|
|
82
|
+
napi_status status;
|
|
83
|
+
|
|
84
|
+
size_t realArgc = argc;
|
|
85
|
+
status = napi_get_cb_info(env, info, &realArgc, args, nullptr, nullptr);
|
|
86
|
+
PASS_STATUS;
|
|
87
|
+
|
|
88
|
+
if (realArgc != argc) {
|
|
89
|
+
char errorMsg[100];
|
|
90
|
+
sprintf(errorMsg, "For method %s, expected %zi arguments and got %zi.",
|
|
91
|
+
methodName, argc, realArgc);
|
|
92
|
+
napi_throw_error(env, nullptr, errorMsg);
|
|
93
|
+
return napi_pending_exception;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
napi_valuetype t;
|
|
97
|
+
for ( size_t x = 0 ; x < argc ; x++ ) {
|
|
98
|
+
status = napi_typeof(env, args[x], &t);
|
|
99
|
+
PASS_STATUS;
|
|
100
|
+
if (t != types[x]) {
|
|
101
|
+
char errorMsg[100];
|
|
102
|
+
sprintf(errorMsg, "For method %s argument %zu, expected type %s and got %s.",
|
|
103
|
+
methodName, x + 1, getNapiTypeName(types[x]), getNapiTypeName(t));
|
|
104
|
+
napi_throw_error(env, nullptr, errorMsg);
|
|
105
|
+
return napi_pending_exception;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return napi_ok;
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
void tidyCarrier(napi_env env, carrier* c) {
|
|
114
|
+
napi_status status;
|
|
115
|
+
if (c->passthru != nullptr) {
|
|
116
|
+
status = napi_delete_reference(env, c->passthru);
|
|
117
|
+
FLOATING_STATUS;
|
|
118
|
+
}
|
|
119
|
+
if (c->_request != nullptr) {
|
|
120
|
+
status = napi_delete_async_work(env, c->_request);
|
|
121
|
+
FLOATING_STATUS;
|
|
122
|
+
}
|
|
123
|
+
// printf("Tidying carrier %p %p\n", c->passthru, c->_request);
|
|
124
|
+
delete c;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
int32_t rejectStatus(napi_env env, carrier* c, char* file, int32_t line) {
|
|
128
|
+
if (c->status != BEAMCODER_SUCCESS) {
|
|
129
|
+
napi_value errorValue, errorCode, errorMsg;
|
|
130
|
+
napi_status status;
|
|
131
|
+
if (c->status < BEAMCODER_ERROR_START) {
|
|
132
|
+
const napi_extended_error_info *errorInfo;
|
|
133
|
+
status = napi_get_last_error_info(env, &errorInfo);
|
|
134
|
+
FLOATING_STATUS;
|
|
135
|
+
c->errorMsg = std::string(
|
|
136
|
+
(errorInfo->error_message != nullptr) ? errorInfo->error_message : "(no message)");
|
|
137
|
+
}
|
|
138
|
+
char* extMsg = (char *) malloc(sizeof(char) * c->errorMsg.length() + 200);
|
|
139
|
+
sprintf(extMsg, "In file %s on line %i, found error: %s", file, line, c->errorMsg.c_str());
|
|
140
|
+
char errorCodeChars[20];
|
|
141
|
+
sprintf(errorCodeChars, "%d", c->status);
|
|
142
|
+
status = napi_create_string_utf8(env, errorCodeChars,
|
|
143
|
+
NAPI_AUTO_LENGTH, &errorCode);
|
|
144
|
+
FLOATING_STATUS;
|
|
145
|
+
status = napi_create_string_utf8(env, extMsg, NAPI_AUTO_LENGTH, &errorMsg);
|
|
146
|
+
FLOATING_STATUS;
|
|
147
|
+
status = napi_create_error(env, errorCode, errorMsg, &errorValue);
|
|
148
|
+
FLOATING_STATUS;
|
|
149
|
+
status = napi_reject_deferred(env, c->_deferred, errorValue);
|
|
150
|
+
FLOATING_STATUS;
|
|
151
|
+
|
|
152
|
+
delete[] extMsg;
|
|
153
|
+
tidyCarrier(env, c);
|
|
154
|
+
}
|
|
155
|
+
return c->status;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// Should never get called
|
|
159
|
+
napi_value nop(napi_env env, napi_callback_info info) {
|
|
160
|
+
napi_value value;
|
|
161
|
+
napi_status status;
|
|
162
|
+
status = napi_get_undefined(env, &value);
|
|
163
|
+
if (status != napi_ok) NAPI_THROW_ERROR("Failed to retrieve undefined in nop.");
|
|
164
|
+
return value;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
char* avErrorMsg(const char* base, int avError) {
|
|
168
|
+
char errMsg[AV_ERROR_MAX_STRING_SIZE];
|
|
169
|
+
char* both;
|
|
170
|
+
int ret = av_strerror(avError, errMsg, AV_ERROR_MAX_STRING_SIZE);
|
|
171
|
+
if (ret < 0) {
|
|
172
|
+
strcpy(errMsg, "Unable to create AV error string.");
|
|
173
|
+
}
|
|
174
|
+
size_t len = strlen(base) + strlen(errMsg);
|
|
175
|
+
both = (char*) malloc(sizeof(char) * (len + 1));
|
|
176
|
+
both[0] = '\0';
|
|
177
|
+
strcat(both, base);
|
|
178
|
+
strcat(both, errMsg);
|
|
179
|
+
return both;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
napi_status beam_set_uint32(napi_env env, napi_value target, const char* name, uint32_t value) {
|
|
183
|
+
napi_status status;
|
|
184
|
+
napi_value prop;
|
|
185
|
+
status = napi_create_uint32(env, value, &prop);
|
|
186
|
+
PASS_STATUS;
|
|
187
|
+
return napi_set_named_property(env, target, name, prop);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
napi_status beam_get_uint32(napi_env env, napi_value target, char* name, uint32_t* value) {
|
|
191
|
+
napi_status status;
|
|
192
|
+
napi_value prop;
|
|
193
|
+
status = napi_get_named_property(env, target, name, &prop);
|
|
194
|
+
PASS_STATUS;
|
|
195
|
+
status = napi_get_value_uint32(env, prop, value);
|
|
196
|
+
ACCEPT_STATUS(napi_number_expected);
|
|
197
|
+
return napi_ok;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
napi_status beam_set_int32(napi_env env, napi_value target, const char* name, int32_t value) {
|
|
201
|
+
napi_status status;
|
|
202
|
+
napi_value prop;
|
|
203
|
+
status = napi_create_int32(env, value, &prop);
|
|
204
|
+
PASS_STATUS;
|
|
205
|
+
return napi_set_named_property(env, target, name, prop);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
napi_status beam_get_int32(napi_env env, napi_value target, const char* name, int32_t* value) {
|
|
209
|
+
napi_status status;
|
|
210
|
+
napi_value prop;
|
|
211
|
+
status = napi_get_named_property(env, target, name, &prop);
|
|
212
|
+
PASS_STATUS;
|
|
213
|
+
status = napi_get_value_int32(env, prop, value);
|
|
214
|
+
ACCEPT_STATUS(napi_number_expected);
|
|
215
|
+
return napi_ok;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
napi_status beam_set_int64(napi_env env, napi_value target, const char* name, int64_t value) {
|
|
219
|
+
napi_status status;
|
|
220
|
+
napi_value prop;
|
|
221
|
+
status = napi_create_int64(env, value, &prop);
|
|
222
|
+
PASS_STATUS;
|
|
223
|
+
return napi_set_named_property(env, target, name, prop);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
napi_status beam_get_int64(napi_env env, napi_value target, const char* name, int64_t* value) {
|
|
227
|
+
napi_status status;
|
|
228
|
+
napi_value prop;
|
|
229
|
+
status = napi_get_named_property(env, target, name, &prop);
|
|
230
|
+
PASS_STATUS;
|
|
231
|
+
status = napi_get_value_int64(env, prop, value);
|
|
232
|
+
ACCEPT_STATUS(napi_number_expected);
|
|
233
|
+
return napi_ok;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
napi_status beam_set_double(napi_env env, napi_value target, const char* name, double value) {
|
|
237
|
+
napi_status status;
|
|
238
|
+
napi_value prop;
|
|
239
|
+
status = napi_create_double(env, value, &prop);
|
|
240
|
+
PASS_STATUS;
|
|
241
|
+
return napi_set_named_property(env, target, name, prop);
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
napi_status beam_get_double(napi_env env, napi_value target, const char* name, double* value) {
|
|
245
|
+
napi_status status;
|
|
246
|
+
napi_value prop;
|
|
247
|
+
status = napi_get_named_property(env, target, name, &prop);
|
|
248
|
+
PASS_STATUS;
|
|
249
|
+
status = napi_get_value_double(env, prop, value);
|
|
250
|
+
ACCEPT_STATUS(napi_number_expected);
|
|
251
|
+
return napi_ok;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
napi_status beam_set_string_utf8(napi_env env, napi_value target, const char* name, const char* value) {
|
|
255
|
+
napi_status status;
|
|
256
|
+
napi_value prop;
|
|
257
|
+
if (value == nullptr) {
|
|
258
|
+
status = napi_get_null(env, &prop);
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
status = napi_create_string_utf8(env, value, NAPI_AUTO_LENGTH, &prop);
|
|
262
|
+
}
|
|
263
|
+
ACCEPT_STATUS(napi_string_expected);
|
|
264
|
+
return napi_set_named_property(env, target, name, prop);
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
// TODO improve memory management
|
|
268
|
+
napi_status beam_get_string_utf8(napi_env env, napi_value target, const char* name, char** value) {
|
|
269
|
+
napi_status status;
|
|
270
|
+
napi_value prop;
|
|
271
|
+
char* str;
|
|
272
|
+
size_t len;
|
|
273
|
+
status = napi_get_named_property(env, target, name, &prop);
|
|
274
|
+
PASS_STATUS;
|
|
275
|
+
status = napi_get_value_string_utf8(env, prop, nullptr, 0, &len);
|
|
276
|
+
if (status == napi_string_expected) {
|
|
277
|
+
*value = nullptr;
|
|
278
|
+
return napi_ok;
|
|
279
|
+
}
|
|
280
|
+
PASS_STATUS;
|
|
281
|
+
str = (char*) malloc(sizeof(char) * (len + 1));
|
|
282
|
+
status = napi_get_value_string_utf8(env, prop, str, len + 1, &len);
|
|
283
|
+
PASS_STATUS;
|
|
284
|
+
*value = str;
|
|
285
|
+
return napi_ok;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
napi_status beam_set_bool(napi_env env, napi_value target, const char* name, bool value) {
|
|
289
|
+
napi_status status;
|
|
290
|
+
napi_value prop;
|
|
291
|
+
status = napi_get_boolean(env, value, &prop);
|
|
292
|
+
PASS_STATUS;
|
|
293
|
+
return napi_set_named_property(env, target, name, prop);
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
napi_status beam_get_bool(napi_env env, napi_value target, const char* name, bool* present, bool* value) {
|
|
297
|
+
napi_status status;
|
|
298
|
+
napi_value prop;
|
|
299
|
+
status = napi_get_named_property(env, target, name, &prop);
|
|
300
|
+
PASS_STATUS;
|
|
301
|
+
status = napi_get_value_bool(env, prop, value);
|
|
302
|
+
if (status == napi_boolean_expected) {
|
|
303
|
+
*present = false;
|
|
304
|
+
status = napi_ok;
|
|
305
|
+
}
|
|
306
|
+
else {
|
|
307
|
+
*present = true;
|
|
308
|
+
}
|
|
309
|
+
PASS_STATUS;
|
|
310
|
+
return napi_ok;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
napi_status beam_set_rational(napi_env env, napi_value target, const char* name, AVRational value) {
|
|
314
|
+
napi_status status;
|
|
315
|
+
napi_value pair, element;
|
|
316
|
+
status = napi_create_array(env, &pair);
|
|
317
|
+
PASS_STATUS;
|
|
318
|
+
status = napi_create_int32(env, value.num, &element);
|
|
319
|
+
PASS_STATUS;
|
|
320
|
+
status = napi_set_element(env, pair, 0, element);
|
|
321
|
+
PASS_STATUS;
|
|
322
|
+
status = napi_create_int32(env, value.den, &element);
|
|
323
|
+
PASS_STATUS;
|
|
324
|
+
status = napi_set_element(env, pair, 1, element);
|
|
325
|
+
PASS_STATUS;
|
|
326
|
+
return napi_set_named_property(env, target, name, pair);
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
napi_status beam_get_rational(napi_env env, napi_value target, const char* name, AVRational* value) {
|
|
330
|
+
napi_status status;
|
|
331
|
+
napi_value prop, element;
|
|
332
|
+
int32_t num = 0, den = 1;
|
|
333
|
+
bool isArray;
|
|
334
|
+
status = napi_get_named_property(env, target, name, &prop);
|
|
335
|
+
PASS_STATUS;
|
|
336
|
+
status = napi_is_array(env, prop, &isArray);
|
|
337
|
+
PASS_STATUS;
|
|
338
|
+
if (isArray) {
|
|
339
|
+
status = napi_get_element(env, prop, 0, &element);
|
|
340
|
+
PASS_STATUS;
|
|
341
|
+
status = napi_get_value_int32(env, element, &num);
|
|
342
|
+
ACCEPT_STATUS(napi_number_expected);
|
|
343
|
+
|
|
344
|
+
status = napi_get_element(env, prop, 1, &element);
|
|
345
|
+
PASS_STATUS;
|
|
346
|
+
status = napi_get_value_int32(env, element, &den);
|
|
347
|
+
ACCEPT_STATUS(napi_number_expected);
|
|
348
|
+
}
|
|
349
|
+
*value = av_make_q(num, den);
|
|
350
|
+
return napi_ok;
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
napi_status beam_set_null(napi_env env, napi_value target, const char* name) {
|
|
354
|
+
napi_status status;
|
|
355
|
+
napi_value value;
|
|
356
|
+
status = napi_get_null(env, &value);
|
|
357
|
+
PASS_STATUS;
|
|
358
|
+
status = napi_set_named_property(env, target, name, value);
|
|
359
|
+
PASS_STATUS;
|
|
360
|
+
|
|
361
|
+
return napi_ok;
|
|
362
|
+
};
|
|
363
|
+
|
|
364
|
+
napi_status beam_is_null(napi_env env, napi_value props, const char* name, bool* isNull) {
|
|
365
|
+
napi_status status;
|
|
366
|
+
napi_value value;
|
|
367
|
+
napi_valuetype type;
|
|
368
|
+
status = napi_get_named_property(env, props, name, &value);
|
|
369
|
+
PASS_STATUS;
|
|
370
|
+
status = napi_typeof(env, props, &type);
|
|
371
|
+
PASS_STATUS;
|
|
372
|
+
*isNull = (type == napi_null);
|
|
373
|
+
|
|
374
|
+
return napi_ok;
|
|
375
|
+
};
|
|
376
|
+
|
|
377
|
+
napi_status beam_delete_named_property(napi_env env, napi_value props, const char* name, bool* deleted) {
|
|
378
|
+
napi_status status;
|
|
379
|
+
napi_value jsName;
|
|
380
|
+
status = napi_create_string_utf8(env, name, NAPI_AUTO_LENGTH, &jsName);
|
|
381
|
+
PASS_STATUS;
|
|
382
|
+
status = napi_delete_property(env, props, jsName, deleted);
|
|
383
|
+
PASS_STATUS;
|
|
384
|
+
|
|
385
|
+
return napi_ok;
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
|
|
389
|
+
const char* beam_lookup_name(std::unordered_map<int, std::string> m, int value) {
|
|
390
|
+
auto search = m.find(value);
|
|
391
|
+
if (search != m.end()) {
|
|
392
|
+
return strdup(search->second.c_str());
|
|
393
|
+
} else {
|
|
394
|
+
return "unknown";
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
int beam_lookup_enum(std::unordered_map<std::string, int> m, char* value) {
|
|
399
|
+
auto search = m.find(std::string(value));
|
|
400
|
+
if (search != m.end()) {
|
|
401
|
+
return search->second;
|
|
402
|
+
} else {
|
|
403
|
+
return BEAM_ENUM_UNKNOWN;
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
napi_status beam_set_enum(napi_env env, napi_value target, const char* name,
|
|
408
|
+
const beamEnum* enumDesc, int value) {
|
|
409
|
+
napi_status status;
|
|
410
|
+
napi_value prop;
|
|
411
|
+
auto search = enumDesc->forward.find(value);
|
|
412
|
+
if (search != enumDesc->forward.end()) {
|
|
413
|
+
status = napi_create_string_utf8(env, search->second.data(), NAPI_AUTO_LENGTH, &prop);
|
|
414
|
+
} else {
|
|
415
|
+
status = napi_create_string_utf8(env, "unknown", NAPI_AUTO_LENGTH, &prop);
|
|
416
|
+
}
|
|
417
|
+
PASS_STATUS;
|
|
418
|
+
return napi_set_named_property(env, target, name, prop);
|
|
419
|
+
};
|
|
420
|
+
|
|
421
|
+
napi_status beam_get_enum(napi_env env, napi_value target, const char* name,
|
|
422
|
+
const beamEnum* enumDesc, int* value) {
|
|
423
|
+
napi_status status;
|
|
424
|
+
napi_value prop;
|
|
425
|
+
napi_valuetype type;
|
|
426
|
+
char* enumStr;
|
|
427
|
+
size_t len;
|
|
428
|
+
|
|
429
|
+
status = napi_get_named_property(env, target, name, &prop);
|
|
430
|
+
PASS_STATUS;
|
|
431
|
+
status = napi_typeof(env, prop, &type);
|
|
432
|
+
PASS_STATUS;
|
|
433
|
+
if (type == napi_number) {
|
|
434
|
+
status = napi_get_value_int32(env, prop, value);
|
|
435
|
+
PASS_STATUS;
|
|
436
|
+
return napi_ok;
|
|
437
|
+
}
|
|
438
|
+
if (type == napi_string) {
|
|
439
|
+
status = napi_get_value_string_utf8(env, prop, nullptr, 0, &len);
|
|
440
|
+
PASS_STATUS;
|
|
441
|
+
enumStr = (char*) malloc((len + 1) * sizeof(char));
|
|
442
|
+
status = napi_get_value_string_utf8(env, prop, enumStr, len + 1, &len);
|
|
443
|
+
PASS_STATUS;
|
|
444
|
+
auto search = enumDesc->inverse.find(std::string(enumStr));
|
|
445
|
+
if (search != enumDesc->inverse.end()) {
|
|
446
|
+
*value = search->second;
|
|
447
|
+
} else {
|
|
448
|
+
*value = BEAM_ENUM_UNKNOWN;
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
return napi_ok;
|
|
452
|
+
};
|
|
453
|
+
|
|
454
|
+
napi_status fromAVClass(napi_env env, const AVClass* cls, napi_value* result) {
|
|
455
|
+
napi_status status;
|
|
456
|
+
napi_value desc, options, units, opt, consts, element, flags;
|
|
457
|
+
napi_valuetype type;
|
|
458
|
+
const AVOption* option;
|
|
459
|
+
uint32_t constCount;
|
|
460
|
+
|
|
461
|
+
status = napi_create_object(env, &desc);
|
|
462
|
+
PASS_STATUS;
|
|
463
|
+
|
|
464
|
+
status = beam_set_string_utf8(env, desc, "type", "Class");
|
|
465
|
+
PASS_STATUS;
|
|
466
|
+
status = beam_set_string_utf8(env, desc, "class_name", (char*) cls->class_name);
|
|
467
|
+
PASS_STATUS;
|
|
468
|
+
status = napi_create_object(env, &options);
|
|
469
|
+
PASS_STATUS;
|
|
470
|
+
status = napi_create_object(env, &units);
|
|
471
|
+
PASS_STATUS;
|
|
472
|
+
option = cls->option;
|
|
473
|
+
while ((option != nullptr) && (option->name != nullptr)) {
|
|
474
|
+
if (option->type != AV_OPT_TYPE_CONST) {
|
|
475
|
+
status = napi_create_object(env, &opt);
|
|
476
|
+
PASS_STATUS;
|
|
477
|
+
status = napi_set_named_property(env, options, option->name, opt);
|
|
478
|
+
PASS_STATUS;
|
|
479
|
+
status = beam_set_string_utf8(env, opt, "name", (char*) option->name);
|
|
480
|
+
PASS_STATUS;
|
|
481
|
+
status = beam_set_string_utf8(env, opt, "help", (char*) option->help);
|
|
482
|
+
PASS_STATUS;
|
|
483
|
+
status = beam_set_string_utf8(env, opt, "option_type",
|
|
484
|
+
(char*) beam_lookup_name(beam_option_type->forward, option->type));
|
|
485
|
+
PASS_STATUS;
|
|
486
|
+
status = napi_create_object(env, &flags);
|
|
487
|
+
PASS_STATUS;
|
|
488
|
+
status = beam_set_bool(env, flags, "ENCODING_PARAM",
|
|
489
|
+
option->flags & AV_OPT_FLAG_ENCODING_PARAM);
|
|
490
|
+
PASS_STATUS;
|
|
491
|
+
status = beam_set_bool(env, flags, "DECODING_PARAM",
|
|
492
|
+
option->flags & AV_OPT_FLAG_DECODING_PARAM);
|
|
493
|
+
PASS_STATUS;
|
|
494
|
+
status = beam_set_bool(env, flags, "AUDIO_PARAM",
|
|
495
|
+
option->flags & AV_OPT_FLAG_AUDIO_PARAM);
|
|
496
|
+
PASS_STATUS;
|
|
497
|
+
status = beam_set_bool(env, flags, "VIDEO_PARAM",
|
|
498
|
+
option->flags & AV_OPT_FLAG_VIDEO_PARAM);
|
|
499
|
+
PASS_STATUS;
|
|
500
|
+
status = beam_set_bool(env, flags, "SUBTITLE_PARAM",
|
|
501
|
+
option->flags & AV_OPT_FLAG_SUBTITLE_PARAM);
|
|
502
|
+
PASS_STATUS;
|
|
503
|
+
status = beam_set_bool(env, flags, "EXPORT",
|
|
504
|
+
option->flags & AV_OPT_FLAG_EXPORT);
|
|
505
|
+
PASS_STATUS;
|
|
506
|
+
status = beam_set_bool(env, flags, "READONLY",
|
|
507
|
+
option->flags & AV_OPT_FLAG_READONLY);
|
|
508
|
+
PASS_STATUS;
|
|
509
|
+
status = beam_set_bool(env, flags, "BSF_PARAM",
|
|
510
|
+
option->flags & AV_OPT_FLAG_BSF_PARAM);
|
|
511
|
+
PASS_STATUS;
|
|
512
|
+
status = beam_set_bool(env, flags, "FILTERING_PARAM",
|
|
513
|
+
option->flags & AV_OPT_FLAG_FILTERING_PARAM);
|
|
514
|
+
PASS_STATUS;
|
|
515
|
+
status = beam_set_bool(env, flags, "DEPRECATED",
|
|
516
|
+
option->flags & AV_OPT_FLAG_DEPRECATED);
|
|
517
|
+
PASS_STATUS;
|
|
518
|
+
status = napi_set_named_property(env, opt, "flags", flags);
|
|
519
|
+
PASS_STATUS;
|
|
520
|
+
if (option->unit != nullptr) {
|
|
521
|
+
status = beam_set_string_utf8(env, opt, "unit", (char*) option->unit);
|
|
522
|
+
PASS_STATUS;
|
|
523
|
+
status = napi_create_array(env, &consts);
|
|
524
|
+
PASS_STATUS;
|
|
525
|
+
status = napi_set_named_property(env, opt, "consts", consts);
|
|
526
|
+
PASS_STATUS;
|
|
527
|
+
status = napi_set_named_property(env, units, option->unit, opt);
|
|
528
|
+
PASS_STATUS;
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
option = av_opt_next(&cls, option);
|
|
532
|
+
}
|
|
533
|
+
option = cls->option;
|
|
534
|
+
while ((option != nullptr) && (option->name != nullptr)) {
|
|
535
|
+
if (option->type == AV_OPT_TYPE_CONST) {
|
|
536
|
+
status = napi_get_named_property(env, units, option->unit, &opt);
|
|
537
|
+
PASS_STATUS;
|
|
538
|
+
status = napi_typeof(env, opt, &type);
|
|
539
|
+
PASS_STATUS;
|
|
540
|
+
if (type != napi_object) { // Assume badly described constant property
|
|
541
|
+
// TODO work with bad params like https://github.com/FFmpeg/FFmpeg/blob/a0ac49e38ee1d1011c394d7be67d0f08b2281526/libavformat/chromaprint.c#L167
|
|
542
|
+
// parameter fp_format is missing option->unit
|
|
543
|
+
option = av_opt_next(&cls, option);
|
|
544
|
+
continue;
|
|
545
|
+
}
|
|
546
|
+
status = napi_get_named_property(env, opt, "consts", &consts);
|
|
547
|
+
PASS_STATUS;
|
|
548
|
+
status = napi_get_array_length(env, consts, &constCount);
|
|
549
|
+
PASS_STATUS;
|
|
550
|
+
status = napi_create_string_utf8(env, option->name, NAPI_AUTO_LENGTH, &element);
|
|
551
|
+
PASS_STATUS;
|
|
552
|
+
status = napi_set_element(env, consts, constCount, element);
|
|
553
|
+
PASS_STATUS;
|
|
554
|
+
}
|
|
555
|
+
option = av_opt_next(&cls, option);
|
|
556
|
+
}
|
|
557
|
+
status = napi_set_named_property(env, desc, "options", options);
|
|
558
|
+
PASS_STATUS;
|
|
559
|
+
|
|
560
|
+
*result = desc;
|
|
561
|
+
return napi_ok;
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
napi_status makeAVDictionary(napi_env env, napi_value options, AVDictionary** metadata) {
|
|
565
|
+
napi_status status;
|
|
566
|
+
napi_value names, key, value, valueS;
|
|
567
|
+
AVDictionary* dict = nullptr;
|
|
568
|
+
uint32_t propCount;
|
|
569
|
+
char *keyStr, *valueStr;
|
|
570
|
+
size_t strLen;
|
|
571
|
+
int ret;
|
|
572
|
+
|
|
573
|
+
status = napi_get_property_names(env, options, &names);
|
|
574
|
+
PASS_STATUS;
|
|
575
|
+
status = napi_get_array_length(env, names, &propCount);
|
|
576
|
+
PASS_STATUS;
|
|
577
|
+
|
|
578
|
+
// Replace all metadata values ... no partial operation
|
|
579
|
+
for ( uint32_t x = 0 ; x < propCount ; x++ ) {
|
|
580
|
+
status = napi_get_element(env, names, x, &key);
|
|
581
|
+
PASS_STATUS;
|
|
582
|
+
status = napi_get_property(env, options, key, &value);
|
|
583
|
+
PASS_STATUS;
|
|
584
|
+
status = napi_coerce_to_string(env, value, &valueS);
|
|
585
|
+
PASS_STATUS;
|
|
586
|
+
|
|
587
|
+
status = napi_get_value_string_utf8(env, key, nullptr, 0, &strLen);
|
|
588
|
+
PASS_STATUS;
|
|
589
|
+
keyStr = (char*) malloc(sizeof(char) * (strLen + 1));
|
|
590
|
+
status = napi_get_value_string_utf8(env, key, keyStr, strLen + 1, &strLen);
|
|
591
|
+
PASS_STATUS;
|
|
592
|
+
|
|
593
|
+
status = napi_get_value_string_utf8(env, valueS, nullptr, 0, &strLen);
|
|
594
|
+
PASS_STATUS;
|
|
595
|
+
valueStr = (char*) malloc(sizeof(char) * (strLen + 1));
|
|
596
|
+
status = napi_get_value_string_utf8(env, valueS, valueStr, strLen + 1, &strLen);
|
|
597
|
+
PASS_STATUS;
|
|
598
|
+
|
|
599
|
+
ret = av_dict_set(&dict, keyStr, valueStr, 0);
|
|
600
|
+
free(keyStr);
|
|
601
|
+
free(valueStr);
|
|
602
|
+
if (ret < 0) {
|
|
603
|
+
printf("DEBUG: %s\n", avErrorMsg("Problem setting dictionary entry: ", ret));
|
|
604
|
+
return napi_invalid_arg;
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
*metadata = dict;
|
|
609
|
+
return napi_ok;
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
napi_status fromContextPrivData(napi_env env, void *privData, napi_value* result) {
|
|
613
|
+
napi_status status;
|
|
614
|
+
napi_value optionsVal, bufferVal;
|
|
615
|
+
int64_t iValue;
|
|
616
|
+
double dValue;
|
|
617
|
+
uint8_t *data;
|
|
618
|
+
AVRational qValue;
|
|
619
|
+
AVPixelFormat pixFmt;
|
|
620
|
+
AVSampleFormat sampleFmt;
|
|
621
|
+
struct imageSizeData { int x; int y; };
|
|
622
|
+
imageSizeData *sizeData;
|
|
623
|
+
struct offsetData { uint8_t *addr; int len; };
|
|
624
|
+
offsetData *offData;
|
|
625
|
+
char chanLayStr[64];
|
|
626
|
+
|
|
627
|
+
int ret;
|
|
628
|
+
const AVOption *option = nullptr;
|
|
629
|
+
const AVOption *prev = nullptr;
|
|
630
|
+
|
|
631
|
+
status = napi_create_object(env, &optionsVal);
|
|
632
|
+
PASS_STATUS;
|
|
633
|
+
while ((option = av_opt_next(privData, option))) {
|
|
634
|
+
switch (option->type) {
|
|
635
|
+
case AV_OPT_TYPE_FLAGS:
|
|
636
|
+
printf("fromPrivOptions: flags option %s: %s\n", option->name, "unmapped");
|
|
637
|
+
status = beam_set_string_utf8(env, optionsVal, option->name, "unmapped type: flags");
|
|
638
|
+
PASS_STATUS;
|
|
639
|
+
break;
|
|
640
|
+
case AV_OPT_TYPE_INT:
|
|
641
|
+
ret = av_opt_get_int(privData, option->name, 0, &iValue);
|
|
642
|
+
if (ret < 0) {
|
|
643
|
+
return napi_number_expected;
|
|
644
|
+
}
|
|
645
|
+
if (nullptr == option->unit) {
|
|
646
|
+
status = beam_set_int32(env, optionsVal, option->name, (int32_t)iValue);
|
|
647
|
+
PASS_STATUS;
|
|
648
|
+
} else {
|
|
649
|
+
if (iValue < 0) {
|
|
650
|
+
status = beam_set_string_utf8(env, optionsVal, option->name, "unknown");
|
|
651
|
+
PASS_STATUS;
|
|
652
|
+
} else {
|
|
653
|
+
data = (uint8_t *)option->name;
|
|
654
|
+
prev = option;
|
|
655
|
+
option = av_opt_next(privData, option);
|
|
656
|
+
while (option && (AV_OPT_TYPE_CONST == option->type)) {
|
|
657
|
+
prev = option;
|
|
658
|
+
if (option->default_val.i64 == iValue) {
|
|
659
|
+
// printf("fromPrivOptions: int option %s: %s\n", (const char*) data, option->name);
|
|
660
|
+
status = beam_set_string_utf8(env, optionsVal, (const char*) data, option->name);
|
|
661
|
+
PASS_STATUS;
|
|
662
|
+
break;
|
|
663
|
+
}
|
|
664
|
+
option = av_opt_next(privData, option);
|
|
665
|
+
}
|
|
666
|
+
option = prev;
|
|
667
|
+
}
|
|
668
|
+
}
|
|
669
|
+
break;
|
|
670
|
+
case AV_OPT_TYPE_INT64:
|
|
671
|
+
case AV_OPT_TYPE_UINT64:
|
|
672
|
+
ret = av_opt_get_int(privData, option->name, 0, &iValue);
|
|
673
|
+
if (ret < 0) {
|
|
674
|
+
return napi_number_expected;
|
|
675
|
+
}
|
|
676
|
+
status = beam_set_int64(env, optionsVal, option->name, iValue);
|
|
677
|
+
PASS_STATUS;
|
|
678
|
+
break;
|
|
679
|
+
case AV_OPT_TYPE_DOUBLE:
|
|
680
|
+
case AV_OPT_TYPE_FLOAT:
|
|
681
|
+
ret = av_opt_get_double(privData, option->name, 0, &dValue);
|
|
682
|
+
if (ret < 0) {
|
|
683
|
+
return napi_number_expected;
|
|
684
|
+
}
|
|
685
|
+
status = beam_set_double(env, optionsVal, option->name, dValue);
|
|
686
|
+
PASS_STATUS;
|
|
687
|
+
break;
|
|
688
|
+
case AV_OPT_TYPE_STRING:
|
|
689
|
+
ret = av_opt_get(privData, option->name, 0, &data);
|
|
690
|
+
if (ret < 0) {
|
|
691
|
+
return napi_string_expected;
|
|
692
|
+
}
|
|
693
|
+
status = beam_set_string_utf8(env, optionsVal, option->name, const_cast<char*>((char*) data));
|
|
694
|
+
av_free(data);
|
|
695
|
+
PASS_STATUS;
|
|
696
|
+
break;
|
|
697
|
+
case AV_OPT_TYPE_RATIONAL:
|
|
698
|
+
ret = av_opt_get_q(privData, option->name, 0, &qValue);
|
|
699
|
+
if (ret < 0) {
|
|
700
|
+
return napi_object_expected;
|
|
701
|
+
}
|
|
702
|
+
status = beam_set_rational(env, optionsVal, option->name, qValue);
|
|
703
|
+
PASS_STATUS;
|
|
704
|
+
break;
|
|
705
|
+
case AV_OPT_TYPE_BINARY: ///< offset must point to a pointer immediately followed by an int for the length
|
|
706
|
+
offData = (offsetData *)((uint8_t*)privData + option->offset);
|
|
707
|
+
// printf("fromPrivOptions: binary option %s: %p, len 0x%x\n", option->name, offData->addr, offData->len);
|
|
708
|
+
if ((nullptr != offData->addr) && (0 != offData->len))
|
|
709
|
+
status = napi_create_buffer_copy(env, offData->len, offData->addr, (void **)&data, &bufferVal);
|
|
710
|
+
else
|
|
711
|
+
status = napi_get_null(env, &bufferVal);
|
|
712
|
+
PASS_STATUS;
|
|
713
|
+
status = napi_set_named_property(env, optionsVal, option->name, bufferVal);
|
|
714
|
+
PASS_STATUS;
|
|
715
|
+
break;
|
|
716
|
+
case AV_OPT_TYPE_DICT:
|
|
717
|
+
printf("fromPrivOptions: dict option %s: %s\n", option->name, "unmapped");
|
|
718
|
+
status = beam_set_string_utf8(env, optionsVal, option->name, "unmapped type: dict");
|
|
719
|
+
PASS_STATUS;
|
|
720
|
+
break;
|
|
721
|
+
case AV_OPT_TYPE_CONST:
|
|
722
|
+
// printf("fromPrivOptions: const option %s: %s\n", option->name, "unmapped");
|
|
723
|
+
// status = beam_set_string_utf8(env, optionsVal, option->name, "unmapped type: const");
|
|
724
|
+
// PASS_STATUS;
|
|
725
|
+
break;
|
|
726
|
+
case AV_OPT_TYPE_IMAGE_SIZE: ///< offset must point to two consecutive integers
|
|
727
|
+
sizeData = (imageSizeData *)((uint8_t*)privData + option->offset);
|
|
728
|
+
// printf("fromPrivOptions: image size option %s: %dx%d\n", option->name, sizeData->x, sizeData->y);
|
|
729
|
+
status = beam_set_rational(env, optionsVal, option->name, av_make_q(sizeData->x, sizeData->y));
|
|
730
|
+
PASS_STATUS;
|
|
731
|
+
break;
|
|
732
|
+
case AV_OPT_TYPE_PIXEL_FMT:
|
|
733
|
+
ret = av_opt_get_pixel_fmt(privData, option->name, 0, &pixFmt);
|
|
734
|
+
if (ret < 0) {
|
|
735
|
+
return napi_number_expected;
|
|
736
|
+
}
|
|
737
|
+
status = beam_set_string_utf8(env, optionsVal, option->name, av_get_pix_fmt_name(pixFmt));
|
|
738
|
+
PASS_STATUS;
|
|
739
|
+
break;
|
|
740
|
+
case AV_OPT_TYPE_SAMPLE_FMT:
|
|
741
|
+
ret = av_opt_get_sample_fmt(privData, option->name, 0, &sampleFmt);
|
|
742
|
+
if (ret < 0) {
|
|
743
|
+
return napi_number_expected;
|
|
744
|
+
}
|
|
745
|
+
status = beam_set_string_utf8(env, optionsVal, option->name, av_get_sample_fmt_name(sampleFmt));
|
|
746
|
+
PASS_STATUS;
|
|
747
|
+
break;
|
|
748
|
+
case AV_OPT_TYPE_VIDEO_RATE: ///< offset must point to AVRational
|
|
749
|
+
qValue = *(AVRational *)((uint8_t*)privData + option->offset);
|
|
750
|
+
// printf("fromPrivOptions: video rate option %s: %d:%d\n", option->name, qValue.num, qValue.den);
|
|
751
|
+
status = beam_set_rational(env, optionsVal, (char*) option->name, qValue);
|
|
752
|
+
PASS_STATUS;
|
|
753
|
+
break;
|
|
754
|
+
case AV_OPT_TYPE_DURATION:
|
|
755
|
+
printf("fromPrivOptions: duration option %s: %s\n", option->name, "unmapped");
|
|
756
|
+
status = beam_set_string_utf8(env, optionsVal, option->name, "unmapped type: duration");
|
|
757
|
+
PASS_STATUS;
|
|
758
|
+
break;
|
|
759
|
+
case AV_OPT_TYPE_COLOR:
|
|
760
|
+
printf("fromPrivOptions: color option %s: %s\n", option->name, "unmapped");
|
|
761
|
+
status = beam_set_string_utf8(env, optionsVal, option->name, "unmapped type: color");
|
|
762
|
+
PASS_STATUS;
|
|
763
|
+
break;
|
|
764
|
+
case AV_OPT_TYPE_CHANNEL_LAYOUT:
|
|
765
|
+
ret = av_opt_get_channel_layout(privData, option->name, 0, &iValue);
|
|
766
|
+
if (ret < 0) {
|
|
767
|
+
return napi_number_expected;
|
|
768
|
+
}
|
|
769
|
+
av_get_channel_layout_string(chanLayStr, 64, 0, iValue);
|
|
770
|
+
// printf("fromPrivOptions: channel layout option %s: %lli - %s\n", option->name, iValue, chanLayStr);
|
|
771
|
+
status = beam_set_string_utf8(env, optionsVal, option->name, chanLayStr);
|
|
772
|
+
PASS_STATUS;
|
|
773
|
+
break;
|
|
774
|
+
case AV_OPT_TYPE_BOOL:
|
|
775
|
+
ret = av_opt_get_int(privData, option->name, 0, &iValue);
|
|
776
|
+
if (ret < 0) {
|
|
777
|
+
return napi_boolean_expected;
|
|
778
|
+
}
|
|
779
|
+
// printf("fromPrivOptions: bool option %s: %lli\n", option->name, iValue);
|
|
780
|
+
status = beam_set_bool(env, optionsVal, option->name, iValue);
|
|
781
|
+
PASS_STATUS;
|
|
782
|
+
break;
|
|
783
|
+
default:
|
|
784
|
+
printf("fromPrivOptions: unknown (type %d) option %s: %s\n", option->type, option->name, "unmapped");
|
|
785
|
+
status = beam_set_string_utf8(env, optionsVal, option->name, "unknown type");
|
|
786
|
+
PASS_STATUS;
|
|
787
|
+
break;
|
|
788
|
+
}
|
|
789
|
+
}
|
|
790
|
+
|
|
791
|
+
*result = optionsVal;
|
|
792
|
+
return napi_ok;
|
|
793
|
+
}
|
|
794
|
+
|
|
795
|
+
napi_status toContextPrivData(napi_env env, napi_value params, void* priv_data) {
|
|
796
|
+
napi_status status;
|
|
797
|
+
napi_value names, element, subel;
|
|
798
|
+
napi_valuetype type, subtype;
|
|
799
|
+
bool isArray, flag;
|
|
800
|
+
double dValue;
|
|
801
|
+
uint32_t uThirtwo;
|
|
802
|
+
char* sValue;
|
|
803
|
+
char* strProp;
|
|
804
|
+
size_t sLen;
|
|
805
|
+
const AVOption* option;
|
|
806
|
+
int64_t iValue;
|
|
807
|
+
int ret;
|
|
808
|
+
AVRational qValue = {0,0};
|
|
809
|
+
|
|
810
|
+
if (priv_data == nullptr) {
|
|
811
|
+
return napi_invalid_arg;
|
|
812
|
+
}
|
|
813
|
+
|
|
814
|
+
status = napi_typeof(env, params, &type);
|
|
815
|
+
PASS_STATUS;
|
|
816
|
+
status = napi_is_array(env, params, &isArray);
|
|
817
|
+
PASS_STATUS;
|
|
818
|
+
if ((isArray == false) && (type == napi_object)) {
|
|
819
|
+
status = napi_get_property_names(env, params, &names);
|
|
820
|
+
PASS_STATUS;
|
|
821
|
+
status = napi_get_array_length(env, names, &uThirtwo);
|
|
822
|
+
PASS_STATUS;
|
|
823
|
+
for ( uint32_t x = 0 ; x < uThirtwo ; x++ ) {
|
|
824
|
+
status = napi_get_element(env, names, x, &element);
|
|
825
|
+
PASS_STATUS;
|
|
826
|
+
status = napi_get_value_string_utf8(env, element, nullptr, 0, &sLen);
|
|
827
|
+
PASS_STATUS;
|
|
828
|
+
sValue = (char*) malloc(sizeof(char) * (sLen + 1));
|
|
829
|
+
status = napi_get_value_string_utf8(env, element, sValue, sLen + 1, &sLen);
|
|
830
|
+
PASS_STATUS;
|
|
831
|
+
option = av_opt_find(priv_data, sValue, nullptr, 0, 0);
|
|
832
|
+
if (option != nullptr) {
|
|
833
|
+
if (option->flags & AV_OPT_FLAG_READONLY) { continue; }
|
|
834
|
+
status = napi_get_named_property(env, params, sValue, &element);
|
|
835
|
+
PASS_STATUS;
|
|
836
|
+
status = napi_typeof(env, element, &type);
|
|
837
|
+
PASS_STATUS;
|
|
838
|
+
switch (type) {
|
|
839
|
+
case napi_boolean:
|
|
840
|
+
status = napi_get_value_bool(env, element, &flag);
|
|
841
|
+
PASS_STATUS;
|
|
842
|
+
ret = av_opt_set_int(priv_data, sValue, flag, 0);
|
|
843
|
+
if (ret < 0) printf("DEBUG: Unable to set %s with a boolean value.\n", sValue);
|
|
844
|
+
break;
|
|
845
|
+
case napi_number:
|
|
846
|
+
if ((option->type == AV_OPT_TYPE_DOUBLE) ||
|
|
847
|
+
(option->type == AV_OPT_TYPE_FLOAT)) {
|
|
848
|
+
status = napi_get_value_double(env, element, &dValue);
|
|
849
|
+
PASS_STATUS;
|
|
850
|
+
ret = av_opt_set_double(priv_data, sValue, dValue, 0);
|
|
851
|
+
if (ret < 0) printf("DEBUG: Unable to set %s with a double value %f.\n", sValue, dValue);
|
|
852
|
+
break;
|
|
853
|
+
}
|
|
854
|
+
status = napi_get_value_int64(env, element, &iValue);
|
|
855
|
+
PASS_STATUS;
|
|
856
|
+
ret = av_opt_set_int(priv_data, sValue, iValue, 0);
|
|
857
|
+
if (ret < 0) printf("DEBUG: Unable to set %s with an integer value %" PRId64 ": %s.\n",
|
|
858
|
+
sValue, iValue, avErrorMsg("", ret));
|
|
859
|
+
break;
|
|
860
|
+
case napi_string:
|
|
861
|
+
status = napi_get_value_string_utf8(env, element, nullptr, 0, &sLen);
|
|
862
|
+
PASS_STATUS;
|
|
863
|
+
strProp = (char*) malloc(sizeof(char) * (sLen + 1));
|
|
864
|
+
PASS_STATUS;
|
|
865
|
+
status = napi_get_value_string_utf8(env, element, strProp, sLen + 1, &sLen);
|
|
866
|
+
PASS_STATUS;
|
|
867
|
+
ret = av_opt_set(priv_data, sValue, strProp, 0);
|
|
868
|
+
free(strProp);
|
|
869
|
+
if (ret < 0) printf("DEBUG: Unable to set %s with a string value %s.\n", sValue, strProp);
|
|
870
|
+
break;
|
|
871
|
+
case napi_object:
|
|
872
|
+
status = napi_is_array(env, element, &isArray);
|
|
873
|
+
PASS_STATUS;
|
|
874
|
+
if (isArray && (option->type == AV_OPT_TYPE_RATIONAL)) {
|
|
875
|
+
status = napi_get_element(env, element, 0, &subel);
|
|
876
|
+
PASS_STATUS;
|
|
877
|
+
status = napi_typeof(env, subel, &subtype);
|
|
878
|
+
PASS_STATUS;
|
|
879
|
+
if (subtype != napi_number) {
|
|
880
|
+
printf("DEBUG: Non-number value for rational numerator of property %s.\n", sValue);
|
|
881
|
+
break;
|
|
882
|
+
}
|
|
883
|
+
status = napi_get_value_int32(env, subel, &qValue.num);
|
|
884
|
+
PASS_STATUS;
|
|
885
|
+
status = napi_get_element(env, element, 1, &subel);
|
|
886
|
+
PASS_STATUS;
|
|
887
|
+
status = napi_typeof(env, subel, &subtype);
|
|
888
|
+
PASS_STATUS;
|
|
889
|
+
if (subtype != napi_number) {
|
|
890
|
+
printf("DEBUG: Non-number value for rational denominator of property %s.\n", sValue);
|
|
891
|
+
qValue.num = 0; qValue.den = 1;
|
|
892
|
+
break;
|
|
893
|
+
}
|
|
894
|
+
status = napi_get_value_int32(env, subel, &qValue.den);
|
|
895
|
+
PASS_STATUS;
|
|
896
|
+
ret = av_opt_set_q(priv_data, sValue, qValue, 0);
|
|
897
|
+
if (ret < 0) {
|
|
898
|
+
printf("DEBUG: Failed to set rational property %s.\n", sValue);
|
|
899
|
+
}
|
|
900
|
+
qValue.num = 0; qValue.den = 1;
|
|
901
|
+
} else {
|
|
902
|
+
printf("DEBUG: Non-array for non-rational property %s.\n", sValue);
|
|
903
|
+
}
|
|
904
|
+
break;
|
|
905
|
+
default:
|
|
906
|
+
printf("DEBUG: Failed to set a private data value %s\n", sValue);
|
|
907
|
+
break;
|
|
908
|
+
}
|
|
909
|
+
} else {
|
|
910
|
+
printf("DEBUG: Option %s not found.\n", sValue);
|
|
911
|
+
}
|
|
912
|
+
free(sValue);
|
|
913
|
+
}
|
|
914
|
+
} else {
|
|
915
|
+
return napi_invalid_arg;
|
|
916
|
+
}
|
|
917
|
+
|
|
918
|
+
return napi_ok;
|
|
919
|
+
}
|
|
920
|
+
|
|
921
|
+
std::unordered_map<int, std::string> beam_field_order_fmap = {
|
|
922
|
+
{ AV_FIELD_PROGRESSIVE, "progressive" },
|
|
923
|
+
{ AV_FIELD_TT, "top coded first, top displayed first" },
|
|
924
|
+
{ AV_FIELD_BB, "bottom coded first, bottom displayed first" },
|
|
925
|
+
{ AV_FIELD_TB, "top coded first, bottom displayed first" },
|
|
926
|
+
{ AV_FIELD_BT, "bottom coded first, top displayed first" },
|
|
927
|
+
{ AV_FIELD_UNKNOWN, "unknown" }
|
|
928
|
+
};
|
|
929
|
+
const beamEnum* beam_field_order = new beamEnum(beam_field_order_fmap);
|
|
930
|
+
|
|
931
|
+
std::unordered_map<int, std::string> beam_ff_cmp_fmap = {
|
|
932
|
+
{ FF_CMP_SAD, "sad" },
|
|
933
|
+
{ FF_CMP_SSE, "sse" },
|
|
934
|
+
{ FF_CMP_SATD, "satd" },
|
|
935
|
+
{ FF_CMP_DCT, "dct" },
|
|
936
|
+
{ FF_CMP_PSNR, "psnr" },
|
|
937
|
+
{ FF_CMP_BIT, "bit" },
|
|
938
|
+
{ FF_CMP_RD, "rd" },
|
|
939
|
+
{ FF_CMP_ZERO, "zero" },
|
|
940
|
+
{ FF_CMP_VSAD, "vsad" },
|
|
941
|
+
{ FF_CMP_VSSE, "vsse" },
|
|
942
|
+
{ FF_CMP_NSSE, "nsse" },
|
|
943
|
+
{ FF_CMP_W53, "w53" },
|
|
944
|
+
{ FF_CMP_W97, "w97" },
|
|
945
|
+
{ FF_CMP_DCTMAX, "dctmax" },
|
|
946
|
+
{ FF_CMP_DCT264, "dct264" },
|
|
947
|
+
{ FF_CMP_MEDIAN_SAD, "median_sad" },
|
|
948
|
+
{ FF_CMP_CHROMA, "chroma" },
|
|
949
|
+
};
|
|
950
|
+
const beamEnum* beam_ff_cmp = new beamEnum(beam_ff_cmp_fmap);
|
|
951
|
+
|
|
952
|
+
std::unordered_map<int, std::string> beam_ff_mb_decision_fmap = {
|
|
953
|
+
{ FF_MB_DECISION_SIMPLE, "simple" }, // uses mb_cmp
|
|
954
|
+
{ FF_MB_DECISION_BITS, "bits" }, // chooses the one which needs the fewest bits
|
|
955
|
+
{ FF_MB_DECISION_RD, "rd" } // rate distortion
|
|
956
|
+
};
|
|
957
|
+
const beamEnum* beam_ff_mb_decision = new beamEnum(beam_ff_mb_decision_fmap);
|
|
958
|
+
|
|
959
|
+
std::unordered_map<int, std::string> beam_av_audio_service_type_fmap = {
|
|
960
|
+
{ AV_AUDIO_SERVICE_TYPE_MAIN, "main" },
|
|
961
|
+
{ AV_AUDIO_SERVICE_TYPE_EFFECTS, "effects" },
|
|
962
|
+
{ AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED, "visually-impaired" },
|
|
963
|
+
{ AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED, "hearing-impaired" },
|
|
964
|
+
{ AV_AUDIO_SERVICE_TYPE_DIALOGUE, "dialogue" },
|
|
965
|
+
{ AV_AUDIO_SERVICE_TYPE_COMMENTARY, "commentary" },
|
|
966
|
+
{ AV_AUDIO_SERVICE_TYPE_EMERGENCY, "emergency" },
|
|
967
|
+
{ AV_AUDIO_SERVICE_TYPE_VOICE_OVER, "voice-over" },
|
|
968
|
+
{ AV_AUDIO_SERVICE_TYPE_KARAOKE, "karaoke" },
|
|
969
|
+
{ AV_AUDIO_SERVICE_TYPE_NB, "nb" }
|
|
970
|
+
};
|
|
971
|
+
const beamEnum* beam_av_audio_service_type = new beamEnum(beam_av_audio_service_type_fmap);
|
|
972
|
+
|
|
973
|
+
std::unordered_map<int, std::string> beam_ff_compliance_fmap = {
|
|
974
|
+
{ FF_COMPLIANCE_VERY_STRICT, "very-strict" },
|
|
975
|
+
{ FF_COMPLIANCE_STRICT, "strict" },
|
|
976
|
+
{ FF_COMPLIANCE_NORMAL, "normal" },
|
|
977
|
+
{ FF_COMPLIANCE_UNOFFICIAL, "unofficial" },
|
|
978
|
+
{ FF_COMPLIANCE_EXPERIMENTAL, "experimental" }
|
|
979
|
+
};
|
|
980
|
+
const beamEnum* beam_ff_compliance = new beamEnum(beam_ff_compliance_fmap);
|
|
981
|
+
|
|
982
|
+
std::unordered_map<int, std::string> beam_ff_dct_fmap = {
|
|
983
|
+
{ FF_DCT_AUTO, "auto" },
|
|
984
|
+
{ FF_DCT_FASTINT, "fastint "},
|
|
985
|
+
{ FF_DCT_INT, "int" },
|
|
986
|
+
{ FF_DCT_MMX, "mmx" },
|
|
987
|
+
{ FF_DCT_ALTIVEC, "altivec" },
|
|
988
|
+
{ FF_DCT_FAAN, "faan" }
|
|
989
|
+
};
|
|
990
|
+
const beamEnum* beam_ff_dct = new beamEnum(beam_ff_dct_fmap);
|
|
991
|
+
|
|
992
|
+
std::unordered_map<int, std::string> beam_ff_idct_fmap = {
|
|
993
|
+
{ FF_IDCT_AUTO, "auto" },
|
|
994
|
+
{ FF_IDCT_INT, "int" },
|
|
995
|
+
{ FF_IDCT_SIMPLE, "simple" },
|
|
996
|
+
{ FF_IDCT_SIMPLEMMX, "simplemmx" },
|
|
997
|
+
{ FF_IDCT_ARM, "arm" },
|
|
998
|
+
{ FF_IDCT_ALTIVEC, "altivec" },
|
|
999
|
+
{ FF_IDCT_SIMPLEARM, "simplearm" },
|
|
1000
|
+
{ FF_IDCT_XVID, "xvid" },
|
|
1001
|
+
{ FF_IDCT_SIMPLEARMV5TE, "simplearmv5te" },
|
|
1002
|
+
{ FF_IDCT_SIMPLEARMV6, "simplearmv6" },
|
|
1003
|
+
{ FF_IDCT_FAAN, "faan" },
|
|
1004
|
+
{ FF_IDCT_SIMPLENEON, "simpleneon" },
|
|
1005
|
+
{ FF_IDCT_NONE, "none" },
|
|
1006
|
+
{ FF_IDCT_SIMPLEAUTO, "simpleauto" },
|
|
1007
|
+
};
|
|
1008
|
+
const beamEnum* beam_ff_idct = new beamEnum(beam_ff_idct_fmap);
|
|
1009
|
+
|
|
1010
|
+
std::unordered_map<int, std::string> beam_avdiscard_fmap = {
|
|
1011
|
+
{ AVDISCARD_NONE, "none" },
|
|
1012
|
+
{ AVDISCARD_DEFAULT, "default" },
|
|
1013
|
+
{ AVDISCARD_NONREF, "nonref" },
|
|
1014
|
+
{ AVDISCARD_BIDIR, "bidir" },
|
|
1015
|
+
{ AVDISCARD_NONINTRA, "nonintra" },
|
|
1016
|
+
{ AVDISCARD_NONKEY, "nonkey" },
|
|
1017
|
+
{ AVDISCARD_ALL, "all" }
|
|
1018
|
+
};
|
|
1019
|
+
const beamEnum* beam_avdiscard = new beamEnum(beam_avdiscard_fmap);
|
|
1020
|
+
|
|
1021
|
+
std::unordered_map<int, std::string> beam_ff_sub_charenc_mode_fmap = {
|
|
1022
|
+
// do nothing (demuxer outputs a stream supposed to be already in UTF-8, or the codec is bitmap for instance
|
|
1023
|
+
{ FF_SUB_CHARENC_MODE_DO_NOTHING, "do-nothing" },
|
|
1024
|
+
// libavcodec will select the mode itself
|
|
1025
|
+
{ FF_SUB_CHARENC_MODE_AUTOMATIC, "automatic" },
|
|
1026
|
+
// the AVPacket data needs to be recoded to UTF-8 before being fed to the decoder, requires iconv
|
|
1027
|
+
{ FF_SUB_CHARENC_MODE_PRE_DECODER, "pre-decoder" },
|
|
1028
|
+
// neither convert the subtitles, nor check them for valid UTF-8
|
|
1029
|
+
{ FF_SUB_CHARENC_MODE_IGNORE, "ignore" }
|
|
1030
|
+
};
|
|
1031
|
+
const beamEnum* beam_ff_sub_charenc_mode = new beamEnum(beam_ff_sub_charenc_mode_fmap);
|
|
1032
|
+
|
|
1033
|
+
std::unordered_map<int, std::string> beam_avmedia_type_fmap = {
|
|
1034
|
+
{ AVMEDIA_TYPE_VIDEO, "video" },
|
|
1035
|
+
{ AVMEDIA_TYPE_AUDIO, "audio" },
|
|
1036
|
+
{ AVMEDIA_TYPE_DATA, "data" },
|
|
1037
|
+
{ AVMEDIA_TYPE_SUBTITLE, "subtitle" },
|
|
1038
|
+
{ AVMEDIA_TYPE_ATTACHMENT, "attachment" }
|
|
1039
|
+
};
|
|
1040
|
+
const beamEnum* beam_avmedia_type = new beamEnum(beam_avmedia_type_fmap);
|
|
1041
|
+
|
|
1042
|
+
std::unordered_map<int, std::string> beam_option_type_fmap = {
|
|
1043
|
+
{ AV_OPT_TYPE_FLAGS, "flags" },
|
|
1044
|
+
{ AV_OPT_TYPE_INT, "int" },
|
|
1045
|
+
{ AV_OPT_TYPE_INT64, "int64" },
|
|
1046
|
+
{ AV_OPT_TYPE_DOUBLE, "double" },
|
|
1047
|
+
{ AV_OPT_TYPE_FLOAT, "float" },
|
|
1048
|
+
{ AV_OPT_TYPE_STRING, "string" },
|
|
1049
|
+
{ AV_OPT_TYPE_RATIONAL, "rational" },
|
|
1050
|
+
{ AV_OPT_TYPE_BINARY, "binary" }, ///< offset must point to a pointer immediately followed by an int for the length
|
|
1051
|
+
{ AV_OPT_TYPE_DICT, "dict" },
|
|
1052
|
+
{ AV_OPT_TYPE_UINT64, "uint64" },
|
|
1053
|
+
{ AV_OPT_TYPE_CONST, "const" },
|
|
1054
|
+
{ AV_OPT_TYPE_IMAGE_SIZE, "image_size" }, ///< offset must point to two consecutive integers
|
|
1055
|
+
{ AV_OPT_TYPE_PIXEL_FMT, "pixel_fmt" },
|
|
1056
|
+
{ AV_OPT_TYPE_SAMPLE_FMT, "sample_fmt" },
|
|
1057
|
+
{ AV_OPT_TYPE_VIDEO_RATE, "video_rate" }, ///< offset must point to AVRational
|
|
1058
|
+
{ AV_OPT_TYPE_DURATION, "duration" },
|
|
1059
|
+
{ AV_OPT_TYPE_COLOR, "color" },
|
|
1060
|
+
{ AV_OPT_TYPE_CHANNEL_LAYOUT, "channel_layout" },
|
|
1061
|
+
{ AV_OPT_TYPE_BOOL, "bool" }
|
|
1062
|
+
};
|
|
1063
|
+
const beamEnum* beam_option_type = new beamEnum(beam_option_type_fmap);
|
|
1064
|
+
|
|
1065
|
+
std::unordered_map<int, std::string> beam_avoid_neg_ts_fmap = {
|
|
1066
|
+
{ AVFMT_AVOID_NEG_TS_AUTO, "auto" },
|
|
1067
|
+
{ AVFMT_AVOID_NEG_TS_MAKE_NON_NEGATIVE, "make_non_negative" },
|
|
1068
|
+
{ AVFMT_AVOID_NEG_TS_MAKE_ZERO, "make_zero" }
|
|
1069
|
+
};
|
|
1070
|
+
const beamEnum* beam_avoid_neg_ts = new beamEnum(beam_avoid_neg_ts_fmap);
|
|
1071
|
+
|
|
1072
|
+
std::unordered_map<int, std::string> beam_avfmt_duration2_fmap = {
|
|
1073
|
+
{ AVFMT_DURATION_FROM_PTS, "from_pts" },
|
|
1074
|
+
{ AVFMT_DURATION_FROM_STREAM, "from_stream" },
|
|
1075
|
+
{ AVFMT_DURATION_FROM_BITRATE, "from_bitrate" }
|
|
1076
|
+
};
|
|
1077
|
+
const beamEnum* beam_avfmt_duration2 = new beamEnum(beam_avfmt_duration2_fmap);
|
|
1078
|
+
|
|
1079
|
+
std::unordered_map<int, std::string> beam_packet_side_data_type_fmap = {
|
|
1080
|
+
{ AV_PKT_DATA_PALETTE, "palette" },
|
|
1081
|
+
{ AV_PKT_DATA_NEW_EXTRADATA, "new_extradata" },
|
|
1082
|
+
{ AV_PKT_DATA_PARAM_CHANGE, "param_change" },
|
|
1083
|
+
{ AV_PKT_DATA_H263_MB_INFO, "h263_mb_info" },
|
|
1084
|
+
{ AV_PKT_DATA_REPLAYGAIN, "replaygain" },
|
|
1085
|
+
{ AV_PKT_DATA_DISPLAYMATRIX, "displaymatrix" },
|
|
1086
|
+
{ AV_PKT_DATA_STEREO3D, "stereo3d" },
|
|
1087
|
+
{ AV_PKT_DATA_AUDIO_SERVICE_TYPE, "audio_service_type" },
|
|
1088
|
+
{ AV_PKT_DATA_QUALITY_STATS, "quality_stats" },
|
|
1089
|
+
{ AV_PKT_DATA_FALLBACK_TRACK, "fallback_track" },
|
|
1090
|
+
{ AV_PKT_DATA_CPB_PROPERTIES, "cpb_properties" },
|
|
1091
|
+
{ AV_PKT_DATA_SKIP_SAMPLES, "skip_samples" },
|
|
1092
|
+
{ AV_PKT_DATA_JP_DUALMONO, "jp_dualmono" },
|
|
1093
|
+
{ AV_PKT_DATA_STRINGS_METADATA, "strings_metadata" },
|
|
1094
|
+
{ AV_PKT_DATA_SUBTITLE_POSITION, "subtitle_position" },
|
|
1095
|
+
{ AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL, "matroska_blockadditional" },
|
|
1096
|
+
{ AV_PKT_DATA_WEBVTT_IDENTIFIER, "webvtt_identifier" },
|
|
1097
|
+
{ AV_PKT_DATA_WEBVTT_SETTINGS, "webvtt_settings" },
|
|
1098
|
+
{ AV_PKT_DATA_METADATA_UPDATE, "metadata_update" },
|
|
1099
|
+
{ AV_PKT_DATA_MPEGTS_STREAM_ID, "mpegts_stream_id" },
|
|
1100
|
+
{ AV_PKT_DATA_MASTERING_DISPLAY_METADATA, "mastering_display_metadata" },
|
|
1101
|
+
{ AV_PKT_DATA_SPHERICAL, "spherical" },
|
|
1102
|
+
{ AV_PKT_DATA_CONTENT_LIGHT_LEVEL, "content_light_level" },
|
|
1103
|
+
{ AV_PKT_DATA_A53_CC, "a53_cc" },
|
|
1104
|
+
{ AV_PKT_DATA_ENCRYPTION_INIT_INFO, "encryption_init_info" },
|
|
1105
|
+
{ AV_PKT_DATA_ENCRYPTION_INFO, "encyption_info" },
|
|
1106
|
+
{ AV_PKT_DATA_AFD, "afd" }
|
|
1107
|
+
};
|
|
1108
|
+
const beamEnum* beam_packet_side_data_type = new beamEnum(beam_packet_side_data_type_fmap);
|
|
1109
|
+
|
|
1110
|
+
std::unordered_map<int, std::string> beam_frame_side_data_type_fmap = {
|
|
1111
|
+
{ AV_FRAME_DATA_PANSCAN, "panscan" },
|
|
1112
|
+
{ AV_FRAME_DATA_A53_CC, "a53_cc" },
|
|
1113
|
+
{ AV_FRAME_DATA_STEREO3D, "stereo3d" },
|
|
1114
|
+
{ AV_FRAME_DATA_MATRIXENCODING, "matrixencoding" },
|
|
1115
|
+
{ AV_FRAME_DATA_DOWNMIX_INFO, "downmix_info" },
|
|
1116
|
+
{ AV_FRAME_DATA_REPLAYGAIN, "replaygain" },
|
|
1117
|
+
{ AV_FRAME_DATA_DISPLAYMATRIX, "displaymatrix" },
|
|
1118
|
+
{ AV_FRAME_DATA_AFD, "afd" },
|
|
1119
|
+
{ AV_FRAME_DATA_MOTION_VECTORS, "motion_vectors" },
|
|
1120
|
+
{ AV_FRAME_DATA_SKIP_SAMPLES, "skip_samples" },
|
|
1121
|
+
{ AV_FRAME_DATA_AUDIO_SERVICE_TYPE, "audio_service_type" },
|
|
1122
|
+
{ AV_FRAME_DATA_MASTERING_DISPLAY_METADATA, "mastering_display_metadata" },
|
|
1123
|
+
{ AV_FRAME_DATA_GOP_TIMECODE, "gop_timecode" },
|
|
1124
|
+
{ AV_FRAME_DATA_SPHERICAL, "spherical" },
|
|
1125
|
+
{ AV_FRAME_DATA_CONTENT_LIGHT_LEVEL, "light_level" },
|
|
1126
|
+
{ AV_FRAME_DATA_ICC_PROFILE, "icc_profile" },
|
|
1127
|
+
{ AV_FRAME_DATA_S12M_TIMECODE, "s12m_timecode" }
|
|
1128
|
+
};
|
|
1129
|
+
const beamEnum* beam_frame_side_data_type = new beamEnum(beam_frame_side_data_type_fmap);
|