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