[Pkg-gstreamer-commits] [gstreamer-vaapi] 89/176: utils: add new MPEG-2 helper functions.
Vincent Cheng
vcheng at moszumanska.debian.org
Tue Jun 3 08:09:30 UTC 2014
This is an automated email from the git hooks/post-receive script.
vcheng pushed a commit to branch upstream
in repository gstreamer-vaapi.
commit 9548e32cf4cce81e129d208eeff2b31eb023b6cd
Author: Gwenole Beauchesne <gwenole.beauchesne at intel.com>
Date: Mon Jan 13 16:20:06 2014 +0100
utils: add new MPEG-2 helper functions.
Add various helper functions to convert profile, level, chroma formats
from gstreamer-vaapi world and the MPEG-2 specification world.
---
gst-libs/gst/vaapi/Makefile.am | 3 +
gst-libs/gst/vaapi/gstvaapiutils_mpeg2.c | 284 ++++++++++++++++++++++++++
gst-libs/gst/vaapi/gstvaapiutils_mpeg2.h | 71 +++++++
gst-libs/gst/vaapi/gstvaapiutils_mpeg2_priv.h | 97 +++++++++
4 files changed, 455 insertions(+)
diff --git a/gst-libs/gst/vaapi/Makefile.am b/gst-libs/gst/vaapi/Makefile.am
index f429c07..5fccc93 100644
--- a/gst-libs/gst/vaapi/Makefile.am
+++ b/gst-libs/gst/vaapi/Makefile.am
@@ -70,6 +70,7 @@ libgstvaapi_source_c = \
gstvaapisurfaceproxy.c \
gstvaapiutils.c \
gstvaapiutils_h264.c \
+ gstvaapiutils_mpeg2.c \
gstvaapivalue.c \
gstvaapivideopool.c \
gstvaapiwindow.c \
@@ -95,6 +96,7 @@ libgstvaapi_source_h = \
gstvaapisurfaceproxy.h \
gstvaapitypes.h \
gstvaapiutils_h264.h \
+ gstvaapiutils_mpeg2.h \
gstvaapivalue.h \
gstvaapivideopool.h \
gstvaapiwindow.h \
@@ -123,6 +125,7 @@ libgstvaapi_source_priv_h = \
gstvaapisurfaceproxy_priv.h \
gstvaapiutils.h \
gstvaapiutils_h264_priv.h \
+ gstvaapiutils_mpeg2_priv.h \
gstvaapiversion.h \
gstvaapivideopool_priv.h \
gstvaapiwindow_priv.h \
diff --git a/gst-libs/gst/vaapi/gstvaapiutils_mpeg2.c b/gst-libs/gst/vaapi/gstvaapiutils_mpeg2.c
new file mode 100644
index 0000000..35003ce
--- /dev/null
+++ b/gst-libs/gst/vaapi/gstvaapiutils_mpeg2.c
@@ -0,0 +1,284 @@
+/*
+ * gstvaapiutils_mpeg2.c - MPEG-2 related utilities
+ *
+ * Copyright (C) 2011-2013 Intel Corporation
+ * Author: Gwenole Beauchesne <gwenole.beauchesne at intel.com>
+ *
+ * This library 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.
+ *
+ * This library 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 this library; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ */
+
+#include "sysdeps.h"
+#include <gst/codecparsers/gstmpegvideoparser.h>
+#include "gstvaapiutils_mpeg2_priv.h"
+
+struct map
+{
+ guint value;
+ const gchar *name;
+};
+
+/* Profile string map */
+static const struct map gst_vaapi_mpeg2_profile_map[] = {
+/* *INDENT-OFF* */
+ { GST_VAAPI_PROFILE_MPEG2_SIMPLE, "simple" },
+ { GST_VAAPI_PROFILE_MPEG2_MAIN, "main" },
+ { GST_VAAPI_PROFILE_MPEG2_HIGH, "high" },
+ { 0, NULL }
+/* *INDENT-ON* */
+};
+
+/* Level string map */
+static const struct map gst_vaapi_mpeg2_level_map[] = {
+/* *INDENT-OFF* */
+ { GST_VAAPI_LEVEL_MPEG2_LOW, "low" },
+ { GST_VAAPI_LEVEL_MPEG2_MAIN, "main" },
+ { GST_VAAPI_LEVEL_MPEG2_HIGH_1440, "high-1440" },
+ { GST_VAAPI_LEVEL_MPEG2_HIGH, "high" },
+ { 0, NULL }
+/* *INDENT-ON* */
+};
+
+/* Table 8-10 to 8-13 (up to Main profile only) */
+/* *INDENT-OFF* */
+static const GstVaapiMPEG2LevelLimits gst_vaapi_mpeg2_level_limits[] = {
+ /* level h_size v_size fps samples kbps vbv_size */
+ { GST_VAAPI_LEVEL_MPEG2_LOW,
+ 0x0a, 352, 288, 30, 3041280, 4000, 475136 },
+ { GST_VAAPI_LEVEL_MPEG2_MAIN,
+ 0x08, 720, 576, 30, 1036800, 15000, 1835008 },
+ { GST_VAAPI_LEVEL_MPEG2_HIGH_1440,
+ 0x06, 1440, 1152, 60, 47001600, 60000, 7340032 },
+ { GST_VAAPI_LEVEL_MPEG2_HIGH,
+ 0x04, 1920, 1152, 60, 62668800, 80000, 9781248 },
+ { 0, }
+};
+/* *INDENT-ON* */
+
+/* Lookup value in map */
+static const struct map *
+map_lookup_value (const struct map *m, guint value)
+{
+ g_return_val_if_fail (m != NULL, NULL);
+
+ for (; m->name != NULL; m++) {
+ if (m->value == value)
+ return m;
+ }
+ return NULL;
+}
+
+/* Lookup name in map */
+static const struct map *
+map_lookup_name (const struct map *m, const gchar * name)
+{
+ g_return_val_if_fail (m != NULL, NULL);
+
+ if (!name)
+ return NULL;
+
+ for (; m->name != NULL; m++) {
+ if (strcmp (m->name, name) == 0)
+ return m;
+ }
+ return NULL;
+}
+
+/** Returns a relative score for the supplied GstVaapiProfile */
+guint
+gst_vaapi_utils_mpeg2_get_profile_score (GstVaapiProfile profile)
+{
+ const struct map *const m =
+ map_lookup_value (gst_vaapi_mpeg2_profile_map, profile);
+
+ return m ? 1 + (m - gst_vaapi_mpeg2_profile_map) : 0;
+}
+
+/** Returns GstVaapiProfile from MPEG-2 profile_idc value */
+GstVaapiProfile
+gst_vaapi_utils_mpeg2_get_profile (guint8 profile_idc)
+{
+ GstVaapiProfile profile;
+
+ switch (profile_idc) {
+ case GST_MPEG_VIDEO_PROFILE_SIMPLE:
+ profile = GST_VAAPI_PROFILE_MPEG2_SIMPLE;
+ break;
+ case GST_MPEG_VIDEO_PROFILE_MAIN:
+ profile = GST_VAAPI_PROFILE_MPEG2_MAIN;
+ break;
+ case GST_MPEG_VIDEO_PROFILE_HIGH:
+ profile = GST_VAAPI_PROFILE_MPEG2_HIGH;
+ break;
+ default:
+ g_debug ("unsupported profile_idc value");
+ profile = GST_VAAPI_PROFILE_UNKNOWN;
+ break;
+ }
+ return profile;
+}
+
+/** Returns MPEG-2 profile_idc value from GstVaapiProfile */
+guint8
+gst_vaapi_utils_mpeg2_get_profile_idc (GstVaapiProfile profile)
+{
+ guint8 profile_idc;
+
+ switch (profile) {
+ case GST_VAAPI_PROFILE_MPEG2_SIMPLE:
+ profile_idc = GST_MPEG_VIDEO_PROFILE_SIMPLE;
+ break;
+ case GST_VAAPI_PROFILE_MPEG2_MAIN:
+ profile_idc = GST_MPEG_VIDEO_PROFILE_MAIN;
+ break;
+ case GST_VAAPI_PROFILE_MPEG2_HIGH:
+ profile_idc = GST_MPEG_VIDEO_PROFILE_HIGH;
+ break;
+ default:
+ g_debug ("unsupported GstVaapiProfile value");
+ profile_idc = 0;
+ break;
+ }
+ return profile_idc;
+}
+
+/** Returns GstVaapiProfile from a string representation */
+GstVaapiProfile
+gst_vaapi_utils_mpeg2_get_profile_from_string (const gchar * str)
+{
+ const struct map *const m =
+ map_lookup_name (gst_vaapi_mpeg2_profile_map, str);
+
+ return m ? (GstVaapiProfile) m->value : GST_VAAPI_PROFILE_UNKNOWN;
+}
+
+/** Returns a string representation for the supplied MPEG-2 profile */
+const gchar *
+gst_vaapi_utils_mpeg2_get_profile_string (GstVaapiProfile profile)
+{
+ const struct map *const m =
+ map_lookup_value (gst_vaapi_mpeg2_profile_map, profile);
+
+ return m ? m->name : NULL;
+}
+
+/** Returns GstVaapiLevelMPEG2 from MPEG-2 level_idc value */
+GstVaapiLevelMPEG2
+gst_vaapi_utils_mpeg2_get_level (guint8 level_idc)
+{
+ const GstVaapiMPEG2LevelLimits *llp;
+
+ for (llp = gst_vaapi_mpeg2_level_limits; llp->level != 0; llp++) {
+ if (llp->level_idc == level_idc)
+ return llp->level;
+ }
+ g_debug ("unsupported level_idc value");
+ return (GstVaapiLevelMPEG2) 0;
+}
+
+/** Returns MPEG-2 level_idc value from GstVaapiLevelMPEG2 */
+guint8
+gst_vaapi_utils_mpeg2_get_level_idc (GstVaapiLevelMPEG2 level)
+{
+ const GstVaapiMPEG2LevelLimits *const llp =
+ gst_vaapi_utils_mpeg2_get_level_limits (level);
+
+ return llp ? llp->level_idc : 0;
+}
+
+/** Returns GstVaapiLevelMPEG2 from a string representation */
+GstVaapiLevelMPEG2
+gst_vaapi_utils_mpeg2_get_level_from_string (const gchar * str)
+{
+ const struct map *const m = map_lookup_name (gst_vaapi_mpeg2_level_map, str);
+
+ return (GstVaapiLevelMPEG2) (m ? m->value : 0);
+}
+
+/** Returns a string representation for the supplied MPEG-2 level */
+const gchar *
+gst_vaapi_utils_mpeg2_get_level_string (GstVaapiLevelMPEG2 level)
+{
+ if (level < GST_VAAPI_LEVEL_MPEG2_LOW || level > GST_VAAPI_LEVEL_MPEG2_HIGH)
+ return NULL;
+ return gst_vaapi_mpeg2_level_map[level - GST_VAAPI_LEVEL_MPEG2_LOW].name;
+}
+
+/** Returns level limits as specified in Tables 8-10 to 8-13 of the
+ MPEG-2 standard */
+const GstVaapiMPEG2LevelLimits *
+gst_vaapi_utils_mpeg2_get_level_limits (GstVaapiLevelMPEG2 level)
+{
+ if (level < GST_VAAPI_LEVEL_MPEG2_LOW || level > GST_VAAPI_LEVEL_MPEG2_HIGH)
+ return NULL;
+ return &gst_vaapi_mpeg2_level_limits[level - GST_VAAPI_LEVEL_MPEG2_LOW];
+}
+
+/** Returns Tables 8-10 to 8-13 from the specification (up to High profile) */
+const GstVaapiMPEG2LevelLimits *
+gst_vaapi_utils_mpeg2_get_level_limits_table (guint * out_length_ptr)
+{
+ if (out_length_ptr)
+ *out_length_ptr = G_N_ELEMENTS (gst_vaapi_mpeg2_level_limits) - 1;
+ return gst_vaapi_mpeg2_level_limits;
+}
+
+/** Returns GstVaapiChromaType from MPEG-2 chroma_format_idc value */
+GstVaapiChromaType
+gst_vaapi_utils_mpeg2_get_chroma_type (guint chroma_format_idc)
+{
+ GstVaapiChromaType chroma_type;
+
+ switch (chroma_format_idc) {
+ case GST_MPEG_VIDEO_CHROMA_420:
+ chroma_type = GST_VAAPI_CHROMA_TYPE_YUV420;
+ break;
+ case GST_MPEG_VIDEO_CHROMA_422:
+ chroma_type = GST_VAAPI_CHROMA_TYPE_YUV422;
+ break;
+ case GST_MPEG_VIDEO_CHROMA_444:
+ chroma_type = GST_VAAPI_CHROMA_TYPE_YUV444;
+ break;
+ default:
+ g_debug ("unsupported chroma_format_idc value");
+ chroma_type = (GstVaapiChromaType) 0;
+ break;
+ }
+ return chroma_type;
+}
+
+/** Returns MPEG-2 chroma_format_idc value from GstVaapiChromaType */
+guint
+gst_vaapi_utils_mpeg2_get_chroma_format_idc (GstVaapiChromaType chroma_type)
+{
+ guint chroma_format_idc;
+
+ switch (chroma_type) {
+ case GST_VAAPI_CHROMA_TYPE_YUV420:
+ chroma_format_idc = GST_MPEG_VIDEO_CHROMA_420;
+ break;
+ case GST_VAAPI_CHROMA_TYPE_YUV422:
+ chroma_format_idc = GST_MPEG_VIDEO_CHROMA_422;
+ break;
+ case GST_VAAPI_CHROMA_TYPE_YUV444:
+ chroma_format_idc = GST_MPEG_VIDEO_CHROMA_444;
+ break;
+ default:
+ g_debug ("unsupported GstVaapiChromaType value");
+ chroma_format_idc = 1;
+ break;
+ }
+ return chroma_format_idc;
+}
diff --git a/gst-libs/gst/vaapi/gstvaapiutils_mpeg2.h b/gst-libs/gst/vaapi/gstvaapiutils_mpeg2.h
new file mode 100644
index 0000000..8a3d897
--- /dev/null
+++ b/gst-libs/gst/vaapi/gstvaapiutils_mpeg2.h
@@ -0,0 +1,71 @@
+/*
+ * gstvaapiutils_mpeg2.h - MPEG-2 related utilities
+ *
+ * Copyright (C) 2011-2013 Intel Corporation
+ * Author: Gwenole Beauchesne <gwenole.beauchesne at intel.com>
+ *
+ * This library 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.
+ *
+ * This library 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 this library; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ */
+
+#ifndef GST_VAAPI_UTILS_MPEG2_H
+#define GST_VAAPI_UTILS_MPEG2_H
+
+#include <va/va.h>
+#include <gst/vaapi/gstvaapiprofile.h>
+#include <gst/vaapi/gstvaapisurface.h>
+
+G_BEGIN_DECLS
+
+/**
+ * GstVaapiLevelMPEG2:
+ * @GST_VAAPI_LEVEL_MPEG2_LOW: Low level.
+ * @GST_VAAPI_LEVEL_MPEG2_MAIN: Main level.
+ * @GST_VAAPI_LEVEL_MPEG2_HIGH_1440: High-1440 level.
+ * @GST_VAAPI_LEVEL_MPEG2_HIGH: High level.
+ *
+ * The set of all levels for #GstVaapiLevelMPEG2.
+ */
+typedef enum
+{
+ GST_VAAPI_LEVEL_MPEG2_LOW = 1,
+ GST_VAAPI_LEVEL_MPEG2_MAIN,
+ GST_VAAPI_LEVEL_MPEG2_HIGH_1440,
+ GST_VAAPI_LEVEL_MPEG2_HIGH,
+} GstVaapiLevelMPEG2;
+
+/* Returns a relative score for the supplied GstVaapiProfile */
+guint
+gst_vaapi_utils_mpeg2_get_profile_score (GstVaapiProfile profile);
+
+/* Returns GstVaapiProfile from a string representation */
+GstVaapiProfile
+gst_vaapi_utils_mpeg2_get_profile_from_string (const gchar * str);
+
+/* Returns a string representation for the supplied MPEG-2 profile */
+const gchar *
+gst_vaapi_utils_mpeg2_get_profile_string (GstVaapiProfile profile);
+
+/* Returns GstVaapiLevelMPEG2 from a string representation */
+GstVaapiLevelMPEG2
+gst_vaapi_utils_mpeg2_get_level_from_string (const gchar * str);
+
+/* Returns a string representation for the supplied MPEG-2 level */
+const gchar *
+gst_vaapi_utils_mpeg2_get_level_string (GstVaapiLevelMPEG2 level);
+
+G_END_DECLS
+
+#endif /* GST_VAAPI_UTILS_MPEG2_H */
diff --git a/gst-libs/gst/vaapi/gstvaapiutils_mpeg2_priv.h b/gst-libs/gst/vaapi/gstvaapiutils_mpeg2_priv.h
new file mode 100644
index 0000000..d29d2cb
--- /dev/null
+++ b/gst-libs/gst/vaapi/gstvaapiutils_mpeg2_priv.h
@@ -0,0 +1,97 @@
+/*
+ * gstvaapiutils_mpeg2_priv.h - MPEG-2 related utilities
+ *
+ * Copyright (C) 2011-2013 Intel Corporation
+ * Author: Gwenole Beauchesne <gwenole.beauchesne at intel.com>
+ *
+ * This library 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.
+ *
+ * This library 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 this library; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ */
+
+#ifndef GST_VAAPI_UTILS_MPEG2_PRIV_H
+#define GST_VAAPI_UTILS_MPEG2_PRIV_H
+
+#include "gstvaapiutils_mpeg2.h"
+
+G_BEGIN_DECLS
+
+/**
+ * GstVaapiMPEG2LevelLimits:
+ * @level: the #GstVaapiLevelMPEG2
+ * @level_idc: the MPEG-2 level indication value
+ * @horizontal_size_value: the maximum number of samples per line
+ * @vertical_size_value: the maximum number of lines per frame
+ * @frame_rate_value: the maximum number of frames per second
+ * @sample_rate: the maximum number of samples per second (for luminance)
+ * @bit_rate: the maximum bit rate (kbps)
+ * @vbv_buffer_size: the VBV buffer size requirements (bits)
+ *
+ * The data structure that describes the limits of an MPEG-2 level.
+ */
+typedef struct
+{
+ GstVaapiLevelMPEG2 level;
+ guint8 level_idc;
+ guint16 horizontal_size_value;
+ guint16 vertical_size_value;
+ guint32 frame_rate_value;
+ guint32 sample_rate;
+ guint32 bit_rate;
+ guint32 vbv_buffer_size;
+} GstVaapiMPEG2LevelLimits;
+
+/* Returns GstVaapiProfile from MPEG-2 profile_idc value */
+G_GNUC_INTERNAL
+GstVaapiProfile
+gst_vaapi_utils_mpeg2_get_profile (guint8 profile_idc);
+
+/* Returns MPEG-2 profile_idc value from GstVaapiProfile */
+G_GNUC_INTERNAL
+guint8
+gst_vaapi_utils_mpeg2_get_profile_idc (GstVaapiProfile profile);
+
+/* Returns GstVaapiLevelMPEG2 from MPEG-2 level_idc value */
+G_GNUC_INTERNAL
+GstVaapiLevelMPEG2
+gst_vaapi_utils_mpeg2_get_level (guint8 level_idc);
+
+/* Returns MPEG-2 level_idc value from GstVaapiLevelMPEG2 */
+G_GNUC_INTERNAL
+guint8
+gst_vaapi_utils_mpeg2_get_level_idc (GstVaapiLevelMPEG2 level);
+
+/* Returns level limits as specified in Table A-1 of the MPEG-2 standard */
+G_GNUC_INTERNAL
+const GstVaapiMPEG2LevelLimits *
+gst_vaapi_utils_mpeg2_get_level_limits (GstVaapiLevelMPEG2 level);
+
+/* Returns the Table A-1 specification */
+G_GNUC_INTERNAL
+const GstVaapiMPEG2LevelLimits *
+gst_vaapi_utils_mpeg2_get_level_limits_table (guint * out_length_ptr);
+
+/* Returns GstVaapiChromaType from MPEG-2 chroma_format_idc value */
+G_GNUC_INTERNAL
+GstVaapiChromaType
+gst_vaapi_utils_mpeg2_get_chroma_type (guint chroma_format_idc);
+
+/* Returns MPEG-2 chroma_format_idc value from GstVaapiChromaType */
+G_GNUC_INTERNAL
+guint
+gst_vaapi_utils_mpeg2_get_chroma_format_idc (GstVaapiChromaType chroma_type);
+
+G_END_DECLS
+
+#endif /* GST_VAAPI_UTILS_MPEG2_PRIV_H */
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-gstreamer/gstreamer-vaapi.git
More information about the Pkg-gstreamer-commits
mailing list