From: Andreas Rheinhardt <andreas.rheinhardt@outlook.com> To: ffmpeg-devel@ffmpeg.org Subject: Re: [FFmpeg-devel] [PATCH 08/10] avcodec/decode: check for global side data in AVCodecContext side data Date: Mon, 11 Sep 2023 20:35:36 +0200 Message-ID: <AS8P250MB0744717A7818CAA759EA405E8FF2A@AS8P250MB0744.EURP250.PROD.OUTLOOK.COM> (raw) In-Reply-To: <20230906174431.45558-9-jamrial@gmail.com> James Almer: > Signed-off-by: James Almer <jamrial@gmail.com> > --- > libavcodec/decode.c | 55 +++++++++++++++++++++++++++++++++++++-------- > libavcodec/decode.h | 2 +- > 2 files changed, 47 insertions(+), 10 deletions(-) > > diff --git a/libavcodec/decode.c b/libavcodec/decode.c > index 169ee79acd..1a431ba7d7 100644 > --- a/libavcodec/decode.c > +++ b/libavcodec/decode.c > @@ -1409,25 +1409,31 @@ static int add_metadata_from_side_data(const AVPacket *avpkt, AVFrame *frame) > return av_packet_unpack_dictionary(side_metadata, size, frame_md); > } > > -int ff_decode_frame_props_from_pkt(const AVCodecContext *avctx, > +static const struct { > + enum AVPacketSideDataType packet; > + enum AVFrameSideDataType frame; > +} sd_global_map[] = { > + { AV_PKT_DATA_REPLAYGAIN , AV_FRAME_DATA_REPLAYGAIN }, > + { AV_PKT_DATA_SPHERICAL, AV_FRAME_DATA_SPHERICAL }, > + { AV_PKT_DATA_STEREO3D, AV_FRAME_DATA_STEREO3D }, > + { AV_PKT_DATA_AUDIO_SERVICE_TYPE, AV_FRAME_DATA_AUDIO_SERVICE_TYPE }, > + { AV_PKT_DATA_MASTERING_DISPLAY_METADATA, AV_FRAME_DATA_MASTERING_DISPLAY_METADATA }, > + { AV_PKT_DATA_CONTENT_LIGHT_LEVEL, AV_FRAME_DATA_CONTENT_LIGHT_LEVEL }, > + { AV_PKT_DATA_ICC_PROFILE, AV_FRAME_DATA_ICC_PROFILE }, > + { AV_PKT_DATA_DYNAMIC_HDR10_PLUS, AV_FRAME_DATA_DYNAMIC_HDR_PLUS }, > +}; > + > +int ff_decode_frame_props_from_pkt(AVCodecContext *avctx, > AVFrame *frame, const AVPacket *pkt) > { > static const struct { > enum AVPacketSideDataType packet; > enum AVFrameSideDataType frame; > } sd[] = { > - { AV_PKT_DATA_REPLAYGAIN , AV_FRAME_DATA_REPLAYGAIN }, > { AV_PKT_DATA_DISPLAYMATRIX, AV_FRAME_DATA_DISPLAYMATRIX }, > - { AV_PKT_DATA_SPHERICAL, AV_FRAME_DATA_SPHERICAL }, > - { AV_PKT_DATA_STEREO3D, AV_FRAME_DATA_STEREO3D }, > - { AV_PKT_DATA_AUDIO_SERVICE_TYPE, AV_FRAME_DATA_AUDIO_SERVICE_TYPE }, > - { AV_PKT_DATA_MASTERING_DISPLAY_METADATA, AV_FRAME_DATA_MASTERING_DISPLAY_METADATA }, > - { AV_PKT_DATA_CONTENT_LIGHT_LEVEL, AV_FRAME_DATA_CONTENT_LIGHT_LEVEL }, > { AV_PKT_DATA_A53_CC, AV_FRAME_DATA_A53_CC }, > { AV_PKT_DATA_AFD, AV_FRAME_DATA_AFD }, > - { AV_PKT_DATA_ICC_PROFILE, AV_FRAME_DATA_ICC_PROFILE }, > { AV_PKT_DATA_S12M_TIMECODE, AV_FRAME_DATA_S12M_TIMECODE }, > - { AV_PKT_DATA_DYNAMIC_HDR10_PLUS, AV_FRAME_DATA_DYNAMIC_HDR_PLUS }, > { AV_PKT_DATA_SKIP_SAMPLES, AV_FRAME_DATA_SKIP_SAMPLES }, > }; > > @@ -1440,6 +1446,23 @@ FF_DISABLE_DEPRECATION_WARNINGS > FF_ENABLE_DEPRECATION_WARNINGS > #endif > > + for (int i = 0; i < FF_ARRAY_ELEMS(sd_global_map); i++) { > + size_t size; > + uint8_t *packet_sd = av_packet_get_side_data(pkt, sd_global_map[i].packet, &size); > + if (packet_sd) { > + AVFrameSideData *frame_sd; > + > + av_log(avctx, AV_LOG_DEBUG, > + "Overwriting global side data of type \"%s\" in output frame with side data " > + "from input packet.\n", av_packet_side_data_name(sd_global_map[i].packet)); Overwriting? Is it guaranteed that the frame has the side data at all? And if it had, why would you overwrite it at all? After all, if the decoder added something, isn't this to be preferred to stuff from AVPacket side data? Apart from that: packet_sd should be const. > + > + av_frame_remove_side_data(frame, sd_global_map[i].frame); > + frame_sd = av_frame_new_side_data(frame, sd_global_map[i].frame, size); > + if (!frame_sd) > + return AVERROR(ENOMEM); > + memcpy(frame_sd->data, packet_sd, size); > + } > + } > for (int i = 0; i < FF_ARRAY_ELEMS(sd); i++) { > size_t size; > uint8_t *packet_sd = av_packet_get_side_data(pkt, sd[i].packet, &size); > @@ -1476,6 +1499,20 @@ int ff_decode_frame_props(AVCodecContext *avctx, AVFrame *frame) > const AVPacket *pkt = avctx->internal->last_pkt_props; > int ret; > > + for (int i = 0; i < FF_ARRAY_ELEMS(sd_global_map); i++) { > + const AVPacketSideData *packet_sd = ff_get_coded_side_data(avctx, > + sd_global_map[i].packet); > + if (packet_sd) { > + AVFrameSideData *frame_sd = av_frame_new_side_data(frame, > + sd_global_map[i].frame, > + packet_sd->size); > + if (!frame_sd) > + return AVERROR(ENOMEM); > + > + memcpy(frame_sd->data, packet_sd->data, packet_sd->size); > + } > + } > + > if (!(ffcodec(avctx->codec)->caps_internal & FF_CODEC_CAP_SETS_FRAME_PROPS)) { > ret = ff_decode_frame_props_from_pkt(avctx, frame, pkt); > if (ret < 0) > diff --git a/libavcodec/decode.h b/libavcodec/decode.h > index a52152e4a7..52e5aafc34 100644 > --- a/libavcodec/decode.h > +++ b/libavcodec/decode.h > @@ -67,7 +67,7 @@ int ff_decode_get_packet(AVCodecContext *avctx, AVPacket *pkt); > /** > * Set various frame properties from the provided packet. > */ > -int ff_decode_frame_props_from_pkt(const AVCodecContext *avctx, > +int ff_decode_frame_props_from_pkt(AVCodecContext *avctx, > AVFrame *frame, const AVPacket *pkt); > > /** _______________________________________________ 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-11 18:34 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 " 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 ` [FFmpeg-devel] [PATCH 02/10] avcodec/codec_par: add side data to AVCodecParameters James Almer 2023-09-11 17:45 ` 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 [this message] 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=AS8P250MB0744717A7818CAA759EA405E8FF2A@AS8P250MB0744.EURP250.PROD.OUTLOOK.COM \ --to=andreas.rheinhardt@outlook.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