|
|
|
@ -9,6 +9,8 @@ |
|
|
|
#include "main.h" |
|
|
|
#include "streambuf.h" |
|
|
|
#include "fix_frame_channel_layout.h" |
|
|
|
#include "output.h" |
|
|
|
#include "tag.h" |
|
|
|
|
|
|
|
|
|
|
|
static ssize_t ssrc_tls_write(void *, const void *, size_t); |
|
|
|
@ -73,7 +75,6 @@ void tls_fwd_shutdown(tls_fwd_t **p) { |
|
|
|
return; |
|
|
|
streambuf_destroy(tls_fwd->stream); |
|
|
|
tls_fwd->stream = NULL; |
|
|
|
resample_shutdown(&tls_fwd->resampler); |
|
|
|
if (tls_fwd->ssl) { |
|
|
|
SSL_free(tls_fwd->ssl); |
|
|
|
tls_fwd->ssl = NULL; |
|
|
|
@ -84,11 +85,12 @@ void tls_fwd_shutdown(tls_fwd_t **p) { |
|
|
|
} |
|
|
|
close_socket(&tls_fwd->sock); |
|
|
|
av_frame_free(&tls_fwd->silence_frame); |
|
|
|
sink_close(&tls_fwd->sink); |
|
|
|
g_clear_pointer(p, g_free); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void tls_fwd_state(tls_fwd_t **p) { |
|
|
|
static void tls_fwd_state(tls_fwd_t **p) { |
|
|
|
tls_fwd_t *tls_fwd = *p; |
|
|
|
int ret; |
|
|
|
|
|
|
|
@ -140,7 +142,7 @@ void tls_fwd_state(tls_fwd_t **p) { |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void tls_fwd_silence_frames_upto(tls_fwd_t *tls_fwd, AVFrame *frame, int64_t upto) { |
|
|
|
static void tls_fwd_silence_frames_upto(tls_fwd_t *tls_fwd, AVFrame *frame, int64_t upto) { |
|
|
|
unsigned int silence_samples = tls_fwd->format.clockrate / 100; |
|
|
|
|
|
|
|
while (tls_fwd->in_pts < upto) { |
|
|
|
@ -183,6 +185,69 @@ void tls_fwd_silence_frames_upto(tls_fwd_t *tls_fwd, AVFrame *frame, int64_t upt |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static bool tls_fwd_add(sink_t *sink, AVFrame *frame) { |
|
|
|
tls_fwd_t **p = sink->tls_fwd; |
|
|
|
|
|
|
|
tls_fwd_state(p); |
|
|
|
|
|
|
|
// if we're in the middle of a disconnect then ssrc_tls_state may have destroyed the streambuf |
|
|
|
// so we need to skip the below to ensure we only send metadata for the new connection |
|
|
|
// once we've got a new streambuf |
|
|
|
tls_fwd_t *tls_fwd = *p; |
|
|
|
if (!tls_fwd) { |
|
|
|
av_frame_free(&frame); |
|
|
|
return false; |
|
|
|
} |
|
|
|
|
|
|
|
if (!tls_fwd->sent_intro) { |
|
|
|
ssrc_t *ssrc = tls_fwd->ssrc; |
|
|
|
metafile_t *metafile = tls_fwd->metafile; |
|
|
|
tag_t *tag = NULL; |
|
|
|
|
|
|
|
if (ssrc->stream) |
|
|
|
tag = tag_get(metafile, ssrc->stream->tag); |
|
|
|
|
|
|
|
if (tag && tag->metadata) { |
|
|
|
dbg("Writing tag metadata header to TLS"); |
|
|
|
streambuf_write(tls_fwd->stream, tag->metadata, strlen(tag->metadata) + 1); |
|
|
|
} |
|
|
|
else if (metafile->metadata) { |
|
|
|
dbg("Writing call metadata header to TLS"); |
|
|
|
streambuf_write(tls_fwd->stream, metafile->metadata, strlen(metafile->metadata) + 1); |
|
|
|
} |
|
|
|
else { |
|
|
|
ilog(LOG_WARN, "No metadata present for forwarding connection"); |
|
|
|
streambuf_write(tls_fwd->stream, "\0", 1); |
|
|
|
} |
|
|
|
tls_fwd->sent_intro = 1; |
|
|
|
} |
|
|
|
|
|
|
|
tls_fwd_silence_frames_upto(tls_fwd, frame, frame->pts); |
|
|
|
uint64_t next_pts = frame->pts + frame->nb_samples; |
|
|
|
if (next_pts > tls_fwd->in_pts) |
|
|
|
tls_fwd->in_pts = next_pts; |
|
|
|
|
|
|
|
int linesize = av_get_bytes_per_sample(frame->format) * frame->nb_samples; |
|
|
|
dbg("Writing %u bytes PCM to TLS", linesize); |
|
|
|
streambuf_write(tls_fwd->stream, (char *) frame->extended_data[0], linesize); |
|
|
|
|
|
|
|
av_frame_free(&frame); |
|
|
|
|
|
|
|
return true; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static bool tls_fwd_config(sink_t *sink, const format_t *requested_format, format_t *actual_format) |
|
|
|
{ |
|
|
|
*actual_format = (format_t) { |
|
|
|
.clockrate = tls_resample, |
|
|
|
.format = AV_SAMPLE_FMT_S16, |
|
|
|
.channels = 1, |
|
|
|
}; |
|
|
|
return true; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void tls_fwd_init(stream_t *stream, metafile_t *mf, ssrc_t *ssrc) { |
|
|
|
if ((!stream->forwarding_on && !mf->forwarding_on) || !tls_send_to_ep.port) { |
|
|
|
tls_fwd_shutdown(&ssrc->tls_fwd); |
|
|
|
@ -238,6 +303,9 @@ void tls_fwd_init(stream_t *stream, metafile_t *mf, ssrc_t *ssrc) { |
|
|
|
tls_fwd->stream = streambuf_new(&tls_fwd->poller, tls_fwd->sock.fd); |
|
|
|
} |
|
|
|
|
|
|
|
tls_fwd->ssrc = ssrc; |
|
|
|
tls_fwd->metafile = mf; |
|
|
|
|
|
|
|
tls_fwd_state(&ssrc->tls_fwd); |
|
|
|
if (!ssrc->tls_fwd) // may have been closed |
|
|
|
return; |
|
|
|
@ -247,4 +315,9 @@ void tls_fwd_init(stream_t *stream, metafile_t *mf, ssrc_t *ssrc) { |
|
|
|
.channels = 1, |
|
|
|
.format = AV_SAMPLE_FMT_S16, |
|
|
|
}; |
|
|
|
|
|
|
|
sink_init(&tls_fwd->sink); |
|
|
|
tls_fwd->sink.tls_fwd = &ssrc->tls_fwd; |
|
|
|
tls_fwd->sink.add = tls_fwd_add; |
|
|
|
tls_fwd->sink.config = tls_fwd_config; |
|
|
|
} |