From 376cef4fa59e49737aee4841a4917bb0306460f7 Mon Sep 17 00:00:00 2001 From: Andreas Eversberg Date: Fri, 14 Oct 2022 19:40:19 +0200 Subject: [PATCH] Osmo-CC: Add marker bit support --- src/libmobile/call.c | 6 +++--- src/libmobile/console.c | 8 ++++---- src/libosmocc/helper.c | 4 ++-- src/libosmocc/helper.h | 4 ++-- src/libosmocc/rtp.c | 10 +++++----- src/libosmocc/rtp.h | 2 +- src/libosmocc/session.c | 4 ++-- src/libosmocc/session.h | 6 +++--- 8 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/libmobile/call.c b/src/libmobile/call.c index d9af590..b4054f7 100644 --- a/src/libmobile/call.c +++ b/src/libmobile/call.c @@ -387,7 +387,7 @@ static void process_timeout(struct timer *timer) } } -void down_audio(struct osmo_cc_session_codec *codec, uint16_t sequence_number, uint32_t timestamp, uint32_t ssrc, uint8_t *data, int len) +void down_audio(struct osmo_cc_session_codec *codec, uint8_t __attribute__((unused)) marker, uint16_t sequence_number, uint32_t timestamp, uint32_t ssrc, uint8_t *data, int len) { process_t *process = codec->media->session->priv; sample_t samples[len / 2]; @@ -622,7 +622,7 @@ void call_up_audio(int callref, sample_t *samples, int count) printf(" mobil-level: %s%.4f\n", debug_db(lev), (20 * log10(lev))); #endif samples_to_int16_speech(data, samples, count); - osmo_cc_rtp_send(process->codec, (uint8_t *)data, count * 2, 1, count); + osmo_cc_rtp_send(process->codec, (uint8_t *)data, count * 2, 0, 1, count); /* don't destroy process here in case of an error */ } @@ -645,7 +645,7 @@ void call_clock(void) printf(" mobil-level: %s%.4f\n", debug_db(lev), (20 * log10(lev))); samples_to_int16(data, samples, 160); #endif - osmo_cc_rtp_send(process->codec, (uint8_t *)data, 160 * 2, 1, 160); + osmo_cc_rtp_send(process->codec, (uint8_t *)data, 160 * 2, 0, 1, 160); /* don't destroy process here in case of an error */ } process = process->next; diff --git a/src/libmobile/console.c b/src/libmobile/console.c index 7309dc3..64abec3 100755 --- a/src/libmobile/console.c +++ b/src/libmobile/console.c @@ -141,7 +141,7 @@ static void free_console(void) console.callref = 0; } -void up_audio(struct osmo_cc_session_codec *codec, uint16_t sequence_number, uint32_t timestamp, uint32_t ssrc, uint8_t *data, int len) +void up_audio(struct osmo_cc_session_codec *codec, uint8_t __attribute__((unused)) marker, uint16_t sequence_number, uint32_t timestamp, uint32_t ssrc, uint8_t *data, int len) { int count = len / 2; sample_t samples[count]; @@ -154,13 +154,13 @@ void up_audio(struct osmo_cc_session_codec *codec, uint16_t sequence_number, uin } /* if echo test is used, send echo back to mobile */ if (console.echo_test) { - osmo_cc_rtp_send(codec, (uint8_t *)data, count * 2, 1, count); + osmo_cc_rtp_send(codec, (uint8_t *)data, count * 2, 0, 1, count); return; } /* if no sound is used, send test tone to mobile */ if (console.state == CONSOLE_CONNECT) { get_test_patterns((int16_t *)data, count); - osmo_cc_rtp_send(codec, (uint8_t *)data, count * 2, 1, count); + osmo_cc_rtp_send(codec, (uint8_t *)data, count * 2, 0, 1, count); return; } } @@ -628,7 +628,7 @@ void process_console(int c) if (console.callref && console.codec) { int16_t data[160]; samples_to_int16_speech(data, console.tx_buffer, 160); - osmo_cc_rtp_send(console.codec, (uint8_t *)data, 160 * 2, 1, 160); + osmo_cc_rtp_send(console.codec, (uint8_t *)data, 160 * 2, 0, 1, 160); } } } diff --git a/src/libosmocc/helper.c b/src/libosmocc/helper.c index 8917917..4eeee92 100644 --- a/src/libosmocc/helper.c +++ b/src/libosmocc/helper.c @@ -29,7 +29,7 @@ #include "endpoint.h" #include "helper.h" -osmo_cc_session_t *osmo_cc_helper_audio_offer(osmo_cc_session_config_t *conf, void *priv, struct osmo_cc_helper_audio_codecs *codecs, void (*receiver)(struct osmo_cc_session_codec *codec, uint16_t sequence_number, uint32_t timestamp, uint32_t ssrc, uint8_t *data, int len), osmo_cc_msg_t *msg, int debug) +osmo_cc_session_t *osmo_cc_helper_audio_offer(osmo_cc_session_config_t *conf, void *priv, struct osmo_cc_helper_audio_codecs *codecs, void (*receiver)(struct osmo_cc_session_codec *codec, uint8_t marker, uint16_t sequence_number, uint32_t timestamp, uint32_t ssrc, uint8_t *data, int len), osmo_cc_msg_t *msg, int debug) { osmo_cc_session_t *session; osmo_cc_session_media_t *media; @@ -52,7 +52,7 @@ osmo_cc_session_t *osmo_cc_helper_audio_offer(osmo_cc_session_config_t *conf, vo return session; } -const char *osmo_cc_helper_audio_accept(osmo_cc_session_config_t *conf, void *priv, struct osmo_cc_helper_audio_codecs *codecs, void (*receiver)(struct osmo_cc_session_codec *codec, uint16_t sequence_number, uint32_t timestamp, uint32_t ssrc, uint8_t *data, int len), osmo_cc_msg_t *msg, osmo_cc_session_t **session_p, osmo_cc_session_codec_t **codec_p, int force_our_codec) +const char *osmo_cc_helper_audio_accept(osmo_cc_session_config_t *conf, void *priv, struct osmo_cc_helper_audio_codecs *codecs, void (*receiver)(struct osmo_cc_session_codec *codec, uint8_t marker, uint16_t sequence_number, uint32_t timestamp, uint32_t ssrc, uint8_t *data, int len), osmo_cc_msg_t *msg, osmo_cc_session_t **session_p, osmo_cc_session_codec_t **codec_p, int force_our_codec) { char offer_sdp[65536]; const char *accept_sdp; diff --git a/src/libosmocc/helper.h b/src/libosmocc/helper.h index 97a284f..0d3585e 100644 --- a/src/libosmocc/helper.h +++ b/src/libosmocc/helper.h @@ -7,7 +7,7 @@ struct osmo_cc_helper_audio_codecs { void (*decoder)(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len); }; -osmo_cc_session_t *osmo_cc_helper_audio_offer(osmo_cc_session_config_t *conf, void *priv, struct osmo_cc_helper_audio_codecs *codecs, void (*receiver)(struct osmo_cc_session_codec *codec, uint16_t sequence_number, uint32_t timestamp, uint32_t ssrc, uint8_t *data, int len), osmo_cc_msg_t *msg, int debug); -const char *osmo_cc_helper_audio_accept(osmo_cc_session_config_t *conf, void *priv, struct osmo_cc_helper_audio_codecs *codecs, void (*receiver)(struct osmo_cc_session_codec *codec, uint16_t sequence_number, uint32_t timestamp, uint32_t ssrc, uint8_t *data, int len), osmo_cc_msg_t *msg, osmo_cc_session_t **session_p, osmo_cc_session_codec_t **codec_p, int force_our_codec); +osmo_cc_session_t *osmo_cc_helper_audio_offer(osmo_cc_session_config_t *conf, void *priv, struct osmo_cc_helper_audio_codecs *codecs, void (*receiver)(struct osmo_cc_session_codec *codec, uint8_t marker, uint16_t sequence_number, uint32_t timestamp, uint32_t ssrc, uint8_t *data, int len), osmo_cc_msg_t *msg, int debug); +const char *osmo_cc_helper_audio_accept(osmo_cc_session_config_t *conf, void *priv, struct osmo_cc_helper_audio_codecs *codecs, void (*receiver)(struct osmo_cc_session_codec *codec, uint8_t marker, uint16_t sequence_number, uint32_t timestamp, uint32_t ssrc, uint8_t *data, int len), osmo_cc_msg_t *msg, osmo_cc_session_t **session_p, osmo_cc_session_codec_t **codec_p, int force_our_codec); int osmo_cc_helper_audio_negotiate(osmo_cc_msg_t *msg, osmo_cc_session_t **session_p, osmo_cc_session_codec_t **codec_p); diff --git a/src/libosmocc/rtp.c b/src/libosmocc/rtp.c index f6572ca..b118833 100644 --- a/src/libosmocc/rtp.c +++ b/src/libosmocc/rtp.c @@ -132,7 +132,7 @@ static int rtp_receive(int sock, uint8_t **payload_p, int *payload_len_p, uint8_ return 0; } -static void rtp_send(int sock, uint8_t *payload, int payload_len, uint8_t pt, uint16_t sequence, uint32_t timestamp, uint32_t ssrc) +static void rtp_send(int sock, uint8_t *payload, int payload_len, uint8_t marker, uint8_t pt, uint16_t sequence, uint32_t timestamp, uint32_t ssrc) { struct rtp_hdr *rtph; char data[sizeof(*rtph) + payload_len]; @@ -141,7 +141,7 @@ static void rtp_send(int sock, uint8_t *payload, int payload_len, uint8_t pt, ui rtph = (struct rtp_hdr *)data; len = sizeof(*rtph); rtph->byte0 = RTP_VERSION << 6; - rtph->byte1 = pt; + rtph->byte1 = pt | (marker << 7); rtph->sequence = htons(sequence); rtph->timestamp = htonl(timestamp); rtph->ssrc = htonl(ssrc); @@ -321,7 +321,7 @@ connect_error: } /* send rtp data with given codec */ -void osmo_cc_rtp_send(osmo_cc_session_codec_t *codec, uint8_t *data, int len, int inc_sequence, int inc_timestamp) +void osmo_cc_rtp_send(osmo_cc_session_codec_t *codec, uint8_t *data, int len, uint8_t marker, int inc_sequence, int inc_timestamp) { uint8_t *payload = NULL; int payload_len = 0; @@ -336,7 +336,7 @@ void osmo_cc_rtp_send(osmo_cc_session_codec_t *codec, uint8_t *data, int len, in payload_len = len; } - rtp_send(codec->media->rtp_socket, payload, payload_len, codec->payload_type_remote, codec->media->tx_sequence, codec->media->tx_timestamp, codec->media->tx_ssrc); + rtp_send(codec->media->rtp_socket, payload, payload_len, marker, codec->payload_type_remote, codec->media->tx_sequence, codec->media->tx_timestamp, codec->media->tx_ssrc); codec->media->tx_sequence += inc_sequence; codec->media->tx_timestamp += inc_timestamp; @@ -382,7 +382,7 @@ int osmo_cc_rtp_receive(osmo_cc_session_media_t *media) } if (codec->media->receive) - codec->media->receiver(codec, media->rx_sequence, media->rx_timestamp, media->rx_ssrc, data, len); + codec->media->receiver(codec, marker, media->rx_sequence, media->rx_timestamp, media->rx_ssrc, data, len); if (codec->decoder) free(data); diff --git a/src/libosmocc/rtp.h b/src/libosmocc/rtp.h index e309f56..eb74f73 100644 --- a/src/libosmocc/rtp.h +++ b/src/libosmocc/rtp.h @@ -2,7 +2,7 @@ void osmo_cc_set_rtp_ports(osmo_cc_session_config_t *conf, uint16_t from, uint16_t to); int osmo_cc_rtp_open(osmo_cc_session_media_t *media); int osmo_cc_rtp_connect(osmo_cc_session_media_t *media); -void osmo_cc_rtp_send(osmo_cc_session_codec_t *codec, uint8_t *data, int len, int inc_sequence, int inc_timestamp); +void osmo_cc_rtp_send(osmo_cc_session_codec_t *codec, uint8_t *data, int len, uint8_t marker, int inc_sequence, int inc_timestamp); int osmo_cc_rtp_receive(osmo_cc_session_media_t *media); void osmo_cc_rtp_close(osmo_cc_session_media_t *media); diff --git a/src/libosmocc/session.c b/src/libosmocc/session.c index 3546900..8216c05 100644 --- a/src/libosmocc/session.c +++ b/src/libosmocc/session.c @@ -127,7 +127,7 @@ void osmo_cc_free_session(osmo_cc_session_t *session) free(session); } -osmo_cc_session_media_t *osmo_cc_add_media(osmo_cc_session_t *session, enum osmo_cc_session_nettype nettype, enum osmo_cc_session_addrtype addrtype, const char *address, enum osmo_cc_session_media_type type, uint16_t port, enum osmo_cc_session_media_proto proto, int send, int receive, void (*receiver)(struct osmo_cc_session_codec *codec, uint16_t sequence_number, uint32_t timestamp, uint32_t ssrc, uint8_t *data, int len), int debug) +osmo_cc_session_media_t *osmo_cc_add_media(osmo_cc_session_t *session, enum osmo_cc_session_nettype nettype, enum osmo_cc_session_addrtype addrtype, const char *address, enum osmo_cc_session_media_type type, uint16_t port, enum osmo_cc_session_media_proto proto, int send, int receive, void (*receiver)(struct osmo_cc_session_codec *codec, uint8_t marker, uint16_t sequence_number, uint32_t timestamp, uint32_t ssrc, uint8_t *data, int len), int debug) { osmo_cc_session_config_t *conf = session->config; osmo_cc_session_media_t *media, **mediap; @@ -374,7 +374,7 @@ osmo_cc_session_t *osmo_cc_session_receive_offer(osmo_cc_session_config_t *conf, return session; } -void osmo_cc_session_accept_media(osmo_cc_session_media_t *media, enum osmo_cc_session_nettype nettype, enum osmo_cc_session_addrtype addrtype, const char *address, int send, int receive, void (*receiver)(struct osmo_cc_session_codec *codec, uint16_t sequence_number, uint32_t timestamp, uint32_t ssrc, uint8_t *data, int len)) +void osmo_cc_session_accept_media(osmo_cc_session_media_t *media, enum osmo_cc_session_nettype nettype, enum osmo_cc_session_addrtype addrtype, const char *address, int send, int receive, void (*receiver)(struct osmo_cc_session_codec *codec, uint8_t marker, uint16_t sequence_number, uint32_t timestamp, uint32_t ssrc, uint8_t *data, int len)) { osmo_cc_session_config_t *conf = media->session->config; diff --git a/src/libosmocc/session.h b/src/libosmocc/session.h index 0464cc9..791bcb4 100644 --- a/src/libosmocc/session.h +++ b/src/libosmocc/session.h @@ -79,7 +79,7 @@ typedef struct osmo_cc_session_media { osmo_cc_session_connection_data_t connection_data_local, connection_data_remote; struct osmo_cc_session_codec *codec_list; int send, receive; - void (*receiver)(struct osmo_cc_session_codec *codec, uint16_t sequence_number, uint32_t timestamp, uint32_t ssrc, uint8_t *data, int len); + void (*receiver)(struct osmo_cc_session_codec *codec, uint8_t marker, uint16_t sequence_number, uint32_t timestamp, uint32_t ssrc, uint8_t *data, int len); int rtp_socket; int rtcp_socket; uint32_t tx_ssrc, rx_ssrc; @@ -110,14 +110,14 @@ typedef struct osmo_cc_session_codec { void osmo_cc_set_local_peer(osmo_cc_session_config_t *conf, enum osmo_cc_session_nettype nettype, enum osmo_cc_session_addrtype addrtype, const char *address); osmo_cc_session_t *osmo_cc_new_session(osmo_cc_session_config_t *conf, void *priv, const char *username, const char *sess_id, const char *sess_version, enum osmo_cc_session_nettype nettype, enum osmo_cc_session_addrtype addrtype, const char *unicast_address, const char *session_name, int debug); void osmo_cc_free_session(osmo_cc_session_t *session); -osmo_cc_session_media_t *osmo_cc_add_media(osmo_cc_session_t *session, enum osmo_cc_session_nettype nettype, enum osmo_cc_session_addrtype addrtype, const char *address, enum osmo_cc_session_media_type type, uint16_t port, enum osmo_cc_session_media_proto proto, int send, int receive, void (*receiver)(struct osmo_cc_session_codec *codec, uint16_t sequence_number, uint32_t timestamp, uint32_t ssrc, uint8_t *data, int len), int debug); +osmo_cc_session_media_t *osmo_cc_add_media(osmo_cc_session_t *session, enum osmo_cc_session_nettype nettype, enum osmo_cc_session_addrtype addrtype, const char *address, enum osmo_cc_session_media_type type, uint16_t port, enum osmo_cc_session_media_proto proto, int send, int receive, void (*receiver)(struct osmo_cc_session_codec *codec, uint8_t marker, uint16_t sequence_number, uint32_t timestamp, uint32_t ssrc, uint8_t *data, int len), int debug); void osmo_cc_free_media(osmo_cc_session_media_t *media); osmo_cc_session_codec_t *osmo_cc_add_codec(osmo_cc_session_media_t *media, const char *playload_name, uint32_t playload_rate, int playload_channels, void (*encoder)(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len), void (*decoder)(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len), int debug); void osmo_cc_free_codec(osmo_cc_session_codec_t *codec); int osmo_cc_session_check(struct osmo_cc_session *session, int remote); const char *osmo_cc_session_send_offer(osmo_cc_session_t *session); osmo_cc_session_t *osmo_cc_session_receive_offer(osmo_cc_session_config_t *conf, void *priv, const char *sdp); -void osmo_cc_session_accept_media(osmo_cc_session_media_t *media, enum osmo_cc_session_nettype nettype, enum osmo_cc_session_addrtype addrtype, const char *address, int send, int receive, void (*receiver)(struct osmo_cc_session_codec *codec, uint16_t sequence_number, uint32_t timestamp, uint32_t ssrc, uint8_t *data, int len)); +void osmo_cc_session_accept_media(osmo_cc_session_media_t *media, enum osmo_cc_session_nettype nettype, enum osmo_cc_session_addrtype addrtype, const char *address, int send, int receive, void (*receiver)(struct osmo_cc_session_codec *codec, uint8_t marker, uint16_t sequence_number, uint32_t timestamp, uint32_t ssrc, uint8_t *data, int len)); void osmo_cc_session_accept_codec(osmo_cc_session_codec_t *codec, void (*encoder)(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len), void (*decoder)(uint8_t *src_data, int src_len, uint8_t **dst_data, int *dst_len)); const char *osmo_cc_session_send_answer(osmo_cc_session_t *session); int osmo_cc_session_receive_answer(osmo_cc_session_t *session, const char *sdp);