--- 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(&tmp, 32); - if (ret < 0) - return ret; + + if (frame->hw_frames_ctx) { + ret = av_hwframe_get_buffer(frame->hw_frames_ctx, &tmp, 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(&tmp); + return AVERROR(ENOMEM); + } + } else { + ret = av_frame_get_buffer(&tmp, 32); + if (ret < 0) + return ret; + } ret = av_frame_copy(&tmp, 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".