#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 *
"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
"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;
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)
{
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);
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");
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;
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;