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 E2B4A45687 for ; Thu, 16 Feb 2023 06:52:29 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id C610268BF18; Thu, 16 Feb 2023 08:52:25 +0200 (EET) Received: from EUR02-AM0-obe.outbound.protection.outlook.com (mail-am0eur02olkn2024.outbound.protection.outlook.com [40.92.49.24]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 3AC5868BA58 for ; Thu, 16 Feb 2023 08:52:19 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=SMfsWScHeaUfW7wYiXx/Y23mp+514U6Lwd2ie5xGR+SQZskIOh5G4ch0NKrGa/Rc8CaNThCjJEQ/bk/0aILB65PnFyO5jcYvhrqwEOdmNBdDOPAl5CUg81DGLKgKYJtTQ3VCoZk0pz80ECfnhJvEuE/tm24QlxvZAzWKHTdc5vBv0HcD9lGKrjaDHT+GFGS4eC3TopqdB3MqdVMIGTNF6ObQeJ+86xTAB9bfADxVkyETvt68dBnoPNrD3NZabJPP0qY5E1SydLQVYT2MmfaAkVGp/e8WPCejFKNEDEcmi41kRiKVak9TtBqBJi9CkOcpf65ld9mswJr3kZ8QzXukNA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; 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=vQomyjJD9hfGrlF6oqpabR3WQGeC/R+Q0Dpc1CPOwWs=; b=DbSCatO5NKwTfql9ZtUmx3JobZy4oSRGfly1E0yHKPZe4JMeZ6+Lhu6u6/pT4xJnY+MRq8pXTyFRrL8UuFR1R9b2IYRBBKu0/C4V5hrQ/gxqTUqcslLA7V4L0/XdtckQpkw1ZaG9ap7D1Pwg9FMGdSakcdONK3G3qz5AfVxT795wWNx28ipV6rWLhHUXaXGW7kYyS06IUlmZwsFpJK5AO4huttwBfZrERhO41kKVSMRUw5t0meP832IEXWZfVSiYR5MaWWlajW/xec8j12A6a0sljBHksenGFiL936wdZtWdlnySC8b5IqbNzLnBXSZ0tAfBn7XSP/+NJAazX6XcoA== 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=vQomyjJD9hfGrlF6oqpabR3WQGeC/R+Q0Dpc1CPOwWs=; b=UaeRJ5fKXzqXo/lT5Obg4NUpGIHH5wHelKnuusWv4LI82rNqiA7gK8NbGuqXFuhG+sbe3QjldUCE65IwyDBPOggHwY+MTG4GWobrwkILeqYgVKIM5oEYCYgpzbP9z5N2vRW1nlUQ1P49MyX0U5yF7TVb17DCjrSuJFuWfYiNzpBVB3LNGOY6k9XL+C6aNtl5XZT6WgwyEASdKm2i4dHTyAZl+DxMqZ2cRncSpW4T75fJarzVzQi8lKetmNMkf7bsEmyhgdx1qpJnfIQUbYd8bkvgJKybXlxWSQSJ/NJDmzhLPZhKCu4gBr5FLg+OXxfmCFD2r4hH8eAWVLDYORlQ1w== Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) by GV2P250MB0874.EURP250.PROD.OUTLOOK.COM (2603:10a6:150:76::18) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6086.24; Thu, 16 Feb 2023 06:52:17 +0000 Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM ([fe80::ee20:26b8:7242:6ac3]) by AS8P250MB0744.EURP250.PROD.OUTLOOK.COM ([fe80::ee20:26b8:7242:6ac3%8]) with mapi id 15.20.6043.017; Thu, 16 Feb 2023 06:52:16 +0000 Message-ID: Date: Thu, 16 Feb 2023 07:52:47 +0100 To: ffmpeg-devel@ffmpeg.org References: <20230209105519.1814-1-ffmpeg@gyani.pro> Content-Language: en-US From: Andreas Rheinhardt In-Reply-To: <20230209105519.1814-1-ffmpeg@gyani.pro> X-TMN: [hs8WMrawJYdlUIZKwrSb+Fhi0yFC3R5v] X-ClientProxiedBy: ZR0P278CA0109.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:20::6) To AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) X-Microsoft-Original-Message-ID: <2086077a-a43c-2e6d-98ed-b754a73f8774@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AS8P250MB0744:EE_|GV2P250MB0874:EE_ X-MS-Office365-Filtering-Correlation-Id: 23939064-2737-468f-5294-08db0fea5768 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: GlYEMRI3ohvNAQUyKhHura/cmIvYcQCh+rfkrUtqC9uj0MO/5DB8oOg6VvcuqsgRVkYiU+E16xXnhMvLh3+6SQQb0fLgAyphxYTmHJWQDOFYPq/SHOhUdaiUJPklHaS83G19NPumpHL3Q/uxdtAlojOfme/+jVoOHWoqDnQ/3/TkCArpp/eCMw70DMxsgmFr47RQ5cwRNzxZ9H3jYHixoWELcBbp64Jo78UqlvupxgEdwfnQG6IOiggyRbnOTP9kYA5YKgxvYEurEN7KZVoNY0KUWPOAOIEZBai8s7zd6BQ97xquZAeVvFSGxaOEWEKcCBG1zezNMMiT8TM/Cn/RAkVRF2X4uX07DOQt8+w9Fnq/qy1CnkLbFL8Pv6P8QX5PcklnOT5vumrIeuiOhGSlT0CiMH5PJbm4dWPUUi5jl/+SXK8DuNh9+JvgvZHQBnfSwfAyleaQwoZtf6P0j4MVdGwPcR72Y4NghmzqWCYwIPKgpp5q1mo4uNlbHVxGqFh1GmqxrMjUp6jytQV6KWv6/U4fCSdr7TCSFQIOn3qj6YdGCpKyMs3XMCsnZ2W8YeVV07p82i6X4UAYkPA6hXEKTY9PN5+YBu58jfuzmsSWwkLrsqEWh8qBbqTIK44Zjahlkt58HU8AY3iluUi7bErMpwwckC3EV8vFGF4DkR+aeXw= X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?bHlmZ2NVenpnTlJiMW1QSUY2TS83U05BQ0s2Mm5leWlFU1lGbkg2V09Yd25j?= =?utf-8?B?OTBzZW1UeEFkNEl1aldCZUlPQXZLdElYVHNXVitXRC9iSFhyZkx1Rit0K0FD?= =?utf-8?B?bk9qSkhkWVMvTDU3cWoyQjJ6Vy9nenFYWjlmVnZJdjZZeFNac1NFZERoQ0Nk?= =?utf-8?B?N0p2QmxaSitnSm54R2xBOTN5T0RzT0RyNVQ3UjRvenAraFpuSENWOFhGOTJL?= =?utf-8?B?WFdLeXdJaGRKODFMeEk4SnFpS1VIMXNFczVIRE0ySFZwdmZUUHg1K0NIendJ?= =?utf-8?B?Nm5HTnJ4QllqTTcyV2RVS25IL09hTUUwN1dLMXNRYnJvUUlHTUd2b2FrcUNl?= =?utf-8?B?RTN3U0o5V2lMei9OWUI3ZTJyQWNVVXNTQ2drUU51TmlLMUxVbEp3NWljM0l5?= =?utf-8?B?bXRGT24vVnpVUWMzcjJlbHJOUk5xdSt2eWtXeDdLVWtOOHlnY1RIMWpTeWZK?= =?utf-8?B?VXNIV3ZBTTJ0YkhXcmZnTkk4bnpaNExVSEVXTlVwNzV3MTVQQStUV1BwTGRh?= =?utf-8?B?UU5CVFprMlRUVkNrSlhmdXlLOUNxb1h0UUFYNFBTQWU0MGJIcnZiV0l2TkdE?= =?utf-8?B?eC9TSFVYKytadTlYSEdpMHRyZFVPNWNhVEpFYW1nbzlEeHRNQmNaeHpMWXY2?= =?utf-8?B?cFNRVmpONExQSmFqNWI1UFlqSEI3K1JUZFFXcTUzTXpIYlhMT3hxWUt1bUtV?= =?utf-8?B?Q29LQnZPN2Q5U0xlSDVLMUdVSWxvSWNUajMzL01UcUJUWC9Xcmwxdk5Xd3Bm?= =?utf-8?B?KzFvV3pVWTVZT1ZzYlRzMjlSdUl4Sk1Ka3lyMjdYRElzVDljZ1VtQXVpNjc3?= =?utf-8?B?UWM5RTgwSU9KeUoyZnRsL1BZTWw4bVZsRlkzOWRMM1BqeUpkb2NLQlh4eGNP?= =?utf-8?B?eE5JanBiQWlOWUdnWFRwei9BK2tXNVV1WFJHZjh1OHEzUE9JY05uR2duRUNG?= =?utf-8?B?TWxkNm82V01BVDZyQkFFSEh1OGZMZ2xPbUp4eDM5djB6MGVQczRJaW9wQ1Zm?= =?utf-8?B?N05seDZyd3AxZ2tZMTJVNy9jTXpBR3RyTnYwbGtGVDFlTE1WbGVzVDdzMm1t?= =?utf-8?B?VWhubUJJSXduWGZsQUZsZUgrcUZ3cjFnYkVZR1pOVkQ5c2YzZjhhV2RueVVs?= =?utf-8?B?TGVVanZzdmxuLzcyMk5BUnNFek14Zi9ra1hVWktTbHcweVBSZGhNUXZNYXpJ?= =?utf-8?B?VEJRempzdXlZWWFrVlphSVhhNUFkU3psTVlTdGFadWRLYlIyeHh0aEN5L0tt?= =?utf-8?B?TFJDZitlMHgveTBWRnpOYW15QS8vdmtLTGs0RWpVVFQzVU9wN0F0cExDcy9I?= =?utf-8?B?QUdFT2JsK0FtYkIreVNOWFZsaUhRemtMUk02UHNIVmpRdXFYdkVmaGh1QUli?= =?utf-8?B?ZmxmV2lJNFVqcjVLTXl3MGVxMjhKb1VlbUE1bkRUZ0dLeFVlTHI0dVRoTExp?= =?utf-8?B?NHZMREtlNktwRmsxczI0cmt2QUFINHc0T1RESjZKYWVNOU9UNUthbVBKZHdO?= =?utf-8?B?NG9lNFVYV2RocGhtbFhzRTkvODN1Z2ZPa2ZkMFdpNm1QS1lwemtuZnJKWjVs?= =?utf-8?B?UFB0c3ZocEVGOUVwUU1MSzFVR3B6SHEzbjVCOUlhZ1FBQW4yTW1mMm9lMlFY?= =?utf-8?B?QklGaHluMENNUVcwYmRERHNTT1pPYklLQkgvRUZxakgyQzJScy9mZm0zSWVZ?= =?utf-8?B?UWV3RjJOQStIYy91cy9mU1g0T1EyektKNHphL3lZd2ZCem9vQzNQSFcxUUhm?= =?utf-8?Q?K7UgUZ3oSkofAGO3ms=3D?= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 23939064-2737-468f-5294-08db0fea5768 X-MS-Exchange-CrossTenant-AuthSource: AS8P250MB0744.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Feb 2023 06:52:16.8775 (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: GV2P250MB0874 Subject: Re: [FFmpeg-devel] [PATCH v2 1/4] avformat: add av_program_copy() 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: Gyan Doshi: > Helper to transfer programs from one muxing context to another. > --- > doc/APIchanges | 3 ++ > libavformat/avformat.c | 70 ++++++++++++++++++++++++++++++++++++++++++ > libavformat/avformat.h | 14 +++++++++ > libavformat/version.h | 2 +- > 4 files changed, 88 insertions(+), 1 deletion(-) > > diff --git a/doc/APIchanges b/doc/APIchanges > index 6baf914760..4916d1abe8 100644 > --- a/doc/APIchanges > +++ b/doc/APIchanges > @@ -14,6 +14,9 @@ libavutil: 2021-04-27 > > API changes, most recent first: > > +2023-02-xx - xxxxxxxxxx - lavf 59.39.100 - avformat.h > + Add av_program_copy() > + > 2023-0x-xx - xxxxxxxxxx - lavc 59.63.100 > Allow AV_CODEC_FLAG_COPY_OPAQUE to be used with decoders. > > diff --git a/libavformat/avformat.c b/libavformat/avformat.c > index 19c7219471..d3c8def170 100644 > --- a/libavformat/avformat.c > +++ b/libavformat/avformat.c > @@ -359,6 +359,76 @@ void av_program_add_stream_index(AVFormatContext *ac, int progid, unsigned idx) > } > } > > +int av_program_copy(AVFormatContext *dst, AVFormatContext *src, int progid, int overwrite) > +{ > + AVProgram *src_prog = NULL; Should be const. > + AVProgram *dst_prog = NULL; > + int i, j, ret; > + int idx = -1; > + > + for (i = 0; i < src->nb_programs; i++) 1. nb_programs is unsigned and therefore the iterator should be, too. 2. Use a smaller scope for the iterator. (Same for all other iterators.) > + if (src->programs[i]->id == progid) > + src_prog = src->programs[i]; > + > + if (!src_prog) { > + av_log(src, AV_LOG_ERROR, "source program not found: id=0x%04x\n", progid); > + return AVERROR(EINVAL); > + } > + > + for (i = 0; i < dst->nb_programs; i++) { > + if (dst->programs[i]->id == progid) > + idx = i; > + } > + > + if (idx >= 0 && !overwrite) { > + av_log(src, AV_LOG_ERROR, "target muxer already has program with id=0x%04x; not overwriting\n", progid); > + return AVERROR(EINVAL); This should not be an error. > + } > + > + av_log(src, AV_LOG_TRACE, "%s program: id=0x%04x\n", idx >= 0 ? "overwriting" : "copying", progid); > + > + if (idx >= 0) { > + dst_prog = dst->programs[idx]; > + av_dict_free(&dst_prog->metadata); > + av_freep(&dst_prog->stream_index); > + dst_prog->nb_stream_indexes = 0; > + } else { > + dst_prog = av_mallocz(sizeof(*dst_prog)); > + if (!dst_prog) > + return AVERROR(ENOMEM); > + ret = av_dynarray_add_nofree(&dst->programs, &dst->nb_programs, dst_prog); av_dynarray_add_nofree() presumes that dst->programs points to a buffer for a power-of-two pointers (or to NULL); what if a user has reallocated dst->programs himself and moved AVPrograms from another AVFormatContext manually? Do we treat this as API violation? > + if (ret < 0) { > + av_free(dst_prog); > + return AVERROR(ENOMEM); > + } > + } > + > + /* public fields */ > + dst_prog->id = src_prog->id; > + dst_prog->flags = src_prog->flags; > + dst_prog->discard = src_prog->discard; > + dst_prog->program_num = src_prog->program_num; > + dst_prog->pmt_pid = src_prog->pmt_pid; > + dst_prog->pcr_pid = src_prog->pcr_pid; > + dst_prog->pmt_version = src_prog->pmt_version; > + > + for (i = 0; i < dst->nb_streams; i++) { > + for (j = 0; j < src_prog->nb_stream_indexes; j++) > + if (dst->streams[i]->id == src->streams[src_prog->stream_index[j]]->id) The documentation should mention that AVStream.id is used for stream-matching. > + av_program_add_stream_index(dst, dst_prog->id, i); This involves a realloction whose success can't be checked due to a design bug in av_program_add_stream_index(). Add an ff_program_add_stream_index() without this design bug and turn av_program_add_stream_index() into a wrapper for it. > + } > + > + av_dict_copy(&dst_prog->metadata, src_prog->metadata, 0); Missing error check. > + > + /* private fields */ > + dst_prog->start_time = src_prog->start_time; > + dst_prog->end_time = src_prog->end_time; > + dst_prog->pts_wrap_reference = src_prog->pts_wrap_reference; > + dst_prog->pts_wrap_behavior = src_prog->pts_wrap_behavior; These private fields are demuxer-only; there is no need to copy them for muxers. > + > + return 0; > +} > + > AVProgram *av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s) > { > for (unsigned i = 0; i < ic->nb_programs; i++) { > diff --git a/libavformat/avformat.h b/libavformat/avformat.h > index 1d97d56ac5..2b7ed3abd8 100644 > --- a/libavformat/avformat.h > +++ b/libavformat/avformat.h > @@ -1996,6 +1996,20 @@ uint8_t *av_stream_get_side_data(const AVStream *stream, > > AVProgram *av_new_program(AVFormatContext *s, int id); > > +/** > + * Copy an AVProgram from one AVFormatContext to another. > + * > + * @param dst pointer to the target muxer context > + * @param src pointer to the source muxer context > + * @param progid ID of the program to be copied > + * @param overwrite whether to overwrite if target muxer already > + * contains a program with the same ID > + * > + * @return 0 in case of success, a negative AVERROR code in case of > + * failure Better make >= 0 for success for extensibility. > + */ > +int av_program_copy(AVFormatContext *dst, AVFormatContext *src, int progid, int overwrite); > + 3. Why is this public? Which user is supposed to need this? 4. src should be const. > /** > * @} > */ > diff --git a/libavformat/version.h b/libavformat/version.h > index 134cdb2b89..9aba356e09 100644 > --- a/libavformat/version.h > +++ b/libavformat/version.h > @@ -31,7 +31,7 @@ > > #include "version_major.h" > > -#define LIBAVFORMAT_VERSION_MINOR 38 > +#define LIBAVFORMAT_VERSION_MINOR 39 > #define LIBAVFORMAT_VERSION_MICRO 100 > > #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ _______________________________________________ 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".