[Pkg-gstreamer-commits] [gstreamer-vaapi] 48/176: utils: add helpers for H.264 levels.

Vincent Cheng vcheng at moszumanska.debian.org
Tue Jun 3 08:09:26 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 e2f137f149f506e3e36381911901d5682cfa8969
Author: Gwenole Beauchesne <gwenole.beauchesne at intel.com>
Date:   Fri Dec 6 19:05:52 2013 +0100

    utils: add helpers for H.264 levels.
    
    - gst_vaapi_utils_h264_get_level():
      Returns GstVaapiLevelH264 from H.264 level_idc value
    - gst_vaapi_utils_h264_get_level_idc():
      Returns H.264 level_idc value from GstVaapiLevelH264
    - gst_vaapi_utils_h264_get_level_limits():
      Returns level limits as specified in Table A-1 of the H.264 standard
    - gst_vaapi_utils_h264_get_level_limits_table():
      Returns the Table A-1 specification
---
 gst-libs/gst/vaapi/gstvaapidecoder_h264.c | 33 ++++--------
 gst-libs/gst/vaapi/gstvaapiutils_h264.c   | 71 ++++++++++++++++++++++++++
 gst-libs/gst/vaapi/gstvaapiutils_h264.h   | 83 +++++++++++++++++++++++++++++++
 3 files changed, 165 insertions(+), 22 deletions(-)

