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
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to