[FFmpeg-devel] [PATCH] ffmpeg: add ffmpeg_d3d11va
wm4
nfxjfg at googlemail.com
Wed Dec 14 12:51:47 EET 2016
On Tue, 13 Dec 2016 14:19:35 +0100
Steve Lhomme <robux4 at gmail.com> wrote:
> +static int d3d11va_transfer_data(AVHWFramesContext *ctx, AVFrame *dst,
> + const AVFrame *src)
> +{
> + ID3D11VideoDecoderOutputView *surface;
> + D3D11_VIDEO_DECODER_OUTPUT_VIEW_DESC surfaceDesc;
> + D3D11_TEXTURE2D_DESC dstDesc;
> + D3D11_MAPPED_SUBRESOURCE LockedRect;
> + ID3D11Resource *pTexture;
> + HRESULT hr;
> + AVD3D11VAFramesContext *frames_hwctx = ctx->hwctx;
> + D3D11VAFramesContext *s = ctx->internal->priv;
> +
> + uint8_t *surf_data[4] = { NULL };
> + int surf_linesize[4] = { 0 };
> + int i;
> +
> + int download = !!src->hw_frames_ctx;
> +
> + surface = (ID3D11VideoDecoderOutputView*)(download ? src->data[3] : dst->data[3]);
> +
> + ID3D11VideoDecoderOutputView_GetDesc(surface, &surfaceDesc);
> + ID3D11VideoDecoderOutputView_GetResource(surface, &pTexture);
> +
> + ID3D11DeviceContext_CopySubresourceRegion(s->d3d11_context, (ID3D11Resource*)frames_hwctx->staging_texture,
> + 0, 0, 0, 0,
> + (ID3D11Resource*)pTexture, surfaceDesc.Texture2D.ArraySlice,
> + NULL);
> + ID3D11Resource_Release(pTexture);
> +
> + hr = ID3D11DeviceContext_Map(s->d3d11_context, (ID3D11Resource*)frames_hwctx->staging_texture,
> + 0, D3D11_MAP_READ, 0, &LockedRect);
> + if (FAILED(hr)) {
> + av_log(ctx, AV_LOG_ERROR, "Unable to lock D3D11VA surface %lx\n", hr);
> + return AVERROR_UNKNOWN;
> + }
> +
> + for (i = 0; download ? dst->data[i] : src->data[i]; i++)
> + surf_linesize[i] = LockedRect.RowPitch;
> +
> + ID3D11Texture2D_GetDesc(frames_hwctx->staging_texture, &dstDesc);
> + av_image_fill_pointers(surf_data, ctx->sw_format, dstDesc.Height,
> + (uint8_t*)LockedRect.pData, surf_linesize);
> +
> + if (download) {
> + av_image_copy(dst->data, dst->linesize, surf_data, surf_linesize,
> + ctx->sw_format, src->width, src->height);
> + } else {
> + av_image_copy(surf_data, surf_linesize, src->data, src->linesize,
> + ctx->sw_format, src->width, src->height);
> + }
> +
> + ID3D11DeviceContext_Unmap(s->d3d11_context, (ID3D11Resource*)frames_hwctx->staging_texture, 0);
> +
> + return 0;
> +}
Missed this part during the first review, but: the staging_texture use
should be either mutex-protected, or there should be a pool of staging
textures.
More information about the ffmpeg-devel
mailing list