From 5a1d605ceae448b476a525f7368ec452000d1f26 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Mon, 7 Nov 2016 14:05:49 +0100 Subject: 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. --- libavutil/hwcontext_dxva2.c | 53 ++++++++++++++++++++++++++++----------------- 1 file changed, 33 insertions(+), 20 deletions(-) (limited to 'libavutil') 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 }, -- cgit v1.1