| @@ -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" | |||
| @@ -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 | |||
| @@ -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; | |||
| } | |||
| @@ -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 */ | |||
| @@ -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; | |||
| @@ -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); | |||
| @@ -33,6 +33,7 @@ | |||
| #include "avcodec.h" | |||
| #include "internal.h" | |||
| #include "qsv_internal.h" | |||
| #include "qsvdec.h" | |||
| #include "qsv.h" | |||