mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-02-04 06:08:26 +02:00
Merge commit '5a1d605ceae448b476a525f7368ec452000d1f26'
* commit '5a1d605ceae448b476a525f7368ec452000d1f26': hwcontext_dxva2: split transfer_data() into upload/download functions Merged-by: Hendrik Leppkes <h.leppkes@gmail.com>
This commit is contained in:
commit
0f9ce9c5fc
@ -325,12 +325,34 @@ fail:
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dxva2_transfer_data(AVHWFramesContext *ctx, AVFrame *dst,
|
static int dxva2_transfer_data_to(AVHWFramesContext *ctx, AVFrame *dst,
|
||||||
const AVFrame *src)
|
const AVFrame *src)
|
||||||
{
|
{
|
||||||
int download = !!src->hw_frames_ctx;
|
|
||||||
|
|
||||||
AVFrame *map;
|
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;
|
int ret, i;
|
||||||
|
|
||||||
map = av_frame_alloc();
|
map = av_frame_alloc();
|
||||||
@ -338,25 +360,16 @@ static int dxva2_transfer_data(AVHWFramesContext *ctx, AVFrame *dst,
|
|||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
map->format = dst->format;
|
map->format = dst->format;
|
||||||
|
|
||||||
ret = dxva2_map_frame(ctx, map, download ? src : dst,
|
ret = dxva2_map_frame(ctx, map, src, AV_HWFRAME_MAP_READ);
|
||||||
download ? AV_HWFRAME_MAP_READ :
|
|
||||||
AV_HWFRAME_MAP_WRITE | AV_HWFRAME_MAP_OVERWRITE);
|
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
if (download) {
|
for (i = 0; i < 4; i++) {
|
||||||
ptrdiff_t src_linesize[4], dst_linesize[4];
|
dst_linesize[i] = dst->linesize[i];
|
||||||
for (i = 0; i < 4; i++) {
|
src_linesize[i] = map->linesize[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);
|
|
||||||
}
|
}
|
||||||
|
av_image_copy_uc_from(dst->data, dst_linesize, map->data, src_linesize,
|
||||||
|
ctx->sw_format, src->width, src->height);
|
||||||
fail:
|
fail:
|
||||||
av_frame_free(&map);
|
av_frame_free(&map);
|
||||||
return ret;
|
return ret;
|
||||||
@ -557,8 +570,8 @@ const HWContextType ff_hwcontext_type_dxva2 = {
|
|||||||
.frames_uninit = dxva2_frames_uninit,
|
.frames_uninit = dxva2_frames_uninit,
|
||||||
.frames_get_buffer = dxva2_get_buffer,
|
.frames_get_buffer = dxva2_get_buffer,
|
||||||
.transfer_get_formats = dxva2_transfer_get_formats,
|
.transfer_get_formats = dxva2_transfer_get_formats,
|
||||||
.transfer_data_to = dxva2_transfer_data,
|
.transfer_data_to = dxva2_transfer_data_to,
|
||||||
.transfer_data_from = dxva2_transfer_data,
|
.transfer_data_from = dxva2_transfer_data_from,
|
||||||
.map_from = dxva2_map_from,
|
.map_from = dxva2_map_from,
|
||||||
|
|
||||||
.pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_DXVA2_VLD, AV_PIX_FMT_NONE },
|
.pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_DXVA2_VLD, AV_PIX_FMT_NONE },
|
||||||
|
Loading…
x
Reference in New Issue
Block a user