diff options
Diffstat (limited to 'libavcodec/qsv.c')
-rw-r--r-- | libavcodec/qsv.c | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/libavcodec/qsv.c b/libavcodec/qsv.c new file mode 100644 index 0000000000..31be9d1fa3 --- /dev/null +++ b/libavcodec/qsv.c @@ -0,0 +1,115 @@ +/* + * Intel MediaSDK QSV encoder/decoder shared code + * + * This file is part of FFmpeg. + * + * FFmpeg 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. + * + * FFmpeg 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 FFmpeg; 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; +} |