|
|
|
@ -18,6 +18,7 @@ |
|
|
|
|
|
|
|
|
|
#include "config.h" |
|
|
|
|
|
|
|
|
|
#include "avassert.h" |
|
|
|
|
#include "buffer.h" |
|
|
|
|
#include "common.h" |
|
|
|
|
#include "hwcontext.h" |
|
|
|
@ -788,6 +789,8 @@ fail: |
|
|
|
|
|
|
|
|
|
int av_hwframe_map(AVFrame *dst, const AVFrame *src, int flags) |
|
|
|
|
{ |
|
|
|
|
AVBufferRef *orig_dst_frames = dst->hw_frames_ctx; |
|
|
|
|
enum AVPixelFormat orig_dst_fmt = dst->format; |
|
|
|
|
AVHWFramesContext *src_frames, *dst_frames; |
|
|
|
|
HWMapDescriptor *hwmap; |
|
|
|
|
int ret; |
|
|
|
@ -824,8 +827,10 @@ int av_hwframe_map(AVFrame *dst, const AVFrame *src, int flags) |
|
|
|
|
src_frames->internal->hw_type->map_from) { |
|
|
|
|
ret = src_frames->internal->hw_type->map_from(src_frames, |
|
|
|
|
dst, src, flags); |
|
|
|
|
if (ret != AVERROR(ENOSYS)) |
|
|
|
|
if (ret >= 0) |
|
|
|
|
return ret; |
|
|
|
|
else if (ret != AVERROR(ENOSYS)) |
|
|
|
|
goto fail; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -836,12 +841,30 @@ int av_hwframe_map(AVFrame *dst, const AVFrame *src, int flags) |
|
|
|
|
dst_frames->internal->hw_type->map_to) { |
|
|
|
|
ret = dst_frames->internal->hw_type->map_to(dst_frames, |
|
|
|
|
dst, src, flags); |
|
|
|
|
if (ret != AVERROR(ENOSYS)) |
|
|
|
|
if (ret >= 0) |
|
|
|
|
return ret; |
|
|
|
|
else if (ret != AVERROR(ENOSYS)) |
|
|
|
|
goto fail; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return AVERROR(ENOSYS); |
|
|
|
|
|
|
|
|
|
fail: |
|
|
|
|
// if the caller provided dst frames context, it should be preserved
|
|
|
|
|
// by this function
|
|
|
|
|
av_assert0(orig_dst_frames == NULL || |
|
|
|
|
orig_dst_frames == dst->hw_frames_ctx); |
|
|
|
|
|
|
|
|
|
// preserve user-provided dst frame fields, but clean
|
|
|
|
|
// anything we might have set
|
|
|
|
|
dst->hw_frames_ctx = NULL; |
|
|
|
|
av_frame_unref(dst); |
|
|
|
|
|
|
|
|
|
dst->hw_frames_ctx = orig_dst_frames; |
|
|
|
|
dst->format = orig_dst_fmt; |
|
|
|
|
|
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int av_hwframe_ctx_create_derived(AVBufferRef **derived_frame_ctx, |
|
|
|
|