Do not use metadata for setting the recording file; use output_destination instead.

pull/1278/head
Damir Nedžibović 4 years ago
parent f65a76e8a3
commit 6ec1b3035d

@ -1445,7 +1445,7 @@ static const char *call_offer_answer_ng(struct ng_buffer *ngbuf, bencode_item_t
detect_setup_recording(call, &flags.record_call_str, &flags.metadata);
if (flags.record_call) {
call->recording_on = 1;
recording_start(call, NULL, &flags.metadata);
recording_start(call, NULL, &flags.metadata, NULL);
}
if (flags.drop_traffic_start) {
@ -1914,16 +1914,18 @@ const char *call_start_recording_ng(bencode_item_t *input, bencode_item_t *outpu
str callid;
struct call *call;
str metadata;
str output_dest;
if (!bencode_dictionary_get_str(input, "call-id", &callid))
return "No call-id in message";
bencode_dictionary_get_str(input, "metadata", &metadata);
bencode_dictionary_get_str(input, "output_destination", &output_dest);
call = call_get_opmode(&callid, OP_OTHER);
if (!call)
return "Unknown call-id";
call->recording_on = 1;
recording_start(call, NULL, &metadata);
recording_start(call, NULL, &metadata, &output_dest);
rwlock_unlock_w(&call->master_lock);
obj_put(call);
@ -2034,7 +2036,7 @@ const char *call_start_forwarding_ng(bencode_item_t *input, bencode_item_t *outp
call->rec_forwarding = 1;
}
recording_start(call, NULL, &flags.metadata);
recording_start(call, NULL, &flags.metadata, NULL);
errstr = NULL;
out:
if (call) {

@ -244,6 +244,12 @@ static void update_metadata(struct call *call, str *metadata) {
}
}
static void update_output_dest(struct call *call, str *output_dest) {
if (!output_dest || !output_dest->s || !call->recording)
return;
recording_meta_chunk(call->recording, "OUTPUT_DESTINATION", output_dest);
}
// lock must be held
static void update_flags_proc(struct call *call) {
append_meta_chunk_null(call->recording, "RECORDING %u", call->recording_on ? 1 : 0);
@ -259,9 +265,11 @@ static void recording_update_flags(struct call *call) {
}
// lock must be held
void recording_start(struct call *call, const char *prefix, str *metadata) {
void recording_start(struct call *call, const char *prefix, str *metadata, str *output_dest) {
update_metadata(call, metadata);
update_output_dest(call, output_dest);
if (call->recording) {
// already active
recording_update_flags(call);
@ -350,7 +358,7 @@ void detect_setup_recording(struct call *call, const str *recordcall, str *metad
if (!str_cmp(recordcall, "yes") || !str_cmp(recordcall, "on")) {
call->recording_on = 1;
recording_start(call, NULL, NULL);
recording_start(call, NULL, NULL, NULL);
}
else if (!str_cmp(recordcall, "no") || !str_cmp(recordcall, "off")) {
call->recording_on = 0;

@ -1923,7 +1923,7 @@ static void json_restore_call(struct redis *r, const str *callid, int foreign) {
if (!redis_hash_get_str(&s, &call, "recording_meta_prefix")) {
// coverity[check_return : FALSE]
redis_hash_get_str(&meta, &call, "recording_metadata");
recording_start(c, s.s, &meta);
recording_start(c, s.s, &meta, NULL);
}
err = NULL;

@ -117,7 +117,7 @@ void recording_fs_free(void);
*/
void detect_setup_recording(struct call *call, const str *recordcall, str *metadata);
void recording_start(struct call *call, const char *prefix, str *metadata);
void recording_start(struct call *call, const char *prefix, str *metadata, str *output_dest);
void recording_stop(struct call *call, str *metadata);

@ -149,34 +149,10 @@ static void meta_ptime(metafile_t *mf, unsigned long mnum, int ptime)
mf->media_ptimes[mnum] = ptime;
}
static char *get_output_path(metafile_t *mf) {
static const char *of = "output-file";
char *res = NULL;
str all_meta;
str_init(&all_meta, mf->metadata);
while (all_meta.len > 1) {
str token;
if (str_token_sep(&token, &all_meta, '|'))
break;
str key;
if (str_token(&key, &token, ':')) {
// key:value separator not found, skip
continue;
}
if (strncmp(key.s, of, strlen(of)) >= 0) {
ilog(LOG_INFO, "Metadata output-file found token=%s", token.s);
res = token.s;
break;
}
}
return res;
}
// mf is locked
static void meta_metadata(metafile_t *mf, char *content) {
mf->metadata = g_string_chunk_insert(mf->gsc, content);
mf->metadata_db = mf->metadata;
mf->output_dest = get_output_path(mf);
db_do_call(mf);
if (forward_to)
start_forwarding_capture(mf, content);
@ -215,6 +191,8 @@ static void meta_section(metafile_t *mf, char *section, char *content, unsigned
mf->forwarding_on = u ? 1 : 0;
else if (sscanf_match(section, "STREAM %lu FORWARDING %u", &lu, &u) == 2)
stream_forwarding_on(mf, lu, u);
else if (!strcmp(section, "OUTPUT_DESTINATION"))
mf->output_dest = g_string_chunk_insert(mf->gsc, content);
}

@ -81,6 +81,19 @@ static void create_parent_dirs(char *dir) {
}
}
static output_t *output_alloc(const char *path, const char *name) {
output_t *ret = g_slice_alloc0(sizeof(*ret));
ret->file_path = g_strdup(path);
ret->file_name = g_strdup(name);
ret->full_filename = g_strdup_printf("%s/%s", path, name);
ret->file_format = output_file_format;
ret->encoder = encoder_new();
ret->channel_mult = 1;
ret->requested_format.format = -1;
ret->actual_format.format = -1;
return ret;
}
output_t *output_new(const char *path, const char *call, const char *type) {
// construct output file name
@ -159,16 +172,7 @@ output_t *output_new(const char *path, const char *call, const char *type) {
}
done:;
output_t *ret = g_slice_alloc0(sizeof(*ret));
ret->file_path = g_strdup(path);
ret->file_name = f->str; // stealing the content
ret->full_filename = g_strdup_printf("%s/%s", path, f->str);
ret->file_format = output_file_format;
ret->encoder = encoder_new();
ret->channel_mult = 1;
ret->requested_format.format = -1;
ret->actual_format.format = -1;
output_t *ret = output_alloc(path, f->str);
create_parent_dirs(ret->full_filename);
g_string_free(f, FALSE);
@ -176,6 +180,12 @@ done:;
return ret;
}
output_t *output_new_from_full_path(const char *path, char *name) {
output_t *ret = output_alloc(path, name);
create_parent_dirs(ret->full_filename);
return ret;
}
int output_config(output_t *output, const format_t *requested_format, format_t *actual_format) {
const char *err;

@ -11,6 +11,7 @@ extern int mp3_bitrate;
void output_init(const char *format);
output_t *output_new(const char *path, const char *call, const char *type);
output_t *output_new_from_full_path(const char *path, char *name);
void output_close(output_t *);
int output_config(output_t *output, const format_t *requested_format, format_t *actual_format);

@ -176,7 +176,7 @@ out:
dbg("Init for SSRC %s%lx%s of stream #%lu", FMT_M(ret->ssrc), stream->id);
if (mf->recording_on && !ret->output && output_single) {
ilog(LOG_INFO, "Metadata %s and output %s", mf->metadata, mf->output_dest);
dbg("Metadata %s, output destination %s", mf->metadata, mf->output_dest);
if (mf->output_dest) {
char path[256];
strncpy(path, mf->output_dest, sizeof(path));
@ -184,11 +184,11 @@ out:
if (sep) {
char *filename = sep + 1;
*sep = 0;
ret->output = output_new(path, mf->parent, filename);
ret->output = output_new_from_full_path(path, filename);
ret->output->skip_filename_extension = TRUE;
}
else {
ret->output = output_new(output_dir, mf->parent, path);
ret->output = output_new_from_full_path(output_dir, path);
}
}
else {

Loading…
Cancel
Save