mirror of
https://gitlab.xiph.org/xiph/ezstream.git
synced 2024-11-03 04:17:18 -05:00
Remove half-baked support for "passthrough encoders"
The correct way is to just not configure an encoder for a stream, which is what the documentation already states. Encoder sections now require a program name to be set or the configuration will not load. Fixes a segfault in ezstream.c, as reported by Tom McCallum via Github.
This commit is contained in:
parent
7989928690
commit
83d1d17be1
@ -17,7 +17,7 @@
|
|||||||
<stream>
|
<stream>
|
||||||
<mountpoint>/video.ogg</mountpoint>
|
<mountpoint>/video.ogg</mountpoint>
|
||||||
<format>Theora</format>
|
<format>Theora</format>
|
||||||
<encoder>PassThrough</encoder>
|
<!-- No encoder configured (see below). -->
|
||||||
</stream>
|
</stream>
|
||||||
</streams>
|
</streams>
|
||||||
|
|
||||||
@ -30,19 +30,14 @@
|
|||||||
<decoders>
|
<decoders>
|
||||||
<decoder>
|
<decoder>
|
||||||
<name>Theora-192x128</name>
|
<name>Theora-192x128</name>
|
||||||
<!-- Reencode into Ogg Theora directly -->
|
<!--
|
||||||
|
Reencodes into Ogg Theora directly. The stream should be configured
|
||||||
|
without an encoder, so that the decoder output is passed through as-is.
|
||||||
|
-->
|
||||||
<program>ffmpeg2theora -x 192 -y 128 -a 0 -v 4 --title @M@ -o - @T@</program>
|
<program>ffmpeg2theora -x 192 -y 128 -a 0 -v 4 --title @M@ -o - @T@</program>
|
||||||
<file_ext>.avi</file_ext>
|
<file_ext>.avi</file_ext>
|
||||||
<file_ext>.mpg</file_ext>
|
<file_ext>.mpg</file_ext>
|
||||||
</decoder>
|
</decoder>
|
||||||
</decoders>
|
</decoders>
|
||||||
|
|
||||||
<encoders>
|
|
||||||
<encoder>
|
|
||||||
<name>PassThrough</name>
|
|
||||||
<format>Theora</format>
|
|
||||||
<!-- Do not set an encoder program to pass through data as-is -->
|
|
||||||
</encoder>
|
|
||||||
</encoders>
|
|
||||||
|
|
||||||
</ezstream>
|
</ezstream>
|
||||||
|
@ -210,16 +210,17 @@ cfg_encoder_set_format_str(struct cfg_encoder *e,
|
|||||||
int
|
int
|
||||||
cfg_encoder_set_program(struct cfg_encoder *e,
|
cfg_encoder_set_program(struct cfg_encoder *e,
|
||||||
struct cfg_encoder_list *not_used, const char *program,
|
struct cfg_encoder_list *not_used, const char *program,
|
||||||
const char **not_used2)
|
const char **errstrp)
|
||||||
{
|
{
|
||||||
(void)not_used;
|
(void)not_used;
|
||||||
(void)not_used2;
|
|
||||||
|
if (!program || !program[0]) {
|
||||||
|
if (errstrp)
|
||||||
|
*errstrp = "empty";
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
|
|
||||||
xfree(e->program);
|
xfree(e->program);
|
||||||
|
|
||||||
if (!program || !program[0])
|
|
||||||
e->program = NULL;
|
|
||||||
else
|
|
||||||
e->program = xstrdup(program);
|
e->program = xstrdup(program);
|
||||||
|
|
||||||
return (0);
|
return (0);
|
||||||
@ -234,8 +235,11 @@ cfg_encoder_validate(struct cfg_encoder *e, const char **errstrp)
|
|||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!e->program)
|
if (!e->program) {
|
||||||
return (0);
|
if (errstrp)
|
||||||
|
*errstrp = "program not set";
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
|
|
||||||
CHECKPH_PROHIBITED(e->program, PLACEHOLDER_TRACK);
|
CHECKPH_PROHIBITED(e->program, PLACEHOLDER_TRACK);
|
||||||
CHECKPH_PROHIBITED(e->program, PLACEHOLDER_STRING);
|
CHECKPH_PROHIBITED(e->program, PLACEHOLDER_STRING);
|
||||||
|
@ -309,27 +309,6 @@ _parse_ezconfig0(EZCONFIG *ez)
|
|||||||
cfg_encoder_list_remove(enc_list, &enc);
|
cfg_encoder_list_remove(enc_list, &enc);
|
||||||
warnings++;
|
warnings++;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
if (ed->format &&
|
|
||||||
0 == strcasecmp(ed->format, "THEORA")) {
|
|
||||||
cfg_encoder_t enc;
|
|
||||||
|
|
||||||
enc = cfg_encoder_list_find(enc_list,
|
|
||||||
ed->format);
|
|
||||||
if (NULL == enc)
|
|
||||||
enc = cfg_encoder_list_get(enc_list,
|
|
||||||
CFG_DEFAULT);
|
|
||||||
ENTITY_SET(enc, enc_list, cfg_encoder_set_name,
|
|
||||||
"<format> (encoder)", ed->format);
|
|
||||||
ENTITY_SET(enc, enc_list, cfg_encoder_set_format_str,
|
|
||||||
"<format> (encoder)", ed->format);
|
|
||||||
if (0 > cfg_encoder_validate(enc, &err_str)) {
|
|
||||||
log_warning("%s: %s: %s", v0_cfgfile,
|
|
||||||
"<encdec> (encoder)", err_str);
|
|
||||||
cfg_encoder_list_remove(enc_list, &enc);
|
|
||||||
warnings++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (ed->decoder) {
|
if (ed->decoder) {
|
||||||
cfg_decoder_t dec = NULL;
|
cfg_decoder_t dec = NULL;
|
||||||
|
@ -52,13 +52,8 @@ END_TEST
|
|||||||
|
|
||||||
START_TEST(test_encoder_set_program)
|
START_TEST(test_encoder_set_program)
|
||||||
{
|
{
|
||||||
cfg_encoder_t enc = cfg_encoder_list_get(encoders, "test_encoder_set_program");
|
TEST_XSTRDUP_T(cfg_encoder_t, cfg_encoder_list_get, encoders,
|
||||||
|
cfg_encoder_set_program, cfg_encoder_get_program);
|
||||||
ck_assert_int_eq(cfg_encoder_set_program(enc, encoders, NULL, NULL), 0);
|
|
||||||
ck_assert_ptr_eq(cfg_encoder_get_program(enc), NULL);
|
|
||||||
|
|
||||||
ck_assert_int_eq(cfg_encoder_set_program(enc, encoders, "test", NULL), 0);
|
|
||||||
ck_assert_str_eq(cfg_encoder_get_program(enc), "test");
|
|
||||||
}
|
}
|
||||||
END_TEST
|
END_TEST
|
||||||
|
|
||||||
@ -94,14 +89,25 @@ END_TEST
|
|||||||
START_TEST(test_encoder_validate)
|
START_TEST(test_encoder_validate)
|
||||||
{
|
{
|
||||||
cfg_encoder_t enc = cfg_encoder_list_get(encoders, "test_encoder_validate");
|
cfg_encoder_t enc = cfg_encoder_list_get(encoders, "test_encoder_validate");
|
||||||
|
cfg_encoder_t enc2 = cfg_encoder_list_get(encoders, "test_encoder_validate_2");;
|
||||||
const char *errstr;
|
const char *errstr;
|
||||||
|
|
||||||
|
errstr = NULL;
|
||||||
|
ck_assert_int_ne(cfg_encoder_set_name(enc2, encoders,
|
||||||
|
"test_encoder_validate", &errstr), 0);
|
||||||
|
ck_assert_str_eq(errstr, "already exists");
|
||||||
|
|
||||||
ck_assert_int_ne(cfg_encoder_validate(enc, NULL), 0);
|
ck_assert_int_ne(cfg_encoder_validate(enc, NULL), 0);
|
||||||
ck_assert_int_ne(cfg_encoder_validate(enc, &errstr), 0);
|
ck_assert_int_ne(cfg_encoder_validate(enc, &errstr), 0);
|
||||||
ck_assert_str_eq(errstr, "format not set");
|
ck_assert_str_eq(errstr, "format not set");
|
||||||
|
|
||||||
ck_assert_int_eq(cfg_encoder_set_format(enc, CFG_STREAM_VORBIS), 0);
|
ck_assert_int_eq(cfg_encoder_set_format(enc, CFG_STREAM_VORBIS), 0);
|
||||||
|
|
||||||
|
ck_assert_int_ne(cfg_encoder_validate(enc, &errstr), 0);
|
||||||
|
ck_assert_str_eq(errstr, "program not set");
|
||||||
|
|
||||||
|
ck_assert_int_eq(cfg_encoder_set_program(enc, encoders, "test", NULL),
|
||||||
|
0);
|
||||||
ck_assert_int_eq(cfg_encoder_validate(enc, NULL), 0);
|
ck_assert_int_eq(cfg_encoder_validate(enc, NULL), 0);
|
||||||
|
|
||||||
ck_assert_int_eq(cfg_encoder_set_program(enc, encoders,
|
ck_assert_int_eq(cfg_encoder_set_program(enc, encoders,
|
||||||
|
Loading…
Reference in New Issue
Block a user