Merge tizen patch based on 1.12.2
[platform/upstream/gstreamer.git] / omx / gstomxh264enc.c
old mode 100644 (file)
new mode 100755 (executable)
index aa33ae5..b055b3c
@@ -54,6 +54,10 @@ enum
 #ifdef USE_OMX_TARGET_RPI
   PROP_INLINESPSPPSHEADERS,
 #endif
+#if defined(USE_OMX_TARGET_EXYNOS) || defined(USE_OMX_TARGET_EXYNOS64)
+  PROP_NUM_REF_FRAME,
+  PROP_NUM_B_FRAME,
+#endif
   PROP_PERIODICITYOFIDRFRAMES,
   PROP_INTERVALOFCODINGINTRAFRAMES
 };
@@ -61,6 +65,12 @@ enum
 #ifdef USE_OMX_TARGET_RPI
 #define GST_OMX_H264_VIDEO_ENC_INLINE_SPS_PPS_HEADERS_DEFAULT      TRUE
 #endif
+#if defined(USE_OMX_TARGET_EXYNOS) || defined(USE_OMX_TARGET_EXYNOS64)
+#define GST_OMX_VIDEO_ENC_NUM_REF_FRAME_DEFAULT (0x00000001)
+#define GST_OMX_VIDEO_ENC_NUM_REF_FRAME_MAX (0x00000002)
+#define GST_OMX_VIDEO_ENC_NUM_B_FRAME_DEFAULT (0x00000001)
+#define GST_OMX_VIDEO_ENC_NUM_B_FRAME_MAX (0x00000002)
+#endif
 #define GST_OMX_H264_VIDEO_ENC_PERIODICITY_OF_IDR_FRAMES_DEFAULT    (0xffffffff)
 #define GST_OMX_H264_VIDEO_ENC_INTERVAL_OF_CODING_INTRA_FRAMES_DEFAULT (0xffffffff)
 
@@ -98,7 +108,23 @@ gst_omx_h264_enc_class_init (GstOMXH264EncClass * klass)
           G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS |
           GST_PARAM_MUTABLE_READY));
 #endif
+#if defined(USE_OMX_TARGET_EXYNOS) || defined(USE_OMX_TARGET_EXYNOS64)
+  g_object_class_install_property (gobject_class, PROP_NUM_REF_FRAME,
+      g_param_spec_uint ("reference-frame", "set number of reference frame",
+          "The number of reference frame (0x00000001=component default)",
+          GST_OMX_VIDEO_ENC_NUM_REF_FRAME_DEFAULT, GST_OMX_VIDEO_ENC_NUM_REF_FRAME_MAX,
+          GST_OMX_VIDEO_ENC_NUM_REF_FRAME_DEFAULT,
+          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS |
+          GST_PARAM_MUTABLE_READY));
 
