On Wed, Sep 16, 2015 at 1:27 PM, Steve Lhomme <rob...@gmail.com> wrote: > From: Steve Lhomme <rob...@gmail.com> > > -- > now with an allocation function for the structure > updated with APIchanges addition (minus an extra line) > --- > doc/APIchanges | 4 ++++ > libavcodec/Makefile | 2 +- > libavcodec/d3d11va.c | 33 +++++++++++++++++++++++++++++++++ > libavcodec/d3d11va.h | 18 ++++++++++++++++-- > libavcodec/dxva2.c | 15 +++++++++++++-- > libavcodec/version.h | 2 +- > 6 files changed, 68 insertions(+), 6 deletions(-) > create mode 100644 libavcodec/d3d11va.c > > diff --git a/doc/APIchanges b/doc/APIchanges > index fb9d305..42caad7 100644 > --- a/doc/APIchanges > +++ b/doc/APIchanges > @@ -13,6 +13,10 @@ libavutil: 2015-08-28 > > API changes, most recent first: > > +2015-xx-xx - xxxxxxx - lavc 57.2.0 - d3d11va.h > + Add av_d3d11va_alloc_context(). This function must from now on be used for > + allocating AVD3D11VAContext. > + > 2015-xx-xx - lavu 55.0.0 > xxxxxxx - Change type of AVPixFmtDescriptor.flags from uint8_t to uint64_t. > xxxxxxx - Change type of AVComponentDescriptor fields from uint16_t to int > 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..9264ec6 100644 > --- a/libavcodec/d3d11va.h > +++ b/libavcodec/d3d11va.h > @@ -53,8 +53,10 @@ > * to the Direct3D11 Libav HWAccel implementation. > * > * The application must make it available as AVCodecContext.hwaccel_context. > + * > + * Use av_d3d11va_alloc_context() exclusively to allocate an > AVD3D11VAContext. > */ > -struct AVD3D11VAContext { > +typedef struct AVD3D11VAContext { > /** > * D3D11 decoder object > */ > @@ -89,7 +91,19 @@ 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, \ > --
LGTM _______________________________________________ libav-devel mailing list libav-devel@libav.org https://lists.libav.org/mailman/listinfo/libav-devel