[1/2] dxva2: split the code so it can be reused by a D3D11 decoder

Message ID BLU436-SMTP223AF85C8035FC7BFCFD3589AD00@phx.gbl
State New
Headers show

Commit Message

Steve Lhomme May 6, 2015, 11:38 a.m.
most calls to DXVA are now done via macros and the core C code is included
---
 libavcodec/Makefile         | 12 ++++-----
 libavcodec/dxva.c           | 23 ++++++++++++++++++
 libavcodec/dxva2.c          | 42 +++++++++++++-------------------
 libavcodec/dxva2_h264.c     | 31 +++++++-----------------
 libavcodec/dxva2_hevc.c     | 30 +++++++----------------
 libavcodec/dxva2_internal.h | 19 +++++----------
 libavcodec/dxva2_mpeg2.c    | 31 +++++++-----------------
 libavcodec/dxva2_vc1.c      | 43 +++++++--------------------------
 libavcodec/dxva_h264.c      | 35 +++++++++++++++++++++++++++
 libavcodec/dxva_hevc.c      | 35 +++++++++++++++++++++++++++
 libavcodec/dxva_internal.h  | 59 +++++++++++++++++++++++++++++++++++++++++++++
 libavcodec/dxva_mpeg2.c     | 35 +++++++++++++++++++++++++++
 libavcodec/dxva_vc1.c       | 48 ++++++++++++++++++++++++++++++++++++
 13 files changed, 300 insertions(+), 143 deletions(-)
 create mode 100644 libavcodec/dxva.c
 create mode 100644 libavcodec/dxva_h264.c
 create mode 100644 libavcodec/dxva_hevc.c
 create mode 100644 libavcodec/dxva_internal.h
 create mode 100644 libavcodec/dxva_mpeg2.c
 create mode 100644 libavcodec/dxva_vc1.c

Comments

Steve Lhomme May 6, 2015, 11:43 a.m. | #1
Sending the patch to libav-devel

