From patchwork Fri Aug 25 10:05:26 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Liu Steven X-Patchwork-Id: 43316 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:f07:b0:149:dfde:5c0a with SMTP id fl7csp322873pzb; Fri, 25 Aug 2023 03:06:00 -0700 (PDT) X-Google-Smtp-Source: AGHT+IFLWVpMkVno6TrBMNkJaXFE0+vDJ6Ii/A/V39zJp71oePzLCDcaOKQSoLC5/mmOmb+xNgDV X-Received: by 2002:aa7:cd50:0:b0:523:102f:3ce1 with SMTP id v16-20020aa7cd50000000b00523102f3ce1mr13998253edw.10.1692957960445; Fri, 25 Aug 2023 03:06:00 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1692957960; cv=none; d=google.com; s=arc-20160816; b=0TtTtJRFCOBUsH5M/d44cBtu6AfAiOtlD07Dclrmqk+xFyYdznHn8sxgr9kGPQqGDS 359ibRhdUDcETQpD7oQZ3F149UoaYdn12V7W1PaNjIvJg0IsEcLWtPmVFmu7ClPothRT qb5qnv/z+b0xUe1eKXDgFAlPGVgwZoZG5FZFHlbGSi1zGJFohxNfieZMFC5YKpoKLy+L if4whLwMDe0YHpN494UiBHPjcXVy9mRrKK6c5406SuxJjEa7EpkVlTn9SK/7d0Dt2ebZ N22HeF3t1edn6Q/paQIO2HF+5O9/mSJSCRMovSvkR6wlbhHXvEZlGFYKhLycoP9hWXhD VPNw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:feedback-id:mime-version:references :in-reply-to:message-id:date:to:from:delivered-to; bh=3SArgekw/fK2DAZXvKjhUh0H3aI7XkndujoD4W6xP8w=; fh=w8JR1T/5WquwCqgnlKgniZcITMXOtCHDzF0NyyyGKZI=; b=QKAHQlK+S8HfzVfG0xs++6IyyKSb77kFtY7nxVp2FY8ZDBnIdLV2YogNu2Xwl203n5 CnruAwxi3poEJNTX1a6G3iAa4u/FJ4PM3M99MBRE+ITny/dE8yk92kBxO2otHcvreXp2 LSQu7XO6Ztn+E/LvyQdOU8ET4Ks4jqwTH8UuNSpDc4UAM96MnedJ4s98wlH38ap5tu6L VTDV4JLkqDYcP51PhWmqIEsTISGGKzVUAFc22Au0tovk1s/LZ6DgBY48QAaXK/T+BGo6 sKsJ+80rFoT2Yn28MfzxxVCNwGxeVucFMxEb3JF2ufNw2zlbvT8bA1OPrtLQ6bKG4r6c jq7A== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id m18-20020aa7c492000000b0052a40b7d006si945599edq.374.2023.08.25.03.05.47; Fri, 25 Aug 2023 03:06:00 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 36F5C68C664; Fri, 25 Aug 2023 13:05:44 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from bg4.exmail.qq.com (bg4.exmail.qq.com [43.154.54.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E0BF2689B46 for ; Fri, 25 Aug 2023 13:05:36 +0300 (EEST) X-QQ-mid: bizesmtp85t1692957930tgh8uhj5 Received: from localhost ( [103.102.203.194]) by bizesmtp.qq.com (ESMTP) with id ; Fri, 25 Aug 2023 18:05:29 +0800 (CST) X-QQ-SSF: 01100000000000Z0Z000000A0000000 X-QQ-FEAT: 7jw2iSiCazpM0shgiPutPfSwlUtlWAKbKOPyxfxAdpRmVn/xyi73fuPK93wxi PPy7h2epavJSjLV6UUzP88WLTxIwq5+vTJg+qvPY6NtwNZcV3fMQbSfwS+lY5DDr27XkC8n VKLu7/wV+uO/dOuPw/1FPRkXuNv5jOwGP6bxSiS27dky7jKpTktVC1rmh8KiaryqAEwiE0j zQ2HYSfM7n+k5GrlAcm8h5FPtzyww5/Y939e35mUN48cyY4903rx2ldxV/MXEjyfXhQ1j4x BWN8YUVW9llKb1HwM/P+6uUeEM5zhxIHZ12BYIeRLA8TQZ5lmm2SPPVBZl1kL/zQn+5+B3q gAz6Ex6eaxGCW5afYG/SZQ9izh6OsfQUqLgVbHbvMEBOSdtIlc= X-QQ-GoodBg: 0 X-BIZMAIL-ID: 6384454475739925154 From: Steven Liu To: ffmpeg-devel@ffmpeg.org Date: Fri, 25 Aug 2023 18:05:26 +0800 Message-Id: <20230825100527.71471-1-lq@chinaffmpeg.org> X-Mailer: git-send-email 2.40.0 In-Reply-To: <49a65bba-634c-1afb-6c52-94565bd7cc9@martin.st> References: <49a65bba-634c-1afb-6c52-94565bd7cc9@martin.st> MIME-Version: 1.0 X-QQ-SENDSIZE: 520 Feedback-ID: bizesmtp:chinaffmpeg.org:qybglogicsvrsz:qybglogicsvrsz3a-0 Subject: [FFmpeg-devel] [PATCH v3 1/2] avformat/rtmppkt: add ff_amf_write_array for write X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Steven Liu Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: Adge+A+pdv5D Signed-off-by: Steven Liu --- libavformat/rtmppkt.c | 6 ++++++ libavformat/rtmppkt.h | 8 ++++++++ 2 files changed, 14 insertions(+) diff --git a/libavformat/rtmppkt.c b/libavformat/rtmppkt.c index 4b97c0833f..a602bf6a96 100644 --- a/libavformat/rtmppkt.c +++ b/libavformat/rtmppkt.c @@ -40,6 +40,12 @@ void ff_amf_write_number(uint8_t **dst, double val) bytestream_put_be64(dst, av_double2int(val)); } +void ff_amf_write_array_start(uint8_t **dst, uint32_t length) +{ + bytestream_put_byte(dst, AMF_DATA_TYPE_ARRAY); + bytestream_put_be32(dst, length); +} + void ff_amf_write_string(uint8_t **dst, const char *str) { bytestream_put_byte(dst, AMF_DATA_TYPE_STRING); diff --git a/libavformat/rtmppkt.h b/libavformat/rtmppkt.h index a15d2a5773..7c580f2224 100644 --- a/libavformat/rtmppkt.h +++ b/libavformat/rtmppkt.h @@ -244,6 +244,14 @@ void ff_amf_write_null(uint8_t **dst); */ void ff_amf_write_object_start(uint8_t **dst); +/** + * Write marker and length for AMF array to buffer. + * + * @param dst pointer to the input buffer (will be modified) + * @param length value to write + */ +void ff_amf_write_array_start(uint8_t **dst, uint32_t length); + /** * Write string used as field name in AMF object to buffer. * From patchwork Fri Aug 25 10:05:27 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Liu Steven X-Patchwork-Id: 43315 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:f07:b0:149:dfde:5c0a with SMTP id fl7csp322847pzb; Fri, 25 Aug 2023 03:05:57 -0700 (PDT) X-Google-Smtp-Source: AGHT+IFU0mAZEV6pFPPERgZjy000eLhYki3DdAGMnj5GBUbh2ShJAt8sadog/bbx+sCya6ZVMLvz X-Received: by 2002:a17:906:7481:b0:99d:dce8:41d6 with SMTP id e1-20020a170906748100b0099ddce841d6mr14254476ejl.71.1692957957171; Fri, 25 Aug 2023 03:05:57 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1692957957; cv=none; d=google.com; s=arc-20160816; b=hLLB0mph5nwQhLwMQR+jz3GNKPaPDNoIFbNiB2mFH0BdEW7Y8MH6m9sC/4VFN4W2Uw 1bcqRCUar4DM78fjXGlpQAx9knF+clyALe4Pw9Gq7VGLmivumvHL1CVvnErJ3jSOK6qq 8VnslpWnb0Z38WZjK1Q8HjCM/rZOgKjHbIDcv8pr9Ni/Y8idRJEtPSYKf/D9dq6wcbI+ xejJRAULPFRwwsD86IfX1t0Canax4pozI/JJWuFDtOnLvlvdfKiFG+kbv+qsuQvPg+/B CyEIt+o8QNsILCEpAaH755I4/9lYKhsFClldIjWOpCVpFadsQltARJzULjIEJes7o4ej YrHA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:feedback-id:mime-version:references :in-reply-to:message-id:date:to:from:delivered-to; bh=0DwpMmUo601VHgBgby5AVd16/yd2wulRCYVXHupqUsE=; fh=w8JR1T/5WquwCqgnlKgniZcITMXOtCHDzF0NyyyGKZI=; b=BZJZJMMC46ElGg8tuBNW/KXxigg1pQE41r5W7S0E7Wgb2chnK85/76tahSdnANLvPt 08hivLQdlKabfWgJy7rJMJMWaMJ9g6aOPFs/4aqD4SkE9R7MKwADt6pt+qPRcqBczH/a hKTS8NLVaTt8i8htVpp9GIy6TbDXWD7YkLxnhO+isRECxUl5wVhiOxvVh6twI7BB9cOu 1pTUOTpp2p6DPOx33M9QWp9bSIuuxqi27rS10oGhmoBJMuTlTq6i1EqlRaAQsSwM0dLI tsqQwtKeIoyM3ZMnvmlH+Fepts+WCngjH3/bXnIjMfigKNu8S8b7Hr2b/OW+XkQQpxfX 4o8A== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id q4-20020a170906360400b0099bcf34927fsi337506ejb.640.2023.08.25.03.05.56; Fri, 25 Aug 2023 03:05:57 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 5209268C684; Fri, 25 Aug 2023 13:05:47 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from bg4.exmail.qq.com (bg4.exmail.qq.com [43.154.54.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 748CE689B46 for ; Fri, 25 Aug 2023 13:05:40 +0300 (EEST) X-QQ-mid: bizesmtp83t1692957935td59mfnd Received: from localhost ( [103.102.203.194]) by bizesmtp.qq.com (ESMTP) with id ; Fri, 25 Aug 2023 18:05:34 +0800 (CST) X-QQ-SSF: 01100000000000Z0Z000000A0000000 X-QQ-FEAT: zT6n3Y95oi0TwkW6YXGO1in3E9yntD0iG8ixOZMGa3z+fzEVyY1SIZ9a+Zfav HM9vA/kVLoue0/lUd1nCu+HM6XuRW/5j8y5yrSUVWgPcQaPj4xZ2GwXvtzr7i0PD57EeWCu QWQSeagmZs1ZLoo0s7D8sfqNYYqQULvIj0Sx5OBrsDgUwEGZWmDa97gYi544tuU4slxsPe9 6J5a28YG6SrvSAiyBcNz2V1TI7FTF40/ZEKRD5zw2VP8HYGN7fPvae4u2+CFLJzB5gQvEsl yWmIhY5ypoPfJjwwZHDaHIdUERdN2kt02FFRP3s2jQHksSL9jV5DxW8XwL1U+gnmXCzhjmV p1miGrgkbL3rYKu4+45/nkhGugJ6SRHa0iZD8i8+OZm5X5LjQU= X-QQ-GoodBg: 0 X-BIZMAIL-ID: 8415432384090863391 From: Steven Liu To: ffmpeg-devel@ffmpeg.org Date: Fri, 25 Aug 2023 18:05:27 +0800 Message-Id: <20230825100527.71471-2-lq@chinaffmpeg.org> X-Mailer: git-send-email 2.40.0 In-Reply-To: <20230825100527.71471-1-lq@chinaffmpeg.org> References: <49a65bba-634c-1afb-6c52-94565bd7cc9@martin.st> <20230825100527.71471-1-lq@chinaffmpeg.org> MIME-Version: 1.0 X-QQ-SENDSIZE: 520 Feedback-ID: bizesmtp:chinaffmpeg.org:qybglogicsvrsz:qybglogicsvrsz3a-0 Subject: [FFmpeg-devel] [PATCH v3 2/2] avformat/rtmpproto: support enhanced rtmp X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Steven Liu Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: sh+MJ147LlFv Add option named rtmp_enhanced_codec, it would support hvc1,av01,vp09 now, the fourcc is using Array of strings. Signed-off-by: Steven Liu --- doc/protocols.texi | 6 ++++++ libavformat/rtmpproto.c | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/doc/protocols.texi b/doc/protocols.texi index b3fad55591..bd2b25e502 100644 --- a/doc/protocols.texi +++ b/doc/protocols.texi @@ -896,6 +896,12 @@ be named, by prefixing the type with 'N' and specifying the name before the value (i.e. @code{NB:myFlag:1}). This option may be used multiple times to construct arbitrary AMF sequences. +@item rtmp_enhanced_codecs +Specify the list of codecs the client advertises to support in an +enhanced RTMP stream. This option should set a string like @code{hvc1,av01,vp09} +for multiple codecs, or @code{hvc1} for only one codec, +set codec fourcc into fourCcLive property into Connect Command Message, + @item rtmp_flashver Version of the Flash plugin used to run the SWF player. The default is LNX 9,0,124,2. (When publishing, the default is FMLE/3.0 (compatible; diff --git a/libavformat/rtmpproto.c b/libavformat/rtmpproto.c index f0ef223f05..10e0aed539 100644 --- a/libavformat/rtmpproto.c +++ b/libavformat/rtmpproto.c @@ -127,6 +127,7 @@ typedef struct RTMPContext { int nb_streamid; ///< The next stream id to return on createStream calls double duration; ///< Duration of the stream in seconds as returned by the server (only valid if non-zero) int tcp_nodelay; ///< Use TCP_NODELAY to disable Nagle's algorithm if set to 1 + char *enhanced_codecs; ///< codec list in enhanced rtmp char username[50]; char password[50]; char auth_params[500]; @@ -336,6 +337,41 @@ static int gen_connect(URLContext *s, RTMPContext *rt) ff_amf_write_field_name(&p, "app"); ff_amf_write_string2(&p, rt->app, rt->auth_params); + if (rt->enhanced_codecs) { + uint32_t list_len = 0; + char *fourcc_data = rt->enhanced_codecs; + int fourcc_str_len = strlen(fourcc_data); + + // check the string, fourcc + ',' + ... + end fourcc correct length should be (4+1)*n+4 + if ((fourcc_str_len + 1) % 5 != 0) { + av_log(s, AV_LOG_ERROR, "Malformed rtmp_enhanched_codecs, " + "should be of the form hvc1[,av01][,vp09][,...]\n"); + return AVERROR(EINVAL); + } + + list_len = (fourcc_str_len + 1) / 5; + // write the fourCcList field name + ff_amf_write_field_name(&p, "fourCcList"); + + // write the fourcc array length + ff_amf_write_array_start(&p, list_len); + + while(fourcc_data - rt->enhanced_codecs < fourcc_str_len) { + unsigned char fourcc[5]; + if (!strncasecmp(fourcc_data, "hvc1", 4) || + !strncasecmp(fourcc_data, "av01", 4) || + !strncasecmp(fourcc_data, "vp09", 4)) { + av_strlcpy(fourcc, fourcc_data, sizeof(fourcc)); + ff_amf_write_string(&p, fourcc); + } else { + av_log(s, AV_LOG_ERROR, "Unsupported codec fourcc, %.*s\n", 4, fourcc_data); + return AVERROR_PATCHWELCOME; + } + + fourcc_data += 5; + } + } + if (!rt->is_input) { ff_amf_write_field_name(&p, "type"); ff_amf_write_string(&p, "nonprivate"); @@ -3104,6 +3140,7 @@ static const AVOption rtmp_options[] = { {"rtmp_conn", "Append arbitrary AMF data to the Connect message", OFFSET(conn), AV_OPT_TYPE_STRING, {.str = NULL }, 0, 0, DEC|ENC}, {"rtmp_flashver", "Version of the Flash plugin used to run the SWF player.", OFFSET(flashver), AV_OPT_TYPE_STRING, {.str = NULL }, 0, 0, DEC|ENC}, {"rtmp_flush_interval", "Number of packets flushed in the same request (RTMPT only).", OFFSET(flush_interval), AV_OPT_TYPE_INT, {.i64 = 10}, 0, INT_MAX, ENC}, + {"rtmp_enhanced_codecs", "Specify the codec(s) to use in an enhanced rtmp live stream", OFFSET(enhanced_codecs), AV_OPT_TYPE_STRING, {.str = NULL }, 0, 0, ENC}, {"rtmp_live", "Specify that the media is a live stream.", OFFSET(live), AV_OPT_TYPE_INT, {.i64 = -2}, INT_MIN, INT_MAX, DEC, "rtmp_live"}, {"any", "both", 0, AV_OPT_TYPE_CONST, {.i64 = -2}, 0, 0, DEC, "rtmp_live"}, {"live", "live stream", 0, AV_OPT_TYPE_CONST, {.i64 = -1}, 0, 0, DEC, "rtmp_live"},