rtpv8depay: Add property for waiting until the next keyframe after packet loss
[platform/upstream/gst-plugins-good.git] / gst / rtp / gstrtpvp8depay.c
index 7c0d707..6da17e2 100644 (file)
@@ -33,6 +33,12 @@ GST_DEBUG_CATEGORY_STATIC (gst_rtp_vp8_depay_debug);
 #define GST_CAT_DEFAULT gst_rtp_vp8_depay_debug
 
 static void gst_rtp_vp8_depay_dispose (GObject * object);
+#ifdef TIZEN_FEATURE_GST_UPSTREAM
+static void gst_rtp_vp8_depay_get_property (GObject * object, guint prop_id,
+    GValue * value, GParamSpec * pspec);
+static void gst_rtp_vp8_depay_set_property (GObject * object, guint prop_id,
+    const GValue * value, GParamSpec * pspec);
+#endif
 static GstBuffer *gst_rtp_vp8_depay_process (GstRTPBaseDepayload * depayload,
     GstRTPBuffer * rtp);
 static GstStateChangeReturn gst_rtp_vp8_depay_change_state (GstElement *
@@ -57,11 +63,24 @@ GST_STATIC_PAD_TEMPLATE ("sink",
         "media = (string) \"video\","
         "encoding-name = (string) { \"VP8\", \"VP8-DRAFT-IETF-01\" }"));
 
+#ifdef TIZEN_FEATURE_GST_UPSTREAM
+#define DEFAULT_WAIT_FOR_KEYFRAME FALSE
+
+enum
+{
+  PROP_0,
+  PROP_WAIT_FOR_KEYFRAME
+};
+#endif
+
 static void
 gst_rtp_vp8_depay_init (GstRtpVP8Depay * self)
 {
   self->adapter = gst_adapter_new ();
   self->started = FALSE;
+#ifdef TIZEN_FEATURE_GST_UPSTREAM
+  self->wait_for_keyframe = DEFAULT_WAIT_FOR_KEYFRAME;
+#endif
 }
 
 static void
@@ -84,7 +103,16 @@ gst_rtp_vp8_depay_class_init (GstRtpVP8DepayClass * gst_rtp_vp8_depay_class)
       "Sjoerd Simons <sjoerd@luon.net>");
 
   object_class->dispose = gst_rtp_vp8_depay_dispose;
-
+#ifdef TIZEN_FEATURE_GST_UPSTREAM
+  object_class->set_property = gst_rtp_vp8_depay_set_property;
+  object_class->get_property = gst_rtp_vp8_depay_get_property;
+
+  g_object_class_install_property (object_class, PROP_WAIT_FOR_KEYFRAME,
+      g_param_spec_boolean ("wait-for-keyframe", "Wait for Keyframe",
+          "Wait for the next keyframe after packet loss",
+          DEFAULT_WAIT_FOR_KEYFRAME,
+          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+#endif
   element_class->change_state = gst_rtp_vp8_depay_change_state;
 
   depay_class->process_rtp_packet = gst_rtp_vp8_depay_process;
@@ -109,6 +137,40 @@ gst_rtp_vp8_depay_dispose (GObject * object)
     G_OBJECT_CLASS (gst_rtp_vp8_depay_parent_class)->dispose (object);
 }
 
+#ifdef TIZEN_FEATURE_GST_UPSTREAM
+static void
+gst_rtp_vp8_depay_set_property (GObject * object, guint prop_id,
+    const GValue * value, GParamSpec * pspec)
+{
+  GstRtpVP8Depay *self = GST_RTP_VP8_DEPAY (object);
+
+  switch (prop_id) {
+    case PROP_WAIT_FOR_KEYFRAME:
+      self->wait_for_keyframe = g_value_get_boolean (value);
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+  }
+}
+
+static void
+gst_rtp_vp8_depay_get_property (GObject * object, guint prop_id,
+    GValue * value, GParamSpec * pspec)
+{
+  GstRtpVP8Depay *self = GST_RTP_VP8_DEPAY (object);
+
+  switch (prop_id) {
+    case PROP_WAIT_FOR_KEYFRAME:
+      g_value_set_boolean (value, self->wait_for_keyframe);
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+  }
+}
+#endif
+
 static GstBuffer *
 gst_rtp_vp8_depay_process (GstRTPBaseDepayload * depay, GstRTPBuffer * rtp)
 {
@@ -122,6 +184,10 @@ gst_rtp_vp8_depay_process (GstRTPBaseDepayload * depay, GstRTPBuffer * rtp)
     GST_LOG_OBJECT (self, "Discontinuity, flushing adapter");
     gst_adapter_clear (self->adapter);
     self->started = FALSE;
+#ifdef TIZEN_FEATURE_GST_UPSTREAM
+    if (self->wait_for_keyframe)
+      self->waiting_for_keyframe = TRUE;
+#endif
   }
 
   size = gst_rtp_buffer_get_payload_len (rtp);
@@ -190,7 +256,11 @@ gst_rtp_vp8_depay_process (GstRTPBaseDepayload * depay, GstRTPBuffer * rtp)
     if ((header[0] & 0x01)) {
       GST_BUFFER_FLAG_SET (out, GST_BUFFER_FLAG_DELTA_UNIT);
 
+#ifdef TIZEN_FEATURE_GST_UPSTREAM
+      if (self->waiting_for_keyframe) {
+#else
       if (!self->caps_sent) {
+#endif
         gst_buffer_unref (out);
         out = NULL;
         GST_INFO_OBJECT (self, "Dropping inter-frame before intra-frame");
@@ -221,12 +291,16 @@ gst_rtp_vp8_depay_process (GstRTPBaseDepayload * depay, GstRTPBuffer * rtp)
 
         gst_pad_set_caps (GST_RTP_BASE_DEPAYLOAD_SRCPAD (depay), srccaps);
         gst_caps_unref (srccaps);
-
+#ifndef TIZEN_FEATURE_GST_UPSTREAM
         self->caps_sent = TRUE;
+#endif
         self->last_width = width;
         self->last_height = height;
         self->last_profile = profile;
       }
+#ifdef TIZEN_FEATURE_GST_UPSTREAM
+      self->waiting_for_keyframe = FALSE;
+#endif
     }
 
     return out;
@@ -253,7 +327,11 @@ gst_rtp_vp8_depay_change_state (GstElement * element, GstStateChange transition)
       self->last_profile = -1;
       self->last_height = -1;
       self->last_width = -1;
+#ifdef TIZEN_FEATURE_GST_UPSTREAM
+      self->waiting_for_keyframe = TRUE;
+#else
       self->caps_sent = FALSE;
+#endif
       break;
     default:
       break;