From 3de7902087b09ba93653aac8a0c44eab69643bc0 Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Fri, 29 Aug 2025 12:46:02 -0400 Subject: [PATCH] MT#63317 add sink_handler to media_player Change-Id: I78bb3d486db6df24a556b68686ecd96c6b13a3ee --- daemon/media_player.c | 38 +++++++++++++++++++------------------- include/media_player.h | 3 +-- 2 files changed, 20 insertions(+), 21 deletions(-) diff --git a/daemon/media_player.c b/daemon/media_player.c index 4a0da8625..0d27635ff 100644 --- a/daemon/media_player.c +++ b/daemon/media_player.c @@ -176,8 +176,8 @@ static void media_player_shutdown(struct media_player *mp) { timerthread_obj_deschedule(&mp->tt_obj); mp->next_run = 0; - if (mp->sink) { - unsigned int num = send_timer_flush(mp->sink->send_timer, mp->coder.handler); + if (mp->sink.sink) { + unsigned int num = send_timer_flush(mp->sink.sink->send_timer, mp->coder.handler); ilog(LOG_DEBUG, "%u packets removed from send queue", num); // roll back seq numbers already used mp->ssrc_out->seq_diff -= num; @@ -582,6 +582,7 @@ retry:; .media_out = mp->media, .rtp = (void *) buf, .ssrc_out = mp->ssrc_out, + .sink = mp->sink, }; mp->last_frame_ts = pkt->pts; @@ -592,12 +593,12 @@ retry:; mp->buffer_ts += pkt->duration_ts; mp->sync_ts_tv = rtpe_now; - media_packet_encrypt(mp->crypt_handler->out->rtp_crypt, mp->sink, &packet); + media_packet_encrypt(mp->sink.handler->out->rtp_crypt, mp->sink.sink, &packet); - mutex_lock(&mp->sink->lock); - if (media_socket_dequeue(&packet, mp->sink)) + mutex_lock(&mp->sink.sink->lock); + if (media_socket_dequeue(&packet, mp->sink.sink)) ilog(LOG_ERR, "Error sending playback media to RTP sink"); - mutex_unlock(&mp->sink->lock); + mutex_unlock(&mp->sink.sink->lock); // schedule our next run mp->next_run += us_dur; @@ -621,13 +622,13 @@ static void media_player_kernel_player_start_now(struct media_player *mp) { .ts = mp->buffer_ts, .ssrc = mp->ssrc_out->h.ssrc, .repeat = mp->opts.repeat, - .stats = mp->sink->stats_out, - .iface_stats = mp->sink->selected_sfd->local_intf->stats, + .stats = mp->sink.sink->stats_out, + .iface_stats = mp->sink.sink->selected_sfd->local_intf->stats, .ssrc_stats = mp->ssrc_out->stats, }; - mp->sink->endpoint.address.family->endpoint2kernel(&info.dst_addr, &mp->sink->endpoint); // XXX unify with __re_address_translate_ep - mp->sink->selected_sfd->socket.local.address.family->endpoint2kernel(&info.src_addr, &mp->sink->selected_sfd->socket.local); // XXX unify with __re_address_translate_ep - mp->crypt_handler->out->kernel(&info.encrypt, mp->sink); + mp->sink.sink->endpoint.address.family->endpoint2kernel(&info.dst_addr, &mp->sink.sink->endpoint); // XXX unify with __re_address_translate_ep + mp->sink.sink->selected_sfd->socket.local.address.family->endpoint2kernel(&info.src_addr, &mp->sink.sink->selected_sfd->socket.local); // XXX unify with __re_address_translate_ep + mp->sink.handler->out->kernel(&info.encrypt, mp->sink.sink); unsigned int idx = kernel_start_stream_player(&info); if (idx == -1) @@ -1055,12 +1056,11 @@ void media_player_add_packet(struct media_player *mp, char *buf, size_t len, .media_out = mp->media, .rtp = &rtp, .ssrc_out = mp->ssrc_out, - .sink = { .sink = mp->sink }, + .sink = mp->sink, }; packet.raw = STR_LEN(buf, len); packet.payload = packet.raw; - determine_sink_handler(mp->sink, &packet.sink); mp->coder.handler->handler_func(mp->coder.handler, &packet); // as this is timing sensitive and we may have spent some time decoding, @@ -1077,12 +1077,12 @@ void media_player_add_packet(struct media_player *mp, char *buf, size_t len, } } - media_packet_encrypt(mp->crypt_handler->out->rtp_crypt, mp->sink, &packet); + media_packet_encrypt(mp->sink.handler->out->rtp_crypt, mp->sink.sink, &packet); - mutex_lock(&mp->sink->lock); - if (media_socket_dequeue(&packet, mp->sink)) + mutex_lock(&mp->sink.sink->lock); + if (media_socket_dequeue(&packet, mp->sink.sink)) ilog(LOG_ERR, "Error sending playback media to RTP sink"); - mutex_unlock(&mp->sink->lock); + mutex_unlock(&mp->sink.sink->lock); mp->next_run += us_dur; timerthread_obj_schedule_abs(&mp->tt_obj, mp->next_run); @@ -1165,8 +1165,8 @@ static bool media_player_read_packet(struct media_player *mp) { void media_player_set_media(struct media_player *mp, struct call_media *media) { mp->media = media; if (media->streams.head) { - mp->sink = media->streams.head->data; - mp->crypt_handler = determine_handler(&transport_protocols[PROTO_RTP_AVP], media, true); + mp->sink.sink = media->streams.head->data; + sink_handler_set_generic(&mp->sink); } if (!mp->ssrc_out || mp->ssrc_out->h.ssrc != mp->ssrc) { struct ssrc_entry_call *ssrc_ctx = get_ssrc(mp->ssrc, &media->ssrc_hash_out); diff --git a/include/media_player.h b/include/media_player.h index 91cc74f85..11b27e715 100644 --- a/include/media_player.h +++ b/include/media_player.h @@ -67,8 +67,7 @@ struct media_player { call_t *call; struct call_monologue *ml; struct call_media *media; - struct packet_stream *sink; - const struct streamhandler *crypt_handler; + struct sink_handler sink; int64_t next_run;