On Wed, May 6, 2015 at 1:38 PM, Steve Lhomme <robux4@videolabs.io> wrote:
> most calls to DXVA are now done via macros and the core C code is included
> ---
>  libavcodec/Makefile         | 12 ++++-----
>  libavcodec/dxva.c           | 23 ++++++++++++++++++
>  libavcodec/dxva2.c          | 42 +++++++++++++-------------------
>  libavcodec/dxva2_h264.c     | 31 +++++++-----------------
>  libavcodec/dxva2_hevc.c     | 30 +++++++----------------
>  libavcodec/dxva2_internal.h | 19 +++++----------
>  libavcodec/dxva2_mpeg2.c    | 31 +++++++-----------------
>  libavcodec/dxva2_vc1.c      | 43 +++++++--------------------------
>  libavcodec/dxva_h264.c      | 35 +++++++++++++++++++++++++++
>  libavcodec/dxva_hevc.c      | 35 +++++++++++++++++++++++++++
>  libavcodec/dxva_internal.h  | 59 +++++++++++++++++++++++++++++++++++++++++++++
>  libavcodec/dxva_mpeg2.c     | 35 +++++++++++++++++++++++++++
>  libavcodec/dxva_vc1.c       | 48 ++++++++++++++++++++++++++++++++++++
>  13 files changed, 300 insertions(+), 143 deletions(-)
>  create mode 100644 libavcodec/dxva.c
>  create mode 100644 libavcodec/dxva_h264.c
>  create mode 100644 libavcodec/dxva_hevc.c
>  create mode 100644 libavcodec/dxva_internal.h
>  create mode 100644 libavcodec/dxva_mpeg2.c
>  create mode 100644 libavcodec/dxva_vc1.c
>
> diff --git a/libavcodec/Makefile b/libavcodec/Makefile
> index fc8c6e9..66b3cbe 100644
> --- a/libavcodec/Makefile
> +++ b/libavcodec/Makefile
> @@ -557,25 +557,25 @@ OBJS-$(CONFIG_ADPCM_YAMAHA_DECODER)       += adpcm.o adpcm_data.o
>  OBJS-$(CONFIG_ADPCM_YAMAHA_ENCODER)       += adpcmenc.o adpcm_data.o
>
>  # hardware accelerators
> -OBJS-$(CONFIG_DXVA2)                      += dxva2.o
> +OBJS-$(CONFIG_DXVA2)                      += dxva.o
>  OBJS-$(CONFIG_VAAPI)                      += vaapi.o
>  OBJS-$(CONFIG_VDA)                        += vda.o
>  OBJS-$(CONFIG_VDPAU)                      += vdpau.o
>
>  OBJS-$(CONFIG_H263_VAAPI_HWACCEL)         += vaapi_mpeg4.o
>  OBJS-$(CONFIG_H263_VDPAU_HWACCEL)         += vdpau_mpeg4.o
> -OBJS-$(CONFIG_H264_DXVA2_HWACCEL)         += dxva2_h264.o
> +OBJS-$(CONFIG_H264_DXVA2_HWACCEL)         += dxva_h264.o
>  OBJS-$(CONFIG_H264_VAAPI_HWACCEL)         += vaapi_h264.o
>  OBJS-$(CONFIG_H264_VDA_HWACCEL)           += vda_h264.o
>  OBJS-$(CONFIG_H264_VDPAU_HWACCEL)         += vdpau_h264.o
> -OBJS-$(CONFIG_HEVC_DXVA2_HWACCEL)         += dxva2_hevc.o
> +OBJS-$(CONFIG_HEVC_DXVA2_HWACCEL)         += dxva_hevc.o
>  OBJS-$(CONFIG_MPEG1_VDPAU_HWACCEL)        += vdpau_mpeg12.o
> -OBJS-$(CONFIG_MPEG2_DXVA2_HWACCEL)        += dxva2_mpeg2.o
> +OBJS-$(CONFIG_MPEG2_DXVA2_HWACCEL)        += dxva_mpeg2.o
>  OBJS-$(CONFIG_MPEG2_VAAPI_HWACCEL)        += vaapi_mpeg2.o
>  OBJS-$(CONFIG_MPEG2_VDPAU_HWACCEL)        += vdpau_mpeg12.o
>  OBJS-$(CONFIG_MPEG4_VAAPI_HWACCEL)        += vaapi_mpeg4.o
>  OBJS-$(CONFIG_MPEG4_VDPAU_HWACCEL)        += vdpau_mpeg4.o
> -OBJS-$(CONFIG_VC1_DXVA2_HWACCEL)          += dxva2_vc1.o
> +OBJS-$(CONFIG_VC1_DXVA2_HWACCEL)          += dxva_vc1.o
>  OBJS-$(CONFIG_VC1_VAAPI_HWACCEL)          += vaapi_vc1.o
>  OBJS-$(CONFIG_VC1_VDPAU_HWACCEL)          += vdpau_vc1.o
>
> @@ -723,7 +723,7 @@ SKIPHEADERS                            += %_tablegen.h                  \
>                                            tableprint.h                  \
>                                            $(ARCH)/vp56_arith.h          \
>
> -SKIPHEADERS-$(CONFIG_DXVA2)            += dxva2.h dxva2_internal.h
> +SKIPHEADERS-$(CONFIG_DXVA2)            += dxva.h dxva_internal.h dxva2_internal.h
>  SKIPHEADERS-$(CONFIG_LIBSCHROEDINGER)  += libschroedinger.h
>  SKIPHEADERS-$(CONFIG_MPEG_XVMC_DECODER) += xvmc.h
>  SKIPHEADERS-$(CONFIG_QSV)              += qsv.h qsv_internal.h
> diff --git a/libavcodec/dxva.c b/libavcodec/dxva.c
> new file mode 100644
> index 0000000..b28bea4
> --- /dev/null
> +++ b/libavcodec/dxva.c
> @@ -0,0 +1,23 @@
> +/*
> + * DXVA2 HW acceleration.
> + *
> + * copyright (c) 2010 Laurent Aimar
> + *
> + * 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 "dxva_internal.h"
> +#include "dxva2.c"
> diff --git a/libavcodec/dxva2.c b/libavcodec/dxva2.c
> index 9ee22c8..2ab2cb0 100644
> --- a/libavcodec/dxva2.c
> +++ b/libavcodec/dxva2.c
> @@ -1,5 +1,5 @@
>  /*
> - * DXVA2 HW acceleration.
> + * DirectX HW acceleration.
>   *
>   * copyright (c) 2010 Laurent Aimar
>   *
> @@ -28,17 +28,16 @@
>
>  #include "avcodec.h"
>  #include "mpegvideo.h"
> -#include "dxva2_internal.h"
>
> -void *ff_dxva2_get_surface(const AVFrame *frame)
> +dxva_surface_t *ff_dxva2_get_surface(const AVFrame *frame)
>  {
> -    return frame->data[3];
> +    return (dxva_surface_t*) frame->data[3];
>  }
>
>  unsigned ff_dxva2_get_surface_index(const struct dxva_context *ctx,
>                                      const AVFrame *frame)
>  {
> -    void *surface = ff_dxva2_get_surface(frame);
> +    dxva_surface_t *surface = ff_dxva2_get_surface(frame);
>      unsigned i;
>
>      for (i = 0; i < ctx->surface_count; i++)
> @@ -51,8 +50,8 @@ unsigned ff_dxva2_get_surface_index(const struct dxva_context *ctx,
>
>  int ff_dxva2_commit_buffer(AVCodecContext *avctx,
>                             struct dxva_context *ctx,
> -                           DXVA2_DecodeBufferDesc *dsc,
> -                           unsigned type, const void *data, unsigned size,
> +                           DECODER_BUFFER_DESC *dsc,
> +                           DECODER_BUFFER_TYPE type, const void *data, unsigned size,
>                             unsigned mb_count)
>  {
>      void     *dxva_data;
> @@ -60,8 +59,7 @@ int ff_dxva2_commit_buffer(AVCodecContext *avctx,
>      int      result;
>      HRESULT hr;
>
> -    hr = IDirectXVideoDecoder_GetBuffer(ctx->decoder, type,
> -                                        &dxva_data, &dxva_size);
> +    hr = DECODER_GET_BUFFER(ctx, type, &dxva_data, &dxva_size);
>      if (FAILED(hr)) {
>          av_log(avctx, AV_LOG_ERROR, "Failed to get a buffer for %u: 0x%lx\n",
>                 type, hr);
> @@ -71,7 +69,7 @@ int ff_dxva2_commit_buffer(AVCodecContext *avctx,
>          memcpy(dxva_data, data, size);
>
>          memset(dsc, 0, sizeof(*dsc));
> -        dsc->CompressedBufferType = type;
> +        DECODER_BUFFER_DESC_SET_TYPE(dsc, type);
>          dsc->DataSize             = size;
>          dsc->NumMBsInBuffer       = mb_count;
>
> @@ -81,7 +79,7 @@ int ff_dxva2_commit_buffer(AVCodecContext *avctx,
>          result = -1;
>      }
>
> -    hr = IDirectXVideoDecoder_ReleaseBuffer(ctx->decoder, type);
> +    hr = DECODER_RELEASE_BUFFER(ctx, type);
>      if (FAILED(hr)) {
>          av_log(avctx, AV_LOG_ERROR,
>                 "Failed to release buffer type %u: 0x%lx\n",
> @@ -95,20 +93,17 @@ int ff_dxva2_common_end_frame(AVCodecContext *avctx, AVFrame *frame,
>                                const void *pp, unsigned pp_size,
>                                const void *qm, unsigned qm_size,
>                                int (*commit_bs_si)(AVCodecContext *,
> -                                                  DXVA2_DecodeBufferDesc *bs,
> -                                                  DXVA2_DecodeBufferDesc *slice))
> +                                                  DECODER_BUFFER_DESC *bs,
> +                                                  DECODER_BUFFER_DESC *slice))
>  {
>      struct dxva_context *ctx = avctx->hwaccel_context;
>      unsigned               buffer_count = 0;
> -    DXVA2_DecodeBufferDesc buffer[4];
> -    DXVA2_DecodeExecuteParams exec = { 0 };
> +    DECODER_BUFFER_DESC buffer[4];
>      int result, runs = 0;
>      HRESULT hr;
>
>      do {
> -        hr = IDirectXVideoDecoder_BeginFrame(ctx->decoder,
> -                                             ff_dxva2_get_surface(frame),
> -                                             NULL);
> +        hr = DECODER_BEGIN_FRAME(ctx, ff_dxva2_get_surface(frame));
>          if (hr == E_PENDING)
>              av_usleep(2000);
>      } while (hr == E_PENDING && ++runs < 50);
> @@ -119,7 +114,7 @@ int ff_dxva2_common_end_frame(AVCodecContext *avctx, AVFrame *frame,
>      }
>
>      result = ff_dxva2_commit_buffer(avctx, ctx, &buffer[buffer_count],
> -                                    DXVA2_PictureParametersBufferType,
> +                                    DECODER_BUFTYPE_PICTURE_PARAMS,
>                                      pp, pp_size, 0);
>      if (result) {
>          av_log(avctx, AV_LOG_ERROR,
> @@ -130,7 +125,7 @@ int ff_dxva2_common_end_frame(AVCodecContext *avctx, AVFrame *frame,
>
>      if (qm_size > 0) {
>          result = ff_dxva2_commit_buffer(avctx, ctx, &buffer[buffer_count],
> -                                        DXVA2_InverseQuantizationMatrixBufferType,
> +                                        DECODER_BUFTYPE_QUANT_MATRIX,
>                                          qm, qm_size, 0);
>          if (result) {
>              av_log(avctx, AV_LOG_ERROR,
> @@ -154,17 +149,14 @@ int ff_dxva2_common_end_frame(AVCodecContext *avctx, AVFrame *frame,
>
>      assert(buffer_count == 1 + (qm_size > 0) + 2);
>
> -    exec.NumCompBuffers      = buffer_count;
> -    exec.pCompressedBuffers  = buffer;
> -    exec.pExtensionData      = NULL;
> -    hr = IDirectXVideoDecoder_Execute(ctx->decoder, &exec);
> +    hr = DECODER_SUBMIT_BUFFER(ctx, buffer, buffer_count);
>      if (FAILED(hr)) {
>          av_log(avctx, AV_LOG_ERROR, "Failed to execute: 0x%lx\n", hr);
>          result = -1;
>      }
>
>  end:
> -    hr = IDirectXVideoDecoder_EndFrame(ctx->decoder, NULL);
> +    hr = DECODER_END_FRAME(ctx);
>      if (FAILED(hr)) {
>          av_log(avctx, AV_LOG_ERROR, "Failed to end frame: 0x%lx\n", hr);
>          result = -1;
> diff --git a/libavcodec/dxva2_h264.c b/libavcodec/dxva2_h264.c
> index a5e9705..777086b 100644
> --- a/libavcodec/dxva2_h264.c
> +++ b/libavcodec/dxva2_h264.c
> @@ -1,5 +1,5 @@
>  /*
> - * DXVA2 H264 HW acceleration.
> + * DirectX H264 HW acceleration.
>   *
>   * copyright (c) 2009 Laurent Aimar
>   *
> @@ -20,7 +20,6 @@
>   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
>   */
>
> -#include "dxva2_internal.h"
>  #include "h264.h"
>  #include "h264data.h"
>  #include "mpegutils.h"
> @@ -289,8 +288,8 @@ static void fill_slice_long(AVCodecContext *avctx, DXVA_Slice_H264_Long *slice,
>  }
>
>  static int commit_bitstream_and_slice_buffer(AVCodecContext *avctx,
> -                                             DXVA2_DecodeBufferDesc *bs,
> -                                             DXVA2_DecodeBufferDesc *sc)
> +                                             DECODER_BUFFER_DESC *bs,
> +                                             DECODER_BUFFER_DESC *sc)
>  {
>      const H264Context *h = avctx->priv_data;
>      const unsigned mb_count = h->mb_width * h->mb_height;
> @@ -307,9 +306,9 @@ static int commit_bitstream_and_slice_buffer(AVCodecContext *avctx,
>      unsigned i;
>
>      /* Create an annex B bitstream buffer with only slice NAL and finalize slice */
> -    if (FAILED(IDirectXVideoDecoder_GetBuffer(ctx->decoder,
> -                                              DXVA2_BitStreamDateBufferType,
> -                                              &dxva_data_ptr, &dxva_size)))
> +    if (FAILED(DECODER_GET_BUFFER(ctx,
> +                                     DECODER_BUFTYPE_BITSTREAM,
> +                                     &dxva_data_ptr, &dxva_size)))
>          return -1;
>
>      dxva_data = dxva_data_ptr;
> @@ -363,14 +362,13 @@ static int commit_bitstream_and_slice_buffer(AVCodecContext *avctx,
>
>          slice->SliceBytesInBuffer += padding;
>      }
> -    if (FAILED(IDirectXVideoDecoder_ReleaseBuffer(ctx->decoder,
> -                                                  DXVA2_BitStreamDateBufferType)))
> +    if (FAILED(DECODER_RELEASE_BUFFER(ctx, DECODER_BUFTYPE_BITSTREAM)))
>          return -1;
>      if (i < ctx_pic->slice_count)
>          return -1;
>
>      memset(bs, 0, sizeof(*bs));
> -    bs->CompressedBufferType = DXVA2_BitStreamDateBufferType;
> +    DECODER_BUFFER_DESC_SET_TYPE(bs, DECODER_BUFTYPE_BITSTREAM);
>      bs->DataSize             = current - dxva_data;
>      bs->NumMBsInBuffer       = mb_count;
>
> @@ -383,7 +381,7 @@ static int commit_bitstream_and_slice_buffer(AVCodecContext *avctx,
>      }
>      assert((bs->DataSize & 127) == 0);
>      return ff_dxva2_commit_buffer(avctx, ctx, sc,
> -                                  DXVA2_SliceControlBufferType,
> +                                  DECODER_BUFTYPE_SLICE_CONTROL,
>                                    slice_data, slice_size, mb_count);
>  }
>
> @@ -462,14 +460,3 @@ static int dxva2_h264_end_frame(AVCodecContext *avctx)
>          ff_h264_draw_horiz_band(h, sl, 0, h->avctx->height);
>      return ret;
>  }
> -
> -AVHWAccel ff_h264_dxva2_hwaccel = {
> -    .name           = "h264_dxva2",
> -    .type           = AVMEDIA_TYPE_VIDEO,
> -    .id             = AV_CODEC_ID_H264,
> -    .pix_fmt        = AV_PIX_FMT_DXVA2_VLD,
> -    .start_frame    = dxva2_h264_start_frame,
> -    .decode_slice   = dxva2_h264_decode_slice,
> -    .end_frame      = dxva2_h264_end_frame,
> -    .frame_priv_data_size = sizeof(struct dxva2_picture_context),
> -};
> diff --git a/libavcodec/dxva2_hevc.c b/libavcodec/dxva2_hevc.c
> index 257bee7..6821689 100644
> --- a/libavcodec/dxva2_hevc.c
> +++ b/libavcodec/dxva2_hevc.c
> @@ -1,5 +1,5 @@
>  /*
> - * DXVA2 HEVC HW acceleration.
> + * DirectX HEVC HW acceleration.
>   *
>   * copyright (c) 2014 - 2015 Hendrik Leppkes
>   *
> @@ -22,7 +22,6 @@
>
>  #include "libavutil/avassert.h"
>
> -#include "dxva2_internal.h"
>  #include "hevc.h"
>
>  #define MAX_SLICES 256
> @@ -228,8 +227,8 @@ static void fill_slice_short(DXVA_Slice_HEVC_Short *slice,
>  }
>
>  static int commit_bitstream_and_slice_buffer(AVCodecContext *avctx,
> -                                             DXVA2_DecodeBufferDesc *bs,
> -                                             DXVA2_DecodeBufferDesc *sc)
> +                                             DECODER_BUFFER_DESC *bs,
> +                                             DECODER_BUFFER_DESC *sc)
>  {
>      const HEVCContext *h = avctx->priv_data;
>      struct dxva_context *ctx = avctx->hwaccel_context;
> @@ -245,9 +244,9 @@ static int commit_bitstream_and_slice_buffer(AVCodecContext *avctx,
>      unsigned i;
>
>      /* Create an annex B bitstream buffer with only slice NAL and finalize slice */
> -    if (FAILED(IDirectXVideoDecoder_GetBuffer(ctx->decoder,
> -                                              DXVA2_BitStreamDateBufferType,
> -                                              &dxva_data_ptr, &dxva_size)))
> +    if (FAILED(DECODER_GET_BUFFER(ctx,
> +                                     DECODER_BUFTYPE_BITSTREAM,
> +                                     &dxva_data_ptr, &dxva_size)))
>          return -1;
>
>      dxva_data = dxva_data_ptr;
> @@ -284,14 +283,13 @@ static int commit_bitstream_and_slice_buffer(AVCodecContext *avctx,
>
>          slice->SliceBytesInBuffer += padding;
>      }
> -    if (FAILED(IDirectXVideoDecoder_ReleaseBuffer(ctx->decoder,
> -                                                  DXVA2_BitStreamDateBufferType)))
> +    if (FAILED(DECODER_RELEASE_BUFFER(ctx, DECODER_BUFTYPE_BITSTREAM)))
>          return -1;
>      if (i < ctx_pic->slice_count)
>          return -1;
>
>      memset(bs, 0, sizeof(*bs));
> -    bs->CompressedBufferType = DXVA2_BitStreamDateBufferType;
> +    DECODER_BUFFER_DESC_SET_TYPE(bs, DECODER_BUFTYPE_BITSTREAM);
>      bs->DataSize             = current - dxva_data;
>      bs->NumMBsInBuffer       = 0;
>
> @@ -300,7 +298,7 @@ static int commit_bitstream_and_slice_buffer(AVCodecContext *avctx,
>
>      av_assert0((bs->DataSize & 127) == 0);
>      return ff_dxva2_commit_buffer(avctx, ctx, sc,
> -                                  DXVA2_SliceControlBufferType,
> +                                  DECODER_BUFTYPE_SLICE_CONTROL,
>                                    slice_data, slice_size, 0);
>  }
>
> @@ -369,13 +367,3 @@ static int dxva2_hevc_end_frame(AVCodecContext *avctx)
>      return ret;
>  }
>
> -AVHWAccel ff_hevc_dxva2_hwaccel = {
> -    .name           = "hevc_dxva2",
> -    .type           = AVMEDIA_TYPE_VIDEO,
> -    .id             = AV_CODEC_ID_HEVC,
> -    .pix_fmt        = AV_PIX_FMT_DXVA2_VLD,
> -    .start_frame    = dxva2_hevc_start_frame,
> -    .decode_slice   = dxva2_hevc_decode_slice,
> -    .end_frame      = dxva2_hevc_end_frame,
> -    .frame_priv_data_size = sizeof(struct hevc_dxva2_picture_context),
> -};
> diff --git a/libavcodec/dxva2_internal.h b/libavcodec/dxva2_internal.h
> index b775e6c..9ff08e7 100644
> --- a/libavcodec/dxva2_internal.h
> +++ b/libavcodec/dxva2_internal.h
> @@ -1,5 +1,5 @@
>  /*
> - * DXVA2 HW acceleration
> + * DirectX HW acceleration
>   *
>   * copyright (c) 2010 Laurent Aimar
>   *
> @@ -23,26 +23,19 @@
>  #ifndef AVCODEC_DXVA_INTERNAL_H
>  #define AVCODEC_DXVA_INTERNAL_H
>
> -#define COBJMACROS
> -
>  #include "config.h"
>
> -#include "dxva2.h"
> -#if HAVE_DXVA_H
> -#include <dxva.h>
> -#endif
> -
>  #include "avcodec.h"
>  #include "mpegvideo.h"
>
> -void *ff_dxva2_get_surface(const AVFrame *frame);
> +dxva_surface_t *ff_dxva2_get_surface(const AVFrame *frame);
>
>  unsigned ff_dxva2_get_surface_index(const struct dxva_context *,
>                                      const AVFrame *frame);
>
>  int ff_dxva2_commit_buffer(AVCodecContext *, struct dxva_context *,
> -                           DXVA2_DecodeBufferDesc *,
> -                           unsigned type, const void *data, unsigned size,
> +                           DECODER_BUFFER_DESC *,
> +                           DECODER_BUFFER_TYPE type, const void *data, unsigned size,
>                             unsigned mb_count);
>
>
> @@ -50,7 +43,7 @@ int ff_dxva2_common_end_frame(AVCodecContext *, AVFrame *,
>                                const void *pp, unsigned pp_size,
>                                const void *qm, unsigned qm_size,
>                                int (*commit_bs_si)(AVCodecContext *,
> -                                                  DXVA2_DecodeBufferDesc *bs,
> -                                                  DXVA2_DecodeBufferDesc *slice));
> +                                                  DECODER_BUFFER_DESC *bs,
> +                                                  DECODER_BUFFER_DESC *slice));
>
>  #endif /* AVCODEC_DXVA_INTERNAL_H */
> diff --git a/libavcodec/dxva2_mpeg2.c b/libavcodec/dxva2_mpeg2.c
> index 65624e3..1edda82 100644
> --- a/libavcodec/dxva2_mpeg2.c
> +++ b/libavcodec/dxva2_mpeg2.c
> @@ -1,5 +1,5 @@
>  /*
> - * MPEG-2 HW acceleration.
> + * DirectX MPEG-2 HW acceleration.
>   *
>   * copyright (c) 2010 Laurent Aimar
>   *
> @@ -21,7 +21,6 @@
>   */
>
>  #include "libavutil/log.h"
> -#include "dxva2_internal.h"
>  #include "mpegutils.h"
>
>  #define MAX_SLICES 1024
> @@ -147,8 +146,8 @@ static void fill_slice(AVCodecContext *avctx,
>      slice->wMBbitOffset        = 4 * 8 + get_bits_count(&gb);
>  }
>  static int commit_bitstream_and_slice_buffer(AVCodecContext *avctx,
> -                                             DXVA2_DecodeBufferDesc *bs,
> -                                             DXVA2_DecodeBufferDesc *sc)
> +                                             DECODER_BUFFER_DESC *bs,
> +                                             DECODER_BUFFER_DESC *sc)
>  {
>      const struct MpegEncContext *s = avctx->priv_data;
>      struct dxva_context *ctx = avctx->hwaccel_context;
> @@ -161,9 +160,9 @@ static int commit_bitstream_and_slice_buffer(AVCodecContext *avctx,
>      unsigned dxva_size;
>      unsigned i;
>
> -    if (FAILED(IDirectXVideoDecoder_GetBuffer(ctx->decoder,
> -                                              DXVA2_BitStreamDateBufferType,
> -                                              &dxva_data_ptr, &dxva_size)))
> +    if (FAILED(DECODER_GET_BUFFER(ctx,
> +                                     DECODER_BUFTYPE_BITSTREAM,
> +                                  &dxva_data_ptr, &dxva_size)))
>          return -1;
>
>      dxva_data = dxva_data_ptr;
> @@ -190,19 +189,18 @@ static int commit_bitstream_and_slice_buffer(AVCodecContext *avctx,
>          memcpy(current, &ctx_pic->bitstream[position], size);
>          current += size;
>      }
> -    if (FAILED(IDirectXVideoDecoder_ReleaseBuffer(ctx->decoder,
> -                                                  DXVA2_BitStreamDateBufferType)))
> +    if (FAILED(DECODER_RELEASE_BUFFER(ctx, DECODER_BUFTYPE_BITSTREAM)))
>          return -1;
>      if (i < ctx_pic->slice_count)
>          return -1;
>
>      memset(bs, 0, sizeof(*bs));
> -    bs->CompressedBufferType = DXVA2_BitStreamDateBufferType;
> +    DECODER_BUFFER_DESC_SET_TYPE(bs, DECODER_BUFTYPE_BITSTREAM);
>      bs->DataSize             = current - dxva_data;
>      bs->NumMBsInBuffer       = mb_count;
>
>      return ff_dxva2_commit_buffer(avctx, ctx, sc,
> -                                  DXVA2_SliceControlBufferType,
> +                                  DECODER_BUFTYPE_SLICE_CONTROL,
>                                    ctx_pic->slice,
>                                    ctx_pic->slice_count * sizeof(*ctx_pic->slice),
>                                    mb_count);
> @@ -270,14 +268,3 @@ static int dxva2_mpeg2_end_frame(AVCodecContext *avctx)
>          ff_mpeg_draw_horiz_band(s, 0, avctx->height);
>      return ret;
>  }
> -
> -AVHWAccel ff_mpeg2_dxva2_hwaccel = {
> -    .name           = "mpeg2_dxva2",
> -    .type           = AVMEDIA_TYPE_VIDEO,
> -    .id             = AV_CODEC_ID_MPEG2VIDEO,
> -    .pix_fmt        = AV_PIX_FMT_DXVA2_VLD,
> -    .start_frame    = dxva2_mpeg2_start_frame,
> -    .decode_slice   = dxva2_mpeg2_decode_slice,
> -    .end_frame      = dxva2_mpeg2_end_frame,
> -    .frame_priv_data_size = sizeof(struct dxva2_picture_context),
> -};
> diff --git a/libavcodec/dxva2_vc1.c b/libavcodec/dxva2_vc1.c
> index 1524b51..210b95d 100644
> --- a/libavcodec/dxva2_vc1.c
> +++ b/libavcodec/dxva2_vc1.c
> @@ -1,5 +1,5 @@
>  /*
> - * DXVA2 WMV3/VC-1 HW acceleration.
> + * DirectX WMV3/VC-1 HW acceleration.
>   *
>   * copyright (c) 2010 Laurent Aimar
>   *
> @@ -20,7 +20,6 @@
>   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
>   */
>
> -#include "dxva2_internal.h"
>  #include "mpegutils.h"
>  #include "vc1.h"
>  #include "vc1data.h"
> @@ -157,8 +156,8 @@ static void fill_slice(AVCodecContext *avctx, DXVA_SliceInfo *slice,
>  }
>
>  static int commit_bitstream_and_slice_buffer(AVCodecContext *avctx,
> -                                             DXVA2_DecodeBufferDesc *bs,
> -                                             DXVA2_DecodeBufferDesc *sc)
> +                                             DECODER_BUFFER_DESC *bs,
> +                                             DECODER_BUFFER_DESC *sc)
>  {
>      const VC1Context *v = avctx->priv_data;
>      struct dxva_context *ctx = avctx->hwaccel_context;
> @@ -178,9 +177,9 @@ static int commit_bitstream_and_slice_buffer(AVCodecContext *avctx,
>      unsigned dxva_size;
>      int result;
>
> -    if (FAILED(IDirectXVideoDecoder_GetBuffer(ctx->decoder,
> -                                              DXVA2_BitStreamDateBufferType,
> -                                              &dxva_data_ptr, &dxva_size)))
> +    if (FAILED(DECODER_GET_BUFFER(ctx,
> +                                     DECODER_BUFTYPE_BITSTREAM,
> +                                  &dxva_data_ptr, &dxva_size)))
>          return -1;
>
>      dxva_data = dxva_data_ptr;
> @@ -194,20 +193,19 @@ static int commit_bitstream_and_slice_buffer(AVCodecContext *avctx,
>              memset(dxva_data + start_code_size + slice_size, 0, padding);
>          slice->dwSliceBitsInBuffer = 8 * data_size;
>      }
> -    if (FAILED(IDirectXVideoDecoder_ReleaseBuffer(ctx->decoder,
> -                                                  DXVA2_BitStreamDateBufferType)))
> +    if (FAILED(DECODER_RELEASE_BUFFER(ctx, DECODER_BUFTYPE_BITSTREAM)))
>          return -1;
>      if (result)
>          return result;
>
>      memset(bs, 0, sizeof(*bs));
> -    bs->CompressedBufferType = DXVA2_BitStreamDateBufferType;
> +    DECODER_BUFFER_DESC_SET_TYPE(bs, DECODER_BUFTYPE_BITSTREAM);
>      bs->DataSize             = data_size;
>      bs->NumMBsInBuffer       = s->mb_width * s->mb_height;
>      assert((bs->DataSize & 127) == 0);
>
>      return ff_dxva2_commit_buffer(avctx, ctx, sc,
> -                                  DXVA2_SliceControlBufferType,
> +                                  DECODER_BUFTYPE_SLICE_CONTROL,
>                                    slice, sizeof(*slice), bs->NumMBsInBuffer);
>  }
>
> @@ -272,26 +270,3 @@ static int dxva2_vc1_end_frame(AVCodecContext *avctx)
>      return ret;
>  }
>
> -#if CONFIG_WMV3_DXVA2_HWACCEL
> -AVHWAccel ff_wmv3_dxva2_hwaccel = {
> -    .name           = "wmv3_dxva2",
> -    .type           = AVMEDIA_TYPE_VIDEO,
> -    .id             = AV_CODEC_ID_WMV3,
> -    .pix_fmt        = AV_PIX_FMT_DXVA2_VLD,
> -    .start_frame    = dxva2_vc1_start_frame,
> -    .decode_slice   = dxva2_vc1_decode_slice,
> -    .end_frame      = dxva2_vc1_end_frame,
> -    .frame_priv_data_size = sizeof(struct dxva2_picture_context),
> -};
> -#endif
> -
> -AVHWAccel ff_vc1_dxva2_hwaccel = {
> -    .name           = "vc1_dxva2",
> -    .type           = AVMEDIA_TYPE_VIDEO,
> -    .id             = AV_CODEC_ID_VC1,
> -    .pix_fmt        = AV_PIX_FMT_DXVA2_VLD,
> -    .start_frame    = dxva2_vc1_start_frame,
> -    .decode_slice   = dxva2_vc1_decode_slice,
> -    .end_frame      = dxva2_vc1_end_frame,
> -    .frame_priv_data_size = sizeof(struct dxva2_picture_context),
> -};
> diff --git a/libavcodec/dxva_h264.c b/libavcodec/dxva_h264.c
> new file mode 100644
> index 0000000..68bf70d
> --- /dev/null
> +++ b/libavcodec/dxva_h264.c
> @@ -0,0 +1,35 @@
> +/*
> + * DXVA2 H264 HW acceleration.
> + *
> + * copyright (c) 2009 Laurent Aimar
> + *
> + * 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 "dxva_internal.h"
> +#include "dxva2_h264.c"
> +
> +AVHWAccel ff_h264_dxva2_hwaccel = {
> +    .name           = "h264_dxva2",
> +    .type           = AVMEDIA_TYPE_VIDEO,
> +    .id             = AV_CODEC_ID_H264,
> +    .pix_fmt        = AV_PIX_FMT_DXVA2_VLD,
> +    .start_frame    = dxva2_h264_start_frame,
> +    .decode_slice   = dxva2_h264_decode_slice,
> +    .end_frame      = dxva2_h264_end_frame,
> +    .frame_priv_data_size = sizeof(struct dxva2_picture_context),
> +};
> diff --git a/libavcodec/dxva_hevc.c b/libavcodec/dxva_hevc.c
> new file mode 100644
> index 0000000..ee6ebde
> --- /dev/null
> +++ b/libavcodec/dxva_hevc.c
> @@ -0,0 +1,35 @@
> +/*
> + * DXVA2 HEVC HW acceleration.
> + *
> + * copyright (c) 2014 - 2015 Hendrik Leppkes
> + *
> + * 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 "dxva_internal.h"
> +#include "dxva2_hevc.c"
> +
> +AVHWAccel ff_hevc_dxva2_hwaccel = {
> +    .name           = "hevc_dxva2",
> +    .type           = AVMEDIA_TYPE_VIDEO,
> +    .id             = AV_CODEC_ID_HEVC,
> +    .pix_fmt        = AV_PIX_FMT_DXVA2_VLD,
> +    .start_frame    = dxva2_hevc_start_frame,
> +    .decode_slice   = dxva2_hevc_decode_slice,
> +    .end_frame      = dxva2_hevc_end_frame,
> +    .frame_priv_data_size = sizeof(struct hevc_dxva2_picture_context),
> +};
> diff --git a/libavcodec/dxva_internal.h b/libavcodec/dxva_internal.h
> new file mode 100644
> index 0000000..8050730
> --- /dev/null
> +++ b/libavcodec/dxva_internal.h
> @@ -0,0 +1,59 @@
> +/*
> + * DXVA2 HW acceleration
> + *
> + * copyright (c) 2010 Laurent Aimar
> + * 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
> + */
> +
> +#ifndef AVCODEC_DXVA2_INTERNAL_H
> +#define AVCODEC_DXVA2_INTERNAL_H
> +
> +#define COBJMACROS
> +
> +#include "dxva2.h"
> +#include <dxva.h>
> +
> +#define dxva_surface_t                    IDirect3DSurface9
> +#define DECODER_BUFFER_DESC               DXVA2_DecodeBufferDesc
> +#define DECODER_BUFFER_TYPE               unsigned
> +#define DECODER_GET_BUFFER(ctx,t,b,s)     IDirectXVideoDecoder_GetBuffer(ctx->decoder, t,b,s)
> +
> +static inline HRESULT DECODER_SUBMIT_BUFFER(struct dxva_context *ctx, DECODER_BUFFER_DESC *buffer, unsigned buffer_count) {
> +    DXVA2_DecodeExecuteParams exec = {
> +        .pCompressedBuffers = buffer,
> +        .NumCompBuffers = buffer_count,
> +        .pExtensionData = NULL,
> +    };
> +    return IDirectXVideoDecoder_Execute(ctx->decoder, &exec);
> +}
> +
> +#define DECODER_RELEASE_BUFFER(ctx,t)     IDirectXVideoDecoder_ReleaseBuffer(ctx->decoder, t)
> +#define DECODER_BEGIN_FRAME(ctx,s)        IDirectXVideoDecoder_BeginFrame(ctx->decoder, s, NULL)
> +#define DECODER_END_FRAME(ctx)            IDirectXVideoDecoder_EndFrame(ctx->decoder, NULL)
> +
> +#define DECODER_BUFTYPE_PICTURE_PARAMS    DXVA2_PictureParametersBufferType
> +#define DECODER_BUFTYPE_QUANT_MATRIX      DXVA2_InverseQuantizationMatrixBufferType
> +#define DECODER_BUFTYPE_BITSTREAM         DXVA2_BitStreamDateBufferType
> +#define DECODER_BUFTYPE_SLICE_CONTROL     DXVA2_SliceControlBufferType
> +
> +#define DECODER_BUFFER_DESC_SET_TYPE(dsc, type)   dsc->CompressedBufferType = type
> +
> +#include "dxva2_internal.h"
> +
> +#endif /* AVCODEC_DXVA2_INTERNAL_H */
> diff --git a/libavcodec/dxva_mpeg2.c b/libavcodec/dxva_mpeg2.c
> new file mode 100644
> index 0000000..681288c
> --- /dev/null
> +++ b/libavcodec/dxva_mpeg2.c
> @@ -0,0 +1,35 @@
> +/*
> + * DXVA2 MPEG-2 HW acceleration.
> + *
> + * copyright (c) 2010 Laurent Aimar
> + *
> + * 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 "dxva_internal.h"
> +#include "dxva2_mpeg2.c"
> +
> +AVHWAccel ff_mpeg2_dxva2_hwaccel = {
> +    .name           = "mpeg2_dxva2",
> +    .type           = AVMEDIA_TYPE_VIDEO,
> +    .id             = AV_CODEC_ID_MPEG2VIDEO,
> +    .pix_fmt        = AV_PIX_FMT_DXVA2_VLD,
> +    .start_frame    = dxva2_mpeg2_start_frame,
> +    .decode_slice   = dxva2_mpeg2_decode_slice,
> +    .end_frame      = dxva2_mpeg2_end_frame,
> +    .frame_priv_data_size = sizeof(struct dxva2_picture_context),
> +};
> diff --git a/libavcodec/dxva_vc1.c b/libavcodec/dxva_vc1.c
> new file mode 100644
> index 0000000..12a74c5
> --- /dev/null
> +++ b/libavcodec/dxva_vc1.c
> @@ -0,0 +1,48 @@
> +/*
> + * DXVA2 WMV3/VC-1 HW acceleration.
> + *
> + * copyright (c) 2010 Laurent Aimar
> + *
> + * 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 "dxva_internal.h"
> +#include "dxva2_vc1.c"
> +
> +#if CONFIG_WMV3_DXVA2_HWACCEL
> +AVHWAccel ff_wmv3_dxva2_hwaccel = {
> +    .name           = "wmv3_dxva2",
> +    .type           = AVMEDIA_TYPE_VIDEO,
> +    .id             = AV_CODEC_ID_WMV3,
> +    .pix_fmt        = AV_PIX_FMT_DXVA2_VLD,
> +    .start_frame    = dxva2_vc1_start_frame,
> +    .decode_slice   = dxva2_vc1_decode_slice,
> +    .end_frame      = dxva2_vc1_end_frame,
> +    .frame_priv_data_size = sizeof(struct dxva2_picture_context),
> +};
> +#endif
> +
> +AVHWAccel ff_vc1_dxva2_hwaccel = {
> +    .name           = "vc1_dxva2",
> +    .type           = AVMEDIA_TYPE_VIDEO,
> +    .id             = AV_CODEC_ID_VC1,
> +    .pix_fmt        = AV_PIX_FMT_DXVA2_VLD,
> +    .start_frame    = dxva2_vc1_start_frame,
> +    .decode_slice   = dxva2_vc1_decode_slice,
> +    .end_frame      = dxva2_vc1_end_frame,
> +    .frame_priv_data_size = sizeof(struct dxva2_picture_context),
> +};
> --
> 2.4.0
>
> _______________________________________________
> libav-stable mailing list
> libav-stable@libav.org
> https://lists.libav.org/mailman/listinfo/libav-stable
Steve Lhomme May 6, 2015, 2:42 p.m. | #2
New patch with a "template" naming scheme incoming.

On Wed, May 6, 2015 at 1:43 PM, Steve Lhomme <robux4@videolabs.io> wrote:
> Sending the patch to libav-devel
>
> On Wed, May 6, 2015 at 1:38 PM, Steve Lhomme <robux4@videolabs.io> wrote:
>> most calls to DXVA are now done via macros and the core C code is included
>> ---
>>  libavcodec/Makefile         | 12 ++++-----
>>  libavcodec/dxva.c           | 23 ++++++++++++++++++
>>  libavcodec/dxva2.c          | 42 +++++++++++++-------------------
>>  libavcodec/dxva2_h264.c     | 31 +++++++-----------------
>>  libavcodec/dxva2_hevc.c     | 30 +++++++----------------
>>  libavcodec/dxva2_internal.h | 19 +++++----------
>>  libavcodec/dxva2_mpeg2.c    | 31 +++++++-----------------
>>  libavcodec/dxva2_vc1.c      | 43 +++++++--------------------------
>>  libavcodec/dxva_h264.c      | 35 +++++++++++++++++++++++++++
>>  libavcodec/dxva_hevc.c      | 35 +++++++++++++++++++++++++++
>>  libavcodec/dxva_internal.h  | 59 +++++++++++++++++++++++++++++++++++++++++++++
>>  libavcodec/dxva_mpeg2.c     | 35 +++++++++++++++++++++++++++
>>  libavcodec/dxva_vc1.c       | 48 ++++++++++++++++++++++++++++++++++++
>>  13 files changed, 300 insertions(+), 143 deletions(-)
>>  create mode 100644 libavcodec/dxva.c
>>  create mode 100644 libavcodec/dxva_h264.c
>>  create mode 100644 libavcodec/dxva_hevc.c
>>  create mode 100644 libavcodec/dxva_internal.h
>>  create mode 100644 libavcodec/dxva_mpeg2.c
>>  create mode 100644 libavcodec/dxva_vc1.c
>>
>> diff --git a/libavcodec/Makefile b/libavcodec/Makefile
>> index fc8c6e9..66b3cbe 100644
>> --- a/libavcodec/Makefile
>> +++ b/libavcodec/Makefile
>> @@ -557,25 +557,25 @@ OBJS-$(CONFIG_ADPCM_YAMAHA_DECODER)       += adpcm.o adpcm_data.o
>>  OBJS-$(CONFIG_ADPCM_YAMAHA_ENCODER)       += adpcmenc.o adpcm_data.o
>>
>>  # hardware accelerators
>> -OBJS-$(CONFIG_DXVA2)                      += dxva2.o
>> +OBJS-$(CONFIG_DXVA2)                      += dxva.o
>>  OBJS-$(CONFIG_VAAPI)                      += vaapi.o
>>  OBJS-$(CONFIG_VDA)                        += vda.o
>>  OBJS-$(CONFIG_VDPAU)                      += vdpau.o
>>
>>  OBJS-$(CONFIG_H263_VAAPI_HWACCEL)         += vaapi_mpeg4.o
>>  OBJS-$(CONFIG_H263_VDPAU_HWACCEL)         += vdpau_mpeg4.o
>> -OBJS-$(CONFIG_H264_DXVA2_HWACCEL)         += dxva2_h264.o
>> +OBJS-$(CONFIG_H264_DXVA2_HWACCEL)         += dxva_h264.o
>>  OBJS-$(CONFIG_H264_VAAPI_HWACCEL)         += vaapi_h264.o
>>  OBJS-$(CONFIG_H264_VDA_HWACCEL)           += vda_h264.o
>>  OBJS-$(CONFIG_H264_VDPAU_HWACCEL)         += vdpau_h264.o
>> -OBJS-$(CONFIG_HEVC_DXVA2_HWACCEL)         += dxva2_hevc.o
>> +OBJS-$(CONFIG_HEVC_DXVA2_HWACCEL)         += dxva_hevc.o
>>  OBJS-$(CONFIG_MPEG1_VDPAU_HWACCEL)        += vdpau_mpeg12.o
>> -OBJS-$(CONFIG_MPEG2_DXVA2_HWACCEL)        += dxva2_mpeg2.o
>> +OBJS-$(CONFIG_MPEG2_DXVA2_HWACCEL)        += dxva_mpeg2.o
>>  OBJS-$(CONFIG_MPEG2_VAAPI_HWACCEL)        += vaapi_mpeg2.o
>>  OBJS-$(CONFIG_MPEG2_VDPAU_HWACCEL)        += vdpau_mpeg12.o
>>  OBJS-$(CONFIG_MPEG4_VAAPI_HWACCEL)        += vaapi_mpeg4.o
>>  OBJS-$(CONFIG_MPEG4_VDPAU_HWACCEL)        += vdpau_mpeg4.o
>> -OBJS-$(CONFIG_VC1_DXVA2_HWACCEL)          += dxva2_vc1.o
>> +OBJS-$(CONFIG_VC1_DXVA2_HWACCEL)          += dxva_vc1.o
>>  OBJS-$(CONFIG_VC1_VAAPI_HWACCEL)          += vaapi_vc1.o
>>  OBJS-$(CONFIG_VC1_VDPAU_HWACCEL)          += vdpau_vc1.o
>>
>> @@ -723,7 +723,7 @@ SKIPHEADERS                            += %_tablegen.h                  \
>>                                            tableprint.h                  \
>>                                            $(ARCH)/vp56_arith.h          \
>>
>> -SKIPHEADERS-$(CONFIG_DXVA2)            += dxva2.h dxva2_internal.h
>> +SKIPHEADERS-$(CONFIG_DXVA2)            += dxva.h dxva_internal.h dxva2_internal.h
>>  SKIPHEADERS-$(CONFIG_LIBSCHROEDINGER)  += libschroedinger.h
>>  SKIPHEADERS-$(CONFIG_MPEG_XVMC_DECODER) += xvmc.h
>>  SKIPHEADERS-$(CONFIG_QSV)              += qsv.h qsv_internal.h
>> diff --git a/libavcodec/dxva.c b/libavcodec/dxva.c
>> new file mode 100644
>> index 0000000..b28bea4
>> --- /dev/null
>> +++ b/libavcodec/dxva.c
>> @@ -0,0 +1,23 @@
>> +/*
>> + * DXVA2 HW acceleration.
>> + *
>> + * copyright (c) 2010 Laurent Aimar
>> + *
>> + * 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 "dxva_internal.h"
>> +#include "dxva2.c"
>> diff --git a/libavcodec/dxva2.c b/libavcodec/dxva2.c
>> index 9ee22c8..2ab2cb0 100644
>> --- a/libavcodec/dxva2.c
>> +++ b/libavcodec/dxva2.c
>> @@ -1,5 +1,5 @@
>>  /*
>> - * DXVA2 HW acceleration.
>> + * DirectX HW acceleration.
>>   *
>>   * copyright (c) 2010 Laurent Aimar
>>   *
>> @@ -28,17 +28,16 @@
>>
>>  #include "avcodec.h"
>>  #include "mpegvideo.h"
>> -#include "dxva2_internal.h"
>>
>> -void *ff_dxva2_get_surface(const AVFrame *frame)
>> +dxva_surface_t *ff_dxva2_get_surface(const AVFrame *frame)
>>  {
>> -    return frame->data[3];
>> +    return (dxva_surface_t*) frame->data[3];
>>  }
>>
>>  unsigned ff_dxva2_get_surface_index(const struct dxva_context *ctx,
>>                                      const AVFrame *frame)
>>  {
>> -    void *surface = ff_dxva2_get_surface(frame);
>> +    dxva_surface_t *surface = ff_dxva2_get_surface(frame);
>>      unsigned i;
>>
>>      for (i = 0; i < ctx->surface_count; i++)
>> @@ -51,8 +50,8 @@ unsigned ff_dxva2_get_surface_index(const struct dxva_context *ctx,
>>
>>  int ff_dxva2_commit_buffer(AVCodecContext *avctx,
>>                             struct dxva_context *ctx,
>> -                           DXVA2_DecodeBufferDesc *dsc,
>> -                           unsigned type, const void *data, unsigned size,
>> +                           DECODER_BUFFER_DESC *dsc,
>> +                           DECODER_BUFFER_TYPE type, const void *data, unsigned size,
>>                             unsigned mb_count)
>>  {
>>      void     *dxva_data;
>> @@ -60,8 +59,7 @@ int ff_dxva2_commit_buffer(AVCodecContext *avctx,
>>      int      result;
>>      HRESULT hr;
>>
>> -    hr = IDirectXVideoDecoder_GetBuffer(ctx->decoder, type,
>> -                                        &dxva_data, &dxva_size);
>> +    hr = DECODER_GET_BUFFER(ctx, type, &dxva_data, &dxva_size);
>>      if (FAILED(hr)) {
>>          av_log(avctx, AV_LOG_ERROR, "Failed to get a buffer for %u: 0x%lx\n",
>>                 type, hr);
>> @@ -71,7 +69,7 @@ int ff_dxva2_commit_buffer(AVCodecContext *avctx,
>>          memcpy(dxva_data, data, size);
>>
>>          memset(dsc, 0, sizeof(*dsc));
>> -        dsc->CompressedBufferType = type;
>> +        DECODER_BUFFER_DESC_SET_TYPE(dsc, type);
>>          dsc->DataSize             = size;
>>          dsc->NumMBsInBuffer       = mb_count;
>>
>> @@ -81,7 +79,7 @@ int ff_dxva2_commit_buffer(AVCodecContext *avctx,
>>          result = -1;
>>      }
>>
>> -    hr = IDirectXVideoDecoder_ReleaseBuffer(ctx->decoder, type);
>> +    hr = DECODER_RELEASE_BUFFER(ctx, type);
>>      if (FAILED(hr)) {
>>          av_log(avctx, AV_LOG_ERROR,
>>                 "Failed to release buffer type %u: 0x%lx\n",
>> @@ -95,20 +93,17 @@ int ff_dxva2_common_end_frame(AVCodecContext *avctx, AVFrame *frame,
>>                                const void *pp, unsigned pp_size,
>>                                const void *qm, unsigned qm_size,
>>                                int (*commit_bs_si)(AVCodecContext *,
>> -                                                  DXVA2_DecodeBufferDesc *bs,
>> -                                                  DXVA2_DecodeBufferDesc *slice))
>> +                                                  DECODER_BUFFER_DESC *bs,
>> +                                                  DECODER_BUFFER_DESC *slice))
>>  {
>>      struct dxva_context *ctx = avctx->hwaccel_context;
>>      unsigned               buffer_count = 0;
>> -    DXVA2_DecodeBufferDesc buffer[4];
>> -    DXVA2_DecodeExecuteParams exec = { 0 };
>> +    DECODER_BUFFER_DESC buffer[4];
>>      int result, runs = 0;
>>      HRESULT hr;
>>
>>      do {
>> -        hr = IDirectXVideoDecoder_BeginFrame(ctx->decoder,
>> -                                             ff_dxva2_get_surface(frame),
>> -                                             NULL);
>> +        hr = DECODER_BEGIN_FRAME(ctx, ff_dxva2_get_surface(frame));
>>          if (hr == E_PENDING)
>>              av_usleep(2000);
>>      } while (hr == E_PENDING && ++runs < 50);
>> @@ -119,7 +114,7 @@ int ff_dxva2_common_end_frame(AVCodecContext *avctx, AVFrame *frame,
>>      }
>>
>>      result = ff_dxva2_commit_buffer(avctx, ctx, &buffer[buffer_count],
>> -                                    DXVA2_PictureParametersBufferType,
>> +                                    DECODER_BUFTYPE_PICTURE_PARAMS,
>>                                      pp, pp_size, 0);
>>      if (result) {
>>          av_log(avctx, AV_LOG_ERROR,
>> @@ -130,7 +125,7 @@ int ff_dxva2_common_end_frame(AVCodecContext *avctx, AVFrame *frame,
>>
>>      if (qm_size > 0) {
>>          result = ff_dxva2_commit_buffer(avctx, ctx, &buffer[buffer_count],
>> -                                        DXVA2_InverseQuantizationMatrixBufferType,
>> +                                        DECODER_BUFTYPE_QUANT_MATRIX,
>>                                          qm, qm_size, 0);
>>          if (result) {
>>              av_log(avctx, AV_LOG_ERROR,
>> @@ -154,17 +149,14 @@ int ff_dxva2_common_end_frame(AVCodecContext *avctx, AVFrame *frame,
>>
>>      assert(buffer_count == 1 + (qm_size > 0) + 2);
>>
>> -    exec.NumCompBuffers      = buffer_count;
>> -    exec.pCompressedBuffers  = buffer;
>> -    exec.pExtensionData      = NULL;
>> -    hr = IDirectXVideoDecoder_Execute(ctx->decoder, &exec);
>> +    hr = DECODER_SUBMIT_BUFFER(ctx, buffer, buffer_count);
>>      if (FAILED(hr)) {
>>          av_log(avctx, AV_LOG_ERROR, "Failed to execute: 0x%lx\n", hr);
>>          result = -1;
>>      }
>>
>>  end:
>> -    hr = IDirectXVideoDecoder_EndFrame(ctx->decoder, NULL);
>> +    hr = DECODER_END_FRAME(ctx);
>>      if (FAILED(hr)) {
>>          av_log(avctx, AV_LOG_ERROR, "Failed to end frame: 0x%lx\n", hr);
>>          result = -1;
>> diff --git a/libavcodec/dxva2_h264.c b/libavcodec/dxva2_h264.c
>> index a5e9705..777086b 100644
>> --- a/libavcodec/dxva2_h264.c
>> +++ b/libavcodec/dxva2_h264.c
>> @@ -1,5 +1,5 @@
>>  /*
>> - * DXVA2 H264 HW acceleration.
>> + * DirectX H264 HW acceleration.
>>   *
>>   * copyright (c) 2009 Laurent Aimar
>>   *
>> @@ -20,7 +20,6 @@
>>   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
>>   */
>>
>> -#include "dxva2_internal.h"
>>  #include "h264.h"
>>  #include "h264data.h"
>>  #include "mpegutils.h"
>> @@ -289,8 +288,8 @@ static void fill_slice_long(AVCodecContext *avctx, DXVA_Slice_H264_Long *slice,
>>  }
>>
>>  static int commit_bitstream_and_slice_buffer(AVCodecContext *avctx,
>> -                                             DXVA2_DecodeBufferDesc *bs,
>> -                                             DXVA2_DecodeBufferDesc *sc)
>> +                                             DECODER_BUFFER_DESC *bs,
>> +                                             DECODER_BUFFER_DESC *sc)
>>  {
>>      const H264Context *h = avctx->priv_data;
>>      const unsigned mb_count = h->mb_width * h->mb_height;
>> @@ -307,9 +306,9 @@ static int commit_bitstream_and_slice_buffer(AVCodecContext *avctx,
>>      unsigned i;
>>
>>      /* Create an annex B bitstream buffer with only slice NAL and finalize slice */
>> -    if (FAILED(IDirectXVideoDecoder_GetBuffer(ctx->decoder,
>> -                                              DXVA2_BitStreamDateBufferType,
>> -                                              &dxva_data_ptr, &dxva_size)))
>> +    if (FAILED(DECODER_GET_BUFFER(ctx,
>> +                                     DECODER_BUFTYPE_BITSTREAM,
>> +                                     &dxva_data_ptr, &dxva_size)))
>>          return -1;
>>
>>      dxva_data = dxva_data_ptr;
>> @@ -363,14 +362,13 @@ static int commit_bitstream_and_slice_buffer(AVCodecContext *avctx,
>>
>>          slice->SliceBytesInBuffer += padding;
>>      }
>> -    if (FAILED(IDirectXVideoDecoder_ReleaseBuffer(ctx->decoder,
>> -                                                  DXVA2_BitStreamDateBufferType)))
>> +    if (FAILED(DECODER_RELEASE_BUFFER(ctx, DECODER_BUFTYPE_BITSTREAM)))
>>          return -1;
>>      if (i < ctx_pic->slice_count)
>>          return -1;
>>
>>      memset(bs, 0, sizeof(*bs));
>> -    bs->CompressedBufferType = DXVA2_BitStreamDateBufferType;
>> +    DECODER_BUFFER_DESC_SET_TYPE(bs, DECODER_BUFTYPE_BITSTREAM);
>>      bs->DataSize             = current - dxva_data;
>>      bs->NumMBsInBuffer       = mb_count;
>>
>> @@ -383,7 +381,7 @@ static int commit_bitstream_and_slice_buffer(AVCodecContext *avctx,
>>      }
>>      assert((bs->DataSize & 127) == 0);
>>      return ff_dxva2_commit_buffer(avctx, ctx, sc,
>> -                                  DXVA2_SliceControlBufferType,
>> +                                  DECODER_BUFTYPE_SLICE_CONTROL,
>>                                    slice_data, slice_size, mb_count);
>>  }
>>
>> @@ -462,14 +460,3 @@ static int dxva2_h264_end_frame(AVCodecContext *avctx)
>>          ff_h264_draw_horiz_band(h, sl, 0, h->avctx->height);
>>      return ret;
>>  }
>> -
>> -AVHWAccel ff_h264_dxva2_hwaccel = {
>> -    .name           = "h264_dxva2",
>> -    .type           = AVMEDIA_TYPE_VIDEO,
>> -    .id             = AV_CODEC_ID_H264,
>> -    .pix_fmt        = AV_PIX_FMT_DXVA2_VLD,
>> -    .start_frame    = dxva2_h264_start_frame,
>> -    .decode_slice   = dxva2_h264_decode_slice,
>> -    .end_frame      = dxva2_h264_end_frame,
>> -    .frame_priv_data_size = sizeof(struct dxva2_picture_context),
>> -};
>> diff --git a/libavcodec/dxva2_hevc.c b/libavcodec/dxva2_hevc.c
>> index 257bee7..6821689 100644
>> --- a/libavcodec/dxva2_hevc.c
>> +++ b/libavcodec/dxva2_hevc.c
>> @@ -1,5 +1,5 @@
>>  /*
>> - * DXVA2 HEVC HW acceleration.
>> + * DirectX HEVC HW acceleration.
>>   *
>>   * copyright (c) 2014 - 2015 Hendrik Leppkes
>>   *
>> @@ -22,7 +22,6 @@
>>
>>  #include "libavutil/avassert.h"
>>
>> -#include "dxva2_internal.h"
>>  #include "hevc.h"
>>
>>  #define MAX_SLICES 256
>> @@ -228,8 +227,8 @@ static void fill_slice_short(DXVA_Slice_HEVC_Short *slice,
>>  }
>>
>>  static int commit_bitstream_and_slice_buffer(AVCodecContext *avctx,
>> -                                             DXVA2_DecodeBufferDesc *bs,
>> -                                             DXVA2_DecodeBufferDesc *sc)
>> +                                             DECODER_BUFFER_DESC *bs,
>> +                                             DECODER_BUFFER_DESC *sc)
>>  {
>>      const HEVCContext *h = avctx->priv_data;
>>      struct dxva_context *ctx = avctx->hwaccel_context;
>> @@ -245,9 +244,9 @@ static int commit_bitstream_and_slice_buffer(AVCodecContext *avctx,
>>      unsigned i;
>>
>>      /* Create an annex B bitstream buffer with only slice NAL and finalize slice */
>> -    if (FAILED(IDirectXVideoDecoder_GetBuffer(ctx->decoder,
>> -                                              DXVA2_BitStreamDateBufferType,
>> -                                              &dxva_data_ptr, &dxva_size)))
>> +    if (FAILED(DECODER_GET_BUFFER(ctx,
>> +                                     DECODER_BUFTYPE_BITSTREAM,
>> +                                     &dxva_data_ptr, &dxva_size)))
>>          return -1;
>>
>>      dxva_data = dxva_data_ptr;
>> @@ -284,14 +283,13 @@ static int commit_bitstream_and_slice_buffer(AVCodecContext *avctx,
>>
>>          slice->SliceBytesInBuffer += padding;
>>      }
>> -    if (FAILED(IDirectXVideoDecoder_ReleaseBuffer(ctx->decoder,
>> -                                                  DXVA2_BitStreamDateBufferType)))
>> +    if (FAILED(DECODER_RELEASE_BUFFER(ctx, DECODER_BUFTYPE_BITSTREAM)))
>>          return -1;
>>      if (i < ctx_pic->slice_count)
>>          return -1;
>>
>>      memset(bs, 0, sizeof(*bs));
>> -    bs->CompressedBufferType = DXVA2_BitStreamDateBufferType;
>> +    DECODER_BUFFER_DESC_SET_TYPE(bs, DECODER_BUFTYPE_BITSTREAM);
>>      bs->DataSize             = current - dxva_data;
>>      bs->NumMBsInBuffer       = 0;
>>
>> @@ -300,7 +298,7 @@ static int commit_bitstream_and_slice_buffer(AVCodecContext *avctx,
>>
>>      av_assert0((bs->DataSize & 127) == 0);
>>      return ff_dxva2_commit_buffer(avctx, ctx, sc,
>> -                                  DXVA2_SliceControlBufferType,
>> +                                  DECODER_BUFTYPE_SLICE_CONTROL,
>>                                    slice_data, slice_size, 0);
>>  }
>>
>> @@ -369,13 +367,3 @@ static int dxva2_hevc_end_frame(AVCodecContext *avctx)
>>      return ret;
>>  }
>>
>> -AVHWAccel ff_hevc_dxva2_hwaccel = {
>> -    .name           = "hevc_dxva2",
>> -    .type           = AVMEDIA_TYPE_VIDEO,
>> -    .id             = AV_CODEC_ID_HEVC,
>> -    .pix_fmt        = AV_PIX_FMT_DXVA2_VLD,
>> -    .start_frame    = dxva2_hevc_start_frame,
>> -    .decode_slice   = dxva2_hevc_decode_slice,
>> -    .end_frame      = dxva2_hevc_end_frame,
>> -    .frame_priv_data_size = sizeof(struct hevc_dxva2_picture_context),
>> -};
>> diff --git a/libavcodec/dxva2_internal.h b/libavcodec/dxva2_internal.h
>> index b775e6c..9ff08e7 100644
>> --- a/libavcodec/dxva2_internal.h
>> +++ b/libavcodec/dxva2_internal.h
>> @@ -1,5 +1,5 @@
>>  /*
>> - * DXVA2 HW acceleration
>> + * DirectX HW acceleration
>>   *
>>   * copyright (c) 2010 Laurent Aimar
>>   *
>> @@ -23,26 +23,19 @@
>>  #ifndef AVCODEC_DXVA_INTERNAL_H
>>  #define AVCODEC_DXVA_INTERNAL_H
>>
>> -#define COBJMACROS
>> -
>>  #include "config.h"
>>
>> -#include "dxva2.h"
>> -#if HAVE_DXVA_H
>> -#include <dxva.h>
>> -#endif
>> -
>>  #include "avcodec.h"
>>  #include "mpegvideo.h"
>>
>> -void *ff_dxva2_get_surface(const AVFrame *frame);
>> +dxva_surface_t *ff_dxva2_get_surface(const AVFrame *frame);
>>
>>  unsigned ff_dxva2_get_surface_index(const struct dxva_context *,
>>                                      const AVFrame *frame);
>>
>>  int ff_dxva2_commit_buffer(AVCodecContext *, struct dxva_context *,
>> -                           DXVA2_DecodeBufferDesc *,
>> -                           unsigned type, const void *data, unsigned size,
>> +                           DECODER_BUFFER_DESC *,
>> +                           DECODER_BUFFER_TYPE type, const void *data, unsigned size,
>>                             unsigned mb_count);
>>
>>
>> @@ -50,7 +43,7 @@ int ff_dxva2_common_end_frame(AVCodecContext *, AVFrame *,
>>                                const void *pp, unsigned pp_size,
>>                                const void *qm, unsigned qm_size,
>>                                int (*commit_bs_si)(AVCodecContext *,
>> -                                                  DXVA2_DecodeBufferDesc *bs,
>> -                                                  DXVA2_DecodeBufferDesc *slice));
>> +                                                  DECODER_BUFFER_DESC *bs,
>> +                                                  DECODER_BUFFER_DESC *slice));
>>
>>  #endif /* AVCODEC_DXVA_INTERNAL_H */
>> diff --git a/libavcodec/dxva2_mpeg2.c b/libavcodec/dxva2_mpeg2.c
>> index 65624e3..1edda82 100644
>> --- a/libavcodec/dxva2_mpeg2.c
>> +++ b/libavcodec/dxva2_mpeg2.c
>> @@ -1,5 +1,5 @@
>>  /*
>> - * MPEG-2 HW acceleration.
>> + * DirectX MPEG-2 HW acceleration.
>>   *
>>   * copyright (c) 2010 Laurent Aimar
>>   *
>> @@ -21,7 +21,6 @@
>>   */
>>
>>  #include "libavutil/log.h"
>> -#include "dxva2_internal.h"
>>  #include "mpegutils.h"
>>
>>  #define MAX_SLICES 1024
>> @@ -147,8 +146,8 @@ static void fill_slice(AVCodecContext *avctx,
>>      slice->wMBbitOffset        = 4 * 8 + get_bits_count(&gb);
>>  }
>>  static int commit_bitstream_and_slice_buffer(AVCodecContext *avctx,
>> -                                             DXVA2_DecodeBufferDesc *bs,
>> -                                             DXVA2_DecodeBufferDesc *sc)
>> +                                             DECODER_BUFFER_DESC *bs,
>> +                                             DECODER_BUFFER_DESC *sc)
>>  {
>>      const struct MpegEncContext *s = avctx->priv_data;
>>      struct dxva_context *ctx = avctx->hwaccel_context;
>> @@ -161,9 +160,9 @@ static int commit_bitstream_and_slice_buffer(AVCodecContext *avctx,
>>      unsigned dxva_size;
>>      unsigned i;
>>
>> -    if (FAILED(IDirectXVideoDecoder_GetBuffer(ctx->decoder,
>> -                                              DXVA2_BitStreamDateBufferType,
>> -                                              &dxva_data_ptr, &dxva_size)))
>> +    if (FAILED(DECODER_GET_BUFFER(ctx,
>> +                                     DECODER_BUFTYPE_BITSTREAM,
>> +                                  &dxva_data_ptr, &dxva_size)))
>>          return -1;
>>
>>      dxva_data = dxva_data_ptr;
>> @@ -190,19 +189,18 @@ static int commit_bitstream_and_slice_buffer(AVCodecContext *avctx,
>>          memcpy(current, &ctx_pic->bitstream[position], size);
>>          current += size;
>>      }
>> -    if (FAILED(IDirectXVideoDecoder_ReleaseBuffer(ctx->decoder,
>> -                                                  DXVA2_BitStreamDateBufferType)))
>> +    if (FAILED(DECODER_RELEASE_BUFFER(ctx, DECODER_BUFTYPE_BITSTREAM)))
>>          return -1;
>>      if (i < ctx_pic->slice_count)
>>          return -1;
>>
>>      memset(bs, 0, sizeof(*bs));
>> -    bs->CompressedBufferType = DXVA2_BitStreamDateBufferType;
>> +    DECODER_BUFFER_DESC_SET_TYPE(bs, DECODER_BUFTYPE_BITSTREAM);
>>      bs->DataSize             = current - dxva_data;
>>      bs->NumMBsInBuffer       = mb_count;
>>
>>      return ff_dxva2_commit_buffer(avctx, ctx, sc,
>> -                                  DXVA2_SliceControlBufferType,
>> +                                  DECODER_BUFTYPE_SLICE_CONTROL,
>>                                    ctx_pic->slice,
>>                                    ctx_pic->slice_count * sizeof(*ctx_pic->slice),
>>                                    mb_count);
>> @@ -270,14 +268,3 @@ static int dxva2_mpeg2_end_frame(AVCodecContext *avctx)
>>          ff_mpeg_draw_horiz_band(s, 0, avctx->height);
>>      return ret;
>>  }
>> -
>> -AVHWAccel ff_mpeg2_dxva2_hwaccel = {
>> -    .name           = "mpeg2_dxva2",
>> -    .type           = AVMEDIA_TYPE_VIDEO,
>> -    .id             = AV_CODEC_ID_MPEG2VIDEO,
>> -    .pix_fmt        = AV_PIX_FMT_DXVA2_VLD,
>> -    .start_frame    = dxva2_mpeg2_start_frame,
>> -    .decode_slice   = dxva2_mpeg2_decode_slice,
>> -    .end_frame      = dxva2_mpeg2_end_frame,
>> -    .frame_priv_data_size = sizeof(struct dxva2_picture_context),
>> -};
>> diff --git a/libavcodec/dxva2_vc1.c b/libavcodec/dxva2_vc1.c
>> index 1524b51..210b95d 100644
>> --- a/libavcodec/dxva2_vc1.c
>> +++ b/libavcodec/dxva2_vc1.c
>> @@ -1,5 +1,5 @@
>>  /*
>> - * DXVA2 WMV3/VC-1 HW acceleration.
>> + * DirectX WMV3/VC-1 HW acceleration.
>>   *
>>   * copyright (c) 2010 Laurent Aimar
>>   *
>> @@ -20,7 +20,6 @@
>>   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
>>   */
>>
>> -#include "dxva2_internal.h"
>>  #include "mpegutils.h"
>>  #include "vc1.h"
>>  #include "vc1data.h"
>> @@ -157,8 +156,8 @@ static void fill_slice(AVCodecContext *avctx, DXVA_SliceInfo *slice,
>>  }
>>
>>  static int commit_bitstream_and_slice_buffer(AVCodecContext *avctx,
>> -                                             DXVA2_DecodeBufferDesc *bs,
>> -                                             DXVA2_DecodeBufferDesc *sc)
>> +                                             DECODER_BUFFER_DESC *bs,
>> +                                             DECODER_BUFFER_DESC *sc)
>>  {
>>      const VC1Context *v = avctx->priv_data;
>>      struct dxva_context *ctx = avctx->hwaccel_context;
>> @@ -178,9 +177,9 @@ static int commit_bitstream_and_slice_buffer(AVCodecContext *avctx,
>>      unsigned dxva_size;
>>      int result;
>>
>> -    if (FAILED(IDirectXVideoDecoder_GetBuffer(ctx->decoder,
>> -                                              DXVA2_BitStreamDateBufferType,
>> -                                              &dxva_data_ptr, &dxva_size)))
>> +    if (FAILED(DECODER_GET_BUFFER(ctx,
>> +                                     DECODER_BUFTYPE_BITSTREAM,
>> +                                  &dxva_data_ptr, &dxva_size)))
>>          return -1;
>>
>>      dxva_data = dxva_data_ptr;
>> @@ -194,20 +193,19 @@ static int commit_bitstream_and_slice_buffer(AVCodecContext *avctx,
>>              memset(dxva_data + start_code_size + slice_size, 0, padding);
>>          slice->dwSliceBitsInBuffer = 8 * data_size;
>>      }
>> -    if (FAILED(IDirectXVideoDecoder_ReleaseBuffer(ctx->decoder,
>> -                                                  DXVA2_BitStreamDateBufferType)))
>> +    if (FAILED(DECODER_RELEASE_BUFFER(ctx, DECODER_BUFTYPE_BITSTREAM)))
>>          return -1;
>>      if (result)
>>          return result;
>>
>>      memset(bs, 0, sizeof(*bs));
>> -    bs->CompressedBufferType = DXVA2_BitStreamDateBufferType;
>> +    DECODER_BUFFER_DESC_SET_TYPE(bs, DECODER_BUFTYPE_BITSTREAM);
>>      bs->DataSize             = data_size;
>>      bs->NumMBsInBuffer       = s->mb_width * s->mb_height;
>>      assert((bs->DataSize & 127) == 0);
>>
>>      return ff_dxva2_commit_buffer(avctx, ctx, sc,
>> -                                  DXVA2_SliceControlBufferType,
>> +                                  DECODER_BUFTYPE_SLICE_CONTROL,
>>                                    slice, sizeof(*slice), bs->NumMBsInBuffer);
>>  }
>>
>> @@ -272,26 +270,3 @@ static int dxva2_vc1_end_frame(AVCodecContext *avctx)
>>      return ret;
>>  }
>>
>> -#if CONFIG_WMV3_DXVA2_HWACCEL
>> -AVHWAccel ff_wmv3_dxva2_hwaccel = {
>> -    .name           = "wmv3_dxva2",
>> -    .type           = AVMEDIA_TYPE_VIDEO,
>> -    .id             = AV_CODEC_ID_WMV3,
>> -    .pix_fmt        = AV_PIX_FMT_DXVA2_VLD,
>> -    .start_frame    = dxva2_vc1_start_frame,
>> -    .decode_slice   = dxva2_vc1_decode_slice,
>> -    .end_frame      = dxva2_vc1_end_frame,
>> -    .frame_priv_data_size = sizeof(struct dxva2_picture_context),
>> -};
>> -#endif
>> -
>> -AVHWAccel ff_vc1_dxva2_hwaccel = {
>> -    .name           = "vc1_dxva2",
>> -    .type           = AVMEDIA_TYPE_VIDEO,
>> -    .id             = AV_CODEC_ID_VC1,
>> -    .pix_fmt        = AV_PIX_FMT_DXVA2_VLD,
>> -    .start_frame    = dxva2_vc1_start_frame,
>> -    .decode_slice   = dxva2_vc1_decode_slice,
>> -    .end_frame      = dxva2_vc1_end_frame,
>> -    .frame_priv_data_size = sizeof(struct dxva2_picture_context),
>> -};
>> diff --git a/libavcodec/dxva_h264.c b/libavcodec/dxva_h264.c
>> new file mode 100644
>> index 0000000..68bf70d
>> --- /dev/null
>> +++ b/libavcodec/dxva_h264.c
>> @@ -0,0 +1,35 @@
>> +/*
>> + * DXVA2 H264 HW acceleration.
>> + *
>> + * copyright (c) 2009 Laurent Aimar
>> + *
>> + * 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 "dxva_internal.h"
>> +#include "dxva2_h264.c"
>> +
>> +AVHWAccel ff_h264_dxva2_hwaccel = {
>> +    .name           = "h264_dxva2",
>> +    .type           = AVMEDIA_TYPE_VIDEO,
>> +    .id             = AV_CODEC_ID_H264,
>> +    .pix_fmt        = AV_PIX_FMT_DXVA2_VLD,
>> +    .start_frame    = dxva2_h264_start_frame,
>> +    .decode_slice   = dxva2_h264_decode_slice,
>> +    .end_frame      = dxva2_h264_end_frame,
>> +    .frame_priv_data_size = sizeof(struct dxva2_picture_context),
>> +};
>> diff --git a/libavcodec/dxva_hevc.c b/libavcodec/dxva_hevc.c
>> new file mode 100644
>> index 0000000..ee6ebde
>> --- /dev/null
>> +++ b/libavcodec/dxva_hevc.c
>> @@ -0,0 +1,35 @@
>> +/*
>> + * DXVA2 HEVC HW acceleration.
>> + *
>> + * copyright (c) 2014 - 2015 Hendrik Leppkes
>> + *
>> + * 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 "dxva_internal.h"
>> +#include "dxva2_hevc.c"
>> +
>> +AVHWAccel ff_hevc_dxva2_hwaccel = {
>> +    .name           = "hevc_dxva2",
>> +    .type           = AVMEDIA_TYPE_VIDEO,
>> +    .id             = AV_CODEC_ID_HEVC,
>> +    .pix_fmt        = AV_PIX_FMT_DXVA2_VLD,
>> +    .start_frame    = dxva2_hevc_start_frame,
>> +    .decode_slice   = dxva2_hevc_decode_slice,
>> +    .end_frame      = dxva2_hevc_end_frame,
>> +    .frame_priv_data_size = sizeof(struct hevc_dxva2_picture_context),
>> +};
>> diff --git a/libavcodec/dxva_internal.h b/libavcodec/dxva_internal.h
>> new file mode 100644
>> index 0000000..8050730
>> --- /dev/null
>> +++ b/libavcodec/dxva_internal.h
>> @@ -0,0 +1,59 @@
>> +/*
>> + * DXVA2 HW acceleration
>> + *
>> + * copyright (c) 2010 Laurent Aimar
>> + * 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
>> + */
>> +
>> +#ifndef AVCODEC_DXVA2_INTERNAL_H
>> +#define AVCODEC_DXVA2_INTERNAL_H
>> +
>> +#define COBJMACROS
>> +
>> +#include "dxva2.h"
>> +#include <dxva.h>
>> +
>> +#define dxva_surface_t                    IDirect3DSurface9
>> +#define DECODER_BUFFER_DESC               DXVA2_DecodeBufferDesc
>> +#define DECODER_BUFFER_TYPE               unsigned
>> +#define DECODER_GET_BUFFER(ctx,t,b,s)     IDirectXVideoDecoder_GetBuffer(ctx->decoder, t,b,s)
>> +
>> +static inline HRESULT DECODER_SUBMIT_BUFFER(struct dxva_context *ctx, DECODER_BUFFER_DESC *buffer, unsigned buffer_count) {
>> +    DXVA2_DecodeExecuteParams exec = {
>> +        .pCompressedBuffers = buffer,
>> +        .NumCompBuffers = buffer_count,
>> +        .pExtensionData = NULL,
>> +    };
>> +    return IDirectXVideoDecoder_Execute(ctx->decoder, &exec);
>> +}
>> +
>> +#define DECODER_RELEASE_BUFFER(ctx,t)     IDirectXVideoDecoder_ReleaseBuffer(ctx->decoder, t)
>> +#define DECODER_BEGIN_FRAME(ctx,s)        IDirectXVideoDecoder_BeginFrame(ctx->decoder, s, NULL)
>> +#define DECODER_END_FRAME(ctx)            IDirectXVideoDecoder_EndFrame(ctx->decoder, NULL)
>> +
>> +#define DECODER_BUFTYPE_PICTURE_PARAMS    DXVA2_PictureParametersBufferType
>> +#define DECODER_BUFTYPE_QUANT_MATRIX      DXVA2_InverseQuantizationMatrixBufferType
>> +#define DECODER_BUFTYPE_BITSTREAM         DXVA2_BitStreamDateBufferType
>> +#define DECODER_BUFTYPE_SLICE_CONTROL     DXVA2_SliceControlBufferType
>> +
>> +#define DECODER_BUFFER_DESC_SET_TYPE(dsc, type)   dsc->CompressedBufferType = type
>> +
>> +#include "dxva2_internal.h"
>> +
>> +#endif /* AVCODEC_DXVA2_INTERNAL_H */
>> diff --git a/libavcodec/dxva_mpeg2.c b/libavcodec/dxva_mpeg2.c
>> new file mode 100644
>> index 0000000..681288c
>> --- /dev/null
>> +++ b/libavcodec/dxva_mpeg2.c
>> @@ -0,0 +1,35 @@
>> +/*
>> + * DXVA2 MPEG-2 HW acceleration.
>> + *
>> + * copyright (c) 2010 Laurent Aimar
>> + *
>> + * 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 "dxva_internal.h"
>> +#include "dxva2_mpeg2.c"
>> +
>> +AVHWAccel ff_mpeg2_dxva2_hwaccel = {
>> +    .name           = "mpeg2_dxva2",
>> +    .type           = AVMEDIA_TYPE_VIDEO,
>> +    .id             = AV_CODEC_ID_MPEG2VIDEO,
>> +    .pix_fmt        = AV_PIX_FMT_DXVA2_VLD,
>> +    .start_frame    = dxva2_mpeg2_start_frame,
>> +    .decode_slice   = dxva2_mpeg2_decode_slice,
>> +    .end_frame      = dxva2_mpeg2_end_frame,
>> +    .frame_priv_data_size = sizeof(struct dxva2_picture_context),
>> +};
>> diff --git a/libavcodec/dxva_vc1.c b/libavcodec/dxva_vc1.c
>> new file mode 100644
>> index 0000000..12a74c5
>> --- /dev/null
>> +++ b/libavcodec/dxva_vc1.c
>> @@ -0,0 +1,48 @@
>> +/*
>> + * DXVA2 WMV3/VC-1 HW acceleration.
>> + *
>> + * copyright (c) 2010 Laurent Aimar
>> + *
>> + * 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 "dxva_internal.h"
>> +#include "dxva2_vc1.c"
>> +
>> +#if CONFIG_WMV3_DXVA2_HWACCEL
>> +AVHWAccel ff_wmv3_dxva2_hwaccel = {
>> +    .name           = "wmv3_dxva2",
>> +    .type           = AVMEDIA_TYPE_VIDEO,
>> +    .id             = AV_CODEC_ID_WMV3,
>> +    .pix_fmt        = AV_PIX_FMT_DXVA2_VLD,
>> +    .start_frame    = dxva2_vc1_start_frame,
>> +    .decode_slice   = dxva2_vc1_decode_slice,
>> +    .end_frame      = dxva2_vc1_end_frame,
>> +    .frame_priv_data_size = sizeof(struct dxva2_picture_context),
>> +};
>> +#endif
>> +
>> +AVHWAccel ff_vc1_dxva2_hwaccel = {
>> +    .name           = "vc1_dxva2",
>> +    .type           = AVMEDIA_TYPE_VIDEO,
>> +    .id             = AV_CODEC_ID_VC1,
>> +    .pix_fmt        = AV_PIX_FMT_DXVA2_VLD,
>> +    .start_frame    = dxva2_vc1_start_frame,
>> +    .decode_slice   = dxva2_vc1_decode_slice,
>> +    .end_frame      = dxva2_vc1_end_frame,
>> +    .frame_priv_data_size = sizeof(struct dxva2_picture_context),
>> +};
>> --
>> 2.4.0
>>
>> _______________________________________________
>> libav-stable mailing list
>> libav-stable@libav.org
>> https://lists.libav.org/mailman/listinfo/libav-stable
> _______________________________________________
> libav-stable mailing list
> libav-stable@libav.org
> https://lists.libav.org/mailman/listinfo/libav-stable

Patch

diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index fc8c6e9..66b3cbe 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -557,25 +557,25 @@  OBJS-$(CONFIG_ADPCM_YAMAHA_DECODER)       += adpcm.o adpcm_data.o
 OBJS-$(CONFIG_ADPCM_YAMAHA_ENCODER)       += adpcmenc.o adpcm_data.o
 
 # hardware accelerators
-OBJS-$(CONFIG_DXVA2)                      += dxva2.o
+OBJS-$(CONFIG_DXVA2)                      += dxva.o
 OBJS-$(CONFIG_VAAPI)                      += vaapi.o
 OBJS-$(CONFIG_VDA)                        += vda.o
 OBJS-$(CONFIG_VDPAU)                      += vdpau.o
 
 OBJS-$(CONFIG_H263_VAAPI_HWACCEL)         += vaapi_mpeg4.o
 OBJS-$(CONFIG_H263_VDPAU_HWACCEL)         += vdpau_mpeg4.o
-OBJS-$(CONFIG_H264_DXVA2_HWACCEL)         += dxva2_h264.o
+OBJS-$(CONFIG_H264_DXVA2_HWACCEL)         += dxva_h264.o
 OBJS-$(CONFIG_H264_VAAPI_HWACCEL)         += vaapi_h264.o
 OBJS-$(CONFIG_H264_VDA_HWACCEL)           += vda_h264.o
 OBJS-$(CONFIG_H264_VDPAU_HWACCEL)         += vdpau_h264.o
-OBJS-$(CONFIG_HEVC_DXVA2_HWACCEL)         += dxva2_hevc.o
+OBJS-$(CONFIG_HEVC_DXVA2_HWACCEL)         += dxva_hevc.o
 OBJS-$(CONFIG_MPEG1_VDPAU_HWACCEL)        += vdpau_mpeg12.o
-OBJS-$(CONFIG_MPEG2_DXVA2_HWACCEL)        += dxva2_mpeg2.o
+OBJS-$(CONFIG_MPEG2_DXVA2_HWACCEL)        += dxva_mpeg2.o
 OBJS-$(CONFIG_MPEG2_VAAPI_HWACCEL)        += vaapi_mpeg2.o
 OBJS-$(CONFIG_MPEG2_VDPAU_HWACCEL)        += vdpau_mpeg12.o
 OBJS-$(CONFIG_MPEG4_VAAPI_HWACCEL)        += vaapi_mpeg4.o
 OBJS-$(CONFIG_MPEG4_VDPAU_HWACCEL)        += vdpau_mpeg4.o
-OBJS-$(CONFIG_VC1_DXVA2_HWACCEL)          += dxva2_vc1.o
+OBJS-$(CONFIG_VC1_DXVA2_HWACCEL)          += dxva_vc1.o
 OBJS-$(CONFIG_VC1_VAAPI_HWACCEL)          += vaapi_vc1.o
 OBJS-$(CONFIG_VC1_VDPAU_HWACCEL)          += vdpau_vc1.o
 
@@ -723,7 +723,7 @@  SKIPHEADERS                            += %_tablegen.h                  \
                                           tableprint.h                  \
                                           $(ARCH)/vp56_arith.h          \
 
-SKIPHEADERS-$(CONFIG_DXVA2)            += dxva2.h dxva2_internal.h
+SKIPHEADERS-$(CONFIG_DXVA2)            += dxva.h dxva_internal.h dxva2_internal.h
 SKIPHEADERS-$(CONFIG_LIBSCHROEDINGER)  += libschroedinger.h
 SKIPHEADERS-$(CONFIG_MPEG_XVMC_DECODER) += xvmc.h
 SKIPHEADERS-$(CONFIG_QSV)              += qsv.h qsv_internal.h
diff --git a/libavcodec/dxva.c b/libavcodec/dxva.c
new file mode 100644
index 0000000..b28bea4
--- /dev/null
+++ b/libavcodec/dxva.c
@@ -0,0 +1,23 @@ 
+/*
+ * DXVA2 HW acceleration.
+ *
+ * copyright (c) 2010 Laurent Aimar
+ *
+ * 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 "dxva_internal.h"
+#include "dxva2.c"
diff --git a/libavcodec/dxva2.c b/libavcodec/dxva2.c
index 9ee22c8..2ab2cb0 100644
--- a/libavcodec/dxva2.c
+++ b/libavcodec/dxva2.c
@@ -1,5 +1,5 @@ 
 /*
- * DXVA2 HW acceleration.
+ * DirectX HW acceleration.
  *
  * copyright (c) 2010 Laurent Aimar
  *
@@ -28,17 +28,16 @@ 
 
 #include "avcodec.h"
 #include "mpegvideo.h"
-#include "dxva2_internal.h"
 
-void *ff_dxva2_get_surface(const AVFrame *frame)
+dxva_surface_t *ff_dxva2_get_surface(const AVFrame *frame)
 {
-    return frame->data[3];
+    return (dxva_surface_t*) frame->data[3];
 }
 
 unsigned ff_dxva2_get_surface_index(const struct dxva_context *ctx,
                                     const AVFrame *frame)
 {
-    void *surface = ff_dxva2_get_surface(frame);
+    dxva_surface_t *surface = ff_dxva2_get_surface(frame);
     unsigned i;
 
     for (i = 0; i < ctx->surface_count; i++)
@@ -51,8 +50,8 @@  unsigned ff_dxva2_get_surface_index(const struct dxva_context *ctx,
 
 int ff_dxva2_commit_buffer(AVCodecContext *avctx,
                            struct dxva_context *ctx,
-                           DXVA2_DecodeBufferDesc *dsc,
-                           unsigned type, const void *data, unsigned size,
+                           DECODER_BUFFER_DESC *dsc,
+                           DECODER_BUFFER_TYPE type, const void *data, unsigned size,
                            unsigned mb_count)
 {
     void     *dxva_data;
@@ -60,8 +59,7 @@  int ff_dxva2_commit_buffer(AVCodecContext *avctx,
     int      result;
     HRESULT hr;
 
-    hr = IDirectXVideoDecoder_GetBuffer(ctx->decoder, type,
-                                        &dxva_data, &dxva_size);
+    hr = DECODER_GET_BUFFER(ctx, type, &dxva_data, &dxva_size);
     if (FAILED(hr)) {
         av_log(avctx, AV_LOG_ERROR, "Failed to get a buffer for %u: 0x%lx\n",
                type, hr);
@@ -71,7 +69,7 @@  int ff_dxva2_commit_buffer(AVCodecContext *avctx,
         memcpy(dxva_data, data, size);
 
         memset(dsc, 0, sizeof(*dsc));
-        dsc->CompressedBufferType = type;
+        DECODER_BUFFER_DESC_SET_TYPE(dsc, type);
         dsc->DataSize             = size;
         dsc->NumMBsInBuffer       = mb_count;
 
@@ -81,7 +79,7 @@  int ff_dxva2_commit_buffer(AVCodecContext *avctx,
         result = -1;
     }
 
-    hr = IDirectXVideoDecoder_ReleaseBuffer(ctx->decoder, type);
+    hr = DECODER_RELEASE_BUFFER(ctx, type);
     if (FAILED(hr)) {
         av_log(avctx, AV_LOG_ERROR,
                "Failed to release buffer type %u: 0x%lx\n",
@@ -95,20 +93,17 @@  int ff_dxva2_common_end_frame(AVCodecContext *avctx, AVFrame *frame,
                               const void *pp, unsigned pp_size,
                               const void *qm, unsigned qm_size,
                               int (*commit_bs_si)(AVCodecContext *,
-                                                  DXVA2_DecodeBufferDesc *bs,
-                                                  DXVA2_DecodeBufferDesc *slice))
+                                                  DECODER_BUFFER_DESC *bs,
+                                                  DECODER_BUFFER_DESC *slice))
 {
     struct dxva_context *ctx = avctx->hwaccel_context;
     unsigned               buffer_count = 0;
-    DXVA2_DecodeBufferDesc buffer[4];
-    DXVA2_DecodeExecuteParams exec = { 0 };
+    DECODER_BUFFER_DESC buffer[4];
     int result, runs = 0;
     HRESULT hr;
 
     do {
-        hr = IDirectXVideoDecoder_BeginFrame(ctx->decoder,
-                                             ff_dxva2_get_surface(frame),
-                                             NULL);
+        hr = DECODER_BEGIN_FRAME(ctx, ff_dxva2_get_surface(frame));
         if (hr == E_PENDING)
             av_usleep(2000);
     } while (hr == E_PENDING && ++runs < 50);
@@ -119,7 +114,7 @@  int ff_dxva2_common_end_frame(AVCodecContext *avctx, AVFrame *frame,
     }
 
     result = ff_dxva2_commit_buffer(avctx, ctx, &buffer[buffer_count],
-                                    DXVA2_PictureParametersBufferType,
+                                    DECODER_BUFTYPE_PICTURE_PARAMS,
                                     pp, pp_size, 0);
     if (result) {
         av_log(avctx, AV_LOG_ERROR,
@@ -130,7 +125,7 @@  int ff_dxva2_common_end_frame(AVCodecContext *avctx, AVFrame *frame,
 
     if (qm_size > 0) {
         result = ff_dxva2_commit_buffer(avctx, ctx, &buffer[buffer_count],
-                                        DXVA2_InverseQuantizationMatrixBufferType,
+                                        DECODER_BUFTYPE_QUANT_MATRIX,
                                         qm, qm_size, 0);
         if (result) {
             av_log(avctx, AV_LOG_ERROR,
@@ -154,17 +149,14 @@  int ff_dxva2_common_end_frame(AVCodecContext *avctx, AVFrame *frame,
 
     assert(buffer_count == 1 + (qm_size > 0) + 2);
 
-    exec.NumCompBuffers      = buffer_count;
-    exec.pCompressedBuffers  = buffer;
-    exec.pExtensionData      = NULL;
-    hr = IDirectXVideoDecoder_Execute(ctx->decoder, &exec);
+    hr = DECODER_SUBMIT_BUFFER(ctx, buffer, buffer_count);
     if (FAILED(hr)) {
         av_log(avctx, AV_LOG_ERROR, "Failed to execute: 0x%lx\n", hr);
         result = -1;
     }
 
 end:
-    hr = IDirectXVideoDecoder_EndFrame(ctx->decoder, NULL);
+    hr = DECODER_END_FRAME(ctx);
     if (FAILED(hr)) {
         av_log(avctx, AV_LOG_ERROR, "Failed to end frame: 0x%lx\n", hr);
         result = -1;
diff --git a/libavcodec/dxva2_h264.c b/libavcodec/dxva2_h264.c
index a5e9705..777086b 100644
--- a/libavcodec/dxva2_h264.c
+++ b/libavcodec/dxva2_h264.c
@@ -1,5 +1,5 @@ 
 /*
- * DXVA2 H264 HW acceleration.
+ * DirectX H264 HW acceleration.
  *
  * copyright (c) 2009 Laurent Aimar
  *
@@ -20,7 +20,6 @@ 
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
-#include "dxva2_internal.h"
 #include "h264.h"
 #include "h264data.h"
 #include "mpegutils.h"
@@ -289,8 +288,8 @@  static void fill_slice_long(AVCodecContext *avctx, DXVA_Slice_H264_Long *slice,
 }
 
 static int commit_bitstream_and_slice_buffer(AVCodecContext *avctx,
-                                             DXVA2_DecodeBufferDesc *bs,
-                                             DXVA2_DecodeBufferDesc *sc)
+                                             DECODER_BUFFER_DESC *bs,
+                                             DECODER_BUFFER_DESC *sc)
 {
     const H264Context *h = avctx->priv_data;
     const unsigned mb_count = h->mb_width * h->mb_height;
@@ -307,9 +306,9 @@  static int commit_bitstream_and_slice_buffer(AVCodecContext *avctx,
     unsigned i;
 
     /* Create an annex B bitstream buffer with only slice NAL and finalize slice */
