From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id 0B9314B56C for ; Mon, 8 Jul 2024 14:27:20 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 7803168DC51; Mon, 8 Jul 2024 17:27:17 +0300 (EEST) Received: from relay.aitek.it (dns1.aitek.it [194.244.35.21]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id F040168DA25 for ; Mon, 8 Jul 2024 17:27:10 +0300 (EEST) Received: from mail-server.aitek.it (mail-server.aitek.it [172.30.0.88]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by relay.aitek.it (Postfix) with ESMTPS id 023C11800840 for ; Mon, 8 Jul 2024 16:27:12 +0200 (CEST) DKIM-Filter: OpenDKIM Filter v2.11.0 relay.aitek.it 023C11800840 Message-ID: Date: Mon, 8 Jul 2024 16:27:07 +0200 MIME-Version: 1.0 To: ffmpeg-devel@ffmpeg.org Content-Language: en-US, it X-Aitek-Mail-Server-MailScanner-Information: Please contact the ISP for more information X-Aitek-Mail-Server-MailScanner-ID: B4AED843C55.A9394 X-Aitek-Mail-Server-MailScanner: Found to be clean X-Aitek-Mail-Server-MailScanner-From: bernardo.pilarz@aitek.it X-Spam-Status: No Subject: [FFmpeg-devel] [PATCH] avcodec/avformat: Store SDP attributes from RTSP stream into AVStream side data. 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: , From: Bernardo Pilarz via ffmpeg-devel Reply-To: FFmpeg development discussions and patches Cc: Bernardo Pilarz Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="us-ascii"; Format="flowed" Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: Connecting to an RTSP stream will now cause the SDP attributes of each media stream to be stored in the codecpar of the relative AVStream. The SDP attributes are stored in the coded_side_data using the (new) type AV_PKT_DATA_SDP_ATTRIBUTES (AVPacketSideDataType enum). Signed-off-by: Bernardo Pilarz --- libavcodec/packet.h | 7 ++++ libavformat/rtsp.c | 97 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 104 insertions(+) diff --git a/libavcodec/packet.h b/libavcodec/packet.h index f05deb7950..54bfc96c38 100644 --- a/libavcodec/packet.h +++ b/libavcodec/packet.h @@ -326,6 +326,13 @@ enum AVPacketSideDataType { */ AV_PKT_DATA_AMBIENT_VIEWING_ENVIRONMENT, + /** + * Attributes found in the SDP, associated with the stream. This is a list + * of zero terminated key/value strings. There is no end marker for the + * list, so it is required to rely on the side data size to stop. + */ + AV_PKT_DATA_SDP_ATTRIBUTES, + /** * The number of side data types. * This is not part of the public API/ABI in the sense that it may diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c index db78735c7a..dfc1e1c9bb 100644 --- a/libavformat/rtsp.c +++ b/libavformat/rtsp.c @@ -283,6 +283,91 @@ static int init_satip_stream(AVFormatContext *s) } #endif + +static int sdp_add_attribute_to_stream_side_data(AVFormatContext *s, AVStream *st, + const char *attribute_line) +{ + AVPacketSideData *side_data = NULL; + AVDictionary* attributes_dict = NULL; + char *key = NULL, *value = NULL; + int ret = 0; + + /* Get the stream's attributes dictionary. + * If the stream has no attributes dictionary, it will be automatically + * created by av_dict_set. */ + side_data = av_packet_side_data_get(st->codecpar->coded_side_data, + st->codecpar->nb_coded_side_data, + AV_PKT_DATA_SDP_ATTRIBUTES); + if (side_data) { + ret = av_packet_unpack_dictionary(side_data->data, side_data->size, + &attributes_dict); + if (ret) { + av_log(s, AV_LOG_WARNING, + "Unable to unpack SDP attributes dictionary.\n"); + return -1; + } + } + + /* The attribute can either be a value attribute (key:value) or property + * attribute (just the key). + * Look for the ':' separator, and create the 'key' and 'value' + * appropriately. */ + const char *separator = strchr(attribute_line, ':'); + if (separator) { + /* Make a copy of the key and value. */ + key = av_strndup(attribute_line, separator - attribute_line); + value = av_strdup(separator + 1); + } else { + /* Copy the key and create an empty value. */ + key = av_strdup(attribute_line); + value = av_mallocz(1); + } + if (!key || !value) { + av_dict_free(&attributes_dict); + av_free(value); + av_free(key); + return -1; + } + + /* Add the attribute, then pack the dictionary again. */ + ret = av_dict_set(&attributes_dict, key, value, + AV_DICT_DONT_STRDUP_KEY | + AV_DICT_DONT_STRDUP_VAL | + AV_DICT_MULTIKEY); + if (ret) { + av_log(s, AV_LOG_WARNING, + "Unable to add SDL attribute to dictionary.\n"); + av_dict_free(&attributes_dict); + return -1; + } + size_t packed_dict_size = 0u; + uint8_t *packed_dict = av_packet_pack_dictionary(attributes_dict, + &packed_dict_size); + + /* Free the dictionary, which is not needed any longer. */ + av_dict_free(&attributes_dict); + + /* Make sure the dictionary was packet successfully, then add it back to + * the stream's side data. */ + if (!packed_dict) { + av_log(s, AV_LOG_WARNING, + "Unable to pack SDP attributes dictionary.\n"); + return -1; + } + side_data = av_packet_side_data_add(&st->codecpar->coded_side_data, + &st->codecpar->nb_coded_side_data, + AV_PKT_DATA_SDP_ATTRIBUTES, + packed_dict, packed_dict_size, + 0); + if (!side_data) { + av_log(s, AV_LOG_WARNING, + "Unable to add SDP attributes side data to stream.\n"); + return -1; + } + + return 0; +} + /* parse the rtpmap description: /[/] */ static int sdp_parse_rtpmap(AVFormatContext *s, AVStream *st, RTSPStream *rtsp_st, @@ -570,6 +655,18 @@ static void sdp_parse_line(AVFormatContext *s, SDPParseState *s1, sizeof(rtsp_st->control_url)); break; case 'a': + /* add all SDP attributes to the stream's side data */ + if (rt->nb_rtsp_streams > 0) { + rtsp_st = rt->rtsp_streams[rt->nb_rtsp_streams - 1]; + if (rtsp_st->stream_index >= 0) { + st = s->streams[rtsp_st->stream_index]; + if (sdp_add_attribute_to_stream_side_data(s, st, p)) { + av_log(s, AV_LOG_WARNING, + "Failed to add SDP attribute to stream"); + } + } + } + /* now parse the SDP attribute line */ if (av_strstart(p, "control:", &p)) { if (rt->nb_rtsp_streams == 0) { if (!strncmp(p, "rtsp://", 7)) -- 2.43.5 -- This message has been scanned for viruses and dangerous content by MailScanner, and is believed to be clean. _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".