]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - glsdk/gst-plugin-ducati.git/blobdiff - src/gstducatih264enc.c
Removed redundant definitions in h264enc fields
[glsdk/gst-plugin-ducati.git] / src / gstducatih264enc.c
index 05edc38ce39b1cb01c05d648afd6666d3f88a0b5..683a311b5a60b4f2a32ac3bbd44cb0900dc67d12 100644 (file)
 
 #define GST_CAT_DEFAULT gst_ducati_debug
 
-#define DEFAULT_PROFILE GST_DUCATI_H264ENC_PROFILE_HIGH
-#define DEFAULT_LEVEL GST_DUCATI_H264ENC_LEVEL_40
+#define DEFAULT_PROFILE IH264_HIGH_PROFILE
+#define DEFAULT_LEVEL IH264_LEVEL_40
 #define DEFAULT_QPI 28
 #define DEFAULT_QP_MAX_I 36
 #define DEFAULT_QP_MIN_I 10
 /* 2 x targetBitRate for VBR Rate Control */
 #define DEFAULT_HRD_BUFFER_SIZE 40960000
+#define DEFAULT_INTER_INTERVAL 4
 
 #define GST_TYPE_DUCATI_H264ENC_PROFILE (gst_ducati_h264enc_profile_get_type ())
 #define GST_TYPE_DUCATI_H264ENC_LEVEL (gst_ducati_h264enc_level_get_type ())
@@ -66,6 +67,7 @@ enum
   PROP_QP_MIN_I,
   PROP_HRD_BUFFER_SIZE,
   PROP_ENTROPY_CODING_MODE,
+  PROP_INTER_INTERVAL,
   PROP_SLICE_MODE,
 };
 
@@ -78,6 +80,8 @@ static gboolean gst_ducati_h264enc_allocate_params (GstDucatiVidEnc *
     self, gint params_sz, gint dynparams_sz, gint status_sz, gint inargs_sz,
     gint outargs_sz);
 static gboolean gst_ducati_h264enc_configure (GstDucatiVidEnc * self);
+static gboolean gst_ducati_h264enc_is_sync_point (GstDucatiVidEnc * enc,
+    int type);
 
 
 static GstStaticPadTemplate gst_ducati_h264enc_sink_template =
@@ -99,38 +103,6 @@ GST_BOILERPLATE (GstDucatiH264Enc, gst_ducati_h264enc, GstDucatiVidEnc,
     GST_TYPE_DUCATIVIDENC);
 
 
