---
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
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel