hwcontext_dxva2: split transfer_data() into upload/download functions
authorAnton Khirnov <anton@khirnov.net>
Mon, 7 Nov 2016 13:05:49 +0000 (14:05 +0100)
committerAnton Khirnov <anton@khirnov.net>
Fri, 18 Nov 2016 09:31:53 +0000 (10:31 +0100)
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.

libavutil/hwcontext_dxva2.c

index 1dc351a..3fe19a6 100644 (file)
@@ -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 },