From patchwork Mon Sep 4 22:08:48 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 43550 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:4f16:b0:149:dfde:5c0a with SMTP id gi22csp1474276pzb; Mon, 4 Sep 2023 15:09:07 -0700 (PDT) X-Google-Smtp-Source: AGHT+IF1RCOP4sLIl98zWCJz2bBFrKnLqwucixg9R7pNgYsWYZpiTzZtKouBdrmpHRB/oIVVpVx4 X-Received: by 2002:a50:ed03:0:b0:521:8d64:df1c with SMTP id j3-20020a50ed03000000b005218d64df1cmr10625255eds.0.1693865347222; Mon, 04 Sep 2023 15:09:07 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1693865347; cv=none; d=google.com; s=arc-20160816; b=lCcz9XDVoPdWDdPxX/x9M7LTHuvRGiA1IZSR0q72UdOOV8JJNq9va0UhOLGzjast0h brgEU13OI1eWe3jFcFvY/Ric6HWl7fNLB6d3DdCxFvgcKW8S0uQYhy6C3rKOOdnRJuFC MWv+BUPoG1lIhKPpGAKm/2Z9OKq8r1Z72LuWkKG9n9g70d7gmhUkO5oMd60HlEPIG4B7 wLi6q6QoIJ0UDEqtwfezuFGSNt8l8KUlCx4i9mF7EP+DmvN5I+6e+FF65QdOwfkXm68e Um9PJftOGjVdWMJd5HNMRSG19wzGYW027RYikKiefUl/BH+qE2/0PLV3T7YTUwvTax3I 63cg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=sgsqfLEe1JMOhPlDvA6u9Mx8yya82mTCHPI6TSYxnHs=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=VltqHpeEeyvhdAzeDBpz1GMayU2ew3I86wC+xMp1zChUojHtBDH/in5hUWRZKziidJ 4QV3QYfOxaN3DtTZdbjS7XebQfqWNicByO/FLFHohu/3LThxtwDo9AKtvshiLph/sqZ8 RXBvqzBUR7XQuFUoIBJIT9/8YRMvybCNgsKu8H5EIy+7NUjgQOevZmyveodbqYLltcOo BcJoQXJM9fd0Vs6u5wfmQenHlY7f2ziIWAyp7O4wlU2F2VwbZCpnW0BZVoHjDuZCoHeF Ju10blzJ+ZSpoIA8lt2YdmL6CpUTTs+crdrW7XcdSPycqEu5tBB+ac0k+B8/e4Y91zfs XrGw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20221208 header.b=rFR17DR1; 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; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id i24-20020a0564020f1800b0052e1a3a540esi2375861eda.229.2023.09.04.15.09.06; Mon, 04 Sep 2023 15:09:07 -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; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20221208 header.b=rFR17DR1; 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; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 79C5A68C7BC; Tue, 5 Sep 2023 01:09:04 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ot1-f48.google.com (mail-ot1-f48.google.com [209.85.210.48]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 748E268C464 for ; Tue, 5 Sep 2023 01:08:58 +0300 (EEST) Received: by mail-ot1-f48.google.com with SMTP id 46e09a7af769-6bc9811558cso1571321a34.0 for ; Mon, 04 Sep 2023 15:08:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1693865336; x=1694470136; darn=ffmpeg.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=/H+bLTteE6jvSH6H1+0wp5IEoQMj43FD31STL/TLRl0=; b=rFR17DR1dk0Pf2jWNbYe/NYNqcOgPGhmC5kilXdJBBxiqBvN6DmEUv4CVPE2levlXS waqBsSLYIjsjyOvIBa5rSaq6qp/rYZY4z2FPhtDs5c+e7gh6RHoYSyUCWbi87cJCOAlu AYHqZrEI7dYmpHJGjUOzJUvMMWb0MbWSkmfFpxiG3dLJZr/aOfvlajPU/M43OkKdzh/n F3kPWkZDBwVwpb/MTeBivhzzD/bFHp4D2+uzl4xjHhOdndoUwK3z/W5tewB6U70iPN1+ wqi6El3UEnetYmyiKafPRYsmqCRq8kGyXqBIdjYiQc6D2pZ4AXfAdtKEAqwSFOdPNHQ5 Pljg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1693865336; x=1694470136; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=/H+bLTteE6jvSH6H1+0wp5IEoQMj43FD31STL/TLRl0=; b=mDFygSqLvC/5bofYnpRkdQE9cYDj+74AanoQSBa1+gMRKU7/nBrBZ5KJJYrbdY/wmY Ck7h5vc4iW/iiHFEbRaBO5BzI3tRYFEXbiNO07kHry97awdIQ6V7MIZ1DXuZBY70aXPo 3dPzqqestDvWARIoPuIexKcHlsO8jalAAJPGqgj77jTTXLOcF/aDmE1h57vOsv0LqgdO GxnlYIMf1c33YOaZM00LzFT9Yb21vYZej1RTKC8fmMxDDuJLY5xuSI8VDTkwAyazYhxp yrRnPfh9ohDXM4DQrmtAvGByBZIqun2/vaVVfz4JSZTo+lkGWlojGj3Me9pKterZW7MS do/w== X-Gm-Message-State: AOJu0YwJJgje/pZ6So6hqMzPYg6CONR8HpPLe3AsSnorxx6wyQ3O+r8V gkP55X+zv4TGFeWOwzi15Ytl1RMxzB4= X-Received: by 2002:a9d:6d98:0:b0:6bd:c3f3:723a with SMTP id x24-20020a9d6d98000000b006bdc3f3723amr12193718otp.9.1693865336148; Mon, 04 Sep 2023 15:08:56 -0700 (PDT) Received: from localhost.localdomain (host197.190-225-105.telecom.net.ar. [190.225.105.197]) by smtp.gmail.com with ESMTPSA id v24-20020a9d69d8000000b006b954f7f422sm4967590oto.6.2023.09.04.15.08.55 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 04 Sep 2023 15:08:55 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Mon, 4 Sep 2023 19:08:48 -0300 Message-ID: <20230904220848.21900-1-jamrial@gmail.com> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20230904150411.56777-2-jamrial@gmail.com> References: <20230904150411.56777-2-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 01/17] avcodec/avcodec: add side data to AVCodecContext 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 5MiQROfvvzkU This will allow the propagation of global side data within the AVCodecContext instead of having to do it inside packets, and thus be available during init(). Global and frame specific side data will therefore be distinct. Signed-off-by: James Almer --- libavcodec/avcodec.c | 2 + libavcodec/avcodec.h | 8 ++++ libavcodec/avpacket.c | 99 +++++++++++++++++++++++++++++++++++++++++++ libavcodec/packet.h | 68 +++++++++++++++++++++++++++++ 4 files changed, 177 insertions(+) diff --git a/libavcodec/avcodec.c b/libavcodec/avcodec.c index 131834b6de..7e1ef99234 100644 --- a/libavcodec/avcodec.c +++ b/libavcodec/avcodec.c @@ -475,6 +475,8 @@ av_cold int avcodec_close(AVCodecContext *avctx) av_freep(&avctx->internal); } + av_packet_side_data_set_free(&avctx->packet_side_data); + for (i = 0; i < avctx->nb_coded_side_data; i++) av_freep(&avctx->coded_side_data[i].data); av_freep(&avctx->coded_side_data); diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 649411ac79..dda8a2412b 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -2100,6 +2100,14 @@ typedef struct AVCodecContext { * an error. */ int64_t frame_num; + + /** + * Additional data associated with the entire stream. + * + * - decoding: set by user + * - encoding: unused + */ + AVPacketSideDataSet packet_side_data; } AVCodecContext; /** diff --git a/libavcodec/avpacket.c b/libavcodec/avpacket.c index 5fef65e97a..5b133c5d8a 100644 --- a/libavcodec/avpacket.c +++ b/libavcodec/avpacket.c @@ -645,3 +645,102 @@ int ff_side_data_set_prft(AVPacket *pkt, int64_t timestamp) return 0; } + +AVPacketSideData *av_packet_side_data_set_get(const AVPacketSideDataSet *set, + enum AVPacketSideDataType type) +{ + for (int i = 0; i < set->nb_sd; i++) + if (set->sd[i]->type == type) + return set->sd[i]; + + return NULL; +} + +static AVPacketSideData *add_side_data_to_set(AVPacketSideDataSet *set, + enum AVPacketSideDataType type, + uint8_t *data, size_t size) +{ + AVPacketSideData *sd, **tmp; + + for (int i = 0; i < set->nb_sd; i++) { + sd = set->sd[i]; + if (sd->type != type) + continue; + + av_freep(&sd->data); + sd->data = data; + sd->size = size; + return sd; + } + + if (set->nb_sd + 1U > INT_MAX) + return NULL; + + tmp = av_realloc_array(set->sd, set->nb_sd + 1, sizeof(*tmp)); + if (!tmp) + return NULL; + + set->sd = tmp; + + sd = av_mallocz(sizeof(*sd)); + if (!sd) + return NULL; + + sd->type = type; + sd->data = data; + sd->size = size; + + set->sd[set->nb_sd++] = sd; + + return sd; +} + +AVPacketSideData *av_packet_side_data_set_add(AVPacketSideDataSet *set, + enum AVPacketSideDataType type, + uint8_t *data, size_t size, + int flags) +{ + return add_side_data_to_set(set, type, data, size); +} + +AVPacketSideData *av_packet_side_data_set_new(AVPacketSideDataSet *set, + enum AVPacketSideDataType type, + size_t size, int flags) +{ + AVPacketSideData *sd = NULL; + uint8_t *data = av_malloc(size); + + if (!data) + return NULL; + + sd = add_side_data_to_set(set, type, data, size); + if (!sd) + av_freep(&data); + + return sd; +} + +void av_packet_side_data_set_remove(AVPacketSideDataSet *set, + enum AVPacketSideDataType type) +{ + for (int i = set->nb_sd - 1; i >= 0; i--) { + AVPacketSideData *sd = set->sd[i]; + if (sd->type != type) + continue; + av_free(set->sd[i]->data); + av_free(set->sd[i]); + set->sd[i] = set->sd[--set->nb_sd]; + break; + } +} + +void av_packet_side_data_set_free(AVPacketSideDataSet *set) +{ + for (int i = 0; i < set->nb_sd; i++) { + av_free(set->sd[i]->data); + av_free(set->sd[i]); + } + set->nb_sd = 0; + + av_freep(&set->sd); +} diff --git a/libavcodec/packet.h b/libavcodec/packet.h index f28e7e7011..63b402d7ea 100644 --- a/libavcodec/packet.h +++ b/libavcodec/packet.h @@ -318,6 +318,14 @@ typedef struct AVPacketSideData { enum AVPacketSideDataType type; } AVPacketSideData; +/** + * Structure to hold a set of AVPacketSideDataSet + */ +typedef struct AVPacketSideDataSet { + AVPacketSideData **sd; + int nb_sd; +} AVPacketSideDataSet; + /** * This structure stores compressed data. It is typically exported by demuxers * and then passed as input to decoders, or received as output from encoders and @@ -724,6 +732,66 @@ int av_packet_make_writable(AVPacket *pkt); */ void av_packet_rescale_ts(AVPacket *pkt, AVRational tb_src, AVRational tb_dst); +/** + * Allocate a new side data entry into to a set. + * + * @param set a set to which the side data should be added + * @param type side data type + * @param size side data size + * @param flags currently unused + * @return pointer to freshly allocated side data entry on success, or NULL + * otherwise. + */ +AVPacketSideData *av_packet_side_data_set_new(AVPacketSideDataSet *set, + enum AVPacketSideDataType type, + size_t size, int flags); + +/** + * Wrap an existing array as a packet side data into a set. + * + * @param set a set to which the side data should be added + * @param type side data type + * @param data a data array. It must be allocated with the av_malloc() family + * of functions. The ownership of the data is transferred to the + * set on success + * @param size size of the data array + * @param flags currently unused + * @return pointer to freshly allocated side data entry on success, or NULL + * otherwise. On failure, the set is unchanged and the data remains + * owned by the caller. + */ +AVPacketSideData *av_packet_side_data_set_add(AVPacketSideDataSet *set, + enum AVPacketSideDataType type, + uint8_t *data, size_t size, + int flags); + +/** + * Remove side data of the given type from a set. + * + * @param set a set from which the side data should be removed + * @param type side information type + */ +void av_packet_side_data_set_remove(AVPacketSideDataSet *set, + enum AVPacketSideDataType type); + +/** + * Get side information from set. + * + * @param set a set from which the side data should be fetched + * @param type desired side information type + * + * @return pointer to side data if present or NULL otherwise + */ +AVPacketSideData *av_packet_side_data_set_get(const AVPacketSideDataSet *set, + enum AVPacketSideDataType type); + +/** + * Convenience function to free all the side data stored in a set. + * + * @param set the set to free + */ +void av_packet_side_data_set_free(AVPacketSideDataSet *set); + /** * @} */ From patchwork Mon Sep 4 22:09:41 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 43551 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:4f16:b0:149:dfde:5c0a with SMTP id gi22csp1474663pzb; Mon, 4 Sep 2023 15:10:00 -0700 (PDT) X-Google-Smtp-Source: AGHT+IEd7PxlsWC7VVS9jHlajM65jL1Nt8aE+n8PbUmH8TM2kSZe2dL3xfqQWnn2/DK7a6keg9Op X-Received: by 2002:a05:6512:282b:b0:500:d8d6:fc5a with SMTP id cf43-20020a056512282b00b00500d8d6fc5amr9139729lfb.37.1693865400261; Mon, 04 Sep 2023 15:10:00 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1693865400; cv=none; d=google.com; s=arc-20160816; b=TvXdpCC04gPTgCr9uBh7mq5hYSDIFrNQpwzmmJ7dOn179Rh5HJOjve5Hw6cKfQ63UU Qf3seR+4WG9loEB8cvWdRVjfDKG7UPa2w7eOzsqBhXRh89U+SIp11fZQBd0KAci531en meQLDOfzhmb3ELjGxvnDj8gr3/VhndRFtfUpBLS5yGnMJdxJ2iDX/Aji6vGcuGDD/C7L 7XVDhoG7HeLwy5083sXuFASCNahbNl7EOihpAF8t7KVi2hlU5g567HGNvRxk/08b3n7o E0A2UogtglwQLplTMwcfKqKsjhbtmst0M/0Ektw8BLDgUy1emd16mya5pxZxze4RkItU 10/Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=f2vWPS0PssZFWL6Vh2mKgKtIRkXc+C6POxSjy9vzuoE=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=BNwhVHIEuWoXsrJ1q0Rbo7XeAlLrQgS0GsWxaIMFKmsurevCSq2dto3qQ2o2VLUqxQ KlkJhFdPpWlqV49K5uE7gTJVpiT2gcuQKQ00/3ychUPBmwPZBsIfRacFFJctZ2hUGX8P kFcaNsLEn2eL6Thwx/kVTbPZr/2J80tD8ftoYh0j0UzvkEoYoqSseDcuO2aBZSDlwGwb bURG4XiQDXM9tt3d6DTJQgvH7gCX6z8eTXpg53YFMJwNpHI+uY/61F0M1NhqZAf907xR 0TQshgpIns+hSVjwpKr93W8KyU3b1wL1t1s5/4Q4pyZYiTI/WxAMzwkxdLsQeOATWVqc ZcgA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20221208 header.b="jvUHxc/q"; 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; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id rh28-20020a17090720fc00b0099d977a31fdsi7113910ejb.899.2023.09.04.15.09.59; Mon, 04 Sep 2023 15:10: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; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20221208 header.b="jvUHxc/q"; 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; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 940BE68BD32; Tue, 5 Sep 2023 01:09:57 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-oa1-f48.google.com (mail-oa1-f48.google.com [209.85.160.48]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id B3B8768BD32 for ; Tue, 5 Sep 2023 01:09:51 +0300 (EEST) Received: by mail-oa1-f48.google.com with SMTP id 586e51a60fabf-1c4c5375329so1466227fac.2 for ; Mon, 04 Sep 2023 15:09:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1693865390; x=1694470190; darn=ffmpeg.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=UruqUGXgPh0q9u6ihrjQrdRqh3kyx7A27lVCpO5V9Tg=; b=jvUHxc/q9a9896TmHFQDyCq01xV+4oTPXco1nbHk5t6X32D8D/FSsA4H7WmmNe29z9 S3LY+TrQYS8QHKUZ9IfuytGtZiPdWfo2MVgFIAS2nP/gQHKOz/Y+asYw4R9AfUjxggH/ myLxCnUv1h4mBK3tf+WY6b9yPqC8jZ8N3DYYKKjKKPVaMTkMVla7PxRssH2HITpZy8PT RJX5BPTi96VYQn52WkXafNNWv0R4MtI4SEO0knbIuIfw0OSrqBwPk9izsqQ+1MjGu5N8 e3V59VAcfxQ1fGPF6cqsyE0+fgw7egix+Po7diN+w4riU6Hfe3J2JGlsZfJ/oY7g7py+ ZOZQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1693865390; x=1694470190; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=UruqUGXgPh0q9u6ihrjQrdRqh3kyx7A27lVCpO5V9Tg=; b=gAqeTe4y/ZYAh4lWJyKOUmxttMwLIVuZHAD/1PdYYMitxTDSiF5eoW5wcQt+Mei+2a eY/QVrzoYHtcLberncRZDf0e3oEZdeqyx6F/XX2PZs/6+DqEWYGo1axHsqwPsws8PxkR y/nP0l+9kjcRai8LnMmlwgwDKKGVTOR9f9QWMOnzIoiWrgaJi2JG3bYlBqt4bczrr5xN Su4Dob/CQH4FecZwVo1ZxKrxBWu+OqzDk85gIl9c6SC0C+veD/UFaglQBET7Y1vLjHQN pGdcET21NfR2/yOdtjU8fug7I+XsxxERPfcialB//8jkuvNhRIRIdD6GfiQB6vo5fwkQ VERA== X-Gm-Message-State: AOJu0YxVw7N/uzYN9NkvC7TEBdGu/fCpUZo3uok6a7PFMwZkXQJH8SZ5 8kslMKLFYbwHsGVecOTf+JwAETu6/zU= X-Received: by 2002:a05:6870:5488:b0:1b0:5290:c95e with SMTP id f8-20020a056870548800b001b05290c95emr12397663oan.42.1693865388904; Mon, 04 Sep 2023 15:09:48 -0700 (PDT) Received: from localhost.localdomain (host197.190-225-105.telecom.net.ar. [190.225.105.197]) by smtp.gmail.com with ESMTPSA id c4-20020a4aacc4000000b00573320e1241sm4873233oon.14.2023.09.04.15.09.47 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 04 Sep 2023 15:09:48 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Mon, 4 Sep 2023 19:09:41 -0300 Message-ID: <20230904220941.21911-1-jamrial@gmail.com> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20230904150411.56777-4-jamrial@gmail.com> References: <20230904150411.56777-4-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 03/17] avformat/avformat: use the side data from AVStream.codecpar 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 5P6+yb3WjUn1 Deprecate AVStream.side_data and its helpers in favor of the AVStream's codecpar.side_data. This will considerably simplify the propagation of side data to decoders and from encoders. Signed-off-by: James Almer --- libavdevice/android_camera.c | 9 ++-- libavformat/avformat.c | 42 ++++--------------- libavformat/avformat.h | 40 +++++++++++++++++- libavformat/concatdec.c | 1 - libavformat/dashdec.c | 11 ----- libavformat/demux.c | 41 +++++++++++++++--- libavformat/demux_utils.c | 4 ++ libavformat/dovi_isom.c | 8 ++-- libavformat/dump.c | 6 +-- libavformat/hls.c | 11 ----- libavformat/hlsenc.c | 11 ++--- libavformat/internal.h | 4 ++ libavformat/matroskadec.c | 45 ++++++++++---------- libavformat/matroskaenc.c | 48 ++++++++++++--------- libavformat/mov.c | 81 ++++++++++++++++++------------------ libavformat/movenc.c | 73 +++++++++++++++----------------- libavformat/mp3enc.c | 8 ++-- libavformat/mpegenc.c | 18 +++++--- libavformat/mpegts.c | 8 ++-- libavformat/mux.c | 19 +++++++++ libavformat/mxfdec.c | 22 +++++----- libavformat/mxfenc.c | 8 ++-- libavformat/options.c | 2 + libavformat/replaygain.c | 9 ++-- libavformat/seek.c | 2 + libavformat/version_major.h | 1 + 26 files changed, 295 insertions(+), 237 deletions(-) diff --git a/libavdevice/android_camera.c b/libavdevice/android_camera.c index 1934999c18..012b40aa37 100644 --- a/libavdevice/android_camera.c +++ b/libavdevice/android_camera.c @@ -638,7 +638,7 @@ static int wait_for_image_format(AVFormatContext *avctx) static int add_display_matrix(AVFormatContext *avctx, AVStream *st) { AndroidCameraCtx *ctx = avctx->priv_data; - uint8_t *side_data; + AVPacketSideData *side_data; int32_t display_matrix[9]; av_display_rotation_set(display_matrix, ctx->sensor_orientation); @@ -647,14 +647,15 @@ static int add_display_matrix(AVFormatContext *avctx, AVStream *st) av_display_matrix_flip(display_matrix, 1, 0); } - side_data = av_stream_new_side_data(st, - AV_PKT_DATA_DISPLAYMATRIX, sizeof(display_matrix)); + side_data = av_packet_side_data_set_new(&st->codecpar->side_data, + AV_PKT_DATA_DISPLAYMATRIX, + sizeof(display_matrix), 0); if (!side_data) { return AVERROR(ENOMEM); } - memcpy(side_data, display_matrix, sizeof(display_matrix)); + memcpy(side_data->data, display_matrix, sizeof(display_matrix)); return 0; } diff --git a/libavformat/avformat.c b/libavformat/avformat.c index 356b4de931..3afc5afd7f 100644 --- a/libavformat/avformat.c +++ b/libavformat/avformat.c @@ -46,9 +46,13 @@ void ff_free_stream(AVStream **pst) if (!st) return; +#if FF_API_AVSTREAM_SIDE_DATA +FF_DISABLE_DEPRECATION_WARNINGS for (int i = 0; i < st->nb_side_data; i++) av_freep(&st->side_data[i].data); av_freep(&st->side_data); +FF_ENABLE_DEPRECATION_WARNINGS +#endif if (st->attached_pic.data) av_packet_unref(&st->attached_pic); @@ -138,6 +142,8 @@ void avformat_free_context(AVFormatContext *s) av_free(s); } +#if FF_API_AVSTREAM_SIDE_DATA +FF_DISABLE_DEPRECATION_WARNINGS uint8_t *av_stream_get_side_data(const AVStream *st, enum AVPacketSideDataType type, size_t *size) { @@ -205,36 +211,8 @@ uint8_t *av_stream_new_side_data(AVStream *st, enum AVPacketSideDataType type, return data; } - -int ff_stream_side_data_copy(AVStream *dst, const AVStream *src) -{ - /* Free existing side data*/ - for (int i = 0; i < dst->nb_side_data; i++) - av_free(dst->side_data[i].data); - av_freep(&dst->side_data); - dst->nb_side_data = 0; - - /* Copy side data if present */ - if (src->nb_side_data) { - dst->side_data = av_calloc(src->nb_side_data, - sizeof(*dst->side_data)); - if (!dst->side_data) - return AVERROR(ENOMEM); - dst->nb_side_data = src->nb_side_data; - - for (int i = 0; i < src->nb_side_data; i++) { - uint8_t *data = av_memdup(src->side_data[i].data, - src->side_data[i].size); - if (!data) - return AVERROR(ENOMEM); - dst->side_data[i].type = src->side_data[i].type; - dst->side_data[i].size = src->side_data[i].size; - dst->side_data[i].data = data; - } - } - - return 0; -} +FF_ENABLE_DEPRECATION_WARNINGS +#endif /** * Copy all stream parameters from source to destination stream, with the @@ -270,10 +248,6 @@ static int stream_params_copy(AVStream *dst, const AVStream *src) if (ret < 0) return ret; - ret = ff_stream_side_data_copy(dst, src); - if (ret < 0) - return ret; - av_packet_unref(&dst->attached_pic); if (src->attached_pic.data) { ret = av_packet_ref(&dst->attached_pic, &src->attached_pic); diff --git a/libavformat/avformat.h b/libavformat/avformat.h index 1916aa2dc5..f78a027f64 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -164,6 +164,13 @@ * decoding functions avcodec_send_packet() or avcodec_decode_subtitle2() if the * caller wishes to decode the data. * + * There may be no overlap between the stream's @ref AVCodecParameters.side_data + * "side data" and @ref AVPacket.side_data "side data" in packets. I.e. a given + * side data is either exported by the demuxer in AVCodecParameters, then it never + * appears in the packets, or the side data is exported through the packets (always + * in the first packet where the value becomes known or changes), then it does not + * appear in AVCodecParameters. + * * AVPacket.pts, AVPacket.dts and AVPacket.duration timing information will be * set if known. They may also be unset (i.e. AV_NOPTS_VALUE for * pts/dts, 0 for duration) if the stream does not provide them. The timing @@ -209,6 +216,11 @@ * AVCodecParameters, rather than using @ref avcodec_parameters_copy() during * remuxing: there is no guarantee that the codec context values remain valid * for both input and output format contexts. + * - There may be no overlap between AVCodecParameters.side_data and side data in + * packets. I.e. a given side data is either set by the caller in + * AVCodecParameters, then it never appears in the packets, or the side data is + * sent through the packets (always in the first packet where the value becomes + * known or changes), then it does not appear in AVCodecParameters. * - The caller may fill in additional information, such as @ref * AVFormatContext.metadata "global" or @ref AVStream.metadata "per-stream" * metadata, @ref AVFormatContext.chapters "chapters", @ref @@ -937,6 +949,7 @@ typedef struct AVStream { */ AVPacket attached_pic; +#if FF_API_AVSTREAM_SIDE_DATA /** * An array of side data that applies to the whole stream (i.e. the * container does not allow it to change between packets). @@ -953,13 +966,20 @@ typedef struct AVStream { * * Freed by libavformat in avformat_free_context(). * - * @see av_format_inject_global_side_data() + * @deprecated use AVStream's @ref AVCodecParameters.side_data + * "codecpar side data". */ + attribute_deprecated AVPacketSideData *side_data; /** * The number of elements in the AVStream.side_data array. + * + * @deprecated use AVStream's @ref AVCodecParameters.side_data + * "codecpar side data". */ + attribute_deprecated int nb_side_data; +#endif /** * Flags indicating events happening on the stream, a combination of @@ -1715,11 +1735,18 @@ typedef struct AVFormatContext { int (*io_close2)(struct AVFormatContext *s, AVIOContext *pb); } AVFormatContext; +#if FF_API_AVSTREAM_SIDE_DATA /** * This function will cause global side data to be injected in the next packet * of each stream as well as after any subsequent seek. + * + * @deprecated global side data is always available in every AVStream's + * @ref AVCodecParameters.side_data "codecpar side data" array. + * @see av_packet_side_data_set_get() */ +attribute_deprecated void av_format_inject_global_side_data(AVFormatContext *s); +#endif /** * Returns the method used to set ctx->duration. @@ -1844,6 +1871,7 @@ const AVClass *av_stream_get_class(void); */ AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c); +#if FF_API_AVSTREAM_SIDE_DATA /** * Wrap an existing array as stream side data. * @@ -1856,7 +1884,10 @@ AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c); * * @return zero on success, a negative AVERROR code on failure. On failure, * the stream is unchanged and the data remains owned by the caller. + * @deprecated use av_packet_side_data_set_add() with the stream's + * @ref AVCodecParameters.side_data "codecpar side data" */ +attribute_deprecated int av_stream_add_side_data(AVStream *st, enum AVPacketSideDataType type, uint8_t *data, size_t size); @@ -1868,7 +1899,10 @@ int av_stream_add_side_data(AVStream *st, enum AVPacketSideDataType type, * @param size side information size * * @return pointer to fresh allocated data or NULL otherwise + * @deprecated use av_packet_side_data_set_new() with the stream's + * @ref AVCodecParameters.side_data "codecpar side data" */ +attribute_deprecated uint8_t *av_stream_new_side_data(AVStream *stream, enum AVPacketSideDataType type, size_t size); /** @@ -1880,9 +1914,13 @@ uint8_t *av_stream_new_side_data(AVStream *stream, * or to zero if the desired side data is not present. * * @return pointer to data if present or NULL otherwise + * @deprecated use av_packet_side_data_set_get() with the stream's + * @ref AVCodecParameters.side_data "codecpar side data" */ +attribute_deprecated uint8_t *av_stream_get_side_data(const AVStream *stream, enum AVPacketSideDataType type, size_t *size); +#endif AVProgram *av_new_program(AVFormatContext *s, int id); diff --git a/libavformat/concatdec.c b/libavformat/concatdec.c index 5d4f67d0ac..2aeb4f1dfd 100644 --- a/libavformat/concatdec.c +++ b/libavformat/concatdec.c @@ -194,7 +194,6 @@ static int copy_stream_props(AVStream *st, AVStream *source_st) avpriv_set_pts_info(st, 64, source_st->time_base.num, source_st->time_base.den); av_dict_copy(&st->metadata, source_st->metadata, 0); - ff_stream_side_data_copy(st, source_st); return 0; } diff --git a/libavformat/dashdec.c b/libavformat/dashdec.c index 29d4680c68..2441087606 100644 --- a/libavformat/dashdec.c +++ b/libavformat/dashdec.c @@ -1952,17 +1952,6 @@ static int open_demux_for_component(AVFormatContext *s, struct representation *p // copy disposition st->disposition = ist->disposition; - - // copy side data - for (int i = 0; i < ist->nb_side_data; i++) { - const AVPacketSideData *sd_src = &ist->side_data[i]; - uint8_t *dst_data; - - dst_data = av_stream_new_side_data(st, sd_src->type, sd_src->size); - if (!dst_data) - return AVERROR(ENOMEM); - memcpy(dst_data, sd_src->data, sd_src->size); - } } return 0; diff --git a/libavformat/demux.c b/libavformat/demux.c index b218f64574..94128b00bc 100644 --- a/libavformat/demux.c +++ b/libavformat/demux.c @@ -1409,9 +1409,10 @@ FF_ENABLE_DEPRECATION_WARNINGS sti->skip_samples = 0; } +#if FF_API_AVSTREAM_SIDE_DATA if (sti->inject_global_side_data) { - for (int i = 0; i < st->nb_side_data; i++) { - const AVPacketSideData *const src_sd = &st->side_data[i]; + for (int i = 0; i < st->codecpar->side_data.nb_sd; i++) { + const AVPacketSideData *const src_sd = st->codecpar->side_data.sd[i]; uint8_t *dst_data; if (av_packet_get_side_data(pkt, src_sd->type, NULL)) @@ -1427,6 +1428,7 @@ FF_ENABLE_DEPRECATION_WARNINGS } sti->inject_global_side_data = 0; } +#endif } if (!si->metafree) { @@ -2435,11 +2437,11 @@ static int add_coded_side_data(AVStream *st, AVCodecContext *avctx) { for (int i = 0; i < avctx->nb_coded_side_data; i++) { const AVPacketSideData *const sd_src = &avctx->coded_side_data[i]; - uint8_t *dst_data; - dst_data = av_stream_new_side_data(st, sd_src->type, sd_src->size); - if (!dst_data) + AVPacketSideData *sd_dst = av_packet_side_data_set_new(&st->codecpar->side_data, + sd_src->type, sd_src->size, 0); + if (!sd_dst) return AVERROR(ENOMEM); - memcpy(dst_data, sd_src->data, sd_src->size); + memcpy(sd_dst->data, sd_src->data, sd_src->size); } return 0; } @@ -2977,6 +2979,33 @@ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options) } sti->avctx_inited = 0; +#if FF_API_AVSTREAM_SIDE_DATA +FF_DISABLE_DEPRECATION_WARNINGS + if (st->codecpar->side_data.nb_sd > 0) { + const AVPacketSideDataSet *set = &st->codecpar->side_data; + + av_assert0(!st->side_data && !st->nb_side_data); + st->side_data = av_calloc(set->nb_sd, sizeof(*st->side_data)); + if (!st->side_data) { + ret = AVERROR(ENOMEM); + goto find_stream_info_err; + } + + for (int j = 0; j < set->nb_sd; j++) { + uint8_t *data = av_memdup(set->sd[j]->data, + set->sd[j]->size); + if (!data) { + ret = AVERROR(ENOMEM); + goto find_stream_info_err; + } + st->side_data[j].type = set->sd[j]->type; + st->side_data[j].size = set->sd[j]->size; + st->side_data[j].data = data; + st->nb_side_data++; + } + } +FF_ENABLE_DEPRECATION_WARNINGS +#endif } find_stream_info_err: diff --git a/libavformat/demux_utils.c b/libavformat/demux_utils.c index 56cc6e15d8..2946e82295 100644 --- a/libavformat/demux_utils.c +++ b/libavformat/demux_utils.c @@ -80,6 +80,8 @@ AVChapter *avpriv_new_chapter(AVFormatContext *s, int64_t id, AVRational time_ba return chapter; } +#if FF_API_AVSTREAM_SIDE_DATA +FF_DISABLE_DEPRECATION_WARNINGS void av_format_inject_global_side_data(AVFormatContext *s) { FFFormatContext *const si = ffformatcontext(s); @@ -89,6 +91,8 @@ void av_format_inject_global_side_data(AVFormatContext *s) ffstream(st)->inject_global_side_data = 1; } } +FF_ENABLE_DEPRECATION_WARNINGS +#endif int avformat_queue_attached_pictures(AVFormatContext *s) { diff --git a/libavformat/dovi_isom.c b/libavformat/dovi_isom.c index c8fdf566e4..8d03d0e632 100644 --- a/libavformat/dovi_isom.c +++ b/libavformat/dovi_isom.c @@ -34,7 +34,6 @@ int ff_isom_parse_dvcc_dvvc(void *logctx, AVStream *st, uint32_t buf; AVDOVIDecoderConfigurationRecord *dovi; size_t dovi_size; - int ret; if (size > (1 << 30) || size < 4) return AVERROR_INVALIDDATA; @@ -64,11 +63,10 @@ int ff_isom_parse_dvcc_dvvc(void *logctx, AVStream *st, dovi->dv_bl_signal_compatibility_id = 0; } - ret = av_stream_add_side_data(st, AV_PKT_DATA_DOVI_CONF, - (uint8_t *)dovi, dovi_size); - if (ret < 0) { + if (!av_packet_side_data_set_add(&st->codecpar->side_data, AV_PKT_DATA_DOVI_CONF, + (uint8_t *)dovi, dovi_size, 0)) { av_free(dovi); - return ret; + return AVERROR(ENOMEM); } av_log(logctx, AV_LOG_TRACE, "DOVI in dvcC/dvvC/dvwC box, version: %d.%d, profile: %d, level: %d, " diff --git a/libavformat/dump.c b/libavformat/dump.c index d31e4c2ec6..d6f32f0c68 100644 --- a/libavformat/dump.c +++ b/libavformat/dump.c @@ -431,11 +431,11 @@ static void dump_sidedata(void *ctx, const AVStream *st, const char *indent) { int i; - if (st->nb_side_data) + if (st->codecpar->side_data.nb_sd) av_log(ctx, AV_LOG_INFO, "%sSide data:\n", indent); - for (i = 0; i < st->nb_side_data; i++) { - const AVPacketSideData *sd = &st->side_data[i]; + for (i = 0; i < st->codecpar->side_data.nb_sd; i++) { + const AVPacketSideData *sd = st->codecpar->side_data.sd[i]; av_log(ctx, AV_LOG_INFO, "%s ", indent); switch (sd->type) { diff --git a/libavformat/hls.c b/libavformat/hls.c index c625e30291..8f80cf64f4 100644 --- a/libavformat/hls.c +++ b/libavformat/hls.c @@ -1851,17 +1851,6 @@ static int set_stream_info_from_input_stream(AVStream *st, struct playlist *pls, av_dict_copy(&st->metadata, ist->metadata, 0); - // copy side data - for (int i = 0; i < ist->nb_side_data; i++) { - const AVPacketSideData *sd_src = &ist->side_data[i]; - uint8_t *dst_data; - - dst_data = av_stream_new_side_data(st, sd_src->type, sd_src->size); - if (!dst_data) - return AVERROR(ENOMEM); - memcpy(dst_data, sd_src->data, sd_src->size); - } - ffstream(st)->need_context_update = 1; return 0; diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c index 27d97f5f72..fcc875e236 100644 --- a/libavformat/hlsenc.c +++ b/libavformat/hlsenc.c @@ -1351,16 +1351,17 @@ static const char* get_relative_url(const char *master_url, const char *media_ur static int64_t get_stream_bit_rate(AVStream *stream) { - AVCPBProperties *props = (AVCPBProperties*)av_stream_get_side_data( - stream, - AV_PKT_DATA_CPB_PROPERTIES, - NULL + AVPacketSideData *sd = av_packet_side_data_set_get( + &stream->codecpar->side_data, + AV_PKT_DATA_CPB_PROPERTIES ); if (stream->codecpar->bit_rate) return stream->codecpar->bit_rate; - else if (props) + else if (sd) { + AVCPBProperties *props = (AVCPBProperties*)sd->data; return props->max_bitrate; + } return 0; } diff --git a/libavformat/internal.h b/libavformat/internal.h index 53e70ccb53..399ec16ded 100644 --- a/libavformat/internal.h +++ b/libavformat/internal.h @@ -147,7 +147,9 @@ typedef struct FFFormatContext { int missing_ts_warning; #endif +#if FF_API_AVSTREAM_SIDE_DATA int inject_global_side_data; +#endif int avoid_negative_ts_use_pts; @@ -354,10 +356,12 @@ typedef struct FFStream { uint8_t dts_ordered; uint8_t dts_misordered; +#if FF_API_AVSTREAM_SIDE_DATA /** * Internal data to inject global side data */ int inject_global_side_data; +#endif /** * display aspect ratio (0 if unknown) diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c index fda77b0b89..20eb75bb6d 100644 --- a/libavformat/matroskadec.c +++ b/libavformat/matroskadec.c @@ -2175,7 +2175,6 @@ static int mkv_stereo3d_conv(AVStream *st, MatroskaVideoStereoModeType stereo_mo STEREOMODE_STEREO3D_MAPPING(STEREO_MODE_CONV, NOTHING) }; AVStereo3D *stereo; - int ret; stereo = av_stereo3d_alloc(); if (!stereo) @@ -2184,11 +2183,10 @@ static int mkv_stereo3d_conv(AVStream *st, MatroskaVideoStereoModeType stereo_mo stereo->type = stereo_mode_conv[stereo_mode].type; stereo->flags = stereo_mode_conv[stereo_mode].flags; - ret = av_stream_add_side_data(st, AV_PKT_DATA_STEREO3D, (uint8_t *)stereo, - sizeof(*stereo)); - if (ret < 0) { + if (!av_packet_side_data_set_add(&st->codecpar->side_data, AV_PKT_DATA_STEREO3D, + (uint8_t *)stereo, sizeof(*stereo), 0)) { av_freep(&stereo); - return ret; + return AVERROR(ENOMEM); } return 0; @@ -2235,28 +2233,26 @@ static int mkv_parse_video_color(AVStream *st, const MatroskaTrack *track) { } if (color->max_cll && color->max_fall) { size_t size = 0; - int ret; AVContentLightMetadata *metadata = av_content_light_metadata_alloc(&size); if (!metadata) return AVERROR(ENOMEM); - ret = av_stream_add_side_data(st, AV_PKT_DATA_CONTENT_LIGHT_LEVEL, - (uint8_t *)metadata, size); - if (ret < 0) { + if (!av_packet_side_data_set_add(&st->codecpar->side_data, AV_PKT_DATA_CONTENT_LIGHT_LEVEL, + (uint8_t *)metadata, size, 0)) { av_freep(&metadata); - return ret; + return AVERROR(ENOMEM); } metadata->MaxCLL = color->max_cll; metadata->MaxFALL = color->max_fall; } if (has_mastering_primaries || has_mastering_luminance) { - AVMasteringDisplayMetadata *metadata = - (AVMasteringDisplayMetadata*) av_stream_new_side_data( - st, AV_PKT_DATA_MASTERING_DISPLAY_METADATA, - sizeof(AVMasteringDisplayMetadata)); - if (!metadata) { + AVMasteringDisplayMetadata *metadata; + AVPacketSideData *sd = av_packet_side_data_set_new(&st->codecpar->side_data, + AV_PKT_DATA_MASTERING_DISPLAY_METADATA, + sizeof(AVMasteringDisplayMetadata), 0); + if (!sd) return AVERROR(ENOMEM); - } + metadata = (AVMasteringDisplayMetadata*)sd->data; memset(metadata, 0, sizeof(AVMasteringDisplayMetadata)); if (has_mastering_primaries) { metadata->display_primaries[0][0] = av_d2q(mastering_meta->r_x, INT_MAX); @@ -2282,6 +2278,7 @@ static int mkv_create_display_matrix(AVStream *st, const MatroskaTrackVideoProjection *proj, void *logctx) { + AVPacketSideData *sd; double pitch = proj->pitch, yaw = proj->yaw, roll = proj->roll; int32_t *matrix; int hflip; @@ -2298,10 +2295,12 @@ static int mkv_create_display_matrix(AVStream *st, st->index, yaw, pitch, roll); return 0; } - matrix = (int32_t*)av_stream_new_side_data(st, AV_PKT_DATA_DISPLAYMATRIX, - 9 * sizeof(*matrix)); - if (!matrix) + sd = av_packet_side_data_set_new(&st->codecpar->side_data, + AV_PKT_DATA_DISPLAYMATRIX, + 9 * sizeof(*matrix), 0); + if (!sd) return AVERROR(ENOMEM); + matrix = (int32_t*)sd->data; hflip = yaw != 0.0; /* ProjectionPoseRoll is in the counter-clockwise direction @@ -2326,7 +2325,6 @@ static int mkv_parse_video_projection(AVStream *st, const MatroskaTrack *track, size_t spherical_size; uint32_t l = 0, t = 0, r = 0, b = 0; uint32_t padding = 0; - int ret; if (mkv_projection->private.size && priv_data[0] != 0) { av_log(logctx, AV_LOG_WARNING, "Unknown spherical metadata\n"); @@ -2402,11 +2400,10 @@ static int mkv_parse_video_projection(AVStream *st, const MatroskaTrack *track, spherical->bound_right = r; spherical->bound_bottom = b; - ret = av_stream_add_side_data(st, AV_PKT_DATA_SPHERICAL, (uint8_t *)spherical, - spherical_size); - if (ret < 0) { + if (!av_packet_side_data_set_add(&st->codecpar->side_data, AV_PKT_DATA_SPHERICAL, + (uint8_t *)spherical, spherical_size, 0)) { av_freep(&spherical); - return ret; + return AVERROR(ENOMEM); } return 0; diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index bf2ca7106b..b188b74e82 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -1327,7 +1327,7 @@ fail: static void mkv_write_video_color(EbmlWriter *writer, const AVStream *st, const AVCodecParameters *par) { - const void *side_data; + const AVPacketSideData *side_data; ebml_writer_open_master(writer, MATROSKA_ID_VIDEOCOLOR); @@ -1361,20 +1361,18 @@ static void mkv_write_video_color(EbmlWriter *writer, const AVStream *st, (ypos >> 7) + 1); } - side_data = av_stream_get_side_data(st, AV_PKT_DATA_CONTENT_LIGHT_LEVEL, - NULL); + side_data = av_packet_side_data_set_get(&st->codecpar->side_data, AV_PKT_DATA_CONTENT_LIGHT_LEVEL); if (side_data) { - const AVContentLightMetadata *metadata = side_data; + const AVContentLightMetadata *metadata = (AVContentLightMetadata *)side_data->data; ebml_writer_add_uint(writer, MATROSKA_ID_VIDEOCOLORMAXCLL, metadata->MaxCLL); ebml_writer_add_uint(writer, MATROSKA_ID_VIDEOCOLORMAXFALL, metadata->MaxFALL); } - side_data = av_stream_get_side_data(st, AV_PKT_DATA_MASTERING_DISPLAY_METADATA, - NULL); + side_data = av_packet_side_data_set_get(&st->codecpar->side_data, AV_PKT_DATA_MASTERING_DISPLAY_METADATA); if (side_data) { - const AVMasteringDisplayMetadata *metadata = side_data; + const AVMasteringDisplayMetadata *metadata = (AVMasteringDisplayMetadata *)side_data->data; ebml_writer_open_master(writer, MATROSKA_ID_VIDEOCOLORMASTERINGMETA); if (metadata->has_primaries) { ebml_writer_add_float(writer, MATROSKA_ID_VIDEOCOLOR_RX, @@ -1410,12 +1408,15 @@ static void mkv_write_video_color(EbmlWriter *writer, const AVStream *st, static void mkv_handle_rotation(void *logctx, const AVStream *st, double *yaw, double *roll) { - const int32_t *matrix = - (const int32_t*)av_stream_get_side_data(st, AV_PKT_DATA_DISPLAYMATRIX, NULL); + const int32_t *matrix; + const AVPacketSideData *side_data = + av_packet_side_data_set_get(&st->codecpar->side_data, AV_PKT_DATA_DISPLAYMATRIX); - if (!matrix) + if (!side_data) return; + matrix = (int32_t *)side_data->data; + /* Check whether this is an affine transformation */ if (matrix[2] || matrix[5]) goto ignore; @@ -1462,13 +1463,13 @@ static int mkv_handle_spherical(void *logctx, EbmlWriter *writer, const AVStream *st, uint8_t private[], double *yaw, double *pitch, double *roll) { - const AVSphericalMapping *spherical = - (const AVSphericalMapping *)av_stream_get_side_data(st, AV_PKT_DATA_SPHERICAL, - NULL); + AVPacketSideData *sd = av_packet_side_data_set_get(&st->codecpar->side_data, AV_PKT_DATA_SPHERICAL); + const AVSphericalMapping *spherical; - if (!spherical) + if (!sd) return 0; + spherical = (const AVSphericalMapping *)sd->data; if (spherical->projection != AV_SPHERICAL_EQUIRECTANGULAR && spherical->projection != AV_SPHERICAL_EQUIRECTANGULAR_TILE && spherical->projection != AV_SPHERICAL_CUBEMAP) { @@ -1628,6 +1629,7 @@ static int mkv_write_stereo_mode(AVFormatContext *s, EbmlWriter *writer, format = stereo_mode; } } else { + AVPacketSideData *sd; const AVStereo3D *stereo; /* The following macro presumes all MATROSKA_VIDEO_STEREOMODE_TYPE_* * values to be in the range 0..254. */ @@ -1639,11 +1641,12 @@ static int mkv_write_stereo_mode(AVFormatContext *s, EbmlWriter *writer, }; int fmt; - stereo = (const AVStereo3D*)av_stream_get_side_data(st, AV_PKT_DATA_STEREO3D, - NULL); - if (!stereo) + sd = av_packet_side_data_set_get(&st->codecpar->side_data, AV_PKT_DATA_STEREO3D); + if (!sd) return 0; + stereo = (const AVStereo3D*)sd->data; + /* A garbage AVStereo3D or something with no Matroska analogon. */ if ((unsigned)stereo->type >= FF_ARRAY_ELEMS(conversion_table)) return 0; @@ -1681,6 +1684,7 @@ static void mkv_write_blockadditionmapping(AVFormatContext *s, const MatroskaMux { #if CONFIG_MATROSKA_MUXER const AVDOVIDecoderConfigurationRecord *dovi; + const AVPacketSideData *sd; if (IS_SEEKABLE(s->pb, mkv)) { track->blockadditionmapping_offset = avio_tell(pb); @@ -1697,9 +1701,13 @@ static void mkv_write_blockadditionmapping(AVFormatContext *s, const MatroskaMux } } - dovi = (const AVDOVIDecoderConfigurationRecord *) - av_stream_get_side_data(st, AV_PKT_DATA_DOVI_CONF, NULL); - if (dovi && dovi->dv_profile <= 10) { + sd = av_packet_side_data_set_get(&st->codecpar->side_data, AV_PKT_DATA_DOVI_CONF); + + if (!sd) + return; + + dovi = (const AVDOVIDecoderConfigurationRecord *)sd->data; + if (dovi->dv_profile <= 10) { ebml_master mapping; uint8_t buf[ISOM_DVCC_DVVC_SIZE]; uint32_t type; diff --git a/libavformat/mov.c b/libavformat/mov.c index be9975f297..a08b6c77ee 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -799,6 +799,7 @@ static int mov_read_esds(MOVContext *c, AVIOContext *pb, MOVAtom atom) static int mov_read_dac3(MOVContext *c, AVIOContext *pb, MOVAtom atom) { AVStream *st; + AVPacketSideData *sd; enum AVAudioServiceType *ast; int ac3info, acmod, lfeon, bsmod; uint64_t mask; @@ -807,11 +808,13 @@ static int mov_read_dac3(MOVContext *c, AVIOContext *pb, MOVAtom atom) return 0; st = c->fc->streams[c->fc->nb_streams-1]; - ast = (enum AVAudioServiceType*)av_stream_new_side_data(st, AV_PKT_DATA_AUDIO_SERVICE_TYPE, - sizeof(*ast)); - if (!ast) + sd = av_packet_side_data_set_new(&st->codecpar->side_data, + AV_PKT_DATA_AUDIO_SERVICE_TYPE, + sizeof(*ast), 0); + if (!sd) return AVERROR(ENOMEM); + ast = (enum AVAudioServiceType*)sd->data; ac3info = avio_rb24(pb); bsmod = (ac3info >> 14) & 0x7; acmod = (ac3info >> 11) & 0x7; @@ -833,6 +836,7 @@ static int mov_read_dac3(MOVContext *c, AVIOContext *pb, MOVAtom atom) static int mov_read_dec3(MOVContext *c, AVIOContext *pb, MOVAtom atom) { AVStream *st; + AVPacketSideData *sd; enum AVAudioServiceType *ast; int eac3info, acmod, lfeon, bsmod; uint64_t mask; @@ -841,11 +845,14 @@ static int mov_read_dec3(MOVContext *c, AVIOContext *pb, MOVAtom atom) return 0; st = c->fc->streams[c->fc->nb_streams-1]; - ast = (enum AVAudioServiceType*)av_stream_new_side_data(st, AV_PKT_DATA_AUDIO_SERVICE_TYPE, - sizeof(*ast)); - if (!ast) + sd = av_packet_side_data_set_new(&st->codecpar->side_data, + AV_PKT_DATA_AUDIO_SERVICE_TYPE, + sizeof(*ast), 0); + if (!sd) return AVERROR(ENOMEM); + ast = (enum AVAudioServiceType*)sd->data; + /* No need to parse fields for additional independent substreams and its * associated dependent substreams since libavcodec's E-AC-3 decoder * does not support them yet. */ @@ -1747,7 +1754,6 @@ static int mov_read_pcmc(MOVContext *c, AVIOContext *pb, MOVAtom atom) static int mov_read_colr(MOVContext *c, AVIOContext *pb, MOVAtom atom) { AVStream *st; - uint8_t *icc_profile; char color_parameter_type[5] = { 0 }; uint16_t color_primaries, color_trc, color_matrix; int ret; @@ -1768,10 +1774,12 @@ static int mov_read_colr(MOVContext *c, AVIOContext *pb, MOVAtom atom) } if (!strncmp(color_parameter_type, "prof", 4)) { - icc_profile = av_stream_new_side_data(st, AV_PKT_DATA_ICC_PROFILE, atom.size - 4); - if (!icc_profile) + AVPacketSideData *sd = av_packet_side_data_set_new(&st->codecpar->side_data, + AV_PKT_DATA_ICC_PROFILE, + atom.size - 4, 0); + if (!sd) return AVERROR(ENOMEM); - ret = ffio_read_size(pb, icc_profile, atom.size - 4); + ret = ffio_read_size(pb, sd->data, atom.size - 4); if (ret < 0) return ret; } else { @@ -6838,8 +6846,9 @@ static int mov_read_pssh(MOVContext *c, AVIOContext *pb, MOVAtom atom) AVEncryptionInitInfo *info, *old_init_info; uint8_t **key_ids; AVStream *st; - uint8_t *side_data, *extra_data, *old_side_data; - size_t side_data_size, old_side_data_size; + AVPacketSideData *old_side_data; + uint8_t *side_data, *extra_data; + size_t side_data_size; int ret = 0; unsigned int version, kid_count, extra_data_size, alloc_size = 0; @@ -6917,9 +6926,9 @@ static int mov_read_pssh(MOVContext *c, AVIOContext *pb, MOVAtom atom) info->data_size = extra_data_size; // If there is existing initialization data, append to the list. - old_side_data = av_stream_get_side_data(st, AV_PKT_DATA_ENCRYPTION_INIT_INFO, &old_side_data_size); + old_side_data = av_packet_side_data_set_get(&st->codecpar->side_data, AV_PKT_DATA_ENCRYPTION_INIT_INFO); if (old_side_data) { - old_init_info = av_encryption_init_info_get_side_data(old_side_data, old_side_data_size); + old_init_info = av_encryption_init_info_get_side_data(old_side_data->data, old_side_data->size); if (old_init_info) { // Append to the end of the list. for (AVEncryptionInitInfo *cur = old_init_info;; cur = cur->next) { @@ -6941,9 +6950,8 @@ static int mov_read_pssh(MOVContext *c, AVIOContext *pb, MOVAtom atom) ret = AVERROR(ENOMEM); goto finish; } - ret = av_stream_add_side_data(st, AV_PKT_DATA_ENCRYPTION_INIT_INFO, - side_data, side_data_size); - if (ret < 0) + if (!av_packet_side_data_set_add(&st->codecpar->side_data, AV_PKT_DATA_ENCRYPTION_INIT_INFO, + side_data, side_data_size, 0)) av_free(side_data); finish: @@ -8720,46 +8728,37 @@ static int mov_read_header(AVFormatContext *s) break; case AVMEDIA_TYPE_VIDEO: if (sc->display_matrix) { - err = av_stream_add_side_data(st, AV_PKT_DATA_DISPLAYMATRIX, (uint8_t*)sc->display_matrix, - sizeof(int32_t) * 9); - if (err < 0) - return err; + if (!av_packet_side_data_set_add(&st->codecpar->side_data, AV_PKT_DATA_DISPLAYMATRIX, + (uint8_t*)sc->display_matrix, sizeof(int32_t) * 9, 0)) + return AVERROR(ENOMEM); sc->display_matrix = NULL; } if (sc->stereo3d) { - err = av_stream_add_side_data(st, AV_PKT_DATA_STEREO3D, - (uint8_t *)sc->stereo3d, - sizeof(*sc->stereo3d)); - if (err < 0) - return err; + if (!av_packet_side_data_set_add(&st->codecpar->side_data, AV_PKT_DATA_STEREO3D, + (uint8_t *)sc->stereo3d, sizeof(*sc->stereo3d), 0)) + return AVERROR(ENOMEM); sc->stereo3d = NULL; } if (sc->spherical) { - err = av_stream_add_side_data(st, AV_PKT_DATA_SPHERICAL, - (uint8_t *)sc->spherical, - sc->spherical_size); - if (err < 0) - return err; + if (!av_packet_side_data_set_add(&st->codecpar->side_data, AV_PKT_DATA_SPHERICAL, + (uint8_t *)sc->spherical, sc->spherical_size, 0)) + return AVERROR(ENOMEM); sc->spherical = NULL; } if (sc->mastering) { - err = av_stream_add_side_data(st, AV_PKT_DATA_MASTERING_DISPLAY_METADATA, - (uint8_t *)sc->mastering, - sizeof(*sc->mastering)); - if (err < 0) - return err; + if (!av_packet_side_data_set_add(&st->codecpar->side_data, AV_PKT_DATA_MASTERING_DISPLAY_METADATA, + (uint8_t *)sc->mastering, sizeof(*sc->mastering), 0)) + return AVERROR(ENOMEM); sc->mastering = NULL; } if (sc->coll) { - err = av_stream_add_side_data(st, AV_PKT_DATA_CONTENT_LIGHT_LEVEL, - (uint8_t *)sc->coll, - sc->coll_size); - if (err < 0) - return err; + if (!av_packet_side_data_set_add(&st->codecpar->side_data, AV_PKT_DATA_CONTENT_LIGHT_LEVEL, + (uint8_t *)sc->coll, sc->coll_size, 0)) + return AVERROR(ENOMEM); sc->coll = NULL; } diff --git a/libavformat/movenc.c b/libavformat/movenc.c index 696ae5a6c9..66efed0363 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -672,11 +672,11 @@ struct mpeg4_bit_rate_values { static struct mpeg4_bit_rate_values calculate_mpeg4_bit_rates(MOVTrack *track) { - AVCPBProperties *props = track->st ? - (AVCPBProperties*)av_stream_get_side_data(track->st, - AV_PKT_DATA_CPB_PROPERTIES, - NULL) : + AVPacketSideData *sd = track->st ? + av_packet_side_data_set_get(&track->st->codecpar->side_data, + AV_PKT_DATA_CPB_PROPERTIES) : NULL; + AVCPBProperties *props = sd ? (AVCPBProperties *)sd->data : NULL; struct mpeg4_bit_rate_values bit_rates = { 0 }; bit_rates.avg_bit_rate = compute_avg_bitrate(track); @@ -2129,18 +2129,16 @@ static int mov_write_colr_tag(AVIOContext *pb, MOVTrack *track, int prefer_icc) // Ref (MOV): https://developer.apple.com/library/mac/technotes/tn2162/_index.html#//apple_ref/doc/uid/DTS40013070-CH1-TNTAG9 // Ref (MP4): ISO/IEC 14496-12:2012 - const uint8_t *icc_profile; - size_t icc_profile_size; - if (prefer_icc) { - icc_profile = av_stream_get_side_data(track->st, AV_PKT_DATA_ICC_PROFILE, &icc_profile_size); + AVPacketSideData *sd = av_packet_side_data_set_get(&track->st->codecpar->side_data, + AV_PKT_DATA_ICC_PROFILE); - if (icc_profile) { - avio_wb32(pb, 12 + icc_profile_size); + if (sd) { + avio_wb32(pb, 12 + sd->size); ffio_wfourcc(pb, "colr"); ffio_wfourcc(pb, "prof"); - avio_write(pb, icc_profile, icc_profile_size); - return 12 + icc_profile_size; + avio_write(pb, sd->data, sd->size); + return 12 + sd->size; } else { av_log(NULL, AV_LOG_INFO, "no ICC profile found, will write nclx/nclc colour info instead\n"); @@ -2173,14 +2171,14 @@ static int mov_write_colr_tag(AVIOContext *pb, MOVTrack *track, int prefer_icc) static int mov_write_clli_tag(AVIOContext *pb, MOVTrack *track) { - const uint8_t *side_data; + const AVPacketSideData *side_data; const AVContentLightMetadata *content_light_metadata; - side_data = av_stream_get_side_data(track->st, AV_PKT_DATA_CONTENT_LIGHT_LEVEL, NULL); + side_data = av_packet_side_data_set_get(&track->st->codecpar->side_data, AV_PKT_DATA_CONTENT_LIGHT_LEVEL); if (!side_data) { return 0; } - content_light_metadata = (const AVContentLightMetadata*)side_data; + content_light_metadata = (const AVContentLightMetadata*)side_data->data; avio_wb32(pb, 12); // size ffio_wfourcc(pb, "clli"); @@ -2198,11 +2196,12 @@ static int mov_write_mdcv_tag(AVIOContext *pb, MOVTrack *track) { const int chroma_den = 50000; const int luma_den = 10000; - const uint8_t *side_data; - const AVMasteringDisplayMetadata *metadata; + const AVPacketSideData *side_data; + const AVMasteringDisplayMetadata *metadata = NULL; - side_data = av_stream_get_side_data(track->st, AV_PKT_DATA_MASTERING_DISPLAY_METADATA, NULL); - metadata = (const AVMasteringDisplayMetadata*)side_data; + side_data = av_packet_side_data_set_get(&track->st->codecpar->side_data, AV_PKT_DATA_MASTERING_DISPLAY_METADATA); + if (side_data) + metadata = (const AVMasteringDisplayMetadata*)side_data->data; if (!metadata || !metadata->has_primaries || !metadata->has_luminance) { return 0; } @@ -2421,7 +2420,7 @@ static int mov_write_video_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContex track->par->color_trc != AVCOL_TRC_UNSPECIFIED && track->par->color_space != AVCOL_SPC_UNSPECIFIED; if (has_color_info || mov->flags & FF_MOV_FLAG_WRITE_COLR || - av_stream_get_side_data(track->st, AV_PKT_DATA_ICC_PROFILE, NULL)) { + av_packet_side_data_set_get(&track->st->codecpar->side_data, AV_PKT_DATA_ICC_PROFILE)) { int prefer_icc = mov->flags & FF_MOV_FLAG_PREFER_ICC || !has_color_info; mov_write_colr_tag(pb, track, prefer_icc); } @@ -2435,17 +2434,16 @@ static int mov_write_video_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContex } if (track->mode == MODE_MP4 && mov->fc->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL) { - AVStereo3D* stereo_3d = (AVStereo3D*) av_stream_get_side_data(track->st, AV_PKT_DATA_STEREO3D, NULL); - AVSphericalMapping* spherical_mapping = (AVSphericalMapping*)av_stream_get_side_data(track->st, AV_PKT_DATA_SPHERICAL, NULL); - AVDOVIDecoderConfigurationRecord *dovi = (AVDOVIDecoderConfigurationRecord *) - av_stream_get_side_data(track->st, AV_PKT_DATA_DOVI_CONF, NULL); + AVPacketSideData *stereo_3d = av_packet_side_data_set_get(&track->st->codecpar->side_data, AV_PKT_DATA_STEREO3D); + AVPacketSideData *spherical_mapping = av_packet_side_data_set_get(&track->st->codecpar->side_data, AV_PKT_DATA_SPHERICAL); + AVPacketSideData *dovi = av_packet_side_data_set_get(&track->st->codecpar->side_data, AV_PKT_DATA_DOVI_CONF); if (stereo_3d) - mov_write_st3d_tag(s, pb, stereo_3d); + mov_write_st3d_tag(s, pb, (AVStereo3D*)stereo_3d->data); if (spherical_mapping) - mov_write_sv3d_tag(mov->fc, pb, spherical_mapping); + mov_write_sv3d_tag(mov->fc, pb, (AVSphericalMapping*)spherical_mapping->data); if (dovi) - mov_write_dvcc_dvvc_tag(s, pb, dovi); + mov_write_dvcc_dvvc_tag(s, pb, (AVDOVIDecoderConfigurationRecord *)dovi->data); } if (track->par->sample_aspect_ratio.den && track->par->sample_aspect_ratio.num) { @@ -3392,7 +3390,6 @@ static int mov_write_tkhd_tag(AVIOContext *pb, MOVMuxContext *mov, int group = 0; uint32_t *display_matrix = NULL; - size_t display_matrix_size; int i; if (mov->mode == MODE_AVIF) @@ -3402,15 +3399,15 @@ static int mov_write_tkhd_tag(AVIOContext *pb, MOVMuxContext *mov, duration *= mov->avif_loop_count; if (st) { + AVPacketSideData *sd; if (mov->per_stream_grouping) group = st->index; else group = st->codecpar->codec_type; - display_matrix = (uint32_t*)av_stream_get_side_data(st, AV_PKT_DATA_DISPLAYMATRIX, - &display_matrix_size); - if (display_matrix && display_matrix_size < 9 * sizeof(*display_matrix)) - display_matrix = NULL; + sd = av_packet_side_data_set_get(&st->codecpar->side_data, AV_PKT_DATA_DISPLAYMATRIX); + if (sd && sd->size == 9 * sizeof(*display_matrix)) + display_matrix = (uint32_t *)sd->data; } if (track->flags & MOV_TRACK_ENABLED) @@ -4608,12 +4605,10 @@ static int mov_write_moov_tag(AVIOContext *pb, MOVMuxContext *mov, track->tref_tag = MKTAG('h','i','n','t'); track->tref_id = mov->tracks[track->src_track].track_id; } else if (track->par->codec_type == AVMEDIA_TYPE_AUDIO) { - size_t size; - int *fallback; - fallback = (int*)av_stream_get_side_data(track->st, - AV_PKT_DATA_FALLBACK_TRACK, - &size); - if (fallback != NULL && size == sizeof(int)) { + AVPacketSideData *sd = av_packet_side_data_set_get(&track->st->codecpar->side_data, + AV_PKT_DATA_FALLBACK_TRACK ); + if (sd && sd->size == sizeof(int)) { + int *fallback = (int *)sd->data; if (*fallback >= 0 && *fallback < mov->nb_streams) { track->tref_tag = MKTAG('f','a','l','l'); track->tref_id = mov->tracks[*fallback].track_id; @@ -5446,7 +5441,7 @@ static int mov_write_ftyp_tag(AVIOContext *pb, AVFormatContext *s) if (st->codecpar->codec_id == AV_CODEC_ID_AC3 || st->codecpar->codec_id == AV_CODEC_ID_EAC3 || st->codecpar->codec_id == AV_CODEC_ID_TRUEHD || - av_stream_get_side_data(st, AV_PKT_DATA_DOVI_CONF, NULL)) + av_packet_side_data_set_get(&st->codecpar->side_data, AV_PKT_DATA_DOVI_CONF)) has_dolby = 1; } diff --git a/libavformat/mp3enc.c b/libavformat/mp3enc.c index 5e81f72a59..9fc1c4fea4 100644 --- a/libavformat/mp3enc.c +++ b/libavformat/mp3enc.c @@ -400,10 +400,10 @@ static int mp3_queue_flush(AVFormatContext *s) static void mp3_update_xing(AVFormatContext *s) { MP3Context *mp3 = s->priv_data; + AVPacketSideData *sd; AVReplayGain *rg; uint16_t tag_crc; uint8_t *toc; - size_t rg_size; int i; int64_t old_pos = avio_tell(s->pb); @@ -423,11 +423,11 @@ static void mp3_update_xing(AVFormatContext *s) } /* write replaygain */ - rg = (AVReplayGain*)av_stream_get_side_data(s->streams[0], AV_PKT_DATA_REPLAYGAIN, - &rg_size); - if (rg && rg_size >= sizeof(*rg)) { + sd = av_packet_side_data_set_get(&s->streams[0]->codecpar->side_data, AV_PKT_DATA_REPLAYGAIN); + if (sd && sd->size >= sizeof(*rg)) { uint16_t val; + rg = (AVReplayGain *)sd->data; AV_WB32(mp3->xing_frame + mp3->xing_offset + 131, av_rescale(rg->track_peak, 1 << 23, 100000)); diff --git a/libavformat/mpegenc.c b/libavformat/mpegenc.c index c06e308296..3f3b94112d 100644 --- a/libavformat/mpegenc.c +++ b/libavformat/mpegenc.c @@ -342,8 +342,6 @@ static av_cold int mpeg_mux_init(AVFormatContext *ctx) lpcm_id = LPCM_ID; for (i = 0; i < ctx->nb_streams; i++) { - AVCPBProperties *props; - st = ctx->streams[i]; stream = av_mallocz(sizeof(StreamInfo)); if (!stream) @@ -430,13 +428,17 @@ static av_cold int mpeg_mux_init(AVFormatContext *ctx) stream->max_buffer_size = 4 * 1024; s->audio_bound++; break; - case AVMEDIA_TYPE_VIDEO: + case AVMEDIA_TYPE_VIDEO: { + AVPacketSideData *sd; + AVCPBProperties *props = NULL; if (st->codecpar->codec_id == AV_CODEC_ID_H264) stream->id = h264_id++; else stream->id = mpv_id++; - props = (AVCPBProperties*)av_stream_get_side_data(st, AV_PKT_DATA_CPB_PROPERTIES, NULL); + sd = av_packet_side_data_set_get(&st->codecpar->side_data, AV_PKT_DATA_CPB_PROPERTIES); + if (sd) + props = (AVCPBProperties*)sd->data; if (props && props->buffer_size) stream->max_buffer_size = 6 * 1024 + props->buffer_size / 8; else { @@ -453,6 +455,7 @@ static av_cold int mpeg_mux_init(AVFormatContext *ctx) } s->video_bound++; break; + } case AVMEDIA_TYPE_SUBTITLE: stream->id = mps_id++; stream->max_buffer_size = 16 * 1024; @@ -470,12 +473,15 @@ static av_cold int mpeg_mux_init(AVFormatContext *ctx) audio_bitrate = 0; video_bitrate = 0; for (i = 0; i < ctx->nb_streams; i++) { - AVCPBProperties *props; + AVPacketSideData *sd; + AVCPBProperties *props = NULL; int codec_rate; st = ctx->streams[i]; stream = (StreamInfo *)st->priv_data; - props = (AVCPBProperties*)av_stream_get_side_data(st, AV_PKT_DATA_CPB_PROPERTIES, NULL); + sd = av_packet_side_data_set_get(&st->codecpar->side_data, AV_PKT_DATA_CPB_PROPERTIES); + if (sd) + props = (AVCPBProperties*)sd->data; if (props) codec_rate = props->max_bitrate; else diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c index 0b3edda817..3ba723d060 100644 --- a/libavformat/mpegts.c +++ b/libavformat/mpegts.c @@ -2190,7 +2190,6 @@ int ff_parse_mpeg2_descriptor(AVFormatContext *fc, AVStream *st, int stream_type uint32_t buf; AVDOVIDecoderConfigurationRecord *dovi; size_t dovi_size; - int ret; int dependency_pid; if (desc_end - *pp < 4) // (8 + 8 + 7 + 6 + 1 + 1 + 1) / 8 @@ -2221,11 +2220,10 @@ int ff_parse_mpeg2_descriptor(AVFormatContext *fc, AVStream *st, int stream_type dovi->dv_bl_signal_compatibility_id = 0; } - ret = av_stream_add_side_data(st, AV_PKT_DATA_DOVI_CONF, - (uint8_t *)dovi, dovi_size); - if (ret < 0) { + if (!av_packet_side_data_set_add(&st->codecpar->side_data, AV_PKT_DATA_DOVI_CONF, + (uint8_t *)dovi, dovi_size, 0)) { av_free(dovi); - return ret; + return AVERROR(ENOMEM); } av_log(fc, AV_LOG_TRACE, "DOVI, version: %d.%d, profile: %d, level: %d, " diff --git a/libavformat/mux.c b/libavformat/mux.c index 415bd3948f..ae07c8839e 100644 --- a/libavformat/mux.c +++ b/libavformat/mux.c @@ -277,6 +277,25 @@ FF_ENABLE_DEPRECATION_WARNINGS break; } +#if FF_API_AVSTREAM_SIDE_DATA +FF_DISABLE_DEPRECATION_WARNINGS + /* if the caller is using the deprecated AVStream side_data API, + * copy its contents to AVStream.codecpar, giving it priority + over existing side data in the latter */ + for (int i = 0; i < st->nb_side_data; i++) { + const AVPacketSideData *sd_src = &st->side_data[i]; + AVPacketSideData *sd_dst; + + sd_dst = av_packet_side_data_set_new(&st->codecpar->side_data, sd_src->type, sd_src->size, 0); + if (!sd_dst) { + ret = AVERROR(ENOMEM); + goto fail; + } + memcpy(sd_dst->data, sd_src->data, sd_src->size); + } +FF_ENABLE_DEPRECATION_WARNINGS +#endif + desc = avcodec_descriptor_get(par->codec_id); if (desc && desc->props & AV_CODEC_PROP_REORDER) sti->reorder = 1; diff --git a/libavformat/mxfdec.c b/libavformat/mxfdec.c index 34230ece98..2438b7c7bf 100644 --- a/libavformat/mxfdec.c +++ b/libavformat/mxfdec.c @@ -2577,10 +2577,12 @@ static int parse_mca_labels(MXFContext *mxf, MXFTrack *source_track, MXFDescript if (service_type != AV_AUDIO_SERVICE_TYPE_NB && service_type != AV_AUDIO_SERVICE_TYPE_MAIN && !ambigous_service_type) { enum AVAudioServiceType *ast; - uint8_t* side_data = av_stream_new_side_data(st, AV_PKT_DATA_AUDIO_SERVICE_TYPE, sizeof(*ast)); + AVPacketSideData *side_data = av_packet_side_data_set_new(&st->codecpar->side_data, + AV_PKT_DATA_AUDIO_SERVICE_TYPE, + sizeof(*ast), 0); if (!side_data) return AVERROR(ENOMEM); - ast = (enum AVAudioServiceType*)side_data; + ast = (enum AVAudioServiceType*)side_data->data; *ast = service_type; } @@ -2980,19 +2982,19 @@ static int mxf_parse_structural_metadata(MXFContext *mxf) st->codecpar->color_trc = mxf_get_codec_ul(ff_mxf_color_trc_uls, &descriptor->color_trc_ul)->id; st->codecpar->color_space = mxf_get_codec_ul(ff_mxf_color_space_uls, &descriptor->color_space_ul)->id; if (descriptor->mastering) { - ret = av_stream_add_side_data(st, AV_PKT_DATA_MASTERING_DISPLAY_METADATA, - (uint8_t *)descriptor->mastering, - sizeof(*descriptor->mastering)); - if (ret < 0) + if (!av_packet_side_data_set_add(&st->codecpar->side_data, AV_PKT_DATA_MASTERING_DISPLAY_METADATA, + (uint8_t *)descriptor->mastering, sizeof(*descriptor->mastering), 0)) { + ret = AVERROR(ENOMEM); goto fail_and_free; + } descriptor->mastering = NULL; } if (descriptor->coll) { - ret = av_stream_add_side_data(st, AV_PKT_DATA_CONTENT_LIGHT_LEVEL, - (uint8_t *)descriptor->coll, - descriptor->coll_size); - if (ret < 0) + if (!av_packet_side_data_set_add(&st->codecpar->side_data, AV_PKT_DATA_CONTENT_LIGHT_LEVEL, + (uint8_t *)descriptor->coll, descriptor->coll_size, 0)) { + ret = AVERROR(ENOMEM); goto fail_and_free; + } descriptor->coll = NULL; } } else if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) { diff --git a/libavformat/mxfenc.c b/libavformat/mxfenc.c index d8252ed68f..33922400e6 100644 --- a/libavformat/mxfenc.c +++ b/libavformat/mxfenc.c @@ -556,7 +556,7 @@ static void mxf_write_primer_pack(AVFormatContext *s) if (s->streams[i]->codecpar->codec_id == AV_CODEC_ID_H264 && !sc->avc_intra) { will_have_avc_tags = 1; } - if (av_stream_get_side_data(s->streams[i], AV_PKT_DATA_MASTERING_DISPLAY_METADATA, NULL)) { + if (av_packet_side_data_set_get(&s->streams[i]->codecpar->side_data, AV_PKT_DATA_MASTERING_DISPLAY_METADATA)) { will_have_mastering_tags = 1; } if (s->streams[i]->codecpar->codec_id == AV_CODEC_ID_FFV1) { @@ -1158,7 +1158,7 @@ static int64_t mxf_write_cdci_common(AVFormatContext *s, AVStream *st, const UID const MXFCodecUL *color_trc_ul; const MXFCodecUL *color_space_ul; int64_t pos = mxf_write_generic_desc(s, st, key); - uint8_t *side_data; + AVPacketSideData *side_data; color_primaries_ul = mxf_get_codec_ul_by_id(ff_mxf_color_primaries_uls, st->codecpar->color_primaries); color_trc_ul = mxf_get_codec_ul_by_id(ff_mxf_color_trc_uls, st->codecpar->color_trc); @@ -1344,9 +1344,9 @@ static int64_t mxf_write_cdci_common(AVFormatContext *s, AVStream *st, const UID avio_write(pb, *sc->codec_ul, 16); // Mastering Display metadata - side_data = av_stream_get_side_data(st, AV_PKT_DATA_MASTERING_DISPLAY_METADATA, NULL); + side_data = av_packet_side_data_set_get(&st->codecpar->side_data, AV_PKT_DATA_MASTERING_DISPLAY_METADATA); if (side_data) { - const AVMasteringDisplayMetadata *metadata = (const AVMasteringDisplayMetadata*)side_data; + const AVMasteringDisplayMetadata *metadata = (const AVMasteringDisplayMetadata*)side_data->data; if (metadata->has_primaries) { mxf_write_local_tag(s, 12, 0x8301); avio_wb16(pb, rescale_mastering_chroma(metadata->display_primaries[0][0])); diff --git a/libavformat/options.c b/libavformat/options.c index e4a3aceed0..ef0b593d36 100644 --- a/libavformat/options.c +++ b/libavformat/options.c @@ -309,7 +309,9 @@ AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c) st->sample_aspect_ratio = (AVRational) { 0, 1 }; +#if FF_API_AVSTREAM_SIDE_DATA sti->inject_global_side_data = si->inject_global_side_data; +#endif sti->need_context_update = 1; diff --git a/libavformat/replaygain.c b/libavformat/replaygain.c index 915bcb2382..ab3e39318b 100644 --- a/libavformat/replaygain.c +++ b/libavformat/replaygain.c @@ -69,16 +69,19 @@ static int32_t parse_value(const char *value, int32_t min) int ff_replaygain_export_raw(AVStream *st, int32_t tg, uint32_t tp, int32_t ag, uint32_t ap) { + AVPacketSideData *sd; AVReplayGain *replaygain; if (tg == INT32_MIN && ag == INT32_MIN) return 0; - replaygain = (AVReplayGain*)av_stream_new_side_data(st, AV_PKT_DATA_REPLAYGAIN, - sizeof(*replaygain)); - if (!replaygain) + sd = av_packet_side_data_set_new(&st->codecpar->side_data, + AV_PKT_DATA_REPLAYGAIN, + sizeof(*replaygain), 0); + if (!sd) return AVERROR(ENOMEM); + replaygain = (AVReplayGain*)sd->data; replaygain->track_gain = tg; replaygain->track_peak = tp; replaygain->album_gain = ag; diff --git a/libavformat/seek.c b/libavformat/seek.c index 386312cd3a..0180188595 100644 --- a/libavformat/seek.c +++ b/libavformat/seek.c @@ -745,8 +745,10 @@ void ff_read_frame_flush(AVFormatContext *s) for (int j = 0; j < MAX_REORDER_DELAY + 1; j++) sti->pts_buffer[j] = AV_NOPTS_VALUE; +#if FF_API_AVSTREAM_SIDE_DATA if (si->inject_global_side_data) sti->inject_global_side_data = 1; +#endif sti->skip_samples = 0; } diff --git a/libavformat/version_major.h b/libavformat/version_major.h index 293fbd3397..c348e3eb37 100644 --- a/libavformat/version_major.h +++ b/libavformat/version_major.h @@ -45,6 +45,7 @@ #define FF_API_GET_END_PTS (LIBAVFORMAT_VERSION_MAJOR < 61) #define FF_API_AVIODIRCONTEXT (LIBAVFORMAT_VERSION_MAJOR < 61) #define FF_API_AVFORMAT_IO_CLOSE (LIBAVFORMAT_VERSION_MAJOR < 61) +#define FF_API_AVSTREAM_SIDE_DATA (LIBAVFORMAT_VERSION_MAJOR < 61) #define FF_API_R_FRAME_RATE 1 From patchwork Mon Sep 4 22:10:25 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 43552 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:4f16:b0:149:dfde:5c0a with SMTP id gi22csp1475111pzb; Mon, 4 Sep 2023 15:10:50 -0700 (PDT) X-Google-Smtp-Source: AGHT+IEvQzTfXMduPOo0osu+hm5osk0OvpBkS4kuzZUYspb91vcrKDgEggsqgyxtX6MWBwmBE8Sx X-Received: by 2002:a17:907:3e1f:b0:9a5:9b93:d60d with SMTP id hp31-20020a1709073e1f00b009a59b93d60dmr14223968ejc.36.1693865450732; Mon, 04 Sep 2023 15:10:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1693865450; cv=none; d=google.com; s=arc-20160816; b=wCFIO9SvA1jTQdr6hDcvEKRqelnhJhZxBlggYMnUAOoyUuWIHXi7+s2ea4XnZc9Xbv MJWekbgdVbkH5a68UQ+/qYLzOOWIfcehUkT1oIQgwzVfs8ILvukXHJzLF34u5DQFFDIX LgQ/veFYxDCoJb2mOwkvDj45FXx5Y7+FTrdcbConBbtiQDeeeEossFhDA8f7vGae5DxR YwG9K9ilNQbdwCDbbGh2ZbmXGKoT+n1uSmWQUTIoVMJVcynm2cR/sbCex19wySc+qhhj 5G6HNWiiWWhTBqujYiZQTiNdQCguoFAO9aXnCt0LUQi7SoizWosP1LdZo4KvkVJSB0R1 7RAg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=RV7qFn8ghRIX//br/dC7vHxaD2IZimezjj2LlhBYJEU=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=Oj2NIlb1FgJmJviuI9dhx9/GMNcNwwL/+gPlKM/HwSzO9o3t74v8gJ1+z/rLVd0eob 9BxMx4dJEtQzS6XklTENkNr5hO+KIoAX/bUBfMHO/DzxdECLF9l7+zkDovxOaZvbT2Dk LZYTIB4aJ/8oguY/uVvpaf4aqw71yz+3PZqW6qS/TVyw435gkJ+33cU/BQeltYroaAnP iSwGVRbYYQWTJVJ3JxpPY3oKGEkRPzB6YmZmD6aMvAHGDHHUecwDzz+m4XWGuyue2Lq+ nnNwZ/9yGIOunQIXUMKEQafLw+oGIEB0jV5QQSnjw14ZK1lUuDfrza1bBDcneATeD1f9 1IBg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20221208 header.b=hdt+CydY; 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; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id k23-20020a170906a39700b0099d74066201si6540773ejz.415.2023.09.04.15.10.50; Mon, 04 Sep 2023 15:10:50 -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; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20221208 header.b=hdt+CydY; 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; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id B03AF68C7BC; Tue, 5 Sep 2023 01:10:48 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-oi1-f177.google.com (mail-oi1-f177.google.com [209.85.167.177]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 2802568BD32 for ; Tue, 5 Sep 2023 01:10:42 +0300 (EEST) Received: by mail-oi1-f177.google.com with SMTP id 5614622812f47-3ab244f2c89so1374836b6e.3 for ; Mon, 04 Sep 2023 15:10:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1693865440; x=1694470240; darn=ffmpeg.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=IGFeD91iHvAd1DqzZE+R5ZRohlQuRCneF4sfbnT28kU=; b=hdt+CydY81Hs888oMlOzXtpDEXgdK9W4AdtKLLF3heC4fbMvsMgf1RMV2swcjG+gb3 G9oHOltzHAkW5ylYc61dzWyG7iWiIF5vCtTWTrzKGfxIKtsKoPGfxBYymQsDvfkjvzI8 qLcGAFlyqhCxc0Upeq4Zar05+nkk6y9XWdRv0zJpzxbTeKxNGLWdx/LvlwqRPqXjB/0u UUmQKxnVpIFBvqgdEkGZqj+f7V+qh8LEg1xpk7AxuMNsE9lJMcmQwUkidUr9JAbbfQzO z2RmtpRR2w/R6kY5LgFHEGZJbXgon/NuTT6BVnvk5HUcZgK1axDgqffbFqRQ8eH3HdNi H+Ug== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1693865440; x=1694470240; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=IGFeD91iHvAd1DqzZE+R5ZRohlQuRCneF4sfbnT28kU=; b=MKEEbspauQOkB6YHKIQyzdRWBMxkb/n59FuopNRwaidDAofc510KLlIFbfUQ0Jl6MG wJvjnKGx+nc7MZpfWS1zqy6fPCL3q2BxY5f6J2J/P7ppguZsZtzqR3RgFc4O0KJ0LWcJ FIF/K20hPMhPH08SEXYPU2QrFY7qYejuWU2CU2MlXPr8SEBiPeOsZQ0wh+XvmJ4QAv/s Hnsy6lufK7PQFS5mPynJ2H7wvnkEL5k+oLlDOlT9fqNVsJxL8q2fi80lXVzYiPhNScxU z8BquVJn7vItEYV5BBbPm22mVddOAf+0EBcARwIZzs2VVntszc+Wi/LFQh5CKTJ9L5wE L+jg== X-Gm-Message-State: AOJu0Yyr8lSYw/WTbmemwEfvwOtdznlR39nBfoRp7L19YYF1v+BLdivp 78855jwqASH6s/sYbxjqHzzrOk15GDI= X-Received: by 2002:a05:6808:1406:b0:3a8:f3e7:d691 with SMTP id w6-20020a056808140600b003a8f3e7d691mr17122341oiv.37.1693865440238; Mon, 04 Sep 2023 15:10:40 -0700 (PDT) Received: from localhost.localdomain (host197.190-225-105.telecom.net.ar. [190.225.105.197]) by smtp.gmail.com with ESMTPSA id h19-20020a056808015300b003a1ec14d8c6sm5314057oie.23.2023.09.04.15.10.39 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 04 Sep 2023 15:10:39 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Mon, 4 Sep 2023 19:10:25 -0300 Message-ID: <20230904221025.21922-1-jamrial@gmail.com> X-Mailer: git-send-email 2.42.0 In-Reply-To: References: MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 11/17] Revert "avcodec/mpeg12dec: Do not alter avctx->rc_buffer_size" 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 4P8Ps8XS7Wyj This reverts commit eb88ccb92e05018b1060cf8126b30eeeff551d3b. AVCodecContext fields are the proper place for a decoder to export such values. This change is in preparation for the following commits. Signed-off-by: James Almer --- libavcodec/mpeg12dec.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/libavcodec/mpeg12dec.c b/libavcodec/mpeg12dec.c index 36461a9ae6..2290a90778 100644 --- a/libavcodec/mpeg12dec.c +++ b/libavcodec/mpeg12dec.c @@ -76,7 +76,6 @@ typedef struct Mpeg1Context { unsigned aspect_ratio_info; AVRational save_aspect; int save_width, save_height, save_progressive_seq; - int rc_buffer_size; AVRational frame_rate_ext; /* MPEG-2 specific framerate modificator */ unsigned frame_rate_index; int sync; /* Did we reach a sync point like a GOP/SEQ/KEYFrame? */ @@ -1392,7 +1391,7 @@ static void mpeg_decode_sequence_extension(Mpeg1Context *s1) bit_rate_ext = get_bits(&s->gb, 12); /* XXX: handle it */ s->bit_rate += (bit_rate_ext << 18) * 400LL; check_marker(s->avctx, &s->gb, "after bit rate extension"); - s1->rc_buffer_size += get_bits(&s->gb, 8) * 1024 * 16 << 10; + s->avctx->rc_buffer_size += get_bits(&s->gb, 8) * 1024 * 16 << 10; s->low_delay = get_bits1(&s->gb); if (s->avctx->flags & AV_CODEC_FLAG_LOW_DELAY) @@ -1405,7 +1404,7 @@ static void mpeg_decode_sequence_extension(Mpeg1Context *s1) s->codec_id = s->avctx->codec_id = AV_CODEC_ID_MPEG2VIDEO; if (cpb_props = ff_add_cpb_side_data(s->avctx)) { - cpb_props->buffer_size = s1->rc_buffer_size; + cpb_props->buffer_size = s->avctx->rc_buffer_size; if (s->bit_rate != 0x3FFFF*400) cpb_props->max_bitrate = s->bit_rate; } @@ -1414,7 +1413,7 @@ static void mpeg_decode_sequence_extension(Mpeg1Context *s1) av_log(s->avctx, AV_LOG_DEBUG, "profile: %d, level: %d ps: %d cf:%d vbv buffer: %d, bitrate:%"PRId64"\n", s->avctx->profile, s->avctx->level, s->progressive_sequence, s->chroma_format, - s1->rc_buffer_size, s->bit_rate); + s->avctx->rc_buffer_size, s->bit_rate); } static void mpeg_decode_sequence_display_extension(Mpeg1Context *s1) @@ -2104,7 +2103,7 @@ static int mpeg1_decode_sequence(AVCodecContext *avctx, return AVERROR_INVALIDDATA; } - s1->rc_buffer_size = get_bits(&s->gb, 10) * 1024 * 16; + s->avctx->rc_buffer_size = get_bits(&s->gb, 10) * 1024 * 16; skip_bits(&s->gb, 1); /* get matrix */ @@ -2152,7 +2151,7 @@ static int mpeg1_decode_sequence(AVCodecContext *avctx, if (s->avctx->debug & FF_DEBUG_PICT_INFO) av_log(s->avctx, AV_LOG_DEBUG, "vbv buffer: %d, bitrate:%"PRId64", aspect_ratio_info: %d \n", - s1->rc_buffer_size, s->bit_rate, s1->aspect_ratio_info); + s->avctx->rc_buffer_size, s->bit_rate, s1->aspect_ratio_info); return 0; } From patchwork Mon Sep 4 22:11:16 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 43549 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:4f16:b0:149:dfde:5c0a with SMTP id gi22csp1475462pzb; Mon, 4 Sep 2023 15:11:35 -0700 (PDT) X-Google-Smtp-Source: AGHT+IH+I3AghRlC8H55i+EzuAJoaEulZFkMS4ZBORfPY3+3HxfZbt+cKa6VBVL5vGCuFkRQCvLJ X-Received: by 2002:a17:906:5a4e:b0:9a5:c8ad:20c1 with SMTP id my14-20020a1709065a4e00b009a5c8ad20c1mr8442900ejc.9.1693865495136; Mon, 04 Sep 2023 15:11:35 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1693865495; cv=none; d=google.com; s=arc-20160816; b=TRfzYIe37BAQUv39/HpFIeb+B3PvmoVaxg75WLhZgD8Up8d3qTigUDB1Olahw7S6Tt jgEe7tyPyxja65AD8RE8pMnp1tnIWpYkpFV4AZsxQI6Oio2Piv4LiX383mjryBzRBaI6 XJCv9yplF9TVSiXRlaAPt2SObOiOak8nAZ5q6NiVHpMwWvzR7cN4CjaWWufU2SzqX5wl iMwdnN4zjm7XbwktY950brtN9jSakt28CtsGctYmAC2ZIJUtqNDX0f2Y7URHDDhDHe1k FV++5EM5lgjkSLv11lNBeApQ6sxLbuXzgiC8ImpWVEMOl4lLR4DwhabiH6ydZTxTNoI7 6T6g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=G32Jl7nkrQiww+xizA1mfOArwyDYK4nFlZv1tzhZYCs=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=YpbGvASjB2TbM87q3M7DUFi13mnPbtLhpPyjISdKI+Dm12L6/Pw0N5KVM+t4D1MbQg OvCMKQ3YK9KdvKoKzNAKcFL38wJAaA7Iq608C+svPY/rPVRWbQUQNkG0zbGH+LiP3zgO JcsqfkZ/TeWcyo3GZEgb6jOErNCYfowY46UXugmZ6sdQUqP3w81oLeB/VgHrYU1MjlIG 3CWVfSUtWWY1iT95/4QZ2HwbeQEx0is6AHcB0U09bJ6u8TnBe7BJSjCH1d6He2HD1md6 Qpr1viaENwlyixzlruV2YJCzXcJd04a2ZGdtSX6vCy/kV/6CR369+7VN+8aUm7cAluii QCPg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20221208 header.b=R3tglJg7; 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; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id vi18-20020a170907d41200b00977e0bdac8asi6207446ejc.583.2023.09.04.15.11.34; Mon, 04 Sep 2023 15:11:35 -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; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20221208 header.b=R3tglJg7; 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; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id BCAAC68C7D4; Tue, 5 Sep 2023 01:11:32 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ot1-f49.google.com (mail-ot1-f49.google.com [209.85.210.49]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id B4B2568C4EC for ; Tue, 5 Sep 2023 01:11:26 +0300 (EEST) Received: by mail-ot1-f49.google.com with SMTP id 46e09a7af769-6bca3588edbso1177125a34.0 for ; Mon, 04 Sep 2023 15:11:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1693865484; x=1694470284; darn=ffmpeg.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=9dqRIjgJThbVFFxU/Hz9oZCLLCJaad/7FFdHU+jC7Uw=; b=R3tglJg7bG4I1eySb1JZc+X2oeWUXhs2P/qMau2BPiym3Bqbtx1Gy8hpuNgH3SmBbr CrFJzMbI3tAuvW63e48viDAzAQSdwPegrHh2s/SdXod0OGeW2UZEwZS1W/fUUeXZN1b1 oq413YWXOet9MKie97rF376k+Nr7uopibA9sqn/iAZEaNhT65dWCJhN6BZVwxD3LAB8u IGYdiOkpfUkDNsissj5N14keomFdSIvR7CcOy4j5tRdKeYYj92kJnsnLhSLS+ou4qpAF vErgaLaySfhgc6bZhX+11PEvgdO3ebj+RcuUJggDbw/9Bg8jMrkjdZ1jRs2n/tsoX2RD AJCA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1693865484; x=1694470284; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=9dqRIjgJThbVFFxU/Hz9oZCLLCJaad/7FFdHU+jC7Uw=; b=Z47HrCmzURlQNpXvRkH/l4KHy/VBXCEloUsou3EBem+GHK0mo48MVQFMNHxFpS7iVW 3Z2SSUyjJcztbMymeIqoq+xRDUbtYoHgja11kAREfeCscsjujVIgurdnVlSKaOGiK5yP zyJ/kqSdLbpfu/NW9k0OwcC8QLiAduduetdDJ8+HxtVrNRyTj8aKPbu0Ni6zvh5AfLOF LH/kiC8QserSnDw++Nzwdh9ECqX+MrEmnMhstT+hE/TUdYSUTdkoko1W0RleKHU6YAJm S8nplxepoLYKPw3PsSrkaIbFfAjrvOKHtrhWHzYKtU61anblLf/s7iWAnDxFPzeDqvdU UBZw== X-Gm-Message-State: AOJu0YzYGmY/jKR+1JcC+83TWh8sggNXqfl6wAeeknDlMiK3DAxBuMOV oG6FD+97XEHeI8zTyeBSloi5P5ati4g= X-Received: by 2002:a05:6871:4985:b0:1c8:c27f:7db7 with SMTP id tx5-20020a056871498500b001c8c27f7db7mr8648165oab.40.1693865484624; Mon, 04 Sep 2023 15:11:24 -0700 (PDT) Received: from localhost.localdomain (host197.190-225-105.telecom.net.ar. [190.225.105.197]) by smtp.gmail.com with ESMTPSA id v49-20020a056870957100b001c03d1a519fsm5917503oal.39.2023.09.04.15.11.23 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 04 Sep 2023 15:11:24 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Mon, 4 Sep 2023 19:11:16 -0300 Message-ID: <20230904221116.21933-1-jamrial@gmail.com> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20230904150411.56777-13-jamrial@gmail.com> References: <20230904150411.56777-13-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 12/17] avformat/demux: propagate the internal decoder's bitrate properties 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: +g8CiHEz4Fy0 Muxers may access this information through cpb properties within the stream's side data. Signed-off-by: James Almer --- libavformat/demux.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/libavformat/demux.c b/libavformat/demux.c index 94128b00bc..606ccbd180 100644 --- a/libavformat/demux.c +++ b/libavformat/demux.c @@ -2976,6 +2976,24 @@ int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options) ret = add_coded_side_data(st, sti->avctx); if (ret < 0) goto find_stream_info_err; + + if (sti->avctx->rc_buffer_size > 0 || sti->avctx->rc_max_rate > 0 || + sti->avctx->rc_min_rate) { + size_t cpb_size; + AVCPBProperties *props = av_cpb_properties_alloc(&cpb_size); + if (props) { + if (sti->avctx->rc_buffer_size > 0) + props->buffer_size = sti->avctx->rc_buffer_size; + if (sti->avctx->rc_min_rate > 0) + props->min_bitrate = sti->avctx->rc_min_rate; + if (sti->avctx->rc_max_rate > 0) + props->max_bitrate = sti->avctx->rc_max_rate; + if (!av_packet_side_data_set_add(&st->codecpar->side_data, + AV_PKT_DATA_CPB_PROPERTIES, + (uint8_t *)props, cpb_size, 0)) + av_free(props); + } + } } sti->avctx_inited = 0; From patchwork Mon Sep 4 22:11:49 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 43553 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:4f16:b0:149:dfde:5c0a with SMTP id gi22csp1475680pzb; Mon, 4 Sep 2023 15:12:07 -0700 (PDT) X-Google-Smtp-Source: AGHT+IF0Ow9CeA8Z4HysWBsnzgY4lU6PsuBSR8/r3T2cFv55Yo4C5gaRwEI/IR7tknJIj1A82RJA X-Received: by 2002:a17:907:a068:b0:9a1:cbe5:758c with SMTP id ia8-20020a170907a06800b009a1cbe5758cmr8097625ejc.7.1693865526980; Mon, 04 Sep 2023 15:12:06 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1693865526; cv=none; d=google.com; s=arc-20160816; b=zgkqOHV2MyKAfeQWEoyYwG9g8ovHoRBSYqpaE3GOqRmVCVOkqn4PLorwmEaK1WNheZ 2ikWLYLDmlsr9HihiiZ+SaDdU7mf9U4C1Mh1kLCmmgd3icpbG2W531pfj8/c9PTxoYk+ 7nKQHhlm/pnol0f7Lmvo7cQPL7IPahmnTY6eDJcoiQquPNuF1I7+tVyCJRQwwd2ttf4K Mp4DsQ8N8KjR6OEj2hUDCBdvBiEC1Su68O1n3zlnjIkVwyC1+naJt9ctjfF6P7zLescv LnlOOpLDUJaxpd9OQWxZhk+qrC5GuOqbe0V6BihZmkz7BHm8kGfdkvEUr0Mm5ig28CbO 6aSQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=eaBE8/+HX6AILezFzPvJmZLQxRyGKNovRMfA69e41u4=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=dbACwA7Br1R2tyrV6k4wQMA8GBeB3G2vS98QZvQpyNovvh67QnfqC1yU7kKEToRwTs tVdfxe6ET1LAlLolWNGDh6SeH9f0RQnMfARk/aeX0bx4fWzgavRwX8C8bc35ZdlQyITF dw1xPdmGvFZfOOZmhr2wtv54HemswZ+rXTnXJ+QPOhQ8omP/wgtHdHhrF/ZlkucP0q3A w8odbmQ5LxUkpmPPi/LOXMBH4UuoUu6lrDf29AgZHnOd3YqZcX7f6ri1UYt5ys8MZ+ub rf3hd222oFxhLcgcrXKcgP422jY7WMcuibRkbpiEL//RK/HkA10UA6SV/wVNVrhfgl9D VNtA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20221208 header.b=RlBCoIU1; 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; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id lt14-20020a170906fa8e00b0099cc15f09a1si7056083ejb.118.2023.09.04.15.12.06; Mon, 04 Sep 2023 15:12:06 -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; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20221208 header.b=RlBCoIU1; 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; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id D4CE968C7D9; Tue, 5 Sep 2023 01:12:04 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ot1-f49.google.com (mail-ot1-f49.google.com [209.85.210.49]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 8BE7468C7BA for ; Tue, 5 Sep 2023 01:11:58 +0300 (EEST) Received: by mail-ot1-f49.google.com with SMTP id 46e09a7af769-6bf038b8f87so1402842a34.1 for ; Mon, 04 Sep 2023 15:11:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1693865516; x=1694470316; darn=ffmpeg.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=KhqOT7qP1bZY9vJgUNvCDjaUHhw6QegQljLbnyKMM6Y=; b=RlBCoIU1L/sdMBdL7SVWkCP17RHgSAWJq9iF+TIbGzJLNTNNhSEsb6AjZRFAYmTx19 yeprsauqtm62M5NMOTQBL8M1nP11Ulq8afGboeyItECz0APV+5K2hw8rb0g+Toa/dt5h x9NMCayWMARzHbuuUkU/aY+QvLD3PFkcmLc56FMUTapwmEcuRqUKpL6+iuMbcqu6B1Xc l1X4CeoWKrPHHiv61oXDw+n86l8D6gbK2GJ4w1/VBjP6cU1H+smeAjP8jsUk0gnrlHdx dxnS7jgQGSNSTedPPMk7zhaI4GUPQ+q8yMTqqoZyxiCB18CZobeVKLQym6ljljcdINPw xPsQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1693865516; x=1694470316; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=KhqOT7qP1bZY9vJgUNvCDjaUHhw6QegQljLbnyKMM6Y=; b=LViAC7yEiNLJYStlVsqP36niwY9kVgWonF7S2ziAbjBjiVnOLvUQ+o1cv185m8Vkps RlxAen9HsOjIbLCODHbiKYjN2OQyv6bL9rqzrPt8VGOGEi1k563xO07rz7cuLhw0n3cD h9kBvkLxwJynCVQqrTHw4ydEsLys5mKH6R9QjLPA/YpPkKjkwtgvMHIiYgE0XsRsuYm0 n0HAJuC5r/IlErioZQMOIYn7pWJpe9UMfemOkxu+ftUR4kFDSjXELbAzelMgLzY1oX1E TuKPN5xCgvF0QubX7QASs846MEaIVMXrcrrlHPDMeZrvg5vdrdqn8dLV2kLjcvWpV6wD UtRQ== X-Gm-Message-State: AOJu0YynipbDiD9MAFwJemJ4zGo2elf/8lmsRwY0XSWSbalwUNPqGAIc /wPVl22YweSbTZrd/UFCB/rLEp0q1iE= X-Received: by 2002:a54:4818:0:b0:3a8:6a40:7dc0 with SMTP id j24-20020a544818000000b003a86a407dc0mr6898933oij.18.1693865516546; Mon, 04 Sep 2023 15:11:56 -0700 (PDT) Received: from localhost.localdomain (host197.190-225-105.telecom.net.ar. [190.225.105.197]) by smtp.gmail.com with ESMTPSA id v2-20020a4aad82000000b005737ca61829sm4856070oom.13.2023.09.04.15.11.55 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 04 Sep 2023 15:11:56 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Mon, 4 Sep 2023 19:11:49 -0300 Message-ID: <20230904221149.21944-1-jamrial@gmail.com> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20230904150411.56777-14-jamrial@gmail.com> References: <20230904150411.56777-14-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 14/17] avcodec/avcodec: deprecate coded_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: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: gZB+BQ82lG2U In favor of AVCodecContext.packet_side_data Signed-off-by: James Almer --- libavcodec/avcodec.c | 34 ++++++++++++++++++++++++++++++++++ libavcodec/avcodec.h | 8 +++++++- libavcodec/utils.c | 24 ++++++++---------------- libavcodec/version_major.h | 1 + 4 files changed, 50 insertions(+), 17 deletions(-) diff --git a/libavcodec/avcodec.c b/libavcodec/avcodec.c index 7e1ef99234..e600ac3a1e 100644 --- a/libavcodec/avcodec.c +++ b/libavcodec/avcodec.c @@ -342,6 +342,36 @@ FF_ENABLE_DEPRECATION_WARNINGS avci->needs_close = 1; } +#if FF_API_CODED_SIDE_DATA +FF_DISABLE_DEPRECATION_WARNINGS + if (av_codec_is_encoder(avctx->codec)) { + const AVPacketSideData *sd = + av_packet_side_data_set_get(&avctx->packet_side_data, AV_PKT_DATA_CPB_PROPERTIES); + if (sd) { + uint8_t *data; + AVPacketSideData *tmp = av_realloc_array(avctx->coded_side_data, + avctx->nb_coded_side_data + 1U, + sizeof(*tmp)); + if (!tmp) { + ret = AVERROR(ENOMEM); + goto free_and_end; + } + avctx->coded_side_data = tmp; + + data = av_memdup(sd->data, sd->size); + if (!data) { + ret = AVERROR(ENOMEM); + goto free_and_end; + } + + avctx->coded_side_data[avctx->nb_coded_side_data].data = data; + avctx->coded_side_data[avctx->nb_coded_side_data].size = sd->size; + avctx->coded_side_data[avctx->nb_coded_side_data++].type = AV_PKT_DATA_CPB_PROPERTIES; + } + } +FF_ENABLE_DEPRECATION_WARNINGS +#endif + ret=0; if (av_codec_is_decoder(avctx->codec)) { @@ -477,10 +507,14 @@ av_cold int avcodec_close(AVCodecContext *avctx) av_packet_side_data_set_free(&avctx->packet_side_data); +#if FF_API_CODED_SIDE_DATA +FF_DISABLE_DEPRECATION_WARNINGS for (i = 0; i < avctx->nb_coded_side_data; i++) av_freep(&avctx->coded_side_data[i].data); av_freep(&avctx->coded_side_data); avctx->nb_coded_side_data = 0; +FF_ENABLE_DEPRECATION_WARNINGS +#endif av_buffer_unref(&avctx->hw_frames_ctx); av_buffer_unref(&avctx->hw_device_ctx); diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index dda8a2412b..946a3977d7 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -1890,14 +1890,20 @@ typedef struct AVCodecContext { #define FF_CODEC_PROPERTY_CLOSED_CAPTIONS 0x00000002 #define FF_CODEC_PROPERTY_FILM_GRAIN 0x00000004 +#if FF_API_CODED_SIDE_DATA /** * Additional data associated with the entire coded stream. * * - decoding: unused * - encoding: may be set by libavcodec after avcodec_open2(). + * @deprecated use the context's @ref AVCodecContext.packet_side_data + * "packet_side_data" field. */ + attribute_deprecated AVPacketSideData *coded_side_data; + attribute_deprecated int nb_coded_side_data; +#endif /** * A reference to the AVHWFramesContext describing the input (for encoding) @@ -2105,7 +2111,7 @@ typedef struct AVCodecContext { * Additional data associated with the entire stream. * * - decoding: set by user - * - encoding: unused + * - encoding: may be set by libavcodec after avcodec_open2(). */ AVPacketSideDataSet packet_side_data; } AVCodecContext; diff --git a/libavcodec/utils.c b/libavcodec/utils.c index bd4131db62..90e573890f 100644 --- a/libavcodec/utils.c +++ b/libavcodec/utils.c @@ -1020,31 +1020,23 @@ AVCPBProperties *av_cpb_properties_alloc(size_t *size) AVCPBProperties *ff_add_cpb_side_data(AVCodecContext *avctx) { - AVPacketSideData *tmp; + AVPacketSideData *sd; AVCPBProperties *props; size_t size; - int i; - for (i = 0; i < avctx->nb_coded_side_data; i++) - if (avctx->coded_side_data[i].type == AV_PKT_DATA_CPB_PROPERTIES) - return (AVCPBProperties *)avctx->coded_side_data[i].data; + av_assert0(av_codec_is_encoder(avctx->codec)); + + sd = av_packet_side_data_set_get(&avctx->packet_side_data, AV_PKT_DATA_CPB_PROPERTIES); + if (sd) + return (AVCPBProperties *)sd->data; props = av_cpb_properties_alloc(&size); if (!props) return NULL; - tmp = av_realloc_array(avctx->coded_side_data, avctx->nb_coded_side_data + 1, sizeof(*tmp)); - if (!tmp) { + if (!av_packet_side_data_set_add(&avctx->packet_side_data, AV_PKT_DATA_CPB_PROPERTIES, + (uint8_t *)props, size, 0)) av_freep(&props); - return NULL; - } - - avctx->coded_side_data = tmp; - avctx->nb_coded_side_data++; - - avctx->coded_side_data[avctx->nb_coded_side_data - 1].type = AV_PKT_DATA_CPB_PROPERTIES; - avctx->coded_side_data[avctx->nb_coded_side_data - 1].data = (uint8_t*)props; - avctx->coded_side_data[avctx->nb_coded_side_data - 1].size = size; return props; } diff --git a/libavcodec/version_major.h b/libavcodec/version_major.h index cfd0b5023e..440ee857da 100644 --- a/libavcodec/version_major.h +++ b/libavcodec/version_major.h @@ -49,6 +49,7 @@ #define FF_API_SUBFRAMES (LIBAVCODEC_VERSION_MAJOR < 61) #define FF_API_TICKS_PER_FRAME (LIBAVCODEC_VERSION_MAJOR < 61) #define FF_API_DROPCHANGED (LIBAVCODEC_VERSION_MAJOR < 61) +#define FF_API_CODED_SIDE_DATA (LIBAVCODEC_VERSION_MAJOR < 61) #define FF_API_AVFFT (LIBAVCODEC_VERSION_MAJOR < 62)