diff --git a/gst-libs/gst/vaapi/gstvaapidecoder_h264.c b/gst-libs/gst/vaapi/gstvaapidecoder_h264.c
index 3b0af8a..04f21e4 100644
--- a/gst-libs/gst/vaapi/gstvaapidecoder_h264.c
+++ b/gst-libs/gst/vaapi/gstvaapidecoder_h264.c
@@ -417,34 +417,23 @@ exec_ref_pic_marking(GstVaapiDecoderH264 *decoder, GstVaapiPictureH264 *picture)
 static guint
 get_max_dec_frame_buffering(GstH264SPS *sps)
 {
-    guint max_dec_frame_buffering, MaxDpbMbs, PicSizeMbs;
+    guint max_dec_frame_buffering, PicSizeMbs;
+    GstVaapiLevelH264 level;
+    const GstVaapiH264LevelLimits *level_limits;
 
     /* Table A-1 - Level limits */
-    switch (sps->level_idc) {
-    case 10: MaxDpbMbs = 396;    break;
-    case 11: MaxDpbMbs = 900;    break;
-    case 12: MaxDpbMbs = 2376;   break;
-    case 13: MaxDpbMbs = 2376;   break;
-    case 20: MaxDpbMbs = 2376;   break;
-    case 21: MaxDpbMbs = 4752;   break;
-    case 22: MaxDpbMbs = 8100;   break;
-    case 30: MaxDpbMbs = 8100;   break;
-    case 31: MaxDpbMbs = 18000;  break;
-    case 32: MaxDpbMbs = 20480;  break;
-    case 40: MaxDpbMbs = 32768;  break;
-    case 41: MaxDpbMbs = 32768;  break;
-    case 42: MaxDpbMbs = 34816;  break;
-    case 50: MaxDpbMbs = 110400; break;
-    case 51: MaxDpbMbs = 184320; break;
-    default:
-        g_assert(0 && "unhandled level");
-        break;
-    }
+    if (G_UNLIKELY(sps->level_idc == 11 && sps->constraint_set3_flag))
+        level = GST_VAAPI_LEVEL_H264_L1b;
+    else
+        level = gst_vaapi_utils_h264_get_level(sps->level_idc);
+    level_limits = gst_vaapi_utils_h264_get_level_limits(level);
+    if (!level_limits)
+        return 16;
 
     PicSizeMbs = ((sps->pic_width_in_mbs_minus1 + 1) *
                   (sps->pic_height_in_map_units_minus1 + 1) *
                   (sps->frame_mbs_only_flag ? 1 : 2));
-    max_dec_frame_buffering = MaxDpbMbs / PicSizeMbs;
+    max_dec_frame_buffering = level_limits->MaxDpbMbs / PicSizeMbs;
 
     /* VUI parameters */
     if (sps->vui_parameters_present_flag) {
diff --git a/gst-libs/gst/vaapi/gstvaapiutils_h264.c b/gst-libs/gst/vaapi/gstvaapiutils_h264.c
index b6d9085..b7d2f43 100644
--- a/gst-libs/gst/vaapi/gstvaapiutils_h264.c
+++ b/gst-libs/gst/vaapi/gstvaapiutils_h264.c
@@ -24,6 +24,31 @@
 #include <gst/codecparsers/gsth264parser.h>
 #include "gstvaapiutils_h264.h"
 
+/* Table A-1 - Level limits */
+/* *INDENT-OFF* */
+static const GstVaapiH264LevelLimits gst_vaapi_h264_level_limits[] = {
+  /* level                     idc   MaxMBPS   MaxFS MaxDpbMbs   MaxBR */
+  { GST_VAAPI_LEVEL_H264_L1,    10,     1485,     99,     396,      64 },
+  { GST_VAAPI_LEVEL_H264_L1b,   11,     1485,     99,     396,     128 },
+  { GST_VAAPI_LEVEL_H264_L1_1,  11,     3000,    396,     900,     192 },
+  { GST_VAAPI_LEVEL_H264_L1_2,  12,     6000,    396,    2376,     384 },
+  { GST_VAAPI_LEVEL_H264_L1_3,  13,    11880,    396,    2376,     768 },
+  { GST_VAAPI_LEVEL_H264_L2,    20,    11880,    396,    2376,    2000 },
+  { GST_VAAPI_LEVEL_H264_L2_1,  21,    19800,    792,    4752,    4000 },
+  { GST_VAAPI_LEVEL_H264_L2_2,  22,    20250,   1620,    8100,    4000 },
+  { GST_VAAPI_LEVEL_H264_L3,    30,    40500,   1620,    8100,   10000 },
+  { GST_VAAPI_LEVEL_H264_L3_1,  31,   108000,   3600,   18000,   14000 },
+  { GST_VAAPI_LEVEL_H264_L3_2,  32,   216000,   5120,   20480,   20000 },
+  { GST_VAAPI_LEVEL_H264_L4,    40,   245760,   8192,   32768,   20000 },
+  { GST_VAAPI_LEVEL_H264_L4_1,  41,   245760,   8192,   32768,   50000 },
+  { GST_VAAPI_LEVEL_H264_L4_2,  42,   522240,   8704,   34816,   50000 },
+  { GST_VAAPI_LEVEL_H264_L5,    50,   589824,  22080,  110400,  135000 },
+  { GST_VAAPI_LEVEL_H264_L5_1,  51,   983040,  36864,  184320,  240000 },
+  { GST_VAAPI_LEVEL_H264_L5_2,  52,  2073600,  36864,  184320,  240000 },
+  { 0, }
+};
+/* *INDENT-ON* */
+
 /** Returns GstVaapiProfile from H.264 profile_idc value */
 GstVaapiProfile
 gst_vaapi_utils_h264_get_profile (guint8 profile_idc)
@@ -79,6 +104,52 @@ gst_vaapi_utils_h264_get_profile_idc (GstVaapiProfile profile)
   return profile_idc;
 }
 
+/** Returns GstVaapiLevelH264 from H.264 level_idc value */
+GstVaapiLevelH264
+gst_vaapi_utils_h264_get_level (guint8 level_idc)
+{
+  const GstVaapiH264LevelLimits *llp;
+
+  // Prefer Level 1.1 over level 1b
+  if (G_UNLIKELY (level_idc == 11))
+    return GST_VAAPI_LEVEL_H264_L1_1;
+
+  for (llp = gst_vaapi_h264_level_limits; llp->level != 0; llp++) {
+    if (llp->level_idc == level_idc)
+      return llp->level;
+  }
+  g_assert (0 && "unsupported level_idc value");
+  return (GstVaapiLevelH264) 0;
+}
+
+/** Returns H.264 level_idc value from GstVaapiLevelH264 */
+guint8
+gst_vaapi_utils_h264_get_level_idc (GstVaapiLevelH264 level)
+{
+  const GstVaapiH264LevelLimits *const llp =
+     gst_vaapi_utils_h264_get_level_limits (level);
+
+  return llp ? llp->level_idc : 0;
+}
+
+/** Returns level limits as specified in Table A-1 of the H.264 standard */
+const GstVaapiH264LevelLimits *
+gst_vaapi_utils_h264_get_level_limits (GstVaapiLevelH264 level)
+{
+  if (level < GST_VAAPI_LEVEL_H264_L1 || level > GST_VAAPI_LEVEL_H264_L5_2)
+    return NULL;
+  return &gst_vaapi_h264_level_limits[level - GST_VAAPI_LEVEL_H264_L1];
+}
+
+/** Returns the Table A-1 specification */
+const GstVaapiH264LevelLimits *
+gst_vaapi_utils_h264_get_level_limits_table (guint * out_length_ptr)
+{
+  if (out_length_ptr)
+    *out_length_ptr = G_N_ELEMENTS (gst_vaapi_h264_level_limits) - 1;
+  return gst_vaapi_h264_level_limits;
+}
+
 /** Returns GstVaapiChromaType from H.264 chroma_format_idc value */
 GstVaapiChromaType
 gst_vaapi_utils_h264_get_chroma_type (guint chroma_format_idc)
diff --git a/gst-libs/gst/vaapi/gstvaapiutils_h264.h b/gst-libs/gst/vaapi/gstvaapiutils_h264.h
index f1abf22..cbd7217 100644
--- a/gst-libs/gst/vaapi/gstvaapiutils_h264.h
+++ b/gst-libs/gst/vaapi/gstvaapiutils_h264.h
@@ -29,6 +29,69 @@
 
 G_BEGIN_DECLS
 
+/**
+ * GstVaapiLevelH264:
+ * @GST_VAAPI_LEVEL_H264_L1: H.264 level 1.
+ * @GST_VAAPI_LEVEL_H264_L1_1: H.264 level 1.1.
+ * @GST_VAAPI_LEVEL_H264_L1_2: H.264 level 1.2.
+ * @GST_VAAPI_LEVEL_H264_L1_3: H.264 level 1.3.
+ * @GST_VAAPI_LEVEL_H264_L2: H.264 level 2.
+ * @GST_VAAPI_LEVEL_H264_L2_1: H.264 level 2.1.
+ * @GST_VAAPI_LEVEL_H264_L2_2: H.264 level 2.2.
+ * @GST_VAAPI_LEVEL_H264_L3: H.264 level 3.
+ * @GST_VAAPI_LEVEL_H264_L3_1: H.264 level 3.1.
+ * @GST_VAAPI_LEVEL_H264_L3_2: H.264 level 3.2.
+ * @GST_VAAPI_LEVEL_H264_L4: H.264 level 4.
+ * @GST_VAAPI_LEVEL_H264_L4_1: H.264 level 4.1.
+ * @GST_VAAPI_LEVEL_H264_L4_2: H.264 level 4.2.
+ * @GST_VAAPI_LEVEL_H264_L5: H.264 level 5.
+ * @GST_VAAPI_LEVEL_H264_L5_1: H.264 level 5.1.
+ * @GST_VAAPI_LEVEL_H264_L5_2: H.264 level 5.2.
+ *
+ * The set of all levels for #GstVaapiLevelH264.
+ */
+typedef enum
+{
+  GST_VAAPI_LEVEL_H264_L1 = 1,
+  GST_VAAPI_LEVEL_H264_L1b,
+  GST_VAAPI_LEVEL_H264_L1_1,
+  GST_VAAPI_LEVEL_H264_L1_2,
+  GST_VAAPI_LEVEL_H264_L1_3,
+  GST_VAAPI_LEVEL_H264_L2,
+  GST_VAAPI_LEVEL_H264_L2_1,
+  GST_VAAPI_LEVEL_H264_L2_2,
+  GST_VAAPI_LEVEL_H264_L3,
+  GST_VAAPI_LEVEL_H264_L3_1,
+  GST_VAAPI_LEVEL_H264_L3_2,
+  GST_VAAPI_LEVEL_H264_L4,
+  GST_VAAPI_LEVEL_H264_L4_1,
+  GST_VAAPI_LEVEL_H264_L4_2,
+  GST_VAAPI_LEVEL_H264_L5,
+  GST_VAAPI_LEVEL_H264_L5_1,
+  GST_VAAPI_LEVEL_H264_L5_2,
+} GstVaapiLevelH264;
+
+/**
+ * GstVaapiH264LevelLimits:
+ * @level: the #GstVaapiLevelH264
+ * @level_idc: the H.264 level_idc value
+ * @MaxMBPS: the maximum macroblock processing rate (MB/sec)
+ * @MaxFS: the maximum frame size (MBs)
+ * @MaxDpbMbs: the maxium decoded picture buffer size (MBs)
+ * @MaxBR: the maximum video bit rate (kbps)
+ *
+ * The data structure that describes the limits of an H.264 level.
+ */
+typedef struct
+{
+  GstVaapiLevelH264 level;
+  guint8 level_idc;
+  guint32 MaxMBPS;
+  guint32 MaxFS;
+  guint32 MaxDpbMbs;
+  guint32 MaxBR;
+} GstVaapiH264LevelLimits;
+
 /* Returns GstVaapiProfile from H.264 profile_idc value */
 G_GNUC_INTERNAL
 GstVaapiProfile
@@ -39,6 +102,26 @@ G_GNUC_INTERNAL
 guint8
 gst_vaapi_utils_h264_get_profile_idc (GstVaapiProfile profile);
 
+/* Returns GstVaapiLevelH264 from H.264 level_idc value */
+G_GNUC_INTERNAL
+GstVaapiLevelH264
+gst_vaapi_utils_h264_get_level (guint8 level_idc);
+
+/* Returns H.264 level_idc value from GstVaapiLevelH264 */
+G_GNUC_INTERNAL
+guint8
+gst_vaapi_utils_h264_get_level_idc (GstVaapiLevelH264 level);
+
+/* Returns level limits as specified in Table A-1 of the H.264 standard */
+G_GNUC_INTERNAL
+const GstVaapiH264LevelLimits *
+gst_vaapi_utils_h264_get_level_limits (GstVaapiLevelH264 level);
+
+/* Returns the Table A-1 specification */
+G_GNUC_INTERNAL
+const GstVaapiH264LevelLimits *
+gst_vaapi_utils_h264_get_level_limits_table (guint *out_length_ptr);
+
 /* Returns GstVaapiChromaType from H.264 chroma_format_idc value */
 G_GNUC_INTERNAL
 GstVaapiChromaType

-- 
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