From 2ef8028eb27fba0bd7db27c8095645e3a668d0bd Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Thu, 14 Feb 2019 10:18:21 -0500 Subject: [PATCH] TT#52651 make recording to output files optional Change-Id: I12c288b965641352658ce3b499c2ee90593e1322 --- recording-daemon/decoder.c | 4 ++++ recording-daemon/main.c | 9 ++++++++- recording-daemon/main.h | 1 + recording-daemon/metafile.c | 9 ++++++--- recording-daemon/output.c | 9 +++++++++ recording-daemon/stream.c | 2 +- recording-daemon/types.h | 2 ++ 7 files changed, 31 insertions(+), 5 deletions(-) diff --git a/recording-daemon/decoder.c b/recording-daemon/decoder.c index 668288231..bda8465e7 100644 --- a/recording-daemon/decoder.c +++ b/recording-daemon/decoder.c @@ -90,6 +90,9 @@ static int decoder_got_frame(decoder_t *dec, AVFrame *frame, void *op, void *mp, (unsigned int) frame->extended_data[0][2], (unsigned int) frame->extended_data[0][3]); + if (!metafile->recording_on) + goto no_recording; + // handle mix output pthread_mutex_lock(&metafile->mix_lock); if (metafile->mix_out) { @@ -118,6 +121,7 @@ no_mix_out: ilog(LOG_ERR, "Failed to add decoded packet to individual output"); } +no_recording: av_frame_free(&frame); return 0; diff --git a/recording-daemon/main.c b/recording-daemon/main.c index b2fd0d8e6..34ed7819e 100644 --- a/recording-daemon/main.c +++ b/recording-daemon/main.c @@ -37,6 +37,7 @@ static const char *output_format = "wav"; int output_mixed; int output_single; int output_enabled = 1; +int decoding_enabled; const char *c_mysql_host, *c_mysql_user, *c_mysql_pass, @@ -69,9 +70,11 @@ static void signals(void) { static void setup(void) { log_init("rtpengine-recording"); - if (output_enabled) { + if (decoding_enabled) { codeclib_init(0); output_init(output_format); + } + if (output_enabled) { if (!g_file_test(output_dir, G_FILE_TEST_IS_DIR)) { ilog(LOG_INFO, "Creating output dir '%s'", output_dir); if (mkdir(output_dir, 0700)) @@ -179,9 +182,13 @@ static void options(int *argc, char ***argv) { //the daemon has no function die("Both output and forwarding are disabled"); } + output_format = NULL; } else if (!output_mixed && !output_single) output_mixed = output_single = 1; + if (output_enabled || tcp_send_to_ep.address.family) + decoding_enabled = 1; + if (!os_str || !strcmp(os_str, "file")) output_storage = OUTPUT_STORAGE_FILE; else if (!strcmp(os_str, "db")) diff --git a/recording-daemon/main.h b/recording-daemon/main.h index 56058c682..76a1dad19 100644 --- a/recording-daemon/main.h +++ b/recording-daemon/main.h @@ -20,6 +20,7 @@ extern const char *output_dir; extern int output_mixed; extern int output_single; extern int output_enabled; +extern int decoding_enabled; extern const char *c_mysql_host, *c_mysql_user, *c_mysql_pass, diff --git a/recording-daemon/metafile.c b/recording-daemon/metafile.c index 5e1d88f37..b6f77e56d 100644 --- a/recording-daemon/metafile.c +++ b/recording-daemon/metafile.c @@ -70,7 +70,7 @@ static void meta_destroy(metafile_t *mf) { // mf is locked static void meta_stream_interface(metafile_t *mf, unsigned long snum, char *content) { db_do_call(mf); - if (output_enabled) { + if (output_enabled && output_mixed) { pthread_mutex_lock(&mf->mix_lock); if (!mf->mix && output_mixed) { char buf[256]; @@ -107,7 +107,7 @@ static void meta_rtp_payload_type(metafile_t *mf, unsigned long mnum, unsigned i ilog(LOG_ERR, "Payload type number %u is invalid", payload_num); return; } - if (output_enabled) { + if (decoding_enabled) { pthread_mutex_lock(&mf->payloads_lock); mf->payload_types[payload_num] = g_string_chunk_insert(mf->gsc, payload_type); @@ -146,6 +146,8 @@ static void meta_section(metafile_t *mf, char *section, char *content, unsigned tag_name(mf, lu, content); else if (sscanf_match(section, "LABEL %lu", &lu) == 1) tag_label(mf, lu, content); + else if (sscanf_match(section, "RECORDING %u", &u) == 1) + mf->recording_on = u; } @@ -167,8 +169,9 @@ static metafile_t *metafile_get(char *name) { mf->forward_fd = -1; mf->forward_count = 0; mf->forward_failed = 0; + mf->recording_on = 1; - if (output_enabled) { + if (decoding_enabled) { pthread_mutex_init(&mf->payloads_lock, NULL); pthread_mutex_init(&mf->mix_lock, NULL); mf->ssrc_hash = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, ssrc_free); diff --git a/recording-daemon/output.c b/recording-daemon/output.c index be49de762..4de81144c 100644 --- a/recording-daemon/output.c +++ b/recording-daemon/output.c @@ -12,6 +12,8 @@ static const codec_def_t *output_codec; static const char *output_file_format; +static const codec_def_t *tcp_send_codec; + int mp3_bitrate; @@ -168,6 +170,13 @@ void output_close(output_t *output) { void output_init(const char *format) { str codec; + str_init(&codec, "PCM-S16LE"); + tcp_send_codec = codec_find(&codec, MT_AUDIO); + assert(tcp_send_codec != NULL); + + if (!format) + return; + if (!strcmp(format, "wav")) { str_init(&codec, "PCM-S16LE"); output_file_format = "wav"; diff --git a/recording-daemon/stream.c b/recording-daemon/stream.c index eba560aee..52abe71e9 100644 --- a/recording-daemon/stream.c +++ b/recording-daemon/stream.c @@ -75,7 +75,7 @@ static void stream_handler(handler_t *handler) { else g_atomic_int_inc(&stream->metafile->forward_count); } - if (output_enabled) + if (decoding_enabled) packet_process(stream, buf, ret); // consumes buf else free(buf); diff --git a/recording-daemon/types.h b/recording-daemon/types.h index 403609acd..2f184d6e3 100644 --- a/recording-daemon/types.h +++ b/recording-daemon/types.h @@ -112,6 +112,8 @@ struct metafile_s { pthread_mutex_t payloads_lock; char *payload_types[128]; + + int recording_on:1; };