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

Steve Lhomme robux4 at videolabs.io
Wed May 6 16:42:28 CEST 2015


New patch with a "template" naming scheme incoming.

On Wed, May 6, 2015 at 1:43 PM, Steve Lhomme <robux4 at videolabs.io> wrote:
> Sending the patch to libav-devel
>
> On Wed, May 6, 2015 at 1:38 PM, Steve Lhomme <robux4 at 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 at libav.org
>> https://lists.libav.org/mailman/listinfo/libav-stable
> _______________________________________________
> libav-stable mailing list
> libav-stable at libav.org
> https://lists.libav.org/mailman/listinfo/libav-stable


More information about the libav-stable mailing list