rtpvp8pay: Make Picture ID mode configurable and default to no picture ID
authorSebastian Dröge <sebastian@centricular.com>
Tue, 5 Nov 2013 16:26:49 +0000 (17:26 +0100)
committerSebastian Dröge <sebastian@centricular.com>
Tue, 5 Nov 2013 16:26:49 +0000 (17:26 +0100)
Some implementations (linphone) only support no picture at all in the
stream and will fail if one is provided.

https://bugzilla.gnome.org/show_bug.cgi?id=711497

gst/rtp/gstrtpvp8pay.c

index 988d55d..021f2e4 100644 (file)
 GST_DEBUG_CATEGORY_STATIC (gst_rtp_vp8_pay_debug);
 #define GST_CAT_DEFAULT gst_rtp_vp8_pay_debug
 
-#define DEFAULT_PICTURE_ID_MODE VP8_PAY_PICTURE_ID_7BITS
+#define DEFAULT_PICTURE_ID_MODE VP8_PAY_NO_PICTURE_ID
+
+enum
+{
+  PROP_0,
+  PROP_PICTURE_ID_MODE
+};
+
+#define GST_TYPE_RTP_VP8_PAY_PICTURE_ID_MODE (gst_rtp_vp8_pay_picture_id_mode_get_type())
+static GType
+gst_rtp_vp8_pay_picture_id_mode_get_type (void)
+{
+  static GType mode_type = 0;
+  static const GEnumValue modes[] = {
+    {VP8_PAY_NO_PICTURE_ID, "No Picture ID", "none"},
+    {VP8_PAY_PICTURE_ID_7BITS, "7-bit Picture ID", "7-bit"},
+    {VP8_PAY_PICTURE_ID_15BITS, "15-bit Picture ID", "15-bit"},
+    {0, NULL, NULL},
+  };
+
+  if (!mode_type) {
+    mode_type = g_enum_register_static ("GstVP8RTPPayMode", modes);
+  }
+  return mode_type;
+}
+
+static void gst_rtp_vp8_pay_get_property (GObject * object, guint prop_id,
+    GValue * value, GParamSpec * pspec);
+static void gst_rtp_vp8_pay_set_property (GObject * object, guint prop_id,
+    const GValue * value, GParamSpec * pspec);
 
 static GstFlowReturn gst_rtp_vp8_pay_handle_buffer (GstRTPBasePayload * payload,
     GstBuffer * buffer);
@@ -64,7 +93,6 @@ GST_STATIC_PAD_TEMPLATE ("sink",
 static void
 gst_rtp_vp8_pay_init (GstRtpVP8Pay * obj)
 {
-  /* TODO: Make it configurable */
   obj->picture_id_mode = DEFAULT_PICTURE_ID_MODE;
   if (obj->picture_id_mode == VP8_PAY_PICTURE_ID_7BITS)
     obj->picture_id = g_random_int_range (0, G_MAXUINT8) & 0x7F;
@@ -75,10 +103,20 @@ gst_rtp_vp8_pay_init (GstRtpVP8Pay * obj)
 static void
 gst_rtp_vp8_pay_class_init (GstRtpVP8PayClass * gst_rtp_vp8_pay_class)
 {
+  GObjectClass *gobject_class = G_OBJECT_CLASS (gst_rtp_vp8_pay_class);
   GstElementClass *element_class = GST_ELEMENT_CLASS (gst_rtp_vp8_pay_class);
   GstRTPBasePayloadClass *pay_class =
       GST_RTP_BASE_PAYLOAD_CLASS (gst_rtp_vp8_pay_class);
 
+  gobject_class->set_property = gst_rtp_vp8_pay_set_property;
+  gobject_class->get_property = gst_rtp_vp8_pay_get_property;
+
+  g_object_class_install_property (gobject_class, PROP_PICTURE_ID_MODE,
+      g_param_spec_enum ("picture-id-mode", "Picture ID Mode",
+          "The picture ID mode for payloading",
+          GST_TYPE_RTP_VP8_PAY_PICTURE_ID_MODE, DEFAULT_PICTURE_ID_MODE,
+          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
   gst_element_class_add_pad_template (element_class,
       gst_static_pad_template_get (&gst_rtp_vp8_pay_sink_template));
   gst_element_class_add_pad_template (element_class,
@@ -96,6 +134,42 @@ gst_rtp_vp8_pay_class_init (GstRtpVP8PayClass * gst_rtp_vp8_pay_class)
       "VP8 Video RTP Payloader");
 }
 
+static void
+gst_rtp_vp8_pay_set_property (GObject * object,
+    guint prop_id, const GValue * value, GParamSpec * pspec)
+{
+  GstRtpVP8Pay *rtpvp8pay = GST_RTP_VP8_PAY (object);
+
+  switch (prop_id) {
+    case PROP_PICTURE_ID_MODE:
+      rtpvp8pay->picture_id_mode = g_value_get_enum (value);
+      if (rtpvp8pay->picture_id_mode == VP8_PAY_PICTURE_ID_7BITS)
+        rtpvp8pay->picture_id = g_random_int_range (0, G_MAXUINT8) & 0x7F;
+      else if (rtpvp8pay->picture_id_mode == VP8_PAY_PICTURE_ID_15BITS)
+        rtpvp8pay->picture_id = g_random_int_range (0, G_MAXUINT16) & 0x7FFF;
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+  }
+}
+
+static void
+gst_rtp_vp8_pay_get_property (GObject * object,
+    guint prop_id, GValue * value, GParamSpec * pspec)
+{
+  GstRtpVP8Pay *rtpvp8pay = GST_RTP_VP8_PAY (object);
+
+  switch (prop_id) {
+    case PROP_PICTURE_ID_MODE:
+      g_value_set_enum (value, rtpvp8pay->picture_id_mode);
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+  }
+}
+
 static gboolean
 gst_rtp_vp8_pay_parse_frame (GstRtpVP8Pay * self, GstBuffer * buffer)
 {