From: James Almer <jamrial@gmail.com> To: ffmpeg-devel@ffmpeg.org Subject: [FFmpeg-devel] [PATCH 02/11] avcodec/codec_par: add side data to AVCodecParameters Date: Wed, 27 Sep 2023 10:12:33 -0300 Message-ID: <20230927131242.1950-3-jamrial@gmail.com> (raw) In-Reply-To: <20230927131242.1950-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 | 48 ++++++++++++++++++++++++++++++++++++++++++ libavcodec/codec_par.h | 11 ++++++++++ 2 files changed, 59 insertions(+) diff --git a/libavcodec/codec_par.c b/libavcodec/codec_par.c index e4e4cd48d3..364569c0e6 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_free(&par->side_data, &par->nb_side_data); memset(par, 0, sizeof(*par)); @@ -72,6 +74,35 @@ void avcodec_parameters_free(AVCodecParameters **ppar) av_freep(ppar); } +static int codec_parameters_copy_side_data(AVPacketSideData **pdst, int *pnb_dst, + const AVPacketSideData *src, int nb_src) +{ + AVPacketSideData *dst; + int nb_dst = *pnb_dst; + + if (!src) + return 0; + + *pdst = dst = av_calloc(nb_src, sizeof(*dst)); + if (!dst) + return AVERROR(ENOMEM); + + for (int i = 0; i < nb_src; i++) { + const AVPacketSideData *src_sd = &src[i]; + AVPacketSideData *dst_sd = &dst[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; + *pnb_dst = ++nb_dst; + } + + return 0; +} + int avcodec_parameters_copy(AVCodecParameters *dst, const AVCodecParameters *src) { int ret; @@ -82,6 +113,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 = NULL; + dst->nb_side_data = 0; if (src->extradata) { dst->extradata = av_mallocz(src->extradata_size + AV_INPUT_BUFFER_PADDING_SIZE); if (!dst->extradata) @@ -89,6 +122,10 @@ int avcodec_parameters_copy(AVCodecParameters *dst, const AVCodecParameters *src memcpy(dst->extradata, src->extradata, src->extradata_size); dst->extradata_size = src->extradata_size; } + ret = codec_parameters_copy_side_data(&dst->side_data, &dst->nb_side_data, + src->side_data, src->nb_side_data); + if (ret < 0) + return ret; ret = av_channel_layout_copy(&dst->ch_layout, &src->ch_layout); if (ret < 0) @@ -178,6 +215,11 @@ FF_ENABLE_DEPRECATION_WARNINGS par->extradata_size = codec->extradata_size; } + ret = codec_parameters_copy_side_data(&par->side_data, &par->nb_side_data, + codec->coded_side_data, codec->nb_coded_side_data); + if (ret < 0) + return ret; + return 0; } @@ -262,5 +304,11 @@ FF_ENABLE_DEPRECATION_WARNINGS codec->extradata_size = par->extradata_size; } + av_packet_side_data_free(&codec->coded_side_data, &codec->nb_coded_side_data); + ret = codec_parameters_copy_side_data(&codec->coded_side_data, &codec->nb_coded_side_data, + par->side_data, par->nb_side_data); + if (ret < 0) + return ret; + return 0; } diff --git a/libavcodec/codec_par.h b/libavcodec/codec_par.h index add90fdb1e..85017ec76e 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,16 @@ typedef struct AVCodecParameters { * when no higher-level timing information is available. */ AVRational framerate; + + /** + * Additional data associated with the entire stream. + */ + AVPacketSideData *side_data; + + /** + * Amount of entries in @ref side_data. + */ + int nb_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".
next prev parent reply other threads:[~2023-09-27 13:13 UTC|newest] Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top 2023-09-27 13:12 [FFmpeg-devel] [PATCH 00/11 v5] AVCodecContext and AVCodecParameters side data James Almer 2023-09-27 13:12 ` [FFmpeg-devel] [PATCH 01/11] avcodec/packet: add generic side data helpers James Almer 2023-10-03 12:54 ` Anton Khirnov 2023-09-27 13:12 ` James Almer [this message] 2023-10-03 11:23 ` [FFmpeg-devel] [PATCH 02/11] avcodec/codec_par: add side data to AVCodecParameters Anton Khirnov 2023-09-27 13:12 ` [FFmpeg-devel] [PATCH 03/11] avformat/avformat: use the side data from AVStream.codecpar James Almer 2023-10-03 11:38 ` Anton Khirnov 2023-09-27 13:12 ` [FFmpeg-devel] [PATCH 04/11] avcodec/packet: add some documentation for AVPacketSideData James Almer 2023-10-03 11:02 ` Anton Khirnov 2023-09-27 13:12 ` [FFmpeg-devel] [PATCH 05/11] fftools/ffmpeg: stop using AVStream.side_data James Almer 2023-10-03 11:50 ` Anton Khirnov 2023-09-27 13:12 ` [FFmpeg-devel] [PATCH 06/11] fftools/ffplay: " James Almer 2023-09-27 13:12 ` [FFmpeg-devel] [PATCH 07/11] fftools/ffprobe: " James Almer 2023-09-27 13:12 ` [FFmpeg-devel] [PATCH 08/11] avcodec/hevcdec: check for DOVI configuration record in AVCodecContext side data James Almer 2023-10-03 10:18 ` Anton Khirnov 2023-10-03 19:11 ` James Almer 2023-09-27 13:12 ` [FFmpeg-devel] [PATCH 09/11] avcodec/decode: check for global side data " James Almer 2023-10-03 12:34 ` Anton Khirnov 2023-10-03 18:46 ` James Almer 2023-10-04 3:22 ` James Almer 2023-10-04 14:36 ` Anton Khirnov 2023-09-27 13:12 ` [FFmpeg-devel] [PATCH 10/11] fftools/ffmpeg: stop injecting stream side data in packets James Almer 2023-10-03 11:04 ` Anton Khirnov 2023-09-27 13:12 ` [FFmpeg-devel] [PATCH 11/11] fftools/ffplay: " James Almer 2023-10-03 10:11 ` Anton Khirnov 2023-10-03 11:28 ` Anton Khirnov 2023-10-04 12:28 [FFmpeg-devel] [PATCH 00/11 v6] AVCodecContext and AVCodecParameters side data James Almer 2023-10-04 12:28 ` [FFmpeg-devel] [PATCH 02/11] avcodec/codec_par: add side data to AVCodecParameters 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=20230927131242.1950-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