* [FFmpeg-devel] [PATCH 0/2] QSV Overlay Filter: Copy side data from input to output frame @ 2022-10-24 23:04 ffmpegagent 2022-10-24 23:04 ` [FFmpeg-devel] [PATCH 1/2] avutil/frame: Add av_frame_copy_side_data() and av_frame_remove_all_side_data() softworkz ` (2 more replies) 0 siblings, 3 replies; 12+ messages in thread From: ffmpegagent @ 2022-10-24 23:04 UTC (permalink / raw) To: ffmpeg-devel; +Cc: softworkz This is split out from my earlier patchset "SEI parsing for QSV decoders" (https://github.com/ffstaging/FFmpeg/pull/31) as it is only logically related but not technically. The first patch had been reviewed and partially authored by Anton (I have indicated this with a signed-off line, please advise in case this wouldn't be right) The second patch performs the copying of side data from input to output frames. softworkz softworkz (2): avutil/frame: Add av_frame_copy_side_data() and av_frame_remove_all_side_data() avcodec/vpp_qsv: Copy side data from input to output frame doc/APIchanges | 4 +++ libavfilter/qsvvpp.c | 6 ++++ libavfilter/vf_overlay_qsv.c | 19 +++++++--- libavutil/frame.c | 67 ++++++++++++++++++++++-------------- libavutil/frame.h | 32 +++++++++++++++++ libavutil/version.h | 4 +-- 6 files changed, 100 insertions(+), 32 deletions(-) base-commit: 882a17068fd8e62c7d38c14e6fb160d7c9fc446a Published-As: https://github.com/ffstaging/FFmpeg/releases/tag/pr-ffstaging-44%2Fsoftworkz%2Fsubmit_copy_sidedata-v1 Fetch-It-Via: git fetch https://github.com/ffstaging/FFmpeg pr-ffstaging-44/softworkz/submit_copy_sidedata-v1 Pull-Request: https://github.com/ffstaging/FFmpeg/pull/44 -- ffmpeg-codebot _______________________________________________ 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". ^ permalink raw reply [flat|nested] 12+ messages in thread
* [FFmpeg-devel] [PATCH 1/2] avutil/frame: Add av_frame_copy_side_data() and av_frame_remove_all_side_data() 2022-10-24 23:04 [FFmpeg-devel] [PATCH 0/2] QSV Overlay Filter: Copy side data from input to output frame ffmpegagent @ 2022-10-24 23:04 ` softworkz 2022-10-24 23:04 ` [FFmpeg-devel] [PATCH 2/2] avcodec/vpp_qsv: Copy side data from input to output frame softworkz 2022-11-03 11:41 ` [FFmpeg-devel] [PATCH v2 0/2] QSV Overlay Filter: " ffmpegagent 2 siblings, 0 replies; 12+ messages in thread From: softworkz @ 2022-10-24 23:04 UTC (permalink / raw) To: ffmpeg-devel; +Cc: softworkz From: softworkz <softworkz@hotmail.com> Signed-off-by: softworkz <softworkz@hotmail.com> Signed-off-by: Anton Khirnov <anton@khirnov.net> --- doc/APIchanges | 4 +++ libavutil/frame.c | 67 +++++++++++++++++++++++++++------------------ libavutil/frame.h | 32 ++++++++++++++++++++++ libavutil/version.h | 4 +-- 4 files changed, 79 insertions(+), 28 deletions(-) diff --git a/doc/APIchanges b/doc/APIchanges index 5807bf8069..a65482ecc4 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -14,6 +14,10 @@ libavutil: 2021-04-27 API changes, most recent first: +2022-05-26 - xxxxxxxxx - lavu 57.40.100 - frame.h + Add av_frame_remove_all_side_data(), av_frame_copy_side_data(), + AV_FRAME_TRANSFER_SD_COPY, and AV_FRAME_TRANSFER_SD_FILTER. + 2022-10-11 - xxxxxxxxxx - lavu 57.39.101 - pixfmt.h Add AV_PIX_FMT_RGBF32 and AV_PIX_FMT_RGBAF32. diff --git a/libavutil/frame.c b/libavutil/frame.c index de4ad1f94d..8eb0e1ec95 100644 --- a/libavutil/frame.c +++ b/libavutil/frame.c @@ -276,9 +276,45 @@ FF_ENABLE_DEPRECATION_WARNINGS return AVERROR(EINVAL); } +void av_frame_remove_all_side_data(AVFrame *frame) +{ + wipe_side_data(frame); +} + +int av_frame_copy_side_data(AVFrame* dst, const AVFrame* src, int flags) +{ + for (unsigned i = 0; i < src->nb_side_data; i++) { + const AVFrameSideData *sd_src = src->side_data[i]; + AVFrameSideData *sd_dst; + if ((flags & AV_FRAME_TRANSFER_SD_FILTER) && + sd_src->type == AV_FRAME_DATA_PANSCAN && + (src->width != dst->width || src->height != dst->height)) + continue; + if (flags & AV_FRAME_TRANSFER_SD_COPY) { + sd_dst = av_frame_new_side_data(dst, sd_src->type, + sd_src->size); + if (!sd_dst) { + wipe_side_data(dst); + return AVERROR(ENOMEM); + } + memcpy(sd_dst->data, sd_src->data, sd_src->size); + } else { + AVBufferRef *ref = av_buffer_ref(sd_src->buf); + sd_dst = av_frame_new_side_data_from_buf(dst, sd_src->type, ref); + if (!sd_dst) { + av_buffer_unref(&ref); + wipe_side_data(dst); + return AVERROR(ENOMEM); + } + } + av_dict_copy(&sd_dst->metadata, sd_src->metadata, 0); + } + return 0; +} + static int frame_copy_props(AVFrame *dst, const AVFrame *src, int force_copy) { - int ret, i; + int ret; dst->key_frame = src->key_frame; dst->pict_type = src->pict_type; @@ -319,31 +355,10 @@ FF_ENABLE_DEPRECATION_WARNINGS av_dict_copy(&dst->metadata, src->metadata, 0); - for (i = 0; i < src->nb_side_data; i++) { - const AVFrameSideData *sd_src = src->side_data[i]; - AVFrameSideData *sd_dst; - if ( sd_src->type == AV_FRAME_DATA_PANSCAN - && (src->width != dst->width || src->height != dst->height)) - continue; - if (force_copy) { - sd_dst = av_frame_new_side_data(dst, sd_src->type, - sd_src->size); - if (!sd_dst) { - wipe_side_data(dst); - return AVERROR(ENOMEM); - } - memcpy(sd_dst->data, sd_src->data, sd_src->size); - } else { - AVBufferRef *ref = av_buffer_ref(sd_src->buf); - sd_dst = av_frame_new_side_data_from_buf(dst, sd_src->type, ref); - if (!sd_dst) { - av_buffer_unref(&ref); - wipe_side_data(dst); - return AVERROR(ENOMEM); - } - } - av_dict_copy(&sd_dst->metadata, sd_src->metadata, 0); - } + if ((ret = av_frame_copy_side_data(dst, src, + (force_copy ? AV_FRAME_TRANSFER_SD_COPY : 0) | + AV_FRAME_TRANSFER_SD_FILTER) < 0)) + return ret; ret = av_buffer_replace(&dst->opaque_ref, src->opaque_ref); ret |= av_buffer_replace(&dst->private_ref, src->private_ref); diff --git a/libavutil/frame.h b/libavutil/frame.h index e60a82f6c0..5a3362fb55 100644 --- a/libavutil/frame.h +++ b/libavutil/frame.h @@ -861,6 +861,30 @@ int av_frame_copy(AVFrame *dst, const AVFrame *src); */ int av_frame_copy_props(AVFrame *dst, const AVFrame *src); + +/** + * Copy side data, rather than creating new references. + */ +#define AV_FRAME_TRANSFER_SD_COPY (1 << 0) +/** + * Filter out side data that does not match dst properties. + */ +#define AV_FRAME_TRANSFER_SD_FILTER (1 << 1) + +/** + * Copy all side-data from src to dst. + * + * @param dst a frame to which the side data should be copied. + * @param src a frame from which to copy the side data. + * @param flags a combination of AV_FRAME_TRANSFER_SD_* + * + * @return 0 on success, a negative AVERROR on error. + * + * @note This function will create new references to side data buffers in src, + * unless the AV_FRAME_TRANSFER_SD_COPY flag is passed. + */ +int av_frame_copy_side_data(AVFrame* dst, const AVFrame* src, int flags); + /** * Get the buffer reference a given data plane is stored in. * @@ -913,6 +937,14 @@ AVFrameSideData *av_frame_get_side_data(const AVFrame *frame, */ void av_frame_remove_side_data(AVFrame *frame, enum AVFrameSideDataType type); +/** + * Remove and free all side data instances. + * + * @param frame from which to remove all side data. + */ +void av_frame_remove_all_side_data(AVFrame *frame); + + /** * Flags for frame cropping. diff --git a/libavutil/version.h b/libavutil/version.h index cb0c928bd0..2df788e529 100644 --- a/libavutil/version.h +++ b/libavutil/version.h @@ -79,8 +79,8 @@ */ #define LIBAVUTIL_VERSION_MAJOR 57 -#define LIBAVUTIL_VERSION_MINOR 39 -#define LIBAVUTIL_VERSION_MICRO 101 +#define LIBAVUTIL_VERSION_MINOR 40 +#define LIBAVUTIL_VERSION_MICRO 100 #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ LIBAVUTIL_VERSION_MINOR, \ -- ffmpeg-codebot _______________________________________________ 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". ^ permalink raw reply [flat|nested] 12+ messages in thread
* [FFmpeg-devel] [PATCH 2/2] avcodec/vpp_qsv: Copy side data from input to output frame 2022-10-24 23:04 [FFmpeg-devel] [PATCH 0/2] QSV Overlay Filter: Copy side data from input to output frame ffmpegagent 2022-10-24 23:04 ` [FFmpeg-devel] [PATCH 1/2] avutil/frame: Add av_frame_copy_side_data() and av_frame_remove_all_side_data() softworkz @ 2022-10-24 23:04 ` softworkz 2022-11-01 4:58 ` Xiang, Haihao 2022-11-03 11:41 ` [FFmpeg-devel] [PATCH v2 0/2] QSV Overlay Filter: " ffmpegagent 2 siblings, 1 reply; 12+ messages in thread From: softworkz @ 2022-10-24 23:04 UTC (permalink / raw) To: ffmpeg-devel; +Cc: softworkz From: softworkz <softworkz@hotmail.com> Signed-off-by: softworkz <softworkz@hotmail.com> --- libavfilter/qsvvpp.c | 6 ++++++ libavfilter/vf_overlay_qsv.c | 19 +++++++++++++++---- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/libavfilter/qsvvpp.c b/libavfilter/qsvvpp.c index 8428ee89ab..ae9766d12f 100644 --- a/libavfilter/qsvvpp.c +++ b/libavfilter/qsvvpp.c @@ -880,6 +880,12 @@ int ff_qsvvpp_filter_frame(QSVVPPContext *s, AVFilterLink *inlink, AVFrame *picr return AVERROR(EAGAIN); break; } + + av_frame_remove_all_side_data(out_frame->frame); + ret = av_frame_copy_side_data(out_frame->frame, in_frame->frame, 0); + if (ret < 0) + return ret; + out_frame->frame->pts = av_rescale_q(out_frame->surface.Data.TimeStamp, default_tb, outlink->time_base); diff --git a/libavfilter/vf_overlay_qsv.c b/libavfilter/vf_overlay_qsv.c index d947a1faa1..04fd284b92 100644 --- a/libavfilter/vf_overlay_qsv.c +++ b/libavfilter/vf_overlay_qsv.c @@ -231,13 +231,24 @@ static int process_frame(FFFrameSync *fs) { AVFilterContext *ctx = fs->parent; QSVOverlayContext *s = fs->opaque; + AVFrame *frame0 = NULL; AVFrame *frame = NULL; - int ret = 0, i; + int ret = 0; - for (i = 0; i < ctx->nb_inputs; i++) { + for (unsigned i = 0; i < ctx->nb_inputs; i++) { ret = ff_framesync_get_frame(fs, i, &frame, 0); - if (ret == 0) - ret = ff_qsvvpp_filter_frame(s->qsv, ctx->inputs[i], frame); + + if (ret == 0) { + if (i == 0) + frame0 = frame; + else { + av_frame_remove_all_side_data(frame); + ret = av_frame_copy_side_data(frame, frame0, 0); + } + + ret = ret < 0 ? ret : ff_qsvvpp_filter_frame(s->qsv, ctx->inputs[i], frame); + } + if (ret < 0 && ret != AVERROR(EAGAIN)) break; } -- ffmpeg-codebot _______________________________________________ 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". ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [FFmpeg-devel] [PATCH 2/2] avcodec/vpp_qsv: Copy side data from input to output frame 2022-10-24 23:04 ` [FFmpeg-devel] [PATCH 2/2] avcodec/vpp_qsv: Copy side data from input to output frame softworkz @ 2022-11-01 4:58 ` Xiang, Haihao 2022-11-01 9:17 ` "zhilizhao(赵志立)" 2022-11-02 4:23 ` Andreas Rheinhardt 0 siblings, 2 replies; 12+ messages in thread From: Xiang, Haihao @ 2022-11-01 4:58 UTC (permalink / raw) To: ffmpeg-devel; +Cc: softworkz On Mon, 2022-10-24 at 23:04 +0000, softworkz wrote: > From: softworkz <softworkz@hotmail.com> > > Signed-off-by: softworkz <softworkz@hotmail.com> > --- > libavfilter/qsvvpp.c | 6 ++++++ > libavfilter/vf_overlay_qsv.c | 19 +++++++++++++++---- > 2 files changed, 21 insertions(+), 4 deletions(-) > > diff --git a/libavfilter/qsvvpp.c b/libavfilter/qsvvpp.c > index 8428ee89ab..ae9766d12f 100644 > --- a/libavfilter/qsvvpp.c > +++ b/libavfilter/qsvvpp.c > @@ -880,6 +880,12 @@ int ff_qsvvpp_filter_frame(QSVVPPContext *s, AVFilterLink > *inlink, AVFrame *picr > return AVERROR(EAGAIN); > break; > } > + > + av_frame_remove_all_side_data(out_frame->frame); > + ret = av_frame_copy_side_data(out_frame->frame, in_frame->frame, 0); > + if (ret < 0) > + return ret; > + > out_frame->frame->pts = av_rescale_q(out_frame- > >surface.Data.TimeStamp, > default_tb, outlink->time_base); > > diff --git a/libavfilter/vf_overlay_qsv.c b/libavfilter/vf_overlay_qsv.c > index d947a1faa1..04fd284b92 100644 > --- a/libavfilter/vf_overlay_qsv.c > +++ b/libavfilter/vf_overlay_qsv.c > @@ -231,13 +231,24 @@ static int process_frame(FFFrameSync *fs) > { > AVFilterContext *ctx = fs->parent; > QSVOverlayContext *s = fs->opaque; > + AVFrame *frame0 = NULL; > AVFrame *frame = NULL; > - int ret = 0, i; > + int ret = 0; > > - for (i = 0; i < ctx->nb_inputs; i++) { > + for (unsigned i = 0; i < ctx->nb_inputs; i++) { > ret = ff_framesync_get_frame(fs, i, &frame, 0); > - if (ret == 0) > - ret = ff_qsvvpp_filter_frame(s->qsv, ctx->inputs[i], frame); > + > + if (ret == 0) { > + if (i == 0) > + frame0 = frame; > + else { > + av_frame_remove_all_side_data(frame); > + ret = av_frame_copy_side_data(frame, frame0, 0); > + } > + > + ret = ret < 0 ? ret : ff_qsvvpp_filter_frame(s->qsv, ctx- > >inputs[i], frame); > + } > + > if (ret < 0 && ret != AVERROR(EAGAIN)) > break; > } Patchset LGTM, I'll push this patchset if no more comment or objection. Thanks Haihao _______________________________________________ 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". ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [FFmpeg-devel] [PATCH 2/2] avcodec/vpp_qsv: Copy side data from input to output frame 2022-11-01 4:58 ` Xiang, Haihao @ 2022-11-01 9:17 ` "zhilizhao(赵志立)" 2022-11-02 22:44 ` Soft Works 2022-11-02 4:23 ` Andreas Rheinhardt 1 sibling, 1 reply; 12+ messages in thread From: "zhilizhao(赵志立)" @ 2022-11-01 9:17 UTC (permalink / raw) To: FFmpeg development discussions and patches > On Nov 1, 2022, at 12:58, Xiang, Haihao <haihao.xiang-at-intel.com@ffmpeg.org> wrote: > > On Mon, 2022-10-24 at 23:04 +0000, softworkz wrote: >> From: softworkz <softworkz@hotmail.com> >> >> Signed-off-by: softworkz <softworkz@hotmail.com> >> --- >> libavfilter/qsvvpp.c | 6 ++++++ >> libavfilter/vf_overlay_qsv.c | 19 +++++++++++++++---- >> 2 files changed, 21 insertions(+), 4 deletions(-) >> >> diff --git a/libavfilter/qsvvpp.c b/libavfilter/qsvvpp.c >> index 8428ee89ab..ae9766d12f 100644 >> --- a/libavfilter/qsvvpp.c >> +++ b/libavfilter/qsvvpp.c >> @@ -880,6 +880,12 @@ int ff_qsvvpp_filter_frame(QSVVPPContext *s, AVFilterLink >> *inlink, AVFrame *picr >> return AVERROR(EAGAIN); >> break; >> } >> + >> + av_frame_remove_all_side_data(out_frame->frame); >> + ret = av_frame_copy_side_data(out_frame->frame, in_frame->frame, 0); >> + if (ret < 0) >> + return ret; >> + >> out_frame->frame->pts = av_rescale_q(out_frame- >>> surface.Data.TimeStamp, >> default_tb, outlink->time_base); >> >> diff --git a/libavfilter/vf_overlay_qsv.c b/libavfilter/vf_overlay_qsv.c >> index d947a1faa1..04fd284b92 100644 >> --- a/libavfilter/vf_overlay_qsv.c >> +++ b/libavfilter/vf_overlay_qsv.c >> @@ -231,13 +231,24 @@ static int process_frame(FFFrameSync *fs) >> { >> AVFilterContext *ctx = fs->parent; >> QSVOverlayContext *s = fs->opaque; >> + AVFrame *frame0 = NULL; >> AVFrame *frame = NULL; >> - int ret = 0, i; >> + int ret = 0; >> >> - for (i = 0; i < ctx->nb_inputs; i++) { >> + for (unsigned i = 0; i < ctx->nb_inputs; i++) { >> ret = ff_framesync_get_frame(fs, i, &frame, 0); >> - if (ret == 0) >> - ret = ff_qsvvpp_filter_frame(s->qsv, ctx->inputs[i], frame); >> + >> + if (ret == 0) { >> + if (i == 0) >> + frame0 = frame; >> + else { >> + av_frame_remove_all_side_data(frame); >> + ret = av_frame_copy_side_data(frame, frame0, 0); >> + } >> + >> + ret = ret < 0 ? ret : ff_qsvvpp_filter_frame(s->qsv, ctx- >>> inputs[i], frame); >> + } >> + >> if (ret < 0 && ret != AVERROR(EAGAIN)) >> break; >> } > > Patchset LGTM, I'll push this patchset if no more comment or objection. avcodec/vpp_qsv: Copy side data from input to output frame ^^^^^^^ avcodec -> avfilter > > Thanks > Haihao > > _______________________________________________ > 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". _______________________________________________ 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". ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [FFmpeg-devel] [PATCH 2/2] avcodec/vpp_qsv: Copy side data from input to output frame 2022-11-01 9:17 ` "zhilizhao(赵志立)" @ 2022-11-02 22:44 ` Soft Works 0 siblings, 0 replies; 12+ messages in thread From: Soft Works @ 2022-11-02 22:44 UTC (permalink / raw) To: FFmpeg development discussions and patches > -----Original Message----- > From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of > "zhilizhao(???)" > Sent: Tuesday, November 1, 2022 10:18 AM > To: FFmpeg development discussions and patches <ffmpeg- > devel@ffmpeg.org> > Subject: Re: [FFmpeg-devel] [PATCH 2/2] avcodec/vpp_qsv: Copy side > data from input to output frame > > > > > On Nov 1, 2022, at 12:58, Xiang, Haihao <haihao.xiang-at- > intel.com@ffmpeg.org> wrote: > > > > On Mon, 2022-10-24 at 23:04 +0000, softworkz wrote: > >> From: softworkz <softworkz@hotmail.com> > >> > >> Signed-off-by: softworkz <softworkz@hotmail.com> > >> --- > >> libavfilter/qsvvpp.c | 6 ++++++ > >> libavfilter/vf_overlay_qsv.c | 19 +++++++++++++++---- > >> 2 files changed, 21 insertions(+), 4 deletions(-) > >> > >> diff --git a/libavfilter/qsvvpp.c b/libavfilter/qsvvpp.c > >> index 8428ee89ab..ae9766d12f 100644 > >> --- a/libavfilter/qsvvpp.c > >> +++ b/libavfilter/qsvvpp.c > >> @@ -880,6 +880,12 @@ int ff_qsvvpp_filter_frame(QSVVPPContext *s, > AVFilterLink > >> *inlink, AVFrame *picr > >> return AVERROR(EAGAIN); > >> break; > >> } > >> + > >> + av_frame_remove_all_side_data(out_frame->frame); > >> + ret = av_frame_copy_side_data(out_frame->frame, in_frame- > >frame, 0); > >> + if (ret < 0) > >> + return ret; > >> + > >> out_frame->frame->pts = av_rescale_q(out_frame- > >>> surface.Data.TimeStamp, > >> default_tb, outlink- > >time_base); > >> > >> diff --git a/libavfilter/vf_overlay_qsv.c > b/libavfilter/vf_overlay_qsv.c > >> index d947a1faa1..04fd284b92 100644 > >> --- a/libavfilter/vf_overlay_qsv.c > >> +++ b/libavfilter/vf_overlay_qsv.c > >> @@ -231,13 +231,24 @@ static int process_frame(FFFrameSync *fs) > >> { > >> AVFilterContext *ctx = fs->parent; > >> QSVOverlayContext *s = fs->opaque; > >> + AVFrame *frame0 = NULL; > >> AVFrame *frame = NULL; > >> - int ret = 0, i; > >> + int ret = 0; > >> > >> - for (i = 0; i < ctx->nb_inputs; i++) { > >> + for (unsigned i = 0; i < ctx->nb_inputs; i++) { > >> ret = ff_framesync_get_frame(fs, i, &frame, 0); > >> - if (ret == 0) > >> - ret = ff_qsvvpp_filter_frame(s->qsv, ctx->inputs[i], > frame); > >> + > >> + if (ret == 0) { > >> + if (i == 0) > >> + frame0 = frame; > >> + else { > >> + av_frame_remove_all_side_data(frame); > >> + ret = av_frame_copy_side_data(frame, frame0, 0); > >> + } > >> + > >> + ret = ret < 0 ? ret : ff_qsvvpp_filter_frame(s->qsv, > ctx- > >>> inputs[i], frame); > >> + } > >> + > >> if (ret < 0 && ret != AVERROR(EAGAIN)) > >> break; > >> } > > > > Patchset LGTM, I'll push this patchset if no more comment or > objection. > > avcodec/vpp_qsv: Copy side data from input to output frame > ^^^^^^^ > > avcodec -> avfilter > Good catch! Thank you, sw _______________________________________________ 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". ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [FFmpeg-devel] [PATCH 2/2] avcodec/vpp_qsv: Copy side data from input to output frame 2022-11-01 4:58 ` Xiang, Haihao 2022-11-01 9:17 ` "zhilizhao(赵志立)" @ 2022-11-02 4:23 ` Andreas Rheinhardt 2022-11-02 6:05 ` Xiang, Haihao 1 sibling, 1 reply; 12+ messages in thread From: Andreas Rheinhardt @ 2022-11-02 4:23 UTC (permalink / raw) To: ffmpeg-devel Xiang, Haihao: > On Mon, 2022-10-24 at 23:04 +0000, softworkz wrote: >> From: softworkz <softworkz@hotmail.com> >> >> Signed-off-by: softworkz <softworkz@hotmail.com> >> --- >> libavfilter/qsvvpp.c | 6 ++++++ >> libavfilter/vf_overlay_qsv.c | 19 +++++++++++++++---- >> 2 files changed, 21 insertions(+), 4 deletions(-) >> >> diff --git a/libavfilter/qsvvpp.c b/libavfilter/qsvvpp.c >> index 8428ee89ab..ae9766d12f 100644 >> --- a/libavfilter/qsvvpp.c >> +++ b/libavfilter/qsvvpp.c >> @@ -880,6 +880,12 @@ int ff_qsvvpp_filter_frame(QSVVPPContext *s, AVFilterLink >> *inlink, AVFrame *picr >> return AVERROR(EAGAIN); >> break; >> } >> + >> + av_frame_remove_all_side_data(out_frame->frame); >> + ret = av_frame_copy_side_data(out_frame->frame, in_frame->frame, 0); >> + if (ret < 0) >> + return ret; >> + >> out_frame->frame->pts = av_rescale_q(out_frame- >>> surface.Data.TimeStamp, >> default_tb, outlink->time_base); >> >> diff --git a/libavfilter/vf_overlay_qsv.c b/libavfilter/vf_overlay_qsv.c >> index d947a1faa1..04fd284b92 100644 >> --- a/libavfilter/vf_overlay_qsv.c >> +++ b/libavfilter/vf_overlay_qsv.c >> @@ -231,13 +231,24 @@ static int process_frame(FFFrameSync *fs) >> { >> AVFilterContext *ctx = fs->parent; >> QSVOverlayContext *s = fs->opaque; >> + AVFrame *frame0 = NULL; >> AVFrame *frame = NULL; >> - int ret = 0, i; >> + int ret = 0; >> >> - for (i = 0; i < ctx->nb_inputs; i++) { >> + for (unsigned i = 0; i < ctx->nb_inputs; i++) { >> ret = ff_framesync_get_frame(fs, i, &frame, 0); >> - if (ret == 0) >> - ret = ff_qsvvpp_filter_frame(s->qsv, ctx->inputs[i], frame); >> + >> + if (ret == 0) { >> + if (i == 0) >> + frame0 = frame; >> + else { >> + av_frame_remove_all_side_data(frame); >> + ret = av_frame_copy_side_data(frame, frame0, 0); >> + } >> + >> + ret = ret < 0 ? ret : ff_qsvvpp_filter_frame(s->qsv, ctx- >>> inputs[i], frame); >> + } >> + >> if (ret < 0 && ret != AVERROR(EAGAIN)) >> break; >> } > > Patchset LGTM, I'll push this patchset if no more comment or objection. > Can you wait a few days on this? I'd like to take a look at #1. - Andreas _______________________________________________ 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". ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [FFmpeg-devel] [PATCH 2/2] avcodec/vpp_qsv: Copy side data from input to output frame 2022-11-02 4:23 ` Andreas Rheinhardt @ 2022-11-02 6:05 ` Xiang, Haihao 0 siblings, 0 replies; 12+ messages in thread From: Xiang, Haihao @ 2022-11-02 6:05 UTC (permalink / raw) To: ffmpeg-devel On Wed, 2022-11-02 at 05:23 +0100, Andreas Rheinhardt wrote: > Xiang, Haihao: > > On Mon, 2022-10-24 at 23:04 +0000, softworkz wrote: > > > From: softworkz <softworkz@hotmail.com> > > > > > > Signed-off-by: softworkz <softworkz@hotmail.com> > > > --- > > > libavfilter/qsvvpp.c | 6 ++++++ > > > libavfilter/vf_overlay_qsv.c | 19 +++++++++++++++---- > > > 2 files changed, 21 insertions(+), 4 deletions(-) > > > > > > diff --git a/libavfilter/qsvvpp.c b/libavfilter/qsvvpp.c > > > index 8428ee89ab..ae9766d12f 100644 > > > --- a/libavfilter/qsvvpp.c > > > +++ b/libavfilter/qsvvpp.c > > > @@ -880,6 +880,12 @@ int ff_qsvvpp_filter_frame(QSVVPPContext *s, > > > AVFilterLink > > > *inlink, AVFrame *picr > > > return AVERROR(EAGAIN); > > > break; > > > } > > > + > > > + av_frame_remove_all_side_data(out_frame->frame); > > > + ret = av_frame_copy_side_data(out_frame->frame, in_frame->frame, > > > 0); > > > + if (ret < 0) > > > + return ret; > > > + > > > out_frame->frame->pts = av_rescale_q(out_frame- > > > > surface.Data.TimeStamp, > > > default_tb, outlink- > > > >time_base); > > > > > > diff --git a/libavfilter/vf_overlay_qsv.c b/libavfilter/vf_overlay_qsv.c > > > index d947a1faa1..04fd284b92 100644 > > > --- a/libavfilter/vf_overlay_qsv.c > > > +++ b/libavfilter/vf_overlay_qsv.c > > > @@ -231,13 +231,24 @@ static int process_frame(FFFrameSync *fs) > > > { > > > AVFilterContext *ctx = fs->parent; > > > QSVOverlayContext *s = fs->opaque; > > > + AVFrame *frame0 = NULL; > > > AVFrame *frame = NULL; > > > - int ret = 0, i; > > > + int ret = 0; > > > > > > - for (i = 0; i < ctx->nb_inputs; i++) { > > > + for (unsigned i = 0; i < ctx->nb_inputs; i++) { > > > ret = ff_framesync_get_frame(fs, i, &frame, 0); > > > - if (ret == 0) > > > - ret = ff_qsvvpp_filter_frame(s->qsv, ctx->inputs[i], frame); > > > + > > > + if (ret == 0) { > > > + if (i == 0) > > > + frame0 = frame; > > > + else { > > > + av_frame_remove_all_side_data(frame); > > > + ret = av_frame_copy_side_data(frame, frame0, 0); > > > + } > > > + > > > + ret = ret < 0 ? ret : ff_qsvvpp_filter_frame(s->qsv, ctx- > > > > inputs[i], frame); > > > + } > > > + > > > if (ret < 0 && ret != AVERROR(EAGAIN)) > > > break; > > > } > > > > Patchset LGTM, I'll push this patchset if no more comment or objection. > > > > Can you wait a few days on this? I'd like to take a look at #1. Sure ofc, I can wait until no more comments about this patchset. Thanks Haihao _______________________________________________ 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". ^ permalink raw reply [flat|nested] 12+ messages in thread
* [FFmpeg-devel] [PATCH v2 0/2] QSV Overlay Filter: Copy side data from input to output frame 2022-10-24 23:04 [FFmpeg-devel] [PATCH 0/2] QSV Overlay Filter: Copy side data from input to output frame ffmpegagent 2022-10-24 23:04 ` [FFmpeg-devel] [PATCH 1/2] avutil/frame: Add av_frame_copy_side_data() and av_frame_remove_all_side_data() softworkz 2022-10-24 23:04 ` [FFmpeg-devel] [PATCH 2/2] avcodec/vpp_qsv: Copy side data from input to output frame softworkz @ 2022-11-03 11:41 ` ffmpegagent 2022-11-03 11:41 ` [FFmpeg-devel] [PATCH v2 1/2] avutil/frame: Add av_frame_copy_side_data() and av_frame_remove_all_side_data() softworkz 2022-11-03 11:41 ` [FFmpeg-devel] [PATCH v2 2/2] avfilter/vpp_qsv: Copy side-data from input to output frame softworkz 2 siblings, 2 replies; 12+ messages in thread From: ffmpegagent @ 2022-11-03 11:41 UTC (permalink / raw) To: ffmpeg-devel; +Cc: softworkz, Xiang, Haihao, Andreas Rheinhardt This is split out from my earlier patchset "SEI parsing for QSV decoders" (https://github.com/ffstaging/FFmpeg/pull/31) as it is only logically related but not technically. The first patch had been reviewed and partially authored by Anton (I have indicated this with a signed-off line, please advise in case this wouldn't be right) The second patch performs the copying of side data from input to output frames. softworkz v2: * Fix commit message (avcodec > avfilter) * Bump version in version.h * Resolve rebase conflicts softworkz (2): avutil/frame: Add av_frame_copy_side_data() and av_frame_remove_all_side_data() avfilter/vpp_qsv: Copy side-data from input to output frame doc/APIchanges | 4 +++ libavfilter/qsvvpp.c | 6 ++++ libavfilter/vf_overlay_qsv.c | 19 +++++++--- libavutil/frame.c | 67 ++++++++++++++++++++++-------------- libavutil/frame.h | 32 +++++++++++++++++ libavutil/version.h | 2 +- 6 files changed, 99 insertions(+), 31 deletions(-) base-commit: 5661c8715ce4f752e676bda75b332efc669694ed Published-As: https://github.com/ffstaging/FFmpeg/releases/tag/pr-ffstaging-44%2Fsoftworkz%2Fsubmit_copy_sidedata-v2 Fetch-It-Via: git fetch https://github.com/ffstaging/FFmpeg pr-ffstaging-44/softworkz/submit_copy_sidedata-v2 Pull-Request: https://github.com/ffstaging/FFmpeg/pull/44 Range-diff vs v1: 1: 28c4b9e324 ! 1: d8cdd25105 avutil/frame: Add av_frame_copy_side_data() and av_frame_remove_all_side_data() @@ doc/APIchanges: libavutil: 2021-04-27 API changes, most recent first: -+2022-05-26 - xxxxxxxxx - lavu 57.40.100 - frame.h ++2022-05-26 - xxxxxxxxx - lavu 57.41.100 - frame.h + Add av_frame_remove_all_side_data(), av_frame_copy_side_data(), + AV_FRAME_TRANSFER_SD_COPY, and AV_FRAME_TRANSFER_SD_FILTER. -+ - 2022-10-11 - xxxxxxxxxx - lavu 57.39.101 - pixfmt.h - Add AV_PIX_FMT_RGBF32 and AV_PIX_FMT_RGBAF32. ++ + 2022-10-30 - xxxxxxxxxx - lavu 57.40.100 - channel_layout.h + Add AV_CH_LAYOUT_CUBE and AV_CHANNEL_LAYOUT_CUBE. ## libavutil/frame.c ## @@ libavutil/version.h */ #define LIBAVUTIL_VERSION_MAJOR 57 --#define LIBAVUTIL_VERSION_MINOR 39 --#define LIBAVUTIL_VERSION_MICRO 101 -+#define LIBAVUTIL_VERSION_MINOR 40 -+#define LIBAVUTIL_VERSION_MICRO 100 +-#define LIBAVUTIL_VERSION_MINOR 40 ++#define LIBAVUTIL_VERSION_MINOR 41 + #define LIBAVUTIL_VERSION_MICRO 100 #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ - LIBAVUTIL_VERSION_MINOR, \ 2: 43eb3257af ! 2: 0e71469a87 avcodec/vpp_qsv: Copy side data from input to output frame @@ Metadata Author: softworkz <softworkz@hotmail.com> ## Commit message ## - avcodec/vpp_qsv: Copy side data from input to output frame + avfilter/vpp_qsv: Copy side-data from input to output frame Signed-off-by: softworkz <softworkz@hotmail.com> -- ffmpeg-codebot _______________________________________________ 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". ^ permalink raw reply [flat|nested] 12+ messages in thread
* [FFmpeg-devel] [PATCH v2 1/2] avutil/frame: Add av_frame_copy_side_data() and av_frame_remove_all_side_data() 2022-11-03 11:41 ` [FFmpeg-devel] [PATCH v2 0/2] QSV Overlay Filter: " ffmpegagent @ 2022-11-03 11:41 ` softworkz 2022-11-28 5:04 ` Xiang, Haihao 2022-11-03 11:41 ` [FFmpeg-devel] [PATCH v2 2/2] avfilter/vpp_qsv: Copy side-data from input to output frame softworkz 1 sibling, 1 reply; 12+ messages in thread From: softworkz @ 2022-11-03 11:41 UTC (permalink / raw) To: ffmpeg-devel; +Cc: softworkz, Xiang, Haihao, Andreas Rheinhardt From: softworkz <softworkz@hotmail.com> Signed-off-by: softworkz <softworkz@hotmail.com> Signed-off-by: Anton Khirnov <anton@khirnov.net> --- doc/APIchanges | 4 +++ libavutil/frame.c | 67 +++++++++++++++++++++++++++------------------ libavutil/frame.h | 32 ++++++++++++++++++++++ libavutil/version.h | 2 +- 4 files changed, 78 insertions(+), 27 deletions(-) diff --git a/doc/APIchanges b/doc/APIchanges index 3c86f24285..e88cf7b4aa 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -14,6 +14,10 @@ libavutil: 2021-04-27 API changes, most recent first: +2022-05-26 - xxxxxxxxx - lavu 57.41.100 - frame.h + Add av_frame_remove_all_side_data(), av_frame_copy_side_data(), + AV_FRAME_TRANSFER_SD_COPY, and AV_FRAME_TRANSFER_SD_FILTER. + 2022-10-30 - xxxxxxxxxx - lavu 57.40.100 - channel_layout.h Add AV_CH_LAYOUT_CUBE and AV_CHANNEL_LAYOUT_CUBE. diff --git a/libavutil/frame.c b/libavutil/frame.c index de4ad1f94d..8eb0e1ec95 100644 --- a/libavutil/frame.c +++ b/libavutil/frame.c @@ -276,9 +276,45 @@ FF_ENABLE_DEPRECATION_WARNINGS return AVERROR(EINVAL); } +void av_frame_remove_all_side_data(AVFrame *frame) +{ + wipe_side_data(frame); +} + +int av_frame_copy_side_data(AVFrame* dst, const AVFrame* src, int flags) +{ + for (unsigned i = 0; i < src->nb_side_data; i++) { + const AVFrameSideData *sd_src = src->side_data[i]; + AVFrameSideData *sd_dst; + if ((flags & AV_FRAME_TRANSFER_SD_FILTER) && + sd_src->type == AV_FRAME_DATA_PANSCAN && + (src->width != dst->width || src->height != dst->height)) + continue; + if (flags & AV_FRAME_TRANSFER_SD_COPY) { + sd_dst = av_frame_new_side_data(dst, sd_src->type, + sd_src->size); + if (!sd_dst) { + wipe_side_data(dst); + return AVERROR(ENOMEM); + } + memcpy(sd_dst->data, sd_src->data, sd_src->size); + } else { + AVBufferRef *ref = av_buffer_ref(sd_src->buf); + sd_dst = av_frame_new_side_data_from_buf(dst, sd_src->type, ref); + if (!sd_dst) { + av_buffer_unref(&ref); + wipe_side_data(dst); + return AVERROR(ENOMEM); + } + } + av_dict_copy(&sd_dst->metadata, sd_src->metadata, 0); + } + return 0; +} + static int frame_copy_props(AVFrame *dst, const AVFrame *src, int force_copy) { - int ret, i; + int ret; dst->key_frame = src->key_frame; dst->pict_type = src->pict_type; @@ -319,31 +355,10 @@ FF_ENABLE_DEPRECATION_WARNINGS av_dict_copy(&dst->metadata, src->metadata, 0); - for (i = 0; i < src->nb_side_data; i++) { - const AVFrameSideData *sd_src = src->side_data[i]; - AVFrameSideData *sd_dst; - if ( sd_src->type == AV_FRAME_DATA_PANSCAN - && (src->width != dst->width || src->height != dst->height)) - continue; - if (force_copy) { - sd_dst = av_frame_new_side_data(dst, sd_src->type, - sd_src->size); - if (!sd_dst) { - wipe_side_data(dst); - return AVERROR(ENOMEM); - } - memcpy(sd_dst->data, sd_src->data, sd_src->size); - } else { - AVBufferRef *ref = av_buffer_ref(sd_src->buf); - sd_dst = av_frame_new_side_data_from_buf(dst, sd_src->type, ref); - if (!sd_dst) { - av_buffer_unref(&ref); - wipe_side_data(dst); - return AVERROR(ENOMEM); - } - } - av_dict_copy(&sd_dst->metadata, sd_src->metadata, 0); - } + if ((ret = av_frame_copy_side_data(dst, src, + (force_copy ? AV_FRAME_TRANSFER_SD_COPY : 0) | + AV_FRAME_TRANSFER_SD_FILTER) < 0)) + return ret; ret = av_buffer_replace(&dst->opaque_ref, src->opaque_ref); ret |= av_buffer_replace(&dst->private_ref, src->private_ref); diff --git a/libavutil/frame.h b/libavutil/frame.h index e60a82f6c0..5a3362fb55 100644 --- a/libavutil/frame.h +++ b/libavutil/frame.h @@ -861,6 +861,30 @@ int av_frame_copy(AVFrame *dst, const AVFrame *src); */ int av_frame_copy_props(AVFrame *dst, const AVFrame *src); + +/** + * Copy side data, rather than creating new references. + */ +#define AV_FRAME_TRANSFER_SD_COPY (1 << 0) +/** + * Filter out side data that does not match dst properties. + */ +#define AV_FRAME_TRANSFER_SD_FILTER (1 << 1) + +/** + * Copy all side-data from src to dst. + * + * @param dst a frame to which the side data should be copied. + * @param src a frame from which to copy the side data. + * @param flags a combination of AV_FRAME_TRANSFER_SD_* + * + * @return 0 on success, a negative AVERROR on error. + * + * @note This function will create new references to side data buffers in src, + * unless the AV_FRAME_TRANSFER_SD_COPY flag is passed. + */ +int av_frame_copy_side_data(AVFrame* dst, const AVFrame* src, int flags); + /** * Get the buffer reference a given data plane is stored in. * @@ -913,6 +937,14 @@ AVFrameSideData *av_frame_get_side_data(const AVFrame *frame, */ void av_frame_remove_side_data(AVFrame *frame, enum AVFrameSideDataType type); +/** + * Remove and free all side data instances. + * + * @param frame from which to remove all side data. + */ +void av_frame_remove_all_side_data(AVFrame *frame); + + /** * Flags for frame cropping. diff --git a/libavutil/version.h b/libavutil/version.h index 2df788e529..b913f9d6c5 100644 --- a/libavutil/version.h +++ b/libavutil/version.h @@ -79,7 +79,7 @@ */ #define LIBAVUTIL_VERSION_MAJOR 57 -#define LIBAVUTIL_VERSION_MINOR 40 +#define LIBAVUTIL_VERSION_MINOR 41 #define LIBAVUTIL_VERSION_MICRO 100 #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ -- ffmpeg-codebot _______________________________________________ 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". ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [FFmpeg-devel] [PATCH v2 1/2] avutil/frame: Add av_frame_copy_side_data() and av_frame_remove_all_side_data() 2022-11-03 11:41 ` [FFmpeg-devel] [PATCH v2 1/2] avutil/frame: Add av_frame_copy_side_data() and av_frame_remove_all_side_data() softworkz @ 2022-11-28 5:04 ` Xiang, Haihao 0 siblings, 0 replies; 12+ messages in thread From: Xiang, Haihao @ 2022-11-28 5:04 UTC (permalink / raw) To: ffmpeg-devel; +Cc: softworkz, haihao.xiang-at-intel.com, andreas.rheinhardt On Thu, 2022-11-03 at 11:41 +0000, softworkz wrote: > From: softworkz <softworkz@hotmail.com> > > Signed-off-by: softworkz <softworkz@hotmail.com> > Signed-off-by: Anton Khirnov <anton@khirnov.net> > --- > doc/APIchanges | 4 +++ > libavutil/frame.c | 67 +++++++++++++++++++++++++++------------------ > libavutil/frame.h | 32 ++++++++++++++++++++++ > libavutil/version.h | 2 +- > 4 files changed, 78 insertions(+), 27 deletions(-) > > diff --git a/doc/APIchanges b/doc/APIchanges > index 3c86f24285..e88cf7b4aa 100644 > --- a/doc/APIchanges > +++ b/doc/APIchanges > @@ -14,6 +14,10 @@ libavutil: 2021-04-27 > > API changes, most recent first: > > +2022-05-26 - xxxxxxxxx - lavu 57.41.100 - frame.h > + Add av_frame_remove_all_side_data(), av_frame_copy_side_data(), > + AV_FRAME_TRANSFER_SD_COPY, and AV_FRAME_TRANSFER_SD_FILTER. > + > 2022-10-30 - xxxxxxxxxx - lavu 57.40.100 - channel_layout.h > Add AV_CH_LAYOUT_CUBE and AV_CHANNEL_LAYOUT_CUBE. > > diff --git a/libavutil/frame.c b/libavutil/frame.c > index de4ad1f94d..8eb0e1ec95 100644 > --- a/libavutil/frame.c > +++ b/libavutil/frame.c > @@ -276,9 +276,45 @@ FF_ENABLE_DEPRECATION_WARNINGS > return AVERROR(EINVAL); > } > > +void av_frame_remove_all_side_data(AVFrame *frame) > +{ > + wipe_side_data(frame); > +} > + > +int av_frame_copy_side_data(AVFrame* dst, const AVFrame* src, int flags) > +{ > + for (unsigned i = 0; i < src->nb_side_data; i++) { > + const AVFrameSideData *sd_src = src->side_data[i]; > + AVFrameSideData *sd_dst; > + if ((flags & AV_FRAME_TRANSFER_SD_FILTER) && > + sd_src->type == AV_FRAME_DATA_PANSCAN && > + (src->width != dst->width || src->height != dst->height)) > + continue; > + if (flags & AV_FRAME_TRANSFER_SD_COPY) { > + sd_dst = av_frame_new_side_data(dst, sd_src->type, > + sd_src->size); > + if (!sd_dst) { > + wipe_side_data(dst); > + return AVERROR(ENOMEM); > + } > + memcpy(sd_dst->data, sd_src->data, sd_src->size); > + } else { > + AVBufferRef *ref = av_buffer_ref(sd_src->buf); > + sd_dst = av_frame_new_side_data_from_buf(dst, sd_src->type, ref); > + if (!sd_dst) { > + av_buffer_unref(&ref); > + wipe_side_data(dst); > + return AVERROR(ENOMEM); > + } > + } > + av_dict_copy(&sd_dst->metadata, sd_src->metadata, 0); > + } > + return 0; > +} > + > static int frame_copy_props(AVFrame *dst, const AVFrame *src, int force_copy) > { > - int ret, i; > + int ret; > > dst->key_frame = src->key_frame; > dst->pict_type = src->pict_type; > @@ -319,31 +355,10 @@ FF_ENABLE_DEPRECATION_WARNINGS > > av_dict_copy(&dst->metadata, src->metadata, 0); > > - for (i = 0; i < src->nb_side_data; i++) { > - const AVFrameSideData *sd_src = src->side_data[i]; > - AVFrameSideData *sd_dst; > - if ( sd_src->type == AV_FRAME_DATA_PANSCAN > - && (src->width != dst->width || src->height != dst->height)) > - continue; > - if (force_copy) { > - sd_dst = av_frame_new_side_data(dst, sd_src->type, > - sd_src->size); > - if (!sd_dst) { > - wipe_side_data(dst); > - return AVERROR(ENOMEM); > - } > - memcpy(sd_dst->data, sd_src->data, sd_src->size); > - } else { > - AVBufferRef *ref = av_buffer_ref(sd_src->buf); > - sd_dst = av_frame_new_side_data_from_buf(dst, sd_src->type, ref); > - if (!sd_dst) { > - av_buffer_unref(&ref); > - wipe_side_data(dst); > - return AVERROR(ENOMEM); > - } > - } > - av_dict_copy(&sd_dst->metadata, sd_src->metadata, 0); > - } > + if ((ret = av_frame_copy_side_data(dst, src, > + (force_copy ? AV_FRAME_TRANSFER_SD_COPY : 0) | > + AV_FRAME_TRANSFER_SD_FILTER) < 0)) > + return ret; > > ret = av_buffer_replace(&dst->opaque_ref, src->opaque_ref); > ret |= av_buffer_replace(&dst->private_ref, src->private_ref); > diff --git a/libavutil/frame.h b/libavutil/frame.h > index e60a82f6c0..5a3362fb55 100644 > --- a/libavutil/frame.h > +++ b/libavutil/frame.h > @@ -861,6 +861,30 @@ int av_frame_copy(AVFrame *dst, const AVFrame *src); > */ > int av_frame_copy_props(AVFrame *dst, const AVFrame *src); > > + > +/** > + * Copy side data, rather than creating new references. > + */ > +#define AV_FRAME_TRANSFER_SD_COPY (1 << 0) > +/** > + * Filter out side data that does not match dst properties. > + */ > +#define AV_FRAME_TRANSFER_SD_FILTER (1 << 1) > + > +/** > + * Copy all side-data from src to dst. > + * > + * @param dst a frame to which the side data should be copied. > + * @param src a frame from which to copy the side data. > + * @param flags a combination of AV_FRAME_TRANSFER_SD_* > + * > + * @return 0 on success, a negative AVERROR on error. > + * > + * @note This function will create new references to side data buffers in > src, > + * unless the AV_FRAME_TRANSFER_SD_COPY flag is passed. > + */ > +int av_frame_copy_side_data(AVFrame* dst, const AVFrame* src, int flags); > + > /** > * Get the buffer reference a given data plane is stored in. > * > @@ -913,6 +937,14 @@ AVFrameSideData *av_frame_get_side_data(const AVFrame > *frame, > */ > void av_frame_remove_side_data(AVFrame *frame, enum AVFrameSideDataType > type); > > +/** > + * Remove and free all side data instances. > + * > + * @param frame from which to remove all side data. > + */ > +void av_frame_remove_all_side_data(AVFrame *frame); > + > + > > /** > * Flags for frame cropping. > diff --git a/libavutil/version.h b/libavutil/version.h > index 2df788e529..b913f9d6c5 100644 > --- a/libavutil/version.h > +++ b/libavutil/version.h > @@ -79,7 +79,7 @@ > */ > > #define LIBAVUTIL_VERSION_MAJOR 57 > -#define LIBAVUTIL_VERSION_MINOR 40 > +#define LIBAVUTIL_VERSION_MINOR 41 > #define LIBAVUTIL_VERSION_MICRO 100 > > #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ >>> Patchset LGTM, I'll push this patchset if no more comment or objection. >> Can you wait a few days on this? I'd like to take a look at #1. Hi Andreas, Do you have any other thought about this patchset ? I'd like to merge this patchset to fix qsv overlay. BRs Haihao _______________________________________________ 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". ^ permalink raw reply [flat|nested] 12+ messages in thread
* [FFmpeg-devel] [PATCH v2 2/2] avfilter/vpp_qsv: Copy side-data from input to output frame 2022-11-03 11:41 ` [FFmpeg-devel] [PATCH v2 0/2] QSV Overlay Filter: " ffmpegagent 2022-11-03 11:41 ` [FFmpeg-devel] [PATCH v2 1/2] avutil/frame: Add av_frame_copy_side_data() and av_frame_remove_all_side_data() softworkz @ 2022-11-03 11:41 ` softworkz 1 sibling, 0 replies; 12+ messages in thread From: softworkz @ 2022-11-03 11:41 UTC (permalink / raw) To: ffmpeg-devel; +Cc: softworkz, Xiang, Haihao, Andreas Rheinhardt From: softworkz <softworkz@hotmail.com> Signed-off-by: softworkz <softworkz@hotmail.com> --- libavfilter/qsvvpp.c | 6 ++++++ libavfilter/vf_overlay_qsv.c | 19 +++++++++++++++---- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/libavfilter/qsvvpp.c b/libavfilter/qsvvpp.c index 8428ee89ab..ae9766d12f 100644 --- a/libavfilter/qsvvpp.c +++ b/libavfilter/qsvvpp.c @@ -880,6 +880,12 @@ int ff_qsvvpp_filter_frame(QSVVPPContext *s, AVFilterLink *inlink, AVFrame *picr return AVERROR(EAGAIN); break; } + + av_frame_remove_all_side_data(out_frame->frame); + ret = av_frame_copy_side_data(out_frame->frame, in_frame->frame, 0); + if (ret < 0) + return ret; + out_frame->frame->pts = av_rescale_q(out_frame->surface.Data.TimeStamp, default_tb, outlink->time_base); diff --git a/libavfilter/vf_overlay_qsv.c b/libavfilter/vf_overlay_qsv.c index d947a1faa1..04fd284b92 100644 --- a/libavfilter/vf_overlay_qsv.c +++ b/libavfilter/vf_overlay_qsv.c @@ -231,13 +231,24 @@ static int process_frame(FFFrameSync *fs) { AVFilterContext *ctx = fs->parent; QSVOverlayContext *s = fs->opaque; + AVFrame *frame0 = NULL; AVFrame *frame = NULL; - int ret = 0, i; + int ret = 0; - for (i = 0; i < ctx->nb_inputs; i++) { + for (unsigned i = 0; i < ctx->nb_inputs; i++) { ret = ff_framesync_get_frame(fs, i, &frame, 0); - if (ret == 0) - ret = ff_qsvvpp_filter_frame(s->qsv, ctx->inputs[i], frame); + + if (ret == 0) { + if (i == 0) + frame0 = frame; + else { + av_frame_remove_all_side_data(frame); + ret = av_frame_copy_side_data(frame, frame0, 0); + } + + ret = ret < 0 ? ret : ff_qsvvpp_filter_frame(s->qsv, ctx->inputs[i], frame); + } + if (ret < 0 && ret != AVERROR(EAGAIN)) break; } -- ffmpeg-codebot _______________________________________________ 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". ^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2022-11-28 5:05 UTC | newest] Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2022-10-24 23:04 [FFmpeg-devel] [PATCH 0/2] QSV Overlay Filter: Copy side data from input to output frame ffmpegagent 2022-10-24 23:04 ` [FFmpeg-devel] [PATCH 1/2] avutil/frame: Add av_frame_copy_side_data() and av_frame_remove_all_side_data() softworkz 2022-10-24 23:04 ` [FFmpeg-devel] [PATCH 2/2] avcodec/vpp_qsv: Copy side data from input to output frame softworkz 2022-11-01 4:58 ` Xiang, Haihao 2022-11-01 9:17 ` "zhilizhao(赵志立)" 2022-11-02 22:44 ` Soft Works 2022-11-02 4:23 ` Andreas Rheinhardt 2022-11-02 6:05 ` Xiang, Haihao 2022-11-03 11:41 ` [FFmpeg-devel] [PATCH v2 0/2] QSV Overlay Filter: " ffmpegagent 2022-11-03 11:41 ` [FFmpeg-devel] [PATCH v2 1/2] avutil/frame: Add av_frame_copy_side_data() and av_frame_remove_all_side_data() softworkz 2022-11-28 5:04 ` Xiang, Haihao 2022-11-03 11:41 ` [FFmpeg-devel] [PATCH v2 2/2] avfilter/vpp_qsv: Copy side-data from input to output frame softworkz
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