-    if (FAILED(IDirectXVideoDecoder_GetBuffer(ctx->decoder,
-                                              DXVA2_BitStreamDateBufferType,
-                                              &dxva_data_ptr, &dxva_size)))
+    if (FAILED(DECODER_GET_BUFFER(ctx,
+	                              DECODER_BUFTYPE_BITSTREAM,
+	                              &dxva_data_ptr, &dxva_size)))
         return -1;
 
     dxva_data = dxva_data_ptr;
@@ -363,14 +362,13 @@  static int commit_bitstream_and_slice_buffer(AVCodecContext *avctx,
 
         slice->SliceBytesInBuffer += padding;
     }
-    if (FAILED(IDirectXVideoDecoder_ReleaseBuffer(ctx->decoder,
-                                                  DXVA2_BitStreamDateBufferType)))
+    if (FAILED(DECODER_RELEASE_BUFFER(ctx, DECODER_BUFTYPE_BITSTREAM)))
         return -1;
     if (i < ctx_pic->slice_count)
         return -1;
 
     memset(bs, 0, sizeof(*bs));
-    bs->CompressedBufferType = DXVA2_BitStreamDateBufferType;
+    DECODER_BUFFER_DESC_SET_TYPE(bs, DECODER_BUFTYPE_BITSTREAM);
     bs->DataSize             = current - dxva_data;
     bs->NumMBsInBuffer       = mb_count;
 
