Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
From: James Almer <jamrial@gmail.com>
To: ffmpeg-devel@ffmpeg.org
Subject: [FFmpeg-devel] [PATCH 02/10] avcodec/codec_par: add side data to AVCodecParameters
Date: Wed,  6 Sep 2023 14:44:22 -0300
Message-ID: <20230906174431.45558-3-jamrial@gmail.com> (raw)
In-Reply-To: <20230906174431.45558-1-jamrial@gmail.com>

This will simplify the propagation of side data to decoders and from encoders.
Global side data will now reside in the AVCodecContext, thus be available
during init(), removing the need to propagate it inside packets.

Global and frame specific side data will therefore be distinct.

Signed-off-by: James Almer <jamrial@gmail.com>
---
 libavcodec/codec_par.c | 81 ++++++++++++++++++++++++++++++++++++++++++
 libavcodec/codec_par.h |  6 ++++
 2 files changed, 87 insertions(+)

diff --git a/libavcodec/codec_par.c b/libavcodec/codec_par.c
index a38a475dc7..c0c941c2b6 100644
--- a/libavcodec/codec_par.c
+++ b/libavcodec/codec_par.c
@@ -27,11 +27,13 @@
 #include "libavutil/mem.h"
 #include "avcodec.h"
 #include "codec_par.h"
+#include "packet.h"
 
 static void codec_parameters_reset(AVCodecParameters *par)
 {
     av_freep(&par->extradata);
     av_channel_layout_uninit(&par->ch_layout);
+    av_packet_side_data_set_free(&par->side_data);
 
     memset(par, 0, sizeof(*par));
 
@@ -82,6 +84,8 @@ int avcodec_parameters_copy(AVCodecParameters *dst, const AVCodecParameters *src
     dst->ch_layout      = (AVChannelLayout){0};
     dst->extradata      = NULL;
     dst->extradata_size = 0;
+    dst->side_data.sd    = NULL;
+    dst->side_data.nb_sd = 0;
     if (src->extradata) {
         dst->extradata = av_mallocz(src->extradata_size + AV_INPUT_BUFFER_PADDING_SIZE);
         if (!dst->extradata)
@@ -89,6 +93,32 @@ int avcodec_parameters_copy(AVCodecParameters *dst, const AVCodecParameters *src
         memcpy(dst->extradata, src->extradata, src->extradata_size);
         dst->extradata_size = src->extradata_size;
     }
+    if (src->side_data.nb_sd) {
+        const AVPacketSideDataSet *src_set = &src->side_data;
+        AVPacketSideDataSet *dst_set = &dst->side_data;
+
+        dst_set->sd = av_calloc(src_set->nb_sd, sizeof(*dst_set->sd));
+        if (!dst_set->sd)
+            return AVERROR(ENOMEM);
+
+        for (int i = 0; i < src_set->nb_sd; i++) {
+            const AVPacketSideData *src_sd = src_set->sd[i];
+            AVPacketSideData *dst_sd = av_mallocz(sizeof(*dst_sd));
+
+            if (!dst_sd)
+                return AVERROR(ENOMEM);
+
+            dst_sd->data = av_memdup(src_sd->data, src_sd->size);
+            if (!dst_sd->data) {
+                return AVERROR(ENOMEM);
+                av_free(dst_sd);
+            }
+
+            dst_sd->type = src_sd->type;
+            dst_sd->size = src_sd->size;
+            dst_set->sd[dst_set->nb_sd++] = dst_sd;
+        }
+    }
 
     ret = av_channel_layout_copy(&dst->ch_layout, &src->ch_layout);
     if (ret < 0)
@@ -178,6 +208,32 @@ FF_ENABLE_DEPRECATION_WARNINGS
         par->extradata_size = codec->extradata_size;
     }
 
+    if (codec->nb_coded_side_data) {
+        AVPacketSideDataSet *dst_set = &par->side_data;
+
+        dst_set->sd = av_calloc(codec->nb_coded_side_data, sizeof(*dst_set->sd));
+        if (!dst_set->sd)
+            return AVERROR(ENOMEM);
+
+        for (int i = 0; i < codec->nb_coded_side_data; i++) {
+            const AVPacketSideData *src_sd = &codec->coded_side_data[i];
+            AVPacketSideData *dst_sd = av_mallocz(sizeof(*dst_sd));
+
+            if (!dst_sd)
+                return AVERROR(ENOMEM);
+
+            dst_sd->data = av_memdup(src_sd->data, src_sd->size);
+            if (!dst_sd->data) {
+                return AVERROR(ENOMEM);
+                av_free(dst_sd);
+            }
+
+            dst_sd->type = src_sd->type;
+            dst_sd->size = src_sd->size;
+            dst_set->sd[dst_set->nb_sd++] = dst_sd;
+        }
+    }
+
     return 0;
 }
 
@@ -262,5 +318,30 @@ FF_ENABLE_DEPRECATION_WARNINGS
         codec->extradata_size = par->extradata_size;
     }
 
