---
 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

Reply via email to