From 80dce276ed76a308579ba63e1cae4fe7feb92d1b Mon Sep 17 00:00:00 2001 From: Ivan Shapovalov Date: Mon, 18 May 2026 07:33:09 +0300 Subject: [PATCH 1/3] janus: rtp: marked -> last_header --- janus/src/rtp.c | 4 ++-- janus/src/rtp.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/janus/src/rtp.c b/janus/src/rtp.c index c1eb4c7..17bb6c4 100644 --- a/janus/src/rtp.c +++ b/janus/src/rtp.c @@ -47,9 +47,9 @@ void us_rtp_assign(us_rtp_s *rtp, uint payload, bool video) { rtp->ssrc = us_triple_u32(us_get_now_monotonic_u64()); } -void us_rtp_write_header(us_rtp_s *rtp, u32 pts, bool marked) { +void us_rtp_write_header(us_rtp_s *rtp, u32 pts, bool last_header) { u32 word0 = 0x80000000; - if (marked) { + if (last_header) { word0 |= 1 << 23; } word0 |= (rtp->payload & 0x7F) << 16; diff --git a/janus/src/rtp.h b/janus/src/rtp.h index 43b2e1f..d49cbaf 100644 --- a/janus/src/rtp.h +++ b/janus/src/rtp.h @@ -66,4 +66,4 @@ us_rtp_s *us_rtp_init(void); void us_rtp_destroy(us_rtp_s *rtp); void us_rtp_assign(us_rtp_s *rtp, uint payload, bool video); -void us_rtp_write_header(us_rtp_s *rtp, u32 pts, bool marked); +void us_rtp_write_header(us_rtp_s *rtp, u32 pts, bool last_header); From b02bb85d8b6935d2f037b5c9e9bea87b8ef6102f Mon Sep 17 00:00:00 2001 From: Ivan Shapovalov Date: Mon, 18 May 2026 07:38:41 +0300 Subject: [PATCH 2/3] janus: rtpv: marked -> last_nalu --- janus/src/rtpv.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/janus/src/rtpv.c b/janus/src/rtpv.c index f6ffd9b..7cebcaf 100644 --- a/janus/src/rtpv.c +++ b/janus/src/rtpv.c @@ -36,7 +36,7 @@ #include "rtp.h" -void _rtpv_process_nalu(us_rtpv_s *rtpv, const u8 *data, uz size, u32 pts, bool marked); +void _rtpv_process_nalu(us_rtpv_s *rtpv, const u8 *data, uz size, u32 pts, bool last_nalu); static sz _find_annexb(const u8 *data, uz size); @@ -104,7 +104,7 @@ void us_rtpv_wrap(us_rtpv_s *rtpv, const us_frame_s *frame, bool zero_playout_de } } -void _rtpv_process_nalu(us_rtpv_s *rtpv, const u8 *data, uz size, u32 pts, bool marked) { +void _rtpv_process_nalu(us_rtpv_s *rtpv, const u8 *data, uz size, u32 pts, bool last_nalu) { US_A(size > 1); const uint ref_idc = (data[0] >> 5) & 3; @@ -113,7 +113,7 @@ void _rtpv_process_nalu(us_rtpv_s *rtpv, const u8 *data, uz size, u32 pts, bool u8 *dg = rtp->datagram; if (size + US_RTP_HEADER_SIZE <= US_RTP_TOTAL_SIZE) { - us_rtp_write_header(rtp, pts, marked); + us_rtp_write_header(rtp, pts, last_nalu); memcpy(dg + US_RTP_HEADER_SIZE, data, size); rtp->used = size + US_RTP_HEADER_SIZE; const bool sps_or_pps = (type == 7 || type == 8); @@ -136,7 +136,7 @@ void _rtpv_process_nalu(us_rtpv_s *rtpv, const u8 *data, uz size, u32 pts, bool frag_size = remaining; } - us_rtp_write_header(rtp, pts, (marked && last)); + us_rtp_write_header(rtp, pts, (last_nalu && last)); dg[US_RTP_HEADER_SIZE] = 28 | (ref_idc << 5); From 0fbbc27d8c16d5949eaf16299138477e26990c16 Mon Sep 17 00:00:00 2001 From: Ivan Shapovalov Date: Mon, 18 May 2026 07:35:07 +0300 Subject: [PATCH 3/3] janus: rtpv: fix and rework {first,last}_of_frame determination Fixes: 2dac4db ("janus: fixed first/last frame logic for sps/pps") Fixes: f32e256 ("janus: refactoring") --- janus/src/rtpv.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/janus/src/rtpv.c b/janus/src/rtpv.c index 7cebcaf..82dc22a 100644 --- a/janus/src/rtpv.c +++ b/janus/src/rtpv.c @@ -36,7 +36,7 @@ #include "rtp.h" -void _rtpv_process_nalu(us_rtpv_s *rtpv, const u8 *data, uz size, u32 pts, bool last_nalu); +void _rtpv_process_nalu(us_rtpv_s *rtpv, const u8 *data, uz size, u32 pts, bool first_nalu, bool last_nalu); static sz _find_annexb(const u8 *data, uz size); @@ -80,6 +80,7 @@ void us_rtpv_wrap(us_rtpv_s *rtpv, const us_frame_s *frame, bool zero_playout_de } uz begin = offset_to_first + _PRE; + bool first_nalu = true; while (begin < frame->used) { // Find and iterate by NALUs const u8 *const data = frame->data + begin; const sz offset_to_next = _find_annexb(data, frame->used - begin); @@ -90,21 +91,23 @@ void us_rtpv_wrap(us_rtpv_s *rtpv, const us_frame_s *frame, bool zero_playout_de --size; } if (size > 1) { // Skip too short NALUs - _rtpv_process_nalu(rtpv, data, size, pts, false); + _rtpv_process_nalu(rtpv, data, size, pts, first_nalu, false); + first_nalu = false; } begin += offset_to_next + _PRE; } else { // Process the tail const uz size = frame->used - begin; if (size > 1) { - _rtpv_process_nalu(rtpv, data, size, pts, true); + _rtpv_process_nalu(rtpv, data, size, pts, first_nalu, true); + first_nalu = false; } break; } } } -void _rtpv_process_nalu(us_rtpv_s *rtpv, const u8 *data, uz size, u32 pts, bool last_nalu) { +void _rtpv_process_nalu(us_rtpv_s *rtpv, const u8 *data, uz size, u32 pts, bool first_nalu, bool last_nalu) { US_A(size > 1); const uint ref_idc = (data[0] >> 5) & 3; @@ -116,9 +119,8 @@ void _rtpv_process_nalu(us_rtpv_s *rtpv, const u8 *data, uz size, u32 pts, bool us_rtp_write_header(rtp, pts, last_nalu); memcpy(dg + US_RTP_HEADER_SIZE, data, size); rtp->used = size + US_RTP_HEADER_SIZE; - const bool sps_or_pps = (type == 7 || type == 8); - rtp->first_of_frame = !sps_or_pps; - rtp->last_of_frame = !sps_or_pps; + rtp->first_of_frame = first_nalu; + rtp->last_of_frame = last_nalu; rtpv->callback(rtp); return; } @@ -151,8 +153,8 @@ void _rtpv_process_nalu(us_rtpv_s *rtpv, const u8 *data, uz size, u32 pts, bool memcpy(dg + fu_overhead, src, frag_size); rtp->used = fu_overhead + frag_size; - rtp->first_of_frame = first; - rtp->last_of_frame = last; + rtp->first_of_frame = first_nalu && first; + rtp->last_of_frame = last_nalu && last; rtpv->callback(rtp); src += frag_size;