Re: [FFmpeg-devel] [PATCH 1/3] avutil/frame: make frame copy functions hwframe aware
On 27.03.2020 21:53, James Almer wrote: On 3/27/2020 5:43 PM, Timo Rothenpieler wrote: --- libavutil/frame.c | 23 --- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/libavutil/frame.c b/libavutil/frame.c index e4038096c2..0c64f4a422 100644 --- a/libavutil/frame.c +++ b/libavutil/frame.c @@ -25,6 +25,7 @@ #include "imgutils.h" #include "mem.h" #include "samplefmt.h" +#include "hwcontext.h" #if FF_API_FRAME_GET_SET MAKE_ACCESSORS(AVFrame, frame, int64_t, best_effort_timestamp) @@ -626,9 +627,22 @@ int av_frame_make_writable(AVFrame *frame) tmp.channels = frame->channels; tmp.channel_layout = frame->channel_layout; tmp.nb_samples = frame->nb_samples; -ret = av_frame_get_buffer(, 32); -if (ret < 0) -return ret; + +if (frame->hw_frames_ctx) { +ret = av_hwframe_get_buffer(frame->hw_frames_ctx, , 0); +if (ret < 0) +return ret; + +tmp.hw_frames_ctx = av_buffer_ref(frame->hw_frames_ctx); This is already done by av_hwframe_get_buffer(). Indeed. Fixed locally. +if (!tmp.hw_frames_ctx) { +av_frame_unref(); +return AVERROR(ENOMEM); +} +} else { +ret = av_frame_get_buffer(, 32); +if (ret < 0) +return ret; +} ret = av_frame_copy(, frame); if (ret < 0) { @@ -752,6 +766,9 @@ static int frame_copy_video(AVFrame *dst, const AVFrame *src) dst->height < src->height) return AVERROR(EINVAL); +if (src->hw_frames_ctx || dst->hw_frames_ctx) +return av_hwframe_transfer_data(dst, src, 0); Not all the hwcontext implementations support hw -> hw transfers, like OpenCL and Vulkan. OpenCL returns EINVAL but Vulkan ENOSYS, so that's fun. The former should be changed i think. The copy would fail either way for hwframes, so I intentionally did not put any further checks here, and leave that kinda logic to av_hwframe_transfer_data. ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
Re: [FFmpeg-devel] [PATCH 1/3] avutil/frame: make frame copy functions hwframe aware
On 3/27/2020 5:43 PM, Timo Rothenpieler wrote: > --- > libavutil/frame.c | 23 --- > 1 file changed, 20 insertions(+), 3 deletions(-) > > diff --git a/libavutil/frame.c b/libavutil/frame.c > index e4038096c2..0c64f4a422 100644 > --- a/libavutil/frame.c > +++ b/libavutil/frame.c > @@ -25,6 +25,7 @@ > #include "imgutils.h" > #include "mem.h" > #include "samplefmt.h" > +#include "hwcontext.h" > > #if FF_API_FRAME_GET_SET > MAKE_ACCESSORS(AVFrame, frame, int64_t, best_effort_timestamp) > @@ -626,9 +627,22 @@ int av_frame_make_writable(AVFrame *frame) > tmp.channels = frame->channels; > tmp.channel_layout = frame->channel_layout; > tmp.nb_samples = frame->nb_samples; > -ret = av_frame_get_buffer(, 32); > -if (ret < 0) > -return ret; > + > +if (frame->hw_frames_ctx) { > +ret = av_hwframe_get_buffer(frame->hw_frames_ctx, , 0); > +if (ret < 0) > +return ret; > + > +tmp.hw_frames_ctx = av_buffer_ref(frame->hw_frames_ctx); This is already done by av_hwframe_get_buffer(). > +if (!tmp.hw_frames_ctx) { > +av_frame_unref(); > +return AVERROR(ENOMEM); > +} > +} else { > +ret = av_frame_get_buffer(, 32); > +if (ret < 0) > +return ret; > +} > > ret = av_frame_copy(, frame); > if (ret < 0) { > @@ -752,6 +766,9 @@ static int frame_copy_video(AVFrame *dst, const AVFrame > *src) > dst->height < src->height) > return AVERROR(EINVAL); > > +if (src->hw_frames_ctx || dst->hw_frames_ctx) > +return av_hwframe_transfer_data(dst, src, 0); Not all the hwcontext implementations support hw -> hw transfers, like OpenCL and Vulkan. OpenCL returns EINVAL but Vulkan ENOSYS, so that's fun. The former should be changed i think. > + > planes = av_pix_fmt_count_planes(dst->format); > for (i = 0; i < planes; i++) > if (!dst->data[i] || !src->data[i]) > ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
[FFmpeg-devel] [PATCH 1/3] avutil/frame: make frame copy functions hwframe aware
--- libavutil/frame.c | 23 --- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/libavutil/frame.c b/libavutil/frame.c index e4038096c2..0c64f4a422 100644 --- a/libavutil/frame.c +++ b/libavutil/frame.c @@ -25,6 +25,7 @@ #include "imgutils.h" #include "mem.h" #include "samplefmt.h" +#include "hwcontext.h" #if FF_API_FRAME_GET_SET MAKE_ACCESSORS(AVFrame, frame, int64_t, best_effort_timestamp) @@ -626,9 +627,22 @@ int av_frame_make_writable(AVFrame *frame) tmp.channels = frame->channels; tmp.channel_layout = frame->channel_layout; tmp.nb_samples = frame->nb_samples; -ret = av_frame_get_buffer(, 32); -if (ret < 0) -return ret; + +if (frame->hw_frames_ctx) { +ret = av_hwframe_get_buffer(frame->hw_frames_ctx, , 0); +if (ret < 0) +return ret; + +tmp.hw_frames_ctx = av_buffer_ref(frame->hw_frames_ctx); +if (!tmp.hw_frames_ctx) { +av_frame_unref(); +return AVERROR(ENOMEM); +} +} else { +ret = av_frame_get_buffer(, 32); +if (ret < 0) +return ret; +} ret = av_frame_copy(, frame); if (ret < 0) { @@ -752,6 +766,9 @@ static int frame_copy_video(AVFrame *dst, const AVFrame *src) dst->height < src->height) return AVERROR(EINVAL); +if (src->hw_frames_ctx || dst->hw_frames_ctx) +return av_hwframe_transfer_data(dst, src, 0); + planes = av_pix_fmt_count_planes(dst->format); for (i = 0; i < planes; i++) if (!dst->data[i] || !src->data[i]) -- 2.20.1 ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".