[FFmpeg-cvslog] hwcontext_dxva2: split transfer_data() into upload/download functions

Anton Khirnov git at videolan.org
Sat Apr 1 19:58:55 EEST 2017


ffmpeg | branch: master | Anton Khirnov <anton at khirnov.net> | Mon Nov  7 14:05:49 2016 +0100| [5a1d605ceae448b476a525f7368ec452000d1f26] | committer: Anton Khirnov

hwcontext_dxva2: split transfer_data() into upload/download functions

Just the presence of a hw frames context is not enough to detect whether
the transfer is an upload or a download, because hw frames mapped to
system memory will have a hw frames context attached.

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=5a1d605ceae448b476a525f7368ec452000d1f26
---

 libavutil/hwcontext_dxva2.c | 53 ++++++++++++++++++++++++++++-----------------
 1 file changed, 33 insertions(+), 20 deletions(-)

diff --git a/libavutil/hwcontext_dxva2.c b/libavutil/hwcontext_dxva2.c
index 1dc351a..3fe19a6 100644
--- a/libavutil/hwcontext_dxva2.c
+++ b/libavutil/hwcontext_dxva2.c
@@ -309,12 +309,34 @@ fail:
     return err;
 }
 
-static int dxva2_transfer_data(AVHWFramesContext *ctx, AVFrame *dst,
-                               const AVFrame *src)
+static int dxva2_transfer_data_to(AVHWFramesContext *ctx, AVFrame *dst,
+                                  const AVFrame *src)
 {
-    int download = !!src->hw_frames_ctx;
+    AVFrame *map;
+    int ret;
+
+    map = av_frame_alloc();
+    if (!map)
+        return AVERROR(ENOMEM);
+    map->format = dst->format;
+
+    ret = dxva2_map_frame(ctx, map, dst, AV_HWFRAME_MAP_WRITE | AV_HWFRAME_MAP_OVERWRITE);
+    if (ret < 0)
+        goto fail;
 
+    av_image_copy(map->data, map->linesize, src->data, src->linesize,
+                  ctx->sw_format, src->width, src->height);
+
+fail:
+    av_frame_free(&map);
+    return ret;
+}
+
+static int dxva2_transfer_data_from(AVHWFramesContext *ctx, AVFrame *dst,
+                                    const AVFrame *src)
+{
     AVFrame *map;
+    ptrdiff_t src_linesize[4], dst_linesize[4];
     int ret, i;
 
     map = av_frame_alloc();
@@ -322,25 +344,16 @@ static int dxva2_transfer_data(AVHWFramesContext *ctx, AVFrame *dst,
         return AVERROR(ENOMEM);
     map->format = dst->format;
 
-    ret = dxva2_map_frame(ctx, map, download ? src : dst,
-                          download ? AV_HWFRAME_MAP_READ :
-                                     AV_HWFRAME_MAP_WRITE | AV_HWFRAME_MAP_OVERWRITE);
+    ret = dxva2_map_frame(ctx, map, src, AV_HWFRAME_MAP_READ);
     if (ret < 0)
         goto fail;
 
-    if (download) {
-        ptrdiff_t src_linesize[4], dst_linesize[4];
-        for (i = 0; i < 4; i++) {
-            dst_linesize[i] = dst->linesize[i];
-            src_linesize[i] = map->linesize[i];
-        }
-        av_image_copy_uc_from(dst->data, dst_linesize, map->data, src_linesize,
-                              ctx->sw_format, src->width, src->height);
-    } else {
-        av_image_copy(map->data, map->linesize, src->data, src->linesize,
-                      ctx->sw_format, src->width, src->height);
+    for (i = 0; i < 4; i++) {
+        dst_linesize[i] = dst->linesize[i];
+        src_linesize[i] = map->linesize[i];
     }
-
+    av_image_copy_uc_from(dst->data, dst_linesize, map->data, src_linesize,
+                          ctx->sw_format, src->width, src->height);
 fail:
     av_frame_free(&map);
     return ret;
@@ -498,8 +511,8 @@ const HWContextType ff_hwcontext_type_dxva2 = {
     .frames_uninit        = dxva2_frames_uninit,
     .frames_get_buffer    = dxva2_get_buffer,
     .transfer_get_formats = dxva2_transfer_get_formats,
-    .transfer_data_to     = dxva2_transfer_data,
-    .transfer_data_from   = dxva2_transfer_data,
+    .transfer_data_to     = dxva2_transfer_data_to,
+    .transfer_data_from   = dxva2_transfer_data_from,
     .map_from             = dxva2_map_from,
 
     .pix_fmts             = (const enum AVPixelFormat[]){ AV_PIX_FMT_DXVA2_VLD, AV_PIX_FMT_NONE },



More information about the ffmpeg-cvslog mailing list