@@ -383,7 +381,7 @@  static int commit_bitstream_and_slice_buffer(AVCodecContext *avctx,
     }
     assert((bs->DataSize & 127) == 0);
     return ff_dxva2_commit_buffer(avctx, ctx, sc,
-                                  DXVA2_SliceControlBufferType,
+                                  DECODER_BUFTYPE_SLICE_CONTROL,
                                   slice_data, slice_size, mb_count);
 }
 
@@ -462,14 +460,3 @@  static int dxva2_h264_end_frame(AVCodecContext *avctx)
         ff_h264_draw_horiz_band(h, sl, 0, h->avctx->height);
     return ret;
 }
-
-AVHWAccel ff_h264_dxva2_hwaccel = {
-    .name           = "h264_dxva2",
-    .type           = AVMEDIA_TYPE_VIDEO,
-    .id             = AV_CODEC_ID_H264,
-    .pix_fmt        = AV_PIX_FMT_DXVA2_VLD,
-    .start_frame    = dxva2_h264_start_frame,
-    .decode_slice   = dxva2_h264_decode_slice,
-    .end_frame      = dxva2_h264_end_frame,
-    .frame_priv_data_size = sizeof(struct dxva2_picture_context),
-};
diff --git a/libavcodec/dxva2_hevc.c b/libavcodec/dxva2_hevc.c
index 257bee7..6821689 100644
--- a/libavcodec/dxva2_hevc.c
+++ b/libavcodec/dxva2_hevc.c
@@ -1,5 +1,5 @@ 
 /*
- * DXVA2 HEVC HW acceleration.
+ * DirectX HEVC HW acceleration.
  *
  * copyright (c) 2014 - 2015 Hendrik Leppkes
  *
@@ -22,7 +22,6 @@ 
 
 #include "libavutil/avassert.h"
 
-#include "dxva2_internal.h"
 #include "hevc.h"
 
 #define MAX_SLICES 256
@@ -228,8 +227,8 @@  static void fill_slice_short(DXVA_Slice_HEVC_Short *slice,
 }
 
 static int commit_bitstream_and_slice_buffer(AVCodecContext *avctx,
-                                             DXVA2_DecodeBufferDesc *bs,
-                                             DXVA2_DecodeBufferDesc *sc)
+                                             DECODER_BUFFER_DESC *bs,
+                                             DECODER_BUFFER_DESC *sc)
 {
     const HEVCContext *h = avctx->priv_data;
     struct dxva_context *ctx = avctx->hwaccel_context;
@@ -245,9 +244,9 @@  static int commit_bitstream_and_slice_buffer(AVCodecContext *avctx,
     unsigned i;
 
     /* Create an annex B bitstream buffer with only slice NAL and finalize slice */
