From: <wt...@ke...> - 2006-07-12 09:34:28
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Wed Jul 12 2006 09:34:27 UTC Log message: * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: (plugin_init): * gst/rtp/gstrtpmp2tdepay.c: (gst_rtp_mp2t_depay_base_init), (gst_rtp_mp2t_depay_class_init), (gst_rtp_mp2t_depay_init), (gst_rtp_mp2t_depay_setcaps), (gst_rtp_mp2t_depay_process), (gst_rtp_mp2t_depay_set_property), (gst_rtp_mp2t_depay_get_property), (gst_rtp_mp2t_depay_change_state), (gst_rtp_mp2t_depay_plugin_init): * gst/rtp/gstrtpmp2tdepay.h: Added mpeg2 TS depayloader. Closing #347234. Modified files: . : ChangeLog gst/rtp : Makefile.am gstrtp.c Added files: gst/rtp : gstrtpmp2tdepay.c gstrtpmp2tdepay.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2430&r2=1.2431 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/Makefile.am.diff?r1=1.25&r2=1.26 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtp.c.diff?r1=1.23&r2=1.24 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp2tdepay.c?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp2tdepay.h?rev=1.1&content-type=text/vnd.viewcvs-markup ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2430 retrieving revision 1.2431 diff -u -d -r1.2430 -r1.2431 --- ChangeLog 11 Jul 2006 22:46:47 -0000 1.2430 +++ ChangeLog 12 Jul 2006 09:34:15 -0000 1.2431 @@ -1,3 +1,17 @@ +2006-07-12 Wim Taymans <wi...@fl...> + + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: (plugin_init): + * gst/rtp/gstrtpmp2tdepay.c: (gst_rtp_mp2t_depay_base_init), + (gst_rtp_mp2t_depay_class_init), (gst_rtp_mp2t_depay_init), + (gst_rtp_mp2t_depay_setcaps), (gst_rtp_mp2t_depay_process), + (gst_rtp_mp2t_depay_set_property), + (gst_rtp_mp2t_depay_get_property), + (gst_rtp_mp2t_depay_change_state), + (gst_rtp_mp2t_depay_plugin_init): + * gst/rtp/gstrtpmp2tdepay.h: + Added mpeg2 TS depayloader. Closing #347234. 2006-07-11 Tim-Philipp Müller <tim at centricular dot net> * ext/cdio/gstcdiocddasrc.c: (gst_cdio_cdda_src_close): Index: Makefile.am RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/Makefile.am,v retrieving revision 1.25 retrieving revision 1.26 diff -u -d -r1.25 -r1.26 --- Makefile.am 13 Apr 2006 09:15:31 -0000 1.25 +++ Makefile.am 12 Jul 2006 09:34:15 -0000 1.26 @@ -17,6 +17,7 @@ gstrtph263ppay.c \ gstrtph263pay.c \ gstasteriskh263.c \ + gstrtpmp2tdepay.c \ gstrtpmp4vdepay.c \ gstrtpmp4vpay.c \ gstrtpmp4gpay.c \ @@ -52,6 +53,7 @@ gstrtph263pdepay.h \ gstrtph263ppay.h \ gstrtph263pay.h \ + gstrtpmp2tdepay.h \ gstrtpmp4vdepay.h \ gstrtpmp4vpay.h \ gstrtpmp4gpay.h \ Index: gstrtp.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtp.c,v retrieving revision 1.23 retrieving revision 1.24 diff -u -d -r1.23 -r1.24 --- gstrtp.c 13 Apr 2006 09:15:31 -0000 1.23 +++ gstrtp.c 12 Jul 2006 09:34:15 -0000 1.24 @@ -36,6 +36,7 @@ #include "gstrtph263ppay.h" #include "gstrtph263pay.h" #include "gstasteriskh263.h" +#include "gstrtpmp2tdepay.h" #include "gstrtpmp4vpay.h" #include "gstrtpmp4gpay.h" #include "gstrtpmp4vdepay.h" @@ -90,6 +91,9 @@ if (!gst_asteriskh263_plugin_init (plugin)) return FALSE; + if (!gst_rtp_mp2t_depay_plugin_init (plugin)) + return FALSE; if (!gst_rtp_mp4v_pay_plugin_init (plugin)) --- NEW FILE: gstrtpmp2tdepay.c --- /* GStreamer * Copyright (C) <2005> Wim Taymans <wi...@fl...> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include <gst/rtp/gstrtpbuffer.h> #include <string.h> #include "gstrtpmp2tdepay.h" /* elementfactory information */ static const GstElementDetails gst_rtp_mp2tdepay_details = GST_ELEMENT_DETAILS ("RTP packet parser", "Codec/Depay/Network", "Extracts MPEG2 TS from RTP packets (RFC 2250)", "Wim Taymans <wi...@fl...>"); /* RtpMP2TDepay signals and args */ enum { /* FILL ME */ LAST_SIGNAL }; ARG_0, ARG_FREQUENCY static GstStaticPadTemplate gst_rtp_mp2t_depay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/mpegts," "packetsize=(int)188," "systemstream=(boolean)true") ); static GstStaticPadTemplate gst_rtp_mp2t_depay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"video\", " "clock-rate = (int) [1, MAX ], " "encoding-name = (string) \"MP2T-ES\"" /* All optional parameters * * "profile-level-id=[1,MAX]" * "config=" */ ) GST_BOILERPLATE (GstRtpMP2TDepay, gst_rtp_mp2t_depay, GstBaseRTPDepayload, GST_TYPE_BASE_RTP_DEPAYLOAD); static gboolean gst_rtp_mp2t_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps); static GstBuffer *gst_rtp_mp2t_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf); static void gst_rtp_mp2t_depay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_rtp_mp2t_depay_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static GstStateChangeReturn gst_rtp_mp2t_depay_change_state (GstElement * element, GstStateChange transition); static void gst_rtp_mp2t_depay_base_init (gpointer klass) GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&gst_rtp_mp2t_depay_src_template)); gst_static_pad_template_get (&gst_rtp_mp2t_depay_sink_template)); gst_element_class_set_details (element_class, &gst_rtp_mp2tdepay_details); } gst_rtp_mp2t_depay_class_init (GstRtpMP2TDepayClass * klass) GObjectClass *gobject_class; GstElementClass *gstelement_class; GstBaseRTPDepayloadClass *gstbasertpdepayload_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; parent_class = g_type_class_peek_parent (klass); gstbasertpdepayload_class->process = gst_rtp_mp2t_depay_process; gstbasertpdepayload_class->set_caps = gst_rtp_mp2t_depay_setcaps; gobject_class->set_property = gst_rtp_mp2t_depay_set_property; gobject_class->get_property = gst_rtp_mp2t_depay_get_property; gstelement_class->change_state = gst_rtp_mp2t_depay_change_state; gst_rtp_mp2t_depay_init (GstRtpMP2TDepay * rtpmp2tdepay, GstRtpMP2TDepayClass * klass) static gboolean gst_rtp_mp2t_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) GstStructure *structure; GstRtpMP2TDepay *rtpmp2tdepay; GstCaps *srccaps; gint clock_rate = 90000; /* default */ rtpmp2tdepay = GST_RTP_MP2T_DEPAY (depayload); structure = gst_caps_get_structure (caps, 0); if (gst_structure_has_field (structure, "clock-rate")) { gst_structure_get_int (structure, "clock-rate", &clock_rate); } depayload->clock_rate = clock_rate; srccaps = gst_caps_new_simple ("video/mpegts", "systemstream", G_TYPE_BOOLEAN, TRUE, "packetsize", G_TYPE_INT, 188, NULL); return TRUE; static GstBuffer * gst_rtp_mp2t_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) GstBuffer *outbuf; gint payload_len; guint8 *payload; guint32 timestamp; if (!gst_rtp_buffer_validate (buf)) goto bad_packet; payload_len = gst_rtp_buffer_get_payload_len (buf); payload = gst_rtp_buffer_get_payload (buf); timestamp = gst_rtp_buffer_get_timestamp (buf); outbuf = gst_buffer_new_and_alloc (payload_len); memcpy (GST_BUFFER_DATA (outbuf), payload, payload_len); gst_buffer_set_caps (outbuf, GST_PAD_CAPS (depayload->srcpad)); GST_BUFFER_TIMESTAMP (outbuf) = gst_util_uint64_scale_int (timestamp, GST_SECOND, depayload->clock_rate); GST_DEBUG ("gst_rtp_mp2t_depay_chain: pushing buffer of size %d", GST_BUFFER_SIZE (outbuf)); return outbuf; bad_packet: { GST_ELEMENT_WARNING (rtpmp2tdepay, STREAM, DECODE, ("Packet did not validate"), (NULL)); return NULL; gst_rtp_mp2t_depay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) rtpmp2tdepay = GST_RTP_MP2T_DEPAY (object); switch (prop_id) { default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; gst_rtp_mp2t_depay_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) static GstStateChangeReturn gst_rtp_mp2t_depay_change_state (GstElement * element, GstStateChange transition) GstStateChangeReturn ret; rtpmp2tdepay = GST_RTP_MP2T_DEPAY (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: case GST_STATE_CHANGE_READY_TO_PAUSED: ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); case GST_STATE_CHANGE_READY_TO_NULL: return ret; gboolean gst_rtp_mp2t_depay_plugin_init (GstPlugin * plugin) return gst_element_register (plugin, "rtpmp2tdepay", GST_RANK_NONE, GST_TYPE_RTP_MP2T_DEPAY); --- NEW FILE: gstrtpmp2tdepay.h --- * Copyright (C) <2006> Wim Taymans <wi...@fl...> #ifndef __GST_RTP_MP2T_DEPAY_H__ #define __GST_RTP_MP2T_DEPAY_H__ #include <gst/gst.h> #include <gst/base/gstadapter.h> #include <gst/rtp/gstbasertpdepayload.h> G_BEGIN_DECLS #define GST_TYPE_RTP_MP2T_DEPAY \ (gst_rtp_mp2t_depay_get_type()) #define GST_RTP_MP2T_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_MP2T_DEPAY,GstRtpMP2TDepay)) #define GST_RTP_MP2T_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_MP2T_DEPAY,GstRtpMP2TDepayClass)) #define GST_IS_RTP_MP2T_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_MP2T_DEPAY)) #define GST_IS_RTP_MP2T_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_MP2T_DEPAY)) typedef struct _GstRtpMP2TDepay GstRtpMP2TDepay; typedef struct _GstRtpMP2TDepayClass GstRtpMP2TDepayClass; struct _GstRtpMP2TDepay GstBaseRTPDepayload depayload; struct _GstRtpMP2TDepayClass GstBaseRTPDepayloadClass parent_class; gboolean gst_rtp_mp2t_depay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_MP2T_DEPAY_H__ */ |
From: <wt...@ke...> - 2006-07-19 16:29:16
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Sun Jul 16 2006 14:32:01 UTC Log message: * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: (plugin_init): * gst/rtp/gstrtpmp4gdepay.c: (gst_rtp_mp4g_depay_base_init), (gst_rtp_mp4g_depay_class_init), (gst_rtp_mp4g_depay_init), (gst_rtp_mp4g_depay_setcaps), (gst_rtp_mp4g_depay_process), (gst_rtp_mp4g_depay_set_property), (gst_rtp_mp4g_depay_get_property), (gst_rtp_mp4g_depay_change_state), (gst_rtp_mp4g_depay_plugin_init): * gst/rtp/gstrtpmp4gdepay.h: * gst/rtp/gstrtpmp4gpay.c: (gst_rtp_mp4g_pay_class_init), (gst_rtp_mp4g_pay_parse_audio_config), (gst_rtp_mp4g_pay_setcaps), (gst_rtp_mp4g_pay_flush): Added simple generic mpeg4 depayloader. Fix generic mpeg4 payloader. Modified files: . : ChangeLog gst/rtp : Makefile.am gstrtp.c gstrtpmp4gpay.c Added files: gst/rtp : gstrtpmp4gdepay.c gstrtpmp4gdepay.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2434&r2=1.2435 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/Makefile.am.diff?r1=1.26&r2=1.27 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtp.c.diff?r1=1.24&r2=1.25 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gdepay.c?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gdepay.h?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gpay.c.diff?r1=1.8&r2=1.9 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2434 retrieving revision 1.2435 diff -u -d -r1.2434 -r1.2435 --- ChangeLog 15 Jul 2006 15:25:05 -0000 1.2434 +++ ChangeLog 16 Jul 2006 14:31:48 -0000 1.2435 @@ -1,3 +1,21 @@ +2006-07-16 Wim Taymans <wi...@fl...> + + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: (plugin_init): + * gst/rtp/gstrtpmp4gdepay.c: (gst_rtp_mp4g_depay_base_init), + (gst_rtp_mp4g_depay_class_init), (gst_rtp_mp4g_depay_init), + (gst_rtp_mp4g_depay_setcaps), (gst_rtp_mp4g_depay_process), + (gst_rtp_mp4g_depay_set_property), + (gst_rtp_mp4g_depay_get_property), + (gst_rtp_mp4g_depay_change_state), + (gst_rtp_mp4g_depay_plugin_init): + * gst/rtp/gstrtpmp4gdepay.h: + * gst/rtp/gstrtpmp4gpay.c: (gst_rtp_mp4g_pay_class_init), + (gst_rtp_mp4g_pay_parse_audio_config), (gst_rtp_mp4g_pay_setcaps), + (gst_rtp_mp4g_pay_flush): + Added simple generic mpeg4 depayloader. + Fix generic mpeg4 payloader. 2006-07-15 Tim-Philipp Müller <tim at centricular dot net> * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_set_state): Index: Makefile.am RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/Makefile.am,v retrieving revision 1.26 retrieving revision 1.27 diff -u -d -r1.26 -r1.27 --- Makefile.am 12 Jul 2006 09:34:15 -0000 1.26 +++ Makefile.am 16 Jul 2006 14:31:48 -0000 1.27 @@ -20,6 +20,7 @@ gstrtpmp2tdepay.c \ gstrtpmp4vdepay.c \ gstrtpmp4vpay.c \ + gstrtpmp4gdepay.c \ gstrtpmp4gpay.c \ gstrtpspeexdepay.c \ gstrtpspeexpay.c @@ -56,6 +57,7 @@ gstrtpmp2tdepay.h \ gstrtpmp4vdepay.h \ gstrtpmp4vpay.h \ + gstrtpmp4gdepay.h \ gstrtpmp4gpay.h \ gstrtpdepay.h \ gstasteriskh263.h \ Index: gstrtp.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtp.c,v retrieving revision 1.24 retrieving revision 1.25 diff -u -d -r1.24 -r1.25 --- gstrtp.c 12 Jul 2006 09:34:15 -0000 1.24 +++ gstrtp.c 16 Jul 2006 14:31:48 -0000 1.25 @@ -37,9 +37,10 @@ #include "gstrtph263pay.h" #include "gstasteriskh263.h" #include "gstrtpmp2tdepay.h" +#include "gstrtpmp4vdepay.h" #include "gstrtpmp4vpay.h" +#include "gstrtpmp4gdepay.h" #include "gstrtpmp4gpay.h" -#include "gstrtpmp4vdepay.h" #include "gstrtpspeexpay.h" #include "gstrtpspeexdepay.h" @@ -100,6 +101,9 @@ if (!gst_rtp_mp4v_depay_plugin_init (plugin)) return FALSE; + if (!gst_rtp_mp4g_depay_plugin_init (plugin)) + return FALSE; if (!gst_rtp_mp4g_pay_plugin_init (plugin)) --- NEW FILE: gstrtpmp4gdepay.c --- /* GStreamer * Copyright (C) <2005> Wim Taymans <wi...@fl...> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include <gst/rtp/gstrtpbuffer.h> #include <string.h> #include "gstrtpmp4gdepay.h" GST_DEBUG_CATEGORY_STATIC (rtpmp4gdepay_debug); #define GST_CAT_DEFAULT (rtpmp4gdepay_debug) /* elementfactory information */ static const GstElementDetails gst_rtp_mp4gdepay_details = GST_ELEMENT_DETAILS ("RTP packet parser", "Codec/Depay/Network", "Extracts MPEG4 elementary streams from RTP packets (RFC 3640)", "Wim Taymans <wi...@fl...>"); /* RtpMP4GDepay signals and args */ enum { /* FILL ME */ LAST_SIGNAL }; ARG_0, ARG_FREQUENCY static GstStaticPadTemplate gst_rtp_mp4g_depay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/mpeg," "mpegversion=(int) 4," "systemstream=(boolean)false;" "audio/mpeg," "mpegversion=(int) 4") ); static GstStaticPadTemplate gst_rtp_mp4g_depay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) { \"video\", \"audio\", \"application\" }, " "payload = (int) [ 96, 127 ], " "clock-rate = (int) [1, MAX ], " "encoding-name = (string) \"mpeg4-generic\", " /* required string params */ "streamtype = (int) { \"4\", \"5\" }, " /* 4 = video, 5 = audio */ "profile-level-id = (int) [1,MAX], " /* "config = (string) [1,MAX]" */ "mode = (string) { \"generic\", \"CELP-cbr\", \"CELP-vbr\", \"AAC-lbr\", \"AAC-hbr\" }, " /* Optional general parameters */ "objecttype = (int) [1,MAX], " "constantsize = (int) [1,MAX], " /* constant size of each AU */ "constantduration = (int) [1,MAX], " /* constant duration of each AU */ "maxdisplacement = (int) [1,MAX], " "de-interleavebuffersize = (int) [1,MAX], " /* Optional configuration parameters */ "sizelength = (int) [1, 16], " /* max 16 bits, should be enough... */ "indexlength = (int) [1, 8], " "indexdeltalength = (int) [1, 8], " "ctsdeltalength = (int) [1, 64], " "dtsdeltalength = (int) [1, 64], " "randomaccessindication = (int) {0, 1}, " "streamstateindication = (int) [0, 64], " "auxiliarydatasizelength = (int) [0, 64]") GST_BOILERPLATE (GstRtpMP4GDepay, gst_rtp_mp4g_depay, GstBaseRTPDepayload, GST_TYPE_BASE_RTP_DEPAYLOAD); static gboolean gst_rtp_mp4g_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps); static GstBuffer *gst_rtp_mp4g_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf); static void gst_rtp_mp4g_depay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_rtp_mp4g_depay_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static GstStateChangeReturn gst_rtp_mp4g_depay_change_state (GstElement * element, GstStateChange transition); static void gst_rtp_mp4g_depay_base_init (gpointer klass) GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&gst_rtp_mp4g_depay_src_template)); gst_static_pad_template_get (&gst_rtp_mp4g_depay_sink_template)); gst_element_class_set_details (element_class, &gst_rtp_mp4gdepay_details); } gst_rtp_mp4g_depay_class_init (GstRtpMP4GDepayClass * klass) GObjectClass *gobject_class; GstElementClass *gstelement_class; GstBaseRTPDepayloadClass *gstbasertpdepayload_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; parent_class = g_type_class_peek_parent (klass); gstbasertpdepayload_class->process = gst_rtp_mp4g_depay_process; gstbasertpdepayload_class->set_caps = gst_rtp_mp4g_depay_setcaps; gobject_class->set_property = gst_rtp_mp4g_depay_set_property; gobject_class->get_property = gst_rtp_mp4g_depay_get_property; gstelement_class->change_state = gst_rtp_mp4g_depay_change_state; GST_DEBUG_CATEGORY_INIT (rtpmp4gdepay_debug, "rtpmp4gdepay", 0, "MP4-generic RTP Depayloader"); gst_rtp_mp4g_depay_init (GstRtpMP4GDepay * rtpmp4gdepay, GstRtpMP4GDepayClass * klass) static gboolean gst_rtp_mp4g_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) GstStructure *structure; GstRtpMP4GDepay *rtpmp4gdepay; GstCaps *srccaps = NULL; const gchar *str; gint clock_rate = 90000; /* default */ gint someint; rtpmp4gdepay = GST_RTP_MP4G_DEPAY (depayload); structure = gst_caps_get_structure (caps, 0); gst_structure_get_int (structure, "clock-rate", &clock_rate); depayload->clock_rate = clock_rate; if ((str = gst_structure_get_string (structure, "media"))) { if (strcmp (str, "audio") == 0) { srccaps = gst_caps_new_simple ("audio/mpeg", "mpegversion", G_TYPE_INT, 4, NULL); } else if (strcmp (str, "video") == 0) { srccaps = gst_caps_new_simple ("video/mpeg", "mpegversion", G_TYPE_INT, 4, "systemstream", G_TYPE_BOOLEAN, FALSE, NULL); } } if (srccaps == NULL) goto unknown_media; /* these values are optional and have a default value of 0 (no header) */ if (!gst_structure_get_int (structure, "sizelength", &someint)) someint = 0; rtpmp4gdepay->sizelength = someint; if (!gst_structure_get_int (structure, "indexlength", &someint)) rtpmp4gdepay->indexlength = someint; rtpmp4gdepay->indexdeltalength = someint; if (!gst_structure_get_int (structure, "ctsdeltalength", &someint)) rtpmp4gdepay->ctsdeltalength = someint; if (!gst_structure_get_int (structure, "dtsdeltalength", &someint)) rtpmp4gdepay->dtsdeltalength = someint; if (!gst_structure_get_int (structure, "randomaccessindication", &someint)) rtpmp4gdepay->randomaccessindication = someint > 0 ? 1 : 0; if (!gst_structure_get_int (structure, "streamstateindication", &someint)) rtpmp4gdepay->streamstateindication = someint; if (!gst_structure_get_int (structure, "auxiliarydatasizelength", &someint)) rtpmp4gdepay->auxiliarydatasizelength = someint; /* get config string */ if ((str = gst_structure_get_string (structure, "config"))) { GValue v = { 0 }; g_value_init (&v, GST_TYPE_BUFFER); if (gst_value_deserialize (&v, str)) { GstBuffer *buffer; buffer = gst_value_get_buffer (&v); gst_buffer_ref (buffer); g_value_unset (&v); gst_caps_set_simple (srccaps, "codec_data", GST_TYPE_BUFFER, buffer, NULL); } else { g_warning ("cannot convert config to buffer"); gst_pad_set_caps (depayload->srcpad, srccaps); gst_caps_unref (srccaps); return TRUE; /* ERRORS */ unknown_media: { GST_DEBUG_OBJECT (rtpmp4gdepay, "Unknown media type"); return FALSE; static GstBuffer * gst_rtp_mp4g_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) GstBuffer *outbuf; if (!gst_rtp_buffer_validate (buf)) goto bad_packet; gint payload_len; guint8 *payload; guint32 timestamp; payload_len = gst_rtp_buffer_get_payload_len (buf); payload = gst_rtp_buffer_get_payload (buf); /* skip header */ payload += 4; payload_len -= 4; timestamp = gst_rtp_buffer_get_timestamp (buf); outbuf = gst_buffer_new_and_alloc (payload_len); memcpy (GST_BUFFER_DATA (outbuf), payload, payload_len); gst_adapter_push (rtpmp4gdepay->adapter, outbuf); /* if this was the last packet of the VOP, create and push a buffer */ if (gst_rtp_buffer_get_marker (buf)) { guint avail; avail = gst_adapter_available (rtpmp4gdepay->adapter); outbuf = gst_buffer_new (); GST_BUFFER_SIZE (outbuf) = avail; GST_BUFFER_MALLOCDATA (outbuf) = gst_adapter_take (rtpmp4gdepay->adapter, avail); GST_BUFFER_DATA (outbuf) = GST_BUFFER_MALLOCDATA (outbuf); gst_buffer_set_caps (outbuf, GST_PAD_CAPS (depayload->srcpad)); GST_BUFFER_TIMESTAMP (outbuf) = timestamp * GST_SECOND / depayload->clock_rate; GST_DEBUG ("gst_rtp_mp4g_depay_chain: pushing buffer of size %d", GST_BUFFER_SIZE (outbuf)); return outbuf; return NULL; return NULL; bad_packet: GST_ELEMENT_WARNING (rtpmp4gdepay, STREAM, DECODE, ("Packet did not validate"), (NULL)); return NULL; gst_rtp_mp4g_depay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) rtpmp4gdepay = GST_RTP_MP4G_DEPAY (object); switch (prop_id) { default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; gst_rtp_mp4g_depay_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) static GstStateChangeReturn gst_rtp_mp4g_depay_change_state (GstElement * element, GstStateChange transition) GstStateChangeReturn ret; rtpmp4gdepay = GST_RTP_MP4G_DEPAY (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: rtpmp4gdepay->adapter = gst_adapter_new (); case GST_STATE_CHANGE_READY_TO_PAUSED: gst_adapter_clear (rtpmp4gdepay->adapter); ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); case GST_STATE_CHANGE_READY_TO_NULL: g_object_unref (rtpmp4gdepay->adapter); rtpmp4gdepay->adapter = NULL; return ret; gboolean gst_rtp_mp4g_depay_plugin_init (GstPlugin * plugin) return gst_element_register (plugin, "rtpmp4gdepay", GST_RANK_NONE, GST_TYPE_RTP_MP4G_DEPAY); --- NEW FILE: gstrtpmp4gdepay.h --- #ifndef __GST_RTP_MP4G_DEPAY_H__ #define __GST_RTP_MP4G_DEPAY_H__ #include <gst/gst.h> #include <gst/base/gstadapter.h> #include <gst/rtp/gstbasertpdepayload.h> G_BEGIN_DECLS #define GST_TYPE_RTP_MP4G_DEPAY \ (gst_rtp_mp4g_depay_get_type()) #define GST_RTP_MP4G_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_MP4G_DEPAY,GstRtpMP4GDepay)) #define GST_RTP_MP4G_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_MP4G_DEPAY,GstRtpMP4GDepayClass)) #define GST_IS_RTP_MP4G_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_MP4G_DEPAY)) #define GST_IS_RTP_MP4G_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_MP4G_DEPAY)) typedef struct _GstRtpMP4GDepay GstRtpMP4GDepay; typedef struct _GstRtpMP4GDepayClass GstRtpMP4GDepayClass; struct _GstRtpMP4GDepay GstBaseRTPDepayload depayload; gint profile_level_id; gint streamtype; gint sizelength; gint indexlength; gint indexdeltalength; gint ctsdeltalength; gint dtsdeltalength; gint randomaccessindication; gint streamstateindication; gint auxiliarydatasizelength; GstAdapter *adapter; struct _GstRtpMP4GDepayClass GstBaseRTPDepayloadClass parent_class; gboolean gst_rtp_mp4g_depay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_MP4G_DEPAY_H__ */ Index: gstrtpmp4gpay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gpay.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- gstrtpmp4gpay.c 22 Jun 2006 19:31:04 -0000 1.8 +++ gstrtpmp4gpay.c 16 Jul 2006 14:31:48 -0000 1.9 @@ -51,12 +51,12 @@ GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " - "media = (string) \"video\", " + "media = (string) { \"video\", \"audio\", \"application\" }, " "payload = (int) [ 96, 127 ], " "clock-rate = (int) [1, MAX ], " "encoding-name = (string) \"mpeg4-generic\", " /* required string params */ - "streamtype = (string) { \"4\", \"5\" }, " /* 4 = video, 5 = audio */ + "streamtype = (int) { \"4\", \"5\" }, " /* 4 = video, 5 = audio */ "profile-level-id = (int) [1,MAX], " /* "config = (string) [1,MAX]" */ "mode = (string) { \"generic\", \"CELP-cbr\", \"CELP-vbr\", \"AAC-lbr\", \"AAC-hbr\" }, " @@ -64,7 +64,7 @@ "objecttype = (int) [1,MAX], " "constantsize = (int) [1,MAX], " /* constant size of each AU */ "constantduration = (int) [1,MAX], " /* constant duration of each AU */ "maxdisplacement = (int) [1,MAX], " - "de-interleavebuffersize: = (int) [1,MAX], " + "de-interleavebuffersize = (int) [1,MAX], " /* Optional configuration parameters */ "sizelength = (int) [1, 16], " /* max 16 bits, should be enough... */ "indexlength = (int) [1, 8], " @@ -160,7 +160,6 @@ GST_DEBUG_CATEGORY_INIT (rtpmp4gpay_debug, "rtpmp4gpay", 0, "MP4-generic RTP Payloader"); - } static void @@ -237,7 +236,7 @@ /* audio stream type */ rtpmp4gpay->streamtype = 5; /* mode */ - rtpmp4gpay->mode = "ACC-hbr"; + rtpmp4gpay->mode = "AAC-hbr"; /* profile (should be 1) */ rtpmp4gpay->profile = objectType - 1; @@ -363,7 +362,7 @@ GstRtpMP4GPay *rtpmp4gpay; GstStructure *structure; const GValue *codec_data; - gboolean res = TRUE; + gchar *media_type = NULL; rtpmp4gpay = GST_RTP_MP4G_PAY (payload); @@ -375,6 +374,7 @@ if (G_VALUE_TYPE (codec_data) == GST_TYPE_BUFFER) { GstBuffer *buffer; const gchar *name; + gboolean res; buffer = gst_value_get_buffer (codec_data); GST_LOG_OBJECT (rtpmp4gpay, "configuring codec_data"); @@ -384,8 +384,10 @@ /* parse buffer */ if (!strcmp (name, "audio/mpeg")) { res = gst_rtp_mp4g_pay_parse_audio_config (rtpmp4gpay, buffer); + media_type = "audio"; } else if (!strcmp (name, "video/mpeg")) { res = gst_rtp_mp4g_pay_parse_video_config (rtpmp4gpay, buffer); + media_type = "video"; } else { res = FALSE; } @@ -399,13 +401,15 @@ rtpmp4gpay->config = gst_buffer_copy (buffer); } } + if (media_type == NULL) + goto config_failed; - gst_basertppayload_set_options (payload, "video", TRUE, "mpeg4-generic", + gst_basertppayload_set_options (payload, media_type, TRUE, "mpeg4-generic", rtpmp4gpay->rate); gst_rtp_mp4g_pay_new_caps (rtpmp4gpay); - return res; + return TRUE; /* ERRORS */ config_failed: @@ -503,7 +507,7 @@ gst_adapter_flush (rtpmp4gpay->adapter, payload_len); /* marker only if the packet is complete */ - gst_rtp_buffer_set_marker (outbuf, avail > payload_len); + gst_rtp_buffer_set_marker (outbuf, avail <= payload_len); GST_BUFFER_TIMESTAMP (outbuf) = rtpmp4gpay->first_ts; |
From: <wt...@ke...> - 2006-07-26 18:18:42
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Wed Jul 26 2006 16:37:11 UTC Log message: Patch by: Kai Vehmanen <kv2004 at eca dot cx> * gst/rtp/gstrtppcmapay.c: (gst_rtp_pcma_pay_flush), (gst_rtp_pcma_pay_handle_buffer): * gst/rtp/gstrtppcmupay.c: (gst_rtp_pcmu_pay_flush), (gst_rtp_pcmu_pay_handle_buffer): Fix timestamp calculation on outgoing RTP packets. Fixes #348675. Modified files: . : ChangeLog gst/rtp : gstrtppcmapay.c gstrtppcmupay.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2458&r2=1.2459 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtppcmapay.c.diff?r1=1.7&r2=1.8 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtppcmupay.c.diff?r1=1.7&r2=1.8 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2458 retrieving revision 1.2459 diff -u -d -r1.2458 -r1.2459 --- ChangeLog 26 Jul 2006 10:07:29 -0000 1.2458 +++ ChangeLog 26 Jul 2006 16:36:59 -0000 1.2459 @@ -1,3 +1,14 @@ +2006-07-26 Wim Taymans <wi...@fl...> + + Patch by: Kai Vehmanen <kv2004 at eca dot cx> + * gst/rtp/gstrtppcmapay.c: (gst_rtp_pcma_pay_flush), + (gst_rtp_pcma_pay_handle_buffer): + * gst/rtp/gstrtppcmupay.c: (gst_rtp_pcmu_pay_flush), + (gst_rtp_pcmu_pay_handle_buffer): + Fix timestamp calculation on outgoing RTP packets. + Fixes #348675. 2006-07-26 Tim-Philipp Müller <tim at centricular dot net> * ext/taglib/gstid3v2mux.cc: Index: gstrtppcmapay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtppcmapay.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- gstrtppcmapay.c 22 May 2006 13:51:30 -0000 1.7 +++ gstrtppcmapay.c 26 Jul 2006 16:36:59 -0000 1.8 @@ -129,7 +129,7 @@ } static GstFlowReturn -gst_rtp_pcma_pay_flush (GstRtpPmcaPay * rtppcmapay) +gst_rtp_pcma_pay_flush (GstRtpPmcaPay * rtppcmapay, guint32 clock_rate) { guint avail; GstBuffer *outbuf; @@ -141,8 +141,8 @@ /* calculate octet count with: maxptime-nsec * samples-per-sec / nsecs-per-sec * octets-per-sample */ maxptime_octets = - GST_BASE_RTP_PAYLOAD (rtppcmapay)->max_ptime * - GST_BASE_RTP_PAYLOAD (rtppcmapay)->clock_rate / GST_SECOND; + gst_util_uint64_scale_int (GST_BASE_RTP_PAYLOAD (rtppcmapay)->max_ptime, + clock_rate, GST_SECOND); } /* the data available in the adapter is either smaller @@ -181,6 +181,14 @@ GST_BUFFER_TIMESTAMP (outbuf) = rtppcmapay->first_ts; ret = gst_basertppayload_push (GST_BASE_RTP_PAYLOAD (rtppcmapay), outbuf); + /* increase count (in ts) of data pushed to basertppayload */ + rtppcmapay->first_ts += + gst_util_uint64_scale_int (payload_len, GST_SECOND, clock_rate); + /* store amount of unpushed data (in ts) */ + rtppcmapay->duration = + gst_util_uint64_scale_int (avail, GST_SECOND, clock_rate); return ret; @@ -194,11 +202,14 @@ guint size, packet_len, avail; GstFlowReturn ret; GstClockTime duration; + guint32 clock_rate; rtppcmapay = GST_RTP_PCMA_PAY (basepayload); + clock_rate = basepayload->clock_rate; size = GST_BUFFER_SIZE (buffer); - duration = GST_BUFFER_TIMESTAMP (buffer); + duration = gst_util_uint64_scale_int (size, GST_SECOND, clock_rate); avail = gst_adapter_available (rtppcmapay->adapter); if (avail == 0) { @@ -213,9 +224,8 @@ * have. */ if (gst_basertppayload_is_filled (basepayload, packet_len, rtppcmapay->duration + duration)) { - ret = gst_rtp_pcma_pay_flush (rtppcmapay); - rtppcmapay->first_ts = GST_BUFFER_TIMESTAMP (buffer); - rtppcmapay->duration = 0; + ret = gst_rtp_pcma_pay_flush (rtppcmapay, clock_rate); + /* note: first_ts and duration updated in ...pay_flush() */ } else { ret = GST_FLOW_OK; Index: gstrtppcmupay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtppcmupay.c,v --- gstrtppcmupay.c 22 May 2006 13:51:30 -0000 1.7 +++ gstrtppcmupay.c 26 Jul 2006 16:36:59 -0000 1.8 -gst_rtp_pcmu_pay_flush (GstRtpPcmuPay * rtppcmupay) +gst_rtp_pcmu_pay_flush (GstRtpPcmuPay * rtppcmupay, guint32 clock_rate) - GST_BASE_RTP_PAYLOAD (rtppcmupay)->max_ptime * - GST_BASE_RTP_PAYLOAD (rtppcmupay)->clock_rate / GST_SECOND; + gst_util_uint64_scale_int (GST_BASE_RTP_PAYLOAD (rtppcmupay)->max_ptime, GST_BUFFER_TIMESTAMP (outbuf) = rtppcmupay->first_ts; ret = gst_basertppayload_push (GST_BASE_RTP_PAYLOAD (rtppcmupay), outbuf); + rtppcmupay->first_ts += + rtppcmupay->duration = rtppcmupay = GST_RTP_PCMU_PAY (basepayload); avail = gst_adapter_available (rtppcmupay->adapter); packet_len, rtppcmupay->duration + duration)) { - ret = gst_rtp_pcmu_pay_flush (rtppcmupay); - rtppcmupay->first_ts = GST_BUFFER_TIMESTAMP (buffer); - rtppcmupay->duration = 0; + ret = gst_rtp_pcmu_pay_flush (rtppcmupay, clock_rate); |
From: <wt...@ke...> - 2006-08-16 10:05:15
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Wed Aug 16 2006 10:05:12 UTC Log message: * gst/rtp/gstrtpamrdepay.c: * gst/rtp/gstrtpmp4gdepay.c: Caps extra properties must be defined as strings for depayloaders because they are generated from an SDP. * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: (plugin_init): * gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init), (gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init), (gst_rtp_h264_depay_finalize), (decode_base64), (gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process), (gst_rtp_h264_depay_set_property), (gst_rtp_h264_depay_get_property), (gst_rtp_h264_depay_change_state), (gst_rtp_h264_depay_plugin_init): * gst/rtp/gstrtph264depay.h: Added basic, not completely functional RFC 3984 H264 depayloader. Modified files: . : ChangeLog gst/rtp : Makefile.am gstrtp.c gstrtpamrdepay.c gstrtpmp4gdepay.c Added files: gst/rtp : gstrtph264depay.c gstrtph264depay.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2485&r2=1.2486 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/Makefile.am.diff?r1=1.27&r2=1.28 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtp.c.diff?r1=1.25&r2=1.26 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpamrdepay.c.diff?r1=1.20&r2=1.21 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtph264depay.c?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtph264depay.h?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gdepay.c.diff?r1=1.1&r2=1.2 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2485 retrieving revision 1.2486 diff -u -d -r1.2485 -r1.2486 --- ChangeLog 16 Aug 2006 09:48:26 -0000 1.2485 +++ ChangeLog 16 Aug 2006 10:05:00 -0000 1.2486 @@ -1,5 +1,25 @@ 2006-08-16 Wim Taymans <wi...@fl...> + * gst/rtp/gstrtpamrdepay.c: + * gst/rtp/gstrtpmp4gdepay.c: + Caps extra properties must be defined as strings for + depayloaders because they are generated from an SDP. + + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: (plugin_init): + * gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_base_init), + (gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_init), + (gst_rtp_h264_depay_finalize), (decode_base64), + (gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process), + (gst_rtp_h264_depay_set_property), + (gst_rtp_h264_depay_get_property), + (gst_rtp_h264_depay_change_state), + (gst_rtp_h264_depay_plugin_init): + * gst/rtp/gstrtph264depay.h: + Added basic, not completely functional RFC 3984 H264 depayloader. +2006-08-16 Wim Taymans <wi...@fl...> * gst/rtsp/gstrtpdec.c: (gst_rtpdec_init), (gst_rtpdec_getcaps): Add pads after setting them up. Index: Makefile.am RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/Makefile.am,v retrieving revision 1.27 retrieving revision 1.28 diff -u -d -r1.27 -r1.28 --- Makefile.am 16 Jul 2006 14:31:48 -0000 1.27 +++ Makefile.am 16 Aug 2006 10:05:00 -0000 1.28 @@ -16,6 +16,7 @@ gstrtph263pdepay.c \ gstrtph263ppay.c \ gstrtph263pay.c \ + gstrtph264depay.c \ gstasteriskh263.c \ gstrtpmp2tdepay.c \ gstrtpmp4vdepay.c \ @@ -54,6 +55,7 @@ gstrtph263pdepay.h \ gstrtph263ppay.h \ gstrtph263pay.h \ + gstrtph264depay.h \ gstrtpmp2tdepay.h \ gstrtpmp4vdepay.h \ gstrtpmp4vpay.h \ Index: gstrtp.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtp.c,v retrieving revision 1.25 retrieving revision 1.26 diff -u -d -r1.25 -r1.26 --- gstrtp.c 16 Jul 2006 14:31:48 -0000 1.25 +++ gstrtp.c 16 Aug 2006 10:05:00 -0000 1.26 @@ -35,6 +35,7 @@ #include "gstrtph263pdepay.h" #include "gstrtph263ppay.h" #include "gstrtph263pay.h" +#include "gstrtph264depay.h" #include "gstasteriskh263.h" #include "gstrtpmp2tdepay.h" #include "gstrtpmp4vdepay.h" @@ -89,6 +90,9 @@ if (!gst_rtp_h263_pay_plugin_init (plugin)) return FALSE; + if (!gst_rtp_h264_depay_plugin_init (plugin)) + return FALSE; if (!gst_asteriskh263_plugin_init (plugin)) Index: gstrtpamrdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpamrdepay.c,v retrieving revision 1.20 retrieving revision 1.21 diff -u -d -r1.20 -r1.21 --- gstrtpamrdepay.c 14 Jul 2006 13:33:54 -0000 1.20 +++ gstrtpamrdepay.c 16 Aug 2006 10:05:00 -0000 1.21 @@ -65,6 +65,8 @@ "clock-rate = (int) 8000, " "encoding-name = (string) \"AMR\", " "encoding-params = (string) \"1\", " + /* NOTE that all values must be strings in orde to be able to do SDP <-> + * GstCaps mapping. */ "octet-align = (string) \"1\", " "crc = (string) { \"0\", \"1\" }, " "robust-sorting = (string) \"0\", " "interleaving = (string) \"0\"" --- NEW FILE: gstrtph264depay.c --- /* GStreamer * Copyright (C) <2006> Wim Taymans <wi...@fl...> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include <string.h> #include <gst/rtp/gstrtpbuffer.h> #include "gstrtph264depay.h" /* elementfactory information */ static const GstElementDetails gst_rtp_h264depay_details = GST_ELEMENT_DETAILS ("RTP packet parser", "Codec/Depayr/Network", "Extracts H264 video from RTP packets (RFC 3984)", "Wim Taymans <wi...@fl...>"); /* RtpH264Depay signals and args */ enum { /* FILL ME */ LAST_SIGNAL }; ARG_0, ARG_FREQUENCY static GstStaticPadTemplate gst_rtp_h264_depay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/x-h264") ); static GstStaticPadTemplate gst_rtp_h264_depay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"video\", " "clock-rate = (int) 90000, " "encoding-name = (string) \"H264\"") /** optional parameters **/ /* "profile-level-id = (string) ANY, " */ /* "max-mbps = (string) ANY, " */ /* "max-fs = (string) ANY, " */ /* "max-cpb = (string) ANY, " */ /* "max-dpb = (string) ANY, " */ /* "max-br = (string) ANY, " */ /* "redundant-pic-cap = (string) { \"0\", \"1\" }, " */ /* "sprop-parameter-sets = (string) ANY, " */ /* "parameter-add = (string) { \"0\", \"1\" }, " */ /* "packetization-mode = (string) { \"0\", \"1\", \"2\" }, " */ /* "sprop-interleaving-depth = (string) ANY, " */ /* "sprop-deint-buf-req = (string) ANY, " */ /* "deint-buf-cap = (string) ANY, " */ /* "sprop-init-buf-time = (string) ANY, " */ /* "sprop-max-don-diff = (string) ANY, " */ /* "max-rcmd-nalu-size = (string) ANY " */ GST_BOILERPLATE (GstRtpH264Depay, gst_rtp_h264_depay, GstBaseRTPDepayload, GST_TYPE_BASE_RTP_DEPAYLOAD); static void gst_rtp_h264_depay_finalize (GObject * object); static void gst_rtp_h264_depay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_rtp_h264_depay_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static GstStateChangeReturn gst_rtp_h264_depay_change_state (GstElement * element, GstStateChange transition); static GstBuffer *gst_rtp_h264_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf); static gboolean gst_rtp_h264_depay_setcaps (GstBaseRTPDepayload * filter, GstCaps * caps); static void gst_rtp_h264_depay_base_init (gpointer klass) GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&gst_rtp_h264_depay_src_template)); gst_static_pad_template_get (&gst_rtp_h264_depay_sink_template)); gst_element_class_set_details (element_class, &gst_rtp_h264depay_details); } gst_rtp_h264_depay_class_init (GstRtpH264DepayClass * klass) GObjectClass *gobject_class; GstElementClass *gstelement_class; GstBaseRTPDepayloadClass *gstbasertpdepayload_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; parent_class = g_type_class_peek_parent (klass); gstbasertpdepayload_class->process = gst_rtp_h264_depay_process; gstbasertpdepayload_class->set_caps = gst_rtp_h264_depay_setcaps; gobject_class->finalize = gst_rtp_h264_depay_finalize; gobject_class->set_property = gst_rtp_h264_depay_set_property; gobject_class->get_property = gst_rtp_h264_depay_get_property; gstelement_class->change_state = gst_rtp_h264_depay_change_state; gst_rtp_h264_depay_init (GstRtpH264Depay * rtph264depay, GstRtpH264DepayClass * klass) rtph264depay->adapter = gst_adapter_new (); gst_rtp_h264_depay_finalize (GObject * object) GstRtpH264Depay *rtph264depay; rtph264depay = GST_RTP_H264_DEPAY (object); g_object_unref (rtph264depay->adapter); rtph264depay->adapter = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); static const guint8 a2bin[256] = { 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64, 64, 64, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 64, 64, 64, 64, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 64, 64, 64, 64, 64, 64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64 static guint decode_base64 (gchar * in, guint8 * out) guint8 v1, v2; guint len = 0; v1 = a2bin[(gint) * in]; while (v1 < 63) { /* read 4 bytes, write 3 bytes, invalid base64 are zeroes */ v2 = a2bin[(gint) * ++in]; *out++ = (v1 << 2) | ((v2 & 0x3f) >> 4); v1 = (v2 > 63 ? 64 : a2bin[(gint) * ++in]); *out++ = (v2 << 4) | ((v1 & 0x3f) >> 2); v2 = (v1 > 63 ? 64 : a2bin[(gint) * ++in]); *out++ = (v1 << 6) | (v2 & 0x3f); len += 3; } /* move to '\0' */ while (*in != '\0') in++; /* subtract padding */ while (len > 0 && *--in == '=') len--; return len; static gboolean gst_rtp_h264_depay_setcaps (GstBaseRTPDepayload * filter, GstCaps * caps) GstCaps *srccaps = NULL; gint clock_rate = 90000; GstStructure *structure = gst_caps_get_structure (caps, 0); if (gst_structure_has_field (structure, "clock-rate")) { gst_structure_get_int (structure, "clock-rate", &clock_rate); srccaps = gst_caps_new_simple ("video/x-h264", NULL); if (gst_structure_has_field (structure, "sprop-parameter-sets")) { const gchar *ps; gchar **params; guint len, total; gint i; GstBuffer *codec_data; guint8 *b64; /* Base64 encoded, comma separated config NALs */ ps = gst_structure_get_string (structure, "sprop-parameter-sets"); params = g_strsplit (ps, ",", 0); /* count total number of bytes in base64 */ len = 0; for (i = 0; params[i]; i++) { len += strlen (params[i]); } /* we seriously overshoot the length, but it's fine. */ codec_data = gst_buffer_new_and_alloc (len); b64 = GST_BUFFER_DATA (codec_data); total = 0; *b64++ = 0; *b64++ = 1; len = decode_base64 (params[i], b64); total += (len + 3); b64 += len; GST_BUFFER_SIZE (codec_data) = total; gst_caps_set_simple (srccaps, "codec_data", GST_TYPE_BUFFER, codec_data, NULL); filter->clock_rate = clock_rate; gst_pad_set_caps (filter->srcpad, srccaps); gst_caps_unref (srccaps); return TRUE; static GstBuffer * gst_rtp_h264_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) GstBuffer *outbuf; rtph264depay = GST_RTP_H264_DEPAY (depayload); if (!gst_rtp_buffer_validate (buf)) goto bad_packet; { gint payload_len; guint8 *payload; guint header_len; guint8 nal_ref_idc, nal_unit_type; payload_len = gst_rtp_buffer_get_payload_len (buf); payload = gst_rtp_buffer_get_payload (buf); /* +---------------+ * |0|1|2|3|4|5|6|7| * +-+-+-+-+-+-+-+-+ * |F|NRI| Type | * +---------------+ * * F must be 0. */ nal_ref_idc = (payload[0] & 0x60) >> 5; nal_unit_type = payload[0] & 0x1f; GST_DEBUG_OBJECT (rtph264depay, "NRI %d, Type %d", nal_ref_idc, nal_unit_type); switch (nal_unit_type) { case 0: case 30: case 31: /* undefined */ goto undefined_type; case 24: /* STAP-A Single-time aggregation packet 5.7.1 */ header_len = 1; break; case 25: /* STAP-B Single-time aggregation packet 5.7.1 */ case 26: /* MTAP16 Multi-time aggregation packet 5.7.2 */ case 27: /* MTAP24 Multi-time aggregation packet 5.7.2 */ header_len = 3; case 28: case 29: { /* FU-A Fragmentation unit 5.8 */ /* FU-B Fragmentation unit 5.8 */ gboolean S, E; /* +---------------+ * |0|1|2|3|4|5|6|7| * +-+-+-+-+-+-+-+-+ * |S|E|R| Type | * +---------------+ * * R is reserved and always 0 */ S = (payload[1] & 0x80) == 0x80; E = (payload[1] & 0x40) == 0x40; GST_DEBUG_OBJECT (rtph264depay, "S %d, E %d", S, E); if (S) { /* NAL unit starts here */ guint8 *outdata; guint outsize; outsize = payload_len - 1; outbuf = gst_buffer_new_and_alloc (outsize + 3); outdata = GST_BUFFER_DATA (outbuf); memcpy (outdata + 3, payload + 1, outsize); /* reconstruct NAL header */ outdata[0] = 0x00; outdata[1] = 0x00; outdata[2] = 0x01; outdata[3] = (payload[0] & 0xe0) | (payload[1] & 0x1f); /* and assemble in the adapter */ gst_adapter_push (rtph264depay->adapter, outbuf); } else { /* NAL unit data */ /* strip off 2 header bytes */ outsize = payload_len - 2; outbuf = gst_buffer_new_and_alloc (outsize); memcpy (outdata, payload + 2, outsize); } /* if NAL unit ends, flush the adapter */ if (E) { outsize = gst_adapter_available (rtph264depay->adapter); outdata = gst_adapter_take (rtph264depay->adapter, outsize); outbuf = gst_buffer_new (); GST_BUFFER_SIZE (outbuf) = outsize; GST_BUFFER_DATA (outbuf) = outdata; GST_BUFFER_MALLOCDATA (outbuf) = outdata; gst_buffer_set_caps (outbuf, (GstCaps *) gst_pad_get_pad_template_caps (depayload->srcpad)); GST_DEBUG_OBJECT (rtph264depay, "output %d bytes", outsize); return outbuf; } default: guint outsize; guint8 *outdata; /* 1-23 NAL unit Single NAL unit packet per H.264 5.6 */ /* the entire payload is the output buffer */ outsize = payload_len + 3; outbuf = gst_buffer_new_and_alloc (outsize); outdata = GST_BUFFER_DATA (outbuf); outdata[0] = 0; outdata[1] = 0; outdata[2] = 1; memcpy (&outdata[3], payload, payload_len); gst_buffer_set_caps (outbuf, (GstCaps *) gst_pad_get_pad_template_caps (depayload->srcpad)); return outbuf; return NULL; /* ERRORS */ bad_packet: GST_ELEMENT_WARNING (rtph264depay, STREAM, DECODE, ("Packet did not validate"), (NULL)); return NULL; undefined_type: ("Undefined packet type"), (NULL)); gst_rtp_h264_depay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) switch (prop_id) { default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; gst_rtp_h264_depay_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) static GstStateChangeReturn gst_rtp_h264_depay_change_state (GstElement * element, GstStateChange transition) GstStateChangeReturn ret; rtph264depay = GST_RTP_H264_DEPAY (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: case GST_STATE_CHANGE_READY_TO_PAUSED: gst_adapter_clear (rtph264depay->adapter); ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); case GST_STATE_CHANGE_READY_TO_NULL: return ret; gboolean gst_rtp_h264_depay_plugin_init (GstPlugin * plugin) return gst_element_register (plugin, "rtph264depay", GST_RANK_NONE, GST_TYPE_RTP_H264_DEPAY); --- NEW FILE: gstrtph264depay.h --- #ifndef __GST_RTP_H264_DEPAY_H__ #define __GST_RTP_H264_DEPAY_H__ #include <gst/gst.h> #include <gst/base/gstadapter.h> #include <gst/rtp/gstbasertpdepayload.h> G_BEGIN_DECLS #define GST_TYPE_RTP_H264_DEPAY \ (gst_rtp_h264_depay_get_type()) #define GST_RTP_H264_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_H264_DEPAY,GstRtpH264Depay)) #define GST_RTP_H264_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_H264_DEPAY,GstRtpH264DepayClass)) #define GST_IS_RTP_H264_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_H264_DEPAY)) #define GST_IS_RTP_H264_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_H264_DEPAY)) typedef struct _GstRtpH264Depay GstRtpH264Depay; typedef struct _GstRtpH264DepayClass GstRtpH264DepayClass; struct _GstRtpH264Depay GstBaseRTPDepayload depayload; GstAdapter *adapter; guint frequency; struct _GstRtpH264DepayClass GstBaseRTPDepayloadClass parent_class; gboolean gst_rtp_h264_depay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_H264_DEPAY_H__ */ Index: gstrtpmp4gdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gdepay.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- gstrtpmp4gdepay.c 16 Jul 2006 14:31:48 -0000 1.1 +++ gstrtpmp4gdepay.c 16 Aug 2006 10:05:00 -0000 1.2 @@ -68,24 +68,25 @@ "clock-rate = (int) [1, MAX ], " "encoding-name = (string) \"mpeg4-generic\", " /* required string params */ - "streamtype = (int) { \"4\", \"5\" }, " /* 4 = video, 5 = audio */ - "profile-level-id = (int) [1,MAX], " + "streamtype = (string) { \"4\", \"5\" }, " /* 4 = video, 5 = audio */ + /* "profile-level-id = (string) [1,MAX], " */ /* "config = (string) [1,MAX]" */ - "mode = (string) { \"generic\", \"CELP-cbr\", \"CELP-vbr\", \"AAC-lbr\", \"AAC-hbr\" }, " + "mode = (string) { \"generic\", \"CELP-cbr\", \"CELP-vbr\", \"AAC-lbr\", \"AAC-hbr\" } " /* Optional general parameters */ - "objecttype = (int) [1,MAX], " "constantsize = (int) [1,MAX], " /* constant size of each AU */ - "constantduration = (int) [1,MAX], " /* constant duration of each AU */ - "maxdisplacement = (int) [1,MAX], " - "de-interleavebuffersize = (int) [1,MAX], " + /* "objecttype = (string) [1,MAX], " */ + /* "constantsize = (string) [1,MAX], " *//* constant size of each AU */ + /* "constantduration = (string) [1,MAX], " *//* constant duration of each AU */ + /* "maxdisplacement = (string) [1,MAX], " */ + /* "de-interleavebuffersize = (string) [1,MAX], " */ /* Optional configuration parameters */ - "sizelength = (int) [1, 16], " /* max 16 bits, should be enough... */ - "indexlength = (int) [1, 8], " - "indexdeltalength = (int) [1, 8], " - "ctsdeltalength = (int) [1, 64], " - "dtsdeltalength = (int) [1, 64], " - "randomaccessindication = (int) {0, 1}, " - "streamstateindication = (int) [0, 64], " - "auxiliarydatasizelength = (int) [0, 64]") + /* "sizelength = (string) [1, 16], " *//* max 16 bits, should be enough... */ + /* "indexlength = (string) [1, 8], " */ + /* "indexdeltalength = (string) [1, 8], " */ + /* "ctsdeltalength = (string) [1, 64], " */ + /* "dtsdeltalength = (string) [1, 64], " */ + /* "randomaccessindication = (string) {0, 1}, " */ + /* "streamstateindication = (string) [0, 64], " */ + /* "auxiliarydatasizelength = (string) [0, 64]" */ ) ); GST_BOILERPLATE (GstRtpMP4GDepay, gst_rtp_mp4g_depay, GstBaseRTPDepayload, |
From: <wt...@ke...> - 2006-08-17 15:47:43
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Thu Aug 17 2006 15:47:40 UTC Log message: * gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_process): Error out on non-implemented stuff. Modified files: . : ChangeLog gst/rtp : gstrtph264depay.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2494&r2=1.2495 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtph264depay.c.diff?r1=1.1&r2=1.2 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2494 retrieving revision 1.2495 diff -u -d -r1.2494 -r1.2495 --- ChangeLog 16 Aug 2006 16:50:00 -0000 1.2494 +++ ChangeLog 17 Aug 2006 15:47:28 -0000 1.2495 @@ -1,3 +1,8 @@ +2006-08-17 Wim Taymans <wi...@fl...> + + * gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_process): + Error out on non-implemented stuff. 2006-08-16 Wim Taymans <wi...@fl...> Patch by: Andy Wingo <wingo at pobox dot com> Index: gstrtph264depay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtph264depay.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- gstrtph264depay.c 16 Aug 2006 10:05:00 -0000 1.1 +++ gstrtph264depay.c 17 Aug 2006 15:47:28 -0000 1.2 @@ -302,6 +302,7 @@ case 24: /* STAP-A Single-time aggregation packet 5.7.1 */ header_len = 1; + goto not_implemented; break; case 25: /* STAP-B Single-time aggregation packet 5.7.1 */ @@ -310,6 +311,7 @@ case 27: /* MTAP24 Multi-time aggregation packet 5.7.2 */ header_len = 3; case 28: case 29: @@ -425,6 +427,12 @@ ("Undefined packet type"), (NULL)); return NULL; } +not_implemented: + { + GST_ELEMENT_ERROR (rtph264depay, STREAM, FORMAT, + (NULL), ("NAL unit type not supported yet")); + return NULL; + } } static void |
From: <wt...@ke...> - 2006-08-18 16:52:35
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Fri Aug 18 2006 16:52:33 UTC Log message: * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: (plugin_init): * gst/rtp/gstrtpsv3vdepay.c: (gst_rtp_sv3v_depay_base_init), (gst_rtp_sv3v_depay_class_init), (gst_rtp_sv3v_depay_init), (gst_rtp_sv3v_depay_finalize), (gst_rtp_sv3v_depay_setcaps), (gst_rtp_sv3v_depay_process), (gst_rtp_sv3v_depay_set_property), (gst_rtp_sv3v_depay_get_property), (gst_rtp_sv3v_depay_change_state), (gst_rtp_sv3v_depay_plugin_init): * gst/rtp/gstrtpsv3vdepay.h: Added experimental SVQ3 depayloader. Modified files: . : ChangeLog gst/rtp : Makefile.am gstrtp.c Added files: gst/rtp : gstrtpsv3vdepay.c gstrtpsv3vdepay.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2497&r2=1.2498 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/Makefile.am.diff?r1=1.28&r2=1.29 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtp.c.diff?r1=1.26&r2=1.27 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpsv3vdepay.c?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpsv3vdepay.h?rev=1.1&content-type=text/vnd.viewcvs-markup ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2497 retrieving revision 1.2498 diff -u -d -r1.2497 -r1.2498 --- ChangeLog 18 Aug 2006 13:25:03 -0000 1.2497 +++ ChangeLog 18 Aug 2006 16:52:21 -0000 1.2498 @@ -1,3 +1,17 @@ +2006-08-18 Wim Taymans <wi...@fl...> + + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: (plugin_init): + * gst/rtp/gstrtpsv3vdepay.c: (gst_rtp_sv3v_depay_base_init), + (gst_rtp_sv3v_depay_class_init), (gst_rtp_sv3v_depay_init), + (gst_rtp_sv3v_depay_finalize), (gst_rtp_sv3v_depay_setcaps), + (gst_rtp_sv3v_depay_process), (gst_rtp_sv3v_depay_set_property), + (gst_rtp_sv3v_depay_get_property), + (gst_rtp_sv3v_depay_change_state), + (gst_rtp_sv3v_depay_plugin_init): + * gst/rtp/gstrtpsv3vdepay.h: + Added experimental SVQ3 depayloader. 2006-08-18 Edward Hervey <ed...@fl...> * ext/dv/gstdvdemux.c: (gst_dvdemux_handle_pull_seek), Index: Makefile.am RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/Makefile.am,v retrieving revision 1.28 retrieving revision 1.29 diff -u -d -r1.28 -r1.29 --- Makefile.am 16 Aug 2006 10:05:00 -0000 1.28 +++ Makefile.am 18 Aug 2006 16:52:21 -0000 1.29 @@ -24,7 +24,8 @@ gstrtpmp4gdepay.c \ gstrtpmp4gpay.c \ gstrtpspeexdepay.c \ - gstrtpspeexpay.c + gstrtpspeexpay.c \ + gstrtpsv3vdepay.c #gstrtpL16pay.c gstrtpL16depay.c @@ -64,4 +65,5 @@ gstrtpdepay.h \ gstasteriskh263.h \ gstrtpspeexdepay.h \ - gstrtpspeexpay.h + gstrtpspeexpay.h \ + gstrtpsv3vdepay.c Index: gstrtp.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtp.c,v retrieving revision 1.26 retrieving revision 1.27 diff -u -d -r1.26 -r1.27 --- gstrtp.c 16 Aug 2006 10:05:00 -0000 1.26 +++ gstrtp.c 18 Aug 2006 16:52:21 -0000 1.27 @@ -44,6 +44,7 @@ #include "gstrtpmp4gpay.h" #include "gstrtpspeexpay.h" #include "gstrtpspeexdepay.h" +#include "gstrtpsv3vdepay.h" static gboolean plugin_init (GstPlugin * plugin) @@ -117,6 +118,9 @@ if (!gst_rtp_speex_depay_plugin_init (plugin)) return FALSE; + if (!gst_rtp_sv3v_depay_plugin_init (plugin)) + return FALSE; return TRUE; } --- NEW FILE: gstrtpsv3vdepay.c --- /* GStreamer * Copyright (C) <2005> Wim Taymans <wi...@fl...> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include <string.h> #include <gst/rtp/gstrtpbuffer.h> #include "gstrtpsv3vdepay.h" /* elementfactory information */ static const GstElementDetails gst_rtp_sv3vdepay_details = GST_ELEMENT_DETAILS ("RTP packet parser", "Codec/Depayr/Network", "Extracts SVQ3 video from RTP packets (no RFC)", "Wim Taymans <wi...@fl...>"); /* RtpSV3VDepay signals and args */ enum { /* FILL ME */ LAST_SIGNAL }; ARG_0, ARG_FREQUENCY static GstStaticPadTemplate gst_rtp_sv3v_depay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/x-svq, " "svqversion = (int) 3") ); static GstStaticPadTemplate gst_rtp_sv3v_depay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"video\", " "clock-rate = (int) 90000, " "encoding-name = (string) \"X-SV3V-ES\"") GST_BOILERPLATE (GstRtpSV3VDepay, gst_rtp_sv3v_depay, GstBaseRTPDepayload, GST_TYPE_BASE_RTP_DEPAYLOAD); static void gst_rtp_sv3v_depay_finalize (GObject * object); static void gst_rtp_sv3v_depay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_rtp_sv3v_depay_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static GstStateChangeReturn gst_rtp_sv3v_depay_change_state (GstElement * element, GstStateChange transition); static GstBuffer *gst_rtp_sv3v_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf); gboolean gst_rtp_sv3v_depay_setcaps (GstBaseRTPDepayload * filter, GstCaps * caps); static void gst_rtp_sv3v_depay_base_init (gpointer klass) GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&gst_rtp_sv3v_depay_src_template)); gst_static_pad_template_get (&gst_rtp_sv3v_depay_sink_template)); gst_element_class_set_details (element_class, &gst_rtp_sv3vdepay_details); } gst_rtp_sv3v_depay_class_init (GstRtpSV3VDepayClass * klass) GObjectClass *gobject_class; GstElementClass *gstelement_class; GstBaseRTPDepayloadClass *gstbasertpdepayload_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; parent_class = g_type_class_peek_parent (klass); gstbasertpdepayload_class->process = gst_rtp_sv3v_depay_process; gstbasertpdepayload_class->set_caps = gst_rtp_sv3v_depay_setcaps; gobject_class->finalize = gst_rtp_sv3v_depay_finalize; gobject_class->set_property = gst_rtp_sv3v_depay_set_property; gobject_class->get_property = gst_rtp_sv3v_depay_get_property; gstelement_class->change_state = gst_rtp_sv3v_depay_change_state; gst_rtp_sv3v_depay_init (GstRtpSV3VDepay * rtpsv3vdepay, GstRtpSV3VDepayClass * klass) rtpsv3vdepay->adapter = gst_adapter_new (); gst_rtp_sv3v_depay_finalize (GObject * object) GstRtpSV3VDepay *rtpsv3vdepay; rtpsv3vdepay = GST_RTP_SV3V_DEPAY (object); g_object_unref (rtpsv3vdepay->adapter); rtpsv3vdepay->adapter = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); // only on the sink gboolean gst_rtp_sv3v_depay_setcaps (GstBaseRTPDepayload * filter, GstCaps * caps) GstStructure *structure = gst_caps_get_structure (caps, 0); gint clock_rate = 90000; // default if (gst_structure_has_field (structure, "clock-rate")) gst_structure_get_int (structure, "clock-rate", &clock_rate); filter->clock_rate = clock_rate; return TRUE; static GstBuffer * gst_rtp_sv3v_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) GstBuffer *outbuf; guint16 seq; rtpsv3vdepay = GST_RTP_SV3V_DEPAY (depayload); if (!gst_rtp_buffer_validate (buf)) goto bad_packet; /* flush on sequence number gaps */ seq = gst_rtp_buffer_get_seq (buf); if (seq != rtpsv3vdepay->nextseq) { gst_adapter_clear (rtpsv3vdepay->adapter); } rtpsv3vdepay->nextseq = seq + 1; { gint payload_len; guint8 *payload; gboolean M; gboolean C, S, E; payload_len = gst_rtp_buffer_get_payload_len (buf); if (payload_len < 3) goto bad_packet; payload = gst_rtp_buffer_get_payload (buf); M = gst_rtp_buffer_get_marker (buf); /* This is all a guess: * 1 1 1 1 1 1 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |0|C|S|E|0|0|0|0|0|0|0|0|0|0|0|0| * * C: config, packet contains config info * S: start, packet contains start of frame * E: end, packet contains end of frame */ /* this seems to indicate a packet with a config string sent before each * keyframe */ C = (payload[0] & 0x40) == 0x40; /* redundant with the RTP marker bit */ S = (payload[0] & 0x20) == 0x20; E = (payload[0] & 0x10) == 0x10; if (C) { GstCaps *caps; GstBuffer *codec_data; GValue value = { 0 }; /* if we already have caps, we don't need to do anything. FIXME, check if * something changed. */ if (GST_PAD_CAPS (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload))) return NULL; /* No idea... These are the two examples I found.. */ if (payload[2] == 0x1d) { rtpsv3vdepay->width = 160; rtpsv3vdepay->height = 128; } else if (payload[2] == 0xdd) { rtpsv3vdepay->width = 320; rtpsv3vdepay->height = 240; } /* we need a dummy empty codec data */ g_value_init (&value, GST_TYPE_BUFFER); gst_value_deserialize (&value, ""); codec_data = gst_value_get_buffer (&value); caps = gst_caps_new_simple ("video/x-svq", "svqversion", G_TYPE_INT, 3, "width", G_TYPE_INT, rtpsv3vdepay->width, "height", G_TYPE_INT, rtpsv3vdepay->height, "codec_data", GST_TYPE_BUFFER, codec_data, NULL); gst_pad_set_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload), caps); gst_caps_unref (caps); g_value_unset (&value); return NULL; } /* store data in adapter, stip off 2 bytes header */ outbuf = gst_rtp_buffer_get_payload_subbuffer (buf, 2, -1); gst_adapter_push (rtpsv3vdepay->adapter, outbuf); if (M) { /* frame is completed: push contents of adapter */ guint avail; guint8 *data; guint32 timestamp; avail = gst_adapter_available (rtpsv3vdepay->adapter); data = gst_adapter_take (rtpsv3vdepay->adapter, avail); /* create buffer with data */ outbuf = gst_rtp_buffer_new_take_data (data, avail); /* timestamp for complete buffer is that of last buffer as well */ timestamp = gst_rtp_buffer_get_timestamp (buf); GST_BUFFER_TIMESTAMP (outbuf) = gst_util_uint64_scale_int (timestamp, GST_SECOND, depayload->clock_rate); gst_buffer_set_caps (outbuf, GST_PAD_CAPS (depayload->srcpad)); return outbuf; return NULL; /* ERRORS */ bad_packet: GST_ELEMENT_WARNING (rtpsv3vdepay, STREAM, DECODE, ("Packet did not validate"), (NULL)); return NULL; gst_rtp_sv3v_depay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) switch (prop_id) { default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; gst_rtp_sv3v_depay_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) static GstStateChangeReturn gst_rtp_sv3v_depay_change_state (GstElement * element, GstStateChange transition) GstStateChangeReturn ret; rtpsv3vdepay = GST_RTP_SV3V_DEPAY (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: case GST_STATE_CHANGE_READY_TO_PAUSED: gst_adapter_clear (rtpsv3vdepay->adapter); ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); case GST_STATE_CHANGE_READY_TO_NULL: return ret; gst_rtp_sv3v_depay_plugin_init (GstPlugin * plugin) return gst_element_register (plugin, "rtpsv3vdepay", GST_RANK_NONE, GST_TYPE_RTP_SV3V_DEPAY); --- NEW FILE: gstrtpsv3vdepay.h --- #ifndef __GST_RTP_SV3V_DEPAY_H__ #define __GST_RTP_SV3V_DEPAY_H__ #include <gst/gst.h> #include <gst/base/gstadapter.h> #include <gst/rtp/gstbasertpdepayload.h> G_BEGIN_DECLS #define GST_TYPE_RTP_SV3V_DEPAY \ (gst_rtp_sv3v_depay_get_type()) #define GST_RTP_SV3V_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_SV3V_DEPAY,GstRtpSV3VDepay)) #define GST_RTP_SV3V_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_SV3V_DEPAY,GstRtpSV3VDepayClass)) #define GST_IS_RTP_SV3V_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_SV3V_DEPAY)) #define GST_IS_RTP_SV3V_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_SV3V_DEPAY)) typedef struct _GstRtpSV3VDepay GstRtpSV3VDepay; typedef struct _GstRtpSV3VDepayClass GstRtpSV3VDepayClass; struct _GstRtpSV3VDepay GstBaseRTPDepayload depayload; GstAdapter *adapter; guint16 nextseq; guint width; guint height; struct _GstRtpSV3VDepayClass GstBaseRTPDepayloadClass parent_class; gboolean gst_rtp_sv3v_depay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_SV3V_DEPAY_H__ */ |
From: <wt...@ke...> - 2006-08-21 10:46:36
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Mon Aug 21 2006 10:46:33 UTC Log message: * gst/rtp/Makefile.am: Fix the build again. Modified files: . : ChangeLog gst/rtp : Makefile.am Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2503&r2=1.2504 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/Makefile.am.diff?r1=1.29&r2=1.30 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2503 retrieving revision 1.2504 diff -u -d -r1.2503 -r1.2504 --- ChangeLog 21 Aug 2006 09:21:27 -0000 1.2503 +++ ChangeLog 21 Aug 2006 10:46:21 -0000 1.2504 @@ -1,3 +1,8 @@ +2006-08-21 Wim Taymans <wi...@fl...> + + * gst/rtp/Makefile.am: + Fix the build again. 2006-08-21 Stefan Kost <en...@us...> * gst/audiofxgood/.cvsignore: Index: Makefile.am RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/Makefile.am,v retrieving revision 1.29 retrieving revision 1.30 diff -u -d -r1.29 -r1.30 --- Makefile.am 18 Aug 2006 16:52:21 -0000 1.29 +++ Makefile.am 21 Aug 2006 10:46:21 -0000 1.30 @@ -66,4 +66,4 @@ gstasteriskh263.h \ gstrtpspeexdepay.h \ gstrtpspeexpay.h \ - gstrtpsv3vdepay.c + gstrtpsv3vdepay.h |
From: <wt...@ke...> - 2006-09-20 16:09:16
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Wed Sep 20 2006 16:09:15 UTC Log message: * gst/rtp/gstrtp.c: (plugin_init): * gst/rtp/gstrtpasfdepay.c: (gst_rtp_asf_depay_base_init), (gst_rtp_asf_depay_class_init), (gst_rtp_asf_depay_init), (decode_base64), (gst_rtp_asf_depay_setcaps), (gst_rtp_asf_depay_process), (gst_rtp_asf_depay_set_property), (gst_rtp_asf_depay_get_property), (gst_rtp_asf_depay_change_state), (gst_rtp_asf_depay_plugin_init): * gst/rtp/gstrtpasfdepay.h: Added preliminary ASF depayloader. * gst/rtp/gstrtph264depay.c: (decode_base64): Fix base64 decoding. Modified files: . : ChangeLog gst/rtp : gstrtp.c gstrtph264depay.c Added files: gst/rtp : gstrtpasfdepay.c gstrtpasfdepay.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2550&r2=1.2551 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtp.c.diff?r1=1.27&r2=1.28 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpasfdepay.c?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpasfdepay.h?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtph264depay.c.diff?r1=1.2&r2=1.3 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2550 retrieving revision 1.2551 diff -u -d -r1.2550 -r1.2551 --- ChangeLog 20 Sep 2006 16:06:27 -0000 1.2550 +++ ChangeLog 20 Sep 2006 16:09:03 -0000 1.2551 @@ -1,5 +1,20 @@ 2006-09-20 Wim Taymans <wi...@fl...> + * gst/rtp/gstrtp.c: (plugin_init): + * gst/rtp/gstrtpasfdepay.c: (gst_rtp_asf_depay_base_init), + (gst_rtp_asf_depay_class_init), (gst_rtp_asf_depay_init), + (decode_base64), (gst_rtp_asf_depay_setcaps), + (gst_rtp_asf_depay_process), (gst_rtp_asf_depay_set_property), + (gst_rtp_asf_depay_get_property), (gst_rtp_asf_depay_change_state), + (gst_rtp_asf_depay_plugin_init): + * gst/rtp/gstrtpasfdepay.h: + Added preliminary ASF depayloader. + + * gst/rtp/gstrtph264depay.c: (decode_base64): + Fix base64 decoding. +2006-09-20 Wim Taymans <wi...@fl...> * gst/rtsp/URLS: Added some test URLS. Index: gstrtp.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtp.c,v retrieving revision 1.27 retrieving revision 1.28 diff -u -d -r1.27 -r1.28 --- gstrtp.c 18 Aug 2006 16:52:21 -0000 1.27 +++ gstrtp.c 20 Sep 2006 16:09:03 -0000 1.28 @@ -21,6 +21,7 @@ #include "config.h" #endif +#include "gstrtpasfdepay.h" #include "gstrtpdepay.h" #include "gstrtppcmupay.h" #include "gstrtppcmapay.h" @@ -49,6 +50,9 @@ static gboolean plugin_init (GstPlugin * plugin) { + if (!gst_rtp_asf_depay_plugin_init (plugin)) + return FALSE; if (!gst_rtp_depay_plugin_init (plugin)) return FALSE; --- NEW FILE: gstrtpasfdepay.c --- /* GStreamer * Copyright (C) <2005> Wim Taymans <wi...@fl...> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include <gst/rtp/gstrtpbuffer.h> #include <string.h> #include "gstrtpasfdepay.h" /* elementfactory information */ static const GstElementDetails gst_rtp_asfdepay_details = GST_ELEMENT_DETAILS ("RTP packet parser", "Codec/Depay/Network", "Extracts ASF from RTP packets", "Wim Taymans <wi...@fl...>"); /* RtpASFDepay signals and args */ enum { /* FILL ME */ LAST_SIGNAL }; ARG_0, static GstStaticPadTemplate gst_rtp_asf_depay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/x-ms-asf") ); static GstStaticPadTemplate gst_rtp_asf_depay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) { \"video\", \"audio\" }, " "clock-rate = (int) [1, MAX ], " "encoding-name = (string) \"x-asf-pf\"" /* All optional parameters * * "config=" */ ) GST_BOILERPLATE (GstRtpASFDepay, gst_rtp_asf_depay, GstBaseRTPDepayload, GST_TYPE_BASE_RTP_DEPAYLOAD); static gboolean gst_rtp_asf_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps); static GstBuffer *gst_rtp_asf_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf); static void gst_rtp_asf_depay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_rtp_asf_depay_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static GstStateChangeReturn gst_rtp_asf_depay_change_state (GstElement * element, GstStateChange transition); static void gst_rtp_asf_depay_base_init (gpointer klass) GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&gst_rtp_asf_depay_src_template)); gst_static_pad_template_get (&gst_rtp_asf_depay_sink_template)); gst_element_class_set_details (element_class, &gst_rtp_asfdepay_details); } gst_rtp_asf_depay_class_init (GstRtpASFDepayClass * klass) GObjectClass *gobject_class; GstElementClass *gstelement_class; GstBaseRTPDepayloadClass *gstbasertpdepayload_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; parent_class = g_type_class_peek_parent (klass); gstbasertpdepayload_class->process = gst_rtp_asf_depay_process; gstbasertpdepayload_class->set_caps = gst_rtp_asf_depay_setcaps; gobject_class->set_property = gst_rtp_asf_depay_set_property; gobject_class->get_property = gst_rtp_asf_depay_get_property; gstelement_class->change_state = gst_rtp_asf_depay_change_state; gst_rtp_asf_depay_init (GstRtpASFDepay * rtpasfdepay, GstRtpASFDepayClass * klass) static const guint8 a2bin[256] = { 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64, 64, 64, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 64, 64, 64, 64, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 64, 64, 64, 64, 64, 64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64 static guint decode_base64 (const gchar * in, guint8 * out) guint8 v1, v2; guint len = 0; v1 = a2bin[(gint) * in]; while (v1 <= 63) { /* read 4 bytes, write 3 bytes, invalid base64 are zeroes */ v2 = a2bin[(gint) * ++in]; *out++ = (v1 << 2) | ((v2 & 0x3f) >> 4); v1 = (v2 > 63 ? 64 : a2bin[(gint) * ++in]); *out++ = (v2 << 4) | ((v1 & 0x3f) >> 2); v2 = (v1 > 63 ? 64 : a2bin[(gint) * ++in]); *out++ = (v1 << 6) | (v2 & 0x3f); len += 3; } /* move to '\0' */ while (*in != '\0') in++; /* subtract padding */ while (len > 0 && *--in == '=') len--; return len; static gboolean gst_rtp_asf_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) GstStructure *structure; GstRtpASFDepay *rtpasfdepay; GstCaps *srccaps; gint clock_rate = 1000; /* default */ const gchar *config, *maxps; GstBuffer *header; gint int_maxps; rtpasfdepay = GST_RTP_ASF_DEPAY (depayload); structure = gst_caps_get_structure (caps, 0); if (gst_structure_has_field (structure, "clock-rate")) gst_structure_get_int (structure, "clock-rate", &clock_rate); /* config contains the ASF headers in base64. */ config = gst_structure_get_string (structure, "config"); if (!config) goto no_header; /* get the packet size */ maxps = gst_structure_get_string (structure, "maxps"); if (!maxps) goto no_maxps; /* must translate to something sensible */ int_maxps = atoi (maxps); if (int_maxps == 0) /* caps seem good, configure element */ depayload->clock_rate = clock_rate; rtpasfdepay->maxps = int_maxps; /* we overshoot the new header size, base64 decodes 4 bytes to 3 bytes. * We store the header and send it as the first thing in the chain * function. */ header = gst_buffer_new_and_alloc (strlen (config)); GST_BUFFER_SIZE (header) = decode_base64 (config, GST_BUFFER_DATA (header)); /* set caps on pad and on header */ srccaps = gst_caps_new_simple ("video/x-ms-asf", NULL); gst_pad_set_caps (depayload->srcpad, srccaps); gst_buffer_set_caps (header, srccaps); gst_caps_unref (srccaps); /* push header data first */ gst_pad_push (depayload->srcpad, header); return TRUE; /* ERRORS */ no_header: { GST_ERROR_OBJECT (rtpasfdepay, "no header found in caps, no 'config' field"); return FALSE; no_maxps: "no valid 'maxps' string field found in caps"); static GstBuffer * gst_rtp_asf_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) GstBuffer *outbuf; gint payload_len, header_len; guint8 *payload; guint32 timestamp; guint16 len; gboolean K, D; if (!gst_rtp_buffer_validate (buf)) goto bad_packet; payload_len = gst_rtp_buffer_get_payload_len (buf); /* we need at least 4 bytes for the packet header */ if (payload_len < 4) payload = gst_rtp_buffer_get_payload (buf); /* 1 1 1 1 1 1 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |K|1|0|D| MBZ | MBZ | * * K = packet contains keyframe. * D = duration field is present. * MBZ = must be 0 */ K = (payload[0] & 0x80) == 0x80; D = (payload[0] & 0x10) == 0x10; * | LEN (network order) | len = GST_READ_UINT16_BE (&payload[2]); if (D) header_len = 8; else header_len = 4; GST_DEBUG_OBJECT (depayload, "payload: %d, len: %d, header: %d\n", payload_len, len, header_len); /* skip complete header including optional duration */ len -= header_len; timestamp = gst_rtp_buffer_get_timestamp (buf); if (len < rtpasfdepay->maxps) { /* need to pad with 0 to maxps */ outbuf = gst_buffer_new_and_alloc (rtpasfdepay->maxps); memcpy (GST_BUFFER_DATA (outbuf), payload + header_len, len); memset (GST_BUFFER_DATA (outbuf) + len, 0, rtpasfdepay->maxps - len); } else { outbuf = gst_rtp_buffer_get_payload_subbuffer (buf, header_len, len); gst_buffer_set_caps (outbuf, GST_PAD_CAPS (depayload->srcpad)); GST_BUFFER_TIMESTAMP (outbuf) = gst_util_uint64_scale_int (timestamp, GST_SECOND, depayload->clock_rate); GST_DEBUG ("gst_rtp_asf_depay_chain: pushing buffer of size %d", GST_BUFFER_SIZE (outbuf)); return outbuf; /* ERORRS */ bad_packet: GST_ELEMENT_WARNING (rtpasfdepay, STREAM, DECODE, ("Packet did not validate"), (NULL)); return NULL; gst_rtp_asf_depay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) rtpasfdepay = GST_RTP_ASF_DEPAY (object); switch (prop_id) { default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; gst_rtp_asf_depay_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) static GstStateChangeReturn gst_rtp_asf_depay_change_state (GstElement * element, GstStateChange transition) GstStateChangeReturn ret; rtpasfdepay = GST_RTP_ASF_DEPAY (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: case GST_STATE_CHANGE_READY_TO_PAUSED: ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); case GST_STATE_CHANGE_READY_TO_NULL: return ret; gboolean gst_rtp_asf_depay_plugin_init (GstPlugin * plugin) return gst_element_register (plugin, "rtpasfdepay", GST_RANK_NONE, GST_TYPE_RTP_ASF_DEPAY); --- NEW FILE: gstrtpasfdepay.h --- * Copyright (C) <2006> Wim Taymans <wi...@fl...> #ifndef __GST_RTP_ASF_DEPAY_H__ #define __GST_RTP_ASF_DEPAY_H__ #include <gst/gst.h> #include <gst/base/gstadapter.h> #include <gst/rtp/gstbasertpdepayload.h> G_BEGIN_DECLS #define GST_TYPE_RTP_ASF_DEPAY \ (gst_rtp_asf_depay_get_type()) #define GST_RTP_ASF_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_ASF_DEPAY,GstRtpASFDepay)) #define GST_RTP_ASF_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_ASF_DEPAY,GstRtpASFDepayClass)) #define GST_IS_RTP_ASF_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_ASF_DEPAY)) #define GST_IS_RTP_ASF_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_ASF_DEPAY)) typedef struct _GstRtpASFDepay GstRtpASFDepay; typedef struct _GstRtpASFDepayClass GstRtpASFDepayClass; struct _GstRtpASFDepay GstBaseRTPDepayload depayload; guint maxps; struct _GstRtpASFDepayClass GstBaseRTPDepayloadClass parent_class; gboolean gst_rtp_asf_depay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_ASF_DEPAY_H__ */ Index: gstrtph264depay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtph264depay.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- gstrtph264depay.c 17 Aug 2006 15:47:28 -0000 1.2 +++ gstrtph264depay.c 20 Sep 2006 16:09:03 -0000 1.3 @@ -179,7 +179,7 @@ guint len = 0; v1 = a2bin[(gint) * in]; - while (v1 < 63) { + while (v1 <= 63) { /* read 4 bytes, write 3 bytes, invalid base64 are zeroes */ v2 = a2bin[(gint) * ++in]; *out++ = (v1 << 2) | ((v2 & 0x3f) >> 4); |
From: <wt...@ke...> - 2006-09-20 16:42:05
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Wed Sep 20 2006 16:42:01 UTC Log message: * gst/rtp/Makefile.am: And makefile too. Modified files: . : ChangeLog gst/rtp : Makefile.am Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2551&r2=1.2552 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/Makefile.am.diff?r1=1.30&r2=1.31 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2551 retrieving revision 1.2552 diff -u -d -r1.2551 -r1.2552 --- ChangeLog 20 Sep 2006 16:09:03 -0000 1.2551 +++ ChangeLog 20 Sep 2006 16:41:48 -0000 1.2552 @@ -1,5 +1,10 @@ 2006-09-20 Wim Taymans <wi...@fl...> + * gst/rtp/Makefile.am: + And makefile too. + +2006-09-20 Wim Taymans <wi...@fl...> * gst/rtp/gstrtp.c: (plugin_init): * gst/rtp/gstrtpasfdepay.c: (gst_rtp_asf_depay_base_init), (gst_rtp_asf_depay_class_init), (gst_rtp_asf_depay_init), Index: Makefile.am RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/Makefile.am,v retrieving revision 1.30 retrieving revision 1.31 diff -u -d -r1.30 -r1.31 --- Makefile.am 21 Aug 2006 10:46:21 -0000 1.30 +++ Makefile.am 20 Sep 2006 16:41:48 -0000 1.31 @@ -2,6 +2,7 @@ libgstrtp_la_SOURCES = \ gstrtp.c \ + gstrtpasfdepay.c \ gstrtpdepay.c \ gstrtpmpadepay.c \ gstrtpmpapay.c \ @@ -41,6 +42,7 @@ libgstrtp_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) noinst_HEADERS = \ + gstrtpasfdepay.h \ gstrtpL16depay.h \ gstrtpL16pay.h \ gstrtpamrdepay.h \ |
From: <wt...@ke...> - 2006-09-21 09:35:27
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Thu Sep 21 2006 09:35:25 UTC Log message: * gst/rtp/README: Update README with some examples. * gst/rtp/gstrtpmp4gpay.c: (gst_rtp_mp4g_pay_init), (gst_rtp_mp4g_pay_finalize), (gst_rtp_mp4g_pay_parse_audio_config), (gst_rtp_mp4g_pay_parse_video_config), (gst_rtp_mp4g_pay_new_caps), (gst_rtp_mp4g_pay_setcaps): * gst/rtp/gstrtpmp4gpay.h: Make optional RTP parameters of type STRING, as required by the application/x-rtp caps specification. Modified files: . : ChangeLog gst/rtp : README gstrtpmp4gpay.c gstrtpmp4gpay.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2553&r2=1.2554 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/README.diff?r1=1.8&r2=1.9 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gpay.c.diff?r1=1.9&r2=1.10 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gpay.h.diff?r1=1.6&r2=1.7 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2553 retrieving revision 1.2554 diff -u -d -r1.2553 -r1.2554 --- ChangeLog 20 Sep 2006 19:37:45 -0000 1.2553 +++ ChangeLog 21 Sep 2006 09:35:13 -0000 1.2554 @@ -1,6 +1,19 @@ +2006-09-21 Wim Taymans <wi...@fl...> + + * gst/rtp/README: + Update README with some examples. + * gst/rtp/gstrtpmp4gpay.c: (gst_rtp_mp4g_pay_init), + (gst_rtp_mp4g_pay_finalize), (gst_rtp_mp4g_pay_parse_audio_config), + (gst_rtp_mp4g_pay_parse_video_config), (gst_rtp_mp4g_pay_new_caps), + (gst_rtp_mp4g_pay_setcaps): + * gst/rtp/gstrtpmp4gpay.h: + Make optional RTP parameters of type STRING, as required by the + application/x-rtp caps specification. 2006-09-20 Philippe Kalaf <philippe.kalaf at collabora.co.uk> - * gst/rtp/gstrtph263pdepay.c: + * gst/rtp/gstrtph263pdepay.c: * gst/rtp/gstrtph263ppay.c: Correctly calculate size of each H263+ RTP buffer taking into account MTU and RTP header. Index: README RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/README,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- README 23 Feb 2006 12:21:25 -0000 1.8 +++ README 21 Sep 2006 09:35:13 -0000 1.9 @@ -29,7 +29,7 @@ clock-base: (uint) [0 - MAXINT] The RTP time representing time 0 - seqnum-base: + seqnum-base: (uint) [0 - MAXINT] The RTP sequence number representing the first rtp packet encoding-name: (String) ANY @@ -76,19 +76,96 @@ possible. -TODO ----- +usage with UDP +-------------- -- implement packing up to the MTU. -- discont events in the case of packet loss -- figure out the clocking. -- implement various RFCs dealing with different payload types. - (as modules?) -- Throw-out the the caps-nego & other session control things to the - Application Developer( App ), by turning rtcp work into, signals - in gstrtpsend & props/args in gstrtprecv. - The App would then be free to use any sort of session control - protocal like RTSP.( done ) +To correctly and completely use the RTP payloaders on the sender and the +receiver you need to write an application. It is not possible to write a full +blown RTP server with a single gst-launch line. +That said, it is possible to do something functional with a few gst-launch +lines. The biggest problem when constructing a correct gst-launch line lies on +the receiver end. +The receiver needs to know about the type of the RTP data along with a set of +RTP configuration parameters. This information is usually transmitted to the +client using some sort of session description language (SDP) over some reliable +channel (HTTP/RTSP/...). +All of the required parameters to connect and use the RTP session on the +server can be found in the caps on the server end. The client receives this +information in some way (caps are converted to and from SDP, as explained above, +for example). +Some gst-launch lines: + gst-launch-0.10 -v videotestsrc ! ffenc_h263p ! rtph263ppay ! udpsink + Setting pipeline to PAUSED ... + /pipeline0/videotestsrc0.src: caps = video/x-raw-yuv, format=(fourcc)I420, + width=(int)320, height=(int)240, framerate=(fraction)30/1 + Pipeline is PREROLLING ... + .... + /pipeline0/udpsink0.sink: caps = application/x-rtp, media=(string)video, + payload=(int)96, clock-rate=(int)90000, encoding-name=(string)H263-1998, + ssrc=(guint)527842345, clock-base=(guint)1150776941, seqnum-base=(guint)30982 + Pipeline is PREROLLED ... + Setting pipeline to PLAYING ... + New clock: GstSystemClock + Write down the caps on the udpsink and set them as the caps of the UDP + receiver: + gst-launch-0.10 -v udpsrc caps="application/x-rtp, media=(string)video, + payload=(int)96, clock-rate=(int)90000, encoding-name=(string)H263-1998, + ssrc=(guint)527842345, clock-base=(guint)1150776941, seqnum-base=(guint)30982" + ! rtph263pdepay ! ffdec_h263 ! xvimagesink sync=false + The receiver now displays an h263 image. Note that the sync parameter on + xvimagesink needs to be FALSE because we do not have an RTP session manager + that controls the synchronisation in this pipeline. + Stream a quicktime file with mpeg4 video and AAC audio on port 5000 and port + 5002. + gst-launch-0.10 -v filesrc location=~/data/sincity.mp4 ! qtdemux name=d ! queue ! rtpmp4vpay ! udpsink port=5000 + d. ! queue ! rtpmp4gpay ! udpsink port=5002 + .... + /pipeline0/udpsink0.sink: caps = application/x-rtp, media=(string)video, + payload=(int)96, clock-rate=(int)90000, encoding-name=(string)MP4V-ES, + ssrc=(guint)1162703703, clock-base=(guint)816135835, seqnum-base=(guint)9294, + profile-level-id=(string)3, config=(string)000001b003000001b50900000100000001200086c5d4c307d314043c1463000001b25876694430303334 + /pipeline0/udpsink1.sink: caps = application/x-rtp, media=(string)audio, + payload=(int)96, clock-rate=(int)44100, encoding-name=(string)mpeg4-generic, + ssrc=(guint)3246149898, clock-base=(guint)4134514058, seqnum-base=(guint)57633, + encoding-params=(string)2, streamtype=(string)5, profile-level-id=(string)1, + mode=(string)AAC-hbr, config=(string)1210, sizelength=(string)13, + indexlength=(string)3, indexdeltalength=(string)3 + Again copy the caps on both sinks to the receiver launch line + gst-launch + udpsrc port=5000 caps="application/x-rtp, media=(string)video, payload=(int)96, + clock-rate=(int)90000, encoding-name=(string)MP4V-ES, ssrc=(guint)1162703703, + clock-base=(guint)816135835, seqnum-base=(guint)9294, profile-level-id=(string)3, + config=(string)000001b003000001b50900000100000001200086c5d4c307d314043c1463000001b25876694430303334" + ! rtpmp4vdepay ! ffdec_mpeg4 ! xvimagesink sync=false + udpsrc port=5002 caps="application/x-rtp, media=(string)audio, payload=(int)96, + clock-rate=(int)44100, encoding-name=(string)mpeg4-generic, ssrc=(guint)3246149898, + clock-base=(guint)4134514058, seqnum-base=(guint)57633, encoding-params=(string)2, + streamtype=(string)5, profile-level-id=(string)1, mode=(string)AAC-hbr, + config=(string)1210, sizelength=(string)13, indexlength=(string)3, + indexdeltalength=(string)3" + ! rtpmp4gdepay ! faad ! alsasink sync=false + The caps on the udpsinks can be retrieved when the server pipeline prerolled to + PAUSED. + The caps on the receiver side can be set on the UDP source elements when the + pipeline went to PAUSED. In that state no data is received from the UDP sources + as they are live sources and only produce data in PLAYING. Relevant RFCs Index: gstrtpmp4gpay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gpay.c,v retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- gstrtpmp4gpay.c 16 Jul 2006 14:31:48 -0000 1.9 +++ gstrtpmp4gpay.c 21 Sep 2006 09:35:13 -0000 1.10 @@ -56,24 +56,25 @@ "clock-rate = (int) [1, MAX ], " "encoding-name = (string) \"mpeg4-generic\", " /* required string params */ - "streamtype = (int) { \"4\", \"5\" }, " /* 4 = video, 5 = audio */ - "profile-level-id = (int) [1,MAX], " + "streamtype = (string) { \"4\", \"5\" }, " /* 4 = video, 5 = audio */ + /* "profile-level-id = (string) [1,MAX], " */ /* "config = (string) [1,MAX]" */ - "mode = (string) { \"generic\", \"CELP-cbr\", \"CELP-vbr\", \"AAC-lbr\", \"AAC-hbr\" }, " + "mode = (string) { \"generic\", \"CELP-cbr\", \"CELP-vbr\", \"AAC-lbr\", \"AAC-hbr\" } " /* Optional general parameters */ - "objecttype = (int) [1,MAX], " "constantsize = (int) [1,MAX], " /* constant size of each AU */ - "constantduration = (int) [1,MAX], " /* constant duration of each AU */ - "maxdisplacement = (int) [1,MAX], " - "de-interleavebuffersize = (int) [1,MAX], " + /* "objecttype = (string) [1,MAX], " */ + /* "constantsize = (string) [1,MAX], " *//* constant size of each AU */ + /* "constantduration = (string) [1,MAX], " *//* constant duration of each AU */ + /* "maxdisplacement = (string) [1,MAX], " */ + /* "de-interleavebuffersize = (string) [1,MAX], " */ /* Optional configuration parameters */ - "sizelength = (int) [1, 16], " /* max 16 bits, should be enough... */ - "indexlength = (int) [1, 8], " - "indexdeltalength = (int) [1, 8], " - "ctsdeltalength = (int) [1, 64], " - "dtsdeltalength = (int) [1, 64], " - "randomaccessindication = (int) {0, 1}, " - "streamstateindication = (int) [0, 64], " - "auxiliarydatasizelength = (int) [0, 64]") + /* "sizelength = (string) [1, 16], " *//* max 16 bits, should be enough... */ + /* "indexlength = (string) [1, 8], " */ + /* "indexdeltalength = (string) [1, 8], " */ + /* "ctsdeltalength = (string) [1, 64], " */ + /* "dtsdeltalength = (string) [1, 64], " */ + /* "randomaccessindication = (string) {0, 1}, " */ + /* "streamstateindication = (string) [0, 64], " */ + /* "auxiliarydatasizelength = (string) [0, 64]" */ ) ); enum @@ -167,7 +168,7 @@ { rtpmp4gpay->adapter = gst_adapter_new (); rtpmp4gpay->rate = 90000; - rtpmp4gpay->profile = 1; + rtpmp4gpay->profile = g_strdup ("1"); rtpmp4gpay->mode = ""; } @@ -180,6 +181,8 @@ g_object_unref (rtpmp4gpay->adapter); rtpmp4gpay->adapter = NULL; + g_free (rtpmp4gpay->params); + rtpmp4gpay->params = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); @@ -232,13 +235,15 @@ rtpmp4gpay->rate = sampling_table[samplingIdx]; } /* extra rtp params contain the number of channels */ - rtpmp4gpay->params = channelCfg; + rtpmp4gpay->params = g_strdup_printf ("%d", channelCfg); /* audio stream type */ - rtpmp4gpay->streamtype = 5; + rtpmp4gpay->streamtype = "5"; /* mode */ rtpmp4gpay->mode = "AAC-hbr"; /* profile (should be 1) */ - rtpmp4gpay->profile = objectType - 1; + g_free (rtpmp4gpay->profile); + rtpmp4gpay->profile = g_strdup_printf ("%d", objectType - 1); GST_DEBUG_OBJECT (rtpmp4gpay, "objectType: %d, samplingIdx: %d (%d), channelCfg: %d", objectType, @@ -290,25 +295,27 @@ goto too_short; code = GST_READ_UINT32_BE (data); if (code == VOS_STARTCODE) { /* get profile */ - rtpmp4gpay->profile = data[4]; + rtpmp4gpay->profile = g_strdup_printf ("%d", (gint) data[4]); } else { GST_ELEMENT_WARNING (rtpmp4gpay, STREAM, FORMAT, - (NULL), ("profile not found in config string")); - rtpmp4gpay->profile = 1; + (NULL), ("profile not found in config string, assuming \'1\'")); + rtpmp4gpay->profile = g_strdup ("1"); /* fixed rate */ /* video stream type */ - rtpmp4gpay->streamtype = 4; + rtpmp4gpay->streamtype = "4"; /* no params for video */ - rtpmp4gpay->params = 0; rtpmp4gpay->mode = "generic"; - GST_LOG_OBJECT (rtpmp4gpay, "profile %d", rtpmp4gpay->profile); + GST_LOG_OBJECT (rtpmp4gpay, "profile %s", rtpmp4gpay->profile); return TRUE; @@ -327,14 +334,14 @@ gchar *config; GValue v = { 0 }; -#define MP4GCAPS \ - "streamtype", G_TYPE_INT, rtpmp4gpay->streamtype, \ - "profile-level-id", G_TYPE_INT, rtpmp4gpay->profile, \ - "mode", G_TYPE_STRING, rtpmp4gpay->mode, \ - "config", G_TYPE_STRING, config, \ - "sizelength", G_TYPE_INT, 13, \ - "indexlength", G_TYPE_INT, 3, \ - "indexdeltalength", G_TYPE_INT, 3, \ +#define MP4GCAPS \ + "streamtype", G_TYPE_STRING, rtpmp4gpay->streamtype, \ + "profile-level-id", G_TYPE_STRING, rtpmp4gpay->profile, \ + "mode", G_TYPE_STRING, rtpmp4gpay->mode, \ + "config", G_TYPE_STRING, config, \ + "sizelength", G_TYPE_STRING, "13", \ + "indexlength", G_TYPE_STRING, "3", \ + "indexdeltalength", G_TYPE_STRING, "3", \ NULL g_value_init (&v, GST_TYPE_BUFFER); @@ -344,7 +351,7 @@ /* hmm, silly */ if (rtpmp4gpay->params) { gst_basertppayload_set_outcaps (GST_BASE_RTP_PAYLOAD (rtpmp4gpay), - "encoding-params", G_TYPE_INT, rtpmp4gpay->params, MP4GCAPS); + "encoding-params", G_TYPE_STRING, rtpmp4gpay->params, MP4GCAPS); MP4GCAPS); Index: gstrtpmp4gpay.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gpay.h,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- gstrtpmp4gpay.h 1 Jun 2006 21:07:25 -0000 1.6 +++ gstrtpmp4gpay.h 21 Sep 2006 09:35:13 -0000 1.7 @@ -49,9 +49,9 @@ GstClockTime duration; gint rate; - gint params; - gint profile; - gint streamtype; + gchar *params; + gchar *profile; + const gchar *streamtype; const gchar *mode; GstBuffer *config; }; |
From: <wt...@ke...> - 2006-09-21 13:33:29
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Thu Sep 21 2006 13:33:28 UTC Log message: * gst/rtp/gstrtpmp4gpay.c: (gst_rtp_mp4g_pay_parse_audio_config): Fix profile-level-id parsing and setup. Modified files: . : ChangeLog gst/rtp : gstrtpmp4gpay.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2555&r2=1.2556 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gpay.c.diff?r1=1.10&r2=1.11 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2555 retrieving revision 1.2556 diff -u -d -r1.2555 -r1.2556 --- ChangeLog 21 Sep 2006 09:50:41 -0000 1.2555 +++ ChangeLog 21 Sep 2006 13:33:15 -0000 1.2556 @@ -1,5 +1,10 @@ 2006-09-21 Wim Taymans <wi...@fl...> + * gst/rtp/gstrtpmp4gpay.c: (gst_rtp_mp4g_pay_parse_audio_config): + Fix profile-level-id parsing and setup. + +2006-09-21 Wim Taymans <wi...@fl...> * gst/udp/README: * gst/udp/gstudpsrc.c: (gst_udpsrc_set_property): Update README, simple cleanup. Index: gstrtpmp4gpay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gpay.c,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- gstrtpmp4gpay.c 21 Sep 2006 09:35:13 -0000 1.10 +++ gstrtpmp4gpay.c 21 Sep 2006 13:33:16 -0000 1.11 @@ -208,10 +208,10 @@ if (size < 2) goto too_short; - /* only AAC LC for now */ + /* any object type is fine, we need to copy it to the profile-level-id field. */ objectType = (data[0] & 0xf8) >> 3; - if (objectType != 2) - goto unsupported_type; + if (objectType == 0) + goto invalid_object; samplingIdx = ((data[0] & 0x07) << 1) | ((data[1] & 0x80) >> 7); /* only fixed values for now */ @@ -239,11 +239,11 @@ rtpmp4gpay->params = g_strdup_printf ("%d", channelCfg); /* audio stream type */ rtpmp4gpay->streamtype = "5"; - /* mode */ + /* mode only high bitrate for now */ rtpmp4gpay->mode = "AAC-hbr"; - /* profile (should be 1) */ + /* profile */ g_free (rtpmp4gpay->profile); - rtpmp4gpay->profile = g_strdup_printf ("%d", objectType - 1); + rtpmp4gpay->profile = g_strdup_printf ("%d", objectType); GST_DEBUG_OBJECT (rtpmp4gpay, "objectType: %d, samplingIdx: %d (%d), channelCfg: %d", objectType, @@ -255,13 +255,13 @@ too_short: { GST_ELEMENT_ERROR (rtpmp4gpay, STREAM, FORMAT, - (NULL), ("config string too short")); + (NULL), ("config string too short, expected 2 bytes, got %d", size)); return FALSE; } -unsupported_type: +invalid_object: - GST_ELEMENT_ERROR (rtpmp4gpay, STREAM, NOT_IMPLEMENTED, - (NULL), ("unsupported object type %d", objectType)); + GST_ELEMENT_ERROR (rtpmp4gpay, STREAM, FORMAT, + (NULL), ("invalid object type 0")); wrong_freq: @@ -273,7 +273,7 @@ wrong_channels: GST_ELEMENT_ERROR (rtpmp4gpay, STREAM, NOT_IMPLEMENTED, - (NULL), ("unsupported number of channels %d", channelCfg)); + (NULL), ("unsupported number of channels %d, must < 8", channelCfg)); } |
From: <wt...@ke...> - 2006-09-22 12:08:28
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Fri Sep 22 2006 12:08:26 UTC Log message: * gst/rtp/gstrtpL16depay.c: (gst_rtp_L16depay_change_state): * gst/rtp/gstrtpmp4gdepay.c: (gst_rtp_mp4g_depay_class_init): Small cleanups. * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: (plugin_init): * gst/rtp/gstrtpvorbisdepay.c: (gst_rtp_vorbis_depay_base_init), (gst_rtp_vorbis_depay_class_init), (gst_rtp_vorbis_depay_init), (gst_rtp_vorbis_depay_finalize), (gst_rtp_vorbis_depay_setcaps), (gst_rtp_vorbis_depay_process), (gst_rtp_vorbis_depay_set_property), (gst_rtp_vorbis_depay_get_property), (gst_rtp_vorbis_depay_change_state), (gst_rtp_vorbis_depay_plugin_init): * gst/rtp/gstrtpvorbisdepay.h: * gst/rtp/gstrtpvorbispay.c: (gst_rtp_vorbis_pay_base_init), (gst_rtp_vorbis_pay_class_init), (gst_rtp_vorbis_pay_init), (gst_rtp_vorbis_pay_setcaps), (gst_rtp_vorbis_pay_init_packet), (gst_rtp_vorbis_pay_flush_packet), (gst_rtp_vorbis_pay_append_buffer), (gst_rtp_vorbis_pay_handle_buffer), (gst_rtp_vorbis_pay_plugin_init): * gst/rtp/gstrtpvorbispay.h: Add experimental vorbis pay and depayloaders. Modified files: . : ChangeLog gst/rtp : Makefile.am gstrtp.c gstrtpL16depay.c gstrtpmp4gdepay.c Added files: gst/rtp : gstrtpvorbisdepay.c gstrtpvorbisdepay.h gstrtpvorbispay.c gstrtpvorbispay.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2556&r2=1.2557 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/Makefile.am.diff?r1=1.31&r2=1.32 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtp.c.diff?r1=1.28&r2=1.29 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpL16depay.c.diff?r1=1.22&r2=1.23 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gdepay.c.diff?r1=1.2&r2=1.3 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpvorbisdepay.c?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpvorbisdepay.h?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpvorbispay.c?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpvorbispay.h?rev=1.1&content-type=text/vnd.viewcvs-markup ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2556 retrieving revision 1.2557 diff -u -d -r1.2556 -r1.2557 --- ChangeLog 21 Sep 2006 13:33:15 -0000 1.2556 +++ ChangeLog 22 Sep 2006 12:08:14 -0000 1.2557 @@ -1,3 +1,30 @@ +2006-09-22 Wim Taymans <wi...@fl...> + + * gst/rtp/gstrtpL16depay.c: (gst_rtp_L16depay_change_state): + * gst/rtp/gstrtpmp4gdepay.c: (gst_rtp_mp4g_depay_class_init): + Small cleanups. + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: (plugin_init): + * gst/rtp/gstrtpvorbisdepay.c: (gst_rtp_vorbis_depay_base_init), + (gst_rtp_vorbis_depay_class_init), (gst_rtp_vorbis_depay_init), + (gst_rtp_vorbis_depay_finalize), (gst_rtp_vorbis_depay_setcaps), + (gst_rtp_vorbis_depay_process), + (gst_rtp_vorbis_depay_set_property), + (gst_rtp_vorbis_depay_get_property), + (gst_rtp_vorbis_depay_change_state), + (gst_rtp_vorbis_depay_plugin_init): + * gst/rtp/gstrtpvorbisdepay.h: + * gst/rtp/gstrtpvorbispay.c: (gst_rtp_vorbis_pay_base_init), + (gst_rtp_vorbis_pay_class_init), (gst_rtp_vorbis_pay_init), + (gst_rtp_vorbis_pay_setcaps), (gst_rtp_vorbis_pay_init_packet), + (gst_rtp_vorbis_pay_flush_packet), + (gst_rtp_vorbis_pay_append_buffer), + (gst_rtp_vorbis_pay_handle_buffer), + (gst_rtp_vorbis_pay_plugin_init): + * gst/rtp/gstrtpvorbispay.h: + Add experimental vorbis pay and depayloaders. 2006-09-21 Wim Taymans <wi...@fl...> * gst/rtp/gstrtpmp4gpay.c: (gst_rtp_mp4g_pay_parse_audio_config): Index: Makefile.am RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/Makefile.am,v retrieving revision 1.31 retrieving revision 1.32 diff -u -d -r1.31 -r1.32 --- Makefile.am 20 Sep 2006 16:41:48 -0000 1.31 +++ Makefile.am 22 Sep 2006 12:08:14 -0000 1.32 @@ -26,7 +26,9 @@ gstrtpmp4gpay.c \ gstrtpspeexdepay.c \ gstrtpspeexpay.c \ - gstrtpsv3vdepay.c + gstrtpsv3vdepay.c \ + gstrtpvorbisdepay.c \ + gstrtpvorbispay.c #gstrtpL16pay.c gstrtpL16depay.c @@ -68,4 +70,6 @@ gstasteriskh263.h \ gstrtpspeexdepay.h \ gstrtpspeexpay.h \ - gstrtpsv3vdepay.h + gstrtpsv3vdepay.h \ + gstrtpvorbisdepay.h \ + gstrtpvorbispay.h Index: gstrtp.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtp.c,v retrieving revision 1.28 retrieving revision 1.29 diff -u -d -r1.28 -r1.29 --- gstrtp.c 20 Sep 2006 16:09:03 -0000 1.28 +++ gstrtp.c 22 Sep 2006 12:08:14 -0000 1.29 @@ -46,6 +46,8 @@ #include "gstrtpspeexpay.h" #include "gstrtpspeexdepay.h" #include "gstrtpsv3vdepay.h" +#include "gstrtpvorbisdepay.h" +#include "gstrtpvorbispay.h" static gboolean plugin_init (GstPlugin * plugin) @@ -125,6 +127,12 @@ if (!gst_rtp_sv3v_depay_plugin_init (plugin)) return FALSE; + if (!gst_rtp_vorbis_depay_plugin_init (plugin)) + return FALSE; + if (!gst_rtp_vorbis_pay_plugin_init (plugin)) return TRUE; } Index: gstrtpL16depay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpL16depay.c,v retrieving revision 1.22 retrieving revision 1.23 diff -u -d -r1.22 -r1.23 --- gstrtpL16depay.c 22 May 2006 13:51:30 -0000 1.22 +++ gstrtpL16depay.c 22 Sep 2006 12:08:14 -0000 1.23 @@ -318,28 +318,30 @@ gst_rtp_L16depay_change_state (GstElement * element, GstStateChange transition) { GstRtpL16Depay *rtpL16depay; - - g_return_val_if_fail (GST_IS_RTP_L16_DEPAY (element), - GST_STATE_CHANGE_FAILURE); + GstStateChangeReturn ret; rtpL16depay = GST_RTP_L16_DEPAY (element); GST_DEBUG ("state pending %d\n", GST_STATE_PENDING (element)); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: break; + default: + break; + } + /* if we haven't failed already, give the parent class a chance to ;-) */ + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + switch (transition) { case GST_STATE_CHANGE_READY_TO_NULL: default: } - /* if we haven't failed already, give the parent class a chance to ;-) */ - if (GST_ELEMENT_CLASS (parent_class)->change_state) - return GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); - return GST_STATE_CHANGE_SUCCESS; + return ret; gboolean Index: gstrtpmp4gdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gdepay.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- gstrtpmp4gdepay.c 16 Aug 2006 10:05:00 -0000 1.2 +++ gstrtpmp4gdepay.c 22 Sep 2006 12:08:14 -0000 1.3 @@ -128,7 +128,6 @@ gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; parent_class = g_type_class_peek_parent (klass); --- NEW FILE: gstrtpvorbisdepay.c --- /* GStreamer * Copyright (C) <2006> Wim Taymans <wi...@fl...> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include <gst/rtp/gstrtpbuffer.h> #include <string.h> #include "gstrtpvorbisdepay.h" GST_DEBUG_CATEGORY_STATIC (rtpvorbisdepay_debug); #define GST_CAT_DEFAULT (rtpvorbisdepay_debug) /* elementfactory information */ static const GstElementDetails gst_rtp_vorbis_depay_details = GST_ELEMENT_DETAILS ("RTP packet parser", "Codec/Depay/Network", "Extracts Vorbis Audio from RTP packets (draft-01 of RFC XXXX)", "Wim Taymans <wi...@fl...>"); /* RtpVorbisDepay signals and args */ enum { /* FILL ME */ LAST_SIGNAL }; ARG_0, static GstStaticPadTemplate gst_rtp_vorbis_depay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"audio\", " "clock-rate = (int) [1, MAX ], " "encoding-name = (string) \"vorbis\"" /* All required parameters * * "encoding-params = (string) <num channels>" * "delivery-method = (string) { inline, in_band, out_band/<specific_name> } " * "configuration = (string) ANY" */ /* All optional parameters * "configuration-uri =" ) ); static GstStaticPadTemplate gst_rtp_vorbis_depay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_STATIC_CAPS ("audio/x-vorbis") GST_BOILERPLATE (GstRtpVorbisDepay, gst_rtp_vorbis_depay, GstBaseRTPDepayload, GST_TYPE_BASE_RTP_DEPAYLOAD); static gboolean gst_rtp_vorbis_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps); static GstBuffer *gst_rtp_vorbis_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf); static void gst_rtp_vorbis_depay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_rtp_vorbis_depay_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_rtp_vorbis_depay_finalize (GObject * object); static GstStateChangeReturn gst_rtp_vorbis_depay_change_state (GstElement * element, GstStateChange transition); static void gst_rtp_vorbis_depay_base_init (gpointer klass) GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&gst_rtp_vorbis_depay_sink_template)); gst_static_pad_template_get (&gst_rtp_vorbis_depay_src_template)); gst_element_class_set_details (element_class, &gst_rtp_vorbis_depay_details); } gst_rtp_vorbis_depay_class_init (GstRtpVorbisDepayClass * klass) GObjectClass *gobject_class; GstElementClass *gstelement_class; GstBaseRTPDepayloadClass *gstbasertpdepayload_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; gobject_class->set_property = gst_rtp_vorbis_depay_set_property; gobject_class->get_property = gst_rtp_vorbis_depay_get_property; gobject_class->finalize = gst_rtp_vorbis_depay_finalize; gstelement_class->change_state = gst_rtp_vorbis_depay_change_state; gstbasertpdepayload_class->process = gst_rtp_vorbis_depay_process; gstbasertpdepayload_class->set_caps = gst_rtp_vorbis_depay_setcaps; GST_DEBUG_CATEGORY_INIT (rtpvorbisdepay_debug, "rtpvorbisdepay", 0, "Vorbis RTP Depayloader"); gst_rtp_vorbis_depay_init (GstRtpVorbisDepay * rtpvorbisdepay, GstRtpVorbisDepayClass * klass) rtpvorbisdepay->adapter = gst_adapter_new (); gst_rtp_vorbis_depay_finalize (GObject * object) GstRtpVorbisDepay *rtpvorbisdepay = GST_RTP_VORBIS_DEPAY (object); g_object_unref (rtpvorbisdepay->adapter); G_OBJECT_CLASS (parent_class)->finalize (object); static gboolean gst_rtp_vorbis_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) GstStructure *structure; GstRtpVorbisDepay *rtpvorbisdepay; GstCaps *srccaps; gint clock_rate; rtpvorbisdepay = GST_RTP_VORBIS_DEPAY (depayload); structure = gst_caps_get_structure (caps, 0); if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) goto no_rate; /* caps seem good, configure element */ depayload->clock_rate = clock_rate; /* set caps on pad and on header */ srccaps = gst_caps_new_simple ("audio/x-vorbis", NULL); gst_pad_set_caps (depayload->srcpad, srccaps); gst_caps_unref (srccaps); return TRUE; no_rate: { GST_ERROR_OBJECT (rtpvorbisdepay, "no clock-rate specified"); return FALSE; } static GstBuffer * gst_rtp_vorbis_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) GstBuffer *outbuf; GstFlowReturn ret; gint payload_len; guint8 *payload, *to_free = NULL; guint32 timestamp; guint32 header, ident; guint8 F, VDT, packets; gboolean free_payload; if (!gst_rtp_buffer_validate (buf)) goto bad_packet; payload_len = gst_rtp_buffer_get_payload_len (buf); GST_DEBUG_OBJECT (depayload, "got RTP packet of size %d", payload_len); /* we need at least 4 bytes for the packet header */ if (payload_len < 4) goto packet_short; payload = gst_rtp_buffer_get_payload (buf); free_payload = FALSE; header = GST_READ_UINT32_BE (payload); /* * 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Ident | F |VDT|# pkts.| * * F: Fragment type (0=none, 1=start, 2=cont, 3=end) * VDT: Vorbis data type (0=vorbis, 1=config, 2=comment, 3=reserved) * pkts: number of packets. */ VDT = (header & 0x30) >> 4; if (VDT == 3) goto ignore_reserved; ident = (header >> 8) & 0xffffff; F = (header & 0xc0) >> 6; packets = (header & 0xf); if (VDT == 0) { /* FIXME, if we have a raw payload, we need the codebook for the ident */ /* skip header */ payload += 4; payload_len -= 4; GST_DEBUG_OBJECT (depayload, "ident: %u, F: %d, packets: %d", ident, F, packets); /* fragmented packets, assemble */ if (F != 0) { GstBuffer *vdata; guint headerskip; if (F == 1) { /* if we start a packet, clear adapter and start assembling. */ gst_adapter_clear (rtpvorbisdepay->adapter); GST_DEBUG_OBJECT (depayload, "start assemble"); rtpvorbisdepay->assembling = TRUE; } if (!rtpvorbisdepay->assembling) goto no_output; /* first assembled packet, reuse 2 bytes to store the length */ headerskip = (F == 1 ? 4 : 6); /* skip header and length. */ vdata = gst_rtp_buffer_get_payload_subbuffer (buf, headerskip, -1); GST_DEBUG_OBJECT (depayload, "assemble vorbis packet"); gst_adapter_push (rtpvorbisdepay->adapter, vdata); /* packet is not complete, we are done */ if (F != 3) /* construct assembled buffer */ payload_len = gst_adapter_available (rtpvorbisdepay->adapter); payload = gst_adapter_take (rtpvorbisdepay->adapter, payload_len); payload[0] = ((payload_len - 2) >> 8) & 0xff; payload[1] = (payload_len - 2) & 0xff; to_free = payload; GST_DEBUG_OBJECT (depayload, "assemble done"); /* we not assembling anymore now */ rtpvorbisdepay->assembling = FALSE; gst_adapter_clear (rtpvorbisdepay->adapter); /* payload now points to a length with that many vorbis data bytes. * Iterate over the packets and send them out. * | length | vorbis data .. * .. vorbis data | * | length | next vorbis packet data .. * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+* timestamp = gst_rtp_buffer_get_timestamp (buf); while (payload_len > 2) { guint16 length; length = GST_READ_UINT16_BE (payload); payload += 2; payload_len -= 2; GST_DEBUG_OBJECT (depayload, "read length %u, avail: %d", length, payload_len); /* skip packet if something odd happens */ if (length > payload_len) goto length_short; /* create buffer for packet */ if (to_free) { outbuf = gst_buffer_new (); GST_BUFFER_DATA (outbuf) = payload; GST_BUFFER_MALLOCDATA (outbuf) = to_free; GST_BUFFER_SIZE (outbuf) = length; to_free = NULL; } else { outbuf = gst_buffer_new_and_alloc (length); memcpy (GST_BUFFER_DATA (outbuf), payload, length); payload += length; payload_len -= length; if (timestamp != -1) /* push with timestamp of the last packet, which is the same timestamp that * should apply to the first assembled packet. */ ret = gst_base_rtp_depayload_push_ts (depayload, timestamp, outbuf); else ret = gst_base_rtp_depayload_push (depayload, outbuf); if (ret != GST_FLOW_OK) break; /* make sure we don't set a timestamp on next buffers */ timestamp = -1; g_free (to_free); return NULL; no_output: return NULL; /* ERORRS */ bad_packet: GST_ELEMENT_WARNING (rtpvorbisdepay, STREAM, DECODE, ("Packet did not validate"), (NULL)); packet_short: ("Packet was too short (%d < 4)", payload_len), (NULL)); ignore_reserved: GST_WARNING_OBJECT (rtpvorbisdepay, "reserved VDT ignored"); length_short: ("Packet contains invalid data"), (NULL)); gst_rtp_vorbis_depay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) rtpvorbisdepay = GST_RTP_VORBIS_DEPAY (object); switch (prop_id) { default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); gst_rtp_vorbis_depay_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) static GstStateChangeReturn gst_rtp_vorbis_depay_change_state (GstElement * element, GstStateChange transition) GstStateChangeReturn ret; rtpvorbisdepay = GST_RTP_VORBIS_DEPAY (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: case GST_STATE_CHANGE_READY_TO_PAUSED: ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); case GST_STATE_CHANGE_READY_TO_NULL: return ret; gboolean gst_rtp_vorbis_depay_plugin_init (GstPlugin * plugin) return gst_element_register (plugin, "rtpvorbisdepay", GST_RANK_NONE, GST_TYPE_RTP_VORBIS_DEPAY); --- NEW FILE: gstrtpvorbisdepay.h --- #ifndef __GST_RTP_VORBIS_DEPAY_H__ #define __GST_RTP_VORBIS_DEPAY_H__ #include <gst/gst.h> #include <gst/base/gstadapter.h> #include <gst/rtp/gstbasertpdepayload.h> G_BEGIN_DECLS #define GST_TYPE_RTP_VORBIS_DEPAY \ (gst_rtp_vorbis_depay_get_type()) #define GST_RTP_VORBIS_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_VORBIS_DEPAY,GstRtpVorbisDepay)) #define GST_RTP_VORBIS_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_VORBIS_DEPAY,GstRtpVorbisDepayClass)) #define GST_IS_RTP_VORBIS_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_VORBIS_DEPAY)) #define GST_IS_RTP_VORBIS_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_VORBIS_DEPAY)) typedef struct _GstRtpVorbisDepay GstRtpVorbisDepay; typedef struct _GstRtpVorbisDepayClass GstRtpVorbisDepayClass; struct _GstRtpVorbisDepay GstBaseRTPDepayload parent; GstAdapter *adapter; gboolean assembling; struct _GstRtpVorbisDepayClass GstBaseRTPDepayloadClass parent_class; gboolean gst_rtp_vorbis_depay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_VORBIS_DEPAY_H__ */ --- NEW FILE: gstrtpvorbispay.c --- #include "gstrtpvorbispay.h" GST_DEBUG_CATEGORY_STATIC (rtpvorbispay_debug); #define GST_CAT_DEFAULT (rtpvorbispay_debug) /* references: * http://svn.xiph.org/trunk/vorbis/doc/draft-ietf-avt-rtp-vorbis-01.txt static const GstElementDetails gst_rtp_vorbispay_details = "Codec/Payloader/Network", "Payload-encode Vorbis audio into RTP packets (draft-01 RFC XXXX)", static GstStaticPadTemplate gst_rtp_vorbis_pay_src_template = "payload = (int) [ 96, 127 ], " /* All required parameters * "delivery-method = (string) { inline, in_band, out_band/<specific_name> } " * "configuration = (string) ANY" * "configuration-uri =" static GstStaticPadTemplate gst_rtp_vorbis_pay_sink_template = GST_BOILERPLATE (GstRtpVorbisPay, gst_rtp_vorbis_pay, GstBaseRTPPayload, GST_TYPE_BASE_RTP_PAYLOAD); static gboolean gst_rtp_vorbis_pay_setcaps (GstBaseRTPPayload * basepayload, static GstFlowReturn gst_rtp_vorbis_pay_handle_buffer (GstBaseRTPPayload * pad, GstBuffer * buffer); gst_rtp_vorbis_pay_base_init (gpointer klass) gst_static_pad_template_get (&gst_rtp_vorbis_pay_src_template)); gst_static_pad_template_get (&gst_rtp_vorbis_pay_sink_template)); gst_element_class_set_details (element_class, &gst_rtp_vorbispay_details); gst_rtp_vorbis_pay_class_init (GstRtpVorbisPayClass * klass) GstBaseRTPPayloadClass *gstbasertppayload_class; gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; parent_class = g_type_class_peek_parent (klass); gstbasertppayload_class->set_caps = gst_rtp_vorbis_pay_setcaps; gstbasertppayload_class->handle_buffer = gst_rtp_vorbis_pay_handle_buffer; GST_DEBUG_CATEGORY_INIT (rtpvorbispay_debug, "rtpvorbispay", 0, "Vorbis RTP Payloader"); gst_rtp_vorbis_pay_init (GstRtpVorbisPay * rtpvorbispay, GstRtpVorbisPayClass * klass) gst_rtp_vorbis_pay_setcaps (GstBaseRTPPayload * basepayload, GstCaps * caps) GstRtpVorbisPay *rtpvorbispay; rtpvorbispay = GST_RTP_VORBIS_PAY (basepayload); gst_basertppayload_set_options (basepayload, "audio", TRUE, "vorbis", 8000); gst_basertppayload_set_outcaps (basepayload, "encoding-params", G_TYPE_STRING, "1", /* don't set the defaults */ NULL); gst_rtp_vorbis_pay_init_packet (GstRtpVorbisPay * rtpvorbispay) guint payload_len; if (rtpvorbispay->packet) gst_buffer_unref (rtpvorbispay->packet); GST_DEBUG_OBJECT (rtpvorbispay, "starting new packet"); /* new packet allocate max packet size */ rtpvorbispay->packet = gst_rtp_buffer_new_allocate_len (GST_BASE_RTP_PAYLOAD_MTU (rtpvorbispay), 0, 0); rtpvorbispay->payload_pos = 4; payload_len = gst_rtp_buffer_get_payload_len (rtpvorbispay->packet); rtpvorbispay->payload_left = payload_len - 4; rtpvorbispay->payload_duration = 0; rtpvorbispay->payload_ident = 0; rtpvorbispay->payload_F = 0; rtpvorbispay->payload_VDT = 0; rtpvorbispay->payload_pkts = 0; static GstFlowReturn gst_rtp_vorbis_pay_flush_packet (GstRtpVorbisPay * rtpvorbispay) guint8 *payload; guint hlen; /* check for empty packet */ if (!rtpvorbispay || rtpvorbispay->payload_pos <= 4) return GST_FLOW_OK; GST_DEBUG_OBJECT (rtpvorbispay, "flushing packet"); /* fix header */ payload = gst_rtp_buffer_get_payload (rtpvorbispay->packet); payload[0] = (rtpvorbispay->payload_ident >> 16) & 0xff; payload[1] = (rtpvorbispay->payload_ident >> 8) & 0xff; payload[2] = (rtpvorbispay->payload_ident) & 0xff; payload[3] = (rtpvorbispay->payload_F & 0x3) << 6 | (rtpvorbispay->payload_VDT & 0x3) << 4 | (rtpvorbispay->payload_pkts & 0xf); /* shrink the buffer size to the last written byte */ hlen = gst_rtp_buffer_calc_header_len (0); GST_BUFFER_SIZE (rtpvorbispay->packet) = hlen + rtpvorbispay->payload_pos; /* push, this gives away our ref to the packet, so clear it. */ ret = gst_basertppayload_push (GST_BASE_RTP_PAYLOAD (rtpvorbispay), rtpvorbispay->packet); rtpvorbispay->packet = NULL; /* prepare new packet */ gst_rtp_vorbis_pay_init_packet (rtpvorbispay); gst_rtp_vorbis_pay_append_buffer (GstRtpVorbisPay * rtpvorbispay, GstBuffer * buffer) GstFlowReturn res; guint size; GstClockTime duration; guint plen; guint8 *ppos, *payload, *data; gboolean fragmented; res = GST_FLOW_OK; if (rtpvorbispay->payload_left < 2) return res; size = GST_BUFFER_SIZE (buffer); /* skip packets that are too big */ if (size > 0xffff) data = GST_BUFFER_DATA (buffer); duration = GST_BUFFER_DURATION (buffer); ppos = payload + rtpvorbispay->payload_pos; fragmented = FALSE; while (size) { plen = MIN (rtpvorbispay->payload_left - 2, size); GST_DEBUG_OBJECT (rtpvorbispay, "append %u bytes", plen); ppos[0] = (plen >> 8) & 0xff; ppos[1] = (plen & 0xff); memcpy (&ppos[2], data, plen); size -= plen; data += plen; rtpvorbispay->payload_pos += plen + 2; rtpvorbispay->payload_left -= plen + 2; if (fragmented) { if (size == 0) /* last fragment, set F to 0x3. */ rtpvorbispay->payload_F = 0x3; else /* fragment continues, set F to 0x2. */ rtpvorbispay->payload_F = 0x2; if (size == 0) { /* unfragmented packet, update stats for next packet */ rtpvorbispay->payload_pkts++; if (duration != GST_CLOCK_TIME_NONE) rtpvorbispay->payload_duration += duration; } else { /* fragmented packet starts, set F to 0x1, mark ourselves as * fragmented. */ rtpvorbispay->payload_F = 0x1; fragmented = TRUE; } /* fragmented packets are always flushed and have ptks of 0 */ rtpvorbispay->payload_pkts = 0; res = gst_rtp_vorbis_pay_flush_packet (rtpvorbispay); /* get new pointers */ payload = gst_rtp_buffer_get_payload (rtpvorbispay->packet); ppos = payload + rtpvorbispay->payload_pos; return res; gst_rtp_vorbis_pay_handle_buffer (GstBaseRTPPayload * basepayload, guint size, newsize; guint packet_len; GstClockTime duration, newduration; gboolean flush; GST_DEBUG_OBJECT (rtpvorbispay, "size %u, duration %" GST_TIME_FORMAT, size, GST_TIME_ARGS (duration)); if (!rtpvorbispay->packet) gst_rtp_vorbis_pay_init_packet (rtpvorbispay); /* size increases with packet length and 2 bytes size eader. */ newduration = rtpvorbispay->payload_duration; if (duration != GST_CLOCK_TIME_NONE) newduration += duration; newsize = rtpvorbispay->payload_pos + 2 + size; packet_len = gst_rtp_buffer_calc_packet_len (newsize, 0, 0); /* check buffer filled against length and max latency */ flush = gst_basertppayload_is_filled (basepayload, packet_len, newduration); /* we can store up to 15 vorbis packets in one RTP packet. */ flush |= (rtpvorbispay->payload_pkts == 15); if (flush) ret = gst_rtp_vorbis_pay_flush_packet (rtpvorbispay); /* put buffer in packet */ ret = gst_rtp_vorbis_pay_append_buffer (rtpvorbispay, buffer); gst_rtp_vorbis_pay_plugin_init (GstPlugin * plugin) return gst_element_register (plugin, "rtpvorbispay", GST_RANK_NONE, GST_TYPE_RTP_VORBIS_PAY); --- NEW FILE: gstrtpvorbispay.h --- * Copyright (C) <2005> Wim Taymans <wi...@fl...> #ifndef __GST_RTP_VORBIS_PAY_H__ #define __GST_RTP_VORBIS_PAY_H__ #include <gst/rtp/gstbasertppayload.h> #define GST_TYPE_RTP_VORBIS_PAY \ (gst_rtp_vorbis_pay_get_type()) #define GST_RTP_VORBIS_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_VORBIS_PAY,GstRtpVorbisPay)) #define GST_RTP_VORBIS_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_VORBIS_PAY,GstRtpVorbisPayClass)) #define GST_IS_RTP_VORBIS_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_VORBIS_PAY)) #define GST_IS_RTP_VORBIS_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_VORBIS_PAY)) typedef struct _GstRtpVorbisPay GstRtpVorbisPay; typedef struct _GstRtpVorbisPayClass GstRtpVorbisPayClass; struct _GstRtpVorbisPay GstBaseRTPPayload payload; /* queues of buffers along with some stats. */ GstBuffer *packet; guint payload_pos; guint payload_left; guint32 payload_ident; guint8 payload_F; guint8 payload_VDT; guint payload_pkts; GstClockTime payload_duration; struct _GstRtpVorbisPayClass GstBaseRTPPayloadClass parent_class; gboolean gst_rtp_vorbis_pay_plugin_init (GstPlugin * plugin); #endif /* __GST_RTP_VORBIS_PAY_H__ */ |
From: <wt...@ke...> - 2006-09-22 15:15:28
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Fri Sep 22 2006 15:15:25 UTC Log message: * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: (plugin_init): * gst/rtp/gstrtpvorbisdepay.c: (gst_rtp_vorbis_depay_process): * gst/rtp/gstrtpvorbispay.c: (gst_rtp_vorbis_pay_setcaps), (gst_rtp_vorbis_pay_reset_packet), (gst_rtp_vorbis_pay_init_packet), (gst_rtp_vorbis_pay_flush_packet), (gst_rtp_vorbis_pay_parse_id), (gst_rtp_vorbis_pay_handle_buffer): More fixage, set endoder-params correctly in the payloader. Modified files: . : ChangeLog gst/rtp : Makefile.am gstrtp.c gstrtpvorbisdepay.c gstrtpvorbispay.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2558&r2=1.2559 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/Makefile.am.diff?r1=1.32&r2=1.33 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtp.c.diff?r1=1.29&r2=1.30 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpvorbisdepay.c.diff?r1=1.1&r2=1.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpvorbispay.c.diff?r1=1.1&r2=1.2 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2558 retrieving revision 1.2559 diff -u -d -r1.2558 -r1.2559 --- ChangeLog 22 Sep 2006 12:12:10 -0000 1.2558 +++ ChangeLog 22 Sep 2006 15:15:13 -0000 1.2559 @@ -1,3 +1,15 @@ +2006-09-22 Wim Taymans <wi...@fl...> + + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: (plugin_init): + * gst/rtp/gstrtpvorbisdepay.c: (gst_rtp_vorbis_depay_process): + * gst/rtp/gstrtpvorbispay.c: (gst_rtp_vorbis_pay_setcaps), + (gst_rtp_vorbis_pay_reset_packet), + (gst_rtp_vorbis_pay_init_packet), + (gst_rtp_vorbis_pay_flush_packet), (gst_rtp_vorbis_pay_parse_id), + (gst_rtp_vorbis_pay_handle_buffer): + More fixage, set endoder-params correctly in the payloader. 2006-09-22 Tim-Philipp Müller <tim at centricular dot net> * gst/autodetect/gstautoaudiosink.c: Index: Makefile.am RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/Makefile.am,v retrieving revision 1.32 retrieving revision 1.33 diff -u -d -r1.32 -r1.33 --- Makefile.am 22 Sep 2006 12:08:14 -0000 1.32 +++ Makefile.am 22 Sep 2006 15:15:13 -0000 1.33 @@ -2,7 +2,6 @@ libgstrtp_la_SOURCES = \ gstrtp.c \ - gstrtpasfdepay.c \ gstrtpdepay.c \ gstrtpmpadepay.c \ gstrtpmpapay.c \ @@ -44,7 +43,6 @@ libgstrtp_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) noinst_HEADERS = \ - gstrtpasfdepay.h \ gstrtpL16depay.h \ gstrtpL16pay.h \ gstrtpamrdepay.h \ Index: gstrtp.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtp.c,v retrieving revision 1.29 retrieving revision 1.30 diff -u -d -r1.29 -r1.30 --- gstrtp.c 22 Sep 2006 12:08:14 -0000 1.29 +++ gstrtp.c 22 Sep 2006 15:15:13 -0000 1.30 @@ -21,7 +21,6 @@ #include "config.h" #endif -#include "gstrtpasfdepay.h" #include "gstrtpdepay.h" #include "gstrtppcmupay.h" #include "gstrtppcmapay.h" @@ -52,9 +51,6 @@ static gboolean plugin_init (GstPlugin * plugin) { - if (!gst_rtp_asf_depay_plugin_init (plugin)) - return FALSE; - if (!gst_rtp_depay_plugin_init (plugin)) return FALSE; Index: gstrtpvorbisdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpvorbisdepay.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- gstrtpvorbisdepay.c 22 Sep 2006 12:08:14 -0000 1.1 +++ gstrtpvorbisdepay.c 22 Sep 2006 15:15:13 -0000 1.2 @@ -201,7 +201,7 @@ GST_DEBUG_OBJECT (depayload, "got RTP packet of size %d", payload_len); /* we need at least 4 bytes for the packet header */ - if (payload_len < 4) + if (G_UNLIKELY (payload_len < 4)) goto packet_short; payload = gst_rtp_buffer_get_payload (buf); @@ -220,7 +220,7 @@ * pkts: number of packets. */ VDT = (header & 0x30) >> 4; - if (VDT == 3) + if (G_UNLIKELY (VDT == 3)) goto ignore_reserved; ident = (header >> 8) & 0xffffff; @@ -235,8 +235,8 @@ payload += 4; payload_len -= 4; - GST_DEBUG_OBJECT (depayload, "ident: %u, F: %d, packets: %d", ident, F, - packets); + GST_DEBUG_OBJECT (depayload, "ident: %u, F: %d, VDT: %d, packets: %d", ident, + F, VDT, packets); /* fragmented packets, assemble */ if (F != 0) { @@ -268,6 +268,7 @@ /* construct assembled buffer */ payload_len = gst_adapter_available (rtpvorbisdepay->adapter); payload = gst_adapter_take (rtpvorbisdepay->adapter, payload_len); + /* fix the length */ payload[0] = ((payload_len - 2) >> 8) & 0xff; payload[1] = (payload_len - 2) & 0xff; to_free = payload; @@ -307,11 +308,11 @@ payload_len); /* skip packet if something odd happens */ - if (length > payload_len) + if (G_UNLIKELY (length > payload_len)) goto length_short; /* create buffer for packet */ - if (to_free) { + if (G_UNLIKELY (to_free)) { outbuf = gst_buffer_new (); GST_BUFFER_DATA (outbuf) = payload; GST_BUFFER_MALLOCDATA (outbuf) = to_free; Index: gstrtpvorbispay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpvorbispay.c,v --- gstrtpvorbispay.c 22 Sep 2006 12:08:14 -0000 1.1 +++ gstrtpvorbispay.c 22 Sep 2006 15:15:13 -0000 1.2 @@ -123,40 +123,41 @@ rtpvorbispay = GST_RTP_VORBIS_PAY (basepayload); - gst_basertppayload_set_options (basepayload, "audio", TRUE, "vorbis", 8000); - gst_basertppayload_set_outcaps (basepayload, - "encoding-params", G_TYPE_STRING, "1", - /* don't set the defaults - */ - NULL); return TRUE; } static void -gst_rtp_vorbis_pay_init_packet (GstRtpVorbisPay * rtpvorbispay) +gst_rtp_vorbis_pay_reset_packet (GstRtpVorbisPay * rtpvorbispay, guint8 VDT) guint payload_len; - if (rtpvorbispay->packet) - gst_buffer_unref (rtpvorbispay->packet); - GST_DEBUG_OBJECT (rtpvorbispay, "starting new packet"); + GST_DEBUG_OBJECT (rtpvorbispay, "reset packet"); - /* new packet allocate max packet size */ - rtpvorbispay->packet = - gst_rtp_buffer_new_allocate_len (GST_BASE_RTP_PAYLOAD_MTU - (rtpvorbispay), 0, 0); rtpvorbispay->payload_pos = 4; payload_len = gst_rtp_buffer_get_payload_len (rtpvorbispay->packet); rtpvorbispay->payload_left = payload_len - 4; rtpvorbispay->payload_duration = 0; rtpvorbispay->payload_ident = 0; rtpvorbispay->payload_F = 0; - rtpvorbispay->payload_VDT = 0; + rtpvorbispay->payload_VDT = VDT; rtpvorbispay->payload_pkts = 0; +static void +gst_rtp_vorbis_pay_init_packet (GstRtpVorbisPay * rtpvorbispay, guint8 VDT) +{ + GST_DEBUG_OBJECT (rtpvorbispay, "starting new packet, VDT: %d", VDT); + if (rtpvorbispay->packet) + gst_buffer_unref (rtpvorbispay->packet); + /* new packet allocate max packet size */ + rtpvorbispay->packet = + gst_rtp_buffer_new_allocate_len (GST_BASE_RTP_PAYLOAD_MTU + (rtpvorbispay), 0, 0); + gst_rtp_vorbis_pay_reset_packet (rtpvorbispay, VDT); +} static GstFlowReturn gst_rtp_vorbis_pay_flush_packet (GstRtpVorbisPay * rtpvorbispay) @@ -165,7 +166,7 @@ guint hlen; /* check for empty packet */ - if (!rtpvorbispay || rtpvorbispay->payload_pos <= 4) + if (!rtpvorbispay->packet || rtpvorbispay->payload_pos <= 4) return GST_FLOW_OK; GST_DEBUG_OBJECT (rtpvorbispay, "flushing packet"); @@ -200,85 +201,77 @@ rtpvorbispay->packet); rtpvorbispay->packet = NULL; - /* prepare new packet */ - gst_rtp_vorbis_pay_init_packet (rtpvorbispay); return ret; -static GstFlowReturn -gst_rtp_vorbis_pay_append_buffer (GstRtpVorbisPay * rtpvorbispay, - GstBuffer * buffer) +static gboolean +gst_rtp_vorbis_pay_parse_id (GstBaseRTPPayload * basepayload, guint8 * data, + guint size) - GstFlowReturn res; - guint size; - GstClockTime duration; - guint plen; - guint8 *ppos, *payload, *data; - gboolean fragmented; - res = GST_FLOW_OK; - if (rtpvorbispay->payload_left < 2) - return res; + guint8 channels; + gint32 rate, version; + gchar *cstr; - size = GST_BUFFER_SIZE (buffer); - /* skip packets that are too big */ - if (size > 0xffff) + if (G_UNLIKELY (size < 16)) + goto too_short; - data = GST_BUFFER_DATA (buffer); - duration = GST_BUFFER_DURATION (buffer); - payload = gst_rtp_buffer_get_payload (rtpvorbispay->packet); - ppos = payload + rtpvorbispay->payload_pos; - fragmented = FALSE; + if (G_UNLIKELY (memcmp (data, "\001vorbis", 7))) + goto invalid_start; + data += 7; - while (size) { - plen = MIN (rtpvorbispay->payload_left - 2, size); + if (G_UNLIKELY ((version = GST_READ_UINT32_LE (data)) != 0)) + goto invalid_version; + data += 4; - GST_DEBUG_OBJECT (rtpvorbispay, "append %u bytes", plen); + if (G_UNLIKELY ((channels = *data++) < 1)) + goto invalid_channels; - ppos[0] = (plen >> 8) & 0xff; - ppos[1] = (plen & 0xff); - memcpy (&ppos[2], data, plen); + if (G_UNLIKELY ((rate = GST_READ_UINT32_LE (data)) < 1)) + goto invalid_rate; - size -= plen; - data += plen; + cstr = g_strdup_printf ("%d", channels); + gst_basertppayload_set_options (basepayload, "audio", TRUE, "vorbis", rate); + gst_basertppayload_set_outcaps (basepayload, + "encoding-params", G_TYPE_STRING, cstr, + /* don't set the defaults + */ + NULL); + g_free (cstr); - rtpvorbispay->payload_pos += plen + 2; - rtpvorbispay->payload_left -= plen + 2; + return TRUE; - if (fragmented) { - if (size == 0) - /* last fragment, set F to 0x3. */ - rtpvorbispay->payload_F = 0x3; - else - /* fragment continues, set F to 0x2. */ - rtpvorbispay->payload_F = 0x2; - } else { - if (size == 0) { - /* unfragmented packet, update stats for next packet */ - rtpvorbispay->payload_pkts++; - if (duration != GST_CLOCK_TIME_NONE) - rtpvorbispay->payload_duration += duration; - } else { - /* fragmented packet starts, set F to 0x1, mark ourselves as - * fragmented. */ - rtpvorbispay->payload_F = 0x1; - fragmented = TRUE; - } - } - /* fragmented packets are always flushed and have ptks of 0 */ - rtpvorbispay->payload_pkts = 0; - res = gst_rtp_vorbis_pay_flush_packet (rtpvorbispay); - /* get new pointers */ - payload = gst_rtp_buffer_get_payload (rtpvorbispay->packet); - ppos = payload + rtpvorbispay->payload_pos; + /* ERRORS */ +too_short: + { + GST_ELEMENT_ERROR (basepayload, STREAM, DECODE, + ("Identification packet is too short, need at least 16, got %d", size), + (NULL)); + return FALSE; + } +invalid_start: + ("Invalid header start in identification packet"), (NULL)); +invalid_version: + ("Invalid version, expected 0, got %d", version), (NULL)); +invalid_rate: + ("Invalid rate %d", rate), (NULL)); +invalid_channels: + ("Invalid channels %d", channels), (NULL)); } - return res; @@ -288,20 +281,45 @@ GstRtpVorbisPay *rtpvorbispay; GstFlowReturn ret; guint size, newsize; + guint8 *data; guint packet_len; GstClockTime duration, newduration; gboolean flush; + guint8 VDT; + guint plen; + guint8 *ppos, *payload; + gboolean fragmented; size = GST_BUFFER_SIZE (buffer); + data = GST_BUFFER_DATA (buffer); duration = GST_BUFFER_DURATION (buffer); GST_DEBUG_OBJECT (rtpvorbispay, "size %u, duration %" GST_TIME_FORMAT, size, GST_TIME_ARGS (duration)); - if (!rtpvorbispay->packet) - gst_rtp_vorbis_pay_init_packet (rtpvorbispay); + if (G_UNLIKELY (size < 1 || size > 0xffff)) + goto wrong_size; + /* find packet type */ + if (data[0] & 1) { + /* header */ + if (data[0] == 1) { + /* identification, we need to parse this in order to get the clock rate. */ + if (G_UNLIKELY (!gst_rtp_vorbis_pay_parse_id (basepayload, data, size))) + goto parse_id_failed; + VDT = 1; + } else if (data[0] == 5) + /* setup */ + else if (data[0] == 3) + VDT = 2; + else + goto unknown_header; + } else + /* data */ + VDT = 0; /* size increases with packet length and 2 bytes size eader. */ newduration = rtpvorbispay->payload_duration; @@ -315,14 +333,94 @@ flush = gst_basertppayload_is_filled (basepayload, packet_len, newduration); /* we can store up to 15 vorbis packets in one RTP packet. */ flush |= (rtpvorbispay->payload_pkts == 15); + /* flush if we have a new VDT */ + flush |= (rtpvorbispay->payload_VDT != VDT); if (flush) ret = gst_rtp_vorbis_pay_flush_packet (rtpvorbispay); - /* put buffer in packet */ - ret = gst_rtp_vorbis_pay_append_buffer (rtpvorbispay, buffer); + /* create new packet if we must */ + if (!rtpvorbispay->packet) + gst_rtp_vorbis_pay_init_packet (rtpvorbispay, VDT); + payload = gst_rtp_buffer_get_payload (rtpvorbispay->packet); + ppos = payload + rtpvorbispay->payload_pos; + fragmented = FALSE; + ret = GST_FLOW_OK; + /* put buffer in packet, it either fits completely or needs to be fragmented + * over multiple RTP packets. */ + while (size) { + plen = MIN (rtpvorbispay->payload_left - 2, size); + GST_DEBUG_OBJECT (rtpvorbispay, "append %u bytes", plen); + /* data is copied in the payload with a 2 byte length header */ + ppos[0] = (plen >> 8) & 0xff; + ppos[1] = (plen & 0xff); + memcpy (&ppos[2], data, plen); + size -= plen; + data += plen; + rtpvorbispay->payload_pos += plen + 2; + rtpvorbispay->payload_left -= plen + 2; + if (fragmented) { + if (size == 0) + /* last fragment, set F to 0x3. */ + rtpvorbispay->payload_F = 0x3; + else + /* fragment continues, set F to 0x2. */ + rtpvorbispay->payload_F = 0x2; + } else { + if (size > 0) { + /* fragmented packet starts, set F to 0x1, mark ourselves as + * fragmented. */ + rtpvorbispay->payload_F = 0x1; + fragmented = TRUE; + } + } + /* fragmented packets are always flushed and have ptks of 0 */ + rtpvorbispay->payload_pkts = 0; + ret = gst_rtp_vorbis_pay_flush_packet (rtpvorbispay); + /* start new packet and get pointers. VDT stays the same. */ + gst_rtp_vorbis_pay_init_packet (rtpvorbispay, + rtpvorbispay->payload_VDT); + payload = gst_rtp_buffer_get_payload (rtpvorbispay->packet); + ppos = payload + rtpvorbispay->payload_pos; + /* unfragmented packet, update stats for next packet, size == 0 and we + * exit the while loop */ + rtpvorbispay->payload_pkts++; + if (duration != GST_CLOCK_TIME_NONE) + rtpvorbispay->payload_duration += duration; +wrong_size: + GST_ELEMENT_WARNING (rtpvorbispay, STREAM, DECODE, + ("Invalid packet size (1 < %d <= 0xffff)", size), (NULL)); + return GST_FLOW_OK; +parse_id_failed: + return GST_FLOW_ERROR; +unknown_header: + ("Ignoring unknown header received"), (NULL)); gboolean |
From: <wt...@ke...> - 2006-09-23 15:30:53
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Sat Sep 23 2006 15:30:52 UTC Log message: * gst/rtp/gstasteriskh263.c: (gst_asteriskh263_plugin_init): * gst/rtp/gstrtpL16depay.c: (gst_rtp_L16depay_plugin_init): * gst/rtp/gstrtpamrdepay.c: (gst_rtp_amr_depay_plugin_init): * gst/rtp/gstrtpdepay.c: * gst/rtp/gstrtpgsmdepay.c: (gst_rtp_gsm_depay_plugin_init): * gst/rtp/gstrtph263pdepay.c: (gst_rtp_h263p_depay_plugin_init): * gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_plugin_init): * gst/rtp/gstrtpilbcdepay.c: (gst_rtp_ilbc_depay_plugin_init): * gst/rtp/gstrtpmp2tdepay.c: (gst_rtp_mp2t_depay_setcaps), (gst_rtp_mp2t_depay_plugin_init): * gst/rtp/gstrtpmp4gdepay.c: (gst_rtp_mp4g_depay_plugin_init): * gst/rtp/gstrtpmp4vdepay.c: (gst_rtp_mp4v_depay_plugin_init): * gst/rtp/gstrtpmpadepay.c: (gst_rtp_mpa_depay_plugin_init): * gst/rtp/gstrtppcmadepay.c: (gst_rtp_pcma_depay_plugin_init): * gst/rtp/gstrtppcmudepay.c: (gst_rtp_pcmu_depay_plugin_init): * gst/rtp/gstrtpspeexdepay.c: (gst_rtp_speex_depay_plugin_init): * gst/rtp/gstrtpsv3vdepay.c: (gst_rtp_sv3v_depay_plugin_init): * gst/rtp/gstrtpvorbisdepay.c: (gst_rtp_vorbis_depay_plugin_init): Fix klass typos. Mark RANK_MARGINAL, decodebin can handle the depayloaders fine. Modified files: . : ChangeLog gst/rtp : gstasteriskh263.c gstrtpL16depay.c gstrtpamrdepay.c gstrtpdepay.c gstrtpgsmdepay.c gstrtph263pdepay.c gstrtph264depay.c gstrtpilbcdepay.c gstrtpmp2tdepay.c gstrtpmp4gdepay.c gstrtpmp4vdepay.c gstrtpmpadepay.c gstrtppcmadepay.c gstrtppcmudepay.c gstrtpspeexdepay.c gstrtpsv3vdepay.c gstrtpvorbisdepay.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2561&r2=1.2562 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstasteriskh263.c.diff?r1=1.11&r2=1.12 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpL16depay.c.diff?r1=1.23&r2=1.24 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpamrdepay.c.diff?r1=1.21&r2=1.22 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpdepay.c.diff?r1=1.12&r2=1.13 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpgsmdepay.c.diff?r1=1.25&r2=1.26 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtph263pdepay.c.diff?r1=1.15&r2=1.16 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtph264depay.c.diff?r1=1.3&r2=1.4 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpilbcdepay.c.diff?r1=1.6&r2=1.7 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp2tdepay.c.diff?r1=1.1&r2=1.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gdepay.c.diff?r1=1.3&r2=1.4 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4vdepay.c.diff?r1=1.15&r2=1.16 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmpadepay.c.diff?r1=1.13&r2=1.14 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtppcmadepay.c.diff?r1=1.6&r2=1.7 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtppcmudepay.c.diff?r1=1.5&r2=1.6 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpspeexdepay.c.diff?r1=1.8&r2=1.9 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpsv3vdepay.c.diff?r1=1.1&r2=1.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpvorbisdepay.c.diff?r1=1.2&r2=1.3 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2561 retrieving revision 1.2562 diff -u -d -r1.2561 -r1.2562 --- ChangeLog 22 Sep 2006 17:53:48 -0000 1.2561 +++ ChangeLog 23 Sep 2006 15:30:40 -0000 1.2562 @@ -1,3 +1,26 @@ +2006-09-23 Wim Taymans <wi...@fl...> + + * gst/rtp/gstasteriskh263.c: (gst_asteriskh263_plugin_init): + * gst/rtp/gstrtpL16depay.c: (gst_rtp_L16depay_plugin_init): + * gst/rtp/gstrtpamrdepay.c: (gst_rtp_amr_depay_plugin_init): + * gst/rtp/gstrtpdepay.c: + * gst/rtp/gstrtpgsmdepay.c: (gst_rtp_gsm_depay_plugin_init): + * gst/rtp/gstrtph263pdepay.c: (gst_rtp_h263p_depay_plugin_init): + * gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_plugin_init): + * gst/rtp/gstrtpilbcdepay.c: (gst_rtp_ilbc_depay_plugin_init): + * gst/rtp/gstrtpmp2tdepay.c: (gst_rtp_mp2t_depay_setcaps), + (gst_rtp_mp2t_depay_plugin_init): + * gst/rtp/gstrtpmp4gdepay.c: (gst_rtp_mp4g_depay_plugin_init): + * gst/rtp/gstrtpmp4vdepay.c: (gst_rtp_mp4v_depay_plugin_init): + * gst/rtp/gstrtpmpadepay.c: (gst_rtp_mpa_depay_plugin_init): + * gst/rtp/gstrtppcmadepay.c: (gst_rtp_pcma_depay_plugin_init): + * gst/rtp/gstrtppcmudepay.c: (gst_rtp_pcmu_depay_plugin_init): + * gst/rtp/gstrtpspeexdepay.c: (gst_rtp_speex_depay_plugin_init): + * gst/rtp/gstrtpsv3vdepay.c: (gst_rtp_sv3v_depay_plugin_init): + * gst/rtp/gstrtpvorbisdepay.c: (gst_rtp_vorbis_depay_plugin_init): + Fix klass typos. + Mark RANK_MARGINAL, decodebin can handle the depayloaders fine. 2006-09-22 Tim-Philipp Müller <tim at centricular dot net> * configure.ac: Index: gstasteriskh263.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstasteriskh263.c,v retrieving revision 1.11 retrieving revision 1.12 diff -u -d -r1.11 -r1.12 --- gstasteriskh263.c 22 May 2006 13:51:30 -0000 1.11 +++ gstasteriskh263.c 23 Sep 2006 15:30:40 -0000 1.12 @@ -50,7 +50,7 @@ /* elementfactory information */ static const GstElementDetails gst_rtp_h263p_depaydetails = GST_ELEMENT_DETAILS ("RTP packet parser", - "Codec/Depayr/Network", + "Codec/Depayloader/Network", "Extracts H263 video from RTP and encodes in Asterisk H263 format", "Neil Stratford <ne...@vi...>"); @@ -314,5 +314,5 @@ gst_asteriskh263_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "asteriskh263", - GST_RANK_NONE, GST_TYPE_ASTERISK_H263); + GST_RANK_MARGINAL, GST_TYPE_ASTERISK_H263); } Index: gstrtpL16depay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpL16depay.c,v retrieving revision 1.23 retrieving revision 1.24 diff -u -d -r1.23 -r1.24 --- gstrtpL16depay.c 22 Sep 2006 12:08:14 -0000 1.23 +++ gstrtpL16depay.c 23 Sep 2006 15:30:40 -0000 1.24 @@ -27,7 +27,7 @@ static const GstElementDetails gst_rtp_L16depay_details = "Extracts raw audio from RTP packets", "Zeeshan Ali <za...@ya...>"); @@ -348,5 +348,5 @@ gst_rtp_L16depay_plugin_init (GstPlugin * plugin) return gst_element_register (plugin, "rtpL16depay", - GST_RANK_NONE, GST_TYPE_RTP_L16_DEPAY); + GST_RANK_MARGINAL, GST_TYPE_RTP_L16_DEPAY); Index: gstrtpamrdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpamrdepay.c,v retrieving revision 1.21 retrieving revision 1.22 diff -u -d -r1.21 -r1.22 --- gstrtpamrdepay.c 16 Aug 2006 10:05:00 -0000 1.21 +++ gstrtpamrdepay.c 23 Sep 2006 15:30:40 -0000 1.22 @@ -36,7 +36,7 @@ static const GstElementDetails gst_rtp_amrdepay_details = "Extracts AMR audio from RTP packets (RFC 3267)", "Wim Taymans <wi...@fl...>"); @@ -405,5 +405,5 @@ gst_rtp_amr_depay_plugin_init (GstPlugin * plugin) return gst_element_register (plugin, "rtpamrdepay", - GST_RANK_NONE, GST_TYPE_RTP_AMR_DEPAY); + GST_RANK_MARGINAL, GST_TYPE_RTP_AMR_DEPAY); Index: gstrtpdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpdepay.c,v retrieving revision 1.13 diff -u -d -r1.12 -r1.13 --- gstrtpdepay.c 22 Jun 2006 19:31:04 -0000 1.12 +++ gstrtpdepay.c 23 Sep 2006 15:30:40 -0000 1.13 @@ -26,7 +26,7 @@ static const GstElementDetails rtpdepay_details = GST_ELEMENT_DETAILS ("RTP payloader", "Accepts raw RTP and RTCP packets and sends them forward", Index: gstrtpgsmdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpgsmdepay.c,v retrieving revision 1.25 retrieving revision 1.26 diff -u -d -r1.25 -r1.26 --- gstrtpgsmdepay.c 22 May 2006 13:51:30 -0000 1.25 +++ gstrtpgsmdepay.c 23 Sep 2006 15:30:40 -0000 1.26 @@ -29,7 +29,7 @@ static GstElementDetails gst_rtp_gsmdepay_details = { "RTP packet parser", - "Codec/Depayr/Network", + "Codec/Depayloader/Network", "Extracts GSM audio from RTP packets", "Zeeshan Ali <ze...@gm...>" }; @@ -138,5 +138,5 @@ gst_rtp_gsm_depay_plugin_init (GstPlugin * plugin) return gst_element_register (plugin, "rtpgsmdepay", - GST_RANK_NONE, GST_TYPE_RTP_GSM_DEPAY); + GST_RANK_MARGINAL, GST_TYPE_RTP_GSM_DEPAY); Index: gstrtph263pdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtph263pdepay.c,v retrieving revision 1.15 retrieving revision 1.16 diff -u -d -r1.15 -r1.16 --- gstrtph263pdepay.c 20 Sep 2006 19:37:45 -0000 1.15 +++ gstrtph263pdepay.c 23 Sep 2006 15:30:40 -0000 1.16 static const GstElementDetails gst_rtp_h263pdepay_details = "Extracts H263+ video from RTP packets (RFC 2429)", @@ -337,5 +337,5 @@ gst_rtp_h263p_depay_plugin_init (GstPlugin * plugin) return gst_element_register (plugin, "rtph263pdepay", - GST_RANK_NONE, GST_TYPE_RTP_H263P_DEPAY); + GST_RANK_MARGINAL, GST_TYPE_RTP_H263P_DEPAY); Index: gstrtph264depay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtph264depay.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- gstrtph264depay.c 20 Sep 2006 16:09:03 -0000 1.3 +++ gstrtph264depay.c 23 Sep 2006 15:30:40 -0000 1.4 static const GstElementDetails gst_rtp_h264depay_details = "Extracts H264 video from RTP packets (RFC 3984)", @@ -499,5 +499,5 @@ gst_rtp_h264_depay_plugin_init (GstPlugin * plugin) return gst_element_register (plugin, "rtph264depay", - GST_RANK_NONE, GST_TYPE_RTP_H264_DEPAY); + GST_RANK_MARGINAL, GST_TYPE_RTP_H264_DEPAY); Index: gstrtpilbcdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpilbcdepay.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- gstrtpilbcdepay.c 28 May 2006 17:33:13 -0000 1.6 +++ gstrtpilbcdepay.c 23 Sep 2006 15:30:40 -0000 1.7 @@ -28,7 +28,7 @@ static const GstElementDetails gst_rtp_ilbc_depay_details = GST_ELEMENT_DETAILS ("RTP iLBC packet depayloader", "Extracts iLBC audio from RTP packets", "Philippe Kalaf <phi...@co...>"); @@ -220,5 +220,5 @@ gst_rtp_ilbc_depay_plugin_init (GstPlugin * plugin) return gst_element_register (plugin, "rtpilbcdepay", - GST_RANK_NONE, GST_TYPE_RTP_ILBC_DEPAY); + GST_RANK_MARGINAL, GST_TYPE_RTP_ILBC_DEPAY); Index: gstrtpmp2tdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp2tdepay.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- gstrtpmp2tdepay.c 12 Jul 2006 09:34:15 -0000 1.1 +++ gstrtpmp2tdepay.c 23 Sep 2006 15:30:40 -0000 1.2 static const GstElementDetails gst_rtp_mp2tdepay_details = - "Codec/Depay/Network", "Extracts MPEG2 TS from RTP packets (RFC 2250)", @@ -256,5 +256,5 @@ gst_rtp_mp2t_depay_plugin_init (GstPlugin * plugin) return gst_element_register (plugin, "rtpmp2tdepay", - GST_RANK_NONE, GST_TYPE_RTP_MP2T_DEPAY); + GST_RANK_MARGINAL, GST_TYPE_RTP_MP2T_DEPAY); Index: gstrtpmp4gdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gdepay.c,v --- gstrtpmp4gdepay.c 22 Sep 2006 12:08:14 -0000 1.3 +++ gstrtpmp4gdepay.c 23 Sep 2006 15:30:40 -0000 1.4 @@ -32,7 +32,7 @@ static const GstElementDetails gst_rtp_mp4gdepay_details = "Extracts MPEG4 elementary streams from RTP packets (RFC 3640)", @@ -378,5 +378,5 @@ gst_rtp_mp4g_depay_plugin_init (GstPlugin * plugin) return gst_element_register (plugin, "rtpmp4gdepay", - GST_RANK_NONE, GST_TYPE_RTP_MP4G_DEPAY); + GST_RANK_MARGINAL, GST_TYPE_RTP_MP4G_DEPAY); Index: gstrtpmp4vdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4vdepay.c,v --- gstrtpmp4vdepay.c 22 May 2006 13:51:30 -0000 1.15 +++ gstrtpmp4vdepay.c 23 Sep 2006 15:30:40 -0000 1.16 static const GstElementDetails gst_rtp_mp4vdepay_details = "Extracts MPEG4 video from RTP packets (RFC 3016)", @@ -304,5 +304,5 @@ gst_rtp_mp4v_depay_plugin_init (GstPlugin * plugin) return gst_element_register (plugin, "rtpmp4vdepay", - GST_RANK_NONE, GST_TYPE_RTP_MP4V_DEPAY); + GST_RANK_MARGINAL, GST_TYPE_RTP_MP4V_DEPAY); Index: gstrtpmpadepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmpadepay.c,v retrieving revision 1.14 diff -u -d -r1.13 -r1.14 --- gstrtpmpadepay.c 22 May 2006 13:51:30 -0000 1.13 +++ gstrtpmpadepay.c 23 Sep 2006 15:30:40 -0000 1.14 static const GstElementDetails gst_rtp_mpadepay_details = "Extracts MPEG audio from RTP packets (RFC 2038)", @@ -281,5 +281,5 @@ gst_rtp_mpa_depay_plugin_init (GstPlugin * plugin) return gst_element_register (plugin, "rtpmpadepay", - GST_RANK_NONE, GST_TYPE_RTP_MPA_DEPAY); + GST_RANK_MARGINAL, GST_TYPE_RTP_MPA_DEPAY); Index: gstrtppcmadepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtppcmadepay.c,v --- gstrtppcmadepay.c 22 May 2006 13:51:30 -0000 1.6 +++ gstrtppcmadepay.c 23 Sep 2006 15:30:40 -0000 1.7 @@ -30,7 +30,7 @@ static const GstElementDetails gst_rtp_pcmadepay_details = "Extracts PCMA audio from RTP packets", "Edgard Lima <edg...@in...>, Zeeshan Ali <ze...@gm...>"); @@ -160,5 +160,5 @@ gst_rtp_pcma_depay_plugin_init (GstPlugin * plugin) return gst_element_register (plugin, "rtppcmadepay", - GST_RANK_NONE, GST_TYPE_RTP_PCMA_DEPAY); + GST_RANK_MARGINAL, GST_TYPE_RTP_PCMA_DEPAY); Index: gstrtppcmudepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtppcmudepay.c,v retrieving revision 1.5 diff -u -d -r1.5 -r1.6 --- gstrtppcmudepay.c 22 May 2006 13:51:30 -0000 1.5 +++ gstrtppcmudepay.c 23 Sep 2006 15:30:40 -0000 1.6 static const GstElementDetails gst_rtp_pcmudepay_details = "Extracts PCMU audio from RTP packets", @@ -161,5 +161,5 @@ gst_rtp_pcmu_depay_plugin_init (GstPlugin * plugin) return gst_element_register (plugin, "rtppcmudepay", - GST_RANK_NONE, GST_TYPE_RTP_PCMU_DEPAY); + GST_RANK_MARGINAL, GST_TYPE_RTP_PCMU_DEPAY); Index: gstrtpspeexdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpspeexdepay.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- gstrtpspeexdepay.c 22 May 2006 13:51:30 -0000 1.8 +++ gstrtpspeexdepay.c 23 Sep 2006 15:30:40 -0000 1.9 static const GstElementDetails gst_rtp_speexdepay_details = "Extracts Speex audio from RTP packets", "Edgard Lima <edg...@in...>"); @@ -144,5 +144,5 @@ gst_rtp_speex_depay_plugin_init (GstPlugin * plugin) return gst_element_register (plugin, "rtpspeexdepay", - GST_RANK_NONE, GST_TYPE_RTP_SPEEX_DEPAY); + GST_RANK_MARGINAL, GST_TYPE_RTP_SPEEX_DEPAY); Index: gstrtpsv3vdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpsv3vdepay.c,v --- gstrtpsv3vdepay.c 18 Aug 2006 16:52:21 -0000 1.1 +++ gstrtpsv3vdepay.c 23 Sep 2006 15:30:40 -0000 1.2 static const GstElementDetails gst_rtp_sv3vdepay_details = "Extracts SVQ3 video from RTP packets (no RFC)", @@ -344,5 +344,5 @@ gst_rtp_sv3v_depay_plugin_init (GstPlugin * plugin) return gst_element_register (plugin, "rtpsv3vdepay", - GST_RANK_NONE, GST_TYPE_RTP_SV3V_DEPAY); + GST_RANK_MARGINAL, GST_TYPE_RTP_SV3V_DEPAY); Index: gstrtpvorbisdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpvorbisdepay.c,v diff -u -d -r1.2 -r1.3 --- gstrtpvorbisdepay.c 22 Sep 2006 15:15:13 -0000 1.2 +++ gstrtpvorbisdepay.c 23 Sep 2006 15:30:40 -0000 1.3 static const GstElementDetails gst_rtp_vorbis_depay_details = "Extracts Vorbis Audio from RTP packets (draft-01 of RFC XXXX)", @@ -437,5 +437,5 @@ gst_rtp_vorbis_depay_plugin_init (GstPlugin * plugin) return gst_element_register (plugin, "rtpvorbisdepay", - GST_RANK_NONE, GST_TYPE_RTP_VORBIS_DEPAY); + GST_RANK_MARGINAL, GST_TYPE_RTP_VORBIS_DEPAY); |
From: <wt...@ke...> - 2006-10-18 17:06:34
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Wed Oct 18 2006 17:06:33 UTC Log message: Patch by: Ville Syrjala <ville dot syrjala at movial dot fi> * gst/rtp/gstrtpgsmpay.c: * gst/rtp/gstrtph263pay.c: * gst/rtp/gstrtpmpapay.c: * gst/rtp/gstrtppcmapay.c: (gst_rtp_pcma_pay_flush), (gst_rtp_pcma_pay_handle_buffer): * gst/rtp/gstrtppcmupay.c: (gst_rtp_pcmu_pay_flush): Add static payload numbers in addition to the dynamic ones. Fixes #361639. Modified files: . : ChangeLog gst/rtp : gstrtpgsmpay.c gstrtph263pay.c gstrtpmpapay.c gstrtppcmapay.c gstrtppcmupay.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2596&r2=1.2597 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpgsmpay.c.diff?r1=1.29&r2=1.30 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtph263pay.c.diff?r1=1.11&r2=1.12 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmpapay.c.diff?r1=1.15&r2=1.16 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtppcmapay.c.diff?r1=1.8&r2=1.9 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtppcmupay.c.diff?r1=1.8&r2=1.9 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2596 retrieving revision 1.2597 diff -u -d -r1.2596 -r1.2597 --- ChangeLog 18 Oct 2006 16:18:55 -0000 1.2596 +++ ChangeLog 18 Oct 2006 17:06:20 -0000 1.2597 @@ -1,5 +1,18 @@ 2006-10-18 Wim Taymans <wi...@fl...> + Patch by: Ville Syrjala <ville dot syrjala at movial dot fi> + + * gst/rtp/gstrtpgsmpay.c: + * gst/rtp/gstrtph263pay.c: + * gst/rtp/gstrtpmpapay.c: + * gst/rtp/gstrtppcmapay.c: (gst_rtp_pcma_pay_flush), + (gst_rtp_pcma_pay_handle_buffer): + * gst/rtp/gstrtppcmupay.c: (gst_rtp_pcmu_pay_flush): + Add static payload numbers in addition to the dynamic ones. + Fixes #361639. +2006-10-18 Wim Taymans <wi...@fl...> * gst/rtsp/gstrtspsrc.c: (gst_rtsp_lower_trans_get_type), (gst_rtspsrc_class_init), (gst_rtspsrc_loop_interleaved), (gst_rtspsrc_loop_udp), (gst_rtspsrc_open), Index: gstrtpgsmpay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpgsmpay.c,v retrieving revision 1.29 retrieving revision 1.30 diff -u -d -r1.29 -r1.30 --- gstrtpgsmpay.c 25 Apr 2006 21:39:44 -0000 1.29 +++ gstrtpgsmpay.c 18 Oct 2006 17:06:21 -0000 1.30 @@ -43,12 +43,16 @@ ); static GstStaticPadTemplate gst_rtp_gsm_pay_src_template = -GST_STATIC_PAD_TEMPLATE ("src", + GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_GSM_STRING ", " + "clock-rate = (int) 8000, " "encoding-name = (string) \"GSM\"; " + "application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) 8000, " "encoding-name = (string) \"GSM\"") Index: gstrtph263pay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtph263pay.c,v retrieving revision 1.11 retrieving revision 1.12 diff -u -d -r1.11 -r1.12 --- gstrtph263pay.c 22 May 2006 13:51:30 -0000 1.11 +++ gstrtph263pay.c 18 Oct 2006 17:06:21 -0000 1.12 @@ -158,12 +158,16 @@ static GstStaticPadTemplate gst_rtp_h263_pay_src_template = "media = (string) \"video\", " "payload = (int) " GST_RTP_PAYLOAD_H263_STRING ", " + "clock-rate = (int) 90000, " "encoding-name = (string) \"H263\"; " + "media = (string) \"video\", " "clock-rate = (int) 90000, " "encoding-name = (string) \"H263\"") Index: gstrtpmpapay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmpapay.c,v retrieving revision 1.15 retrieving revision 1.16 diff -u -d -r1.15 -r1.16 --- gstrtpmpapay.c 22 May 2006 13:51:30 -0000 1.15 +++ gstrtpmpapay.c 18 Oct 2006 17:06:21 -0000 1.16 @@ -42,12 +42,16 @@ static GstStaticPadTemplate gst_rtp_mpa_pay_src_template = - "payload = (int) [ 96, 127 ], " + "payload = (int) " GST_RTP_PAYLOAD_MPA_STRING ", " + "clock-rate = (int) 90000, " "encoding-name = (string) \"MPA\"; " "clock-rate = (int) 90000, " "encoding-name = (string) \"MPA\"") Index: gstrtppcmapay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtppcmapay.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- gstrtppcmapay.c 26 Jul 2006 16:36:59 -0000 1.8 +++ gstrtppcmapay.c 18 Oct 2006 17:06:21 -0000 1.9 @@ -44,13 +44,17 @@ static GstStaticPadTemplate gst_rtp_pcma_pay_src_template = "payload = (int) " GST_RTP_PAYLOAD_PCMA_STRING ", " - "clock-rate = (int) 8000, " "encoding-name = (string) \"PCMA\" ") + "clock-rate = (int) 8000, " "encoding-name = (string) \"PCMA\"; " + "clock-rate = (int) 8000, " "encoding-name = (string) \"PCMA\"") static gboolean gst_rtp_pcma_pay_setcaps (GstBaseRTPPayload * payload, Index: gstrtppcmupay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtppcmupay.c,v --- gstrtppcmupay.c 26 Jul 2006 16:36:59 -0000 1.8 +++ gstrtppcmupay.c 18 Oct 2006 17:06:21 -0000 1.9 @@ -44,12 +44,16 @@ static GstStaticPadTemplate gst_rtp_pcmu_pay_src_template = "payload = (int) " GST_RTP_PAYLOAD_PCMU_STRING ", " + "clock-rate = (int) 8000, " "encoding-name = (string) \"PCMU\"; " "clock-rate = (int) 8000, " "encoding-name = (string) \"PCMU\"") |
From: <wt...@ke...> - 2006-10-31 10:52:48
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Tue Oct 31 2006 10:52:43 UTC Log message: * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: (plugin_init): * gst/rtp/gstrtpilbcpay.c: (gst_rtpilbcpay_init), (gst_rtpilbcpay_setcaps): Fix and activate ILBC pay and depayloaders. Fixes #368162. Modified files: . : ChangeLog gst/rtp : Makefile.am gstrtp.c gstrtpilbcpay.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2604&r2=1.2605 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/Makefile.am.diff?r1=1.33&r2=1.34 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtp.c.diff?r1=1.30&r2=1.31 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpilbcpay.c.diff?r1=1.3&r2=1.4 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2604 retrieving revision 1.2605 diff -u -d -r1.2604 -r1.2605 --- ChangeLog 31 Oct 2006 09:44:39 -0000 1.2604 +++ ChangeLog 31 Oct 2006 10:52:31 -0000 1.2605 @@ -1,5 +1,13 @@ 2006-10-31 Wim Taymans <wi...@fl...> + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: (plugin_init): + * gst/rtp/gstrtpilbcpay.c: (gst_rtpilbcpay_init), + (gst_rtpilbcpay_setcaps): + Fix and activate ILBC pay and depayloaders. Fixes #368162. + +2006-10-31 Wim Taymans <wi...@fl...> * ext/speex/gstspeexdec.c: (speex_dec_convert), (speex_dec_sink_event), (speex_dec_chain_parse_header): Some small cleanups, use _scale. Index: Makefile.am RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/Makefile.am,v retrieving revision 1.33 retrieving revision 1.34 diff -u -d -r1.33 -r1.34 --- Makefile.am 22 Sep 2006 15:15:13 -0000 1.33 +++ Makefile.am 31 Oct 2006 10:52:31 -0000 1.34 @@ -3,6 +3,8 @@ libgstrtp_la_SOURCES = \ gstrtp.c \ gstrtpdepay.c \ + gstrtpilbcdepay.c \ + gstrtpilbcpay.c \ gstrtpmpadepay.c \ gstrtpmpapay.c \ gstrtppcmadepay.c \ @@ -47,6 +49,8 @@ gstrtpL16pay.h \ gstrtpamrdepay.h \ gstrtpamrpay.h \ + gstrtpilbcdepay.h \ + gstrtpilbcpay.h \ gstrtppcmadepay.h \ gstrtppcmudepay.h \ gstrtppcmupay.h \ Index: gstrtp.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtp.c,v retrieving revision 1.30 retrieving revision 1.31 diff -u -d -r1.30 -r1.31 --- gstrtp.c 22 Sep 2006 15:15:13 -0000 1.30 +++ gstrtp.c 31 Oct 2006 10:52:31 -0000 1.31 @@ -22,6 +22,8 @@ #endif #include "gstrtpdepay.h" +#include "gstrtpilbcdepay.h" +#include "gstrtpilbcpay.h" #include "gstrtppcmupay.h" #include "gstrtppcmapay.h" #include "gstrtppcmadepay.h" @@ -54,6 +56,12 @@ if (!gst_rtp_depay_plugin_init (plugin)) return FALSE; + if (!gst_rtp_ilbc_pay_plugin_init (plugin)) + return FALSE; + if (!gst_rtp_ilbc_depay_plugin_init (plugin)) if (!gst_rtp_gsm_depay_plugin_init (plugin)) Index: gstrtpilbcpay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpilbcpay.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- gstrtpilbcpay.c 22 Jun 2006 19:31:04 -0000 1.3 +++ gstrtpilbcpay.c 31 Oct 2006 10:52:31 -0000 1.4 @@ -106,7 +106,7 @@ rtpilbcpay->mode = -1; /* tell basertpaudiopayload that this is a frame based codec */ - gst_basertpaudiopayload_set_frame_based (basertpaudiopayload); + gst_base_rtp_audio_payload_set_frame_based (basertpaudiopayload); } static gboolean @@ -134,7 +134,7 @@ gst_basertppayload_set_options (basertppayload, "audio", TRUE, "iLBC", 8000); /* set options for this frame based audio codec */ - gst_basertpaudiopayload_set_frame_options (basertpaudiopayload, + gst_base_rtp_audio_payload_set_frame_options (basertpaudiopayload, mode, mode == 30 ? 50 : 38); } else { |
From: <wt...@ke...> - 2006-11-27 16:27:07
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Mon Nov 27 2006 16:27:02 UTC Log message: * gst/rtp/gstrtpmpadepay.c: (gst_rtp_mpa_depay_chain): Small buffer overflow fix and improve debugging. Modified files: . : ChangeLog gst/rtp : gstrtpmpadepay.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2635&r2=1.2636 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmpadepay.c.diff?r1=1.15&r2=1.16 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2635 retrieving revision 1.2636 diff -u -d -r1.2635 -r1.2636 --- ChangeLog 24 Nov 2006 08:58:53 -0000 1.2635 +++ ChangeLog 27 Nov 2006 16:26:50 -0000 1.2636 @@ -1,3 +1,8 @@ +2006-11-27 Wim Taymans <wi...@fl...> + + * gst/rtp/gstrtpmpadepay.c: (gst_rtp_mpa_depay_chain): + Small buffer overflow fix and improve debugging. 2006-11-24 Stefan Kost <en...@us...> * ext/esd/esdmon.h: Index: gstrtpmpadepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmpadepay.c,v retrieving revision 1.15 retrieving revision 1.16 diff -u -d -r1.15 -r1.16 --- gstrtpmpadepay.c 8 Nov 2006 01:30:39 -0000 1.15 +++ gstrtpmpadepay.c 27 Nov 2006 16:26:50 -0000 1.16 @@ -174,7 +174,8 @@ payload_len = gst_rtp_buffer_get_payload_len (buf); payload = gst_rtp_buffer_get_payload (buf); - frag_offset = (payload[2] << 8) | payload[3]; + if (payload_len <= 4) + goto empty_packet; /* strip off header * @@ -184,6 +185,8 @@ * | MBZ | Frag_offset | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ + frag_offset = (payload[2] << 8) | payload[3]; payload_len -= 4; payload += 4; @@ -195,7 +198,8 @@ memcpy (GST_BUFFER_DATA (outbuf), payload, payload_len); - GST_DEBUG ("gst_rtp_mpa_depay_chain: pushing buffer of size %d", + GST_DEBUG_OBJECT (rtpmpadepay, + "gst_rtp_mpa_depay_chain: pushing buffer of size %d", GST_BUFFER_SIZE (outbuf)); gst_buffer_unref (buf); @@ -209,16 +213,22 @@ bad_packet: { - GST_DEBUG ("Packet did not validate"); + GST_DEBUG_OBJECT (rtpmpadepay, "Packet did not validate"); return GST_FLOW_ERROR; } bad_payload: - GST_DEBUG ("Unexpected payload type %u", pt); + GST_DEBUG_OBJECT (rtpmpadepay, "Unexpected payload type %u", pt); +empty_packet: + { + GST_DEBUG_OBJECT (rtpmpadepay, "Empty payload"); + gst_buffer_unref (buf); + return GST_FLOW_OK; + } } static void |
From: <wt...@ke...> - 2007-01-09 12:24:04
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Tue Jan 09 2007 12:24:00 UTC Log message: * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: (plugin_init): * gst/rtp/gstrtpmpvdepay.c: (gst_rtp_mpv_depay_base_init), (gst_rtp_mpv_depay_class_init), (gst_rtp_mpv_depay_init), (gst_rtp_mpv_depay_setcaps), (gst_rtp_mpv_depay_process), (gst_rtp_mpv_depay_set_property), (gst_rtp_mpv_depay_get_property), (gst_rtp_mpv_depay_change_state), (gst_rtp_mpv_depay_plugin_init): * gst/rtp/gstrtpmpvdepay.h: Added RFC 2250 MPEG Video Depayloader. * gst/rtp/gstrtpL16depay.h: * gst/rtp/gstrtph263pdepay.c: (gst_rtp_h263p_depay_setcaps), (gst_rtp_h263p_depay_process): Fix Header file. Small cleanups. * gst/rtp/gstrtpmp4gdepay.c: (gst_rtp_mp4g_depay_class_init), (gst_rtp_mp4g_depay_init), (gst_rtp_mp4g_depay_finalize), (gst_rtp_mp4g_depay_process), (gst_rtp_mp4g_depay_change_state): * gst/rtp/gstrtpmp4vdepay.c: (gst_rtp_mp4v_depay_class_init), (gst_rtp_mp4v_depay_init), (gst_rtp_mp4v_depay_finalize), (gst_rtp_mp4v_depay_setcaps), (gst_rtp_mp4v_depay_process), (gst_rtp_mp4v_depay_change_state): Remove usused code. Remove Adapter from state Change. Added debug. * gst/rtp/gstrtpmpadepay.c: (gst_rtp_mpa_depay_base_init), (gst_rtp_mpa_depay_class_init), (gst_rtp_mpa_depay_init), (gst_rtp_mpa_depay_setcaps), (gst_rtp_mpa_depay_process): * gst/rtp/gstrtpmpadepay.h: Subclass base depayloader. Added debug. Support static payload type assignment as well. * gst/rtp/gstrtpmpapay.c: Fix caps. Modified files: . : ChangeLog gst/rtp : Makefile.am gstrtp.c gstrtpL16depay.h gstrtph263pdepay.c gstrtpmp4gdepay.c gstrtpmp4vdepay.c gstrtpmpadepay.c gstrtpmpadepay.h gstrtpmpapay.c Added files: gst/rtp : gstrtpmpvdepay.c gstrtpmpvdepay.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2681&r2=1.2682 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/Makefile.am.diff?r1=1.36&r2=1.37 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtp.c.diff?r1=1.32&r2=1.33 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpL16depay.h.diff?r1=1.11&r2=1.12 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtph263pdepay.c.diff?r1=1.18&r2=1.19 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gdepay.c.diff?r1=1.5&r2=1.6 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4vdepay.c.diff?r1=1.18&r2=1.19 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmpadepay.c.diff?r1=1.16&r2=1.17 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmpadepay.h.diff?r1=1.6&r2=1.7 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmpapay.c.diff?r1=1.17&r2=1.18 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmpvdepay.c?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmpvdepay.h?rev=1.1&content-type=text/vnd.viewcvs-markup ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2681 retrieving revision 1.2682 diff -u -d -r1.2681 -r1.2682 --- ChangeLog 8 Jan 2007 12:45:10 -0000 1.2681 +++ ChangeLog 9 Jan 2007 12:23:47 -0000 1.2682 @@ -1,3 +1,40 @@ +2007-01-09 Wim Taymans <wi...@fl...> + + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: (plugin_init): + * gst/rtp/gstrtpmpvdepay.c: (gst_rtp_mpv_depay_base_init), + (gst_rtp_mpv_depay_class_init), (gst_rtp_mpv_depay_init), + (gst_rtp_mpv_depay_setcaps), (gst_rtp_mpv_depay_process), + (gst_rtp_mpv_depay_set_property), (gst_rtp_mpv_depay_get_property), + (gst_rtp_mpv_depay_change_state), (gst_rtp_mpv_depay_plugin_init): + * gst/rtp/gstrtpmpvdepay.h: + Added RFC 2250 MPEG Video Depayloader. + * gst/rtp/gstrtpL16depay.h: + * gst/rtp/gstrtph263pdepay.c: (gst_rtp_h263p_depay_setcaps), + (gst_rtp_h263p_depay_process): + Fix Header file. Small cleanups. + * gst/rtp/gstrtpmp4gdepay.c: (gst_rtp_mp4g_depay_class_init), + (gst_rtp_mp4g_depay_init), (gst_rtp_mp4g_depay_finalize), + (gst_rtp_mp4g_depay_process), (gst_rtp_mp4g_depay_change_state): + * gst/rtp/gstrtpmp4vdepay.c: (gst_rtp_mp4v_depay_class_init), + (gst_rtp_mp4v_depay_init), (gst_rtp_mp4v_depay_finalize), + (gst_rtp_mp4v_depay_setcaps), (gst_rtp_mp4v_depay_process), + (gst_rtp_mp4v_depay_change_state): + Remove usused code. Remove Adapter from state Change. Added debug. + * gst/rtp/gstrtpmpadepay.c: (gst_rtp_mpa_depay_base_init), + (gst_rtp_mpa_depay_class_init), (gst_rtp_mpa_depay_init), + (gst_rtp_mpa_depay_setcaps), (gst_rtp_mpa_depay_process): + * gst/rtp/gstrtpmpadepay.h: + Subclass base depayloader. + Added debug. + Support static payload type assignment as well. + * gst/rtp/gstrtpmpapay.c: + Fix caps. 2007-01-08 Tim-Philipp Müller <tim at centricular dot net> Patch by: Vincent Torri <vtorri at univ-evry fr> Index: Makefile.am RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/Makefile.am,v retrieving revision 1.36 retrieving revision 1.37 diff -u -d -r1.36 -r1.37 --- Makefile.am 8 Nov 2006 01:28:00 -0000 1.36 +++ Makefile.am 9 Jan 2007 12:23:48 -0000 1.37 @@ -7,6 +7,7 @@ gstrtpilbcpay.c \ gstrtpmpadepay.c \ gstrtpmpapay.c \ + gstrtpmpvdepay.c \ gstrtppcmadepay.c \ gstrtppcmudepay.c \ gstrtppcmupay.c \ @@ -62,6 +63,7 @@ gstrtpgsmpay.h \ gstrtpmpadepay.h \ gstrtpmpapay.h \ + gstrtpmpvdepay.h \ gstrtph263pdepay.h \ gstrtph263ppay.h \ gstrtph263pay.h \ Index: gstrtp.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtp.c,v retrieving revision 1.32 retrieving revision 1.33 diff -u -d -r1.32 -r1.33 --- gstrtp.c 8 Nov 2006 01:28:00 -0000 1.32 +++ gstrtp.c 9 Jan 2007 12:23:48 -0000 1.33 @@ -34,6 +34,7 @@ #include "gstrtpamrdepay.h" #include "gstrtpmpapay.h" #include "gstrtpmpadepay.h" +#include "gstrtpmpvdepay.h" #include "gstrtph263pdepay.h" #include "gstrtph263ppay.h" #include "gstrtph263pay.h" @@ -94,6 +95,9 @@ if (!gst_rtp_mpa_pay_plugin_init (plugin)) return FALSE; + if (!gst_rtp_mpv_depay_plugin_init (plugin)) + return FALSE; if (!gst_rtp_h263p_pay_plugin_init (plugin)) Index: gstrtpL16depay.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpL16depay.h,v retrieving revision 1.11 retrieving revision 1.12 diff -u -d -r1.11 -r1.12 --- gstrtpL16depay.h 1 Jun 2006 21:07:25 -0000 1.11 +++ gstrtpL16depay.h 9 Jan 2007 12:23:48 -0000 1.12 @@ -24,13 +24,24 @@ #include "rtp-packet.h" #include "gstrtp-common.h" -#ifdef __cplusplus -extern "C" -{ -#endif /* __cplusplus */ +G_BEGIN_DECLS +/* Standard macros for defining types for this element. */ +#define GST_TYPE_RTP_L16_DEPAY \ + (gst_rtp_L16depay_get_type()) +#define GST_RTP_L16_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_L16_DEPAY,GstRtpL16Depay)) +#define GST_RTP_L16_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_L16_DEPAY,GstRtpL16DepayClass)) +#define GST_IS_RTP_L16_DEPAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_L16_DEPAY)) +#define GST_IS_RTP_L16_DEPAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_L16_DEPAY)) -/* Definition of structure storing data for this element. */ typedef struct _GstRtpL16Depay GstRtpL16Depay; +typedef struct _GstRtpL16DepayClass GstRtpL16DepayClass; +/* Definition of structure storing data for this element. */ struct _GstRtpL16Depay { GstElement element; @@ -45,29 +56,13 @@ }; /* Standard definition defining a class for this element. */ -typedef struct _GstRtpL16DepayClass GstRtpL16DepayClass; struct _GstRtpL16DepayClass GstElementClass parent_class; -/* Standard macros for defining types for this element. */ -#define GST_TYPE_RTP_L16_DEPAY \ - (gst_rtp_L16depay_get_type()) -#define GST_RTP_L16_DEPAY(obj) \ - (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_L16_DEPAY,GstRtpL16Depay)) -#define GST_RTP_L16_DEPAY_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_L16_DEPAY,GstRtpL16DepayClass)) -#define GST_IS_RTP_L16_DEPAY(obj) \ - (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_L16_DEPAY)) -#define GST_IS_RTP_L16_DEPAY_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_L16_DEPAY)) - gboolean gst_rtp_L16depay_plugin_init (GstPlugin * plugin); -} +G_END_DECLS -#endif /* __GST_RTP_L16_DEPAY_H__ */ +#endif /* __GST_RTP_L16_DEPAY_H__ */ Index: gstrtph263pdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtph263pdepay.c,v retrieving revision 1.18 retrieving revision 1.19 diff -u -d -r1.18 -r1.19 --- gstrtph263pdepay.c 16 Nov 2006 07:26:17 -0000 1.18 +++ gstrtph263pdepay.c 9 Jan 2007 12:23:48 -0000 1.19 @@ -138,18 +138,14 @@ G_OBJECT_CLASS (parent_class)->finalize (object); } -// only on the sink gboolean gst_rtp_h263p_depay_setcaps (GstBaseRTPDepayload * filter, GstCaps * caps) GstStructure *structure = gst_caps_get_structure (caps, 0); - gint clock_rate = 90000; // default - if (gst_structure_has_field (structure, "clock-rate")) { - gst_structure_get_int (structure, "clock-rate", &clock_rate); - } + gint clock_rate = 90000; /* default */ + gst_structure_get_int (structure, "clock-rate", &clock_rate); filter->clock_rate = clock_rate; return TRUE; @@ -163,18 +159,11 @@ GstRtpH263PDepay *rtph263pdepay; GstBuffer *outbuf; - /* GstRTPPayload pt; */ rtph263pdepay = GST_RTP_H263P_DEPAY (depayload); if (!gst_rtp_buffer_validate (buf)) goto bad_packet; - /* - if ((pt = gst_rtp_buffer_get_payload_type (buf)) != 0) - goto bad_payload; - */ { gint payload_len; guint8 *payload; @@ -249,29 +238,16 @@ memcpy (GST_BUFFER_DATA (outbuf), payload, payload_len); gst_adapter_push (rtph263pdepay->adapter, outbuf); } } return NULL; bad_packet: GST_ELEMENT_WARNING (rtph263pdepay, STREAM, DECODE, ("Packet did not validate"), (NULL)); return NULL; - bad_payload: - { - GST_DEBUG ("Unexpected payload type %u", pt); - gst_buffer_unref (buf); - return GST_FLOW_ERROR; - } static void Index: gstrtpmp4gdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gdepay.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- gstrtpmp4gdepay.c 8 Nov 2006 01:30:39 -0000 1.5 +++ gstrtpmp4gdepay.c 9 Jan 2007 12:23:48 -0000 1.6 @@ -46,7 +46,6 @@ enum ARG_0, - ARG_FREQUENCY static GstStaticPadTemplate gst_rtp_mp4g_depay_src_template = @@ -92,6 +91,8 @@ GST_BOILERPLATE (GstRtpMP4GDepay, gst_rtp_mp4g_depay, GstBaseRTPDepayload, GST_TYPE_BASE_RTP_DEPAYLOAD); +static void gst_rtp_mp4g_depay_finalize (GObject * object); static gboolean gst_rtp_mp4g_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps); static GstBuffer *gst_rtp_mp4g_depay_process (GstBaseRTPDepayload * depayload, @@ -132,14 +133,15 @@ parent_class = g_type_class_peek_parent (klass); - gstbasertpdepayload_class->process = gst_rtp_mp4g_depay_process; - gstbasertpdepayload_class->set_caps = gst_rtp_mp4g_depay_setcaps; + gobject_class->finalize = gst_rtp_mp4g_depay_finalize; gobject_class->set_property = gst_rtp_mp4g_depay_set_property; gobject_class->get_property = gst_rtp_mp4g_depay_get_property; gstelement_class->change_state = gst_rtp_mp4g_depay_change_state; + gstbasertpdepayload_class->process = gst_rtp_mp4g_depay_process; + gstbasertpdepayload_class->set_caps = gst_rtp_mp4g_depay_setcaps; GST_DEBUG_CATEGORY_INIT (rtpmp4gdepay_debug, "rtpmp4gdepay", 0, "MP4-generic RTP Depayloader"); @@ -148,6 +150,20 @@ gst_rtp_mp4g_depay_init (GstRtpMP4GDepay * rtpmp4gdepay, GstRtpMP4GDepayClass * klass) + rtpmp4gdepay->adapter = gst_adapter_new (); +} +static void +gst_rtp_mp4g_depay_finalize (GObject * object) +{ + GstRtpMP4GDepay *rtpmp4gdepay; + rtpmp4gdepay = GST_RTP_MP4G_DEPAY (object); + g_object_unref (rtpmp4gdepay->adapter); + rtpmp4gdepay->adapter = NULL; + G_OBJECT_CLASS (parent_class)->finalize (object); static gboolean @@ -299,14 +315,13 @@ return NULL; + /* ERRORS */ GST_ELEMENT_WARNING (rtpmp4gdepay, STREAM, DECODE, - ("Packet did not validate"), (NULL)); + ("Packet did not validate."), (NULL)); @@ -351,9 +366,6 @@ rtpmp4gdepay = GST_RTP_MP4G_DEPAY (element); switch (transition) { - case GST_STATE_CHANGE_NULL_TO_READY: - rtpmp4gdepay->adapter = gst_adapter_new (); - break; case GST_STATE_CHANGE_READY_TO_PAUSED: gst_adapter_clear (rtpmp4gdepay->adapter); break; @@ -364,10 +376,6 @@ ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); - case GST_STATE_CHANGE_READY_TO_NULL: - g_object_unref (rtpmp4gdepay->adapter); - rtpmp4gdepay->adapter = NULL; default: Index: gstrtpmp4vdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4vdepay.c,v --- gstrtpmp4vdepay.c 8 Nov 2006 01:30:39 -0000 1.18 +++ gstrtpmp4vdepay.c 9 Jan 2007 12:23:48 -0000 1.19 @@ -26,6 +26,9 @@ #include <string.h> #include "gstrtpmp4vdepay.h" +GST_DEBUG_CATEGORY_STATIC (rtpmp4vdepay_debug); +#define GST_CAT_DEFAULT (rtpmp4vdepay_debug) /* elementfactory information */ static const GstElementDetails gst_rtp_mp4vdepay_details = GST_ELEMENT_DETAILS ("RTP packet depayloader", @@ -72,6 +75,8 @@ GST_BOILERPLATE (GstRtpMP4VDepay, gst_rtp_mp4v_depay, GstBaseRTPDepayload, +static void gst_rtp_mp4v_depay_finalize (GObject * object); static gboolean gst_rtp_mp4v_depay_setcaps (GstBaseRTPDepayload * depayload, static GstBuffer *gst_rtp_mp4v_depay_process (GstBaseRTPDepayload * depayload, @@ -108,22 +113,39 @@ gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; - gstbasertpdepayload_class->process = gst_rtp_mp4v_depay_process; - gstbasertpdepayload_class->set_caps = gst_rtp_mp4v_depay_setcaps; + gobject_class->finalize = gst_rtp_mp4v_depay_finalize; gobject_class->set_property = gst_rtp_mp4v_depay_set_property; gobject_class->get_property = gst_rtp_mp4v_depay_get_property; gstelement_class->change_state = gst_rtp_mp4v_depay_change_state; + gstbasertpdepayload_class->process = gst_rtp_mp4v_depay_process; + gstbasertpdepayload_class->set_caps = gst_rtp_mp4v_depay_setcaps; + GST_DEBUG_CATEGORY_INIT (rtpmp4vdepay_debug, "rtpmp4vdepay", 0, + "MPEG4 video RTP Depayloader"); gst_rtp_mp4v_depay_init (GstRtpMP4VDepay * rtpmp4vdepay, GstRtpMP4VDepayClass * klass) + rtpmp4vdepay->adapter = gst_adapter_new (); +gst_rtp_mp4v_depay_finalize (GObject * object) + GstRtpMP4VDepay *rtpmp4vdepay; + rtpmp4vdepay = GST_RTP_MP4V_DEPAY (object); + g_object_unref (rtpmp4vdepay->adapter); + rtpmp4vdepay->adapter = NULL; @@ -140,10 +162,7 @@ structure = gst_caps_get_structure (caps, 0); depayload->clock_rate = clock_rate; srccaps = gst_caps_new_simple ("video/mpeg", @@ -230,7 +249,6 @@ GST_ELEMENT_WARNING (rtpmp4vdepay, STREAM, DECODE, @@ -275,9 +293,6 @@ rtpmp4vdepay = GST_RTP_MP4V_DEPAY (element); - rtpmp4vdepay->adapter = gst_adapter_new (); gst_adapter_clear (rtpmp4vdepay->adapter); @@ -288,10 +303,6 @@ - g_object_unref (rtpmp4vdepay->adapter); - rtpmp4vdepay->adapter = NULL; Index: gstrtpmpadepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmpadepay.c,v retrieving revision 1.16 retrieving revision 1.17 diff -u -d -r1.16 -r1.17 --- gstrtpmpadepay.c 27 Nov 2006 16:26:50 -0000 1.16 +++ gstrtpmpadepay.c 9 Jan 2007 12:23:48 -0000 1.17 +GST_DEBUG_CATEGORY_STATIC (rtpmpadepay_debug); +#define GST_CAT_DEFAULT (rtpmpadepay_debug) static const GstElementDetails gst_rtp_mpadepay_details = @@ -43,7 +46,6 @@ static GstStaticPadTemplate gst_rtp_mpa_depay_src_template = @@ -54,20 +56,25 @@ ); static GstStaticPadTemplate gst_rtp_mpa_depay_sink_template = -GST_STATIC_PAD_TEMPLATE ("sink", + GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"audio\", " - "clock-rate = (int) 90000, " "encoding-name = (string) \"MPA\"") + "clock-rate = (int) 90000, " "encoding-name = (string) \"MPA\";" + "application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_MPA_STRING ", " + "clock-rate = (int) 90000") +GST_BOILERPLATE (GstRtpMPADepay, gst_rtp_mpa_depay, GstBaseRTPDepayload, + GST_TYPE_BASE_RTP_DEPAYLOAD); -static void gst_rtp_mpa_depay_class_init (GstRtpMPADepayClass * klass); -static void gst_rtp_mpa_depay_base_init (GstRtpMPADepayClass * klass); -static void gst_rtp_mpa_depay_init (GstRtpMPADepay * rtpmpadepay); -static GstFlowReturn gst_rtp_mpa_depay_chain (GstPad * pad, GstBuffer * buffer); +static gboolean gst_rtp_mpa_depay_setcaps (GstBaseRTPDepayload * depayload, + GstCaps * caps); +static GstBuffer *gst_rtp_mpa_depay_process (GstBaseRTPDepayload * depayload, + GstBuffer * buf); static void gst_rtp_mpa_depay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); @@ -77,35 +84,8 @@ static GstStateChangeReturn gst_rtp_mpa_depay_change_state (GstElement * element, GstStateChange transition); -static GstElementClass *parent_class = NULL; -static GType -gst_rtp_mpa_depay_get_type (void) - static GType rtpmpadepay_type = 0; - if (!rtpmpadepay_type) { - static const GTypeInfo rtpmpadepay_info = { - sizeof (GstRtpMPADepayClass), - (GBaseInitFunc) gst_rtp_mpa_depay_base_init, - NULL, - (GClassInitFunc) gst_rtp_mpa_depay_class_init, - sizeof (GstRtpMPADepay), - 0, - (GInstanceInitFunc) gst_rtp_mpa_depay_init, - }; - rtpmpadepay_type = - g_type_register_static (GST_TYPE_ELEMENT, "GstRtpMPADepay", - &rtpmpadepay_info, 0); - return rtpmpadepay_type; -gst_rtp_mpa_depay_base_init (GstRtpMPADepayClass * klass) +gst_rtp_mpa_depay_base_init (gpointer klass) GstElementClass *element_class = GST_ELEMENT_CLASS (klass); @@ -122,9 +102,11 @@ GObjectClass *gobject_class; GstElementClass *gstelement_class; + GstBaseRTPDepayloadClass *gstbasertpdepayload_class; + gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; @@ -132,39 +114,48 @@ gobject_class->get_property = gst_rtp_mpa_depay_get_property; gstelement_class->change_state = gst_rtp_mpa_depay_change_state; + gstbasertpdepayload_class->set_caps = gst_rtp_mpa_depay_setcaps; + gstbasertpdepayload_class->process = gst_rtp_mpa_depay_process; + GST_DEBUG_CATEGORY_INIT (rtpmpadepay_debug, "rtpmpadepay", 0, + "MPEG Audio RTP Depayloader"); -gst_rtp_mpa_depay_init (GstRtpMPADepay * rtpmpadepay) +gst_rtp_mpa_depay_init (GstRtpMPADepay * rtpmpadepay, + GstRtpMPADepayClass * klass) - rtpmpadepay->srcpad = - gst_pad_new_from_static_template (&gst_rtp_mpa_depay_src_template, "src"); - gst_element_add_pad (GST_ELEMENT (rtpmpadepay), rtpmpadepay->srcpad); - rtpmpadepay->sinkpad = - gst_pad_new_from_static_template (&gst_rtp_mpa_depay_sink_template, - "sink"); - gst_pad_set_chain_function (rtpmpadepay->sinkpad, gst_rtp_mpa_depay_chain); - gst_element_add_pad (GST_ELEMENT (rtpmpadepay), rtpmpadepay->sinkpad); +static gboolean +gst_rtp_mpa_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) + GstStructure *structure; + GstRtpMPADepay *rtpmpadepay; + rtpmpadepay = GST_RTP_MPA_DEPAY (depayload); + structure = gst_caps_get_structure (caps, 0); + depayload->clock_rate = clock_rate; + return TRUE; -static GstFlowReturn -gst_rtp_mpa_depay_chain (GstPad * pad, GstBuffer * buf) +static GstBuffer * +gst_rtp_mpa_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) GstRtpMPADepay *rtpmpadepay; - guint8 pt; - GstFlowReturn ret; - rtpmpadepay = GST_RTP_MPA_DEPAY (GST_OBJECT_PARENT (pad)); - if ((pt = gst_rtp_buffer_get_payload_type (buf)) != GST_RTP_PAYLOAD_MPA) - goto bad_payload; @@ -202,32 +193,32 @@ "gst_rtp_mpa_depay_chain: pushing buffer of size %d", GST_BUFFER_SIZE (outbuf)); - gst_buffer_unref (buf); /* FIXME, we can push half mpeg frames when they are split over multiple * RTP packets */ - ret = gst_pad_push (rtpmpadepay->srcpad, outbuf); + return outbuf; - return ret; + return NULL; - GST_DEBUG_OBJECT (rtpmpadepay, "Packet did not validate"); - return GST_FLOW_ERROR; + GST_ELEMENT_WARNING (rtpmpadepay, STREAM, DECODE, + return NULL; +#if 0 bad_payload: - GST_DEBUG_OBJECT (rtpmpadepay, "Unexpected payload type %u", pt); + ("Unexpected payload type."), (NULL)); +#endif empty_packet: - GST_DEBUG_OBJECT (rtpmpadepay, "Empty payload"); - return GST_FLOW_OK; + ("Empty Payload."), (NULL)); Index: gstrtpmpadepay.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmpadepay.h,v retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- gstrtpmpadepay.h 1 Jun 2006 21:07:25 -0000 1.6 +++ gstrtpmpadepay.h 9 Jan 2007 12:23:48 -0000 1.7 @@ -21,6 +21,7 @@ #define __GST_RTP_MPA_DEPAY_H__ #include <gst/gst.h> +#include <gst/rtp/gstbasertpdepayload.h> G_BEGIN_DECLS @@ -40,17 +41,12 @@ struct _GstRtpMPADepay - GstElement element; - GstPad *sinkpad; - GstPad *srcpad; - guint frequency; + GstBaseRTPDepayload depayload; struct _GstRtpMPADepayClass - GstElementClass parent_class; + GstBaseRTPDepayloadClass parent_class; gboolean gst_rtp_mpa_depay_plugin_init (GstPlugin * plugin); Index: gstrtpmpapay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmpapay.c,v diff -u -d -r1.17 -r1.18 --- gstrtpmpapay.c 8 Nov 2006 01:30:39 -0000 1.17 +++ gstrtpmpapay.c 9 Jan 2007 12:23:48 -0000 1.18 @@ -48,7 +48,7 @@ "payload = (int) " GST_RTP_PAYLOAD_MPA_STRING ", " - "clock-rate = (int) 90000, " "encoding-name = (string) \"MPA\"; " + "clock-rate = (int) 90000; " "application/x-rtp, " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " --- NEW FILE: gstrtpmpvdepay.c --- /* GStreamer * Copyright (C) <2006> Wim Taymans <wi...@fl...> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include <gst/rtp/gstrtpbuffer.h> #include <string.h> #include "gstrtpmpvdepay.h" GST_DEBUG_CATEGORY_STATIC (rtpmpvdepay_debug); #define GST_CAT_DEFAULT (rtpmpvdepay_debug) /* elementfactory information */ static const GstElementDetails gst_rtp_mpvdepay_details = GST_ELEMENT_DETAILS ("RTP packet depayloader", "Codec/Depayloader/Network", "Extracts MPEG video from RTP packets (RFC 2250)", "Wim Taymans <wi...@fl...>"); /* RtpMPVDepay signals and args */ enum { /* FILL ME */ LAST_SIGNAL }; ARG_0, static GstStaticPadTemplate gst_rtp_mpv_depay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/mpeg") ); static GstStaticPadTemplate gst_rtp_mpv_depay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"video\", " "clock-rate = (int) 90000, " "encoding-name = (string) \"MPV\";" "application/x-rtp, " "payload = (int) " GST_RTP_PAYLOAD_MPV_STRING ", " "clock-rate = (int) 90000") GST_BOILERPLATE (GstRtpMPVDepay, gst_rtp_mpv_depay, GstBaseRTPDepayload, GST_TYPE_BASE_RTP_DEPAYLOAD); static gboolean gst_rtp_mpv_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps); static GstBuffer *gst_rtp_mpv_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf); static void gst_rtp_mpv_depay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_rtp_mpv_depay_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static GstStateChangeReturn gst_rtp_mpv_depay_change_state (GstElement * element, GstStateChange transition); static void gst_rtp_mpv_depay_base_init (gpointer klass) GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&gst_rtp_mpv_depay_src_template)); gst_static_pad_template_get (&gst_rtp_mpv_depay_sink_template)); gst_element_class_set_details (element_class, &gst_rtp_mpvdepay_details); } gst_rtp_mpv_depay_class_init (GstRtpMPVDepayClass * klass) GObjectClass *gobject_class; GstElementClass *gstelement_class; GstBaseRTPDepayloadClass *gstbasertpdepayload_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; parent_class = g_type_class_peek_parent (klass); gobject_class->set_property = gst_rtp_mpv_depay_set_property; gobject_class->get_property = gst_rtp_mpv_depay_get_property; gstelement_class->change_state = gst_rtp_mpv_depay_change_state; gstbasertpdepayload_class->set_caps = gst_rtp_mpv_depay_setcaps; gstbasertpdepayload_class->process = gst_rtp_mpv_depay_process; GST_DEBUG_CATEGORY_INIT (rtpmpvdepay_debug, "rtpmpvdepay", 0, "MPEG Video RTP Depayloader"); gst_rtp_mpv_depay_init (GstRtpMPVDepay * rtpmpvdepay, GstRtpMPVDepayClass * klass) static gboolean gst_rtp_mpv_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) GstStructure *structure; GstRtpMPVDepay *rtpmpvdepay; gint clock_rate = 90000; /* default */ rtpmpvdepay = GST_RTP_MPV_DEPAY (depayload); structure = gst_caps_get_structure (caps, 0); gst_structure_get_int (structure, "clock-rate", &clock_rate); depayload->clock_rate = clock_rate; return TRUE; static GstBuffer * gst_rtp_mpv_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) GstBuffer *outbuf; if (!gst_rtp_buffer_validate (buf)) goto bad_packet; { gint payload_len; guint8 *payload; guint8 T; guint32 timestamp; payload_len = gst_rtp_buffer_get_payload_len (buf); payload = gst_rtp_buffer_get_payload (buf); if (payload_len <= 4) goto empty_packet; /* 3.4 MPEG Video-specific header * * 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | MBZ |T| TR | |N|S|B|E| P | | BFC | | FFC | * AN FBV FFV */ T = (payload[0] & 0x04); payload_len -= 4; payload += 4; if (T) { /* * 3.4.1 MPEG-2 Video-specific header extension * * 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * |X|E|f_[0,0]|f_[0,1]|f_[1,0]|f_[1,1]| DC| PS|T|P|C|Q|V|A|R|H|G|D| */ if (payload_len <= 4) goto empty_packet; payload_len -= 4; payload += 4; } timestamp = gst_rtp_buffer_get_timestamp (buf); outbuf = gst_buffer_new_and_alloc (payload_len); memcpy (GST_BUFFER_DATA (outbuf), payload, payload_len); GST_DEBUG_OBJECT (rtpmpvdepay, "gst_rtp_mpv_depay_chain: pushing buffer of size %d", GST_BUFFER_SIZE (outbuf)); return outbuf; } return NULL; bad_packet: GST_ELEMENT_WARNING (rtpmpvdepay, STREAM, DECODE, ("Packet did not validate."), (NULL)); return NULL; #if 0 bad_payload: GST_DEBUG_OBJECT (rtpmpvdepay, "Unexpected payload type %u", pt); empty_packet: ("Empty payload."), (NULL)); gst_rtp_mpv_depay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) rtpmpvdepay = GST_RTP_MPV_DEPAY (object); switch (prop_id) { default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; gst_rtp_mpv_depay_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) static GstStateChangeReturn gst_rtp_mpv_depay_change_state (GstElement * element, GstStateChange transition) GstStateChangeReturn ret; rtpmpvdepay = GST_RTP_MPV_DEPAY (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); case GST_STATE_CHANGE_READY_TO_NULL: return ret; gboolean gst_rtp_mpv_depay_plugin_init (GstPlugin * plugin) return gst_element_register (plugin, "rtpmpvdepay", GST_RANK_MARGINAL, GST_TYPE_RTP_MPV_DEPAY); --- NEW FILE: gstrtpmpvdepay.h --- * Copyright (C) <2005> Wim Taymans <wi...@fl...> #ifndef __GST_RTP_MPV_DEPAY_H__ #define __GST_RTP_MPV_DEPAY_H__ #include <gst/gst.h> #include <gst/rtp/gstbasertpdepayload.h> G_BEGIN_DECLS #define GST_TYPE_RTP_MPV_DEPAY \ (gst_rtp_mpv_depay_get_type()) #define GST_RTP_MPV_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_MPV_DEPAY,GstRtpMPVDepay)) #define GST_RTP_MPV_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_MPV_DEPAY,GstRtpMPVDepayClass)) #define GST_IS_RTP_MPV_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_MPV_DEPAY)) #define GST_IS_RTP_MPV_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_MPV_DEPAY)) typedef struct _GstRtpMPVDepay GstRtpMPVDepay; typedef struct _GstRtpMPVDepayClass GstRtpMPVDepayClass; struct _GstRtpMPVDepay GstBaseRTPDepayload depayload; struct _GstRtpMPVDepayClass GstBaseRTPDepayloadClass parent_class; gboolean gst_rtp_mpv_depay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_MPV_DEPAY_H__ */ |
From: <wt...@ke...> - 2007-01-23 17:36:48
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Tue Jan 23 2007 17:36:44 UTC Log message: * gst/rtp/gstrtpmp4gdepay.c: (gst_rtp_mp4g_depay_parse_int), (gst_rtp_mp4g_depay_setcaps), (gst_rtp_mp4g_depay_process): Parse config params as string and int. Parse and use AU header length Modified files: . : ChangeLog gst/rtp : gstrtpmp4gdepay.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2701&r2=1.2702 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gdepay.c.diff?r1=1.6&r2=1.7 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2701 retrieving revision 1.2702 diff -u -d -r1.2701 -r1.2702 --- ChangeLog 23 Jan 2007 17:27:38 -0000 1.2701 +++ ChangeLog 23 Jan 2007 17:36:32 -0000 1.2702 @@ -1,5 +1,12 @@ 2007-01-23 Wim Taymans <wi...@fl...> + * gst/rtp/gstrtpmp4gdepay.c: (gst_rtp_mp4g_depay_parse_int), + (gst_rtp_mp4g_depay_setcaps), (gst_rtp_mp4g_depay_process): + Parse config params as string and int. + Parse and use AU header length + +2007-01-23 Wim Taymans <wi...@fl...> * gst/smpte/barboxwipes.c: (gst_wipe_boxes_draw), (gst_wipe_triangles_clock_draw), (gst_wipe_triangles_draw): * gst/smpte/gstmask.c: (_gst_mask_register): Index: gstrtpmp4gdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gdepay.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- gstrtpmp4gdepay.c 9 Jan 2007 12:23:48 -0000 1.6 +++ gstrtpmp4gdepay.c 23 Jan 2007 17:36:32 -0000 1.7 @@ -166,6 +166,22 @@ G_OBJECT_CLASS (parent_class)->finalize (object); } +static gint +gst_rtp_mp4g_depay_parse_int (GstStructure * structure, const gchar * field, + gint def) +{ + const gchar *str; + gint res; + if ((str = gst_structure_get_string (structure, field))) + return atoi (str); + if (gst_structure_get_int (structure, field, &res)) + return res; + return def; +} static gboolean gst_rtp_mp4g_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) { @@ -198,37 +214,23 @@ goto unknown_media; /* these values are optional and have a default value of 0 (no header) */ - if (!gst_structure_get_int (structure, "sizelength", &someint)) - someint = 0; - rtpmp4gdepay->sizelength = someint; - - if (!gst_structure_get_int (structure, "indexlength", &someint)) - rtpmp4gdepay->indexlength = someint; - rtpmp4gdepay->indexdeltalength = someint; - if (!gst_structure_get_int (structure, "ctsdeltalength", &someint)) - rtpmp4gdepay->ctsdeltalength = someint; - if (!gst_structure_get_int (structure, "dtsdeltalength", &someint)) - rtpmp4gdepay->dtsdeltalength = someint; - if (!gst_structure_get_int (structure, "randomaccessindication", &someint)) + rtpmp4gdepay->sizelength = + gst_rtp_mp4g_depay_parse_int (structure, "sizelength", 0); + rtpmp4gdepay->indexlength = + gst_rtp_mp4g_depay_parse_int (structure, "indexlength", 0); + rtpmp4gdepay->indexdeltalength = + gst_rtp_mp4g_depay_parse_int (structure, "indexdeltalength", 0); + rtpmp4gdepay->ctsdeltalength = + gst_rtp_mp4g_depay_parse_int (structure, "ctsdeltalength", 0); + rtpmp4gdepay->dtsdeltalength = + gst_rtp_mp4g_depay_parse_int (structure, "dtsdeltalength", 0); + someint = + gst_rtp_mp4g_depay_parse_int (structure, "randomaccessindication", 0); rtpmp4gdepay->randomaccessindication = someint > 0 ? 1 : 0; - if (!gst_structure_get_int (structure, "streamstateindication", &someint)) - rtpmp4gdepay->streamstateindication = someint; - if (!gst_structure_get_int (structure, "auxiliarydatasizelength", &someint)) - rtpmp4gdepay->auxiliarydatasizelength = someint; + rtpmp4gdepay->streamstateindication = + gst_rtp_mp4g_depay_parse_int (structure, "streamstateindication", 0); + rtpmp4gdepay->auxiliarydatasizelength = + gst_rtp_mp4g_depay_parse_int (structure, "auxiliarydatasizelength", 0); /* get config string */ if ((str = gst_structure_get_string (structure, "config"))) { @@ -277,13 +279,38 @@ gint payload_len; guint8 *payload; guint32 timestamp; + guint AU_headers_len; + guint AU_size, AU_index; payload_len = gst_rtp_buffer_get_payload_len (buf); payload = gst_rtp_buffer_get_payload (buf); - /* skip header */ - payload += 4; - payload_len -= 4; + if (rtpmp4gdepay->sizelength > 0) { + /* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- .. -+-+-+-+-+-+-+-+-+-+ + * |AU-headers-length|AU-header|AU-header| |AU-header|padding| + * | | (1) | (2) | | (n) * | bits | + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- .. -+-+-+-+-+-+-+-+-+-+ + * + * The lenght is 2 bytes and contains the length of the following + * AU-headers in bits. + */ + AU_headers_len = (payload[0] << 8) | payload[1]; + /* skip header */ + payload += 2; + payload_len -= 2; + /* FIXME, use bits */ + AU_size = ((payload[0] << 8) | payload[1]) >> 3; + AU_index = payload[1] & 0x7; + GST_DEBUG_OBJECT (rtpmp4gdepay, "len, %d, size %d, index %d", + AU_headers_len, AU_size, AU_index); + /* skip special headers */ + payload += (AU_headers_len + 7) / 8; + payload_len = AU_size; + } timestamp = gst_rtp_buffer_get_timestamp (buf); @@ -304,8 +331,8 @@ gst_adapter_take (rtpmp4gdepay->adapter, avail); GST_BUFFER_DATA (outbuf) = GST_BUFFER_MALLOCDATA (outbuf); gst_buffer_set_caps (outbuf, GST_PAD_CAPS (depayload->srcpad)); - GST_BUFFER_TIMESTAMP (outbuf) = - timestamp * GST_SECOND / depayload->clock_rate; + GST_BUFFER_TIMESTAMP (outbuf) = gst_util_uint64_scale_int + (timestamp, GST_SECOND, depayload->clock_rate); GST_DEBUG ("gst_rtp_mp4g_depay_chain: pushing buffer of size %d", GST_BUFFER_SIZE (outbuf)); |
From: <wt...@ke...> - 2007-01-24 12:23:06
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Wed Jan 24 2007 12:23:03 UTC Log message: * gst/rtp/gstrtpamrdepay.c: * gst/rtp/gstrtpgsmdepay.c: * gst/rtp/gstrtph263pdepay.c: * gst/rtp/gstrtph263ppay.c: * gst/rtp/gstrtph264depay.c: * gst/rtp/gstrtpilbcdepay.c: * gst/rtp/gstrtpmp2tdepay.c: * gst/rtp/gstrtpmp4gdepay.c: * gst/rtp/gstrtpmp4gpay.c: * gst/rtp/gstrtpmp4vdepay.c: (gst_rtp_mp4v_depay_class_init): * gst/rtp/gstrtpmp4vpay.c: * gst/rtp/gstrtpmpadepay.c: (gst_rtp_mpa_depay_class_init), (gst_rtp_mpa_depay_init), (gst_rtp_mpa_depay_setcaps), (gst_rtp_mpa_depay_process): * gst/rtp/gstrtpmpvdepay.c: (gst_rtp_mpv_depay_class_init), (gst_rtp_mpv_depay_init), (gst_rtp_mpv_depay_process): * gst/rtp/gstrtppcmadepay.c: * gst/rtp/gstrtppcmudepay.c: * gst/rtp/gstrtpspeexdepay.c: * gst/rtp/gstrtpspeexpay.c: * gst/rtp/gstrtpsv3vdepay.c: * gst/rtp/gstrtptheoradepay.c: * gst/rtp/gstrtptheorapay.c: * gst/rtp/gstrtpvorbisdepay.c: * gst/rtp/gstrtpvorbispay.c: Fix caps with payload numbers. Add some fixed payload numbers to caps when possible. Modified files: . : ChangeLog gst/rtp : gstrtpamrdepay.c gstrtpgsmdepay.c gstrtph263pdepay.c gstrtph263ppay.c gstrtph264depay.c gstrtpilbcdepay.c gstrtpmp2tdepay.c gstrtpmp4gdepay.c gstrtpmp4gpay.c gstrtpmp4vdepay.c gstrtpmp4vpay.c gstrtpmpadepay.c gstrtpmpvdepay.c gstrtppcmadepay.c gstrtppcmudepay.c gstrtpspeexdepay.c gstrtpspeexpay.c gstrtpsv3vdepay.c gstrtptheoradepay.c gstrtptheorapay.c gstrtpvorbisdepay.c gstrtpvorbispay.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2703&r2=1.2704 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpamrdepay.c.diff?r1=1.24&r2=1.25 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpgsmdepay.c.diff?r1=1.27&r2=1.28 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtph263pdepay.c.diff?r1=1.19&r2=1.20 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtph263ppay.c.diff?r1=1.19&r2=1.20 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtph264depay.c.diff?r1=1.5&r2=1.6 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpilbcdepay.c.diff?r1=1.7&r2=1.8 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp2tdepay.c.diff?r1=1.3&r2=1.4 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gdepay.c.diff?r1=1.7&r2=1.8 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gpay.c.diff?r1=1.12&r2=1.13 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4vdepay.c.diff?r1=1.19&r2=1.20 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4vpay.c.diff?r1=1.23&r2=1.24 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmpadepay.c.diff?r1=1.17&r2=1.18 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmpvdepay.c.diff?r1=1.1&r2=1.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtppcmadepay.c.diff?r1=1.8&r2=1.9 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtppcmudepay.c.diff?r1=1.7&r2=1.8 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpspeexdepay.c.diff?r1=1.10&r2=1.11 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpspeexpay.c.diff?r1=1.10&r2=1.11 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpsv3vdepay.c.diff?r1=1.3&r2=1.4 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtptheoradepay.c.diff?r1=1.1&r2=1.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtptheorapay.c.diff?r1=1.1&r2=1.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpvorbisdepay.c.diff?r1=1.5&r2=1.6 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpvorbispay.c.diff?r1=1.5&r2=1.6 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2703 retrieving revision 1.2704 diff -u -d -r1.2703 -r1.2704 --- ChangeLog 23 Jan 2007 18:16:08 -0000 1.2703 +++ ChangeLog 24 Jan 2007 12:22:50 -0000 1.2704 @@ -1,3 +1,33 @@ +2007-01-24 Wim Taymans <wi...@fl...> + + * gst/rtp/gstrtpamrdepay.c: + * gst/rtp/gstrtpgsmdepay.c: + * gst/rtp/gstrtph263pdepay.c: + * gst/rtp/gstrtph263ppay.c: + * gst/rtp/gstrtph264depay.c: + * gst/rtp/gstrtpilbcdepay.c: + * gst/rtp/gstrtpmp2tdepay.c: + * gst/rtp/gstrtpmp4gdepay.c: + * gst/rtp/gstrtpmp4gpay.c: + * gst/rtp/gstrtpmp4vdepay.c: (gst_rtp_mp4v_depay_class_init): + * gst/rtp/gstrtpmp4vpay.c: + * gst/rtp/gstrtpmpadepay.c: (gst_rtp_mpa_depay_class_init), + (gst_rtp_mpa_depay_init), (gst_rtp_mpa_depay_setcaps), + (gst_rtp_mpa_depay_process): + * gst/rtp/gstrtpmpvdepay.c: (gst_rtp_mpv_depay_class_init), + (gst_rtp_mpv_depay_init), (gst_rtp_mpv_depay_process): + * gst/rtp/gstrtppcmadepay.c: + * gst/rtp/gstrtppcmudepay.c: + * gst/rtp/gstrtpspeexdepay.c: + * gst/rtp/gstrtpspeexpay.c: + * gst/rtp/gstrtpsv3vdepay.c: + * gst/rtp/gstrtptheoradepay.c: + * gst/rtp/gstrtptheorapay.c: + * gst/rtp/gstrtpvorbisdepay.c: + * gst/rtp/gstrtpvorbispay.c: + Fix caps with payload numbers. + Add some fixed payload numbers to caps when possible. 2007-01-23 Sebastian Dröge <sl...@ci...> reviewed by: Stefan Kost <en...@us...> Index: gstrtpamrdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpamrdepay.c,v retrieving revision 1.24 retrieving revision 1.25 diff -u -d -r1.24 -r1.25 --- gstrtpamrdepay.c 8 Nov 2006 01:30:39 -0000 1.24 +++ gstrtpamrdepay.c 24 Jan 2007 12:22:50 -0000 1.25 @@ -63,6 +63,7 @@ GST_PAD_ALWAYS, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) 8000, " "encoding-name = (string) \"AMR\", " "encoding-params = (string) \"1\", " Index: gstrtpgsmdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpgsmdepay.c,v retrieving revision 1.27 retrieving revision 1.28 diff -u -d -r1.27 -r1.28 --- gstrtpgsmdepay.c 8 Nov 2006 01:30:39 -0000 1.27 +++ gstrtpgsmdepay.c 24 Jan 2007 12:22:50 -0000 1.28 @@ -49,12 +49,17 @@ ); static GstStaticPadTemplate gst_rtp_gsm_depay_sink_template = -GST_STATIC_PAD_TEMPLATE ("sink", + GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, - "clock-rate = (int) 8000, " "encoding-name = (string) \"GSM\"") + "clock-rate = (int) 8000, " "encoding-name = (string) \"GSM\";" + "application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_GSM_STRING ", " + "clock-rate = (int) 8000") static GstBuffer *gst_rtp_gsm_depay_process (GstBaseRTPDepayload * _depayload, Index: gstrtph263pdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtph263pdepay.c,v retrieving revision 1.19 retrieving revision 1.20 diff -u -d -r1.19 -r1.20 --- gstrtph263pdepay.c 9 Jan 2007 12:23:48 -0000 1.19 +++ gstrtph263pdepay.c 24 Jan 2007 12:22:50 -0000 1.20 @@ -60,6 +60,7 @@ "media = (string) \"video\", " "clock-rate = (int) 90000, " "encoding-name = (string) \"H263-1998\"") Index: gstrtph263ppay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtph263ppay.c,v --- gstrtph263ppay.c 16 Nov 2006 07:26:17 -0000 1.19 +++ gstrtph263ppay.c 24 Jan 2007 12:22:50 -0000 1.20 @@ -48,7 +48,7 @@ - "payload = (int) [ 96, 127 ], " Index: gstrtph264depay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtph264depay.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- gstrtph264depay.c 8 Nov 2006 01:30:39 -0000 1.5 +++ gstrtph264depay.c 24 Jan 2007 12:22:50 -0000 1.6 @@ -59,6 +59,7 @@ "clock-rate = (int) 90000, " "encoding-name = (string) \"H264\"") /** optional parameters **/ /* "profile-level-id = (string) ANY, " */ Index: gstrtpilbcdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpilbcdepay.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- gstrtpilbcdepay.c 23 Sep 2006 15:30:40 -0000 1.7 +++ gstrtpilbcdepay.c 24 Jan 2007 12:22:50 -0000 1.8 @@ -51,6 +51,7 @@ "encoding-name = (string) \"iLBC\", " "mode = (int) { 20, 30 }") Index: gstrtpmp2tdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp2tdepay.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- gstrtpmp2tdepay.c 8 Nov 2006 01:30:39 -0000 1.3 +++ gstrtpmp2tdepay.c 24 Jan 2007 12:22:50 -0000 1.4 @@ -55,18 +55,22 @@ static GstStaticPadTemplate gst_rtp_mp2t_depay_sink_template = - "clock-rate = (int) [1, MAX ], " "encoding-name = (string) \"MP2T-ES\"" + "clock-rate = (int) [1, MAX ], " "encoding-name = (string) \"MP2T-ES\";" /* All optional parameters * * "profile-level-id=[1,MAX]" * "config=" */ - ) + "media = (string) \"video\", " + "payload = (int) " GST_RTP_PAYLOAD_MP2T_STRING ", " + "clock-rate = (int) [1, MAX ]") GST_BOILERPLATE (GstRtpMP2TDepay, gst_rtp_mp2t_depay, GstBaseRTPDepayload, Index: gstrtpmp4gdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gdepay.c,v --- gstrtpmp4gdepay.c 23 Jan 2007 17:36:32 -0000 1.7 +++ gstrtpmp4gdepay.c 24 Jan 2007 12:22:50 -0000 1.8 @@ -63,7 +63,7 @@ "media = (string) { \"video\", \"audio\", \"application\" }, " "clock-rate = (int) [1, MAX ], " "encoding-name = (string) \"mpeg4-generic\", " /* required string params */ Index: gstrtpmp4gpay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gpay.c,v retrieving revision 1.12 retrieving revision 1.13 diff -u -d -r1.12 -r1.13 --- gstrtpmp4gpay.c 8 Nov 2006 01:30:39 -0000 1.12 +++ gstrtpmp4gpay.c 24 Jan 2007 12:22:50 -0000 1.13 @@ -52,7 +52,7 @@ Index: gstrtpmp4vdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4vdepay.c,v --- gstrtpmp4vdepay.c 9 Jan 2007 12:23:48 -0000 1.19 +++ gstrtpmp4vdepay.c 24 Jan 2007 12:22:50 -0000 1.20 "clock-rate = (int) [1, MAX ], " "encoding-name = (string) \"MP4V-ES\"" Index: gstrtpmp4vpay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4vpay.c,v retrieving revision 1.23 diff -u -d -r1.23 -r1.24 --- gstrtpmp4vpay.c 8 Nov 2006 01:30:39 -0000 1.23 +++ gstrtpmp4vpay.c 24 Jan 2007 12:22:50 -0000 1.24 @@ -51,7 +51,7 @@ /* two string params Index: gstrtpmpadepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmpadepay.c,v retrieving revision 1.17 retrieving revision 1.18 diff -u -d -r1.17 -r1.18 --- gstrtpmpadepay.c 9 Jan 2007 12:23:48 -0000 1.17 +++ gstrtpmpadepay.c 24 Jan 2007 12:22:50 -0000 1.18 @@ -61,6 +61,7 @@ "clock-rate = (int) 90000, " "encoding-name = (string) \"MPA\";" "application/x-rtp, " Index: gstrtpmpvdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmpvdepay.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- gstrtpmpvdepay.c 9 Jan 2007 12:23:48 -0000 1.1 +++ gstrtpmpvdepay.c 24 Jan 2007 12:22:50 -0000 1.2 GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, - GST_STATIC_CAPS ("video/mpeg") + GST_STATIC_CAPS ("video/mpeg, systemstream = (boolean) FALSE") static GstStaticPadTemplate gst_rtp_mpv_depay_sink_template = "clock-rate = (int) 90000, " "encoding-name = (string) \"MPV\";" Index: gstrtppcmadepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtppcmadepay.c,v retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- gstrtppcmadepay.c 8 Nov 2006 01:30:39 -0000 1.8 +++ gstrtppcmadepay.c 24 Jan 2007 12:22:50 -0000 1.9 @@ -47,12 +47,17 @@ }; static GstStaticPadTemplate gst_rtp_pcma_depay_sink_template = - "clock-rate = (int) 8000, " "encoding-name = (string) \"PCMA\"") + "clock-rate = (int) 8000, " "encoding-name = (string) \"PCMA\";" + "payload = (int) " GST_RTP_PAYLOAD_PCMA_STRING ", " static GstStaticPadTemplate gst_rtp_pcma_depay_src_template = Index: gstrtppcmudepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtppcmudepay.c,v --- gstrtppcmudepay.c 8 Nov 2006 01:30:39 -0000 1.7 +++ gstrtppcmudepay.c 24 Jan 2007 12:22:50 -0000 1.8 @@ -47,13 +47,17 @@ static GstStaticPadTemplate gst_rtp_pcmu_depay_sink_template = - "clock-rate = (int) 8000, " "encoding-name = (string) \"PCMU\"") - + "clock-rate = (int) 8000, " "encoding-name = (string) \"PCMU\";" + "payload = (int) " GST_RTP_PAYLOAD_PCMU_STRING ", " static GstStaticPadTemplate gst_rtp_pcmu_depay_src_template = Index: gstrtpspeexdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpspeexdepay.c,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- gstrtpspeexdepay.c 8 Nov 2006 01:30:39 -0000 1.10 +++ gstrtpspeexdepay.c 24 Jan 2007 12:22:50 -0000 1.11 @@ -50,6 +50,7 @@ "clock-rate = (int) [6000, 48000], " "encoding-name = (string) \"speex\", " "encoding-params = (string) \"1\"") Index: gstrtpspeexpay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpspeexpay.c,v --- gstrtpspeexpay.c 8 Nov 2006 01:30:39 -0000 1.10 +++ gstrtpspeexpay.c 24 Jan 2007 12:22:50 -0000 1.11 @@ -47,7 +47,7 @@ "clock-rate = (int) 8000, " Index: gstrtpsv3vdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpsv3vdepay.c,v --- gstrtpsv3vdepay.c 8 Nov 2006 01:30:39 -0000 1.3 +++ gstrtpsv3vdepay.c 24 Jan 2007 12:22:51 -0000 1.4 @@ -59,7 +59,9 @@ - "clock-rate = (int) 90000, " "encoding-name = (string) \"X-SV3V-ES\"") + "clock-rate = (int) 90000, " + "encoding-name = (string) { \"X-SV3V-ES\", \"X-SorensonVideo\" }") GST_BOILERPLATE (GstRtpSV3VDepay, gst_rtp_sv3v_depay, GstBaseRTPDepayload, Index: gstrtptheoradepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtptheoradepay.c,v --- gstrtptheoradepay.c 8 Nov 2006 01:28:00 -0000 1.1 +++ gstrtptheoradepay.c 24 Jan 2007 12:22:51 -0000 1.2 @@ -55,6 +55,7 @@ "clock-rate = (int) [1, MAX ], " "encoding-name = (string) \"theora\"" /* All required parameters Index: gstrtptheorapay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtptheorapay.c,v --- gstrtptheorapay.c 8 Nov 2006 01:28:00 -0000 1.1 +++ gstrtptheorapay.c 24 Jan 2007 12:22:51 -0000 1.2 @@ -49,7 +49,7 @@ /* All required parameters Index: gstrtpvorbisdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpvorbisdepay.c,v --- gstrtpvorbisdepay.c 8 Nov 2006 01:29:51 -0000 1.5 +++ gstrtpvorbisdepay.c 24 Jan 2007 12:22:51 -0000 1.6 "clock-rate = (int) [1, MAX ], " "encoding-name = (string) \"vorbis\"" Index: gstrtpvorbispay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpvorbispay.c,v --- gstrtpvorbispay.c 8 Nov 2006 01:29:51 -0000 1.5 +++ gstrtpvorbispay.c 24 Jan 2007 12:22:51 -0000 1.6 |
From: <wt...@ke...> - 2007-01-24 15:18:53
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Wed Jan 24 2007 15:18:46 UTC Log message: * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: (plugin_init): * gst/rtp/gstrtpac3depay.c: (gst_rtp_ac3_depay_base_init), (gst_rtp_ac3_depay_class_init), (gst_rtp_ac3_depay_init), (gst_rtp_ac3_depay_setcaps), (gst_rtp_ac3_depay_process), (gst_rtp_ac3_depay_set_property), (gst_rtp_ac3_depay_get_property), (gst_rtp_ac3_depay_change_state), (gst_rtp_ac3_depay_plugin_init): * gst/rtp/gstrtpac3depay.h: Added simple AC3 depayloader (RFC 4184). * gst/rtp/gstrtpmp2tdepay.c: (gst_rtp_mp2t_depay_setcaps): Fix a leak. Modified files: . : ChangeLog gst/rtp : Makefile.am gstrtp.c gstrtpmp2tdepay.c Added files: gst/rtp : gstrtpac3depay.c gstrtpac3depay.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2706&r2=1.2707 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/Makefile.am.diff?r1=1.37&r2=1.38 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtp.c.diff?r1=1.33&r2=1.34 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpac3depay.c?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpac3depay.h?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp2tdepay.c.diff?r1=1.4&r2=1.5 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2706 retrieving revision 1.2707 diff -u -d -r1.2706 -r1.2707 --- ChangeLog 24 Jan 2007 12:41:02 -0000 1.2706 +++ ChangeLog 24 Jan 2007 15:18:34 -0000 1.2707 @@ -1,3 +1,18 @@ +2007-01-24 Wim Taymans <wi...@fl...> + + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: (plugin_init): + * gst/rtp/gstrtpac3depay.c: (gst_rtp_ac3_depay_base_init), + (gst_rtp_ac3_depay_class_init), (gst_rtp_ac3_depay_init), + (gst_rtp_ac3_depay_setcaps), (gst_rtp_ac3_depay_process), + (gst_rtp_ac3_depay_set_property), (gst_rtp_ac3_depay_get_property), + (gst_rtp_ac3_depay_change_state), (gst_rtp_ac3_depay_plugin_init): + * gst/rtp/gstrtpac3depay.h: + Added simple AC3 depayloader (RFC 4184). + * gst/rtp/gstrtpmp2tdepay.c: (gst_rtp_mp2t_depay_setcaps): + Fix a leak. 2007-01-24 Sebastian Dröge <sl...@ci...> reviewed by: Stefan Kost <en...@us...> Index: Makefile.am RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/Makefile.am,v retrieving revision 1.37 retrieving revision 1.38 diff -u -d -r1.37 -r1.38 --- Makefile.am 9 Jan 2007 12:23:48 -0000 1.37 +++ Makefile.am 24 Jan 2007 15:18:34 -0000 1.38 @@ -3,6 +3,7 @@ libgstrtp_la_SOURCES = \ gstrtp.c \ gstrtpdepay.c \ + gstrtpac3depay.c \ gstrtpilbcdepay.c \ gstrtpilbcpay.c \ gstrtpmpadepay.c \ @@ -32,7 +33,7 @@ gstrtptheoradepay.c \ gstrtptheorapay.c \ gstrtpvorbisdepay.c \ - gstrtpvorbispay.c + gstrtpvorbispay.c #gstrtpL16pay.c gstrtpL16depay.c @@ -51,6 +52,7 @@ noinst_HEADERS = \ gstrtpL16depay.h \ gstrtpL16pay.h \ + gstrtpac3depay.h \ gstrtpamrdepay.h \ gstrtpamrpay.h \ gstrtpilbcdepay.h \ Index: gstrtp.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtp.c,v retrieving revision 1.33 retrieving revision 1.34 diff -u -d -r1.33 -r1.34 --- gstrtp.c 9 Jan 2007 12:23:48 -0000 1.33 +++ gstrtp.c 24 Jan 2007 15:18:34 -0000 1.34 @@ -22,6 +22,7 @@ #endif #include "gstrtpdepay.h" +#include "gstrtpac3depay.h" #include "gstrtpilbcdepay.h" #include "gstrtpilbcpay.h" #include "gstrtppcmupay.h" @@ -59,6 +60,9 @@ if (!gst_rtp_depay_plugin_init (plugin)) return FALSE; + if (!gst_rtp_ac3_depay_plugin_init (plugin)) + return FALSE; if (!gst_rtp_ilbc_pay_plugin_init (plugin)) --- NEW FILE: gstrtpac3depay.c --- /* GStreamer * Copyright (C) <2007> Wim Taymans <wi...@fl...> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include <gst/rtp/gstrtpbuffer.h> #include <string.h> #include "gstrtpac3depay.h" GST_DEBUG_CATEGORY_STATIC (rtpac3depay_debug); #define GST_CAT_DEFAULT (rtpac3depay_debug) /* elementfactory information */ static const GstElementDetails gst_rtp_ac3depay_details = GST_ELEMENT_DETAILS ("RTP packet depayloader", "Codec/Depayloader/Network", "Extracts AC3 audio from RTP packets (RFC 4184)", "Wim Taymans <wi...@fl...>"); /* RtpAC3Depay signals and args */ enum { /* FILL ME */ LAST_SIGNAL }; ARG_0, static GstStaticPadTemplate gst_rtp_ac3_depay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/ac3") ); static GstStaticPadTemplate gst_rtp_ac3_depay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) { 32000, 44100, 48000 }, " "encoding-name = (string) \"AC3\"") GST_BOILERPLATE (GstRtpAC3Depay, gst_rtp_ac3_depay, GstBaseRTPDepayload, GST_TYPE_BASE_RTP_DEPAYLOAD); static gboolean gst_rtp_ac3_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps); static GstBuffer *gst_rtp_ac3_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf); static void gst_rtp_ac3_depay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_rtp_ac3_depay_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static GstStateChangeReturn gst_rtp_ac3_depay_change_state (GstElement * element, GstStateChange transition); static void gst_rtp_ac3_depay_base_init (gpointer klass) GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&gst_rtp_ac3_depay_src_template)); gst_static_pad_template_get (&gst_rtp_ac3_depay_sink_template)); gst_element_class_set_details (element_class, &gst_rtp_ac3depay_details); } gst_rtp_ac3_depay_class_init (GstRtpAC3DepayClass * klass) GObjectClass *gobject_class; GstElementClass *gstelement_class; GstBaseRTPDepayloadClass *gstbasertpdepayload_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; parent_class = g_type_class_peek_parent (klass); gobject_class->set_property = gst_rtp_ac3_depay_set_property; gobject_class->get_property = gst_rtp_ac3_depay_get_property; gstelement_class->change_state = gst_rtp_ac3_depay_change_state; gstbasertpdepayload_class->set_caps = gst_rtp_ac3_depay_setcaps; gstbasertpdepayload_class->process = gst_rtp_ac3_depay_process; GST_DEBUG_CATEGORY_INIT (rtpac3depay_debug, "rtpac3depay", 0, "MPEG Audio RTP Depayloader"); gst_rtp_ac3_depay_init (GstRtpAC3Depay * rtpac3depay, GstRtpAC3DepayClass * klass) static gboolean gst_rtp_ac3_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) GstStructure *structure; GstRtpAC3Depay *rtpac3depay; gint clock_rate = 90000; /* default */ rtpac3depay = GST_RTP_AC3_DEPAY (depayload); structure = gst_caps_get_structure (caps, 0); gst_structure_get_int (structure, "clock-rate", &clock_rate); depayload->clock_rate = clock_rate; return TRUE; struct frmsize_s guint16 bit_rate; guint16 frm_size[3]; static const struct frmsize_s frmsizecod_tbl[] = { {32, {64, 69, 96}}, {32, {64, 70, 96}}, {40, {80, 87, 120}}, {40, {80, 88, 120}}, {48, {96, 104, 144}}, {48, {96, 105, 144}}, {56, {112, 121, 168}}, {56, {112, 122, 168}}, {64, {128, 139, 192}}, {64, {128, 140, 192}}, {80, {160, 174, 240}}, {80, {160, 175, 240}}, {96, {192, 208, 288}}, {96, {192, 209, 288}}, {112, {224, 243, 336}}, {112, {224, 244, 336}}, {128, {256, 278, 384}}, {128, {256, 279, 384}}, {160, {320, 348, 480}}, {160, {320, 349, 480}}, {192, {384, 417, 576}}, {192, {384, 418, 576}}, {224, {448, 487, 672}}, {224, {448, 488, 672}}, {256, {512, 557, 768}}, {256, {512, 558, 768}}, {320, {640, 696, 960}}, {320, {640, 697, 960}}, {384, {768, 835, 1152}}, {384, {768, 836, 1152}}, {448, {896, 975, 1344}}, {448, {896, 976, 1344}}, {512, {1024, 1114, 1536}}, {512, {1024, 1115, 1536}}, {576, {1152, 1253, 1728}}, {576, {1152, 1254, 1728}}, {640, {1280, 1393, 1920}}, {640, {1280, 1394, 1920}} static GstBuffer * gst_rtp_ac3_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) GstBuffer *outbuf; if (!gst_rtp_buffer_validate (buf)) goto bad_packet; { gint payload_len; guint8 *payload; guint16 FT, NF; payload_len = gst_rtp_buffer_get_payload_len (buf); payload = gst_rtp_buffer_get_payload (buf); if (payload_len <= 2) goto empty_packet; /* strip off header * * 0 1 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | MBZ | FT| NF | */ FT = payload[0] & 0x3; NF = payload[1]; GST_DEBUG_OBJECT (rtpac3depay, "FT: %d, NF: %d", FT, NF); payload_len -= 2; payload += 2; /* We don't bother with fragmented packets yet */ outbuf = gst_rtp_buffer_get_payload_subbuffer (buf, 2, -1); GST_DEBUG_OBJECT (rtpac3depay, "pushing buffer of size %d", GST_BUFFER_SIZE (outbuf)); return outbuf; } return NULL; bad_packet: GST_ELEMENT_WARNING (rtpac3depay, STREAM, DECODE, ("Packet did not validate."), (NULL)); return NULL; #if 0 bad_payload: ("Unexpected payload type."), (NULL)); empty_packet: ("Empty Payload."), (NULL)); gst_rtp_ac3_depay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) rtpac3depay = GST_RTP_AC3_DEPAY (object); switch (prop_id) { default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; gst_rtp_ac3_depay_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) static GstStateChangeReturn gst_rtp_ac3_depay_change_state (GstElement * element, GstStateChange transition) GstStateChangeReturn ret; rtpac3depay = GST_RTP_AC3_DEPAY (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); case GST_STATE_CHANGE_READY_TO_NULL: return ret; gboolean gst_rtp_ac3_depay_plugin_init (GstPlugin * plugin) return gst_element_register (plugin, "rtpac3depay", GST_RANK_MARGINAL, GST_TYPE_RTP_AC3_DEPAY); --- NEW FILE: gstrtpac3depay.h --- * Copyright (C) <2005> Wim Taymans <wi...@fl...> #ifndef __GST_RTP_AC3_DEPAY_H__ #define __GST_RTP_AC3_DEPAY_H__ #include <gst/gst.h> #include <gst/rtp/gstbasertpdepayload.h> G_BEGIN_DECLS #define GST_TYPE_RTP_AC3_DEPAY \ (gst_rtp_ac3_depay_get_type()) #define GST_RTP_AC3_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_AC3_DEPAY,GstRtpAC3Depay)) #define GST_RTP_AC3_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_AC3_DEPAY,GstRtpAC3DepayClass)) #define GST_IS_RTP_AC3_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_AC3_DEPAY)) #define GST_IS_RTP_AC3_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_AC3_DEPAY)) typedef struct _GstRtpAC3Depay GstRtpAC3Depay; typedef struct _GstRtpAC3DepayClass GstRtpAC3DepayClass; struct _GstRtpAC3Depay GstBaseRTPDepayload depayload; struct _GstRtpAC3DepayClass GstBaseRTPDepayloadClass parent_class; gboolean gst_rtp_ac3_depay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_AC3_DEPAY_H__ */ Index: gstrtpmp2tdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp2tdepay.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- gstrtpmp2tdepay.c 24 Jan 2007 12:22:50 -0000 1.4 +++ gstrtpmp2tdepay.c 24 Jan 2007 15:18:34 -0000 1.5 @@ -138,7 +138,6 @@ GstStructure *structure; GstRtpMP2TDepay *rtpmp2tdepay; - GstCaps *srccaps; gint clock_rate = 90000; /* default */ rtpmp2tdepay = GST_RTP_MP2T_DEPAY (depayload); @@ -151,10 +150,6 @@ depayload->clock_rate = clock_rate; - srccaps = gst_caps_new_simple ("video/mpegts", - "systemstream", G_TYPE_BOOLEAN, TRUE, - "packetsize", G_TYPE_INT, 188, NULL); - return TRUE; } |
From: <wt...@ke...> - 2007-01-24 18:20:35
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Wed Jan 24 2007 18:20:27 UTC Log message: * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: (plugin_init): * gst/rtp/gstrtpL16depay.c: (gst_rtp_L16_depay_base_init), (gst_rtp_L16_depay_class_init), (gst_rtp_L16_depay_init), (gst_rtp_L16_depay_parse_int), (gst_rtp_L16_depay_setcaps), (gst_rtp_L16_depay_process), (gst_rtp_L16_depay_set_property), (gst_rtp_L16_depay_get_property), (gst_rtp_L16_depay_change_state), (gst_rtp_L16_depay_plugin_init): * gst/rtp/gstrtpL16depay.h: * gst/rtp/gstrtpL16pay.c: (gst_rtp_L16_pay_get_type), (gst_rtp_L16_pay_base_init), (gst_rtp_L16_pay_class_init), (gst_rtp_L16_pay_init), (gst_rtp_L16_pay_finalize), (gst_rtp_L16_pay_setcaps), (gst_rtp_L16_pay_handle_buffer), (gst_rtp_L16_pay_plugin_init): * gst/rtp/gstrtpL16pay.h: Port and enable raw audio payloader/depayloader. Needs a bit more work on the payloader side. Modified files: . : ChangeLog gst/rtp : Makefile.am gstrtp.c gstrtpL16depay.c gstrtpL16depay.h gstrtpL16pay.c gstrtpL16pay.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2708&r2=1.2709 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/Makefile.am.diff?r1=1.38&r2=1.39 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtp.c.diff?r1=1.34&r2=1.35 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpL16depay.c.diff?r1=1.25&r2=1.26 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpL16depay.h.diff?r1=1.12&r2=1.13 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpL16pay.c.diff?r1=1.23&r2=1.24 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpL16pay.h.diff?r1=1.11&r2=1.12 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2708 retrieving revision 1.2709 diff -u -d -r1.2708 -r1.2709 --- ChangeLog 24 Jan 2007 16:25:55 -0000 1.2708 +++ ChangeLog 24 Jan 2007 18:20:14 -0000 1.2709 @@ -1,5 +1,25 @@ 2007-01-24 Wim Taymans <wi...@fl...> + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: (plugin_init): + * gst/rtp/gstrtpL16depay.c: (gst_rtp_L16_depay_base_init), + (gst_rtp_L16_depay_class_init), (gst_rtp_L16_depay_init), + (gst_rtp_L16_depay_parse_int), (gst_rtp_L16_depay_setcaps), + (gst_rtp_L16_depay_process), (gst_rtp_L16_depay_set_property), + (gst_rtp_L16_depay_get_property), (gst_rtp_L16_depay_change_state), + (gst_rtp_L16_depay_plugin_init): + * gst/rtp/gstrtpL16depay.h: + * gst/rtp/gstrtpL16pay.c: (gst_rtp_L16_pay_get_type), + (gst_rtp_L16_pay_base_init), (gst_rtp_L16_pay_class_init), + (gst_rtp_L16_pay_init), (gst_rtp_L16_pay_finalize), + (gst_rtp_L16_pay_setcaps), (gst_rtp_L16_pay_handle_buffer), + (gst_rtp_L16_pay_plugin_init): + * gst/rtp/gstrtpL16pay.h: + Port and enable raw audio payloader/depayloader. Needs a bit more work + on the payloader side. + +2007-01-24 Wim Taymans <wi...@fl...> * gst/rtsp/gstrtspsrc.c: (pad_blocked), (gst_rtspsrc_stream_configure_transport), (gst_rtspsrc_activate_streams), (gst_rtspsrc_loop_udp): Index: Makefile.am RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/Makefile.am,v retrieving revision 1.38 retrieving revision 1.39 diff -u -d -r1.38 -r1.39 --- Makefile.am 24 Jan 2007 15:18:34 -0000 1.38 +++ Makefile.am 24 Jan 2007 18:20:14 -0000 1.39 @@ -21,6 +21,8 @@ gstrtph263ppay.c \ gstrtph263pay.c \ gstrtph264depay.c \ + gstrtpL16depay.c \ + gstrtpL16pay.c \ gstasteriskh263.c \ gstrtpmp2tdepay.c \ gstrtpmp4vdepay.c \ @@ -35,7 +37,6 @@ gstrtpvorbisdepay.c \ gstrtpvorbispay.c -#gstrtpL16pay.c gstrtpL16depay.c if HAVE_WINSOCK2_H WINSOCK2_LIBS = -lws2_32 Index: gstrtp.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtp.c,v retrieving revision 1.34 retrieving revision 1.35 diff -u -d -r1.34 -r1.35 --- gstrtp.c 24 Jan 2007 15:18:34 -0000 1.34 +++ gstrtp.c 24 Jan 2007 18:20:14 -0000 1.35 @@ -40,6 +40,8 @@ #include "gstrtph263ppay.h" #include "gstrtph263pay.h" #include "gstrtph264depay.h" +#include "gstrtpL16depay.h" +#include "gstrtpL16pay.h" #include "gstasteriskh263.h" #include "gstrtpmp2tdepay.h" #include "gstrtpmp4vdepay.h" @@ -114,6 +116,12 @@ if (!gst_rtp_h264_depay_plugin_init (plugin)) return FALSE; + if (!gst_rtp_L16_pay_plugin_init (plugin)) + return FALSE; + if (!gst_rtp_L16_depay_plugin_init (plugin)) if (!gst_asteriskh263_plugin_init (plugin)) Index: gstrtpL16depay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpL16depay.c,v retrieving revision 1.25 retrieving revision 1.26 diff -u -d -r1.25 -r1.26 --- gstrtpL16depay.c 8 Nov 2006 01:30:39 -0000 1.25 +++ gstrtpL16depay.c 24 Jan 2007 18:20:14 -0000 1.26 @@ -1,5 +1,5 @@ /* GStreamer - * Copyright (C) <1999> Erik Walthinsen <om...@cs...> + * Copyright (C) <2007> Wim Taymans <wi...@fl...> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -21,293 +21,258 @@ #include "config.h" #endif #include <string.h> #include "gstrtpL16depay.h" -#include "gstrtp-common.h" +GST_DEBUG_CATEGORY_STATIC (rtpL16depay_debug); +#define GST_CAT_DEFAULT (rtpL16depay_debug) /* elementfactory information */ -static const GstElementDetails gst_rtp_L16depay_details = +static const GstElementDetails gst_rtp_L16_depay_details = GST_ELEMENT_DETAILS ("RTP packet depayloader", "Codec/Depayloader/Network", "Extracts raw audio from RTP packets", - "Zeeshan Ali <za...@ya...>"); + "Zeeshan Ali <za...@ya...>," "Wim Taymans <wi...@fl...>"); /* RtpL16Depay signals and args */ enum { - /* FILL ME */ LAST_SIGNAL }; ARG_0, - ARG_FREQUENCY, - ARG_PAYLOAD_TYPE -static GstStaticPadTemplate gst_rtp_L16depay_src_template = +static GstStaticPadTemplate gst_rtp_L16_depay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-int, " - "endianness = (int) BYTE_ORDER, " + "endianness = (int) BIG_ENDIAN, " "signed = (boolean) true, " "width = (int) 16, " "depth = (int) 16, " - "rate = (int) [ 1000, 48000 ], " "channels = (int) [ 1, 2 ]") + "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, MAX ]") ); -static GstStaticPadTemplate gst_rtp_L16depay_sink_template = -GST_STATIC_PAD_TEMPLATE ("sink", +static GstStaticPadTemplate gst_rtp_L16_depay_sink_template = + GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, - GST_STATIC_CAPS ("application/x-rtp") + GST_STATIC_CAPS ("application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) [ 1, MAX ], " + /* "channels = (int) [1, MAX]" */ + /* "emphasis = (string) ANY" */ + /* "channel-order = (string) ANY" */ + "encoding-name = (string) \"L16\";" + "application/x-rtp, " + "payload = (int) { " GST_RTP_PAYLOAD_L16_STEREO_STRING ", " + GST_RTP_PAYLOAD_L16_MONO_STRING " }," "clock-rate = (int) [ 1, MAX ]" + /* "channels = (int) [1, MAX]" */ + ) -static void gst_rtp_L16depay_class_init (GstRtpL16DepayClass * klass); -static void gst_rtp_L16depay_base_init (GstRtpL16DepayClass * klass); -static void gst_rtp_L16depay_init (GstRtpL16Depay * rtpL16depay); +GST_BOILERPLATE (GstRtpL16Depay, gst_rtp_L16_depay, GstBaseRTPDepayload, + GST_TYPE_BASE_RTP_DEPAYLOAD); -static void gst_rtp_L16depay_chain (GstPad * pad, GstData * _data); +static gboolean gst_rtp_L16_depay_setcaps (GstBaseRTPDepayload * depayload, + GstCaps * caps); +static GstBuffer *gst_rtp_L16_depay_process (GstBaseRTPDepayload * depayload, + GstBuffer * buf); -static void gst_rtp_L16depay_set_property (GObject * object, guint prop_id, +static void gst_rtp_L16_depay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); -static void gst_rtp_L16depay_get_property (GObject * object, guint prop_id, +static void gst_rtp_L16_depay_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); -static GstStateChangeReturn gst_rtp_L16depay_change_state (GstElement * - element); - -static GstElementClass *parent_class = NULL; -static GType -gst_rtp_L16depay_get_type (void) -{ - static GType rtpL16depay_type = 0; - if (!rtpL16depay_type) { - static const GTypeInfo rtpL16depay_info = { - sizeof (GstRtpL16DepayClass), - (GBaseInitFunc) gst_rtp_L16depay_base_init, - NULL, - (GClassInitFunc) gst_rtp_L16depay_class_init, - sizeof (GstRtpL16Depay), - 0, - (GInstanceInitFunc) gst_rtp_L16depay_init, - }; - rtpL16depay_type = - g_type_register_static (GST_TYPE_ELEMENT, "GstRtpL16Depay", - &rtpL16depay_info, 0); - } - return rtpL16depay_type; -} +static GstStateChangeReturn gst_rtp_L16_depay_change_state (GstElement * + element, GstStateChange transition); static void -gst_rtp_L16depay_base_init (GstRtpL16DepayClass * klass) +gst_rtp_L16_depay_base_init (gpointer klass) GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_pad_template (element_class, - gst_static_pad_template_get (&gst_rtp_L16depay_src_template)); + gst_static_pad_template_get (&gst_rtp_L16_depay_src_template)); - gst_static_pad_template_get (&gst_rtp_L16depay_sink_template)); - gst_element_class_set_details (element_class, &gst_rtp_L16depay_details); + gst_static_pad_template_get (&gst_rtp_L16_depay_sink_template)); + gst_element_class_set_details (element_class, &gst_rtp_L16_depay_details); } -gst_rtp_L16depay_class_init (GstRtpL16DepayClass * klass) +gst_rtp_L16_depay_class_init (GstRtpL16DepayClass * klass) GObjectClass *gobject_class; GstElementClass *gstelement_class; + GstBaseRTPDepayloadClass *gstbasertpdepayload_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; + gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; parent_class = g_type_class_peek_parent (klass); - g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_PAYLOAD_TYPE, - g_param_spec_int ("payload_type", "payload_type", "payload type", - G_MININT, G_MAXINT, PAYLOAD_L16_STEREO, G_PARAM_READABLE)); - g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FREQUENCY, - g_param_spec_int ("frequency", "frequency", "frequency", - G_MININT, G_MAXINT, 44100, G_PARAM_READWRITE)); + gobject_class->set_property = gst_rtp_L16_depay_set_property; + gobject_class->get_property = gst_rtp_L16_depay_get_property; - gobject_class->set_property = gst_rtp_L16depay_set_property; - gobject_class->get_property = gst_rtp_L16depay_get_property; + gstelement_class->change_state = gst_rtp_L16_depay_change_state; - gstelement_class->change_state = gst_rtp_L16depay_change_state; + gstbasertpdepayload_class->set_caps = gst_rtp_L16_depay_setcaps; + gstbasertpdepayload_class->process = gst_rtp_L16_depay_process; + GST_DEBUG_CATEGORY_INIT (rtpL16depay_debug, "rtpL16depay", 0, + "Raw Audio RTP Depayloader"); -gst_rtp_L16depay_init (GstRtpL16Depay * rtpL16depay) +gst_rtp_L16_depay_init (GstRtpL16Depay * rtpL16depay, + GstRtpL16DepayClass * klass) - rtpL16depay->srcpad = - gst_pad_new_from_static_template (&gst_rtp_L16depay_src_template, "src"); - rtpL16depay->sinkpad = - gst_pad_new_from_static_template (&gst_rtp_L16depay_sink_template, - "sink"); - gst_element_add_pad (GST_ELEMENT (rtpL16depay), rtpL16depay->srcpad); - gst_element_add_pad (GST_ELEMENT (rtpL16depay), rtpL16depay->sinkpad); - gst_pad_set_chain_function (rtpL16depay->sinkpad, gst_rtp_L16depay_chain); - rtpL16depay->frequency = 44100; - rtpL16depay->channels = 2; - rtpL16depay->payload_type = PAYLOAD_L16_STEREO; -void -gst_rtp_L16depay_ntohs (GstBuffer * buf) +static gint +gst_rtp_L16_depay_parse_int (GstStructure * structure, const gchar * field, + gint def) - gint16 *i, *len; + const gchar *str; + gint res; - /* FIXME: is this code correct or even sane at all? */ - i = (gint16 *) GST_BUFFER_DATA (buf); - len = i + GST_BUFFER_SIZE (buf) / sizeof (gint16 *); + if ((str = gst_structure_get_string (structure, field))) + return atoi (str); - for (; i < len; i++) { - *i = g_ntohs (*i); + if (gst_structure_get_int (structure, field, &res)) + return res; + return def; -gst_rtp_L16_caps_nego (GstRtpL16Depay * rtpL16depay) +static gboolean +gst_rtp_L16_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) - GstCaps *caps; - caps = - gst_caps_copy (gst_static_caps_get (&gst_rtp_L16depay_src_template. - static_caps)); - gst_caps_set_simple (caps, - "rate", G_TYPE_INT, rtpL16depay->frequency, - "channel", G_TYPE_INT, rtpL16depay->channels, NULL); + GstStructure *structure; + GstRtpL16Depay *rtpL16depay; + gint clock_rate, payload; + gint channels; + GstCaps *srccaps; - gst_pad_try_set_caps (rtpL16depay->srcpad, caps); + rtpL16depay = GST_RTP_L16_DEPAY (depayload); -gst_rtp_L16depay_payloadtype_change (GstRtpL16Depay * rtpL16depay, - rtp_payload_t pt) - rtpL16depay->payload_type = pt; + structure = gst_caps_get_structure (caps, 0); - switch (pt) { - case PAYLOAD_L16_MONO: - rtpL16depay->channels = 1; + payload = 96; + gst_structure_get_int (structure, "payload", &payload); + switch (payload) { + case GST_RTP_PAYLOAD_L16_STEREO: + channels = 2; + clock_rate = 44100; break; - case PAYLOAD_L16_STEREO: - rtpL16depay->channels = 2; + case GST_RTP_PAYLOAD_L16_MONO: + channels = 1; default: - g_warning ("unknown payload_t %d\n", pt); + channels = 0; + clock_rate = 0; + break; } - gst_rtp_L16_caps_nego (rtpL16depay); + /* caps can overwrite defaults */ + clock_rate = + gst_rtp_L16_depay_parse_int (structure, "clock-rate", clock_rate); + channels = gst_rtp_L16_depay_parse_int (structure, "channels", channels); + depayload->clock_rate = clock_rate; + rtpL16depay->rate = clock_rate; + rtpL16depay->channels = channels; + srccaps = gst_caps_new_simple ("audio/x-raw-int", + "endianness", G_TYPE_INT, G_BIG_ENDIAN, + "signed", G_TYPE_BOOLEAN, TRUE, + "width", G_TYPE_INT, 16, + "depth", G_TYPE_INT, 16, + "rate", G_TYPE_INT, clock_rate, "channels", G_TYPE_INT, channels, NULL); + gst_pad_set_caps (depayload->srcpad, srccaps); + gst_caps_unref (srccaps); + return TRUE; -static void -gst_rtp_L16depay_chain (GstPad * pad, GstData * _data) +static GstBuffer * +gst_rtp_L16_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) - GstBuffer *buf = GST_BUFFER (_data); GstRtpL16Depay *rtpL16depay; GstBuffer *outbuf; - Rtp_Packet packet; - rtp_payload_t pt; - g_return_if_fail (pad != NULL); - g_return_if_fail (GST_IS_PAD (pad)); - g_return_if_fail (buf != NULL); - rtpL16depay = GST_RTP_L16_DEPAY (GST_OBJECT_PARENT (pad)); - g_return_if_fail (rtpL16depay != NULL); - g_return_if_fail (GST_IS_RTP_L16_DEPAY (rtpL16depay)); - if (GST_IS_EVENT (buf)) { - GstEvent *event = GST_EVENT (buf); + if (!gst_rtp_buffer_validate (buf)) + goto bad_packet; - gst_pad_event_default (pad, event); + { + gint payload_len; + guint8 *payload; - return; + payload_len = gst_rtp_buffer_get_payload_len (buf); + payload = gst_rtp_buffer_get_payload (buf); - if (GST_PAD_CAPS (rtpL16depay->srcpad) == NULL) { - gst_rtp_L16_caps_nego (rtpL16depay); + if (payload_len <= 0) + goto empty_packet; - packet = - rtp_packet_new_copy_data (GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); + GST_DEBUG_OBJECT (rtpL16depay, "got payload of %d bytes", payload_len); - pt = rtp_packet_get_payload_type (packet); + outbuf = gst_rtp_buffer_get_payload_buffer (buf); - if (pt != rtpL16depay->payload_type) { - gst_rtp_L16depay_payloadtype_change (rtpL16depay, pt); + return outbuf; + return NULL; - outbuf = gst_buffer_new (); - GST_BUFFER_SIZE (outbuf) = rtp_packet_get_payload_len (packet); - GST_BUFFER_DATA (outbuf) = g_malloc (GST_BUFFER_SIZE (outbuf)); - GST_BUFFER_TIMESTAMP (outbuf) = - g_ntohl (rtp_packet_get_timestamp (packet)) * GST_SECOND; - memcpy (GST_BUFFER_DATA (outbuf), rtp_packet_get_payload (packet), - GST_BUFFER_SIZE (outbuf)); - GST_DEBUG ("gst_rtp_L16depay_chain: pushing buffer of size %d", - /* FIXME: According to RFC 1890, this is required, right? */ -#if G_BYTE_ORDER == G_LITTLE_ENDIAN - gst_rtp_L16depay_ntohs (outbuf); -#endif - gst_pad_push (rtpL16depay->srcpad, GST_DATA (outbuf)); - rtp_packet_free (packet); - gst_buffer_unref (buf); +bad_packet: + GST_ELEMENT_WARNING (rtpL16depay, STREAM, DECODE, + ("Packet did not validate."), (NULL)); + return NULL; + } +empty_packet: + ("Empty Payload."), (NULL)); -gst_rtp_L16depay_set_property (GObject * object, guint prop_id, +gst_rtp_L16_depay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) - g_return_if_fail (GST_IS_RTP_L16_DEPAY (object)); rtpL16depay = GST_RTP_L16_DEPAY (object); switch (prop_id) { - case ARG_PAYLOAD_TYPE: - gst_rtp_L16depay_payloadtype_change (rtpL16depay, - g_value_get_int (value)); - break; - case ARG_FREQUENCY: - rtpL16depay->frequency = g_value_get_int (value); -gst_rtp_L16depay_get_property (GObject * object, guint prop_id, GValue * value, +gst_rtp_L16_depay_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) - g_value_set_int (value, rtpL16depay->payload_type); - g_value_set_int (value, rtpL16depay->frequency); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -315,23 +280,20 @@ static GstStateChangeReturn -gst_rtp_L16depay_change_state (GstElement * element, GstStateChange transition) +gst_rtp_L16_depay_change_state (GstElement * element, GstStateChange transition) GstStateChangeReturn ret; rtpL16depay = GST_RTP_L16_DEPAY (element); - GST_DEBUG ("state pending %d\n", GST_STATE_PENDING (element)); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: - /* if we haven't failed already, give the parent class a chance to ;-) */ ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); @@ -340,12 +302,11 @@ return ret; gboolean -gst_rtp_L16depay_plugin_init (GstPlugin * plugin) +gst_rtp_L16_depay_plugin_init (GstPlugin * plugin) return gst_element_register (plugin, "rtpL16depay", GST_RANK_MARGINAL, GST_TYPE_RTP_L16_DEPAY); Index: gstrtpL16depay.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpL16depay.h,v retrieving revision 1.12 retrieving revision 1.13 diff -u -d -r1.12 -r1.13 --- gstrtpL16depay.h 9 Jan 2007 12:23:48 -0000 1.12 +++ gstrtpL16depay.h 24 Jan 2007 18:20:14 -0000 1.13 @@ -21,14 +21,13 @@ #define __GST_RTP_L16_DEPAY_H__ #include <gst/gst.h> -#include "rtp-packet.h" +#include <gst/rtp/gstbasertpdepayload.h> G_BEGIN_DECLS /* Standard macros for defining types for this element. */ #define GST_TYPE_RTP_L16_DEPAY \ - (gst_rtp_L16depay_get_type()) + (gst_rtp_L16_depay_get_type()) #define GST_RTP_L16_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_L16_DEPAY,GstRtpL16Depay)) #define GST_RTP_L16_DEPAY_CLASS(klass) \ @@ -44,24 +43,19 @@ /* Definition of structure storing data for this element. */ struct _GstRtpL16Depay - GstElement element; - GstPad *sinkpad; - GstPad *srcpad; + GstBaseRTPDepayload depayload; - guint frequency; + guint rate; guint channels; - rtp_payload_t payload_type; /* Standard definition defining a class for this element. */ struct _GstRtpL16DepayClass - GstElementClass parent_class; + GstBaseRTPDepayloadClass parent_class; -gboolean gst_rtp_L16depay_plugin_init (GstPlugin * plugin); +gboolean gst_rtp_L16_depay_plugin_init (GstPlugin * plugin); G_END_DECLS Index: gstrtpL16pay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpL16pay.c,v retrieving revision 1.23 retrieving revision 1.24 diff -u -d -r1.23 -r1.24 --- gstrtpL16pay.c 25 Apr 2006 21:39:44 -0000 1.23 +++ gstrtpL16pay.c 24 Jan 2007 18:20:14 -0000 1.24 @@ -18,329 +18,224 @@ */ #ifdef HAVE_CONFIG_H -#include "config.h" +# include "config.h" -#include <stdlib.h> +#include <gst/rtp/gstrtpbuffer.h> #include "gstrtpL16pay.h" +GST_DEBUG_CATEGORY_STATIC (rtpL16pay_debug); +#define GST_CAT_DEFAULT (rtpL16pay_debug) -static const GstElementDetails gst_rtpL16pay_details = -GST_ELEMENT_DETAILS ("RTP RAW audio payloader", +static const GstElementDetails gst_rtp_L16_pay_details = +GST_ELEMENT_DETAILS ("RTP packet payloader", "Codec/Payloader/Network", - "Payload-encodes Raw Audio into a RTP packet", -/* RtpL16Pay signals and args */ -enum - LAST_SIGNAL -}; - ARG_0 + "Payload-encode Raw audio into RTP packets (RFC 3551)", + "Wim Taymans <wi...@fl...>"); -static GstStaticPadTemplate gst_rtpL16pay_sink_template = +static GstStaticPadTemplate gst_rtp_L16_pay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", -static GstStaticPadTemplate gst_rtpL16pay_src_template = -GST_STATIC_PAD_TEMPLATE ("src", +static GstStaticPadTemplate gst_rtp_L16_pay_src_template = + GST_STATIC_PAD_TEMPLATE ("src", + "payload = (int) [ 96, 127 ], " + "encoding-name = (string) \"L16\", " + "channels = (int) [ 1, MAX ], " + "rate = (int) [ 1, MAX ];" + GST_RTP_PAYLOAD_L16_MONO_STRING " }," "clock-rate = (int) 44100") -static void gst_rtpL16pay_class_init (GstRtpL16PayClass * klass); -static void gst_rtpL16pay_base_init (GstRtpL16PayClass * klass); -static void gst_rtpL16pay_init (GstRtpL16Pay * rtpL16enc); -static void gst_rtpL16pay_chain (GstPad * pad, GstData * _data); -static void gst_rtpL16pay_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec); -static void gst_rtpL16pay_get_property (GObject * object, guint prop_id, - GValue * value, GParamSpec * pspec); -static GstPadLinkReturn gst_rtpL16pay_sinkconnect (GstPad * pad, - const GstCaps * caps); -static GstStateChangeReturn gst_rtpL16pay_change_state (GstElement * element, - GstStateChange transition); +static void gst_rtp_L16_pay_class_init (GstRtpL16PayClass * klass); +static void gst_rtp_L16_pay_base_init (GstRtpL16PayClass * klass); +static void gst_rtp_L16_pay_init (GstRtpL16Pay * rtpL16pay); +static void gst_rtp_L16_pay_finalize (GObject * object); +static gboolean gst_rtp_L16_pay_setcaps (GstBaseRTPPayload * basepayload, +static GstFlowReturn gst_rtp_L16_pay_handle_buffer (GstBaseRTPPayload * pad, + GstBuffer * buffer); +static GstBaseRTPPayloadClass *parent_class = NULL; static GType -gst_rtpL16pay_get_type (void) +gst_rtp_L16_pay_get_type (void) static GType rtpL16pay_type = 0; if (!rtpL16pay_type) { static const GTypeInfo rtpL16pay_info = { sizeof (GstRtpL16PayClass), - (GBaseInitFunc) gst_rtpL16pay_base_init, + (GBaseInitFunc) gst_rtp_L16_pay_base_init, NULL, - (GClassInitFunc) gst_rtpL16pay_class_init, + (GClassInitFunc) gst_rtp_L16_pay_class_init, sizeof (GstRtpL16Pay), 0, - (GInstanceInitFunc) gst_rtpL16pay_init, + (GInstanceInitFunc) gst_rtp_L16_pay_init, }; rtpL16pay_type = - g_type_register_static (GST_TYPE_ELEMENT, "GstRtpL16Pay", + g_type_register_static (GST_TYPE_BASE_RTP_PAYLOAD, "GstRtpL16Pay", &rtpL16pay_info, 0); return rtpL16pay_type; -gst_rtpL16pay_base_init (GstRtpL16PayClass * klass) +gst_rtp_L16_pay_base_init (GstRtpL16PayClass * klass) - gst_static_pad_template_get (&gst_rtpL16pay_sink_template)); + gst_static_pad_template_get (&gst_rtp_L16_pay_src_template)); - gst_static_pad_template_get (&gst_rtpL16pay_src_template)); - gst_element_class_set_details (element_class, &gst_rtpL16pay_details); + gst_static_pad_template_get (&gst_rtp_L16_pay_sink_template)); + gst_element_class_set_details (element_class, &gst_rtp_L16_pay_details); -gst_rtpL16pay_class_init (GstRtpL16PayClass * klass) +gst_rtp_L16_pay_class_init (GstRtpL16PayClass * klass) + GstBaseRTPPayloadClass *gstbasertppayload_class; + gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; - gobject_class->set_property = gst_rtpL16pay_set_property; - gobject_class->get_property = gst_rtpL16pay_get_property; + gobject_class->finalize = gst_rtp_L16_pay_finalize; - gstelement_class->change_state = gst_rtpL16pay_change_state; + gstbasertppayload_class->set_caps = gst_rtp_L16_pay_setcaps; + gstbasertppayload_class->handle_buffer = gst_rtp_L16_pay_handle_buffer; + GST_DEBUG_CATEGORY_INIT (rtpL16pay_debug, "rtpL16pay", 0, + "L16 RTP Payloader"); -gst_rtpL16pay_init (GstRtpL16Pay * rtpL16enc) +gst_rtp_L16_pay_init (GstRtpL16Pay * rtpL16pay) - rtpL16enc->sinkpad = - gst_pad_new_from_static_template (&gst_rtpL16pay_sink_template, "sink"); - rtpL16enc->srcpad = - gst_pad_new_from_static_template (&gst_rtpL16pay_src_template, "src"); - gst_element_add_pad (GST_ELEMENT (rtpL16enc), rtpL16enc->sinkpad); - gst_element_add_pad (GST_ELEMENT (rtpL16enc), rtpL16enc->srcpad); - gst_pad_set_chain_function (rtpL16enc->sinkpad, gst_rtpL16pay_chain); - gst_pad_set_link_function (rtpL16enc->sinkpad, gst_rtpL16pay_sinkconnect); - rtpL16enc->frequency = 44100; - rtpL16enc->channels = 2; - rtpL16enc->next_time = 0; - rtpL16enc->time_interval = 0; - rtpL16enc->seq = 0; - rtpL16enc->ssrc = random (); + rtpL16pay->adapter = gst_adapter_new (); -static GstPadLinkReturn -gst_rtpL16pay_sinkconnect (GstPad * pad, const GstCaps * caps) +static void +gst_rtp_L16_pay_finalize (GObject * object) - GstRtpL16Pay *rtpL16enc; - GstStructure *structure; - gboolean ret; - rtpL16enc = GST_RTP_L16_PAY (gst_pad_get_parent (pad)); - structure = gst_caps_get_structure (caps, 0); - ret = gst_structure_get_int (structure, "rate", &rtpL16enc->frequency); - ret &= gst_structure_get_int (structure, "channels", &rtpL16enc->channels); - if (!ret) { - gst_object_unref (rtpL16enc); - return GST_PAD_LINK_REFUSED; - /* Pre-calculate what we can */ - rtpL16enc->time_interval = - GST_SECOND / (2 * rtpL16enc->channels * rtpL16enc->frequency); - gst_object_unref (rtpL16enc); - return GST_PAD_LINK_OK; + GstRtpL16Pay *rtpL16pay; -gst_rtpL16pay_htons (GstBuffer * buf) + rtpL16pay = GST_RTP_L16_PAY (object); + g_object_unref (rtpL16pay->adapter); + rtpL16pay->adapter = NULL; - *i = g_htons (*i); + G_OBJECT_CLASS (parent_class)->finalize (object); -gst_rtpL16pay_chain (GstPad * pad, GstData * _data) +gst_rtp_L16_pay_setcaps (GstBaseRTPPayload * basepayload, GstCaps * caps) - GstBuffer *outbuf; - rtpL16enc = GST_RTP_L16_PAY (GST_OBJECT_PARENT (pad)); + gint channels, rate; - g_return_if_fail (rtpL16enc != NULL); - g_return_if_fail (GST_IS_RTP_L16_PAY (rtpL16enc)); + rtpL16pay = GST_RTP_L16_PAY (basepayload); - switch (GST_EVENT_TYPE (event)) { - case GST_EVENT_DISCONTINUOUS: - GST_DEBUG ("discont"); - rtpL16enc->next_time = 0; - gst_pad_event_default (pad, event); - return; - default: - } + /* first parse input caps */ + if (!gst_structure_get_int (structure, "rate", &rate)) + goto no_rate; - /* We only need the header */ - packet = rtp_packet_new_allocate (0, 0, 0); + if (!gst_structure_get_int (structure, "channels", &channels)) + goto no_channels; - rtp_packet_set_csrc_count (packet, 0); - rtp_packet_set_extension (packet, 0); - rtp_packet_set_padding (packet, 0); - rtp_packet_set_version (packet, RTP_VERSION); - rtp_packet_set_marker (packet, 0); - rtp_packet_set_ssrc (packet, g_htonl (rtpL16enc->ssrc)); - rtp_packet_set_seq (packet, g_htons (rtpL16enc->seq)); - rtp_packet_set_timestamp (packet, - g_htonl ((guint32) rtpL16enc->next_time / GST_SECOND)); + gst_basertppayload_set_options (basepayload, "audio", TRUE, "L16", rate); + gst_basertppayload_set_outcaps (basepayload, + "channels", G_TYPE_INT, channels, "rate", G_TYPE_INT, rate, NULL); - if (rtpL16enc->channels == 1) { - rtp_packet_set_payload_type (packet, (guint8) PAYLOAD_L16_MONO); - else { - rtp_packet_set_payload_type (packet, (guint8) PAYLOAD_L16_STEREO); + /* ERRORS */ +no_rate: + GST_DEBUG_OBJECT (rtpL16pay, "no rate given"); - gst_rtpL16pay_htons (buf); - GST_BUFFER_SIZE (outbuf) = - rtp_packet_get_packet_len (packet) + GST_BUFFER_SIZE (buf); - GST_BUFFER_TIMESTAMP (outbuf) = rtpL16enc->next_time; - memcpy (GST_BUFFER_DATA (outbuf), packet->data, - rtp_packet_get_packet_len (packet)); - memcpy (GST_BUFFER_DATA (outbuf) + rtp_packet_get_packet_len (packet), - GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); - GST_DEBUG ("gst_rtpL16pay_chain: pushing buffer of size %d", - gst_pad_push (rtpL16enc->srcpad, GST_DATA (outbuf)); - ++rtpL16enc->seq; - rtpL16enc->next_time += rtpL16enc->time_interval * GST_BUFFER_SIZE (buf); -gst_rtpL16pay_set_property (GObject * object, guint prop_id, - const GValue * value, GParamSpec * pspec) - g_return_if_fail (GST_IS_RTP_L16_PAY (object)); - rtpL16enc = GST_RTP_L16_PAY (object); - switch (prop_id) { - default: +no_channels: + GST_DEBUG_OBJECT (rtpL16pay, "no channels given"); -gst_rtpL16pay_get_property (GObject * object, guint prop_id, GValue * value, - GParamSpec * pspec) +static GstFlowReturn +gst_rtp_L16_pay_handle_buffer (GstBaseRTPPayload * basepayload, + GstBuffer * buffer) + GstFlowReturn ret; + guint size, payload_len; + GstBuffer *outbuf; + guint8 *payload, *data; + GstClockTime timestamp; + guint packet_len, mtu; - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + mtu = GST_BASE_RTP_PAYLOAD_MTU (rtpL16pay); -static GstStateChangeReturn -gst_rtpL16pay_change_state (GstElement * element, GstStateChange transition) + size = GST_BUFFER_SIZE (buffer); + data = GST_BUFFER_DATA (buffer); + timestamp = GST_BUFFER_TIMESTAMP (buffer); - g_return_val_if_fail (GST_IS_RTP_L16_PAY (element), GST_STATE_CHANGE_FAILURE); + GST_DEBUG_OBJECT (basepayload, "got %d bytes", size); - rtpL16enc = GST_RTP_L16_PAY (element); + payload_len = size; + /* get packet len to check against MTU */ + packet_len = gst_rtp_buffer_calc_packet_len (payload_len, 0, 0); - /* if going down into NULL state, close the file if it's open */ - switch (transition) { - case GST_STATE_CHANGE_NULL_TO_READY: + /* now alloc output buffer */ + outbuf = gst_rtp_buffer_new_allocate (payload_len, 0, 0); - case GST_STATE_CHANGE_READY_TO_NULL: + /* get payload, this is now writable */ + payload = gst_rtp_buffer_get_payload (outbuf); + gst_buffer_unref (buffer); - if (GST_ELEMENT_CLASS (parent_class)->change_state) - return GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + ret = gst_basertppayload_push (basepayload, outbuf); - return GST_STATE_CHANGE_SUCCESS; + return ret; -gst_rtpL16pay_plugin_init (GstPlugin * plugin) +gst_rtp_L16_pay_plugin_init (GstPlugin * plugin) - return gst_element_register (plugin, "rtpL16enc", + return gst_element_register (plugin, "rtpL16pay", GST_RANK_NONE, GST_TYPE_RTP_L16_PAY); Index: gstrtpL16pay.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpL16pay.h,v retrieving revision 1.11 diff -u -d -r1.11 -r1.12 --- gstrtpL16pay.h 1 Jun 2006 21:07:25 -0000 1.11 +++ gstrtpL16pay.h 24 Jan 2007 18:20:14 -0000 1.12 + * Copyright (C) <2005> Wim Taymans <wi...@fl...> @@ -17,56 +17,46 @@ * Boston, MA 02111-1307, USA. #ifndef __GST_RTP_L16_PAY_H__ #define __GST_RTP_L16_PAY_H__ +#include <gst/rtp/gstbasertppayload.h> +#include <gst/base/gstadapter.h> -/* Definition of structure storing data for this element. */ +#define GST_TYPE_RTP_L16_PAY \ + (gst_rtp_L16_pay_get_type()) +#define GST_RTP_L16_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_L16_PAY,GstRtpL16Pay)) +#define GST_RTP_L16_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_L16_PAY,GstRtpL16PayClass)) +#define GST_IS_RTP_L16_PAY(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_L16_PAY)) +#define GST_IS_RTP_L16_PAY_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_L16_PAY)) typedef struct _GstRtpL16Pay GstRtpL16Pay; +typedef struct _GstRtpL16PayClass GstRtpL16PayClass; struct _GstRtpL16Pay + GstBaseRTPPayload payload; - guint channels; + GstAdapter *adapter; - /* the timestamp of the next frame */ - guint64 next_time; - /* the interval between frames */ - guint64 time_interval; - - guint32 ssrc; - guint16 seq; + gint rate; -/* Standard definition defining a class for this element. */ -typedef struct _GstRtpL16PayClass GstRtpL16PayClass; struct _GstRtpL16PayClass + GstBaseRTPPayloadClass parent_class; -/* Standard macros for defining types for this element. */ -#define GST_TYPE_RTP_L16_PAY \ - (gst_rtpL16pay_get_type()) -#define GST_RTP_L16_PAY(obj) \ - (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_L16_PAY,GstRtpL16Pay)) -#define GST_RTP_L16_PAY_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_L16_PAY,GstRtpL16PayClass)) -#define GST_IS_RTP_L16_PAY(obj) \ - (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_L16_PAY)) -#define GST_IS_RTP_L16_PAY_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_L16_PAY)) -gboolean gst_rtpL16pay_plugin_init (GstPlugin * plugin); +gboolean gst_rtp_L16_pay_plugin_init (GstPlugin * plugin); -#endif /* __GST_RTP_L16_PAY_H__ */ +#endif /* __GST_RTP_L16_PAY_H__ */ |
From: <wt...@ke...> - 2007-01-25 10:54:34
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Thu Jan 25 2007 10:54:32 UTC Log message: * gst/rtp/gstrtpL16pay.c: (gst_rtp_L16_pay_setcaps), (gst_rtp_L16_pay_flush), (gst_rtp_L16_pay_handle_buffer): * gst/rtp/gstrtpL16pay.h: Fill up to MTU using adapter. Timestamp rtp packets. Modified files: . : ChangeLog gst/rtp : gstrtpL16pay.c gstrtpL16pay.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2710&r2=1.2711 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpL16pay.c.diff?r1=1.24&r2=1.25 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpL16pay.h.diff?r1=1.12&r2=1.13 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2710 retrieving revision 1.2711 diff -u -d -r1.2710 -r1.2711 --- ChangeLog 25 Jan 2007 10:36:35 -0000 1.2710 +++ ChangeLog 25 Jan 2007 10:54:19 -0000 1.2711 @@ -1,3 +1,11 @@ +2007-01-25 Wim Taymans <wi...@fl...> + + * gst/rtp/gstrtpL16pay.c: (gst_rtp_L16_pay_setcaps), + (gst_rtp_L16_pay_flush), (gst_rtp_L16_pay_handle_buffer): + * gst/rtp/gstrtpL16pay.h: + Fill up to MTU using adapter. + Timestamp rtp packets. 2007-01-25 Edward Hervey <ed...@fl...> * gst/multipart/multipartmux.c: (gst_multipart_mux_collected): Index: gstrtpL16pay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpL16pay.c,v retrieving revision 1.24 retrieving revision 1.25 diff -u -d -r1.24 -r1.25 --- gstrtpL16pay.c 24 Jan 2007 18:20:14 -0000 1.24 +++ gstrtpL16pay.c 25 Jan 2007 10:54:19 -0000 1.25 @@ -179,6 +179,9 @@ gst_basertppayload_set_outcaps (basepayload, "channels", G_TYPE_INT, channels, "rate", G_TYPE_INT, rate, NULL); + rtpL16pay->rate = rate; + rtpL16pay->channels = channels; return TRUE; /* ERRORS */ @@ -195,41 +198,78 @@ } static GstFlowReturn +gst_rtp_L16_pay_flush (GstRtpL16Pay * rtpL16pay, guint len) +{ + GstBuffer *outbuf; + guint8 *payload; + GstFlowReturn ret; + guint samples; + GstClockTime duration; + /* now alloc output buffer */ + outbuf = gst_rtp_buffer_new_allocate (len, 0, 0); + /* get payload, this is now writable */ + payload = gst_rtp_buffer_get_payload (outbuf); + /* copy and flush data out of adapter into the RTP payload */ + gst_adapter_copy (rtpL16pay->adapter, payload, 0, len); + gst_adapter_flush (rtpL16pay->adapter, len); + samples = len / (2 * rtpL16pay->channels); + duration = gst_util_uint64_scale_int (samples, GST_SECOND, rtpL16pay->rate); + GST_BUFFER_TIMESTAMP (outbuf) = rtpL16pay->first_ts; + GST_BUFFER_DURATION (outbuf) = duration; + /* increase count (in ts) of data pushed to basertppayload */ + if (GST_CLOCK_TIME_IS_VALID (rtpL16pay->first_ts)) + rtpL16pay->first_ts += duration; + ret = gst_basertppayload_push (GST_BASE_RTP_PAYLOAD (rtpL16pay), outbuf); + return ret; +} +static GstFlowReturn gst_rtp_L16_pay_handle_buffer (GstBaseRTPPayload * basepayload, GstBuffer * buffer) { GstRtpL16Pay *rtpL16pay; - GstFlowReturn ret; - guint size, payload_len; - GstBuffer *outbuf; - guint8 *payload, *data; - GstClockTime timestamp; - guint packet_len, mtu; + GstFlowReturn ret = GST_FLOW_OK; + guint payload_len; + GstClockTime timestamp, duration; + guint mtu, avail; rtpL16pay = GST_RTP_L16_PAY (basepayload); mtu = GST_BASE_RTP_PAYLOAD_MTU (rtpL16pay); - size = GST_BUFFER_SIZE (buffer); - data = GST_BUFFER_DATA (buffer); timestamp = GST_BUFFER_TIMESTAMP (buffer); + duration = GST_BUFFER_DURATION (buffer); - GST_DEBUG_OBJECT (basepayload, "got %d bytes", size); - - payload_len = size; - /* get packet len to check against MTU */ - packet_len = gst_rtp_buffer_calc_packet_len (payload_len, 0, 0); + if (GST_BUFFER_IS_DISCONT (buffer)) + gst_adapter_clear (rtpL16pay->adapter); - /* now alloc output buffer */ - outbuf = gst_rtp_buffer_new_allocate (payload_len, 0, 0); + avail = gst_adapter_available (rtpL16pay->adapter); + if (avail == 0) { + rtpL16pay->first_ts = timestamp; + } - /* get payload, this is now writable */ - payload = gst_rtp_buffer_get_payload (outbuf); + /* push buffer in adapter */ + gst_adapter_push (rtpL16pay->adapter, buffer); - gst_buffer_unref (buffer); + /* get payload len for MTU */ + payload_len = gst_rtp_buffer_calc_payload_len (mtu, 0, 0); - ret = gst_basertppayload_push (basepayload, outbuf); + /* flush complete MTU while we have enough data in the adapter */ + while (avail >= payload_len) { + /* flush payload_len bytes */ + ret = gst_rtp_L16_pay_flush (rtpL16pay, payload_len); + if (ret != GST_FLOW_OK) + break; + avail = gst_adapter_available (rtpL16pay->adapter); return ret; Index: gstrtpL16pay.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpL16pay.h,v retrieving revision 1.12 retrieving revision 1.13 diff -u -d -r1.12 -r1.13 --- gstrtpL16pay.h 24 Jan 2007 18:20:14 -0000 1.12 +++ gstrtpL16pay.h 25 Jan 2007 10:54:19 -0000 1.13 @@ -44,7 +44,8 @@ GstBaseRTPPayload payload; - GstAdapter *adapter; + GstAdapter *adapter; + GstClockTime first_ts; gint rate; gint channels; |
From: <wt...@ke...> - 2007-01-25 14:23:08
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Thu Jan 25 2007 14:23:05 UTC Log message: * gst/rtp/README: * gst/rtp/gstrtpilbcdepay.c: * gst/rtp/gstrtpilbcpay.c: * gst/rtp/gstrtpmp4gdepay.c: * gst/rtp/gstrtpmp4gpay.c: * gst/rtp/gstrtpspeexdepay.c: * gst/rtp/gstrtpspeexpay.c: * gst/rtp/gstrtpsv3vdepay.c: * gst/rtp/gstrtptheoradepay.c: * gst/rtp/gstrtptheorapay.c: * gst/rtp/gstrtpvorbisdepay.c: * gst/rtp/gstrtpvorbispay.c: Fix case of encoding-name and key/value pairs to match the document. This is to make interoperation with SDP case-insensitive as required by the relevant RFCs. Modified files: . : ChangeLog gst/rtp : README gstrtpilbcdepay.c gstrtpilbcpay.c gstrtpmp4gdepay.c gstrtpmp4gpay.c gstrtpspeexdepay.c gstrtpspeexpay.c gstrtpsv3vdepay.c gstrtptheoradepay.c gstrtptheorapay.c gstrtpvorbisdepay.c gstrtpvorbispay.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2712&r2=1.2713 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/README.diff?r1=1.9&r2=1.10 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpilbcdepay.c.diff?r1=1.8&r2=1.9 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpilbcpay.c.diff?r1=1.4&r2=1.5 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gdepay.c.diff?r1=1.8&r2=1.9 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gpay.c.diff?r1=1.13&r2=1.14 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpspeexdepay.c.diff?r1=1.11&r2=1.12 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpspeexpay.c.diff?r1=1.11&r2=1.12 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpsv3vdepay.c.diff?r1=1.4&r2=1.5 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtptheoradepay.c.diff?r1=1.2&r2=1.3 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtptheorapay.c.diff?r1=1.2&r2=1.3 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpvorbisdepay.c.diff?r1=1.6&r2=1.7 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpvorbispay.c.diff?r1=1.6&r2=1.7 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2712 retrieving revision 1.2713 diff -u -d -r1.2712 -r1.2713 --- ChangeLog 25 Jan 2007 11:02:01 -0000 1.2712 +++ ChangeLog 25 Jan 2007 14:22:53 -0000 1.2713 @@ -1,5 +1,23 @@ 2007-01-25 Wim Taymans <wi...@fl...> + * gst/rtp/README: + * gst/rtp/gstrtpilbcdepay.c: + * gst/rtp/gstrtpilbcpay.c: + * gst/rtp/gstrtpmp4gdepay.c: + * gst/rtp/gstrtpmp4gpay.c: + * gst/rtp/gstrtpspeexdepay.c: + * gst/rtp/gstrtpspeexpay.c: + * gst/rtp/gstrtpsv3vdepay.c: + * gst/rtp/gstrtptheoradepay.c: + * gst/rtp/gstrtptheorapay.c: + * gst/rtp/gstrtpvorbisdepay.c: + * gst/rtp/gstrtpvorbispay.c: + Fix case of encoding-name and key/value pairs to match the document. + This is to make interoperation with SDP case-insensitive as required by + the relevant RFCs. + +2007-01-25 Wim Taymans <wi...@fl...> * configure.ac: Bump required -core/-base to CVS Index: README RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/README,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- README 21 Sep 2006 09:35:13 -0000 1.9 +++ README 25 Jan 2007 14:22:53 -0000 1.10 @@ -13,6 +13,7 @@ * media: (String) [ "audio", "video", "application", "data", "control" ] Defined in RFC 2327 in the SDP media announcement field. + Converted to lower case. * payload: (int) [0, 127] For audio and video, these will normally be a media payload type as @@ -34,14 +35,16 @@ encoding-name: (String) ANY typically second part of the mime type. ex. MP4V-ES. only required if - payload type >= 96 + payload type >= 96. Converted to upper case. encoding-params: (String) ANY extra encoding parameters (as in the SDP a=rtpmap: field). only required if different from the default of the encoding-name. + Converted to lower-case. Optional parameters as key/value pairs, media type specific. The value type - should be of type G_TYPE_STRING. + should be of type G_TYPE_STRING. The key and value are converted to lower-case. + A parameter with no value is converted to <param>=1. Example: @@ -137,10 +140,10 @@ ssrc=(guint)1162703703, clock-base=(guint)816135835, seqnum-base=(guint)9294, profile-level-id=(string)3, config=(string)000001b003000001b50900000100000001200086c5d4c307d314043c1463000001b25876694430303334 /pipeline0/udpsink1.sink: caps = application/x-rtp, media=(string)audio, - payload=(int)96, clock-rate=(int)44100, encoding-name=(string)mpeg4-generic, + payload=(int)96, clock-rate=(int)44100, encoding-name=(string)MPEG4-GENERIC, ssrc=(guint)3246149898, clock-base=(guint)4134514058, seqnum-base=(guint)57633, encoding-params=(string)2, streamtype=(string)5, profile-level-id=(string)1, - mode=(string)AAC-hbr, config=(string)1210, sizelength=(string)13, + mode=(string)aac-hbr, config=(string)1210, sizelength=(string)13, indexlength=(string)3, indexdeltalength=(string)3 .... @@ -153,9 +156,9 @@ config=(string)000001b003000001b50900000100000001200086c5d4c307d314043c1463000001b25876694430303334" ! rtpmp4vdepay ! ffdec_mpeg4 ! xvimagesink sync=false udpsrc port=5002 caps="application/x-rtp, media=(string)audio, payload=(int)96, - clock-rate=(int)44100, encoding-name=(string)mpeg4-generic, ssrc=(guint)3246149898, + clock-rate=(int)44100, encoding-name=(string)MPEG4-GENERIC, ssrc=(guint)3246149898, clock-base=(guint)4134514058, seqnum-base=(guint)57633, encoding-params=(string)2, - streamtype=(string)5, profile-level-id=(string)1, mode=(string)AAC-hbr, + streamtype=(string)5, profile-level-id=(string)1, mode=(string)aac-hbr, config=(string)1210, sizelength=(string)13, indexlength=(string)3, indexdeltalength=(string)3" ! rtpmp4gdepay ! faad ! alsasink sync=false Index: gstrtpilbcdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpilbcdepay.c,v retrieving revision 1.8 diff -u -d -r1.8 -r1.9 --- gstrtpilbcdepay.c 24 Jan 2007 12:22:50 -0000 1.8 +++ gstrtpilbcdepay.c 25 Jan 2007 14:22:53 -0000 1.9 @@ -53,7 +53,7 @@ "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) 8000, " - "encoding-name = (string) \"iLBC\", " "mode = (int) { 20, 30 }") + "encoding-name = (string) \"ILBC\", " "mode = (int) { 20, 30 }") ); static GstStaticPadTemplate gst_rtp_ilbc_depay_src_template = Index: gstrtpilbcpay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpilbcpay.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- gstrtpilbcpay.c 31 Oct 2006 10:52:31 -0000 1.4 +++ gstrtpilbcpay.c 25 Jan 2007 14:22:53 -0000 1.5 @@ -50,7 +50,7 @@ - "encoding-name = (string) \"iLBC\", " "mode = (int) {20, 30}") + "encoding-name = (string) \"ILBC\", " "mode = (int) {20, 30}") static gboolean gst_rtpilbcpay_setcaps (GstBaseRTPPayload * payload, Index: gstrtpmp4gdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gdepay.c,v --- gstrtpmp4gdepay.c 24 Jan 2007 12:22:50 -0000 1.8 +++ gstrtpmp4gdepay.c 25 Jan 2007 14:22:53 -0000 1.9 @@ -65,12 +65,12 @@ "media = (string) { \"video\", \"audio\", \"application\" }, " "clock-rate = (int) [1, MAX ], " - "encoding-name = (string) \"mpeg4-generic\", " + "encoding-name = (string) \"MPEG4-GENERIC\", " /* required string params */ "streamtype = (string) { \"4\", \"5\" }, " /* 4 = video, 5 = audio */ /* "profile-level-id = (string) [1,MAX], " */ /* "config = (string) [1,MAX]" */ - "mode = (string) { \"generic\", \"CELP-cbr\", \"CELP-vbr\", \"AAC-lbr\", \"AAC-hbr\" } " + "mode = (string) { \"generic\", \"celp-cbr\", \"celp-vbr\", \"aac-lbr\", \"aac-hbr\" } " /* Optional general parameters */ /* "objecttype = (string) [1,MAX], " */ /* "constantsize = (string) [1,MAX], " *//* constant size of each AU */ Index: gstrtpmp4gpay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gpay.c,v retrieving revision 1.13 retrieving revision 1.14 diff -u -d -r1.13 -r1.14 --- gstrtpmp4gpay.c 24 Jan 2007 12:22:50 -0000 1.13 +++ gstrtpmp4gpay.c 25 Jan 2007 14:22:53 -0000 1.14 @@ -54,12 +54,12 @@ Index: gstrtpspeexdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpspeexdepay.c,v retrieving revision 1.11 retrieving revision 1.12 diff -u -d -r1.11 -r1.12 --- gstrtpspeexdepay.c 24 Jan 2007 12:22:50 -0000 1.11 +++ gstrtpspeexdepay.c 25 Jan 2007 14:22:53 -0000 1.12 @@ -52,7 +52,7 @@ "clock-rate = (int) [6000, 48000], " - "encoding-name = (string) \"speex\", " + "encoding-name = (string) \"SPEEX\", " "encoding-params = (string) \"1\"") Index: gstrtpspeexpay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpspeexpay.c,v --- gstrtpspeexpay.c 24 Jan 2007 12:22:50 -0000 1.11 +++ gstrtpspeexpay.c 25 Jan 2007 14:22:53 -0000 1.12 @@ -49,7 +49,7 @@ "clock-rate = (int) 8000, " Index: gstrtpsv3vdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpsv3vdepay.c,v --- gstrtpsv3vdepay.c 24 Jan 2007 12:22:51 -0000 1.4 +++ gstrtpsv3vdepay.c 25 Jan 2007 14:22:53 -0000 1.5 @@ -61,7 +61,7 @@ "media = (string) \"video\", " "clock-rate = (int) 90000, " - "encoding-name = (string) { \"X-SV3V-ES\", \"X-SorensonVideo\" }") + "encoding-name = (string) { \"X-SV3V-ES\", \"X-SORENSON-VIDEO\" }") GST_BOILERPLATE (GstRtpSV3VDepay, gst_rtp_sv3v_depay, GstBaseRTPDepayload, Index: gstrtptheoradepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtptheoradepay.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- gstrtptheoradepay.c 24 Jan 2007 12:22:51 -0000 1.2 +++ gstrtptheoradepay.c 25 Jan 2007 14:22:53 -0000 1.3 @@ -56,7 +56,7 @@ GST_STATIC_CAPS ("application/x-rtp, " - "clock-rate = (int) [1, MAX ], " "encoding-name = (string) \"theora\"" + "clock-rate = (int) [1, MAX ], " "encoding-name = (string) \"THEORA\"" /* All required parameters * * "encoding-params = (string) <num channels>" Index: gstrtptheorapay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtptheorapay.c,v --- gstrtptheorapay.c 24 Jan 2007 12:22:51 -0000 1.2 +++ gstrtptheorapay.c 25 Jan 2007 14:22:53 -0000 1.3 /* All required parameters * "sampling = (string) { "YCbCr-4:2:0", "YCbCr-4:2:2", "YCbCr-4:4:4" } " Index: gstrtpvorbisdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpvorbisdepay.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- gstrtpvorbisdepay.c 24 Jan 2007 12:22:51 -0000 1.6 +++ gstrtpvorbisdepay.c 25 Jan 2007 14:22:53 -0000 1.7 - "clock-rate = (int) [1, MAX ], " "encoding-name = (string) \"vorbis\"" + "clock-rate = (int) [1, MAX ], " "encoding-name = (string) \"VORBIS\"" Index: gstrtpvorbispay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpvorbispay.c,v --- gstrtpvorbispay.c 24 Jan 2007 12:22:51 -0000 1.6 +++ gstrtpvorbispay.c 25 Jan 2007 14:22:53 -0000 1.7 @@ -48,7 +48,7 @@ |
From: <wt...@ke...> - 2007-02-15 12:26:46
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Thu Feb 15 2007 12:26:40 UTC Log message: * gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_process): Set right caps on output buffers. Modified files: . : ChangeLog gst/rtp : gstrtph264depay.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2742&r2=1.2743 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtph264depay.c.diff?r1=1.6&r2=1.7 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2742 retrieving revision 1.2743 diff -u -d -r1.2742 -r1.2743 --- ChangeLog 14 Feb 2007 17:04:46 -0000 1.2742 +++ ChangeLog 15 Feb 2007 12:26:27 -0000 1.2743 @@ -1,3 +1,8 @@ +2007-02-15 Wim Taymans <wi...@fl...> + + * gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_process): + Set right caps on output buffers. 2007-02-14 Wim Taymans <wi...@fl...> * gst/rtsp/sdpmessage.c: (sdp_parse_line): Index: gstrtph264depay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtph264depay.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- gstrtph264depay.c 24 Jan 2007 12:22:50 -0000 1.6 +++ gstrtph264depay.c 15 Feb 2007 12:26:28 -0000 1.7 @@ -381,8 +381,7 @@ GST_BUFFER_DATA (outbuf) = outdata; GST_BUFFER_MALLOCDATA (outbuf) = outdata; - gst_buffer_set_caps (outbuf, - (GstCaps *) gst_pad_get_pad_template_caps (depayload->srcpad)); + gst_buffer_set_caps (outbuf, GST_PAD_CAPS (depayload->srcpad)); GST_DEBUG_OBJECT (rtph264depay, "output %d bytes", outsize); @@ -405,8 +404,7 @@ outdata[2] = 1; memcpy (&outdata[3], payload, payload_len); - gst_buffer_set_caps (outbuf, - (GstCaps *) gst_pad_get_pad_template_caps (depayload->srcpad)); + gst_buffer_set_caps (outbuf, GST_PAD_CAPS (depayload->srcpad)); return outbuf; } |