|
|
|
|
@ -25,6 +25,8 @@ int mp3_bitrate;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static bool output_shutdown(output_t *output, FILE **, GString **);
|
|
|
|
|
static bool output_config_(sink_t *, output_t *output, const format_t *requested_format,
|
|
|
|
|
format_t *actual_format);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -42,9 +44,14 @@ static int output_got_packet(encoder_t *enc, void *u1, void *u2) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool sink_add(sink_t *sink, AVFrame *frame) {
|
|
|
|
|
bool sink_add(sink_t *sink, AVFrame *frame, const format_t *requested_format) {
|
|
|
|
|
if (!sink)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
format_t actual_format;
|
|
|
|
|
if (!sink->config(sink, requested_format, &actual_format))
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
return sink->add(sink, frame);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -104,6 +111,10 @@ void sink_init(sink_t *sink) {
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static bool output_config__(sink_t *s, const format_t *requested_format, format_t *actual_format) {
|
|
|
|
|
return output_config_(s, s->output, requested_format, actual_format);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static output_t *output_alloc(const char *path, const char *name) {
|
|
|
|
|
output_t *ret = g_new0(output_t, 1);
|
|
|
|
|
ret->file_path = g_strdup(path);
|
|
|
|
|
@ -119,6 +130,7 @@ static output_t *output_alloc(const char *path, const char *name) {
|
|
|
|
|
sink_init(&ret->sink);
|
|
|
|
|
ret->sink.output = ret;
|
|
|
|
|
ret->sink.add = output_add;
|
|
|
|
|
ret->sink.config = output_config__;
|
|
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
@ -308,7 +320,9 @@ int64_t output_avio_mem_seek(void *opaque, int64_t offset, int whence) {
|
|
|
|
|
return o->mempos;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int output_config(output_t *output, const format_t *requested_format, format_t *actual_format) {
|
|
|
|
|
static bool output_config_(sink_t *sink, output_t *output, const format_t *requested_format,
|
|
|
|
|
format_t *actual_format)
|
|
|
|
|
{
|
|
|
|
|
const char *err;
|
|
|
|
|
int av_ret = 0;
|
|
|
|
|
|
|
|
|
|
@ -461,14 +475,19 @@ no_output_file:
|
|
|
|
|
done:
|
|
|
|
|
if (actual_format)
|
|
|
|
|
*actual_format = output->actual_format;
|
|
|
|
|
return 0;
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
err:
|
|
|
|
|
output_shutdown(output, NULL, NULL);
|
|
|
|
|
ilog(LOG_ERR, "Error configuring media output: %s", err);
|
|
|
|
|
if (av_ret)
|
|
|
|
|
ilog(LOG_ERR, "Error returned from libav: %s", av_error(av_ret));
|
|
|
|
|
return -1;
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int output_config(output_t *output, const format_t *requested_format, format_t *actual_format) {
|
|
|
|
|
return output_config_(NULL, output, requested_format, actual_format) ? 0 : -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|