-    if (FAILED(IDirectXVideoDecoder_GetBuffer(ctx->decoder,
-                                              DXVA2_BitStreamDateBufferType,
-                                              &dxva_data_ptr, &dxva_size)))
+    if (FAILED(DECODER_GET_BUFFER(ctx,
+	                              DECODER_BUFTYPE_BITSTREAM,
+	                              &dxva_data_ptr, &dxva_size)))
         return -1;
 
     dxva_data = dxva_data_ptr;
@@ -284,14 +283,13 @@  static int commit_bitstream_and_slice_buffer(AVCodecContext *avctx,
 
         slice->SliceBytesInBuffer += padding;
     }
-    if (FAILED(IDirectXVideoDecoder_ReleaseBuffer(ctx->decoder,
-                                                  DXVA2_BitStreamDateBufferType)))
+    if (FAILED(DECODER_RELEASE_BUFFER(ctx, DECODER_BUFTYPE_BITSTREAM)))
         return -1;
     if (i < ctx_pic->slice_count)
         return -1;
 
     memset(bs, 0, sizeof(*bs));
-    bs->CompressedBufferType = DXVA2_BitStreamDateBufferType;
+    DECODER_BUFFER_DESC_SET_TYPE(bs, DECODER_BUFTYPE_BITSTREAM);
     bs->DataSize             = current - dxva_data;
     bs->NumMBsInBuffer       = 0;
 
