[FFmpeg-devel] [RFC 4/4] vaapi: add common utilities.
Gwenole Beauchesne
gb.devel at gmail.com
Wed Aug 19 18:01:37 CEST 2015
Handful set of self-contained utility functions:
- ff_vaapi_get_error():
Converts VA status to an FFmpeg error code
- ff_vaapi_get_profiles():
Retrieves all supported profiles
- ff_vaapi_get_entrypoints():
Retrieves all supported entrypoints for the supplied profile
- ff_vaapi_get_chroma_format():
Converts FFmpeg pixel format to VA chroma format
- ff_vaapi_get_pixel_format():
Converts FFmpeg pixel format to VA fourcc
At some point, they could be migrated to some libavutil_vaapi and
exposed from there.
Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne at intel.com>
---
libavcodec/Makefile | 4 +-
libavcodec/vaapi_utils.c | 178 +++++++++++++++++++++++++++++++++++++++++++++++
libavcodec/vaapi_utils.h | 53 ++++++++++++++
3 files changed, 233 insertions(+), 2 deletions(-)
create mode 100644 libavcodec/vaapi_utils.c
create mode 100644 libavcodec/vaapi_utils.h
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index d595fe1..15f5a1b 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -696,7 +696,7 @@ OBJS-$(CONFIG_VIMA_DECODER) += vima.o adpcm_data.o
# hardware accelerators
OBJS-$(CONFIG_D3D11VA) += dxva2.o
OBJS-$(CONFIG_DXVA2) += dxva2.o
-OBJS-$(CONFIG_VAAPI) += vaapi.o
+OBJS-$(CONFIG_VAAPI) += vaapi.o vaapi_utils.o
OBJS-$(CONFIG_VDA) += vda.o videotoolbox.o
OBJS-$(CONFIG_VIDEOTOOLBOX) += videotoolbox.o
OBJS-$(CONFIG_VDPAU) += vdpau.o
@@ -919,7 +919,7 @@ SKIPHEADERS-$(CONFIG_QSV) += qsv.h qsv_internal.h
SKIPHEADERS-$(CONFIG_QSVDEC) += qsvdec.h
SKIPHEADERS-$(CONFIG_QSVENC) += qsvenc.h
SKIPHEADERS-$(CONFIG_XVMC) += xvmc.h
-SKIPHEADERS-$(CONFIG_VAAPI) += vaapi_internal.h
+SKIPHEADERS-$(CONFIG_VAAPI) += vaapi_internal.h vaapi_utils.h
SKIPHEADERS-$(CONFIG_VDA) += vda.h vda_vt_internal.h
SKIPHEADERS-$(CONFIG_VDPAU) += vdpau.h vdpau_internal.h
SKIPHEADERS-$(CONFIG_VIDEOTOOLBOX) += videotoolbox.h vda_vt_internal.h
diff --git a/libavcodec/vaapi_utils.c b/libavcodec/vaapi_utils.c
new file mode 100644
index 0000000..5f8a5fa
--- /dev/null
+++ b/libavcodec/vaapi_utils.c
@@ -0,0 +1,178 @@
+/*
+ * vaapi_utils.c - Video Acceleration API (VA-API) utilities
+ *
+ * Copyright (C) 2013-2015 Intel Corporation
+ * Author: Gwenole Beauchesne <gwenole.beauchesne at intel.com>
+ *
+ * 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 "vaapi_utils.h"
+
+/* Converts VA status to an FFmpeg error code */
+int
+ff_vaapi_get_error(VAStatus status)
+{
+ int ret;
+
+ switch (status) {
+ case VA_STATUS_ERROR_OPERATION_FAILED:
+ ret = AVERROR(ENOTSUP);
+ break;
+ case VA_STATUS_ERROR_INVALID_DISPLAY:
+ case VA_STATUS_ERROR_INVALID_CONFIG:
+ case VA_STATUS_ERROR_INVALID_CONTEXT:
+ case VA_STATUS_ERROR_INVALID_SURFACE:
+ case VA_STATUS_ERROR_INVALID_BUFFER:
+ case VA_STATUS_ERROR_INVALID_IMAGE:
+ case VA_STATUS_ERROR_INVALID_SUBPICTURE:
+ ret = AVERROR(EINVAL);
+ break;
+ case VA_STATUS_ERROR_INVALID_PARAMETER:
+ case VA_STATUS_ERROR_INVALID_VALUE:
+ ret = AVERROR(EINVAL);
+ break;
+ case VA_STATUS_ERROR_ALLOCATION_FAILED:
+ ret = AVERROR(ENOMEM);
+ break;
+ case VA_STATUS_ERROR_UNIMPLEMENTED:
+ ret = AVERROR(ENOSYS);
+ break;
+ case VA_STATUS_ERROR_SURFACE_BUSY:
+ ret = AVERROR(EBUSY);
+ break;
+ default:
+ ret = AVERROR_UNKNOWN;
+ break;
+ }
+ return ret;
+}
+
+/* Retrieves all supported profiles */
+int
+ff_vaapi_get_profiles(VADisplay display, VAProfile **profiles_ptr,
+ unsigned int *n_profiles_ptr)
+{
+ VAStatus status;
+ int n_profiles, ret;
+
+ n_profiles = vaMaxNumProfiles(display);
+ ret = av_reallocp_array(profiles_ptr, n_profiles, sizeof(VAProfile));
+ if (ret != 0)
+ return ret;
+
+ status = vaQueryConfigProfiles(display, *profiles_ptr, &n_profiles);
+ if (status != VA_STATUS_SUCCESS)
+ return ff_vaapi_get_error(status);
+
+ if (n_profiles_ptr)
+ *n_profiles_ptr = n_profiles;
+ return 0;
+}
+
+/* Retrieves all supported entrypoints for the supplied profile */
+int
+ff_vaapi_get_entrypoints(VADisplay display, VAProfile profile,
+ VAEntrypoint **entrypoints_ptr, unsigned int *n_entrypoints_ptr)
+{
+ VAStatus status;
+ int n_entrypoints, ret;
+
+ n_entrypoints = vaMaxNumEntrypoints(display);
+ ret = av_reallocp_array(entrypoints_ptr, n_entrypoints, sizeof(VAEntrypoint));
+ if (ret != 0)
+ return ret;
+
+ status = vaQueryConfigEntrypoints(display, profile, *entrypoints_ptr,
+ &n_entrypoints);
+ if (status != VA_STATUS_SUCCESS)
+ return ff_vaapi_get_error(status);
+
+ if (n_entrypoints_ptr)
+ *n_entrypoints_ptr = n_entrypoints;
+ return 0;
+}
+
+/* Converts FFmpeg pixel format to VA chroma format */
+int
+ff_vaapi_get_chroma_format(enum AVPixelFormat pix_fmt, unsigned int *format_ptr)
+{
+ uint32_t format;
+
+ switch (pix_fmt) {
+ case AV_PIX_FMT_GRAY8:
+ format = VA_RT_FORMAT_YUV400;
+ break;
+ case AV_PIX_FMT_YUV420P:
+ case AV_PIX_FMT_NV12:
+ format = VA_RT_FORMAT_YUV420;
+ break;
+ case AV_PIX_FMT_YUV422P:
+ case AV_PIX_FMT_YUYV422:
+ case AV_PIX_FMT_UYVY422:
+ format = VA_RT_FORMAT_YUV422;
+ break;
+ case AV_PIX_FMT_YUV444P:
+ format = VA_RT_FORMAT_YUV444;
+ break;
+ default:
+ /* FIXME: fill out missing entries */
+ return AVERROR(ENOSYS);
+ }
+
+ if (format_ptr)
+ *format_ptr = format;
+ return 0;
+}
+
+/* Converts FFmpeg pixel format to VA fourcc */
+int
+ff_vaapi_get_pixel_format(enum AVPixelFormat pix_fmt, uint32_t *fourcc_ptr)
+{
+ uint32_t fourcc;
+
+ switch (pix_fmt) {
+ case AV_PIX_FMT_GRAY8:
+ fourcc = VA_FOURCC('Y','8','0','0');
+ break;
+ case AV_PIX_FMT_YUV420P:
+ fourcc = VA_FOURCC('I','4','2','0');
+ break;
+ case AV_PIX_FMT_NV12:
+ fourcc = VA_FOURCC('N','V','1','2');
+ break;
+ case AV_PIX_FMT_YUV422P:
+ fourcc = VA_FOURCC('4','2','2','H');
+ break;
+ case AV_PIX_FMT_YUYV422:
+ fourcc = VA_FOURCC('Y','U','Y','V');
+ break;
+ case AV_PIX_FMT_UYVY422:
+ fourcc = VA_FOURCC('U','Y','V','Y');
+ break;
+ case AV_PIX_FMT_YUV444P:
+ fourcc = VA_FOURCC('4','4','4','P');
+ break;
+ default:
+ /* FIXME: fill out missing entries */
+ return AVERROR(ENOSYS);
+ }
+
+ if (fourcc_ptr)
+ *fourcc_ptr = fourcc;
+ return 0;
+}
diff --git a/libavcodec/vaapi_utils.h b/libavcodec/vaapi_utils.h
new file mode 100644
index 0000000..91515b5
--- /dev/null
+++ b/libavcodec/vaapi_utils.h
@@ -0,0 +1,53 @@
+/*
+ * vaapi_utils.h - Video Acceleration API (VA-API) utilities
+ *
+ * Copyright (C) 2013-2015 Intel Corporation
+ * Author: Gwenole Beauchesne <gwenole.beauchesne at intel.com>
+ *
+ * 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
+ */
+
+#ifndef AVCODEC_VAAPI_UTILS_H
+#define AVCODEC_VAAPI_UTILS_H
+
+#include <va/va.h>
+#include "avcodec.h"
+#include "libavutil/pixfmt.h"
+
+/** Converts VA status to an FFmpeg error code */
+int
+ff_vaapi_get_error(VAStatus status);
+
+/** Retrieves all supported profiles */
+int
+ff_vaapi_get_profiles(VADisplay display, VAProfile **profiles_ptr,
+ unsigned int *n_profiles_ptr);
+
+/** Retrieves all supported entrypoints for the supplied profile */
+int
+ff_vaapi_get_entrypoints(VADisplay display, VAProfile profile,
+ VAEntrypoint **entrypoints_ptr, unsigned int *n_entrypoints_ptr);
+
+/** Converts FFmpeg pixel format to VA chroma format */
+int
+ff_vaapi_get_chroma_format(enum AVPixelFormat pix_fmt, unsigned int *format_ptr);
+
+/** Converts FFmpeg pixel format to VA fourcc */
+int
+ff_vaapi_get_pixel_format(enum AVPixelFormat pix_fmt, uint32_t *fourcc_ptr);
+
+#endif /* AVCODEC_VAAPI_UTILS_H */
--
1.9.1
More information about the ffmpeg-devel
mailing list