aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2015-03-13 08:13:00 +0100
committerAnton Khirnov <anton@khirnov.net>2015-03-27 21:57:28 +0100
commitd0a63d8b989647ffdb5f40da8e1feaffe1a8e791 (patch)
tree3358ed60bf27fa32b1abe47a91ea92ebd9fc1bbb
parentb04d009b0e1a34b717f3d3bbf407aef0c742aff1 (diff)
downloadffmpeg-d0a63d8b989647ffdb5f40da8e1feaffe1a8e791.tar.gz
qsvdec: split off some code that will be shared with the encoder
-rwxr-xr-xconfigure2
-rw-r--r--libavcodec/Makefile3
-rw-r--r--libavcodec/qsv.c115
-rw-r--r--libavcodec/qsv_internal.h38
-rw-r--r--libavcodec/qsvdec.c89
-rw-r--r--libavcodec/qsvdec.h10
-rw-r--r--libavcodec/qsvdec_h264.c1
7 files changed, 163 insertions, 95 deletions
diff --git a/configure b/configure
index 9aac7773b0..4e2beb2163 100755
--- a/configure
+++ b/configure
@@ -1597,6 +1597,7 @@ CONFIG_EXTRA="
nettle
pixblockdsp
qpeldsp
+ qsv
qsvdec
rangecoder
riffdec
@@ -1760,6 +1761,7 @@ mpegaudio_select="mpegaudiodsp"
mpegaudiodsp_select="dct"
mpegvideo_select="blockdsp hpeldsp idctdsp me_cmp videodsp"
mpegvideoenc_select="me_cmp mpegvideo pixblockdsp qpeldsp"
+qsvdec_select="qsv"
# decoders / encoders
aac_decoder_select="imdct15 mdct sinewin"
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index eafc86a868..10a97c31c3 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -80,6 +80,7 @@ OBJS-$(CONFIG_MPEGVIDEOENC) += mpegvideo_enc.o mpeg12data.o \
mpegvideoencdsp.o
OBJS-$(CONFIG_PIXBLOCKDSP) += pixblockdsp.o
OBJS-$(CONFIG_QPELDSP) += qpeldsp.o
+OBJS-$(CONFIG_QSV) += qsv.o
OBJS-$(CONFIG_QSVDEC) += qsvdec.o
OBJS-$(CONFIG_RANGECODER) += rangecoder.o
RDFT-OBJS-$(CONFIG_HARDCODED_TABLES) += sin_tables.o
@@ -719,7 +720,7 @@ SKIPHEADERS += %_tablegen.h \
SKIPHEADERS-$(CONFIG_DXVA2) += dxva2.h dxva2_internal.h
SKIPHEADERS-$(CONFIG_LIBSCHROEDINGER) += libschroedinger.h
SKIPHEADERS-$(CONFIG_MPEG_XVMC_DECODER) += xvmc.h
-SKIPHEADERS-$(CONFIG_QSVDEC) += qsv.h qsvdec.h
+SKIPHEADERS-$(CONFIG_QSVDEC) += qsv.h qsvdec.h qsv_internal.h
SKIPHEADERS-$(CONFIG_VAAPI) += vaapi_internal.h
SKIPHEADERS-$(CONFIG_VDA) += vda.h vda_internal.h
SKIPHEADERS-$(CONFIG_VDPAU) += vdpau.h vdpau_internal.h
diff --git a/libavcodec/qsv.c b/libavcodec/qsv.c
new file mode 100644
index 0000000000..bd9e18d43e
--- /dev/null
+++ b/libavcodec/qsv.c
@@ -0,0 +1,115 @@
+/*
+ * Intel MediaSDK QSV encoder/decoder shared code
+ *
+ * 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 <mfx/mfxvideo.h>
+
+#include "libavutil/error.h"
+
+#include "avcodec.h"
+#include "qsv_internal.h"
+
+int ff_qsv_codec_id_to_mfx(enum AVCodecID codec_id)
+{
+ switch (codec_id) {
+ case AV_CODEC_ID_H264:
+ return MFX_CODEC_AVC;
+ case AV_CODEC_ID_MPEG1VIDEO:
+ case AV_CODEC_ID_MPEG2VIDEO:
+ return MFX_CODEC_MPEG2;
+ case AV_CODEC_ID_VC1:
+ return MFX_CODEC_VC1;
+ default:
+ break;
+ }
+
+ return AVERROR(ENOSYS);
+}
+
+int ff_qsv_error(int mfx_err)
+{
+ switch (mfx_err) {
+ case MFX_ERR_NONE:
+ return 0;
+ case MFX_ERR_MEMORY_ALLOC:
+ case MFX_ERR_NOT_ENOUGH_BUFFER:
+ return AVERROR(ENOMEM);
+ case MFX_ERR_INVALID_HANDLE:
+ return AVERROR(EINVAL);
+ case MFX_ERR_DEVICE_FAILED:
+ case MFX_ERR_DEVICE_LOST:
+ case MFX_ERR_LOCK_MEMORY:
+ return AVERROR(EIO);
+ case MFX_ERR_NULL_PTR:
+ case MFX_ERR_UNDEFINED_BEHAVIOR:
+ case MFX_ERR_NOT_INITIALIZED:
+ return AVERROR_BUG;
+ case MFX_ERR_UNSUPPORTED:
+ case MFX_ERR_NOT_FOUND:
+ return AVERROR(ENOSYS);
+ case MFX_ERR_MORE_DATA:
+ case MFX_ERR_MORE_SURFACE:
+ case MFX_ERR_MORE_BITSTREAM:
+ return AVERROR(EAGAIN);
+ case MFX_ERR_INCOMPATIBLE_VIDEO_PARAM:
+ case MFX_ERR_INVALID_VIDEO_PARAM:
+ return AVERROR(EINVAL);
+ case MFX_ERR_ABORTED:
+ case MFX_ERR_UNKNOWN:
+ default:
+ return AVERROR_UNKNOWN;
+ }
+}
+
+int ff_qsv_init_internal_session(AVCodecContext *avctx, mfxSession *session)
+{
+ mfxIMPL impl = MFX_IMPL_AUTO_ANY;
+ mfxVersion ver = { { QSV_VERSION_MINOR, QSV_VERSION_MAJOR } };
+
+ const char *desc;
+ int ret;
+
+ ret = MFXInit(impl, &ver, session);
+ if (ret < 0) {
+ av_log(avctx, AV_LOG_ERROR, "Error initializing an internal MFX session\n");
+ return ff_qsv_error(ret);
+ }
+
+ MFXQueryIMPL(*session, &impl);
+
+ switch (MFX_IMPL_BASETYPE(impl)) {
+ case MFX_IMPL_SOFTWARE:
+ desc = "software";
+ break;
+ case MFX_IMPL_HARDWARE:
+ case MFX_IMPL_HARDWARE2:
+ case MFX_IMPL_HARDWARE3:
+ case MFX_IMPL_HARDWARE4:
+ desc = "hardware accelerated";
+ break;
+ default:
+ desc = "unknown";
+ }
+
+ av_log(avctx, AV_LOG_VERBOSE,
+ "Initialized an internal MFX session using %s implementation\n",
+ desc);
+
+ return 0;
+}
diff --git a/libavcodec/qsv_internal.h b/libavcodec/qsv_internal.h
new file mode 100644
index 0000000000..4bfef4a873
--- /dev/null
+++ b/libavcodec/qsv_internal.h
@@ -0,0 +1,38 @@
+/*
+ * Intel MediaSDK QSV encoder/decoder shared code
+ *
+ * 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_QSV_INTERNAL_H
+#define AVCODEC_QSV_INTERNAL_H
+
+#define QSV_VERSION_MAJOR 1
+#define QSV_VERSION_MINOR 1
+
+#define ASYNC_DEPTH_DEFAULT 4 // internal parallelism
+
+/**
+ * Convert a libmfx error code into a libav error code.
+ */
+int ff_qsv_error(int mfx_err);
+
+int ff_qsv_codec_id_to_mfx(enum AVCodecID codec_id);
+
+int ff_qsv_init_internal_session(AVCodecContext *avctx, mfxSession *session);
+
+#endif /* AVCODEC_QSV_INTERNAL_H */
diff --git a/libavcodec/qsvdec.c b/libavcodec/qsvdec.c
index 03e31c5bc1..039a0fe925 100644
--- a/libavcodec/qsvdec.c
+++ b/libavcodec/qsvdec.c
@@ -34,43 +34,9 @@
#include "avcodec.h"
#include "internal.h"
+#include "qsv_internal.h"
#include "qsvdec.h"
-int ff_qsv_error(int mfx_err)
-{
- switch (mfx_err) {
- case MFX_ERR_NONE:
- return 0;
- case MFX_ERR_MEMORY_ALLOC:
- case MFX_ERR_NOT_ENOUGH_BUFFER:
- return AVERROR(ENOMEM);
- case MFX_ERR_INVALID_HANDLE:
- return AVERROR(EINVAL);
- case MFX_ERR_DEVICE_FAILED:
- case MFX_ERR_DEVICE_LOST:
- case MFX_ERR_LOCK_MEMORY:
- return AVERROR(EIO);
- case MFX_ERR_NULL_PTR:
- case MFX_ERR_UNDEFINED_BEHAVIOR:
- case MFX_ERR_NOT_INITIALIZED:
- return AVERROR_BUG;
- case MFX_ERR_UNSUPPORTED:
- case MFX_ERR_NOT_FOUND:
- return AVERROR(ENOSYS);
- case MFX_ERR_MORE_DATA:
- case MFX_ERR_MORE_SURFACE:
- case MFX_ERR_MORE_BITSTREAM:
- return AVERROR(EAGAIN);
- case MFX_ERR_INCOMPATIBLE_VIDEO_PARAM:
- case MFX_ERR_INVALID_VIDEO_PARAM:
- return AVERROR(EINVAL);
- case MFX_ERR_ABORTED:
- case MFX_ERR_UNKNOWN:
- default:
- return AVERROR_UNKNOWN;
- }
-}
-
int ff_qsv_map_pixfmt(enum AVPixelFormat format)
{
switch (format) {
@@ -82,58 +48,13 @@ int ff_qsv_map_pixfmt(enum AVPixelFormat format)
}
}
-static int codec_id_to_mfx(enum AVCodecID codec_id)
-{
- switch (codec_id) {
- case AV_CODEC_ID_H264:
- return MFX_CODEC_AVC;
- case AV_CODEC_ID_MPEG1VIDEO:
- case AV_CODEC_ID_MPEG2VIDEO:
- return MFX_CODEC_MPEG2;
- case AV_CODEC_ID_VC1:
- return MFX_CODEC_VC1;
- default:
- break;
- }
-
- return AVERROR(ENOSYS);
-}
-
static int qsv_init_session(AVCodecContext *avctx, QSVContext *q, mfxSession session)
{
if (!session) {
if (!q->internal_session) {
- mfxIMPL impl = MFX_IMPL_AUTO_ANY;
- mfxVersion ver = { { QSV_VERSION_MINOR, QSV_VERSION_MAJOR } };
-
- const char *desc;
- int ret;
-
- ret = MFXInit(impl, &ver, &q->internal_session);
- if (ret < 0) {
- av_log(avctx, AV_LOG_ERROR, "Error initializing an internal MFX session\n");
- return ff_qsv_error(ret);
- }
-
- MFXQueryIMPL(q->internal_session, &impl);
-
- switch (MFX_IMPL_BASETYPE(impl)) {
- case MFX_IMPL_SOFTWARE:
- desc = "software";
- break;
- case MFX_IMPL_HARDWARE:
- case MFX_IMPL_HARDWARE2:
- case MFX_IMPL_HARDWARE3:
- case MFX_IMPL_HARDWARE4:
- desc = "hardware accelerated";
- break;
- default:
- desc = "unknown";
- }
-
- av_log(avctx, AV_LOG_VERBOSE,
- "Initialized an internal MFX session using %s implementation\n",
- desc);
+ int ret = ff_qsv_init_internal_session(avctx, &q->internal_session);
+ if (ret < 0)
+ return ret;
}
q->session = q->internal_session;
@@ -159,7 +80,7 @@ int ff_qsv_init(AVCodecContext *avctx, QSVContext *q, mfxSession session)
}
- ret = codec_id_to_mfx(avctx->codec_id);
+ ret = ff_qsv_codec_id_to_mfx(avctx->codec_id);
if (ret < 0)
return ret;
diff --git a/libavcodec/qsvdec.h b/libavcodec/qsvdec.h
index d12fde2856..79ecaed068 100644
--- a/libavcodec/qsvdec.h
+++ b/libavcodec/qsvdec.h
@@ -33,11 +33,6 @@
#include "avcodec.h"
-#define QSV_VERSION_MAJOR 1
-#define QSV_VERSION_MINOR 1
-
-#define ASYNC_DEPTH_DEFAULT 4 // internal parallelism
-
typedef struct QSVFrame {
AVFrame *frame;
mfxFrameSurface1 *surface;
@@ -68,11 +63,6 @@ typedef struct QSVContext {
int nb_ext_buffers;
} QSVContext;
-/**
- * Convert a libmfx error code into a libav error code.
- */
-int ff_qsv_error(int mfx_err);
-
int ff_qsv_map_pixfmt(enum AVPixelFormat format);
int ff_qsv_init(AVCodecContext *s, QSVContext *q, mfxSession session);
diff --git a/libavcodec/qsvdec_h264.c b/libavcodec/qsvdec_h264.c
index 958ce70f9d..ab60a1f867 100644
--- a/libavcodec/qsvdec_h264.c
+++ b/libavcodec/qsvdec_h264.c
@@ -33,6 +33,7 @@
#include "avcodec.h"
#include "internal.h"
+#include "qsv_internal.h"
#include "qsvdec.h"
#include "qsv.h"