+    for (int i = 0; i < codec->nb_coded_side_data; i++)
+        av_free(codec->coded_side_data[i].data);
+    av_freep(&codec->coded_side_data);
+    codec->nb_coded_side_data = 0;
+    if (par->side_data.nb_sd) {
+        const AVPacketSideDataSet *src_set = &par->side_data;
+
+        codec->coded_side_data = av_calloc(src_set->nb_sd, sizeof(*codec->coded_side_data));
+        if (!codec->coded_side_data)
+            return AVERROR(ENOMEM);
+
+        for (int i = 0; i < src_set->nb_sd; i++) {
+            const AVPacketSideData *src_sd = src_set->sd[i];
+            AVPacketSideData *dst_sd = &codec->coded_side_data[i];
+
+            dst_sd->data = av_memdup(src_sd->data, src_sd->size);
+            if (!dst_sd->data)
+                return AVERROR(ENOMEM);
+
+            dst_sd->type = src_sd->type;
+            dst_sd->size = src_sd->size;
+            codec->nb_coded_side_data++;
+        }
+    }
+
     return 0;
 }
diff --git a/libavcodec/codec_par.h b/libavcodec/codec_par.h
index add90fdb1e..169e595b7c 100644
--- a/libavcodec/codec_par.h
+++ b/libavcodec/codec_par.h
@@ -29,6 +29,7 @@
 #include "libavutil/pixfmt.h"
 
 #include "codec_id.h"
+#include "packet.h"
 
 /**
  * @addtogroup lavc_core
@@ -223,6 +224,11 @@ typedef struct AVCodecParameters {
      * when no higher-level timing information is available.
      */
     AVRational framerate;
+
+    /**
+     * Additional data associated with the entire stream.
+     */
+    AVPacketSideDataSet side_data;
 } AVCodecParameters;
 
 /**
-- 
2.42.0

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

  parent reply	other threads:[~2023-09-06 17:45 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-09-06 17:44 [FFmpeg-devel] [PATCH 00/10 v4][RFC] AVCodecContext and AVCodecParameters side data James Almer
2023-09-06 17:44 ` [FFmpeg-devel] [PATCH 01/10] avcodec/packet: add side data set struct and helpers James Almer
2023-09-11 17:41   ` Andreas Rheinhardt
2023-09-11 18:00     ` James Almer
2023-09-06 17:44 ` James Almer [this message]
2023-09-11 17:45   ` [FFmpeg-devel] [PATCH 02/10] avcodec/codec_par: add side data to AVCodecParameters Andreas Rheinhardt
2023-09-12 16:34     ` James Almer
2023-09-06 17:44 ` [FFmpeg-devel] [PATCH 03/10] avformat/avformat: use the side data from AVStream.codecpar James Almer
2023-09-11 19:19   ` Andreas Rheinhardt
2023-09-12 16:27     ` James Almer
2023-09-12 16:43       ` Andreas Rheinhardt
2023-09-12 16:57         ` James Almer
2023-09-06 17:44 ` [FFmpeg-devel] [PATCH 04/10] fftools/ffmpeg: stop using AVStream.side_data James Almer
2023-09-06 17:44 ` [FFmpeg-devel] [PATCH 05/10] fftools/ffplay: " James Almer
2023-09-06 17:44 ` [FFmpeg-devel] [PATCH 06/10] fftools/ffprobe: " James Almer
2023-09-06 17:44 ` [FFmpeg-devel] [PATCH 07/10] avcodec/hevcdec: check for DOVI configuration record in AVCodecContext side data James Almer
2023-09-11 17:58   ` Andreas Rheinhardt
2023-09-06 17:44 ` [FFmpeg-devel] [PATCH 08/10] avcodec/decode: check for global side data " James Almer
2023-09-11 18:35   ` Andreas Rheinhardt
2023-09-11 18:41     ` James Almer
2023-09-06 17:44 ` [FFmpeg-devel] [PATCH 09/10] fftools/ffmpeg: stop injecting stream side data in packets James Almer
2023-09-06 17:44 ` [FFmpeg-devel] [PATCH 10/10] fftools/ffplay: " James Almer
2023-09-09 12:42 ` [FFmpeg-devel] [PATCH 00/10 v4][RFC] AVCodecContext and AVCodecParameters side data James Almer
2023-09-14 15:43 ` Anton Khirnov
2023-09-14 16:40   ` James Almer
2023-09-25 19:54     ` James Almer
2023-09-25 20:02       ` Paul B Mahol
2023-09-25 20:18         ` James Almer

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230906174431.45558-3-jamrial@gmail.com \
    --to=jamrial@gmail.com \
    --cc=ffmpeg-devel@ffmpeg.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
		ffmpegdev@gitmailbox.com
	public-inbox-index ffmpegdev

Example config snippet for mirrors.


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git