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-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel