From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.ffmpeg.org (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTPS id 0F6374C511 for ; Mon, 8 Sep 2025 02:46:47 +0000 (UTC) Authentication-Results: ffbox; dkim=fail (body hash mismatch (got b'AYhmOnaKwmeKHTmP+Hziay21vDyHIQlqkccVvtLDKBU=', expected b'V/9SzbDmhnCb8XngJ+wFzlKb5dps9xn106gT5FhME8Q=')) header.d=ffmpeg.org header.i=@ffmpeg.org header.a=rsa-sha256 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ffmpeg.org; i=@ffmpeg.org; q=dns/txt; s=mail; t=1757299599; h=mime-version : to : date : message-id : reply-to : subject : list-id : list-archive : list-archive : list-help : list-owner : list-post : list-subscribe : list-unsubscribe : from : cc : content-type : content-transfer-encoding : from; bh=AYhmOnaKwmeKHTmP+Hziay21vDyHIQlqkccVvtLDKBU=; b=qhZS6QmAid7bcxM+PaN8GO8vx7MYaWGmQtnfsodSKpZ9YEDpFl2FL37jI4mwejArCaFUm UGGQzoQnpubQ1NnxO0QkGLMnnV09eFI8F3mpY2TdDZe0Oau/HmO6EnxmdRSJDzCGUziX6Em YVcPUeIsHrwn/WrMFUoiqxtoQ12DDIhOsN4kH3t3UgtqgWuBcUFr8BcLGN6+okZTYLzrmx8 8at2VA35bQX0/iu4U4awWLLWQp4NTJac4g6kJzcwJNZeuS9E9svRKgFymD7rfnqy203Bglu fSSInSskeOmdS/abr4loyRH+/0ZYLALpN1clDH94ovhDFm5feY9MsqbBW14g== Received: from [172.19.0.4] (unknown [172.19.0.4]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTP id F11AF68E70E; Mon, 8 Sep 2025 05:46:38 +0300 (EEST) ARC-Seal: i=1; cv=none; a=rsa-sha256; d=ffmpeg.org; s=arc; t=1757299597; b=qcL1mXhpR6QrTdArO3xYUwkEIKJz6cNHby6m470Suu05DOu2/md1uKDFiHcPqMxv1MUGW nKz90/Pvp5ArGjsNTJVT4l7aHx8vIC0WOYFm68l74HfAryhA7+Ws7lRwHF32hw4O2sBghyd T61XQeCtnZgz3G4u9AabXr/HJjLfLgia0uqYmHyucJoFXbq+DB7JBqdb4EPoqEqCgDLpgw9 899hKTUkzDrDN/0ipvCgONKq4oPtNNBz6smmLUQX3qrjPd9p7PbIscUjn6zFOSdBFZNPoD9 xRkCSf20eeh4zixt81nHuwVxXqA/WoekqUVcICzpammn5D9RmYQTuaikDPDA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=ffmpeg.org; s=arc; t=1757299597; h=from : sender : reply-to : subject : date : message-id : to : cc : mime-version : content-type : content-transfer-encoding : content-id : content-description : resent-date : resent-from : resent-sender : resent-to : resent-cc : resent-message-id : in-reply-to : references : list-id : list-help : list-unsubscribe : list-subscribe : list-post : list-owner : list-archive; bh=PhkEECu247tMwcgjRZMr3oNBOkBCZQQ3wPzlK9iVsvk=; b=r5Fv5GZgV1uwQnBI7ThCPcQergra+9MZy0SCr+0xlNSyRWpVLYDFIwWJiOP3+Q2RnIzG0 kYbNMUgyVG4V9LbGnAkgEEo4ilEuDhDXI79NqbNZ1K5TIJnI/RuQgJvi/oQZ4MzHMxuFcj8 6rxAd7UnKT/sE5M1uJpNfDTzbZm/dqAM55mOxbmTwNjlBSAEidUI4Wfh2hrZuZxOLaTDOzf OJECKsnypuGBq4EFhf/ojH57YIVoe8te6WzD5IBPhiFHr2VtcBwY5IgBcHCEiEaz3KXT9Ye ZT1WxkRl0eObxn12Nops64dmW3Pu2yzC4mlQF+Ebo+jpPxa0lAh+kZoMUCeA== ARC-Authentication-Results: i=1; ffmpeg.org; dkim=pass header.d=ffmpeg.org header.i=@ffmpeg.org; arc=none; dmarc=none Authentication-Results: ffmpeg.org; dkim=pass header.d=ffmpeg.org header.i=@ffmpeg.org; arc=none (Message is not ARC signed); dmarc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ffmpeg.org; i=@ffmpeg.org; q=dns/txt; s=mail; t=1757299586; h=content-type : mime-version : content-transfer-encoding : from : to : reply-to : subject : date : from; bh=V/9SzbDmhnCb8XngJ+wFzlKb5dps9xn106gT5FhME8Q=; b=FrqVBlOb/zlKUb4mdfo/7OwIpQ9kbqPfvYOS6x4gmShxMEj8+eBT4ZveWWma/oZsAuEwa w7GRzoNAIc/M35jWEeJXueDqBnW7g1IrZNTP7OvT6o91+QqoCtnbFXqyuUafYEQAxIklSv2 WDl0QGVnqYr2vqHk8NT7qcRYAv4cYqYKMheH72S2RSq1bSjARaBJrFQlXIqb+f0aJAlDvg5 9gA5pTGhp114Jud/vvVvh6Y9m7jPpOJObn0bU5A/MhOteB2n8ATYOiMiIqylbTh0dYPxTs4 QERsLbhggQSmWxeYHhz3B8T9dL1hAT2ivRrJKjlQj00/Rq8m0FMSk/YYiyMA== Received: from 3f9d35a0eedc (code.ffmpeg.org [188.245.149.3]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTPS id 8B2CD6809C4 for ; Mon, 8 Sep 2025 05:46:26 +0300 (EEST) MIME-Version: 1.0 To: ffmpeg-devel@ffmpeg.org Date: Mon, 08 Sep 2025 02:46:26 -0000 Message-ID: <175729958674.25.4236790141331403511@463a07221176> Message-ID-Hash: 5CYDNMVWHVMTMYQZQZ66BKIITQYFWDFE X-Message-ID-Hash: 5CYDNMVWHVMTMYQZQZ66BKIITQYFWDFE X-MailFrom: code@ffmpeg.org X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-ffmpeg-devel.ffmpeg.org-0; header-match-ffmpeg-devel.ffmpeg.org-1; header-match-ffmpeg-devel.ffmpeg.org-2; header-match-ffmpeg-devel.ffmpeg.org-3; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list Reply-To: FFmpeg development discussions and patches Subject: [FFmpeg-devel] [PATCH] avformat/whip: enable RTCP NACK for whip (PR #20460) List-Id: FFmpeg development discussions and patches Archived-At: Archived-At: List-Archive: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Jack Lau via ffmpeg-devel Cc: Jack Lau Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Archived-At: List-Archive: List-Post: PR #20460 opened by Jack Lau (JackLau) URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/20460 Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/20460.patch Refer to RFC 4585 4.2, Add SDP "a=rtcp-fb" so the peer can request rtx through sending NACKs. Add basic parsing for NACK packet. Decrypt into a newly allocated buffer (do not overwrite whip->buf) so multiple NACKs in a bundled packet can be parsed in a loop while keeping whip->buf available for sending rtx Broken or wrong NACk are logged and skipped. Signed-off-by: Jack Lau >>From f008fe3da908d4a577a79908a9fc7fb052ce957b Mon Sep 17 00:00:00 2001 From: Jack Lau Date: Mon, 8 Sep 2025 10:19:49 +0800 Subject: [PATCH] avformat/whip: enable RTCP NACK for whip Refer to RFC 4585 4.2, Add SDP "a=rtcp-fb" so the peer can request rtx through sending NACKs. Add basic parsing for NACK packet. Decrypt into a newly allocated buffer (do not overwrite whip->buf) so multiple NACKs in a bundled packet can be parsed in a loop while keeping whip->buf available for sending rtx Broken or wrong NACk are logged and skipped. Signed-off-by: Jack Lau --- libavformat/whip.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/libavformat/whip.c b/libavformat/whip.c index 20db03a239..316c0fd6b9 100644 --- a/libavformat/whip.c +++ b/libavformat/whip.c @@ -40,6 +40,7 @@ #include "internal.h" #include "mux.h" #include "network.h" +#include "rtp.h" #include "srtp.h" #include "tls.h" @@ -669,6 +670,7 @@ static int generate_sdp_offer(AVFormatContext *s) "a=rtcp-rsize\r\n" "a=rtpmap:%u %s/90000\r\n" "a=fmtp:%u level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=%02x%02x%02x\r\n" + "a=rtcp-fb%u nack\r\n" "a=ssrc:%u cname:FFmpeg\r\n" "a=ssrc:%u msid:FFmpeg video\r\n", whip->video_payload_type, @@ -681,6 +683,7 @@ static int generate_sdp_offer(AVFormatContext *s) profile_idc, profile_iop, level, + whip->video_payload_type, whip->video_ssrc, whip->video_ssrc); } @@ -1779,6 +1782,43 @@ end: return ret; } +static void handle_nack_rtx(AVFormatContext *s, int size) +{ + int ret; + WHIPContext *whip = s->priv_data; + uint8_t *buf = NULL; + int rtcp_len, srtcp_len, header_len = 12/*RFC 4585 6.1*/; + + /** + * Refer to RFC 3550 6.4.1 + * The length of this RTCP packet in 32 bit words minus one, + * including the header and any padding. + */ + rtcp_len = (AV_RB16(&whip->buf[2]) + 1) * 4; + if (rtcp_len <= header_len) { + av_log(whip, AV_LOG_WARNING, "NACK packet is broken, size: %d\n", rtcp_len); + goto error; + } + /* SRTCP index(4 bytes) + HMAC(SRTP_ARS128_CM_SHA1_80) 10bytes */ + srtcp_len = rtcp_len + 4 + 10; + if (srtcp_len != size) { + av_log(whip, AV_LOG_WARNING, "NACK packet size not match, srtcp_len:%d, size:%d\n", srtcp_len, size); + goto error; + } + buf = av_memdup(whip->buf, srtcp_len); + if (!buf) + goto error; + if ((ret = ff_srtp_decrypt(&whip->srtp_recv, buf, &srtcp_len)) < 0) { + av_log(whip, AV_LOG_WARNING, "NACK packet decrypt failed: %d\n", ret); + goto error; + } + goto end; +error: + av_log(whip, AV_LOG_WARNING, "Failed to handle NACK and RTX, Skip...\n"); +end: + av_freep(&buf); +} + static int whip_write_packet(AVFormatContext *s, AVPacket *pkt) { int ret; @@ -1809,6 +1849,19 @@ static int whip_write_packet(AVFormatContext *s, AVPacket *pkt) goto end; } } + if (media_is_rtcp(whip->buf, ret)) { + uint8_t pt = whip->buf[1]; + uint8_t fmt = (whip->buf[0] & 0x1f); + /** + * Handle RTCP NACK packet + * Refer to RFC 4585 6.2.1 + * The Generic NACK message is identified by PT=RTPFB and FMT=1 + */ + if (pt != RTCP_RTPFB) + goto write_packet; + if (fmt == 1) + handle_nack_rtx(s, ret); + } write_packet: if (whip->h264_annexb_insert_sps_pps && st->codecpar->codec_id == AV_CODEC_ID_H264) { if ((ret = h264_annexb_insert_sps_pps(s, pkt)) < 0) { -- 2.49.1 _______________________________________________ ffmpeg-devel mailing list -- ffmpeg-devel@ffmpeg.org To unsubscribe send an email to ffmpeg-devel-leave@ffmpeg.org