@@ -300,7 +298,7 @@  static int commit_bitstream_and_slice_buffer(AVCodecContext *avctx,
 
     av_assert0((bs->DataSize & 127) == 0);
     return ff_dxva2_commit_buffer(avctx, ctx, sc,
-                                  DXVA2_SliceControlBufferType,
+                                  DECODER_BUFTYPE_SLICE_CONTROL,
                                   slice_data, slice_size, 0);
 }
 
@@ -369,13 +367,3 @@  static int dxva2_hevc_end_frame(AVCodecContext *avctx)
     return ret;
 }
 
-AVHWAccel ff_hevc_dxva2_hwaccel = {
-    .name           = "hevc_dxva2",
-    .type           = AVMEDIA_TYPE_VIDEO,
-    .id             = AV_CODEC_ID_HEVC,
-    .pix_fmt        = AV_PIX_FMT_DXVA2_VLD,
-    .start_frame    = dxva2_hevc_start_frame,
-    .decode_slice   = dxva2_hevc_decode_slice,
-    .end_frame      = dxva2_hevc_end_frame,
-    .frame_priv_data_size = sizeof(struct hevc_dxva2_picture_context),
-};
diff --git a/libavcodec/dxva2_internal.h b/libavcodec/dxva2_internal.h
index b775e6c..9ff08e7 100644
--- a/libavcodec/dxva2_internal.h
+++ b/libavcodec/dxva2_internal.h
@@ -1,5 +1,5 @@ 
 /*
- * DXVA2 HW acceleration
+ * DirectX HW acceleration
  *
  * copyright (c) 2010 Laurent Aimar
  *
@@ -23,26 +23,19 @@ 
 #ifndef AVCODEC_DXVA_INTERNAL_H
 #define AVCODEC_DXVA_INTERNAL_H
 
-#define COBJMACROS
-
 #include "config.h"
 
-#include "dxva2.h"
-#if HAVE_DXVA_H
-#include <dxva.h>
-#endif
-
 #include "avcodec.h"
 #include "mpegvideo.h"
 
-void *ff_dxva2_get_surface(const AVFrame *frame);
+dxva_surface_t *ff_dxva2_get_surface(const AVFrame *frame);
 
 unsigned ff_dxva2_get_surface_index(const struct dxva_context *,
                                     const AVFrame *frame);
 
 int ff_dxva2_commit_buffer(AVCodecContext *, struct dxva_context *,
-                           DXVA2_DecodeBufferDesc *,
-                           unsigned type, const void *data, unsigned size,
+                           DECODER_BUFFER_DESC *,
+                           DECODER_BUFFER_TYPE type, const void *data, unsigned size,
                            unsigned mb_count);
 
 
@@ -50,7 +43,7 @@  int ff_dxva2_common_end_frame(AVCodecContext *, AVFrame *,
                               const void *pp, unsigned pp_size,
                               const void *qm, unsigned qm_size,
                               int (*commit_bs_si)(AVCodecContext *,
-                                                  DXVA2_DecodeBufferDesc *bs,
-                                                  DXVA2_DecodeBufferDesc *slice));
+                                                  DECODER_BUFFER_DESC *bs,
+                                                  DECODER_BUFFER_DESC *slice));
 
 #endif /* AVCODEC_DXVA_INTERNAL_H */