-/* the values for the following enums are taken from the codec */
-
-enum
-{
-  GST_DUCATI_H264ENC_PROFILE_BASELINE = 66,            /**< BaseLine Profile   */
-  GST_DUCATI_H264ENC_PROFILE_MAIN = 77,                /**< Main Profile       */
-  GST_DUCATI_H264ENC_PROFILE_EXTENDED = 88,            /**< Extended Profile   */
-  GST_DUCATI_H264ENC_PROFILE_HIGH = 100,               /**< High Profile       */
-  GST_DUCATI_H264ENC_PROFILE_HIGH_10 = 110,             /**< High 10 Profile    */
-  GST_DUCATI_H264ENC_PROFILE_HIGH_422 = 122             /**< High 4:2:2 Profile */
-};
-
-enum
-{
-  GST_DUCATI_H264ENC_LEVEL_10 = 10, /**<  Level 1.0  */
-  GST_DUCATI_H264ENC_LEVEL_1b = 9,  /**<  Level 1.b  */
-  GST_DUCATI_H264ENC_LEVEL_11 = 11, /**<  Level 1.1  */
-  GST_DUCATI_H264ENC_LEVEL_12 = 12, /**<  Level 1.2  */
-  GST_DUCATI_H264ENC_LEVEL_13 = 13, /**<  Level 1.3  */
-  GST_DUCATI_H264ENC_LEVEL_20 = 20, /**<  Level 2.0  */
-  GST_DUCATI_H264ENC_LEVEL_21 = 21, /**<  Level 2.1  */
-  GST_DUCATI_H264ENC_LEVEL_22 = 22, /**<  Level 2.2  */
-  GST_DUCATI_H264ENC_LEVEL_30 = 30, /**<  Level 3.0  */
-  GST_DUCATI_H264ENC_LEVEL_31 = 31, /**<  Level 3.1  */
-  GST_DUCATI_H264ENC_LEVEL_32 = 32, /**<  Level 3.2  */
-  GST_DUCATI_H264ENC_LEVEL_40 = 40, /**<  Level 4.0  */
-  GST_DUCATI_H264ENC_LEVEL_41 = 41, /**<  Level 4.1  */
-  GST_DUCATI_H264ENC_LEVEL_42 = 42, /**<  Level 4.2  */
-  GST_DUCATI_H264ENC_LEVEL_50 = 50, /**<  Level 5.0  */
-  GST_DUCATI_H264ENC_LEVEL_51 = 51 /**<  Level 5.1  */
-};
-
 static GType
 gst_ducati_h264enc_profile_get_type (void)
 {
@@ -138,12 +110,12 @@ gst_ducati_h264enc_profile_get_type (void)
 
   if (!type) {
     static const GEnumValue vals[] = {
-      {GST_DUCATI_H264ENC_PROFILE_BASELINE, "Base Profile", "baseline"},
-      {GST_DUCATI_H264ENC_PROFILE_MAIN, "Main Profile", "main"},
-      {GST_DUCATI_H264ENC_PROFILE_EXTENDED, "Extended Profile", "extended"},
-      {GST_DUCATI_H264ENC_PROFILE_HIGH, "High Profile", "high"},
-      {GST_DUCATI_H264ENC_PROFILE_HIGH_10, "High 10 Profile", "high-10"},
-      {GST_DUCATI_H264ENC_PROFILE_HIGH_422, "High 4:2:2 Profile", "high-422"},
+      {IH264_BASELINE_PROFILE, "Base Profile", "baseline"},
+      {IH264_MAIN_PROFILE, "Main Profile", "main"},
+      {IH264_EXTENDED_PROFILE, "Extended Profile", "extended"},
+      {IH264_HIGH_PROFILE, "High Profile", "high"},
+      {IH264_HIGH10_PROFILE, "High 10 Profile", "high-10"},
+      {IH264_HIGH422_PROFILE, "High 4:2:2 Profile", "high-422"},
       {0, NULL, NULL},
     };
 
@@ -166,8 +138,6 @@ gst_ducati_h264enc_get_rate_control_params_preset_type (void)
           "rate-control-params-preset-user-defined"},
       {IH264_RATECONTROLPARAMS_EXISTING, "Existing rate control params",
           "rate-control-params-preset-existing"},
-      {IH264_RATECONTROLPARAMS_MAX, "Max rate control",
-          "rate-control-params-preset-control"},
       {0, NULL, NULL},
     };
 
@@ -188,8 +158,6 @@ gst_ducati_h264enc_get_rate_control_algo_type (void)
           "perceptual-rate-control"},
       {IH264_RATECONTROL_PRC_LOW_DELAY, "Low delay rate control",
           "low-delay-rate-control"},
-      {IH264_RATECONTROL_DEFAULT, "Default rcAlgo (PRC)",
-          "default-rate-control"},
       {0, NULL, NULL},
     };
 
