--- libavutil/hwcontext_vaapi.c | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-)
diff --git a/libavutil/hwcontext_vaapi.c b/libavutil/hwcontext_vaapi.c index bba0c4d..a9fcf0c 100644 --- a/libavutil/hwcontext_vaapi.c +++ b/libavutil/hwcontext_vaapi.c @@ -34,6 +34,7 @@ #include "avassert.h" #include "buffer.h" #include "common.h" +#include "imgutils.h" #include "hwcontext.h" #include "hwcontext_internal.h" #include "hwcontext_vaapi.h" @@ -806,7 +807,9 @@ fail: static int vaapi_transfer_data_from(AVHWFramesContext *hwfc, AVFrame *dst, const AVFrame *src) { + VAAPIFramesContext *ctx = hwfc->internal->priv; AVFrame *map; + int direct = !!ctx->derive_works; int err; if (dst->width > hwfc->width || dst->height > hwfc->height) @@ -817,16 +820,30 @@ static int vaapi_transfer_data_from(AVHWFramesContext *hwfc, return AVERROR(ENOMEM); map->format = dst->format; - err = vaapi_map_frame(hwfc, map, src, VAAPI_MAP_READ); + err = vaapi_map_frame(hwfc, map, src, + VAAPI_MAP_READ | (direct ? VAAPI_MAP_DIRECT : 0)); if (err) goto fail; map->width = dst->width; map->height = dst->height; - err = av_frame_copy(dst, map); - if (err) - goto fail; + if (direct) { + const uint8_t *src_data[4]; + ptrdiff_t dst_linesize[4], src_linesize[4]; + int i; + for (i = 0; i < 4; i++) { + dst_linesize[i] = dst->linesize[i]; + src_linesize[i] = map->linesize[i]; + src_data[i] = map->data[i]; + } + av_image_copy_uc_from(dst->data, dst_linesize, src_data, src_linesize, + dst->format, dst->width, dst->height); + } else { + err = av_frame_copy(dst, map); + if (err) + goto fail; + } err = 0; fail: -- 2.0.0 _______________________________________________ libav-devel mailing list libav-devel@libav.org https://lists.libav.org/mailman/listinfo/libav-devel