On 6/9/17 4:27 PM, wm4 wrote:
> Makes dealing with formats that can not be used for staging textures
> easier (DXGI_FORMAT_420_OPAQUE). It also saves memory if the staging
> texture is never needed, so this is a good thing.
> ---
> libavutil/hwcontext_d3d11va.c | 46
> ++++++++++++++++++++++++++++++++-----------
> 1 file changed, 34 insertions(+), 12 deletions(-)
>
> diff --git a/libavutil/hwcontext_d3d11va.c b/libavutil/hwcontext_d3d11va.c
> index 5622bb8d34..b0d04d03c9 100644
> --- a/libavutil/hwcontext_d3d11va.c
> +++ b/libavutil/hwcontext_d3d11va.c
> @@ -207,17 +207,6 @@ static int d3d11va_frames_init(AVHWFramesContext *ctx)
> }
> }
>
> - texDesc.ArraySize = 1;
> - texDesc.Usage = D3D11_USAGE_STAGING;
> - texDesc.BindFlags = 0;
> - texDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE;
> - texDesc.MiscFlags = 0;
> - hr = ID3D11Device_CreateTexture2D(device_hwctx->device, &texDesc, NULL,
> &s->staging_texture);
> - if (FAILED(hr)) {
> - av_log(ctx, AV_LOG_ERROR, "Could not create the staging texture
> (%lx)\n", (long)hr);
> - return AVERROR_UNKNOWN;
> - }
> -> ctx->internal->pool_internal =
av_buffer_pool_init2(sizeof(AVD3D11FrameDescriptor),
> ctx,
> d3d11va_pool_alloc, NULL);
> if (!ctx->internal->pool_internal)
> @@ -263,6 +252,31 @@ static int
> d3d11va_transfer_get_formats(AVHWFramesContext *ctx,
> return 0;
> }
>
> +static int d3d11va_create_staging_texture(AVHWFramesContext *ctx)
> +{
> + AVD3D11VADeviceContext *device_hwctx = ctx->device_ctx->hwctx;
> + D3D11VAFramesContext *s = ctx->internal->priv;
> + HRESULT hr;
> + D3D11_TEXTURE2D_DESC texDesc = {
> + .Width = ctx->width,
> + .Height = ctx->height,
> + .MipLevels = 1,
> + .Format = s->format,
> + .SampleDesc = { .Count = 1 },
> + .ArraySize = 1,
> + .Usage = D3D11_USAGE_STAGING,
> + .CPUAccessFlags = D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE,
> + };
> +
> + hr = ID3D11Device_CreateTexture2D(device_hwctx->device, &texDesc, NULL,
> &s->staging_texture);
> + if (FAILED(hr)) {
> + av_log(ctx, AV_LOG_ERROR, "Could not create the staging texture
> (%lx)\n", (long)hr);
> + return AVERROR_UNKNOWN;
> + }
> +
> + return 0;
> +}
> +
> static void fill_texture_ptrs(uint8_t *data[4], int linesize[4],
> AVHWFramesContext *ctx,
> D3D11_TEXTURE2D_DESC *desc,
> @@ -288,7 +302,7 @@ static int d3d11va_transfer_data(AVHWFramesContext *ctx,
> AVFrame *dst,
> // (The interface types are compatible.)
> ID3D11Resource *texture = (ID3D11Resource *)(ID3D11Texture2D
> *)frame->data[0];
> int index = (intptr_t)frame->data[1];
> - ID3D11Resource *staging = (ID3D11Resource *)s->staging_texture;
> + ID3D11Resource *staging;
> int w = FFMIN(dst->width, src->width);
> int h = FFMIN(dst->height, src->height);
> uint8_t *map_data[4];
> @@ -302,6 +316,14 @@ static int d3d11va_transfer_data(AVHWFramesContext *ctx,
> AVFrame *dst,
>
> device_hwctx->lock(device_hwctx->lock_ctx);
>
> + if (!s->staging_texture) {
> + int res = d3d11va_create_staging_texture(ctx);
> + if (res < 0)
> + return res;
> + }
> +
> + staging = (ID3D11Resource *)s->staging_texture;
> +
> ID3D11Texture2D_GetDesc(s->staging_texture, &desc);
>
> if (download) {
>
Looks good.
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel