From 6ec1b3035d8318a2543bced27dca3c4c3bf42995 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Damir=20Ned=C5=BEibovi=C4=87?= Date: Thu, 10 Jun 2021 15:33:12 +0200 Subject: [PATCH] Do not use metadata for setting the recording file; use output_destination instead. --- daemon/call_interfaces.c | 8 +++++--- daemon/recording.c | 12 ++++++++++-- daemon/redis.c | 2 +- include/recording.h | 2 +- recording-daemon/metafile.c | 26 ++------------------------ recording-daemon/output.c | 30 ++++++++++++++++++++---------- recording-daemon/output.h | 1 + recording-daemon/packet.c | 6 +++--- 8 files changed, 43 insertions(+), 44 deletions(-) diff --git a/daemon/call_interfaces.c b/daemon/call_interfaces.c index 85c0337b0..77ad40754 100644 --- a/daemon/call_interfaces.c +++ b/daemon/call_interfaces.c @@ -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) { diff --git a/daemon/recording.c b/daemon/recording.c index bb178f790..aff28c73c 100644 --- a/daemon/recording.c +++ b/daemon/recording.c @@ -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; diff --git a/daemon/redis.c b/daemon/redis.c index c903c971c..af5afac89 100644 --- a/daemon/redis.c +++ b/daemon/redis.c @@ -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; diff --git a/include/recording.h b/include/recording.h index c24d1504b..4662ede92 100644 --- a/include/recording.h +++ b/include/recording.h @@ -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); diff --git a/recording-daemon/metafile.c b/recording-daemon/metafile.c index 323cb8cad..6b7853761 100644 --- a/recording-daemon/metafile.c +++ b/recording-daemon/metafile.c @@ -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); } diff --git a/recording-daemon/output.c b/recording-daemon/output.c index 8092ecac3..38f6d16a9 100644 --- a/recording-daemon/output.c +++ b/recording-daemon/output.c @@ -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; diff --git a/recording-daemon/output.h b/recording-daemon/output.h index a65e9a322..6ff30322e 100644 --- a/recording-daemon/output.h +++ b/recording-daemon/output.h @@ -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); diff --git a/recording-daemon/packet.c b/recording-daemon/packet.c index 88c879f21..6a4cb1fb7 100644 --- a/recording-daemon/packet.c +++ b/recording-daemon/packet.c @@ -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 {