diff --git a/janus/src/client.c b/janus/src/client.c index 3b3b6e5..14f62ed 100644 --- a/janus/src/client.c +++ b/janus/src/client.c @@ -193,20 +193,24 @@ static void *_video_or_acap_thread(void *v_client, bool video) { }; janus_plugin_rtp_extensions_reset(&packet.extensions); - if (rtp.zero_playout_delay) { - // https://github.com/pikvm/pikvm/issues/784 - packet.extensions.min_delay = 0; - packet.extensions.max_delay = 0; - } else { - // Эти дефолты используются в Chrome/Safari/Firefox. - // Работает всё одинаково, потому что у них общая кодовая база WebRTC. - packet.extensions.min_delay = 0; - packet.extensions.max_delay = 1000; // == 10s, i.e. 10ms granularity + if (rtp.first_of_frame) { + if (rtp.zero_playout_delay) { + // https://github.com/pikvm/pikvm/issues/784 + packet.extensions.min_delay = 0; + packet.extensions.max_delay = 0; + } else { + // Эти дефолты используются в Chrome/Safari/Firefox. + // Работает всё одинаково, потому что у них общая кодовая база WebRTC. + packet.extensions.min_delay = 0; + packet.extensions.max_delay = 1000; // == 10s, i.e. 10ms granularity + } } - if (rtp.video) { + if (rtp.video && rtp.first_of_frame) { packet.extensions.abs_capture_ts = rtp.grab_ntp_ts; + } + if (rtp.video && rtp.last_of_frame) { uint video_orient = atomic_load(&client->video_orient); if (video_orient != 0) { // The extension rotates the video clockwise, but want it counterclockwise. diff --git a/janus/src/rtp.h b/janus/src/rtp.h index 7d0b103..8f79c8e 100644 --- a/janus/src/rtp.h +++ b/janus/src/rtp.h @@ -45,6 +45,9 @@ typedef struct { u16 seq; u8 datagram[US_RTP_DATAGRAM_SIZE]; uz used; + + bool first_of_frame; + bool last_of_frame; bool zero_playout_delay; u64 grab_ntp_ts; } us_rtp_s; diff --git a/janus/src/rtpv.c b/janus/src/rtpv.c index a5b6fa5..7db99e9 100644 --- a/janus/src/rtpv.c +++ b/janus/src/rtpv.c @@ -89,6 +89,8 @@ void us_rtpv_wrap(us_rtpv_s *rtpv, const us_frame_s *frame, bool zero_playout_de assert(frame->format == V4L2_PIX_FMT_H264); + rtpv->rtp->first_of_frame = true; + rtpv->rtp->last_of_frame = false; rtpv->rtp->zero_playout_delay = zero_playout_delay; rtpv->rtp->grab_ntp_ts = us_get_now_ntp() - us_ld_to_ntp(us_get_now_monotonic() - frame->grab_begin_ts); @@ -131,7 +133,9 @@ void _rtpv_process_nalu(us_rtpv_s *rtpv, const u8 *data, uz size, u32 pts, bool us_rtp_write_header(rtpv->rtp, pts, marked); memcpy(dg + US_RTP_HEADER_SIZE, data, size); rtpv->rtp->used = size + US_RTP_HEADER_SIZE; + rtpv->rtp->last_of_frame = true; rtpv->callback(rtpv->rtp); + rtpv->rtp->first_of_frame = false; return; } @@ -163,7 +167,9 @@ void _rtpv_process_nalu(us_rtpv_s *rtpv, const u8 *data, uz size, u32 pts, bool memcpy(dg + fu_overhead, src, frag_size); rtpv->rtp->used = fu_overhead + frag_size; + rtpv->rtp->last_of_frame = last; rtpv->callback(rtpv->rtp); + rtpv->rtp->first_of_frame = false; src += frag_size; remaining -= frag_size;