@@ -206,22 +174,22 @@ gst_ducati_h264enc_level_get_type (void)
 
   if (!type) {
     static const GEnumValue vals[] = {
-      {GST_DUCATI_H264ENC_LEVEL_10, "Level 1", "level-1"},
-      {GST_DUCATI_H264ENC_LEVEL_1b, "Level 1b", "level-1b"},
-      {GST_DUCATI_H264ENC_LEVEL_11, "Level 11", "level-11"},
-      {GST_DUCATI_H264ENC_LEVEL_12, "Level 12", "level-12"},
-      {GST_DUCATI_H264ENC_LEVEL_13, "Level 13", "level-13"},
-      {GST_DUCATI_H264ENC_LEVEL_20, "Level 2", "level-2"},
-      {GST_DUCATI_H264ENC_LEVEL_21, "Level 21", "level-21"},
-      {GST_DUCATI_H264ENC_LEVEL_22, "Level 22", "level-22"},
-      {GST_DUCATI_H264ENC_LEVEL_30, "Level 3", "level-3"},
-      {GST_DUCATI_H264ENC_LEVEL_31, "Level 31", "level-31"},
-      {GST_DUCATI_H264ENC_LEVEL_32, "Level 32", "level-32"},
-      {GST_DUCATI_H264ENC_LEVEL_40, "Level 4", "level-4"},
-      {GST_DUCATI_H264ENC_LEVEL_41, "Level 41", "level-41"},
-      {GST_DUCATI_H264ENC_LEVEL_42, "Level 42", "level-42"},
-      {GST_DUCATI_H264ENC_LEVEL_50, "Level 5", "level-5"},
-      {GST_DUCATI_H264ENC_LEVEL_51, "Level 51", "level-51"},
+      {IH264_LEVEL_10, "Level 1", "level-1"},
+      {IH264_LEVEL_1b, "Level 1b", "level-1b"},
+      {IH264_LEVEL_11, "Level 11", "level-11"},
+      {IH264_LEVEL_12, "Level 12", "level-12"},
+      {IH264_LEVEL_13, "Level 13", "level-13"},
+      {IH264_LEVEL_20, "Level 2", "level-2"},
+      {IH264_LEVEL_21, "Level 21", "level-21"},
+      {IH264_LEVEL_22, "Level 22", "level-22"},
+      {IH264_LEVEL_30, "Level 3", "level-3"},
+      {IH264_LEVEL_31, "Level 31", "level-31"},
+      {IH264_LEVEL_32, "Level 32", "level-32"},
+      {IH264_LEVEL_40, "Level 4", "level-4"},
+      {IH264_LEVEL_41, "Level 41", "level-41"},
+      {IH264_LEVEL_42, "Level 42", "level-42"},
+      {IH264_LEVEL_50, "Level 5", "level-5"},
+      {IH264_LEVEL_51, "Level 51", "level-51"},
       {0, NULL, NULL},
     };
 
@@ -239,7 +207,6 @@ gst_ducati_h264enc_get_entropy_coding_mode_type (void)
   if (!type) {
     static const GEnumValue vals[] = {
       {IH264_ENTROPYCODING_CAVLC, "CAVLC coding type", "cavlc"},
-      {IH264_ENTROPYCODING_DEFAULT, "Default coding type (cavlc)", "default"},
       {IH264_ENTROPYCODING_CABAC, "Cabac coding mode", "cabac"},
       {0, NULL, NULL},
     };
@@ -258,14 +225,12 @@ gst_ducati_h264enc_get_slice_mode_type (void)
   if (!type) {
     static const GEnumValue vals[] = {
       {IH264_SLICEMODE_NONE, "No slice mode", "none"},
-      {IH264_SLICEMODE_DEFAULT, "Default slice coding mode is MB based",
-          "default"},
       {IH264_SLICEMODE_MBUNIT,
           "Slices are controlled based upon number of Macroblocks", "mbunit"},
       {IH264_SLICEMODE_BYTES,
           "Slices are controlled based upon number of bytes", "bytes"},
       {IH264_SLICEMODE_OFFSET,
-            "Slices are controlled based upon user defined offset unit of Row",
+          "Slices are controlled based upon user defined offset unit of Row",
           "offset"},
       {0, NULL, NULL},
     };
@@ -309,6 +274,7 @@ gst_ducati_h264enc_class_init (GstDucatiH264EncClass * klass)
 
   videnc_class->allocate_params = gst_ducati_h264enc_allocate_params;
   videnc_class->configure = gst_ducati_h264enc_configure;
+  videnc_class->is_sync_point = gst_ducati_h264enc_is_sync_point;
 
   g_object_class_install_property (gobject_class, PROP_PROFILE,
       g_param_spec_enum ("profile", "H.264 Profile", "H.264 Profile",
@@ -318,13 +284,18 @@ gst_ducati_h264enc_class_init (GstDucatiH264EncClass * klass)
       g_param_spec_enum ("level", "H.264 Level", "H.264 Level",
           GST_TYPE_DUCATI_H264ENC_LEVEL, DEFAULT_LEVEL, G_PARAM_READWRITE));
 
+  g_object_class_install_property (gobject_class, PROP_INTER_INTERVAL,
+      g_param_spec_uint ("inter-interval", "Inter-frame interval",
+          "Max inter frame interval (B frames are allowed between them if > 1)",
+          1, 31, DEFAULT_INTER_INTERVAL, G_PARAM_READWRITE));
+
   g_object_class_install_property (gobject_class,
       PROP_RATE_CONTROL_PARAMS_PRESET,
       g_param_spec_enum ("rate-control-params-preset",
           "H.264 rate control params preset",
           "This preset controls the USER_DEFINED versus "
           "DEFAULT mode. If you are not aware about the "
-          "fields, it should be set as IH264_RATECONTROLPARAMS_DEFAULT",
+          "fields, it should be set as 'rate-control-params-preset-default'",
           GST_TYPE_DUCATI_H264ENC_RCPP, IH264_RATECONTROLPARAMS_DEFAULT,
           G_PARAM_READWRITE));
 
@@ -389,6 +360,7 @@ gst_ducati_h264enc_init (GstDucatiH264Enc * self, GstDucatiH264EncClass * klass)
   self->qp_min_i = DEFAULT_QP_MIN_I;
   self->qp_max_i = DEFAULT_QP_MAX_I;
   self->hrd_buffer_size = DEFAULT_HRD_BUFFER_SIZE;
+  self->inter_interval = DEFAULT_INTER_INTERVAL;
 }
 
 static void
@@ -453,6 +425,9 @@ gst_ducati_h264enc_set_property (GObject * object, guint prop_id,
     case PROP_SLICE_MODE:
       self->slice_mode = g_value_get_enum (value);
       break;
+    case PROP_INTER_INTERVAL:
+      self->inter_interval = g_value_get_uint (value);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
   }
@@ -498,6 +473,9 @@ gst_ducati_h264enc_get_property (GObject * object, guint prop_id,
     case PROP_SLICE_MODE:
       g_value_set_enum (value, self->slice_mode);
       break;
+    case PROP_INTER_INTERVAL:
+      g_value_set_uint (value, self->inter_interval);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
   }
@@ -507,17 +485,17 @@ static const char *
 get_profile_name (guint profile)
 {
   switch (profile) {
-    case GST_DUCATI_H264ENC_PROFILE_BASELINE:
+    case IH264_BASELINE_PROFILE:
       return "baseline";
-    case GST_DUCATI_H264ENC_PROFILE_MAIN:
+    case IH264_MAIN_PROFILE:
       return "main";
-    case GST_DUCATI_H264ENC_PROFILE_EXTENDED:
+    case IH264_EXTENDED_PROFILE:
       return "extended";
-    case GST_DUCATI_H264ENC_PROFILE_HIGH:
+    case IH264_HIGH_PROFILE:
       return "high";
-    case GST_DUCATI_H264ENC_PROFILE_HIGH_10:
+    case IH264_HIGH10_PROFILE:
       return "high-10";
-    case GST_DUCATI_H264ENC_PROFILE_HIGH_422:
+    case IH264_HIGH422_PROFILE:
       return "high-422";
     default:
       return NULL;
@@ -528,37 +506,37 @@ static const char *
 get_level_name (guint level)
 {
   switch (level) {
-    case GST_DUCATI_H264ENC_LEVEL_10:
+    case IH264_LEVEL_10:
       return "1";
-    case GST_DUCATI_H264ENC_LEVEL_1b:
+    case IH264_LEVEL_1b:
       return "1b";
-    case GST_DUCATI_H264ENC_LEVEL_11:
+    case IH264_LEVEL_11:
       return "1.1";
-    case GST_DUCATI_H264ENC_LEVEL_12:
+    case IH264_LEVEL_12:
       return "1.2";
-    case GST_DUCATI_H264ENC_LEVEL_13:
+    case IH264_LEVEL_13:
       return "1.3";
-    case GST_DUCATI_H264ENC_LEVEL_20:
+    case IH264_LEVEL_20:
       return "2";
-    case GST_DUCATI_H264ENC_LEVEL_21:
+    case IH264_LEVEL_21:
       return "2.1";
-    case GST_DUCATI_H264ENC_LEVEL_22:
+    case IH264_LEVEL_22:
       return "2.2";
-    case GST_DUCATI_H264ENC_LEVEL_30:
+    case IH264_LEVEL_30:
       return "3";
-    case GST_DUCATI_H264ENC_LEVEL_31:
+    case IH264_LEVEL_31:
       return "3.1";
-    case GST_DUCATI_H264ENC_LEVEL_32:
+    case IH264_LEVEL_32:
       return "3.2";
-    case GST_DUCATI_H264ENC_LEVEL_40:
+    case IH264_LEVEL_40:
       return "4";
-    case GST_DUCATI_H264ENC_LEVEL_41:
+    case IH264_LEVEL_41:
       return "4.1";
-    case GST_DUCATI_H264ENC_LEVEL_42:
+    case IH264_LEVEL_42:
       return "4.2";
-    case GST_DUCATI_H264ENC_LEVEL_50:
+    case IH264_LEVEL_50:
       return "5";
-    case GST_DUCATI_H264ENC_LEVEL_51:
+    case IH264_LEVEL_51:
       return "5.1";
     default:
       return NULL;
@@ -573,16 +551,30 @@ gst_ducati_h264enc_configure (GstDucatiVidEnc * videnc)
   IH264ENC_DynamicParams *dynParams;
   gboolean ret;
   const char *s;
+  const GstVideoState *state;
+  GstCaps *caps;
+  int inter_interval;
+
+  ret = GST_DUCATIVIDENC_CLASS (parent_class)->configure (videnc);
+  if (!ret)
+    return FALSE;
 
   videnc->params->profile = self->profile;
   videnc->params->level = self->level;
 
+  inter_interval = self->inter_interval;
+  if (self->profile == IH264_BASELINE_PROFILE)
+    inter_interval = 1;
+  else if (videnc->rate_preset == IVIDEO_LOW_DELAY)
+    inter_interval = 1;
+
   params = (IH264ENC_Params *) videnc->params;
   /* this is the only non-base field strictly required */
   params->maxIntraFrameInterval = 0x7fffffff;
   params->IDRFrameInterval = 1;
   params->numTemporalLayer = 1;
   params->entropyCodingMode = self->entropy_coding_mode;
+  videnc->params->maxInterFrameInterval = inter_interval;
 
   /* Dynamic params */
   dynParams = (IH264ENC_DynamicParams *) videnc->dynParams;
@@ -594,27 +586,24 @@ gst_ducati_h264enc_configure (GstDucatiVidEnc * videnc)
   dynParams->rateControlParams.qpMinI = self->qp_min_i;
   dynParams->rateControlParams.HRDBufferSize = self->hrd_buffer_size;
   dynParams->sliceCodingParams.sliceMode = self->slice_mode;
-
-  ret = GST_DUCATIVIDENC_CLASS (parent_class)->configure (videnc);
-  if (ret) {
-    const GstVideoState *state =
-        gst_base_video_encoder_get_state (GST_BASE_VIDEO_ENCODER (videnc));
-    GstCaps *caps = gst_caps_new_simple ("video/x-h264",
-        "width", G_TYPE_INT, videnc->rect.w,
-        "height", G_TYPE_INT, videnc->rect.h,
-        "framerate", GST_TYPE_FRACTION, state->fps_n, state->fps_d,
-        "pixel-aspect-ratio", GST_TYPE_FRACTION, state->par_n, state->par_d,
-        "stream-format", G_TYPE_STRING, "byte-stream",
-        "align", G_TYPE_STRING, "au",
-        NULL);
-    s = get_profile_name (self->profile);
-    if (s)
-      gst_caps_set_simple (caps, "profile", G_TYPE_STRING, s, NULL);
-    s = get_level_name (self->level);
-    if (s)
-      gst_caps_set_simple (caps, "level", G_TYPE_STRING, s, NULL);
-    ret = gst_pad_set_caps (GST_BASE_VIDEO_CODEC_SRC_PAD (self), caps);
-  }
+  videnc->dynParams->interFrameInterval = inter_interval;
+
+  state = gst_base_video_encoder_get_state (GST_BASE_VIDEO_ENCODER (videnc));
+  caps = gst_caps_new_simple ("video/x-h264",
+      "width", G_TYPE_INT, videnc->rect.w,
+      "height", G_TYPE_INT, videnc->rect.h,
+      "framerate", GST_TYPE_FRACTION, state->fps_n, state->fps_d,
+      "pixel-aspect-ratio", GST_TYPE_FRACTION, state->par_n, state->par_d,
+      "stream-format", G_TYPE_STRING, "byte-stream",
+      "align", G_TYPE_STRING, "au",
+      "num-reorder-frames", G_TYPE_INT, inter_interval - 1, NULL);
+  s = get_profile_name (self->profile);
+  if (s)
+    gst_caps_set_simple (caps, "profile", G_TYPE_STRING, s, NULL);
+  s = get_level_name (self->level);
+  if (s)
+    gst_caps_set_simple (caps, "level", G_TYPE_STRING, s, NULL);
+  ret = gst_pad_set_caps (GST_BASE_VIDEO_CODEC_SRC_PAD (self), caps);
 
   return ret;
 }
@@ -647,3 +636,9 @@ gst_ducati_h264enc_allocate_params (GstDucatiVidEnc *
 
   return ret;
 }
+
+static gboolean
+gst_ducati_h264enc_is_sync_point (GstDucatiVidEnc * enc, int type)
+{
+  return type == IVIDEO_IDR_FRAME;
+}