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")
This commit is contained in:
Ivan Shapovalov
2026-05-18 07:35:07 +03:00
parent b02bb85d8b
commit 0fbbc27d8c

View File

@@ -36,7 +36,7 @@
#include "rtp.h" #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); 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; uz begin = offset_to_first + _PRE;
bool first_nalu = true;
while (begin < frame->used) { // Find and iterate by NALUs while (begin < frame->used) { // Find and iterate by NALUs
const u8 *const data = frame->data + begin; const u8 *const data = frame->data + begin;
const sz offset_to_next = _find_annexb(data, frame->used - 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; --size;
} }
if (size > 1) { // Skip too short NALUs 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; begin += offset_to_next + _PRE;
} else { // Process the tail } else { // Process the tail
const uz size = frame->used - begin; const uz size = frame->used - begin;
if (size > 1) { 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; 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); US_A(size > 1);
const uint ref_idc = (data[0] >> 5) & 3; 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); us_rtp_write_header(rtp, pts, last_nalu);
memcpy(dg + US_RTP_HEADER_SIZE, data, size); memcpy(dg + US_RTP_HEADER_SIZE, data, size);
rtp->used = size + US_RTP_HEADER_SIZE; rtp->used = size + US_RTP_HEADER_SIZE;
const bool sps_or_pps = (type == 7 || type == 8); rtp->first_of_frame = first_nalu;
rtp->first_of_frame = !sps_or_pps; rtp->last_of_frame = last_nalu;
rtp->last_of_frame = !sps_or_pps;
rtpv->callback(rtp); rtpv->callback(rtp);
return; 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); memcpy(dg + fu_overhead, src, frag_size);
rtp->used = fu_overhead + frag_size; rtp->used = fu_overhead + frag_size;
rtp->first_of_frame = first; rtp->first_of_frame = first_nalu && first;
rtp->last_of_frame = last; rtp->last_of_frame = last_nalu && last;
rtpv->callback(rtp); rtpv->callback(rtp);
src += frag_size; src += frag_size;