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 185564BDD4 for ; Tue, 3 Jun 2025 21:35:39 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTP id 8F4F868DBE6; Wed, 4 Jun 2025 00:35:36 +0300 (EEST) Received: from EUR05-VI1-obe.outbound.protection.outlook.com (mail-vi1eur05olkn2021.outbound.protection.outlook.com [40.92.90.21]) by ffbox0-bg.ffmpeg.org (Postfix) with ESMTPS id BDAEF68DAC7 for ; Wed, 4 Jun 2025 00:35:29 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=lhM3YydNgn0A559+KgkjdbrkUva3Jls0uhB3+HdOUgj5+f3HPHkxwCniE/hRjMZgNotF7wo3SGfFNemOUbP6bXYugZc2hbFWnhK5aZqS+5o5fCAicNxqSAlob9z1VlUO570EHtxOR3SemEF7Y5Bmz0u72NSn++CFYf61Sx6QTI1u66r+MjxJLXKuwqmxb9/7H2H0Fdl/3fO8sZygMP67UYieFexNKUPyHD+JF7c9OhyovFn82B3GtGEkY6sZkJgeXLx5+5FthghVuVF20Xx0jKz2uJh4HXq1G93TeuvGjYeelYpMzhpi9VZ/GkXaMxzVUDGxwHpahK2Cy9mU1jlGkQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=UmdACRtY4dRId1R+1xtQ+qPaHmsjwsAXpfJ9GWiMnbU=; b=t3GecvYhFdUHmWY3+EadgKQ2tHd8ZyCeBEdBQS/HmLTRW/o39l5ImhSxVTOB+HmGV6D+42pP772fb0zsN4ueeUn3/ezaVZqfMoagc0LM5nXUkcfNgDhBw410AIdmQcXg2fHPOeJUR5s8GzfBW2Vgj9q+4e+RTjnuDctlQF1y9Y+pXIcFwYCpFhzvK/dut1VUwu4bc8SLJvfQ3lJeMJprtG1OgO5B3HGa7kfCYi8m+9uK85ph/ABJOEpT/1Zg2fziJsQGd1k//nBf6leyfbBw14UJcvwr70Yt0TDLk138fPkwbYDKDpTIrTtPA17NBilYQeuzc4O01yijNGPK/xdakw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=UmdACRtY4dRId1R+1xtQ+qPaHmsjwsAXpfJ9GWiMnbU=; b=KkhE9bEXB2odvXz3HLtZfC+CSEhLFGoS69dbZyAcVp0KdRKMJjzOYuJmoRjtoITk5jT/1LkZECkDt29+Bao4wUgEwawNP3OahpiWJe6FfqkXoG73gdwBexCeQ5jWPGTrat+vmAkMd1kXCdG768jdraKHC0rg0dBsXn09GdvGBE5KYlfzWpXGjf1m+MhQe/BbQna+o14kHGEpwPUxjV1NUutTi/PX9oXyqCd5StuTOIW117vHJRrtNjf/RqnpfqxU0EvHZKwTo/lYACeNU+2PbNDM16EEakMtSBnz+Eo/GNAf7gJgnkR6EydfniJW2iRqbU+Pdy+Sj/spfrF6AW9pbg== Received: from GV1P250MB0737.EURP250.PROD.OUTLOOK.COM (2603:10a6:150:8e::17) by DU0P250MB0844.EURP250.PROD.OUTLOOK.COM (2603:10a6:10:3e7::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8769.37; Tue, 3 Jun 2025 21:35:28 +0000 Received: from GV1P250MB0737.EURP250.PROD.OUTLOOK.COM ([fe80::d6a1:e3af:a5f1:b614]) by GV1P250MB0737.EURP250.PROD.OUTLOOK.COM ([fe80::d6a1:e3af:a5f1:b614%5]) with mapi id 15.20.8769.035; Tue, 3 Jun 2025 21:35:28 +0000 Message-ID: Date: Tue, 3 Jun 2025 23:35:25 +0200 User-Agent: Mozilla Thunderbird To: ffmpeg-devel@ffmpeg.org References: <20250603164936.3240075-1-tatum.rashad@gmail.com> Content-Language: en-US From: Andreas Rheinhardt In-Reply-To: <20250603164936.3240075-1-tatum.rashad@gmail.com> X-ClientProxiedBy: FR2P281CA0024.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:14::11) To GV1P250MB0737.EURP250.PROD.OUTLOOK.COM (2603:10a6:150:8e::17) X-Microsoft-Original-Message-ID: MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: GV1P250MB0737:EE_|DU0P250MB0844:EE_ X-MS-Office365-Filtering-Correlation-Id: fe5a17dc-0fc7-453b-ca10-08dda2e68ec8 X-Microsoft-Antispam: BCL:0; ARA:14566002|19110799006|7092599006|15080799009|41001999006|8060799009|5072599009|461199028|6090799003|440099028|3412199025; X-Microsoft-Antispam-Message-Info: =?utf-8?B?ZzMzOHRiTTM4S1JQV0M1TkJXWHN0dWpDRlY4MWNTMUhEL2pCVmpDZGJtR01Q?= =?utf-8?B?K1dzVEkwT1ZwUlAyQ1Y4KzRqRFM1NXlzTUNKOEpVb21od0tvc2RXck05QUNJ?= =?utf-8?B?M0VxamJvODJzVXNLSGFSemVxU0dvQVI4czdsZGRQRm85dVYzcWcyZ210aVls?= =?utf-8?B?K2lhQWFFZzNXZGJZUThERHBUYW9EUmU3bzZwVUo2S1ZNM0lwdHdPeklyQzVi?= =?utf-8?B?c1lDNzB4UTZlSDJrTFMrTHF4aEJvelJEU3ZZWVo4Qk1JdmN2cjl2Nk1mMDJu?= =?utf-8?B?UjJiRmsxUndmRkhUWGtPSHdHRjhoUERoRGVhUG5tWS9kOVRraWpOME5HdW9X?= =?utf-8?B?ZExiVWttOGk3L0RuOTkxVzB5ckU2SDBKbFVGZDArMWp4anJPRitQQmh0S0ZC?= =?utf-8?B?OEhXc0tqeEJqYnhQOU16WmJDcW1IbFlhdm12Z2hCalppL3VxOUVmRnE2UVQw?= =?utf-8?B?NzhpZnFDQnpDc1F2OElxMGk0SWtaUS9TYURpaGNWMHdUQ3E3MklNSzgvMFJt?= =?utf-8?B?NytWRDdFUFduaG10YUNDUEY1MFA5aDVJNjNXbkxTQTZzRTg2b3VDcFluTUJl?= =?utf-8?B?QU5mZTViQnpyN0RucEVaRWoyNit3L1B5bG9IZ1dMZVRmUjJuMVp3N0ZISzY5?= =?utf-8?B?OXhPRmkzWXI1cjFlblBSbk56MVEwUTVFUTcvci9TQjhuZW9ldlhkaTNMODho?= =?utf-8?B?WmExMmovOG5walhjZzVzeW1oMFF6VkhKeWQ0S2hxT2Vpa2J6QnM3Q05wbDJF?= =?utf-8?B?RXZSSWZObC82bmdFeW5QYUk5Y3NqY3V6bEZMdzVoQlpab2gxT1FWclFIcUow?= =?utf-8?B?c1F0Y1B3Vkw2OEVyMGlyRWlDQmVac2E3OXBBQUwxR2d6QTJUeTU5WE40SmRV?= =?utf-8?B?dWxBSTJIYmViV08xMFdQRlIvWVZaWTR2YytxWDlSRXpMcFlFcElqemJRMTJC?= =?utf-8?B?MmFNRi91MnhESjJTRi9hdVVxdTVVRUZQR2NhTVlvSThRckdnYnNDeCszQkR5?= =?utf-8?B?bG5KaVd2YnE4a3VSWWRjTWl6UUxZeENUbHdaZTFtb2V2VlhpVFZFM214L1lx?= =?utf-8?B?RE95cmRSRU1wOFRrb3l5WFBEQ2NzeldKb1dFWWVVWWR2QXk0U1Zua2xQeHRO?= =?utf-8?B?cm1ZRVY4SzNmamRMWVloUGprRHlhaWcvMDgzcUUxbS8rcXVDOVRxTE9wNFEx?= =?utf-8?B?MS9MN2ZrUm5MK0haVE9rczZHSVlncGRPbEhQbkVIRkJtcWhicUIrbXFqMUV1?= =?utf-8?B?ajhManhwRjQ3L3JwbGFzNUVGZVluZk9UYTNEVDBXMlhhVTRId29mbklwb0dV?= =?utf-8?B?eThrVzVjVk5pZThLVEo2RW5WK3gydGlGajlZMDlCdjdhL004eGY3bEdPMDVY?= =?utf-8?B?bnRIcmFEUjY0YzZiMzlKS1cxK1JFZ0hLWEVqVzh2dW40UGp2Q2s1R3U4eUNz?= =?utf-8?B?bUpUZnRKMHd6eFNnbDh4ajZpTHV1YmNObGFHaGlHaExDTFJwQUNEaXdRaXZE?= =?utf-8?B?dVoyS3dSaHNkbFNCV2wzRW5zdUx0S3VhQm9QYkNxdEZOUUVJSUMyZTE4UzRo?= =?utf-8?Q?0FXyu5ggAEJhztgIXTpPR9Gwo=3D?= X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?bjNQejJkMmdqUUJVZnlEZnlCT3cyeTFNYkw4K211MzFVY2ZLdjIwWlBCa2RS?= =?utf-8?B?bEUxVzFVaHI3WDM0d3pHbkRheS9vY1djd3RPUE1WSlBSVjg5S1dwSXc5SVor?= =?utf-8?B?NElzVm9QZHAxNkQvZGpZdms0eVF2L2FEamlTQkNxbmRvWXo0amw2WndkZjJQ?= =?utf-8?B?YS9LaUtXa05qZlVWSzl1MDk5Vi8vMnlKNWJBVjdXZURlVjNaNlVIUFFsd1g3?= =?utf-8?B?OXFFSEc4ZlB1VUhZdlE0MXErS1FaaGRFWnhDVEZGbFI0eVlHSUlGd01ING1W?= =?utf-8?B?OTgwV2svYllQT21qOWpRK2s5STFvS1FSVTRqZ2pIL3JNdHBXdGlicHdQR2Uw?= =?utf-8?B?dHluSDFnZEFrRXJ2SVRRaVJyejB0MzFOWGV1ZnRJMW50WG9mVFZucDlvL0VE?= =?utf-8?B?VG5QQ1JKRkc1U05hSUk2WVEwZTNjQ2tKcTIrblRFMlcvZEtsVUl5SWRzYjVh?= =?utf-8?B?ZFpMck54K0c0T2tNOWVnOEFOS01ZOUQ2SUZROGJmMnYzY3drNWtLRTA4SWFZ?= =?utf-8?B?SDlKeHJieVBQV1dFRCt3aHlPUTNDbzNqeks5aVVncUpSYUVTYTdkQkRpY2U3?= =?utf-8?B?b0ZYTlI2T3NvS1I2LzVmRi9tUkh4Q2lTU2d4R3BWYmVRZTJaYXJHMml3eS9V?= =?utf-8?B?Smg3bGo5T2lodElyOW9WeWRQL3NGbllWYzk4SkNLdGFaeGNJaTdUZmFrd0dV?= =?utf-8?B?MytncXZSKy82T0RDQUVETmRNOEtacHowam1FTGVxSlhvKzFQQ3NuZlNBZ3BW?= =?utf-8?B?dHptVTdiWmVhQ0E4TVprUVB0T0JudXZoMm9uNFJDVU9JRWR3aFYvQm9HMkpv?= =?utf-8?B?dWxETEtRTHZxTnRWekVHME9HMXAxRmtlL3luYlRYdzNqS2g4TnVITXN2bWM1?= =?utf-8?B?ODhKdGE4ZThaUGVKOE53VDV0bkZISGo4dUJodm9ZMnNqeXBrUTM1Z1ZSelc3?= =?utf-8?B?dk90ZXRaeFpWTkZ6NVZRVVdZTTZmek5XcVpYQWQvWmxSV09oNHRvUTZGenE5?= =?utf-8?B?TEo3b3AzQUhIbytYTHR3TjJGa0VXYWFjRGsxc0c3U3ZhOHFOYVdPRngxM2pu?= =?utf-8?B?VkFFUTZKd1YyRkprd25Na2NsaVM4eGVBU2plUGs5VTlQT3FuUVVXdDM4UERE?= =?utf-8?B?UUpMYWZrNnBWSXlXMVVVNDlQbW93Z3gxSlBZWHptcERSZkNGRTAzeng0SmpH?= =?utf-8?B?clVQTmY3czR4YVUwM3EvS1QvcDF4MEJlbTBuNlVNRlN3Y1Rib2NOYzBRQnFY?= =?utf-8?B?ZGU4em1MRjQzekRXR2V2MGxPV1lIbzh1NFJuU0x0cHpGWHAxc09CYWdPRmxD?= =?utf-8?B?bU1KYjViTW8rWDg2L0x3SFJjZjlzUklkZytJQkovWHhoYW9jaGlnbTAvRTVO?= =?utf-8?B?QXovSUxMK1NxcVZyb2R3WjB3dlRFMmh6TENJbGh5d0RFSm43c28rRTh0azVV?= =?utf-8?B?bytlYTBDeHgrTzkxZVNHMUdMd1dtdENXZDVLT1k0ZkhXK0ZNZWNWSHJaazY1?= =?utf-8?B?UVZIVHRiUS9ua1JEemVXUGg5dmlSZzRwd1RQYVdrVXh3a0JWcmtvdEx5aGxF?= =?utf-8?B?KzZaNmoxSTBGdGdlKzk4cTNVS1UxUGp2MWNweHVNb0o4TXhxQWJZcFpyWStx?= =?utf-8?B?TjE5ODdLUmVHUS9XcjJzT2hoQllYalM2T0xGejd1bE5oeDBTWnFyclpJMVc3?= =?utf-8?B?UnVxVnBQbUMrR29jc0Z6Rk5Ka0pJaHdIMGMxaHlZQ1N6WlFwRDRldUU4cUZX?= =?utf-8?B?WFdKSXRtU2ZQQzJITTlWZWVQK0JxdjVkOVBNRmM0Vmx1NlhRUW01dUNieDlL?= =?utf-8?B?UDAvT3lQSWpHeFNGeU53UT09?= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: fe5a17dc-0fc7-453b-ca10-08dda2e68ec8 X-MS-Exchange-CrossTenant-AuthSource: GV1P250MB0737.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 03 Jun 2025 21:35:28.0953 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU0P250MB0844 Subject: Re: [FFmpeg-devel] [PATCH v4] Add new method for playing network based streams with a play rate. 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 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: Rashad Tatum: > Add implementation for changing the play rate for rtsp streams. > --- > libavformat/avformat.h | 6 ++++++ > libavformat/demux.h | 6 ++++++ > libavformat/demux_utils.c | 6 ++++++ > libavformat/rtsp.c | 1 + > libavformat/rtsp.h | 10 ++++++++++ > libavformat/rtspdec.c | 21 +++++++++++++++++++-- > 6 files changed, 48 insertions(+), 2 deletions(-) > > diff --git a/libavformat/avformat.h b/libavformat/avformat.h > index 2034d2aecc..7819b61d3e 100644 > --- a/libavformat/avformat.h > +++ b/libavformat/avformat.h > @@ -2358,6 +2358,12 @@ int avformat_flush(AVFormatContext *s); > */ > int av_read_play(AVFormatContext *s); > > +/** > + * Play a network-based stream (e.g. RTSP stream) with a given play rate > + * (e.g. Scale value for RTSP) and timestamp position. > + */ > +int av_read_play_with_rate(AVFormatContext *s, double play_rate, int stream_index, int64_t timestamp); > + > /** > * Pause a network-based stream (e.g. RTSP stream). > * > diff --git a/libavformat/demux.h b/libavformat/demux.h > index e83d84a201..965743bdf0 100644 > --- a/libavformat/demux.h > +++ b/libavformat/demux.h > @@ -113,6 +113,12 @@ typedef struct FFInputFormat { > * (RTSP). > */ > int (*read_play)(struct AVFormatContext *); > + > + /** > + * Play a network-based stream (e.g. RTSP stream) with a given play rate > + * (e.g. Scale value for RTSP) and timestamp position. > + */ > + int (*read_play_with_rate)(struct AVFormatContext *s, double play_rate, int stream_index, int64_t timestamp); > > /** > * Pause playing - only meaningful if using a network-based format > diff --git a/libavformat/demux_utils.c b/libavformat/demux_utils.c > index b632277460..8fed41e3b6 100644 > --- a/libavformat/demux_utils.c > +++ b/libavformat/demux_utils.c > @@ -179,6 +179,12 @@ int av_read_play(AVFormatContext *s) > return AVERROR(ENOSYS); > } > > +int av_read_play_with_rate(AVFormatContext *s, double play_rate, int stream_index, int64_t timestamp) { > + if (ffifmt(s->iformat)->read_play_with_rate) > + return ffifmt(s->iformat)->read_play_with_rate(s, play_rate, stream_index, timestamp); > + return AVERROR(ENOSYS); > +} > + > int av_read_pause(AVFormatContext *s) > { > if (ffifmt(s->iformat)->read_pause) > diff --git a/libavformat/rtsp.c b/libavformat/rtsp.c > index 5ea471b40c..6cfbcdf989 100644 > --- a/libavformat/rtsp.c > +++ b/libavformat/rtsp.c > @@ -1998,6 +1998,7 @@ redirect: > av_strlcpy(rt->real_challenge, real_challenge, sizeof(rt->real_challenge)); > rt->state = RTSP_STATE_IDLE; > rt->seek_timestamp = 0; /* default is to start stream at position zero */ > + rt->scale = 1.0; /* default is to play at the normal rate */ > return 0; > fail: > ff_rtsp_close_streams(s); > diff --git a/libavformat/rtsp.h b/libavformat/rtsp.h > index 83b2e3f4fb..1b8ce05d74 100644 > --- a/libavformat/rtsp.h > +++ b/libavformat/rtsp.h > @@ -245,6 +245,16 @@ typedef struct RTSPState { > * whenever we resume playback. Either way, the value is only used once, > * see rtsp_read_play() and rtsp_read_seek(). */ > int64_t seek_timestamp; > + > + /** the scale value requested when calling av_read_play(). This value > + * is subsequently used as part of the "Scale" parameter when emitting > + * the RTSP PLAY command. The "Scale" parameter determines the stream play > + * rate. A value of 1 represents the normal play rate. Any other value is > + * in regards to the normal play rate. A negative value represents reverse > + * playback. If we are currently playing, this command is called instantly. > + * If we are currently paused, this command is called whenever we resume > + * playback. */ > + double scale; > > int seq; /**< RTSP command sequence number */ > > diff --git a/libavformat/rtspdec.c b/libavformat/rtspdec.c > index 10078ce2fa..f1e44ccb63 100644 > --- a/libavformat/rtspdec.c > +++ b/libavformat/rtspdec.c > @@ -39,6 +39,7 @@ > #include "tls.h" > #include "url.h" > #include "version.h" > +#include > > static const struct RTSPStatusMessage { > enum RTSPStatusCode code; > @@ -527,7 +528,7 @@ static int rtsp_read_play(AVFormatContext *s) > { > RTSPState *rt = s->priv_data; > RTSPMessageHeader reply1, *reply = &reply1; > - int i; > + int i, cmd_char_count = 0; > char cmd[MAX_URL_SIZE]; > > av_log(s, AV_LOG_DEBUG, "hello state=%d\n", rt->state); > @@ -564,11 +565,17 @@ static int rtsp_read_play(AVFormatContext *s) > if (rt->state == RTSP_STATE_PAUSED) { > cmd[0] = 0; > } else { > - snprintf(cmd, sizeof(cmd), > + > + cmd_char_count += snprintf(cmd, sizeof(cmd), > "Range: npt=%"PRId64".%03"PRId64"-\r\n", > rt->seek_timestamp / AV_TIME_BASE, > rt->seek_timestamp / (AV_TIME_BASE / 1000) % 1000); > + > + snprintf(cmd + cmd_char_count, sizeof(cmd) - cmd_char_count, "Scale: %f\r\n", rt->scale); > + > } > + > + > ff_rtsp_send_cmd(s, "PLAY", rt->control_uri, cmd, reply, NULL); > if (reply->status_code != RTSP_STATUS_OK) { > return ff_rtsp_averror(reply->status_code, -1); > @@ -593,6 +600,15 @@ static int rtsp_read_play(AVFormatContext *s) > return 0; > } > > +static int rtsp_read_play_with_rate(AVFormatContext *s, double play_rate, int stream_index, int64_t timestamp) { > + RTSPState *rt = s->priv_data; > + rt->seek_timestamp = av_rescale_q(timestamp, > + s->streams[stream_index]->time_base, > + AV_TIME_BASE_Q); > + rt->scale = play_rate; > + return rtsp_read_play(s); > +} > + > /* pause the stream */ > static int rtsp_read_pause(AVFormatContext *s) > { > @@ -1006,5 +1022,6 @@ const FFInputFormat ff_rtsp_demuxer = { > .read_close = rtsp_read_close, > .read_seek = rtsp_read_seek, > .read_play = rtsp_read_play, > + .read_play_with_rate = rtsp_read_play_with_rate, > .read_pause = rtsp_read_pause, > }; Seems like play_rate should just be an option of this demuxer (with the AV_OPT_FLAG_RUNTIME_PARAM flag). - Andreas _______________________________________________ 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".