From f34786dade6e7849c8d60de30af4bdc0c531a439 Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Mon, 14 Apr 2025 10:00:13 -0400 Subject: [PATCH] MT#55283 convert media_packet to int64_t Change-Id: I4b1da113cf01d34473027987d4ee60215655fdec --- daemon/codec.c | 18 +++++++++--------- daemon/dtmf.c | 2 +- daemon/media_player.c | 4 ++-- daemon/media_socket.c | 12 ++++-------- daemon/rtcp.c | 14 +++++++------- include/media_socket.h | 2 +- lib/poller.h | 3 +-- lib/socket.c | 6 +++--- lib/socket.h | 6 +++--- lib/uring.c | 6 +++--- 10 files changed, 34 insertions(+), 39 deletions(-) diff --git a/daemon/codec.c b/daemon/codec.c index 849e96ef4..f887d016c 100644 --- a/daemon/codec.c +++ b/daemon/codec.c @@ -2117,7 +2117,7 @@ static int handler_func_passthrough(struct codec_handler *h, struct media_packet uint32_t ts = 0; if (mp->rtp) { ts = ntohl(mp->rtp->timestamp); - codec_calc_jitter(mp->ssrc_in, ts, h->source_pt.clock_rate, mp->tv); + codec_calc_jitter(mp->ssrc_in, ts, h->source_pt.clock_rate, timeval_from_us(mp->tv)); codec_calc_lost(mp->ssrc_in, ntohs(mp->rtp->seq_num)); if (ML_ISSET(mp->media->monologue, BLOCK_SHORT) && h->source_pt.codec_def @@ -2953,7 +2953,7 @@ static int handler_func_passthrough_ssrc(struct codec_handler *h, struct media_p return 0; uint32_t ts = ntohl(mp->rtp->timestamp); - codec_calc_jitter(mp->ssrc_in, ts, h->source_pt.clock_rate, mp->tv); + codec_calc_jitter(mp->ssrc_in, ts, h->source_pt.clock_rate, timeval_from_us(mp->tv)); codec_calc_lost(mp->ssrc_in, ntohs(mp->rtp->seq_num)); // save original payload in case DTMF mangles it @@ -3137,9 +3137,9 @@ static void __delay_buffer_schedule(struct delay_buffer *dbuf) { if (!dframe) return; - struct timeval to_run = dframe->mp.tv; - to_run = timeval_add_usec(to_run, dbuf->delay * 1000); - dbuf->ct.next = to_run; + int64_t to_run = dframe->mp.tv; + to_run += dbuf->delay * 1000; // XXX scale up only once + dbuf->ct.next = timeval_from_us(to_run); timerthread_obj_schedule_abs(&dbuf->ct.tt_obj, dbuf->ct.next); } @@ -3153,7 +3153,7 @@ static bool __buffer_delay_do_direct(struct delay_buffer *dbuf) { } static int delay_frame_cmp(const struct delay_frame *a, const struct delay_frame *b, void *ptr) { - return -1 * timeval_cmp(a->mp.tv, b->mp.tv); + return -1 * timeval_cmp(timeval_from_us(a->mp.tv), timeval_from_us(b->mp.tv)); } INLINE struct codec_ssrc_handler *ssrc_handler_get(struct codec_ssrc_handler *ch) { @@ -3324,7 +3324,7 @@ static bool __buffer_dtx(struct dtx_buffer *dtxb, struct codec_ssrc_handler *dec if (!dtxb->ct.next.tv_sec) { if (!dtxb->ssrc) dtxb->ssrc = mp->ssrc_in->parent->h.ssrc; - dtxb->ct.next = mp->tv; + dtxb->ct.next = timeval_from_us(mp->tv); dtxb->ct.next = timeval_add_usec(dtxb->ct.next, rtpe_config.dtx_delay * 1000); timerthread_obj_schedule_abs(&dtxb->ct.tt_obj, dtxb->ct.next); } @@ -3769,7 +3769,7 @@ static void __dtx_send_later(struct codec_timer *ct) { ts = dtxb->head_ts = dtxp->packet->ts; else ts = dtxb->head_ts; - tv_diff = timeval_diff(timeval_from_us(rtpe_now), mp_copy.tv); + tv_diff = rtpe_now - mp_copy.tv; } else { // no packet ready to decode: DTX @@ -4927,7 +4927,7 @@ static int handler_func_transcode(struct codec_handler *h, struct media_packet * ntohl(mp->rtp->timestamp), mp->payload.len); codec_calc_jitter(mp->ssrc_in, ntohl(mp->rtp->timestamp), h->input_handler->source_pt.clock_rate, - mp->tv); + timeval_from_us(mp->tv)); if (h->stats_entry) { unsigned int idx = timeval_from_us(rtpe_now).tv_sec & 1; diff --git a/daemon/dtmf.c b/daemon/dtmf.c index 59c634e8e..459977aa2 100644 --- a/daemon/dtmf.c +++ b/daemon/dtmf.c @@ -753,7 +753,7 @@ static const char *dtmf_inject_pcm(struct call_media *media, struct call_media * .ssrc = htonl(ssrc_in->parent->h.ssrc), }; struct media_packet packet = { - .tv = timeval_from_us(rtpe_now), + .tv = rtpe_now, .call = call, .media = media, .media_out = sink, diff --git a/daemon/media_player.c b/daemon/media_player.c index 27f4424c2..76bd540c7 100644 --- a/daemon/media_player.c +++ b/daemon/media_player.c @@ -554,7 +554,7 @@ retry:; memcpy(buf, pkt->buf, len); struct media_packet packet = { - .tv = timeval_from_us(rtpe_now), + .tv = rtpe_now, .call = mp->call, .media = mp->media, .media_out = mp->media, @@ -1025,7 +1025,7 @@ void media_player_add_packet(struct media_player *mp, char *buf, size_t len, .seq_num = htons(mp->seq), }; struct media_packet packet = { - .tv = timeval_from_us(rtpe_now), + .tv = rtpe_now, .call = mp->call, .media = mp->media, .media_out = mp->media, diff --git a/daemon/media_socket.c b/daemon/media_socket.c index b049866b9..1fadd2e0f 100644 --- a/daemon/media_socket.c +++ b/daemon/media_socket.c @@ -3085,16 +3085,11 @@ out: static void __stream_fd_readable(struct packet_handler_ctx *phc) { struct stream_fd *sfd = phc->mp.sfd; - if (phc->mp.tv.tv_sec < 0) { + if (phc->mp.tv < 0) { // kernel-handled RTCP phc->kernel_handled = true; // restore original actual timestamp - if (G_UNLIKELY(phc->mp.tv.tv_usec == 0)) - phc->mp.tv.tv_sec = -phc->mp.tv.tv_sec; - else { - phc->mp.tv.tv_sec = -phc->mp.tv.tv_sec - 1; - phc->mp.tv.tv_usec = 1000000 - phc->mp.tv.tv_usec; - } + phc->mp.tv *= -1; } int ret; @@ -3205,7 +3200,7 @@ done: log_info_pop(); } -static void stream_fd_recv(struct obj *obj, char *buf, size_t len, struct sockaddr *sa, struct timeval *tv) { +static void stream_fd_recv(struct obj *obj, char *buf, size_t len, struct sockaddr *sa, int64_t tv) { struct stream_fd *sfd = (struct stream_fd *) obj; call_t *ca = sfd->call; if (!ca) @@ -3225,6 +3220,7 @@ static void stream_fd_recv(struct obj *obj, char *buf, size_t len, struct sockad struct packet_handler_ctx phc; ZERO(phc); phc.mp.sfd = sfd; + phc.mp.tv = tv; sfd->socket.family->sockaddr2endpoint(&phc.mp.fsin, sa); phc.s = STR_LEN(buf, len); diff --git a/daemon/rtcp.c b/daemon/rtcp.c index 5519081fc..a85c451ab 100644 --- a/daemon/rtcp.c +++ b/daemon/rtcp.c @@ -718,13 +718,13 @@ next: abort(); } - CAH(finish, c, &mp->fsin, &mp->sfd->socket.local, timeval_us(mp->tv)); + CAH(finish, c, &mp->fsin, &mp->sfd->socket.local, mp->tv); CAH(destroy); return log_ctx->discard ? 1 : 0; error: - CAH(finish, c, &mp->fsin, &mp->sfd->socket.local, timeval_us(mp->tv)); + CAH(finish, c, &mp->fsin, &mp->sfd->socket.local, mp->tv); CAH(destroy); rtcp_list_free(q); return -1; @@ -1266,19 +1266,19 @@ static void logging_destroy(struct rtcp_process_ctx *ctx) { static void mos_sr(struct rtcp_process_ctx *ctx, struct sender_report_packet *sr) { - ssrc_sender_report(ctx->mp->media, &ctx->scratch.sr, ctx->mp->tv); + ssrc_sender_report(ctx->mp->media, &ctx->scratch.sr, timeval_from_us(ctx->mp->tv)); } static void mos_rr(struct rtcp_process_ctx *ctx, struct report_block *rr) { - ssrc_receiver_report(ctx->mp->media, ctx->mp->sfd, &ctx->scratch.rr, ctx->mp->tv); + ssrc_receiver_report(ctx->mp->media, ctx->mp->sfd, &ctx->scratch.rr, timeval_from_us(ctx->mp->tv)); } static void mos_xr_rr_time(struct rtcp_process_ctx *ctx, const struct xr_rb_rr_time *rr) { - ssrc_receiver_rr_time(ctx->mp->media, &ctx->scratch.xr_rr, ctx->mp->tv); + ssrc_receiver_rr_time(ctx->mp->media, &ctx->scratch.xr_rr, timeval_from_us(ctx->mp->tv)); } static void mos_xr_dlrr(struct rtcp_process_ctx *ctx, const struct xr_rb_dlrr *dlrr) { - ssrc_receiver_dlrr(ctx->mp->media, &ctx->scratch.xr_dlrr, ctx->mp->tv); + ssrc_receiver_dlrr(ctx->mp->media, &ctx->scratch.xr_dlrr, timeval_from_us(ctx->mp->tv)); } static void mos_xr_voip_metrics(struct rtcp_process_ctx *ctx, const struct xr_rb_voip_metrics *rb_voip_mtc) { - ssrc_voip_metrics(ctx->mp->media, &ctx->scratch.xr_vm, ctx->mp->tv); + ssrc_voip_metrics(ctx->mp->media, &ctx->scratch.xr_vm, timeval_from_us(ctx->mp->tv)); } diff --git a/include/media_socket.h b/include/media_socket.h index 3b4600d80..a38a1fef3 100644 --- a/include/media_socket.h +++ b/include/media_socket.h @@ -262,7 +262,7 @@ struct media_packet { str raw; endpoint_t fsin; // source address of received packet - struct timeval tv; // timestamp when packet was received + int64_t tv; // timestamp when packet was received stream_fd *sfd; // fd which received the packet call_t *call; // sfd->call struct packet_stream *stream; // sfd->stream diff --git a/lib/poller.h b/lib/poller.h index 77bbdf8e4..27c96147a 100644 --- a/lib/poller.h +++ b/lib/poller.h @@ -28,8 +28,7 @@ struct poller_item { struct obj *obj; poller_func_t readable; - void (*recv)(struct obj *, char *b, size_t len, struct sockaddr *, - struct timeval *); + void (*recv)(struct obj *, char *b, size_t len, struct sockaddr *, int64_t); poller_func_t writeable; poller_func_t closed; }; diff --git a/lib/socket.c b/lib/socket.c index 078624c0f..a63975f08 100644 --- a/lib/socket.c +++ b/lib/socket.c @@ -38,7 +38,7 @@ static bool __ip6_endpoint2sockaddr(void *, const endpoint_t *); static bool __ip4_addrport2sockaddr(void *, const sockaddr_t *, unsigned int); static bool __ip6_addrport2sockaddr(void *, const sockaddr_t *, unsigned int); static ssize_t __ip_recvfrom(socket_t *s, void *buf, size_t len, endpoint_t *ep); -static ssize_t __ip_recvfrom_ts(socket_t *s, void *buf, size_t len, endpoint_t *ep, struct timeval *); +static ssize_t __ip_recvfrom_ts(socket_t *s, void *buf, size_t len, endpoint_t *ep, int64_t *); static ssize_t __ip4_recvfrom_to(socket_t *s, void *buf, size_t len, endpoint_t *ep, sockaddr_t *to); static ssize_t __ip6_recvfrom_to(socket_t *s, void *buf, size_t len, endpoint_t *ep, sockaddr_t *to); static ssize_t __ip_sendmsg(socket_t *s, struct msghdr *mh, const endpoint_t *ep); @@ -325,7 +325,7 @@ static bool __ip_getsockname(socket_t *s) { s->family->sockaddr2endpoint(&s->local, &sin); return true; } -INLINE ssize_t __ip_recvfrom_options(socket_t *s, void *buf, size_t len, endpoint_t *ep, struct timeval *tv, +INLINE ssize_t __ip_recvfrom_options(socket_t *s, void *buf, size_t len, endpoint_t *ep, int64_t *tv, sockaddr_t *to, bool (*parse)(struct cmsghdr *, sockaddr_t *)) { ssize_t ret; @@ -358,7 +358,7 @@ INLINE ssize_t __ip_recvfrom_options(socket_t *s, void *buf, size_t len, endpoin return ret; } -static ssize_t __ip_recvfrom_ts(socket_t *s, void *buf, size_t len, endpoint_t *ep, struct timeval *tv) { +static ssize_t __ip_recvfrom_ts(socket_t *s, void *buf, size_t len, endpoint_t *ep, int64_t *tv) { return __ip_recvfrom_options(s, buf, len, ep, tv, NULL, NULL); } static ssize_t __ip_recvfrom(socket_t *s, void *buf, size_t len, endpoint_t *ep) { diff --git a/lib/socket.h b/lib/socket.h index 3049cecb8..5fbb1fe24 100644 --- a/lib/socket.h +++ b/lib/socket.h @@ -77,7 +77,7 @@ struct socket_family { bool (*timestamping)(socket_t *); bool (*pktinfo)(socket_t *); ssize_t (*recvfrom)(socket_t *, void *, size_t, endpoint_t *); - ssize_t (*recvfrom_ts)(socket_t *, void *, size_t, endpoint_t *, struct timeval *); + ssize_t (*recvfrom_ts)(socket_t *, void *, size_t, endpoint_t *, int64_t *); ssize_t (*recvfrom_to)(socket_t *, void *, size_t, endpoint_t *, sockaddr_t *); ssize_t (*sendmsg)(socket_t *, struct msghdr *, const endpoint_t *); ssize_t (*sendto)(socket_t *, const void *, size_t, const endpoint_t *); @@ -223,7 +223,7 @@ INLINE ssize_t socket_sendto_from(socket_t *s, const void *b, size_t l, const en struct cmsghdr *cm; \ for (cm = firsthdr; cm; cm = nexthdr) { \ if (cm->cmsg_level == SOL_SOCKET && cm->cmsg_type == SO_TIMESTAMP && (*tv)) { \ - *(*tv) = *((struct timeval *) CMSG_DATA(cm)); \ + *(*tv) = timeval_us(*((struct timeval *) CMSG_DATA(cm))); \ (*tv) = NULL; \ } \ if (parse && (*to) && parse_to(cm, (*to))) \ @@ -253,7 +253,7 @@ INLINE void nonblock(int fd) { // coverity[check_return : FALSE] fcntl(fd, F_SETFL, O_NONBLOCK); } -INLINE void socket_rcvtimeout(socket_t *s, unsigned int us) { +INLINE void socket_rcvtimeout(socket_t *s, int64_t us) { struct timeval tv = timeval_from_us(us); // coverity[check_return : FALSE] setsockopt(s->fd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); diff --git a/lib/uring.c b/lib/uring.c index c902685c2..fa5074742 100644 --- a/lib/uring.c +++ b/lib/uring.c @@ -406,7 +406,7 @@ struct uring_poll_recv { struct poller *poller; bool closed:1; }; -INLINE void uring_recvmsg_parse_cmsg(struct timeval *tv, +INLINE void uring_recvmsg_parse_cmsg(int64_t *tv, sockaddr_t *to, bool (*parse)(struct cmsghdr *, sockaddr_t *), struct io_uring_recvmsg_out *out, struct msghdr *mh) { @@ -442,10 +442,10 @@ static void uring_poll_recv(struct uring_req *req, int32_t res, uint32_t flags) void *payload = io_uring_recvmsg_payload(out, &rreq->msg); struct sockaddr *sa = io_uring_recvmsg_name(out); - struct timeval tv = {0}; + int64_t tv = 0; uring_recvmsg_parse_cmsg(&tv, NULL, NULL, out, &rreq->msg); - rreq->it.recv(rreq->it.obj, payload, out->payloadlen, sa, &tv); + rreq->it.recv(rreq->it.obj, payload, out->payloadlen, sa, tv); } if (!(flags & IORING_CQE_F_MORE))