[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