On Tue, Sep 15, 2015 at 8:44 PM, Hendrik Leppkes <[email protected]> wrote:
> On Tue, Sep 15, 2015 at 4:36 PM, Steve Lhomme <[email protected]> wrote:
>> From: Steve Lhomme <[email protected]>
>>
>> --
>> now with an allocation function for the structure
>> ---
>> libavcodec/Makefile | 2 +-
>> libavcodec/d3d11va.c | 33 +++++++++++++++++++++++++++++++++
>> libavcodec/d3d11va.h | 17 +++++++++++++++--
>> libavcodec/dxva2.c | 15 +++++++++++++--
>> libavcodec/version.h | 2 +-
>> 5 files changed, 63 insertions(+), 6 deletions(-)
>> create mode 100644 libavcodec/d3d11va.c
>>
>> diff --git a/libavcodec/Makefile b/libavcodec/Makefile
>> index 5cdef9c..f163a79 100644
>> --- a/libavcodec/Makefile
>> +++ b/libavcodec/Makefile
>> @@ -581,7 +581,7 @@ OBJS-$(CONFIG_ADPCM_YAMAHA_DECODER) += adpcm.o
>> adpcm_data.o
>> OBJS-$(CONFIG_ADPCM_YAMAHA_ENCODER) += adpcmenc.o adpcm_data.o
>>
>> # hardware accelerators
>> -OBJS-$(CONFIG_D3D11VA) += dxva2.o
>> +OBJS-$(CONFIG_D3D11VA) += d3d11va.o dxva2.o
>> OBJS-$(CONFIG_DXVA2) += dxva2.o
>> OBJS-$(CONFIG_VAAPI) += vaapi.o
>> OBJS-$(CONFIG_VDA) += vda.o
>> diff --git a/libavcodec/d3d11va.c b/libavcodec/d3d11va.c
>> new file mode 100644
>> index 0000000..d24730a
>> --- /dev/null
>> +++ b/libavcodec/d3d11va.c
>> @@ -0,0 +1,33 @@
>> +/*
>> + * Direct3D11 HW acceleration
>> + *
>> + * copyright (c) 2015 Steve Lhomme
>> + *
>> + * This file is part of Libav.
>> + *
>> + * Libav is free software; you can redistribute it and/or
>> + * modify it under the terms of the GNU Lesser General Public
>> + * License as published by the Free Software Foundation; either
>> + * version 2.1 of the License, or (at your option) any later version.
>> + *
>> + * Libav is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
>> + * Lesser General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU Lesser General Public
>> + * License along with Libav; if not, write to the Free Software
>> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
>> USA
>> + */
>> +
>> +#include "config.h"
>> +#include "libavutil/mem.h"
>> +
>> +#include "d3d11va.h"
>> +
>> +AVD3D11VAContext *av_d3d11va_alloc_context(void)
>> +{
>> + AVD3D11VAContext* res = av_mallocz(sizeof(AVD3D11VAContext));
>> + res->context_mutex = INVALID_HANDLE_VALUE;
>> + return res;
>> +}
>> diff --git a/libavcodec/d3d11va.h b/libavcodec/d3d11va.h
>> index f5777c2..df06275 100644
>> --- a/libavcodec/d3d11va.h
>> +++ b/libavcodec/d3d11va.h
>> @@ -54,7 +54,7 @@
>> *
>> * The application must make it available as AVCodecContext.hwaccel_context.
>> */
>
> Should be a comment here that mandates use of the allocation function.
In vdpau.h it's in the structure description, which is a safer way to
make sure it's seen. I'll put it there.
>> -struct AVD3D11VAContext {
>> +typedef struct AVD3D11VAContext {
>> /**
>> * D3D11 decoder object
>> */
>> @@ -89,7 +89,20 @@ struct AVD3D11VAContext {
>> * Private to the Libav AVHWAccel implementation
>> */
>> unsigned report_id;
>> -};
>> +
>> + /**
>> + * Mutex to access video_context
>> + */
>> + HANDLE context_mutex;
>> +} AVD3D11VAContext;
>> +
>> +/**
>> + * Allocate an AVD3D11VAContext.
>> + *
>> + * @return Newly-allocated AVD3D11VAContext or NULL on failure.
>> + */
>> +AVD3D11VAContext *av_d3d11va_alloc_context(void);
>> +
>>
>> /**
>> * @}
>> diff --git a/libavcodec/dxva2.c b/libavcodec/dxva2.c
>> index 6a7dd53..8b0e686 100644
>> --- a/libavcodec/dxva2.c
>> +++ b/libavcodec/dxva2.c
>> @@ -144,10 +144,13 @@ int ff_dxva2_common_end_frame(AVCodecContext *avctx,
>> AVFrame *frame,
>>
>> do {
>> #if CONFIG_D3D11VA
>> - if (avctx->pix_fmt == AV_PIX_FMT_D3D11VA_VLD)
>> + if (avctx->pix_fmt == AV_PIX_FMT_D3D11VA_VLD) {
>> + if (D3D11VA_CONTEXT(ctx)->context_mutex != INVALID_HANDLE_VALUE)
>> + WaitForSingleObjectEx(D3D11VA_CONTEXT(ctx)->context_mutex,
>> INFINITE, FALSE);
>> hr =
>> ID3D11VideoContext_DecoderBeginFrame(D3D11VA_CONTEXT(ctx)->video_context,
>> D3D11VA_CONTEXT(ctx)->decoder,
>>
>> ff_dxva2_get_surface(frame),
>> 0, NULL);
>> + }
>> #endif
>> #if CONFIG_DXVA2
>> if (avctx->pix_fmt == AV_PIX_FMT_DXVA2_VLD)
>> @@ -161,6 +164,11 @@ int ff_dxva2_common_end_frame(AVCodecContext *avctx,
>> AVFrame *frame,
>>
>> if (FAILED(hr)) {
>> av_log(avctx, AV_LOG_ERROR, "Failed to begin frame: 0x%lx\n", hr);
>> +#if CONFIG_D3D11VA
>> + if (avctx->pix_fmt == AV_PIX_FMT_D3D11VA_VLD)
>> + if (D3D11VA_CONTEXT(ctx)->context_mutex != INVALID_HANDLE_VALUE)
>> + ReleaseMutex(D3D11VA_CONTEXT(ctx)->context_mutex);
>> +#endif
>> return -1;
>> }
>>
>> @@ -260,8 +268,11 @@ int ff_dxva2_common_end_frame(AVCodecContext *avctx,
>> AVFrame *frame,
>>
>> end:
>> #if CONFIG_D3D11VA
>> - if (avctx->pix_fmt == AV_PIX_FMT_D3D11VA_VLD)
>> + if (avctx->pix_fmt == AV_PIX_FMT_D3D11VA_VLD) {
>> hr =
>> ID3D11VideoContext_DecoderEndFrame(D3D11VA_CONTEXT(ctx)->video_context,
>> D3D11VA_CONTEXT(ctx)->decoder);
>> + if (D3D11VA_CONTEXT(ctx)->context_mutex != INVALID_HANDLE_VALUE)
>> + ReleaseMutex(D3D11VA_CONTEXT(ctx)->context_mutex);
>> + }
>> #endif
>> #if CONFIG_DXVA2
>> if (avctx->pix_fmt == AV_PIX_FMT_DXVA2_VLD)
>> diff --git a/libavcodec/version.h b/libavcodec/version.h
>> index 45b99ca..ecd6e1d 100644
>> --- a/libavcodec/version.h
>> +++ b/libavcodec/version.h
>> @@ -29,7 +29,7 @@
>> #include "libavutil/version.h"
>>
>> #define LIBAVCODEC_VERSION_MAJOR 57
>> -#define LIBAVCODEC_VERSION_MINOR 1
>> +#define LIBAVCODEC_VERSION_MINOR 2
>> #define LIBAVCODEC_VERSION_MICRO 0
>>
>> #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
>> --
>> 2.5.1
>>
>> _______________________________________________
>> libav-devel mailing list
>> [email protected]
>> https://lists.libav.org/mailman/listinfo/libav-devel
> _______________________________________________
> libav-devel mailing list
> [email protected]
> https://lists.libav.org/mailman/listinfo/libav-devel
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel