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

Reply via email to