diff --git a/libavcodec/dxva2_mpeg2.c b/libavcodec/dxva2_mpeg2.c
index 65624e3..1edda82 100644
--- a/libavcodec/dxva2_mpeg2.c
+++ b/libavcodec/dxva2_mpeg2.c
@@ -1,5 +1,5 @@ 
 /*
- * MPEG-2 HW acceleration.
+ * DirectX MPEG-2 HW acceleration.
  *
  * copyright (c) 2010 Laurent Aimar
  *
@@ -21,7 +21,6 @@ 
  */
 
 #include "libavutil/log.h"
-#include "dxva2_internal.h"
 #include "mpegutils.h"
 
 #define MAX_SLICES 1024
@@ -147,8 +146,8 @@  static void fill_slice(AVCodecContext *avctx,
     slice->wMBbitOffset        = 4 * 8 + get_bits_count(&gb);
 }
 static int commit_bitstream_and_slice_buffer(AVCodecContext *avctx,
-                                             DXVA2_DecodeBufferDesc *bs,
-                                             DXVA2_DecodeBufferDesc *sc)
+                                             DECODER_BUFFER_DESC *bs,
+                                             DECODER_BUFFER_DESC *sc)
 {
     const struct MpegEncContext *s = avctx->priv_data;
     struct dxva_context *ctx = avctx->hwaccel_context;
@@ -161,9 +160,9 @@  static int commit_bitstream_and_slice_buffer(AVCodecContext *avctx,
     unsigned dxva_size;
     unsigned i;
 
-    if (FAILED(IDirectXVideoDecoder_GetBuffer(ctx->decoder,
-                                              DXVA2_BitStreamDateBufferType,
-                                              &dxva_data_ptr, &dxva_size)))
+    if (FAILED(DECODER_GET_BUFFER(ctx,
+	                              DECODER_BUFTYPE_BITSTREAM,
+                                  &dxva_data_ptr, &dxva_size)))
         return -1;
 
     dxva_data = dxva_data_ptr;
@@ -190,19 +189,18 @@  static int commit_bitstream_and_slice_buffer(AVCodecContext *avctx,
         memcpy(current, &ctx_pic->bitstream[position], size);
         current += size;
     }
-    if (FAILED(IDirectXVideoDecoder_ReleaseBuffer(ctx->decoder,
-                                                  DXVA2_BitStreamDateBufferType)))
+    if (FAILED(DECODER_RELEASE_BUFFER(ctx, DECODER_BUFTYPE_BITSTREAM)))
         return -1;
     if (i < ctx_pic->slice_count)
         return -1;
 
     memset(bs, 0, sizeof(*bs));
-    bs->CompressedBufferType = DXVA2_BitStreamDateBufferType;
+    DECODER_BUFFER_DESC_SET_TYPE(bs, DECODER_BUFTYPE_BITSTREAM);
     bs->DataSize             = current - dxva_data;
     bs->NumMBsInBuffer       = mb_count;
 
     return ff_dxva2_commit_buffer(avctx, ctx, sc,
-                                  DXVA2_SliceControlBufferType,
+                                  DECODER_BUFTYPE_SLICE_CONTROL,
                                   ctx_pic->slice,
                                   ctx_pic->slice_count * sizeof(*ctx_pic->slice),
                                   mb_count);
@@ -270,14 +268,3 @@  static int dxva2_mpeg2_end_frame(AVCodecContext *avctx)
         ff_mpeg_draw_horiz_band(s, 0, avctx->height);
     return ret;
 }
-
-AVHWAccel ff_mpeg2_dxva2_hwaccel = {
-    .name           = "mpeg2_dxva2",
-    .type           = AVMEDIA_TYPE_VIDEO,
-    .id             = AV_CODEC_ID_MPEG2VIDEO,
-    .pix_fmt        = AV_PIX_FMT_DXVA2_VLD,
-    .start_frame    = dxva2_mpeg2_start_frame,
-    .decode_slice   = dxva2_mpeg2_decode_slice,
-    .end_frame      = dxva2_mpeg2_end_frame,
-    .frame_priv_data_size = sizeof(struct dxva2_picture_context),
-};
diff --git a/libavcodec/dxva2_vc1.c b/libavcodec/dxva2_vc1.c
index 1524b51..210b95d 100644
--- a/libavcodec/dxva2_vc1.c
+++ b/libavcodec/dxva2_vc1.c
@@ -1,5 +1,5 @@ 
 /*
- * DXVA2 WMV3/VC-1 HW acceleration.
+ * DirectX WMV3/VC-1 HW acceleration.
  *
  * copyright (c) 2010 Laurent Aimar
  *
@@ -20,7 +20,6 @@ 
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
-#include "dxva2_internal.h"
 #include "mpegutils.h"
 #include "vc1.h"
 #include "vc1data.h"
@@ -157,8 +156,8 @@  static void fill_slice(AVCodecContext *avctx, DXVA_SliceInfo *slice,
 }
 
 static int commit_bitstream_and_slice_buffer(AVCodecContext *avctx,
-                                             DXVA2_DecodeBufferDesc *bs,
-                                             DXVA2_DecodeBufferDesc *sc)
+                                             DECODER_BUFFER_DESC *bs,
+                                             DECODER_BUFFER_DESC *sc)
 {
     const VC1Context *v = avctx->priv_data;
     struct dxva_context *ctx = avctx->hwaccel_context;
@@ -178,9 +177,9 @@  static int commit_bitstream_and_slice_buffer(AVCodecContext *avctx,
     unsigned dxva_size;
     int result;
 
-    if (FAILED(IDirectXVideoDecoder_GetBuffer(ctx->decoder,
-                                              DXVA2_BitStreamDateBufferType,
-                                              &dxva_data_ptr, &dxva_size)))
+    if (FAILED(DECODER_GET_BUFFER(ctx,
+	                              DECODER_BUFTYPE_BITSTREAM,
+                                  &dxva_data_ptr, &dxva_size)))
         return -1;
 
     dxva_data = dxva_data_ptr;
@@ -194,20 +193,19 @@  static int commit_bitstream_and_slice_buffer(AVCodecContext *avctx,
             memset(dxva_data + start_code_size + slice_size, 0, padding);
         slice->dwSliceBitsInBuffer = 8 * data_size;
     }
-    if (FAILED(IDirectXVideoDecoder_ReleaseBuffer(ctx->decoder,
-                                                  DXVA2_BitStreamDateBufferType)))
+    if (FAILED(DECODER_RELEASE_BUFFER(ctx, DECODER_BUFTYPE_BITSTREAM)))
         return -1;
     if (result)
         return result;
 
     memset(bs, 0, sizeof(*bs));
-    bs->CompressedBufferType = DXVA2_BitStreamDateBufferType;
+    DECODER_BUFFER_DESC_SET_TYPE(bs, DECODER_BUFTYPE_BITSTREAM);
     bs->DataSize             = data_size;
     bs->NumMBsInBuffer       = s->mb_width * s->mb_height;
     assert((bs->DataSize & 127) == 0);
 
     return ff_dxva2_commit_buffer(avctx, ctx, sc,
-                                  DXVA2_SliceControlBufferType,
+                                  DECODER_BUFTYPE_SLICE_CONTROL,
                                   slice, sizeof(*slice), bs->NumMBsInBuffer);
 }
 
@@ -272,26 +270,3 @@  static int dxva2_vc1_end_frame(AVCodecContext *avctx)
     return ret;
 }
 
-#if CONFIG_WMV3_DXVA2_HWACCEL
-AVHWAccel ff_wmv3_dxva2_hwaccel = {
-    .name           = "wmv3_dxva2",
-    .type           = AVMEDIA_TYPE_VIDEO,
-    .id             = AV_CODEC_ID_WMV3,
-    .pix_fmt        = AV_PIX_FMT_DXVA2_VLD,
-    .start_frame    = dxva2_vc1_start_frame,
-    .decode_slice   = dxva2_vc1_decode_slice,
-    .end_frame      = dxva2_vc1_end_frame,
-    .frame_priv_data_size = sizeof(struct dxva2_picture_context),
-};
-#endif
-
-AVHWAccel ff_vc1_dxva2_hwaccel = {
-    .name           = "vc1_dxva2",
-    .type           = AVMEDIA_TYPE_VIDEO,
-    .id             = AV_CODEC_ID_VC1,
-    .pix_fmt        = AV_PIX_FMT_DXVA2_VLD,
-    .start_frame    = dxva2_vc1_start_frame,
-    .decode_slice   = dxva2_vc1_decode_slice,
-    .end_frame      = dxva2_vc1_end_frame,
-    .frame_priv_data_size = sizeof(struct dxva2_picture_context),
-};
diff --git a/libavcodec/dxva_h264.c b/libavcodec/dxva_h264.c
new file mode 100644
index 0000000..68bf70d
--- /dev/null
+++ b/libavcodec/dxva_h264.c
@@ -0,0 +1,35 @@ 
+/*
+ * DXVA2 H264 HW acceleration.
+ *
+ * copyright (c) 2009 Laurent Aimar
+ *
+ * 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 "dxva_internal.h"
+#include "dxva2_h264.c"
+
+AVHWAccel ff_h264_dxva2_hwaccel = {
+    .name           = "h264_dxva2",
+    .type           = AVMEDIA_TYPE_VIDEO,
+    .id             = AV_CODEC_ID_H264,
+    .pix_fmt        = AV_PIX_FMT_DXVA2_VLD,
+    .start_frame    = dxva2_h264_start_frame,
+    .decode_slice   = dxva2_h264_decode_slice,
+    .end_frame      = dxva2_h264_end_frame,
+    .frame_priv_data_size = sizeof(struct dxva2_picture_context),
+};
diff --git a/libavcodec/dxva_hevc.c b/libavcodec/dxva_hevc.c
new file mode 100644
index 0000000..ee6ebde
--- /dev/null
+++ b/libavcodec/dxva_hevc.c
@@ -0,0 +1,35 @@ 
+/*
+ * DXVA2 HEVC HW acceleration.
+ *
+ * copyright (c) 2014 - 2015 Hendrik Leppkes
+ *
+ * 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 "dxva_internal.h"
+#include "dxva2_hevc.c"
+
+AVHWAccel ff_hevc_dxva2_hwaccel = {
+    .name           = "hevc_dxva2",
+    .type           = AVMEDIA_TYPE_VIDEO,
+    .id             = AV_CODEC_ID_HEVC,
+    .pix_fmt        = AV_PIX_FMT_DXVA2_VLD,
+    .start_frame    = dxva2_hevc_start_frame,
+    .decode_slice   = dxva2_hevc_decode_slice,
+    .end_frame      = dxva2_hevc_end_frame,
+    .frame_priv_data_size = sizeof(struct hevc_dxva2_picture_context),
+};
diff --git a/libavcodec/dxva_internal.h b/libavcodec/dxva_internal.h
new file mode 100644
index 0000000..8050730
--- /dev/null
+++ b/libavcodec/dxva_internal.h
@@ -0,0 +1,59 @@ 
+/*
+ * DXVA2 HW acceleration
+ *
+ * copyright (c) 2010 Laurent Aimar
+ * 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
+ */
+
+#ifndef AVCODEC_DXVA2_INTERNAL_H
+#define AVCODEC_DXVA2_INTERNAL_H
+
+#define COBJMACROS
+
+#include "dxva2.h"
+#include <dxva.h>
+
+#define dxva_surface_t                    IDirect3DSurface9
+#define DECODER_BUFFER_DESC               DXVA2_DecodeBufferDesc
+#define DECODER_BUFFER_TYPE               unsigned
+#define DECODER_GET_BUFFER(ctx,t,b,s)     IDirectXVideoDecoder_GetBuffer(ctx->decoder, t,b,s)
+
+static inline HRESULT DECODER_SUBMIT_BUFFER(struct dxva_context *ctx, DECODER_BUFFER_DESC *buffer, unsigned buffer_count) {
+    DXVA2_DecodeExecuteParams exec = {
+        .pCompressedBuffers = buffer,
+        .NumCompBuffers = buffer_count,
+        .pExtensionData = NULL,
+    };
+    return IDirectXVideoDecoder_Execute(ctx->decoder, &exec);
+}
+
+#define DECODER_RELEASE_BUFFER(ctx,t)     IDirectXVideoDecoder_ReleaseBuffer(ctx->decoder, t)
+#define DECODER_BEGIN_FRAME(ctx,s)        IDirectXVideoDecoder_BeginFrame(ctx->decoder, s, NULL)
+#define DECODER_END_FRAME(ctx)            IDirectXVideoDecoder_EndFrame(ctx->decoder, NULL)
+
+#define DECODER_BUFTYPE_PICTURE_PARAMS    DXVA2_PictureParametersBufferType
+#define DECODER_BUFTYPE_QUANT_MATRIX      DXVA2_InverseQuantizationMatrixBufferType
+#define DECODER_BUFTYPE_BITSTREAM         DXVA2_BitStreamDateBufferType
+#define DECODER_BUFTYPE_SLICE_CONTROL     DXVA2_SliceControlBufferType
+
+#define DECODER_BUFFER_DESC_SET_TYPE(dsc, type)   dsc->CompressedBufferType = type
+
+#include "dxva2_internal.h"
+
+#endif /* AVCODEC_DXVA2_INTERNAL_H */
diff --git a/libavcodec/dxva_mpeg2.c b/libavcodec/dxva_mpeg2.c
new file mode 100644
index 0000000..681288c
--- /dev/null
+++ b/libavcodec/dxva_mpeg2.c
@@ -0,0 +1,35 @@ 
+/*
+ * DXVA2 MPEG-2 HW acceleration.
+ *
+ * copyright (c) 2010 Laurent Aimar
+ *
+ * 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 "dxva_internal.h"
+#include "dxva2_mpeg2.c"
+
+AVHWAccel ff_mpeg2_dxva2_hwaccel = {
+    .name           = "mpeg2_dxva2",
+    .type           = AVMEDIA_TYPE_VIDEO,
+    .id             = AV_CODEC_ID_MPEG2VIDEO,
+    .pix_fmt        = AV_PIX_FMT_DXVA2_VLD,
+    .start_frame    = dxva2_mpeg2_start_frame,
+    .decode_slice   = dxva2_mpeg2_decode_slice,
+    .end_frame      = dxva2_mpeg2_end_frame,
+    .frame_priv_data_size = sizeof(struct dxva2_picture_context),
+};
diff --git a/libavcodec/dxva_vc1.c b/libavcodec/dxva_vc1.c
new file mode 100644
index 0000000..12a74c5
--- /dev/null
+++ b/libavcodec/dxva_vc1.c
@@ -0,0 +1,48 @@ 
+/*
+ * DXVA2 WMV3/VC-1 HW acceleration.
+ *
+ * copyright (c) 2010 Laurent Aimar
+ *
+ * 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 "dxva_internal.h"
+#include "dxva2_vc1.c"
+
+#if CONFIG_WMV3_DXVA2_HWACCEL
+AVHWAccel ff_wmv3_dxva2_hwaccel = {
+    .name           = "wmv3_dxva2",
+    .type           = AVMEDIA_TYPE_VIDEO,
+    .id             = AV_CODEC_ID_WMV3,
+    .pix_fmt        = AV_PIX_FMT_DXVA2_VLD,
+    .start_frame    = dxva2_vc1_start_frame,
+    .decode_slice   = dxva2_vc1_decode_slice,
+    .end_frame      = dxva2_vc1_end_frame,
+    .frame_priv_data_size = sizeof(struct dxva2_picture_context),
+};
+#endif
+
+AVHWAccel ff_vc1_dxva2_hwaccel = {
+    .name           = "vc1_dxva2",
+    .type           = AVMEDIA_TYPE_VIDEO,
+    .id             = AV_CODEC_ID_VC1,
+    .pix_fmt        = AV_PIX_FMT_DXVA2_VLD,
+    .start_frame    = dxva2_vc1_start_frame,
+    .decode_slice   = dxva2_vc1_decode_slice,
+    .end_frame      = dxva2_vc1_end_frame,
+    .frame_priv_data_size = sizeof(struct dxva2_picture_context),
+};