+  g_object_class_install_property (gobject_class, PROP_NUM_B_FRAME,
+      g_param_spec_uint ("b-frame", "set number of b frame",
+          "The number of reference frame (0x00000001=component default)",
+          GST_OMX_VIDEO_ENC_NUM_B_FRAME_DEFAULT, GST_OMX_VIDEO_ENC_NUM_B_FRAME_MAX,
+          GST_OMX_VIDEO_ENC_NUM_B_FRAME_DEFAULT,
+          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS |
+          GST_PARAM_MUTABLE_READY));
+#endif
   g_object_class_install_property (gobject_class, PROP_PERIODICITYOFIDRFRAMES,
       g_param_spec_uint ("periodicty-idr", "Target Bitrate",
           "Periodicity of IDR frames (0xffffffff=component default)",
@@ -146,6 +172,14 @@ gst_omx_h264_enc_set_property (GObject * object, guint prop_id,
       self->inline_sps_pps_headers = g_value_get_boolean (value);
       break;
 #endif
+#if defined(USE_OMX_TARGET_EXYNOS) || defined(USE_OMX_TARGET_EXYNOS64)
+    case PROP_NUM_REF_FRAME:
+      self->reference_frame = g_value_get_int (value);
+      break;
+    case PROP_NUM_B_FRAME:
+      self->b_frame = g_value_get_int (value);
+      break;
+#endif
     case PROP_PERIODICITYOFIDRFRAMES:
       self->periodicty_idr = g_value_get_uint (value);
       break;
@@ -170,6 +204,14 @@ gst_omx_h264_enc_get_property (GObject * object, guint prop_id, GValue * value,
       g_value_set_boolean (value, self->inline_sps_pps_headers);
       break;
 #endif
+#if defined(USE_OMX_TARGET_EXYNOS) || defined(USE_OMX_TARGET_EXYNOS64)
+    case PROP_NUM_REF_FRAME:
+      g_value_set_uint (value, self->reference_frame);
+      break;
+    case PROP_NUM_B_FRAME:
+      g_value_set_uint (value, self->b_frame);
+      break;
+#endif
     case PROP_PERIODICITYOFIDRFRAMES:
       g_value_set_uint (value, self->periodicty_idr);
       break;
@@ -189,6 +231,9 @@ gst_omx_h264_enc_init (GstOMXH264Enc * self)
   self->inline_sps_pps_headers =
       GST_OMX_H264_VIDEO_ENC_INLINE_SPS_PPS_HEADERS_DEFAULT;
 #endif
+#if defined(USE_OMX_TARGET_EXYNOS) || defined(USE_OMX_TARGET_EXYNOS64)
+  self->reference_frame = GST_OMX_VIDEO_ENC_NUM_REF_FRAME_DEFAULT;
+#endif
   self->periodicty_idr =
       GST_OMX_H264_VIDEO_ENC_PERIODICITY_OF_IDR_FRAMES_DEFAULT;
   self->interval_intraframes =
@@ -229,6 +274,9 @@ gst_omx_h264_enc_set_format (GstOMXVideoEnc * enc, GstOMXPort * port,
 #ifdef USE_OMX_TARGET_RPI
   OMX_CONFIG_PORTBOOLEANTYPE config_inline_header;
 #endif
+#if defined(USE_OMX_TARGET_EXYNOS) || defined(USE_OMX_TARGET_EXYNOS64)
+  OMX_VIDEO_PARAM_AVCTYPE avc_param;
+#endif
   OMX_ERRORTYPE err;
   const gchar *profile_string, *level_string;
 
@@ -262,6 +310,36 @@ gst_omx_h264_enc_set_format (GstOMXVideoEnc * enc, GstOMXPort * port,
     return FALSE;
   }
 #endif
+#if defined(USE_OMX_TARGET_EXYNOS) || defined(USE_OMX_TARGET_EXYNOS64)
+  GST_OMX_INIT_STRUCT (&avc_param);
+
+  err =
+      gst_omx_component_get_parameter (GST_OMX_VIDEO_ENC (self)->enc,
+      OMX_IndexParamVideoAvc, &avc_param);
+  if (err != OMX_ErrorNone) {
+    GST_ERROR_OBJECT (self,
+        "can't get OMX_IndexParamVideoAvc %s (0x%08x)",
+        gst_omx_error_to_string (err), err);
+    return FALSE;
+  }
+
+  GST_DEBUG_OBJECT (self, "default nRefFrames:%u, nBFrames:%u",
+      (guint) avc_param.nRefFrames,
+      (guint) avc_param.nBFrames);
+
+  avc_param.nRefFrames = self->reference_frame;
+  avc_param.nBFrames = self->b_frame;
+  err =
+      gst_omx_component_set_parameter (GST_OMX_VIDEO_ENC (self)->enc,
+      OMX_IndexParamVideoAvc, &avc_param);
+  if (err != OMX_ErrorNone) {
+    GST_ERROR_OBJECT (self,
+        "can't set OMX_IndexParamVideoAvc %s (0x%08x)",
+        gst_omx_error_to_string (err), err);
+    return FALSE;
+  }
+
+#endif
 
   if (self->periodicty_idr !=
       GST_OMX_H264_VIDEO_ENC_PERIODICITY_OF_IDR_FRAMES_DEFAULT