From: <wt...@ke...> - 2008-06-18 16:55:12
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Wed Jun 18 2008 16:55:19 UTC Log message: * gst/rtp/gstrtpg726pay.c: Fix caps, See #538891. Modified files: . : ChangeLog gst/rtp : gstrtpg726pay.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.3558&r2=1.3559 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpg726pay.c.diff?r1=1.1&r2=1.2 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.3558 retrieving revision 1.3559 diff -u -d -r1.3558 -r1.3559 --- ChangeLog 18 Jun 2008 10:28:18 -0000 1.3558 +++ ChangeLog 18 Jun 2008 16:55:03 -0000 1.3559 @@ -1,3 +1,8 @@ +2008-06-18 Wim Taymans <wim...@co...> + + * gst/rtp/gstrtpg726pay.c: + Fix caps, See #538891. 2008-06-18 Sebastian Dröge <sl...@ci...> * gst/matroska/matroska-demux.c: (gst_matroska_demux_reset), Index: gstrtpg726pay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpg726pay.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- gstrtpg726pay.c 18 Jun 2008 10:12:57 -0000 1.1 +++ gstrtpg726pay.c 18 Jun 2008 16:55:05 -0000 1.2 @@ -37,16 +37,14 @@ "Axis Communications <dev...@ax...>"); static GstStaticPadTemplate gst_rtp_g726_pay_sink_template = - GST_STATIC_PAD_TEMPLATE ("sink", +GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-adpcm, " "channels = (int) 1, " "rate = (int) 8000, " "bitrate = (int) { 16000, 24000, 32000, 40000 }, " - "layout = (string) \"g726\"; " - "audio/G723, channels=(int)1, rate=(int)8000; " - "audio/32KADPCM, channels=(int)1, rate=(int)8000") + "layout = (string) \"g726\"") ); static GstStaticPadTemplate gst_rtp_g726_pay_src_template = |
From: <wt...@ke...> - 2008-06-19 11:24:59
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Thu Jun 19 2008 11:25:08 UTC Log message: * gst/rtp/gstrtpg726pay.c: (gst_rtp_g726_pay_setcaps): Remove unused variable so that we can compile again. Modified files: . : ChangeLog gst/rtp : gstrtpg726pay.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.3565&r2=1.3566 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpg726pay.c.diff?r1=1.3&r2=1.4 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.3565 retrieving revision 1.3566 diff -u -d -r1.3565 -r1.3566 --- ChangeLog 19 Jun 2008 11:06:28 -0000 1.3565 +++ ChangeLog 19 Jun 2008 11:24:52 -0000 1.3566 @@ -1,3 +1,8 @@ +2008-06-19 Wim Taymans <wim...@co...> + + * gst/rtp/gstrtpg726pay.c: (gst_rtp_g726_pay_setcaps): + Remove unused variable so that we can compile again. 2008-06-19 Peter Kjellerstedt <pk...@ax...> * gst/rtp/gstrtpg726pay.c: (gst_rtp_g726_pay_setcaps): Index: gstrtpg726pay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpg726pay.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- gstrtpg726pay.c 19 Jun 2008 11:06:29 -0000 1.3 +++ gstrtpg726pay.c 19 Jun 2008 11:24:54 -0000 1.4 @@ -110,7 +110,6 @@ { gchar *encoding_name; GstStructure *structure = gst_caps_get_structure (caps, 0); - const gchar *stname = gst_structure_get_name (structure); GstBaseRTPAudioPayload *basertpaudiopayload; gint bitrate; |
From: <wt...@ke...> - 2008-07-01 13:28:07
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Tue Jul 01 2008 13:28:16 UTC Log message: * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: (plugin_init): * gst/rtp/gstrtpvrawdepay.c: (gst_rtp_vraw_depay_base_init), (gst_rtp_vraw_depay_class_init), (gst_rtp_vraw_depay_init), (gst_rtp_vraw_depay_setcaps), (gst_rtp_vraw_depay_process), (gst_rtp_vraw_depay_change_state), (gst_rtp_vraw_depay_plugin_init): * gst/rtp/gstrtpvrawdepay.h: * gst/rtp/gstrtpvrawpay.c: (gst_rtp_vraw_pay_get_type), (gst_rtp_vraw_pay_base_init), (gst_rtp_vraw_pay_class_init), (gst_rtp_vraw_pay_init), (gst_rtp_vraw_pay_finalize), (gst_rtp_vraw_pay_setcaps), (gst_rtp_vraw_pay_handle_buffer), (gst_rtp_vraw_pay_plugin_init): * gst/rtp/gstrtpvrawpay.h: Add raw video pay and depayloaders, see RFC4175. Modified files: . : ChangeLog gst/rtp : Makefile.am gstrtp.c Added files: gst/rtp : gstrtpvrawdepay.c gstrtpvrawdepay.h gstrtpvrawpay.c gstrtpvrawpay.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.3581&r2=1.3582 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/Makefile.am.diff?r1=1.48&r2=1.49 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtp.c.diff?r1=1.43&r2=1.44 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpvrawdepay.c?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpvrawdepay.h?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpvrawpay.c?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpvrawpay.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.3581 retrieving revision 1.3582 diff -u -d -r1.3581 -r1.3582 --- ChangeLog 30 Jun 2008 22:53:38 -0000 1.3581 +++ ChangeLog 1 Jul 2008 13:27:56 -0000 1.3582 @@ -1,3 +1,21 @@ +2008-07-01 Wim Taymans <wim...@co...> + + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: (plugin_init): + * gst/rtp/gstrtpvrawdepay.c: (gst_rtp_vraw_depay_base_init), + (gst_rtp_vraw_depay_class_init), (gst_rtp_vraw_depay_init), + (gst_rtp_vraw_depay_setcaps), (gst_rtp_vraw_depay_process), + (gst_rtp_vraw_depay_change_state), + (gst_rtp_vraw_depay_plugin_init): + * gst/rtp/gstrtpvrawdepay.h: + * gst/rtp/gstrtpvrawpay.c: (gst_rtp_vraw_pay_get_type), + (gst_rtp_vraw_pay_base_init), (gst_rtp_vraw_pay_class_init), + (gst_rtp_vraw_pay_init), (gst_rtp_vraw_pay_finalize), + (gst_rtp_vraw_pay_setcaps), (gst_rtp_vraw_pay_handle_buffer), + (gst_rtp_vraw_pay_plugin_init): + * gst/rtp/gstrtpvrawpay.h: + Add raw video pay and depayloaders, see RFC4175. 2008-06-30 Jan Schmidt <jan...@su...> * ext/libpng/gstpngdec.c: Index: Makefile.am RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/Makefile.am,v retrieving revision 1.48 retrieving revision 1.49 diff -u -d -r1.48 -r1.49 --- Makefile.am 18 Jun 2008 10:12:56 -0000 1.48 +++ Makefile.am 1 Jul 2008 13:28:00 -0000 1.49 @@ -47,7 +47,9 @@ gstrtptheoradepay.c \ gstrtptheorapay.c \ gstrtpvorbisdepay.c \ - gstrtpvorbispay.c + gstrtpvorbispay.c \ + gstrtpvrawdepay.c \ + gstrtpvrawpay.c if HAVE_WINSOCK2_H @@ -108,4 +110,6 @@ gstrtptheoradepay.h \ gstrtptheorapay.h \ gstrtpvorbisdepay.h \ - gstrtpvorbispay.h + gstrtpvorbispay.h \ + gstrtpvrawdepay.h \ + gstrtpvrawpay.h Index: gstrtp.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtp.c,v retrieving revision 1.43 retrieving revision 1.44 diff -u -d -r1.43 -r1.44 --- gstrtp.c 18 Jun 2008 10:12:56 -0000 1.43 +++ gstrtp.c 1 Jul 2008 13:28:00 -0000 1.44 @@ -66,6 +66,8 @@ #include "gstrtptheorapay.h" #include "gstrtpvorbisdepay.h" #include "gstrtpvorbispay.h" +#include "gstrtpvrawdepay.h" +#include "gstrtpvrawpay.h" static gboolean plugin_init (GstPlugin * plugin) @@ -205,6 +207,12 @@ if (!gst_rtp_vorbis_pay_plugin_init (plugin)) return FALSE; + if (!gst_rtp_vraw_depay_plugin_init (plugin)) + return FALSE; + if (!gst_rtp_vraw_pay_plugin_init (plugin)) return TRUE; } --- NEW FILE: gstrtpvrawdepay.c --- /* GStreamer * Copyright (C) <2008> Wim Taymans <wim...@gm...> * * 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 "gstrtpvrawdepay.h" GST_DEBUG_CATEGORY_STATIC (rtpvrawdepay_debug); #define GST_CAT_DEFAULT (rtpvrawdepay_debug) /* elementfactory information */ static const GstElementDetails gst_rtp_vrawdepay_details = GST_ELEMENT_DETAILS ("RTP packet depayloader", "Codec/Depayloader/Network", "Extracts raw video from RTP packets (RFC 4175)", "Wim Taymans <wim...@gm...>"); static GstStaticPadTemplate gst_rtp_vraw_depay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/x-raw-rgb; video/x-raw-yuv") ); static GstStaticPadTemplate gst_rtp_vraw_depay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"video\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) 90000, " "encoding-name = (string) \"RAW\"") GST_BOILERPLATE (GstRtpVRawDepay, gst_rtp_vraw_depay, GstBaseRTPDepayload, GST_TYPE_BASE_RTP_DEPAYLOAD); static gboolean gst_rtp_vraw_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps); static GstBuffer *gst_rtp_vraw_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf); static GstStateChangeReturn gst_rtp_vraw_depay_change_state (GstElement * element, GstStateChange transition); static void gst_rtp_vraw_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_vraw_depay_src_template)); gst_static_pad_template_get (&gst_rtp_vraw_depay_sink_template)); gst_element_class_set_details (element_class, &gst_rtp_vrawdepay_details); } gst_rtp_vraw_depay_class_init (GstRtpVRawDepayClass * 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); gstelement_class->change_state = gst_rtp_vraw_depay_change_state; gstbasertpdepayload_class->set_caps = gst_rtp_vraw_depay_setcaps; gstbasertpdepayload_class->process = gst_rtp_vraw_depay_process; GST_DEBUG_CATEGORY_INIT (rtpvrawdepay_debug, "rtpvrawdepay", 0, "raw video RTP Depayloader"); gst_rtp_vraw_depay_init (GstRtpVRawDepay * rtpvrawdepay, GstRtpVRawDepayClass * klass) /* needed because of GST_BOILERPLATE */ static gboolean gst_rtp_vraw_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) GstStructure *structure; GstRtpVRawDepay *rtpvrawdepay; gint clock_rate = 90000; /* default */ const gchar *str, *type; gint format, width, height, pgroup, xinc, yinc; guint ystride, uvstride, yp, up, vp, outsize; GstCaps *srccaps; guint32 fourcc = 0; rtpvrawdepay = GST_RTP_VRAW_DEPAY (depayload); structure = gst_caps_get_structure (caps, 0); yp = up = vp = uvstride = 0; xinc = yinc = 1; gst_structure_get_int (structure, "clock-rate", &clock_rate); depayload->clock_rate = clock_rate; if (!(str = gst_structure_get_string (structure, "width"))) goto no_width; width = atoi (str); if (!(str = gst_structure_get_string (structure, "height"))) goto no_height; height = atoi (str); if (!(str = gst_structure_get_string (structure, "sampling"))) goto no_sampling; if (!strcmp (str, "RGB")) { format = GST_VIDEO_FORMAT_RGB; pgroup = 3; ystride = GST_ROUND_UP_4 (width * 3); outsize = ystride * height; type = "video/x-raw-rgb"; } else if (!strcmp (str, "RGBA")) { format = GST_VIDEO_FORMAT_RGBA; pgroup = 4; ystride = width * 4; } else if (!strcmp (str, "BGR")) { format = GST_VIDEO_FORMAT_BGR; } else if (!strcmp (str, "BGRA")) { format = GST_VIDEO_FORMAT_BGRA; } else if (!strcmp (str, "YCbCr-4:4:4")) { format = GST_VIDEO_FORMAT_AYUV; type = "video/x-raw-yuv"; fourcc = GST_MAKE_FOURCC ('A', 'Y', 'U', 'V'); } else if (!strcmp (str, "YCbCr-4:2:2")) { format = GST_VIDEO_FORMAT_UYVY; ystride = GST_ROUND_UP_2 (width) * 2; fourcc = GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'); xinc = 2; } else if (!strcmp (str, "YCbCr-4:2:0")) { format = GST_VIDEO_FORMAT_I420; pgroup = 6; ystride = GST_ROUND_UP_4 (width); uvstride = GST_ROUND_UP_8 (width) / 2; up = ystride * GST_ROUND_UP_2 (height); vp = up + uvstride * GST_ROUND_UP_2 (height) / 2; outsize = vp + uvstride * GST_ROUND_UP_2 (height) / 2; fourcc = GST_MAKE_FOURCC ('I', '4', '2', '0'); xinc = yinc = 2; } else if (!strcmp (str, "YCbCr-4:1:1")) { format = GST_VIDEO_FORMAT_Y41B; uvstride = GST_ROUND_UP_8 (width) / 4; up = ystride * height; vp = up + uvstride * height; outsize = vp + uvstride * height; fourcc = GST_MAKE_FOURCC ('Y', '4', '1', 'B'); xinc = 4; } else goto unknown_format; rtpvrawdepay->width = width; rtpvrawdepay->height = height; rtpvrawdepay->format = format; rtpvrawdepay->yp = yp; rtpvrawdepay->up = up; rtpvrawdepay->vp = vp; rtpvrawdepay->pgroup = pgroup; rtpvrawdepay->xinc = xinc; rtpvrawdepay->yinc = yinc; rtpvrawdepay->ystride = ystride; rtpvrawdepay->uvstride = uvstride; rtpvrawdepay->outsize = outsize; srccaps = gst_caps_new_simple (type, "width", G_TYPE_INT, width, "height", G_TYPE_INT, height, "format", GST_TYPE_FOURCC, fourcc, "framerate", GST_TYPE_FRACTION, 0, 1, NULL); gst_pad_set_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload), srccaps); gst_caps_unref (srccaps); GST_DEBUG_OBJECT (depayload, "width %d, height %d, format %d", width, height, format); GST_DEBUG_OBJECT (depayload, "yp %d, up %d, vp %d", yp, up, vp); GST_DEBUG_OBJECT (depayload, "pgroup %d, ystride %d, uvstride %d", pgroup, ystride, uvstride); GST_DEBUG_OBJECT (depayload, "outsize %u", outsize); return TRUE; /* ERRORS */ no_width: { GST_ERROR_OBJECT (depayload, "no width specified"); return FALSE; } no_height: GST_ERROR_OBJECT (depayload, "no height specified"); no_sampling: GST_ERROR_OBJECT (depayload, "no sampling specified"); unknown_format: GST_ERROR_OBJECT (depayload, "unknown sampling format '%s'", str); static GstBuffer * gst_rtp_vraw_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) gint payload_len; guint8 *payload, *data, *yp, *up, *vp, *headers; guint32 timestamp; guint cont, ystride, uvstride, pgroup; payload_len = gst_rtp_buffer_get_payload_len (buf); timestamp = gst_rtp_buffer_get_timestamp (buf); if (timestamp != rtpvrawdepay->timestamp || rtpvrawdepay->outbuf == NULL) { GstBuffer *outbuf; GstFlowReturn ret; GST_LOG_OBJECT (depayload, "new frame with timestamp %u", timestamp); /* new timestamp, flush old buffer and create new output buffer */ if (rtpvrawdepay->outbuf) { gst_base_rtp_depayload_push_ts (depayload, rtpvrawdepay->timestamp, rtpvrawdepay->outbuf); rtpvrawdepay->outbuf = NULL; } ret = gst_pad_alloc_buffer (depayload->srcpad, -1, rtpvrawdepay->outsize, GST_PAD_CAPS (depayload->srcpad), &outbuf); if (ret != GST_FLOW_OK) goto alloc_failed; /* clear timestamp from alloc... */ GST_BUFFER_TIMESTAMP (outbuf) = -1; rtpvrawdepay->outbuf = outbuf; rtpvrawdepay->timestamp = timestamp; data = GST_BUFFER_DATA (rtpvrawdepay->outbuf); /* get pointer and strides of the planes */ yp = data + rtpvrawdepay->yp; up = data + rtpvrawdepay->up; vp = data + rtpvrawdepay->vp; ystride = rtpvrawdepay->ystride; uvstride = rtpvrawdepay->uvstride; pgroup = rtpvrawdepay->pgroup; payload = gst_rtp_buffer_get_payload (buf); /* skip extended seqnum */ payload++; /* remember header position */ headers = payload; /* find data start */ do { cont = payload[4] & 0x80; payload += 6; } while (cont); while (TRUE) { guint length, line, offs; guint8 *datap; /* read length and cont */ length = (headers[0] << 8) | headers[1]; line = ((headers[2] & 0x7f) << 8) | headers[3]; offs = ((headers[4] & 0x7f) << 8) | headers[5]; cont = headers[4] & 0x80; headers += 6; /* sanity check */ if (line > (rtpvrawdepay->height - rtpvrawdepay->yinc)) continue; if (offs > (rtpvrawdepay->width - rtpvrawdepay->xinc)) GST_LOG_OBJECT (depayload, "writing length %u, line %u, offset %u", length, line, offs); switch (rtpvrawdepay->format) { case GST_VIDEO_FORMAT_RGB: case GST_VIDEO_FORMAT_RGBA: case GST_VIDEO_FORMAT_BGR: case GST_VIDEO_FORMAT_BGRA: case GST_VIDEO_FORMAT_UYVY: /* samples are packed just like gstreamer packs them */ offs /= rtpvrawdepay->xinc; datap = yp + (line * ystride) + (offs * pgroup); memcpy (datap, payload, length); payload += length; break; case GST_VIDEO_FORMAT_AYUV: { gint i; datap = yp + (line * ystride) + (offs * 4); /* samples are packed in order Cb-Y-Cr for both interlaced and * progressive frames */ for (i = 0; i < length; i += pgroup) { *datap++ = 0; *datap++ = payload[1]; *datap++ = payload[0]; *datap++ = payload[2]; payload += pgroup; } } case GST_VIDEO_FORMAT_I420: guint uvoff; guint8 *yd1p, *yd2p, *udp, *vdp; yd1p = yp + (line * ystride) + (offs); yd2p = yd1p + ystride; uvoff = (line / rtpvrawdepay->yinc * uvstride) + (offs / rtpvrawdepay->xinc); udp = up + uvoff; vdp = vp + uvoff; /* line 0/1: Y00-Y01-Y10-Y11-Cb00-Cr00 Y02-Y03-Y12-Y13-Cb01-Cr01 ... */ *yd1p++ = payload[0]; *yd1p++ = payload[1]; *yd2p++ = payload[2]; *yd2p++ = payload[3]; *udp++ = payload[4]; *vdp++ = payload[5]; case GST_VIDEO_FORMAT_Y41B: guint8 *ydp, *udp, *vdp; ydp = yp + (line * ystride) + (offs); /* Samples are packed in order Cb0-Y0-Y1-Cr0-Y2-Y3 for both interlaced * and progressive scan lines */ *udp++ = payload[0]; *ydp++ = payload[1]; *ydp++ = payload[2]; *vdp++ = payload[3]; *ydp++ = payload[4]; *ydp++ = payload[5]; default: goto unknown_sampling; if (!cont) break; if (gst_rtp_buffer_get_marker (buf)) { GST_LOG_OBJECT (depayload, "marker, flushing frame"); gst_base_rtp_depayload_push_ts (depayload, timestamp, rtpvrawdepay->timestamp = -1; return NULL; unknown_sampling: GST_ELEMENT_ERROR (depayload, STREAM, FORMAT, (NULL), ("unimplemented sampling")); return NULL; alloc_failed: GST_DEBUG_OBJECT (depayload, "failed to alloc output buffer"); static GstStateChangeReturn gst_rtp_vraw_depay_change_state (GstElement * element, GstStateChange transition) GstStateChangeReturn ret; rtpvrawdepay = GST_RTP_VRAW_DEPAY (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: case GST_STATE_CHANGE_READY_TO_PAUSED: rtpvrawdepay->timestamp = -1; default: ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); case GST_STATE_CHANGE_PAUSED_TO_READY: if (rtpvrawdepay->outbuf) { gst_buffer_unref (rtpvrawdepay->outbuf); rtpvrawdepay->outbuf = NULL; case GST_STATE_CHANGE_READY_TO_NULL: return ret; gboolean gst_rtp_vraw_depay_plugin_init (GstPlugin * plugin) return gst_element_register (plugin, "rtpvrawdepay", GST_RANK_MARGINAL, GST_TYPE_RTP_VRAW_DEPAY); --- NEW FILE: gstrtpvrawdepay.h --- #ifndef __GST_RTP_VRAW_DEPAY_H__ #define __GST_RTP_VRAW_DEPAY_H__ #include <gst/gst.h> #include <gst/video/video.h> #include <gst/rtp/gstbasertpdepayload.h> G_BEGIN_DECLS #define GST_TYPE_RTP_VRAW_DEPAY \ (gst_rtp_vraw_depay_get_type()) #define GST_RTP_VRAW_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_VRAW_DEPAY,GstRtpVRawDepay)) #define GST_RTP_VRAW_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_VRAW_DEPAY,GstRtpVRawDepayClass)) #define GST_IS_RTP_VRAW_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_VRAW_DEPAY)) #define GST_IS_RTP_VRAW_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_VRAW_DEPAY)) typedef struct _GstRtpVRawDepay GstRtpVRawDepay; typedef struct _GstRtpVRawDepayClass GstRtpVRawDepayClass; struct _GstRtpVRawDepay GstBaseRTPDepayload payload; gint width, height; GstVideoFormat format; GstBuffer *outbuf; guint outsize; gint pgroup; gint xinc, yinc; guint yp, up, vp; gint ystride; gint uvstride; }; struct _GstRtpVRawDepayClass GstBaseRTPDepayloadClass parent_class; gboolean gst_rtp_vraw_depay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_VRAW_DEPAY_H__ */ --- NEW FILE: gstrtpvrawpay.c --- #include "gstrtpvrawpay.h" GST_DEBUG_CATEGORY_STATIC (rtpvrawpay_debug); #define GST_CAT_DEFAULT (rtpvrawpay_debug) static const GstElementDetails gst_rtp_vrawpay_details = GST_ELEMENT_DETAILS ("RTP packet payloader", "Codec/Payloader/Network", "Payload raw video as RTP packets (RFC 4175)", static GstStaticPadTemplate gst_rtp_vraw_pay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_STATIC_CAPS ("video/x-raw-rgb, " "bpp = (int) 24, " "depth = (int) 24, " "endianness = (int) BIG_ENDIAN, " "red_mask = (int) 0xFF000000, " "green_mask = (int) 0x00FF0000, " "blue_mask = (int) 0x0000FF00, " "width = (int) [ 1, 32767 ], " "height = (int) [ 1, 32767 ]; " "video/x-raw-rgb, " "bpp = (int) 32, " "depth = (int) 32, " "alpha_mask = (int) 0x000000FF, " "red_mask = (int) 0x0000FF00, " "blue_mask = (int) 0xFF000000, " "video/x-raw-yuv, " "format = (fourcc) { AYUV, UYVY, I420, Y41B }, " "width = (int) [ 1, 32767 ], " "height = (int) [ 1, 32767 ]; ") static GstStaticPadTemplate gst_rtp_vraw_pay_src_template = GST_STATIC_PAD_TEMPLATE ("src", "clock-rate = (int) 90000, " "encoding-name = (string) \"RAW\"," "sampling = (string) { \"RGB\", \"RGBA\", \"BGR\", \"BGRA\", " "\"YCbCr-4:4:4\", \"YCbCr-4:2:2\", \"YCbCr-4:2:0\", " "\"YCbCr-4:1:1\" }," /* we cannot express these as strings * "width = (string) [1 32767]," * "height = (string) [1 32767]," */ "depth = (string) { \"8\", \"10\", \"12\", \"16\" }," "colorimetry = (string) { \"BT601-5\", \"BT709-2\", \"SMPTE240M\" }" /* optional * interlace = * top-field-first = * chroma-position = (string) * gamma = (float) ) static void gst_rtp_vraw_pay_class_init (GstRtpVRawPayClass * klass); static void gst_rtp_vraw_pay_base_init (GstRtpVRawPayClass * klass); static void gst_rtp_vraw_pay_init (GstRtpVRawPay * rtpvrawpay); static void gst_rtp_vraw_pay_finalize (GObject * object); static gboolean gst_rtp_vraw_pay_setcaps (GstBaseRTPPayload * payload, static GstFlowReturn gst_rtp_vraw_pay_handle_buffer (GstBaseRTPPayload * payload, GstBuffer * buffer); static GstBaseRTPPayloadClass *parent_class = NULL; static GType gst_rtp_vraw_pay_get_type (void) static GType rtpvrawpay_type = 0; if (!rtpvrawpay_type) { static const GTypeInfo rtpvrawpay_info = { sizeof (GstRtpVRawPayClass), (GBaseInitFunc) gst_rtp_vraw_pay_base_init, NULL, (GClassInitFunc) gst_rtp_vraw_pay_class_init, sizeof (GstRtpVRawPay), 0, (GInstanceInitFunc) gst_rtp_vraw_pay_init, }; rtpvrawpay_type = g_type_register_static (GST_TYPE_BASE_RTP_PAYLOAD, "GstRtpVRawPay", &rtpvrawpay_info, 0); return rtpvrawpay_type; gst_rtp_vraw_pay_base_init (GstRtpVRawPayClass * klass) gst_static_pad_template_get (&gst_rtp_vraw_pay_src_template)); gst_static_pad_template_get (&gst_rtp_vraw_pay_sink_template)); gst_element_class_set_details (element_class, &gst_rtp_vrawpay_details); gst_rtp_vraw_pay_class_init (GstRtpVRawPayClass * klass) GstBaseRTPPayloadClass *gstbasertppayload_class; gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; gobject_class->finalize = gst_rtp_vraw_pay_finalize; gstbasertppayload_class->set_caps = gst_rtp_vraw_pay_setcaps; gstbasertppayload_class->handle_buffer = gst_rtp_vraw_pay_handle_buffer; GST_DEBUG_CATEGORY_INIT (rtpvrawpay_debug, "rtpvrawpay", 0, "Raw video RTP Payloader"); gst_rtp_vraw_pay_init (GstRtpVRawPay * rtpvrawpay) gst_rtp_vraw_pay_finalize (GObject * object) GstRtpVRawPay *rtpvrawpay; rtpvrawpay = GST_RTP_VRAW_PAY (object); G_OBJECT_CLASS (parent_class)->finalize (object); gst_rtp_vraw_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps) GstStructure *s; gboolean res; const gchar *name; gint yp, up, vp; gint pgroup, ystride, uvstride = 0, xinc, yinc; GstVideoFormat sampling; const gchar *depthstr, *samplingstr, *colorimetrystr; gchar *wstr, *hstr; rtpvrawpay = GST_RTP_VRAW_PAY (payload); s = gst_caps_get_structure (caps, 0); /* start parsing the format */ name = gst_structure_get_name (s); /* these values are the only thing we can do */ depthstr = "8"; colorimetrystr = "SMPTE240M"; /* parse common width/height */ res = gst_structure_get_int (s, "width", &width); res &= gst_structure_get_int (s, "height", &height); if (!res) goto missing_dimension; yp = up = vp = 0; if (!strcmp (name, "video/x-raw-rgb")) { gint amask, rmask; gboolean has_alpha; has_alpha = gst_structure_get_int (s, "alpha_mask", &amask); if (!gst_structure_get_int (s, "red_mask", &rmask)) goto unknown_mask; if (has_alpha) { pgroup = 4; ystride = width * 4; if (rmask == 0xFF000000) { sampling = GST_VIDEO_FORMAT_RGBA; samplingstr = "RGBA"; } else { sampling = GST_VIDEO_FORMAT_BGRA; samplingstr = "BGRA"; } else { pgroup = 3; ystride = GST_ROUND_UP_4 (width * 3); sampling = GST_VIDEO_FORMAT_RGB; samplingstr = "RGB"; sampling = GST_VIDEO_FORMAT_BGR; samplingstr = "BGR"; } else if (!strcmp (name, "video/x-raw-yuv")) { guint32 fourcc; if (!gst_structure_get_fourcc (s, "format", &fourcc)) goto unknown_fourcc; GST_LOG_OBJECT (payload, "have fourcc %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (fourcc)); switch (fourcc) { case GST_MAKE_FOURCC ('A', 'Y', 'U', 'V'): sampling = GST_VIDEO_FORMAT_AYUV; samplingstr = "YCbCr-4:4:4"; pgroup = 3; ystride = width * 4; case GST_MAKE_FOURCC ('U', 'Y', 'V', 'Y'): sampling = GST_VIDEO_FORMAT_UYVY; samplingstr = "YCbCr-4:2:2"; pgroup = 4; xinc = 2; ystride = GST_ROUND_UP_2 (width) * 2; case GST_MAKE_FOURCC ('Y', '4', '1', 'B'): sampling = GST_VIDEO_FORMAT_Y41B; samplingstr = "YCbCr-4:1:1"; pgroup = 6; xinc = 4; ystride = GST_ROUND_UP_4 (width); uvstride = GST_ROUND_UP_8 (width) / 4; up = ystride * height; vp = up + uvstride * height; case GST_MAKE_FOURCC ('I', '4', '2', '0'): sampling = GST_VIDEO_FORMAT_I420; samplingstr = "YCbCr-4:2:0"; xinc = yinc = 2; uvstride = GST_ROUND_UP_8 (width) / 2; up = ystride * GST_ROUND_UP_2 (height); vp = up + uvstride * GST_ROUND_UP_2 (height) / 2; goto unknown_fourcc; rtpvrawpay->width = width; rtpvrawpay->height = height; rtpvrawpay->sampling = sampling; rtpvrawpay->pgroup = pgroup; rtpvrawpay->xinc = xinc; rtpvrawpay->yinc = yinc; rtpvrawpay->yp = yp; rtpvrawpay->up = up; rtpvrawpay->vp = vp; rtpvrawpay->ystride = ystride; rtpvrawpay->uvstride = uvstride; GST_DEBUG_OBJECT (payload, "width %d, height %d, sampling %d", width, height, sampling); GST_DEBUG_OBJECT (payload, "yp %d, up %d, vp %d", yp, up, vp); GST_DEBUG_OBJECT (payload, "pgroup %d, ystride %d, uvstride %d", pgroup, wstr = g_strdup_printf ("%d", rtpvrawpay->width); hstr = g_strdup_printf ("%d", rtpvrawpay->height); gst_basertppayload_set_options (payload, "video", TRUE, "RAW", 90000); gst_basertppayload_set_outcaps (payload, "sampling", G_TYPE_STRING, samplingstr, "depth", G_TYPE_STRING, depthstr, "width", G_TYPE_STRING, wstr, "height", G_TYPE_STRING, hstr, "colorimetry", G_TYPE_STRING, colorimetrystr, NULL); g_free (wstr); g_free (hstr); unknown_mask: GST_ERROR_OBJECT (payload, "unknown red mask specified"); GST_ERROR_OBJECT (payload, "unknown caps format"); unknown_fourcc: GST_ERROR_OBJECT (payload, "invalid or missing fourcc"); missing_dimension: GST_ERROR_OBJECT (payload, "missing width or height property"); static GstFlowReturn gst_rtp_vraw_pay_handle_buffer (GstBaseRTPPayload * payload, GstBuffer * buffer) GstFlowReturn ret = GST_FLOW_OK; guint line, offset; guint8 *data, *yp, *up, *vp; guint ystride, uvstride; guint size, pgroup; guint mtu; guint width, height; data = GST_BUFFER_DATA (buffer); size = GST_BUFFER_SIZE (buffer); GST_LOG_OBJECT (rtpvrawpay, "new frame of %u bytes", size); yp = data + rtpvrawpay->yp; up = data + rtpvrawpay->up; vp = data + rtpvrawpay->vp; ystride = rtpvrawpay->ystride; uvstride = rtpvrawpay->uvstride; mtu = GST_BASE_RTP_PAYLOAD_MTU (payload); /* amount of bytes for one pixel */ pgroup = rtpvrawpay->pgroup; width = rtpvrawpay->width; height = rtpvrawpay->height; /* start with line 0, offset 0 */ line = 0; offset = 0; /* write all lines */ while (line < height) { guint left; GstBuffer *out; guint8 *outdata, *headers; gboolean next_line; guint length, cont, pixels; /* get the max allowed payload length size, we try to fill the complete MTU */ left = gst_rtp_buffer_calc_payload_len (mtu, 0, 0); out = gst_rtp_buffer_new_allocate (left, 0, 0); GST_BUFFER_TIMESTAMP (out) = GST_BUFFER_TIMESTAMP (buffer); outdata = gst_rtp_buffer_get_payload (out); GST_LOG_OBJECT (rtpvrawpay, "created buffer of size %u for MTU %u", left, mtu); /* need 2 bytes for the extended sequence number */ *outdata++ = 0; left -= 2; /* the headers start here */ headers = outdata; /* while we can fit at least one header and one pixel */ while (left > (6 + pgroup)) { /* we need a 6 bytes header */ left -= 6; /* get how may bytes we need for the remaining pixels */ pixels = width - offset; length = (pixels * pgroup) / rtpvrawpay->xinc; if (left >= length) { /* pixels and header fit completely, we will write them and skip to the * next line. */ next_line = TRUE; /* line does not fit completely, see how many pixels fit */ pixels = (left / pgroup) * rtpvrawpay->xinc; length = (pixels * pgroup) / rtpvrawpay->xinc; next_line = FALSE; GST_LOG_OBJECT (rtpvrawpay, "filling %u bytes in %u pixels", length, pixels); left -= length; /* write length */ *outdata++ = (length >> 8) & 0xff; *outdata++ = length & 0xff; /* write line no */ *outdata++ = (line >> 8) & 0x7f; *outdata++ = line & 0xff; if (next_line) { /* go to next line we do this here to make the check below easier */ line += rtpvrawpay->yinc; /* calculate continuation marker */ cont = (left > (6 + pgroup) && line < height) ? 0x80 : 0x00; /* write offset and continuation marker */ *outdata++ = ((offset >> 8) & 0x7f) | cont; *outdata++ = offset & 0xff; /* reset offset */ offset = 0; GST_LOG_OBJECT (rtpvrawpay, "go to next line %u", line); offset += pixels; GST_LOG_OBJECT (rtpvrawpay, "next offset %u", offset); if (!cont) GST_LOG_OBJECT (rtpvrawpay, "consumed %d bytes", outdata - headers); /* second pass, read headers and write the data */ while (TRUE) { guint offs, lin; /* read length and cont */ length = (headers[0] << 8) | headers[1]; lin = ((headers[2] & 0x7f) << 8) | headers[3]; offs = ((headers[4] & 0x7f) << 8) | headers[5]; cont = headers[4] & 0x80; pixels = length / pgroup; headers += 6; GST_LOG_OBJECT (payload, "writing length %u, line %u, offset %u, cont %d", length, lin, offs, cont); switch (rtpvrawpay->sampling) { case GST_VIDEO_FORMAT_RGB: case GST_VIDEO_FORMAT_RGBA: case GST_VIDEO_FORMAT_BGR: case GST_VIDEO_FORMAT_BGRA: case GST_VIDEO_FORMAT_UYVY: offs /= rtpvrawpay->xinc; memcpy (outdata, yp + (lin * ystride) + (offs * pgroup), length); outdata += length; break; case GST_VIDEO_FORMAT_AYUV: { gint i; guint8 *datap; datap = yp + (lin * ystride) + (offs * 4); for (i = 0; i < pixels; i++) { *outdata++ = datap[2]; *outdata++ = datap[1]; *outdata++ = datap[3]; datap += 4; } case GST_VIDEO_FORMAT_I420: guint uvoff; guint8 *yd1p, *yd2p, *udp, *vdp; yd1p = yp + (lin * ystride) + (offs); yd2p = yd1p + ystride; uvoff = (lin / rtpvrawpay->yinc * uvstride) + (offs / rtpvrawpay->xinc); udp = up + uvoff; vdp = vp + uvoff; *outdata++ = *yd1p++; *outdata++ = *yd2p++; *outdata++ = *udp++; *outdata++ = *vdp++; case GST_VIDEO_FORMAT_Y41B: guint8 *ydp, *udp, *vdp; ydp = yp + (lin * ystride) + offs; *outdata++ = *ydp++; default: gst_buffer_unref (out); goto unknown_sampling; if (line >= height) { GST_LOG_OBJECT (rtpvrawpay, "frame complete, set marker"); gst_rtp_buffer_set_marker (out, TRUE); /* push buffer */ ret = gst_basertppayload_push (payload, out); gst_buffer_unref (buffer); GST_ELEMENT_ERROR (payload, STREAM, FORMAT, gst_buffer_unref (buffer); return GST_FLOW_NOT_SUPPORTED; gst_rtp_vraw_pay_plugin_init (GstPlugin * plugin) return gst_element_register (plugin, "rtpvrawpay", GST_RANK_NONE, GST_TYPE_RTP_VRAW_PAY); --- NEW FILE: gstrtpvrawpay.h --- #ifndef __GST_RTP_VRAW_PAY_H__ #define __GST_RTP_VRAW_PAY_H__ #include <gst/rtp/gstbasertppayload.h> #define GST_TYPE_RTP_VRAW_PAY \ (gst_rtp_vraw_pay_get_type()) #define GST_RTP_VRAW_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_VRAW_PAY,GstRtpVRawPay)) #define GST_RTP_VRAW_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_VRAW_PAY,GstRtpVRawPayClass)) #define GST_IS_RTP_VRAW_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_VRAW_PAY)) #define GST_IS_RTP_VRAW_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_VRAW_PAY)) typedef struct _GstRtpVRawPay GstRtpVRawPay; typedef struct _GstRtpVRawPayClass GstRtpVRawPayClass; struct _GstRtpVRawPay GstBaseRTPPayload payload; struct _GstRtpVRawPayClass GstBaseRTPPayloadClass parent_class; gboolean gst_rtp_vraw_pay_plugin_init (GstPlugin * plugin); #endif /* __GST_RTP_VRAW_PAY_H__ */ |
From: <wt...@ke...> - 2008-08-15 17:26:22
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Fri Aug 15 2008 17:26:32 UTC Log message: Patch by: Olivier Crete <tester at tester dot ca> * gst/rtp/gstrtpvorbisdepay.c: (gst_rtp_vorbis_depay_setcaps), (gst_rtp_vorbis_depay_process): * gst/rtp/gstrtpvorbispay.c: (gst_rtp_vorbis_pay_finish_headers): Update the vorbis RTP pay/depay to RFC 5215. Fixes #547842. Modified files: . : ChangeLog gst/rtp : gstrtpvorbisdepay.c gstrtpvorbispay.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.3678&r2=1.3679 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpvorbisdepay.c.diff?r1=1.14&r2=1.15 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpvorbispay.c.diff?r1=1.15&r2=1.16 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.3678 retrieving revision 1.3679 diff -u -d -r1.3678 -r1.3679 --- ChangeLog 14 Aug 2008 22:07:02 -0000 1.3678 +++ ChangeLog 15 Aug 2008 17:26:16 -0000 1.3679 @@ -1,3 +1,13 @@ +2008-08-15 Wim Taymans <wim...@co...> + + Patch by: Olivier Crete <tester at tester dot ca> + * gst/rtp/gstrtpvorbisdepay.c: (gst_rtp_vorbis_depay_setcaps), + (gst_rtp_vorbis_depay_process): + * gst/rtp/gstrtpvorbispay.c: (gst_rtp_vorbis_pay_finish_headers): + Update the vorbis RTP pay/depay to RFC 5215. + Fixes #547842. 2008-08-14 David Schleef <ds...@sc...> * gst/qtdemux/qtdemux.c: Add 'hdv6' as a HDV format for 1080i/60 Index: gstrtpvorbisdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpvorbisdepay.c,v retrieving revision 1.14 retrieving revision 1.15 diff -u -d -r1.14 -r1.15 --- gstrtpvorbisdepay.c 13 Jun 2008 09:39:40 -0000 1.14 +++ gstrtpvorbisdepay.c 15 Aug 2008 17:26:17 -0000 1.15 @@ -31,14 +31,14 @@ #define GST_CAT_DEFAULT (rtpvorbisdepay_debug) /* references: - * http://svn.xiph.org/trunk/vorbis/doc/draft-ietf-avt-rtp-vorbis-04.txt + * http://www.rfc-editor.org/rfc/rfc5215.txt */ /* elementfactory information */ static const GstElementDetails gst_rtp_vorbis_depay_details = GST_ELEMENT_DETAILS ("RTP packet depayloader", "Codec/Depayloader/Network", - "Extracts Vorbis Audio from RTP packets (draft-04 of RFC XXXX)", + "Extracts Vorbis Audio from RTP packets (RFC 5215)", "Wim Taymans <wi...@fl...>"); static GstStaticPadTemplate gst_rtp_vorbis_depay_sink_template = @@ -54,11 +54,6 @@ * "encoding-params = (string) <num channels>" * "configuration = (string) ANY" */ - /* All optional parameters - * - * "delivery-method = (string) { inline, in_band, out_band/<specific_name> } " - * "configuration-uri =" - */ ) ); @@ -330,7 +325,6 @@ GstStructure *structure; GstRtpVorbisDepay *rtpvorbisdepay; GstCaps *srccaps; - const gchar *delivery_method; const gchar *configuration; gint clock_rate; @@ -342,29 +336,15 @@ if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) goto no_rate; - /* see how the configuration parameters will be transmitted */ - delivery_method = gst_structure_get_string (structure, "delivery-method"); - - if (delivery_method) { - if (!g_ascii_strcasecmp (delivery_method, "inline")) { - /* configure string is in the caps */ - } else if (!g_ascii_strcasecmp (delivery_method, "in_band")) { - /* headers will (also) be transmitted in the RTP packets */ - goto unsupported_delivery_method; - } else if (g_str_has_prefix (delivery_method, "out_band/")) { - /* some other method of header delivery. */ - } else - } /* read and parse configuration string */ configuration = gst_structure_get_string (structure, "configuration"); - if (configuration == NULL) - goto no_configuration; - if (!gst_rtp_vorbis_depay_parse_configuration (rtpvorbisdepay, configuration)) - goto invalid_configuration; + if (configuration) { + if (!gst_rtp_vorbis_depay_parse_configuration (rtpvorbisdepay, + configuration)) + goto invalid_configuration; + } else { + GST_WARNING_OBJECT (rtpvorbisdepay, "no configuration specified"); + } /* caps seem good, configure element */ depayload->clock_rate = clock_rate; @@ -377,17 +357,6 @@ return TRUE; /* ERRORS */ -unsupported_delivery_method: - { - GST_ERROR_OBJECT (rtpvorbisdepay, - "unsupported delivery-method \"%s\" specified", delivery_method); - return FALSE; -no_configuration: - GST_ERROR_OBJECT (rtpvorbisdepay, "no configuration specified"); invalid_configuration: { GST_ERROR_OBJECT (rtpvorbisdepay, "invalid configuration specified"); @@ -632,7 +601,7 @@ } switch_failed: - GST_ELEMENT_ERROR (rtpvorbisdepay, STREAM, DECODE, + GST_ELEMENT_WARNING (rtpvorbisdepay, STREAM, DECODE, (NULL), ("Could not switch codebooks")); return NULL; Index: gstrtpvorbispay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpvorbispay.c,v retrieving revision 1.16 diff -u -d -r1.15 -r1.16 --- gstrtpvorbispay.c 13 Jun 2008 09:39:41 -0000 1.15 +++ gstrtpvorbispay.c 15 Aug 2008 17:26:18 -0000 1.16 @@ -32,14 +32,14 @@ #define GST_CAT_DEFAULT (rtpvorbispay_debug) static const GstElementDetails gst_rtp_vorbispay_details = "Codec/Payloader/Network", - "Payload-encode Vorbis audio into RTP packets (draft-01 RFC XXXX)", + "Payload-encode Vorbis audio into RTP packets (RFC 5215)", static GstStaticPadTemplate gst_rtp_vorbis_pay_src_template = @@ -55,11 +55,6 @@ * "configuration = (string) ANY" - * "delivery-method = (string) { inline, in_band, out_band/<specific_name> } " - * "configuration-uri =" @@ -410,11 +405,7 @@ gst_basertppayload_set_options (basepayload, "audio", TRUE, "VORBIS", rtpvorbispay->rate); gst_basertppayload_set_outcaps (basepayload, "encoding-params", G_TYPE_STRING, - cstr, "configuration", G_TYPE_STRING, configuration, - "delivery-method", G_TYPE_STRING, "inline", - /* don't set the other defaults - */ - NULL); + cstr, "configuration", G_TYPE_STRING, configuration, NULL); g_free (cstr); g_free (configuration); |
From: <wt...@ke...> - 2008-09-15 16:04:34
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Mon Sep 15 2008 16:04:40 UTC Log message: * gst/rtp/gstrtpmp4gdepay.c: (gst_bs_parse_init), (gst_bs_parse_read), (gst_rtp_mp4g_depay_process): Change some of the ranges in the caps, mostly for the amount of bits we can use. Added a little bitstream parse and use it to parse the AU header fields. Check for malformed and wrongly sized packets better. Implement more header field parsing. Handle the size of fragmented packets correctly. Modified files: . : ChangeLog gst/rtp : gstrtpmp4gdepay.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.3733&r2=1.3734 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gdepay.c.diff?r1=1.16&r2=1.17 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.3733 retrieving revision 1.3734 diff -u -d -r1.3733 -r1.3734 --- ChangeLog 14 Sep 2008 11:32:14 -0000 1.3733 +++ ChangeLog 15 Sep 2008 16:04:24 -0000 1.3734 @@ -1,3 +1,14 @@ +2008-09-15 Wim Taymans <wim...@co...> + + * gst/rtp/gstrtpmp4gdepay.c: (gst_bs_parse_init), + (gst_bs_parse_read), (gst_rtp_mp4g_depay_process): + Change some of the ranges in the caps, mostly for the amount of bits we + can use. + Added a little bitstream parse and use it to parse the AU header fields. + Check for malformed and wrongly sized packets better. + Implement more header field parsing. + Handle the size of fragmented packets correctly. 2008-09-14 Edward Hervey <edw...@co...> Patch by: Jonathan Matthew <not...@gm...> Index: gstrtpmp4gdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gdepay.c,v retrieving revision 1.16 retrieving revision 1.17 diff -u -d -r1.16 -r1.17 --- gstrtpmp4gdepay.c 12 Feb 2008 23:38:18 -0000 1.16 +++ gstrtpmp4gdepay.c 15 Sep 2008 16:04:26 -0000 1.17 @@ -67,16 +67,71 @@ /* "maxdisplacement = (string) [1,MAX], " */ /* "de-interleavebuffersize = (string) [1,MAX], " */ /* Optional configuration parameters */ - /* "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], " */ + /* "sizelength = (string) [1, 32], " */ + /* "indexlength = (string) [1, 32], " */ + /* "indexdeltalength = (string) [1, 32], " */ + /* "ctsdeltalength = (string) [1, 32], " */ + /* "dtsdeltalength = (string) [1, 32], " */ /* "randomaccessindication = (string) {0, 1}, " */ - /* "streamstateindication = (string) [0, 64], " */ - /* "auxiliarydatasizelength = (string) [0, 64]" */ ) + /* "streamstateindication = (string) [0, 32], " */ + /* "auxiliarydatasizelength = (string) [0, 32]" */ ) ); +/* simple bitstream parser */ +typedef struct +{ + const guint8 *data; + const guint8 *end; + gint head; /* bitpos in the cache of next bit */ + guint64 cache; /* cached bytes */ +} GstBsParse; +static void +gst_bs_parse_init (GstBsParse * bs, const guint8 * data, guint size) + bs->data = data; + bs->end = data + size; + bs->head = 0; + bs->cache = 0xffffffff; +} +static guint32 +gst_bs_parse_read (GstBsParse * bs, guint n) + guint32 res = 0; + gint shift; + if (n == 0) + return res; + /* fill up the cache if we need to */ + while (bs->head < n) { + if (bs->data >= bs->end) { + /* we're at the end, can't produce more than head number of bits */ + n = bs->head; + break; + } + /* shift bytes in cache, moving the head bits of the cache left */ + bs->cache = (bs->cache << 8) | *bs->data++; + bs->head += 8; + } + /* bring the required bits down and truncate */ + if ((shift = bs->head - n) > 0) + res = bs->cache >> shift; + else + res = bs->cache; + /* mask out required bits */ + if (n < 32) + res &= (1 << n) - 1; + bs->head = shift; + return res; GST_BOILERPLATE (GstRtpMP4GDepay, gst_rtp_mp4g_depay, GstBaseRTPDepayload, GST_TYPE_BASE_RTP_DEPAYLOAD); @@ -261,22 +316,25 @@ } { - gint payload_len, payload_header; + gint payload_len, payload_AU; guint8 *payload; guint32 timestamp; guint AU_headers_len; - guint AU_size, AU_index; + guint AU_size, AU_index, payload_AU_size; gboolean M; payload_len = gst_rtp_buffer_get_payload_len (buf); payload = gst_rtp_buffer_get_payload (buf); - payload_header = 0; timestamp = gst_rtp_buffer_get_timestamp (buf); M = gst_rtp_buffer_get_marker (buf); if (rtpmp4gdepay->sizelength > 0) { gint num_AU_headers, AU_headers_bytes, i; + GstBsParse bs; + if (payload_len < 2) + goto short_payload; /* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- .. -+-+-+-+-+-+-+-+-+-+ * |AU-headers-length|AU-header|AU-header| |AU-header|padding| @@ -295,22 +353,67 @@ /* skip header */ payload += 2; - /* skip special headers */ - payload_header = 2 + AU_headers_bytes; + payload_len -= 2; - for (i = 0; i < num_AU_headers; i++) { - /* FIXME, use bits */ - AU_size = ((payload[0] << 8) | payload[1]) >> 3; - AU_index = payload[1] & 0x7; - payload += 2; + if (payload_len < AU_headers_bytes) - GST_DEBUG_OBJECT (rtpmp4gdepay, "len, %d, size %d, index %d", - AU_headers_len, AU_size, AU_index); + /* skip special headers, point to first payload AU */ + payload_AU = 2 + AU_headers_bytes; + payload_AU_size = payload_len - AU_headers_bytes; + /* point the bitstream parser to the first AU header bit */ + gst_bs_parse_init (&bs, payload, payload_len); + for (i = 0; i < num_AU_headers && payload_AU_size > 0; i++) { + /* parse AU header + * +---------------------------------------+ + * | AU-size | + * | AU-Index / AU-Index-delta | + * | CTS-flag | + * | CTS-delta | + * | DTS-flag | + * | DTS-delta | + * | RAP-flag | + * | Stream-state | + */ + AU_size = gst_bs_parse_read (&bs, rtpmp4gdepay->sizelength); + if (i == 0) + AU_index = gst_bs_parse_read (&bs, rtpmp4gdepay->indexlength); + else + AU_index = gst_bs_parse_read (&bs, rtpmp4gdepay->indexdeltalength); + if (rtpmp4gdepay->ctsdeltalength > 0) { + if (gst_bs_parse_read (&bs, 1)) + gst_bs_parse_read (&bs, rtpmp4gdepay->ctsdeltalength); + } + if (rtpmp4gdepay->dtsdeltalength > 0) { + gst_bs_parse_read (&bs, rtpmp4gdepay->dtsdeltalength); + if (rtpmp4gdepay->randomaccessindication) + gst_bs_parse_read (&bs, 1); + if (rtpmp4gdepay->streamstateindication > 0) + gst_bs_parse_read (&bs, rtpmp4gdepay->streamstateindication); + GST_DEBUG_OBJECT (rtpmp4gdepay, "size %d, index %d", AU_size, AU_index); + /* fragmented pakets have the AU_size set to the size of the + * unfragmented AU. */ + if (AU_size > payload_AU_size) + AU_size = payload_AU_size; /* collect stuff in the adapter, strip header from payload and push in * the adapter */ outbuf = - gst_rtp_buffer_get_payload_subbuffer (buf, payload_header, AU_size); + gst_rtp_buffer_get_payload_subbuffer (buf, payload_AU, AU_size); gst_adapter_push (rtpmp4gdepay->adapter, outbuf); if (M) { @@ -331,7 +434,8 @@ else gst_base_rtp_depayload_push (depayload, outbuf); } - payload_header += AU_size; + payload_AU += AU_size; + payload_AU_size -= AU_size; } } else { /* push complete buffer in adapter */ @@ -363,6 +467,12 @@ ("Packet did not validate."), (NULL)); return NULL; +short_payload: + { + GST_ELEMENT_WARNING (rtpmp4gdepay, STREAM, DECODE, + ("Packet payload was too short."), (NULL)); + return NULL; } static GstStateChangeReturn |
From: <wt...@ke...> - 2008-09-15 21:10:26
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Mon Sep 15 2008 21:10:37 UTC Log message: * gst/rtp/gstrtpmp4gdepay.c: (gst_rtp_mp4g_depay_init), (gst_rtp_mp4g_depay_finalize), (gst_rtp_mp4g_depay_setcaps), (gst_rtp_mp4g_depay_clear_queue), (gst_rtp_mp4g_depay_flush_queue), (gst_rtp_mp4g_depay_queue), (gst_rtp_mp4g_depay_process), (gst_rtp_mp4g_depay_change_state): * gst/rtp/gstrtpmp4gdepay.h: Handle interleaved streams by reordering AU in a queue. Modified files: . : ChangeLog gst/rtp : gstrtpmp4gdepay.c gstrtpmp4gdepay.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.3734&r2=1.3735 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gdepay.c.diff?r1=1.17&r2=1.18 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gdepay.h.diff?r1=1.1&r2=1.2 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.3734 retrieving revision 1.3735 diff -u -d -r1.3734 -r1.3735 --- ChangeLog 15 Sep 2008 16:04:24 -0000 1.3734 +++ ChangeLog 15 Sep 2008 21:10:22 -0000 1.3735 @@ -1,5 +1,15 @@ 2008-09-15 Wim Taymans <wim...@co...> + * gst/rtp/gstrtpmp4gdepay.c: (gst_rtp_mp4g_depay_init), + (gst_rtp_mp4g_depay_finalize), (gst_rtp_mp4g_depay_setcaps), + (gst_rtp_mp4g_depay_clear_queue), (gst_rtp_mp4g_depay_flush_queue), + (gst_rtp_mp4g_depay_queue), (gst_rtp_mp4g_depay_process), + (gst_rtp_mp4g_depay_change_state): + * gst/rtp/gstrtpmp4gdepay.h: + Handle interleaved streams by reordering AU in a queue. + +2008-09-15 Wim Taymans <wim...@co...> * gst/rtp/gstrtpmp4gdepay.c: (gst_bs_parse_init), (gst_bs_parse_read), (gst_rtp_mp4g_depay_process): Change some of the ranges in the caps, mostly for the amount of bits we Index: gstrtpmp4gdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gdepay.c,v retrieving revision 1.17 retrieving revision 1.18 diff -u -d -r1.17 -r1.18 --- gstrtpmp4gdepay.c 15 Sep 2008 16:04:26 -0000 1.17 +++ gstrtpmp4gdepay.c 15 Sep 2008 21:10:23 -0000 1.18 @@ -188,6 +188,7 @@ GstRtpMP4GDepayClass * klass) { rtpmp4gdepay->adapter = gst_adapter_new (); + rtpmp4gdepay->packets = g_queue_new (); } static void @@ -199,6 +200,8 @@ g_object_unref (rtpmp4gdepay->adapter); rtpmp4gdepay->adapter = NULL; + g_queue_free (rtpmp4gdepay->packets); + rtpmp4gdepay->packets = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); @@ -241,10 +244,14 @@ if (strcmp (str, "audio") == 0) { srccaps = gst_caps_new_simple ("audio/mpeg", "mpegversion", G_TYPE_INT, 4, NULL); + /* AAC always has a default constant duration of 1024 but it can be + * overriden below. */ + rtpmp4gdepay->constantDuration = 1024; } else if (strcmp (str, "video") == 0) { srccaps = gst_caps_new_simple ("video/mpeg", "mpegversion", G_TYPE_INT, 4, "systemstream", G_TYPE_BOOLEAN, FALSE, NULL); + rtpmp4gdepay->constantDuration = 0; } } if (srccaps == NULL) @@ -268,6 +275,12 @@ gst_rtp_mp4g_depay_parse_int (structure, "streamstateindication", 0); rtpmp4gdepay->auxiliarydatasizelength = gst_rtp_mp4g_depay_parse_int (structure, "auxiliarydatasizelength", 0); + rtpmp4gdepay->constantSize = + gst_rtp_mp4g_depay_parse_int (structure, "constantsize", 0); + rtpmp4gdepay->constantDuration = + gst_rtp_mp4g_depay_parse_int (structure, "constantduration", + rtpmp4gdepay->constantDuration); /* get config string */ if ((str = gst_structure_get_string (structure, "config"))) { @@ -299,11 +312,115 @@ +static void +gst_rtp_mp4g_depay_clear_queue (GstRtpMP4GDepay * rtpmp4gdepay) +{ + GstBuffer *outbuf; + while ((outbuf = g_queue_pop_head (rtpmp4gdepay->packets))) + gst_buffer_unref (outbuf); +} +gst_rtp_mp4g_depay_flush_queue (GstRtpMP4GDepay * rtpmp4gdepay) + gboolean discont = FALSE; + guint AU_index; + while ((outbuf = g_queue_pop_head (rtpmp4gdepay->packets))) { + AU_index = GST_BUFFER_OFFSET (outbuf); + GST_DEBUG_OBJECT (rtpmp4gdepay, "next available AU_index %u", AU_index); + if (rtpmp4gdepay->next_AU_index != AU_index) { + GST_DEBUG_OBJECT (rtpmp4gdepay, "discont, expected AU_index %u", + rtpmp4gdepay->next_AU_index); + discont = TRUE; + } + if (discont) { + GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); + discont = FALSE; + GST_DEBUG_OBJECT (rtpmp4gdepay, "pushing AU_index %u", AU_index); + gst_base_rtp_depayload_push (GST_BASE_RTP_DEPAYLOAD (rtpmp4gdepay), outbuf); + rtpmp4gdepay->next_AU_index = AU_index + 1; + } +gst_rtp_mp4g_depay_queue (GstRtpMP4GDepay * rtpmp4gdepay, GstBuffer * outbuf) + guint AU_index = GST_BUFFER_OFFSET (outbuf); + if (rtpmp4gdepay->next_AU_index == -1) { + GST_DEBUG_OBJECT (rtpmp4gdepay, "Init AU counter %u", AU_index); + rtpmp4gdepay->next_AU_index = AU_index; + if (rtpmp4gdepay->next_AU_index == AU_index) { + GST_DEBUG_OBJECT (rtpmp4gdepay, "pushing expected AU_index %u", AU_index); + /* we received the expected packet, push it and flush as much as we can from + * the queue */ + rtpmp4gdepay->next_AU_index++; + while ((outbuf = g_queue_peek_head (rtpmp4gdepay->packets))) { + AU_index = GST_BUFFER_OFFSET (outbuf); + GST_DEBUG_OBJECT (rtpmp4gdepay, "next available AU_index %u", AU_index); + if (rtpmp4gdepay->next_AU_index == AU_index) { + GST_DEBUG_OBJECT (rtpmp4gdepay, "pushing expected AU_index %u", + AU_index); + outbuf = g_queue_pop_head (rtpmp4gdepay->packets); + gst_base_rtp_depayload_push (GST_BASE_RTP_DEPAYLOAD (rtpmp4gdepay), + outbuf); + rtpmp4gdepay->next_AU_index++; + } else { + GST_DEBUG_OBJECT (rtpmp4gdepay, "waiting for next AU_index %u", + rtpmp4gdepay->next_AU_index); + break; + } + } else { + GList *list; + GST_DEBUG_OBJECT (rtpmp4gdepay, "queueing AU_index %u", AU_index); + /* loop the list to skip strictly smaller AU_index buffers */ + for (list = rtpmp4gdepay->packets->head; list; list = g_list_next (list)) { + guint idx; + gint gap; + idx = GST_BUFFER_OFFSET (GST_BUFFER_CAST (list->data)); + /* compare the new seqnum to the one in the buffer */ + gap = (gint) (idx - AU_index); + GST_DEBUG_OBJECT (rtpmp4gdepay, "compare with AU_index %u, gap %d", idx, + gap); + /* AU_index <= idx, we can stop looking */ + if (G_LIKELY (gap > 0)) + if (G_LIKELY (list)) + g_queue_insert_before (rtpmp4gdepay->packets, list, outbuf); + else + g_queue_push_tail (rtpmp4gdepay->packets, outbuf); static GstBuffer * gst_rtp_mp4g_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) GstRtpMP4GDepay *rtpmp4gdepay; GstBuffer *outbuf; + GstClockTime timestamp; rtpmp4gdepay = GST_RTP_MP4G_DEPAY (depayload); @@ -312,21 +429,24 @@ /* flush remaining data on discont */ if (GST_BUFFER_IS_DISCONT (buf)) { + GST_DEBUG_OBJECT (rtpmp4gdepay, "received DISCONT"); gst_adapter_clear (rtpmp4gdepay->adapter); + timestamp = GST_BUFFER_TIMESTAMP (buf); { gint payload_len, payload_AU; guint8 *payload; - guint32 timestamp; + guint32 rtptime; guint AU_headers_len; - guint AU_size, AU_index, payload_AU_size; + guint AU_size, AU_index, AU_index_delta, payload_AU_size; gboolean M; payload_len = gst_rtp_buffer_get_payload_len (buf); payload = gst_rtp_buffer_get_payload (buf); - timestamp = gst_rtp_buffer_get_timestamp (buf); + rtptime = gst_rtp_buffer_get_timestamp (buf); M = gst_rtp_buffer_get_marker (buf); if (rtpmp4gdepay->sizelength > 0) { @@ -364,6 +484,7 @@ /* point the bitstream parser to the first AU header bit */ gst_bs_parse_init (&bs, payload, payload_len); + AU_index = AU_index_delta = 0; for (i = 0; i < num_AU_headers && payload_AU_size > 0; i++) { /* parse AU header @@ -386,24 +507,76 @@ * +---------------------------------------+ */ AU_size = gst_bs_parse_read (&bs, rtpmp4gdepay->sizelength); - if (i == 0) + /* calculate the AU_index, which is only on the first AU of the packet + * and the AU_index_delta on the other AUs. This will be used to + * reconstruct the AU ordering when interleaving. */ + if (i == 0) { AU_index = gst_bs_parse_read (&bs, rtpmp4gdepay->indexlength); - else - AU_index = gst_bs_parse_read (&bs, rtpmp4gdepay->indexdeltalength); + if (AU_index == 0 && rtpmp4gdepay->prev_AU_index == 0) { + gint diff; + /* if we see two consecutive packets with AU_index of 0, we can + * assume we have constantDuration packets. Since we don't have + * the index we must use the AU duration to calculate the + * index. Get the diff between the timestamps first, this can be + * positive or negative. */ + if (rtpmp4gdepay->prev_rtptime <= rtptime) + diff = rtptime - rtpmp4gdepay->prev_rtptime; + else + diff = -(rtpmp4gdepay->prev_rtptime - rtptime); + /* get the number of packets by dividing with the duration */ + diff /= rtpmp4gdepay->constantDuration; + rtpmp4gdepay->last_AU_index += diff; + rtpmp4gdepay->prev_AU_index = AU_index; + AU_index = rtpmp4gdepay->last_AU_index; + } else { + rtpmp4gdepay->last_AU_index = AU_index; + } + /* keep track of the higest AU_index */ + if (rtpmp4gdepay->max_AU_index != -1 + && rtpmp4gdepay->max_AU_index <= AU_index) { + GST_DEBUG_OBJECT (rtpmp4gdepay, "new interleave group, flushing"); + /* a new interleave group started, flush */ + gst_rtp_mp4g_depay_flush_queue (rtpmp4gdepay); + rtpmp4gdepay->prev_rtptime = rtptime; + } else { + AU_index_delta = + gst_bs_parse_read (&bs, rtpmp4gdepay->indexdeltalength); + AU_index += AU_index_delta + 1; + } + /* keep track of highest AU_index */ + if (rtpmp4gdepay->max_AU_index == -1 + || AU_index > rtpmp4gdepay->max_AU_index) + rtpmp4gdepay->max_AU_index = AU_index; + /* the presentation time offset, a 2s-complement value, we need this to + * calculate the timestamp on the output packet. */ if (rtpmp4gdepay->ctsdeltalength > 0) { if (gst_bs_parse_read (&bs, 1)) gst_bs_parse_read (&bs, rtpmp4gdepay->ctsdeltalength); } + /* the decoding time offset, a 2s-complement value */ if (rtpmp4gdepay->dtsdeltalength > 0) { gst_bs_parse_read (&bs, rtpmp4gdepay->dtsdeltalength); + /* RAP-flag to indicate that the AU contains a keyframe */ if (rtpmp4gdepay->randomaccessindication) gst_bs_parse_read (&bs, 1); + /* stream-state */ if (rtpmp4gdepay->streamstateindication > 0) gst_bs_parse_read (&bs, rtpmp4gdepay->streamstateindication); - GST_DEBUG_OBJECT (rtpmp4gdepay, "size %d, index %d", AU_size, AU_index); + GST_DEBUG_OBJECT (rtpmp4gdepay, "size %d, index %d, delta %d", AU_size, + AU_index, AU_index_delta); /* fragmented pakets have the AU_size set to the size of the * unfragmented AU. */ @@ -425,14 +598,20 @@ outbuf = gst_adapter_take_buffer (rtpmp4gdepay->adapter, avail); gst_buffer_set_caps (outbuf, GST_PAD_CAPS (depayload->srcpad)); - GST_DEBUG ("gst_rtp_mp4g_depay_chain: pushing buffer of size %d", + /* copy some of the fields we calculated above on the buffer. We also + * copy the AU_index so that we can sort the packets in our queue. */ + GST_BUFFER_TIMESTAMP (outbuf) = timestamp; + GST_BUFFER_OFFSET (outbuf) = AU_index; + /* make sure we don't use the timestamp again for other AUs in this + * RTP packet. */ + timestamp = -1; + GST_DEBUG_OBJECT (depayload, "pushing buffer of size %d", GST_BUFFER_SIZE (outbuf)); - /* only apply the timestamp for the first buffer */ - if (i == 0) - gst_base_rtp_depayload_push_ts (depayload, timestamp, outbuf); - else - gst_base_rtp_depayload_push (depayload, outbuf); + gst_rtp_mp4g_depay_queue (rtpmp4gdepay, outbuf); payload_AU += AU_size; payload_AU_size -= AU_size; @@ -487,6 +666,11 @@ switch (transition) { case GST_STATE_CHANGE_READY_TO_PAUSED: gst_adapter_clear (rtpmp4gdepay->adapter); + rtpmp4gdepay->max_AU_index = -1; + rtpmp4gdepay->next_AU_index = -1; + rtpmp4gdepay->prev_AU_index = -1; + rtpmp4gdepay->prev_rtptime = -1; + rtpmp4gdepay->last_AU_index = -1; break; default: @@ -495,6 +679,10 @@ ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + case GST_STATE_CHANGE_PAUSED_TO_READY: + gst_adapter_clear (rtpmp4gdepay->adapter); + gst_rtp_mp4g_depay_clear_queue (rtpmp4gdepay); + break; Index: gstrtpmp4gdepay.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gdepay.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- gstrtpmp4gdepay.h 16 Jul 2006 14:31:48 -0000 1.1 +++ gstrtpmp4gdepay.h 15 Sep 2008 21:10:23 -0000 1.2 @@ -46,6 +46,10 @@ gint profile_level_id; gint streamtype; + gint constantSize; + gint constantDuration; gint sizelength; gint indexlength; gint indexdeltalength; @@ -54,6 +58,14 @@ gint randomaccessindication; gint streamstateindication; gint auxiliarydatasizelength; + guint max_AU_index; + guint prev_AU_index; + guint last_AU_index; + guint next_AU_index; + guint32 prev_rtptime; + GQueue *packets; GstAdapter *adapter; }; |
From: <wt...@ke...> - 2008-09-26 14:45:19
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Fri Sep 26 2008 14:45:03 UTC Log message: * gst/rtp/gstrtpamrdepay.c: (gst_rtp_amr_depay_class_init), (gst_rtp_amr_depay_process): Mark DISCONT on output buffers when the marker bit signals a new talk spurt. * gst/rtp/gstrtpamrpay.c: (gst_rtp_amr_pay_handle_buffer): Set the marker bit for buffers with a DISCONT flag to signal a talk spurt. Modified files: . : ChangeLog gst/rtp : gstrtpamrdepay.c gstrtpamrpay.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.3744&r2=1.3745 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpamrdepay.c.diff?r1=1.29&r2=1.30 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpamrpay.c.diff?r1=1.23&r2=1.24 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.3744 retrieving revision 1.3745 diff -u -d -r1.3744 -r1.3745 --- ChangeLog 26 Sep 2008 13:55:46 -0000 1.3744 +++ ChangeLog 26 Sep 2008 14:44:47 -0000 1.3745 @@ -1,5 +1,16 @@ 2008-09-26 Wim Taymans <wim...@co...> + * gst/rtp/gstrtpamrdepay.c: (gst_rtp_amr_depay_class_init), + (gst_rtp_amr_depay_process): + Mark DISCONT on output buffers when the marker bit signals a new talk + spurt. + + * gst/rtp/gstrtpamrpay.c: (gst_rtp_amr_pay_handle_buffer): + Set the marker bit for buffers with a DISCONT flag to signal a talk +2008-09-26 Wim Taymans <wim...@co...> * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: (plugin_init): * gst/rtp/gstrtpmp4apay.c: (gst_rtp_mp4a_pay_get_type), Index: gstrtpamrdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpamrdepay.c,v retrieving revision 1.29 retrieving revision 1.30 diff -u -d -r1.29 -r1.30 --- gstrtpamrdepay.c 21 Sep 2007 11:34:34 -0000 1.29 +++ gstrtpamrdepay.c 26 Sep 2008 14:44:49 -0000 1.30 @@ -27,6 +27,9 @@ #include <string.h> #include "gstrtpamrdepay.h" +GST_DEBUG_CATEGORY_STATIC (rtpamrdepay_debug); +#define GST_CAT_DEFAULT (rtpamrdepay_debug) /* references: * * RFC 3267 - Real-Time Transport Protocol (RTP) Payload Format and File @@ -146,6 +149,9 @@ gstbasertpdepayload_class->process = gst_rtp_amr_depay_process; gstbasertpdepayload_class->set_caps = gst_rtp_amr_depay_setcaps; + GST_DEBUG_CATEGORY_INIT (rtpamrdepay_debug, "rtpamrdepay", 0, + "AMR/AMR-WB RTP Depayloader"); } static void @@ -304,7 +310,9 @@ gint i, num_packets, num_nonempty_packets; gint amr_len; gint ILL, ILP; + gboolean marker; + marker = gst_rtp_buffer_get_marker (buf); payload_len = gst_rtp_buffer_get_payload_len (buf); /* need at least 2 bytes for the header */ @@ -412,10 +420,17 @@ /* we can set the duration because each packet is 20 milliseconds */ GST_BUFFER_DURATION (outbuf) = num_packets * 20 * GST_MSECOND; + if (marker) { + /* marker bit marks a discont buffer */ + GST_DEBUG_OBJECT (depayload, "marker bit was set"); + GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); + marker = FALSE; + } gst_buffer_set_caps (outbuf, GST_PAD_CAPS (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload))); - GST_DEBUG ("gst_rtp_amr_depay_chain: pushing buffer of size %d", + GST_DEBUG_OBJECT (depayload, "pushing buffer of size %d", GST_BUFFER_SIZE (outbuf)); } return outbuf; Index: gstrtpamrpay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpamrpay.c,v retrieving revision 1.23 retrieving revision 1.24 diff -u -d -r1.23 -r1.24 --- gstrtpamrpay.c 9 Jan 2008 11:10:59 -0000 1.23 +++ gstrtpamrpay.c 26 Sep 2008 14:44:49 -0000 1.24 @@ -211,6 +211,7 @@ gint i, num_packets, num_nonempty_packets; gint amr_len; gint *frame_size; + gboolean discont; rtpamrpay = GST_RTP_AMR_PAY (basepayload); mtu = GST_BASE_RTP_PAYLOAD_MTU (rtpamrpay); @@ -219,6 +220,7 @@ data = GST_BUFFER_DATA (buffer); timestamp = GST_BUFFER_TIMESTAMP (buffer); duration = GST_BUFFER_DURATION (buffer); + discont = GST_BUFFER_IS_DISCONT (buffer); /* setup frame size pointer */ if (rtpamrpay->mode == GST_RTP_AMR_P_MODE_NB) @@ -267,23 +269,23 @@ /* now alloc output buffer */ outbuf = gst_rtp_buffer_new_allocate (payload_len, 0, 0); - /* copy timestamp, or fabricate one */ - if (timestamp != GST_CLOCK_TIME_NONE) - GST_BUFFER_TIMESTAMP (outbuf) = timestamp; - else { - /* AMR (nb) and AMR-WB both have 20 ms per frame */ - /* FIXME: when we do more than one AMR frame per packet, fix this */ - gint count = basepayload->seqnum - basepayload->seqnum_base; - - GST_BUFFER_TIMESTAMP (outbuf) = count * 20 * GST_MSECOND; - } + /* copy timestamp */ + GST_BUFFER_TIMESTAMP (outbuf) = timestamp; + /* FIXME: when we do more than one AMR frame per packet, fix this */ if (duration != GST_CLOCK_TIME_NONE) GST_BUFFER_DURATION (outbuf) = duration; else { GST_BUFFER_DURATION (outbuf) = 20 * GST_MSECOND; + if (discont) { + GST_DEBUG_OBJECT (basepayload, "discont, setting marker bit"); + GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); + gst_rtp_buffer_set_marker (outbuf, TRUE); + discont = FALSE; + } /* get payload, this is now writable */ payload = gst_rtp_buffer_get_payload (outbuf); |
From: <wt...@ke...> - 2008-09-26 13:56:17
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Fri Sep 26 2008 13:56:02 UTC Log message: * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: (plugin_init): * gst/rtp/gstrtpmp4apay.c: (gst_rtp_mp4a_pay_get_type), (gst_rtp_mp4a_pay_base_init), (gst_rtp_mp4a_pay_class_init), (gst_rtp_mp4a_pay_init), (gst_rtp_mp4a_pay_finalize), (gst_rtp_mp4a_pay_parse_audio_config), (gst_rtp_mp4a_pay_new_caps), (gst_rtp_mp4a_pay_setcaps), (gst_rtp_mp4a_pay_handle_buffer), (gst_rtp_mp4a_pay_change_state), (gst_rtp_mp4a_pay_plugin_init): * gst/rtp/gstrtpmp4apay.h: Added MP4A-LATM payloader to match the depayloader. Modified files: . : ChangeLog gst/rtp : Makefile.am gstrtp.c Added files: gst/rtp : gstrtpmp4apay.c gstrtpmp4apay.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.3743&r2=1.3744 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/Makefile.am.diff?r1=1.50&r2=1.51 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtp.c.diff?r1=1.45&r2=1.46 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4apay.c?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4apay.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.3743 retrieving revision 1.3744 diff -u -d -r1.3743 -r1.3744 --- ChangeLog 25 Sep 2008 15:11:14 -0000 1.3743 +++ ChangeLog 26 Sep 2008 13:55:46 -0000 1.3744 @@ -1,3 +1,16 @@ +2008-09-26 Wim Taymans <wim...@co...> + + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: (plugin_init): + * gst/rtp/gstrtpmp4apay.c: (gst_rtp_mp4a_pay_get_type), + (gst_rtp_mp4a_pay_base_init), (gst_rtp_mp4a_pay_class_init), + (gst_rtp_mp4a_pay_init), (gst_rtp_mp4a_pay_finalize), + (gst_rtp_mp4a_pay_parse_audio_config), (gst_rtp_mp4a_pay_new_caps), + (gst_rtp_mp4a_pay_setcaps), (gst_rtp_mp4a_pay_handle_buffer), + (gst_rtp_mp4a_pay_change_state), (gst_rtp_mp4a_pay_plugin_init): + * gst/rtp/gstrtpmp4apay.h: + Added MP4A-LATM payloader to match the depayloader. 2008-09-25 Wim Taymans <wim...@co...> * gst/videomixer/videomixer.c: (gst_videomixer_fill_queues), Index: Makefile.am RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/Makefile.am,v retrieving revision 1.50 retrieving revision 1.51 diff -u -d -r1.50 -r1.51 --- Makefile.am 5 Aug 2008 13:54:17 -0000 1.50 +++ Makefile.am 26 Sep 2008 13:55:48 -0000 1.51 @@ -42,6 +42,7 @@ gstrtpmp4gdepay.c \ gstrtpmp4gpay.c \ gstrtpmp4adepay.c \ + gstrtpmp4apay.c \ gstrtpspeexdepay.c \ gstrtpspeexpay.c \ gstrtpsv3vdepay.c \ @@ -103,7 +104,8 @@ gstrtpmp4vpay.h \ gstrtpmp4gdepay.h \ gstrtpmp4gpay.h \ - gstrtpmp4adepay.h \ + gstrtpmp4adepay.h \ + gstrtpmp4apay.h \ gstrtpdepay.h \ gstasteriskh263.h \ gstrtpspeexdepay.h \ Index: gstrtp.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtp.c,v retrieving revision 1.45 retrieving revision 1.46 diff -u -d -r1.45 -r1.46 --- gstrtp.c 5 Aug 2008 13:54:18 -0000 1.45 +++ gstrtp.c 26 Sep 2008 13:55:48 -0000 1.46 @@ -58,6 +58,7 @@ #include "gstrtpmp4vdepay.h" #include "gstrtpmp4vpay.h" #include "gstrtpmp4adepay.h" +#include "gstrtpmp4apay.h" #include "gstrtpmp4gdepay.h" #include "gstrtpmp4gpay.h" #include "gstrtpspeexpay.h" @@ -181,6 +182,9 @@ if (!gst_rtp_mp4v_depay_plugin_init (plugin)) return FALSE; + if (!gst_rtp_mp4a_pay_plugin_init (plugin)) + return FALSE; if (!gst_rtp_mp4a_depay_plugin_init (plugin)) --- NEW FILE: gstrtpmp4apay.c --- /* GStreamer * Copyright (C) <2008> Wim Taymans <wim...@gm...> * * 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 "gstrtpmp4apay.h" GST_DEBUG_CATEGORY_STATIC (rtpmp4apay_debug); #define GST_CAT_DEFAULT (rtpmp4apay_debug) /* elementfactory information */ static const GstElementDetails gst_rtp_mp4apay_details = GST_ELEMENT_DETAILS ("RTP packet payloader", "Codec/Payloader/Network", "Payload MPEG4 audio as RTP packets (RFC 3016)", "Wim Taymans <wim...@gm...>"); static GstStaticPadTemplate gst_rtp_mp4a_pay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/mpeg," "mpegversion=(int) 4") ); static GstStaticPadTemplate gst_rtp_mp4a_pay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) [1, MAX ], " "encoding-name = (string) \"MP4A-LATM\"" /* All optional parameters * * "cpresent = (string) \"0\"" * "config=" */ ) static void gst_rtp_mp4a_pay_class_init (GstRtpMP4APayClass * klass); static void gst_rtp_mp4a_pay_base_init (GstRtpMP4APayClass * klass); static void gst_rtp_mp4a_pay_init (GstRtpMP4APay * rtpmp4apay); static void gst_rtp_mp4a_pay_finalize (GObject * object); static gboolean gst_rtp_mp4a_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps); static GstStateChangeReturn gst_rtp_mp4a_pay_change_state (GstElement * element, GstStateChange transition); static GstFlowReturn gst_rtp_mp4a_pay_handle_buffer (GstBaseRTPPayload * payload, GstBuffer * buffer); static GstBaseRTPPayloadClass *parent_class = NULL; static GType gst_rtp_mp4a_pay_get_type (void) { static GType rtpmp4apay_type = 0; if (!rtpmp4apay_type) { static const GTypeInfo rtpmp4apay_info = { sizeof (GstRtpMP4APayClass), (GBaseInitFunc) gst_rtp_mp4a_pay_base_init, NULL, (GClassInitFunc) gst_rtp_mp4a_pay_class_init, sizeof (GstRtpMP4APay), 0, (GInstanceInitFunc) gst_rtp_mp4a_pay_init, }; rtpmp4apay_type = g_type_register_static (GST_TYPE_BASE_RTP_PAYLOAD, "GstRtpMP4APay", &rtpmp4apay_info, 0); } return rtpmp4apay_type; } static void gst_rtp_mp4a_pay_base_init (GstRtpMP4APayClass * klass) GstElementClass *element_class = GST_ELEMENT_CLASS (klass); gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&gst_rtp_mp4a_pay_src_template)); gst_static_pad_template_get (&gst_rtp_mp4a_pay_sink_template)); gst_element_class_set_details (element_class, &gst_rtp_mp4apay_details); gst_rtp_mp4a_pay_class_init (GstRtpMP4APayClass * klass) GObjectClass *gobject_class; GstElementClass *gstelement_class; GstBaseRTPPayloadClass *gstbasertppayload_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; parent_class = g_type_class_peek_parent (klass); gobject_class->finalize = gst_rtp_mp4a_pay_finalize; gstelement_class->change_state = gst_rtp_mp4a_pay_change_state; gstbasertppayload_class->set_caps = gst_rtp_mp4a_pay_setcaps; gstbasertppayload_class->handle_buffer = gst_rtp_mp4a_pay_handle_buffer; GST_DEBUG_CATEGORY_INIT (rtpmp4apay_debug, "rtpmp4apay", 0, "MP4A-LATM RTP Payloader"); gst_rtp_mp4a_pay_init (GstRtpMP4APay * rtpmp4apay) rtpmp4apay->rate = 90000; rtpmp4apay->profile = g_strdup ("1"); gst_rtp_mp4a_pay_finalize (GObject * object) GstRtpMP4APay *rtpmp4apay; rtpmp4apay = GST_RTP_MP4A_PAY (object); g_free (rtpmp4apay->params); rtpmp4apay->params = NULL; if (rtpmp4apay->config) gst_buffer_unref (rtpmp4apay->config); rtpmp4apay->config = NULL; g_free (rtpmp4apay->profile); rtpmp4apay->profile = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); static unsigned sampling_table[16] = { 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000, 7350, 0, 0, 0 }; static gboolean gst_rtp_mp4a_pay_parse_audio_config (GstRtpMP4APay * rtpmp4apay, GstBuffer * buffer) guint8 *data; guint size; guint8 objectType; guint8 samplingIdx; guint8 channelCfg; data = GST_BUFFER_DATA (buffer); size = GST_BUFFER_SIZE (buffer); if (size < 2) goto too_short; /* any object type is fine, we need to copy it to the profile-level-id field. */ objectType = (data[0] & 0xf8) >> 3; if (objectType == 0) goto invalid_object; samplingIdx = ((data[0] & 0x07) << 1) | ((data[1] & 0x80) >> 7); /* only fixed values for now */ if (samplingIdx > 12 && samplingIdx != 15) goto wrong_freq; channelCfg = ((data[1] & 0x78) >> 3); if (channelCfg > 7) goto wrong_channels; /* rtp rate depends on sampling rate of the audio */ if (samplingIdx == 15) { if (size < 5) goto too_short; /* index of 15 means we get the rate in the next 24 bits */ rtpmp4apay->rate = ((data[1] & 0x7f) << 17) | ((data[2]) << 9) | ((data[3]) << 1) | ((data[4] & 0x80) >> 7); } else { /* else use the rate from the table */ rtpmp4apay->rate = sampling_table[samplingIdx]; /* extra rtp params contain the number of channels */ rtpmp4apay->params = g_strdup_printf ("%d", channelCfg); /* audio stream type */ rtpmp4apay->streamtype = "5"; /* profile */ rtpmp4apay->profile = g_strdup_printf ("%d", objectType); GST_DEBUG_OBJECT (rtpmp4apay, "objectType: %d, samplingIdx: %d (%d), channelCfg: %d", objectType, samplingIdx, rtpmp4apay->rate, channelCfg); return TRUE; /* ERROR */ too_short: { GST_ELEMENT_ERROR (rtpmp4apay, STREAM, FORMAT, (NULL), ("config string too short, expected 2 bytes, got %d", size)); return FALSE; invalid_object: (NULL), ("invalid object type 0")); wrong_freq: GST_ELEMENT_ERROR (rtpmp4apay, STREAM, NOT_IMPLEMENTED, (NULL), ("unsupported frequency index %d", samplingIdx)); wrong_channels: (NULL), ("unsupported number of channels %d, must < 8", channelCfg)); gst_rtp_mp4a_pay_new_caps (GstRtpMP4APay * rtpmp4apay) gchar *config; GValue v = { 0 }; g_value_init (&v, GST_TYPE_BUFFER); gst_value_set_buffer (&v, rtpmp4apay->config); config = gst_value_serialize (&v); gst_basertppayload_set_outcaps (GST_BASE_RTP_PAYLOAD (rtpmp4apay), "cpresent", G_TYPE_STRING, "0", "config", G_TYPE_STRING, config, NULL); g_value_unset (&v); g_free (config); gst_rtp_mp4a_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps) GstStructure *structure; const GValue *codec_data; rtpmp4apay = GST_RTP_MP4A_PAY (payload); structure = gst_caps_get_structure (caps, 0); codec_data = gst_structure_get_value (structure, "codec_data"); if (codec_data) { GST_LOG_OBJECT (rtpmp4apay, "got codec_data"); if (G_VALUE_TYPE (codec_data) == GST_TYPE_BUFFER) { GstBuffer *buffer, *cbuffer; guint8 *config; guint8 *data; guint size, i; gboolean res; buffer = gst_value_get_buffer (codec_data); GST_LOG_OBJECT (rtpmp4apay, "configuring codec_data"); /* parse buffer */ res = gst_rtp_mp4a_pay_parse_audio_config (rtpmp4apay, buffer); if (!res) goto config_failed; size = GST_BUFFER_SIZE (buffer); data = GST_BUFFER_DATA (buffer); /* make the StreamMuxConfig, we need 15 bits for the header */ config = g_malloc0 (size + 2); /* Create StreamMuxConfig according to ISO/IEC 14496-3: * * audioMuxVersion == 0 (1 bit) * allStreamsSameTimeFraming == 1 (1 bit) * numSubFrames == numSubFrames (6 bits) * numProgram == 0 (4 bits) * numLayer == 0 (3 bits) */ config[0] = 0x40; config[1] = 0x00; /* append the config bits, shifting them 1 bit left */ for (i = 0; i < size; i++) { config[i + 1] |= ((data[i] & 0x80) >> 7); config[i + 2] |= ((data[i] & 0x7f) << 1); } cbuffer = gst_buffer_new (); GST_BUFFER_DATA (cbuffer) = config; GST_BUFFER_MALLOCDATA (cbuffer) = config; GST_BUFFER_SIZE (cbuffer) = size + 2; /* now we can configure the buffer */ if (rtpmp4apay->config) gst_buffer_unref (rtpmp4apay->config); rtpmp4apay->config = cbuffer; } gst_basertppayload_set_options (payload, "audio", TRUE, "MP4A-LATM", rtpmp4apay->rate); gst_rtp_mp4a_pay_new_caps (rtpmp4apay); /* ERRORS */ config_failed: GST_DEBUG_OBJECT (rtpmp4apay, "failed to parse config"); /* we expect buffers as exactly one complete AU static GstFlowReturn gst_rtp_mp4a_pay_handle_buffer (GstBaseRTPPayload * basepayload, GstFlowReturn ret; GstBuffer *outbuf; guint count, mtu, size; gboolean fragmented; ret = GST_FLOW_OK; rtpmp4apay = GST_RTP_MP4A_PAY (basepayload); fragmented = FALSE; mtu = GST_BASE_RTP_PAYLOAD_MTU (rtpmp4apay); while (size > 0) { guint towrite; guint8 *payload; guint payload_len; guint packet_len; /* this will be the total lenght of the packet */ packet_len = gst_rtp_buffer_calc_packet_len (size, 0, 0); if (!fragmented) { /* first packet calculate space for the packet including the header */ count = size; while (count >= 0xff) { packet_len++; count -= 0xff; packet_len++; /* fill one MTU or all available bytes */ towrite = MIN (packet_len, mtu); /* this is the payload length */ payload_len = gst_rtp_buffer_calc_payload_len (towrite, 0, 0); GST_DEBUG_OBJECT (rtpmp4apay, "avail %d, towrite %d, packet_len %d, payload_len %d", size, towrite, packet_len, payload_len); /* create buffer to hold the payload. */ outbuf = gst_rtp_buffer_new_allocate (payload_len, 0, 0); /* copy payload */ payload = gst_rtp_buffer_get_payload (outbuf); /* first packet write the header */ *payload++ = 0xff; payload_len--; *payload++ = count; payload_len--; /* copy data to payload */ memcpy (payload, data, payload_len); data += payload_len; size -= payload_len; /* marker only if the packet is complete */ gst_rtp_buffer_set_marker (outbuf, size == 0); ret = gst_basertppayload_push (GST_BASE_RTP_PAYLOAD (rtpmp4apay), outbuf); fragmented = TRUE; return ret; static GstStateChangeReturn gst_rtp_mp4a_pay_change_state (GstElement * element, GstStateChange transition) GstStateChangeReturn ret; rtpmp4apay = GST_RTP_MP4A_PAY (element); switch (transition) { default: break; ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); gboolean gst_rtp_mp4a_pay_plugin_init (GstPlugin * plugin) return gst_element_register (plugin, "rtpmp4apay", GST_RANK_NONE, GST_TYPE_RTP_MP4A_PAY); --- NEW FILE: gstrtpmp4apay.h --- * Copyright (C) <2005> Wim Taymans <wi...@fl...> #ifndef __GST_RTP_MP4A_PAY_H__ #define __GST_RTP_MP4A_PAY_H__ #include <gst/gst.h> #include <gst/rtp/gstbasertppayload.h> #include <gst/base/gstadapter.h> G_BEGIN_DECLS #define GST_TYPE_RTP_MP4A_PAY \ (gst_rtp_mp4a_pay_get_type()) #define GST_RTP_MP4A_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_MP4A_PAY,GstRtpMP4APay)) #define GST_RTP_MP4A_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_MP4A_PAY,GstRtpMP4APayClass)) #define GST_IS_RTP_MP4A_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_MP4A_PAY)) #define GST_IS_RTP_MP4A_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_MP4A_PAY)) typedef struct _GstRtpMP4APay GstRtpMP4APay; typedef struct _GstRtpMP4APayClass GstRtpMP4APayClass; struct _GstRtpMP4APay GstBaseRTPPayload payload; gint rate; gchar *params; gchar *profile; const gchar *streamtype; GstBuffer *config; struct _GstRtpMP4APayClass GstBaseRTPPayloadClass parent_class; gboolean gst_rtp_mp4a_pay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_MP4A_PAY_H__ */ |
From: <wt...@ke...> - 2008-10-27 11:08:28
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Mon Oct 27 2008 11:04:07 UTC Log message: * gst/rtp/gstrtpL16depay.c: (gst_rtp_L16_depay_setcaps), (gst_rtp_L16_depay_process): Check if clock-rate and channels are valid. Don't ignore the return value of setcaps. No need to validate the buffer, the base class does that for us. Use the marker bit to set the DISCONT flag on outgoing buffers. * gst/rtp/gstrtpL16pay.c: (gst_rtp_L16_pay_setcaps): Don't ignore the return value of set_outcaps. * gst/rtp/gstrtpac3depay.c: (gst_rtp_ac3_depay_setcaps), (gst_rtp_ac3_depay_process): Don't ignore the return value of set_caps. No need to validate the buffer, the base class does that for us. * gst/rtp/gstrtpamrdepay.c: (gst_rtp_amr_depay_setcaps), (gst_rtp_amr_depay_process): * gst/rtp/gstrtpamrdepay.h: Don't ignore the return value of setcaps. No need to validate the buffer, the base class does that for us. No need to set output caps on the buffers, the base class does that for us. The subclass will make sure we are negotiated. * gst/rtp/gstrtpdvdepay.c: (gst_rtp_dv_depay_setcaps), (gst_rtp_dv_depay_process), (gst_rtp_dv_depay_reset): * gst/rtp/gstrtpdvdepay.h: Clean up caps negotiation. The subclass will make sure we are negotiated. * gst/rtp/gstrtpg726depay.c: (gst_rtp_g726_depay_setcaps), (gst_rtp_g726_depay_process): Clean up caps negotiation. Use the marker bit to set the DISCONT flag on outgoing buffers. * gst/rtp/gstrtpg729depay.c: (gst_rtp_g729_depay_init), (gst_rtp_g729_depay_setcaps), (gst_rtp_g729_depay_process): * gst/rtp/gstrtpg729depay.h: The subclass will make sure we are negotiated. Use the marker bit to set the DISCONT flag on outgoing buffers. * gst/rtp/gstrtpgsmdepay.c: (gst_rtp_gsm_depay_setcaps), (gst_rtp_gsm_depay_process): Clean up caps negotiation. Use the marker bit to set the DISCONT flag on outgoing buffers. * gst/rtp/gstrtpgsmpay.c: (gst_rtp_gsm_pay_setcaps): Clean up caps negotiation. Don't ignore the return value of set_outcaps. * gst/rtp/gstrtph263depay.c: (gst_rtp_h263_depay_setcaps), (gst_rtp_h263_depay_process): Clean up caps negotiation. No need to validate the buffer, the base class does that for us. * gst/rtp/gstrtph263pay.c: (gst_rtp_h263_pay_setcaps), (gst_rtp_h263_pay_flush), (gst_rtp_h263_pay_handle_buffer): * gst/rtp/gstrtph263pay.h: Don't ignore the return value of set_outcaps. Do some more timestamps. * gst/rtp/gstrtph263pdepay.c: (gst_rtp_h263p_depay_setcaps), (gst_rtp_h263p_depay_process): Clean up caps negotiation. Don't ignore the return value of setcaps. No need to validate the buffer, the base class does that for us. * gst/rtp/gstrtph263ppay.c: (gst_rtp_h263p_pay_class_init), (gst_rtp_h263p_pay_setcaps), (gst_rtp_h263p_pay_flush), (gst_rtp_h263p_pay_handle_buffer): * gst/rtp/gstrtph263ppay.h: Don't ignore the return value of set_outcaps. Do some more timestamps. * gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process): Clean up caps negotiation. Don't ignore the return value of setcaps. Fix possible caps leak. No need to validate the buffer, the base class does that for us. * gst/rtp/gstrtph264pay.c: (gst_rtp_h264_pay_setcaps): Add some more debug info. * gst/rtp/gstrtpilbcdepay.c: (gst_rtp_ilbc_depay_setcaps), (gst_rtp_ilbc_depay_process): Clean up caps negotiation. Use the marker bit to set the DISCONT flag on outgoing buffers. * gst/rtp/gstrtpilbcpay.c: (gst_rtpilbcpay_sink_setcaps): Clean up caps negotiation. * gst/rtp/gstrtpmp1sdepay.c: (gst_rtp_mp1s_depay_setcaps), (gst_rtp_mp1s_depay_process): Clean up caps negotiation. Don't ignore the return value of setcaps. No need to validate the buffer, the base class does that for us. No need to set caps on buffers, subclass does that for us. * gst/rtp/gstrtpmp2tdepay.c: (gst_rtp_mp2t_depay_setcaps), (gst_rtp_mp2t_depay_process): Clean up caps negotiation. Don't ignore the return value of setcaps. No need to validate the buffer, the base class does that for us. No need to set caps on buffers, subclass does that for us. * gst/rtp/gstrtpmp4adepay.c: (gst_rtp_mp4a_depay_setcaps), (gst_rtp_mp4a_depay_process): Clean up caps negotiation. Don't ignore the return value of setcaps. No need to validate the buffer, the base class does that for us. * gst/rtp/gstrtpmp4apay.c: (gst_rtp_mp4a_pay_new_caps), (gst_rtp_mp4a_pay_setcaps): Don't ignore the return value of set_outcaps. * gst/rtp/gstrtpmp4gdepay.c: (gst_rtp_mp4g_depay_setcaps), (gst_rtp_mp4g_depay_process): Clean up caps negotiation. Don't ignore the return value of setcaps. No need to validate the buffer, the base class does that for us. No need to set caps on buffers, subclass does that for us. * gst/rtp/gstrtpmp4gpay.c: (gst_rtp_mp4g_pay_finalize), (gst_rtp_mp4g_pay_new_caps), (gst_rtp_mp4g_pay_setcaps): Don't ignore the return value of set_outcaps. * gst/rtp/gstrtpmp4vdepay.c: (gst_rtp_mp4v_depay_setcaps), (gst_rtp_mp4v_depay_process): Clean up caps negotiation. Don't ignore the return value of setcaps. No need to validate the buffer, the base class does that for us. No need to set caps on buffers, subclass does that for us. * gst/rtp/gstrtpmp4vpay.c: (gst_rtp_mp4v_pay_new_caps), (gst_rtp_mp4v_pay_setcaps): Don't ignore the return value of set_outcaps. * gst/rtp/gstrtpmpadepay.c: (gst_rtp_mpa_depay_setcaps), (gst_rtp_mpa_depay_process): Clean up caps negotiation. Don't ignore the return value of setcaps. No need to validate the buffer, the base class does that for us. Use the marker bit to set the DISCONT flag on outgoing buffers. * gst/rtp/gstrtpmpapay.c: (gst_rtp_mpa_pay_setcaps): Don't ignore the return value of set_outcaps. * gst/rtp/gstrtpmpvdepay.c: (gst_rtp_mpv_depay_setcaps), (gst_rtp_mpv_depay_process): Clean up caps negotiation. Actually set output caps. No need to validate the buffer, the base class does that for us. * gst/rtp/gstrtpmpvpay.c: (gst_rtp_mpv_pay_setcaps): Don't ignore the return value of set_outcaps. * gst/rtp/gstrtppcmadepay.c: (gst_rtp_pcma_depay_setcaps), (gst_rtp_pcma_depay_process): Clean up caps negotiation. Set output buffer duration because we can. Use the marker bit to set the DISCONT flag on outgoing buffers. * gst/rtp/gstrtppcmapay.c: (gst_rtp_pcma_pay_setcaps): Don't ignore the return value of set_outcaps. * gst/rtp/gstrtppcmudepay.c: (gst_rtp_pcmu_depay_setcaps), (gst_rtp_pcmu_depay_process): Clean up caps negotiation. Use the marker bit to set the DISCONT flag on outgoing buffers. * gst/rtp/gstrtppcmupay.c: (gst_rtp_pcmu_pay_setcaps): Don't ignore the return value of set_outcaps. * gst/rtp/gstrtpspeexdepay.c: (gst_rtp_speex_depay_init), (gst_rtp_speex_depay_setcaps), (gst_rtp_speex_depay_process): Clean up caps negotiation. Set output caps on the pad and header buffers. Set duration on output buffers because we can. * gst/rtp/gstrtpspeexpay.c: (gst_rtp_speex_pay_parse_ident): Don't ignore the return value of set_outcaps. * gst/rtp/gstrtpsv3vdepay.c: (gst_rtp_sv3v_depay_setcaps), (gst_rtp_sv3v_depay_process): Clean up caps negotiation. No need to validate the buffer, the base class does that for us. No need to set caps out output buffers, subclass does that. * gst/rtp/gstrtptheoradepay.c: (gst_rtp_theora_depay_setcaps), (gst_rtp_theora_depay_process): Don't ignore the return value of setcaps. No need to validate the buffer, the base class does that for us. * gst/rtp/gstrtptheorapay.c: (gst_rtp_theora_pay_class_init), (gst_rtp_theora_pay_flush_packet), (encode_base64), (gst_rtp_theora_pay_finish_headers), (gst_rtp_theora_pay_parse_id), (gst_rtp_theora_pay_handle_buffer): Don't ignore the return value of set_outcaps. * gst/rtp/gstrtpvorbisdepay.c: (gst_rtp_vorbis_depay_setcaps), (gst_rtp_vorbis_depay_process): Don't ignore the return value of setcaps. No need to validate the buffer, the base class does that for us. * gst/rtp/gstrtpvorbispay.c: (gst_rtp_vorbis_pay_finish_headers): Don't ignore the return value of set_outcaps. * gst/rtp/gstrtpvrawdepay.c: (gst_rtp_vraw_depay_setcaps): Clean up caps negotiation, don't ignore setcaps return. * gst/rtp/gstrtpvrawpay.c: (gst_rtp_vraw_pay_setcaps): Don't ignore the return value of set_outcaps. Modified files: . : ChangeLog gst/rtp : gstrtpL16depay.c gstrtpL16pay.c gstrtpac3depay.c gstrtpamrdepay.c gstrtpamrdepay.h gstrtpdvdepay.c gstrtpdvdepay.h gstrtpg726depay.c gstrtpg729depay.c gstrtpg729depay.h gstrtpgsmdepay.c gstrtpgsmpay.c gstrtph263depay.c gstrtph263pay.c gstrtph263pay.h gstrtph263pdepay.c gstrtph263ppay.c gstrtph263ppay.h gstrtph264depay.c gstrtph264pay.c gstrtpilbcdepay.c gstrtpilbcpay.c gstrtpmp1sdepay.c gstrtpmp2tdepay.c gstrtpmp4adepay.c gstrtpmp4apay.c gstrtpmp4gdepay.c gstrtpmp4gpay.c gstrtpmp4vdepay.c gstrtpmp4vpay.c gstrtpmpadepay.c gstrtpmpapay.c gstrtpmpvdepay.c gstrtpmpvpay.c gstrtppcmadepay.c gstrtppcmapay.c gstrtppcmudepay.c gstrtppcmupay.c gstrtpspeexdepay.c gstrtpspeexpay.c gstrtpsv3vdepay.c gstrtptheoradepay.c gstrtptheorapay.c gstrtpvorbisdepay.c gstrtpvorbispay.c gstrtpvrawdepay.c gstrtpvrawpay.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.3781&r2=1.3782 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpL16depay.c.diff?r1=1.30&r2=1.31 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpL16pay.c.diff?r1=1.26&r2=1.27 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpac3depay.c.diff?r1=1.2&r2=1.3 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpamrdepay.c.diff?r1=1.30&r2=1.31 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpamrdepay.h.diff?r1=1.9&r2=1.10 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpdvdepay.c.diff?r1=1.1&r2=1.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpdvdepay.h.diff?r1=1.1&r2=1.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpg726depay.c.diff?r1=1.1&r2=1.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpg729depay.c.diff?r1=1.2&r2=1.3 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpg729depay.h.diff?r1=1.1&r2=1.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpgsmdepay.c.diff?r1=1.32&r2=1.33 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpgsmpay.c.diff?r1=1.32&r2=1.33 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtph263depay.c.diff?r1=1.5&r2=1.6 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtph263pay.c.diff?r1=1.15&r2=1.16 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtph263pay.h.diff?r1=1.6&r2=1.7 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtph263pdepay.c.diff?r1=1.27&r2=1.28 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtph263ppay.c.diff?r1=1.24&r2=1.25 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtph263ppay.h.diff?r1=1.9&r2=1.10 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtph264depay.c.diff?r1=1.18&r2=1.19 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtph264pay.c.diff?r1=1.13&r2=1.14 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpilbcdepay.c.diff?r1=1.13&r2=1.14 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpilbcpay.c.diff?r1=1.10&r2=1.11 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp1sdepay.c.diff?r1=1.1&r2=1.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp2tdepay.c.diff?r1=1.10&r2=1.11 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4adepay.c.diff?r1=1.8&r2=1.9 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4apay.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.18&r2=1.19 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gpay.c.diff?r1=1.20&r2=1.21 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4vdepay.c.diff?r1=1.23&r2=1.24 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4vpay.c.diff?r1=1.29&r2=1.30 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmpadepay.c.diff?r1=1.20&r2=1.21 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmpapay.c.diff?r1=1.19&r2=1.20 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmpvdepay.c.diff?r1=1.6&r2=1.7 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmpvpay.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.12&r2=1.13 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtppcmapay.c.diff?r1=1.11&r2=1.12 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtppcmudepay.c.diff?r1=1.12&r2=1.13 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtppcmupay.c.diff?r1=1.11&r2=1.12 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpspeexdepay.c.diff?r1=1.16&r2=1.17 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpspeexpay.c.diff?r1=1.15&r2=1.16 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpsv3vdepay.c.diff?r1=1.8&r2=1.9 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtptheoradepay.c.diff?r1=1.9&r2=1.10 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtptheorapay.c.diff?r1=1.12&r2=1.13 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpvorbisdepay.c.diff?r1=1.15&r2=1.16 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpvorbispay.c.diff?r1=1.16&r2=1.17 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpvrawdepay.c.diff?r1=1.2&r2=1.3 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpvrawpay.c.diff?r1=1.1&r2=1.2 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.3781 retrieving revision 1.3782 diff -u -d -r1.3781 -r1.3782 --- ChangeLog 27 Oct 2008 10:35:05 -0000 1.3781 +++ ChangeLog 27 Oct 2008 11:03:46 -0000 1.3782 @@ -1,5 +1,221 @@ 2008-10-27 Wim Taymans <wim...@co...> + * gst/rtp/gstrtpL16depay.c: (gst_rtp_L16_depay_setcaps), + (gst_rtp_L16_depay_process): + Check if clock-rate and channels are valid. + Don't ignore the return value of setcaps. + No need to validate the buffer, the base class does that for us. + Use the marker bit to set the DISCONT flag on outgoing buffers. + + * gst/rtp/gstrtpL16pay.c: (gst_rtp_L16_pay_setcaps): + Don't ignore the return value of set_outcaps. + * gst/rtp/gstrtpac3depay.c: (gst_rtp_ac3_depay_setcaps), + (gst_rtp_ac3_depay_process): + Don't ignore the return value of set_caps. + * gst/rtp/gstrtpamrdepay.c: (gst_rtp_amr_depay_setcaps), + (gst_rtp_amr_depay_process): + * gst/rtp/gstrtpamrdepay.h: + No need to set output caps on the buffers, the base class does that for + us. + The subclass will make sure we are negotiated. + + * gst/rtp/gstrtpdvdepay.c: (gst_rtp_dv_depay_setcaps), + (gst_rtp_dv_depay_process), (gst_rtp_dv_depay_reset): + * gst/rtp/gstrtpdvdepay.h: + Clean up caps negotiation. + * gst/rtp/gstrtpg726depay.c: (gst_rtp_g726_depay_setcaps), + (gst_rtp_g726_depay_process): + * gst/rtp/gstrtpg729depay.c: (gst_rtp_g729_depay_init), + (gst_rtp_g729_depay_setcaps), (gst_rtp_g729_depay_process): + * gst/rtp/gstrtpg729depay.h: + * gst/rtp/gstrtpgsmdepay.c: (gst_rtp_gsm_depay_setcaps), + (gst_rtp_gsm_depay_process): + * gst/rtp/gstrtpgsmpay.c: (gst_rtp_gsm_pay_setcaps): + * gst/rtp/gstrtph263depay.c: (gst_rtp_h263_depay_setcaps), + (gst_rtp_h263_depay_process): + * gst/rtp/gstrtph263pay.c: (gst_rtp_h263_pay_setcaps), + (gst_rtp_h263_pay_flush), (gst_rtp_h263_pay_handle_buffer): + * gst/rtp/gstrtph263pay.h: + Do some more timestamps. + * gst/rtp/gstrtph263pdepay.c: (gst_rtp_h263p_depay_setcaps), + (gst_rtp_h263p_depay_process): + * gst/rtp/gstrtph263ppay.c: (gst_rtp_h263p_pay_class_init), + (gst_rtp_h263p_pay_setcaps), (gst_rtp_h263p_pay_flush), + (gst_rtp_h263p_pay_handle_buffer): + * gst/rtp/gstrtph263ppay.h: + * gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_setcaps), + (gst_rtp_h264_depay_process): + Fix possible caps leak. + * gst/rtp/gstrtph264pay.c: (gst_rtp_h264_pay_setcaps): + Add some more debug info. + * gst/rtp/gstrtpilbcdepay.c: (gst_rtp_ilbc_depay_setcaps), + (gst_rtp_ilbc_depay_process): + * gst/rtp/gstrtpilbcpay.c: (gst_rtpilbcpay_sink_setcaps): + * gst/rtp/gstrtpmp1sdepay.c: (gst_rtp_mp1s_depay_setcaps), + (gst_rtp_mp1s_depay_process): + No need to set caps on buffers, subclass does that for us. + * gst/rtp/gstrtpmp2tdepay.c: (gst_rtp_mp2t_depay_setcaps), + (gst_rtp_mp2t_depay_process): + * gst/rtp/gstrtpmp4adepay.c: (gst_rtp_mp4a_depay_setcaps), + (gst_rtp_mp4a_depay_process): + * gst/rtp/gstrtpmp4apay.c: (gst_rtp_mp4a_pay_new_caps), + (gst_rtp_mp4a_pay_setcaps): + * gst/rtp/gstrtpmp4gdepay.c: (gst_rtp_mp4g_depay_setcaps), + (gst_rtp_mp4g_depay_process): + * gst/rtp/gstrtpmp4gpay.c: (gst_rtp_mp4g_pay_finalize), + (gst_rtp_mp4g_pay_new_caps), (gst_rtp_mp4g_pay_setcaps): + * gst/rtp/gstrtpmp4vdepay.c: (gst_rtp_mp4v_depay_setcaps), + (gst_rtp_mp4v_depay_process): + * gst/rtp/gstrtpmp4vpay.c: (gst_rtp_mp4v_pay_new_caps), + (gst_rtp_mp4v_pay_setcaps): + * gst/rtp/gstrtpmpadepay.c: (gst_rtp_mpa_depay_setcaps), + (gst_rtp_mpa_depay_process): + * gst/rtp/gstrtpmpapay.c: (gst_rtp_mpa_pay_setcaps): + * gst/rtp/gstrtpmpvdepay.c: (gst_rtp_mpv_depay_setcaps), + (gst_rtp_mpv_depay_process): + Actually set output caps. + * gst/rtp/gstrtpmpvpay.c: (gst_rtp_mpv_pay_setcaps): + * gst/rtp/gstrtppcmadepay.c: (gst_rtp_pcma_depay_setcaps), + (gst_rtp_pcma_depay_process): + Set output buffer duration because we can. + * gst/rtp/gstrtppcmapay.c: (gst_rtp_pcma_pay_setcaps): + * gst/rtp/gstrtppcmudepay.c: (gst_rtp_pcmu_depay_setcaps), + (gst_rtp_pcmu_depay_process): + * gst/rtp/gstrtppcmupay.c: (gst_rtp_pcmu_pay_setcaps): + * gst/rtp/gstrtpspeexdepay.c: (gst_rtp_speex_depay_init), + (gst_rtp_speex_depay_setcaps), (gst_rtp_speex_depay_process): + Set output caps on the pad and header buffers. + Set duration on output buffers because we can. + * gst/rtp/gstrtpspeexpay.c: (gst_rtp_speex_pay_parse_ident): + * gst/rtp/gstrtpsv3vdepay.c: (gst_rtp_sv3v_depay_setcaps), + (gst_rtp_sv3v_depay_process): + No need to set caps out output buffers, subclass does that. + * gst/rtp/gstrtptheoradepay.c: (gst_rtp_theora_depay_setcaps), + (gst_rtp_theora_depay_process): + * gst/rtp/gstrtptheorapay.c: (gst_rtp_theora_pay_class_init), + (gst_rtp_theora_pay_flush_packet), (encode_base64), + (gst_rtp_theora_pay_finish_headers), (gst_rtp_theora_pay_parse_id), + (gst_rtp_theora_pay_handle_buffer): + * gst/rtp/gstrtpvorbisdepay.c: (gst_rtp_vorbis_depay_setcaps), + (gst_rtp_vorbis_depay_process): + * gst/rtp/gstrtpvorbispay.c: (gst_rtp_vorbis_pay_finish_headers): + * gst/rtp/gstrtpvrawdepay.c: (gst_rtp_vraw_depay_setcaps): + Clean up caps negotiation, don't ignore setcaps return. + * gst/rtp/gstrtpvrawpay.c: (gst_rtp_vraw_pay_setcaps): +2008-10-27 Wim Taymans <wim...@co...> * gst/matroska/matroska-demux.c: (gst_matroska_demux_handle_src_event): Forward unknown events upstream. Index: gstrtpL16depay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpL16depay.c,v retrieving revision 1.30 retrieving revision 1.31 diff -u -d -r1.30 -r1.31 --- gstrtpL16depay.c 9 Jan 2008 11:10:59 -0000 1.30 +++ gstrtpL16depay.c 27 Oct 2008 11:03:48 -0000 1.31 @@ -145,6 +145,7 @@ gint clock_rate, payload; gint channels; GstCaps *srccaps; + gboolean res; rtpL16depay = GST_RTP_L16_DEPAY (depayload); @@ -170,7 +171,12 @@ /* caps can overwrite defaults */ clock_rate = gst_rtp_L16_depay_parse_int (structure, "clock-rate", clock_rate); + if (clock_rate == 0) + goto no_clockrate; channels = gst_rtp_L16_depay_parse_int (structure, "channels", channels); + if (channels == 0) + goto no_channels; depayload->clock_rate = clock_rate; rtpL16depay->rate = clock_rate; @@ -183,10 +189,22 @@ "depth", G_TYPE_INT, 16, "rate", G_TYPE_INT, clock_rate, "channels", G_TYPE_INT, channels, NULL); - gst_pad_set_caps (depayload->srcpad, srccaps); + res = gst_pad_set_caps (depayload->srcpad, srccaps); gst_caps_unref (srccaps); - return TRUE; + return res; + /* ERRORS */ +no_clockrate: + { + GST_ERROR_OBJECT (depayload, "no clock-rate specified"); + return FALSE; + } +no_channels: + GST_ERROR_OBJECT (depayload, "no channels specified"); } static GstBuffer * @@ -194,34 +212,29 @@ { GstRtpL16Depay *rtpL16depay; GstBuffer *outbuf; + gint payload_len; + gboolean marker; - if (!gst_rtp_buffer_validate (buf)) - goto bad_packet; - - { - gint payload_len; - payload_len = gst_rtp_buffer_get_payload_len (buf); + payload_len = gst_rtp_buffer_get_payload_len (buf); - if (payload_len <= 0) - goto empty_packet; + if (payload_len <= 0) + goto empty_packet; - GST_DEBUG_OBJECT (rtpL16depay, "got payload of %d bytes", payload_len); + GST_DEBUG_OBJECT (rtpL16depay, "got payload of %d bytes", payload_len); - outbuf = gst_rtp_buffer_get_payload_buffer (buf); + outbuf = gst_rtp_buffer_get_payload_buffer (buf); + marker = gst_rtp_buffer_get_marker (buf); - return outbuf; + if (marker) { + /* mark talk spurt with DISCONT */ + GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); } - return NULL; -bad_packet: - GST_ELEMENT_WARNING (rtpL16depay, STREAM, DECODE, - ("Packet did not validate."), (NULL)); - return NULL; - } + return outbuf; empty_packet: { GST_ELEMENT_WARNING (rtpL16depay, STREAM, DECODE, Index: gstrtpL16pay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpL16pay.c,v retrieving revision 1.26 retrieving revision 1.27 diff -u -d -r1.26 -r1.27 --- gstrtpL16pay.c 19 Sep 2007 16:24:08 -0000 1.26 +++ gstrtpL16pay.c 27 Oct 2008 11:03:48 -0000 1.27 @@ -163,6 +163,7 @@ GstRtpL16Pay *rtpL16pay; GstStructure *structure; gint channels, rate; rtpL16pay = GST_RTP_L16_PAY (basepayload); @@ -176,13 +177,13 @@ goto no_channels; gst_basertppayload_set_options (basepayload, "audio", TRUE, "L16", rate); - gst_basertppayload_set_outcaps (basepayload, + res = gst_basertppayload_set_outcaps (basepayload, "channels", G_TYPE_INT, channels, "rate", G_TYPE_INT, rate, NULL); rtpL16pay->rate = rate; rtpL16pay->channels = channels; /* ERRORS */ no_rate: Index: gstrtpac3depay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpac3depay.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- gstrtpac3depay.c 9 Jan 2008 11:10:59 -0000 1.2 +++ gstrtpac3depay.c 27 Oct 2008 11:03:48 -0000 1.3 @@ -110,16 +110,23 @@ GstRtpAC3Depay *rtpac3depay; - gint clock_rate = 90000; /* default */ + gint clock_rate; + GstCaps *srccaps; rtpac3depay = GST_RTP_AC3_DEPAY (depayload); structure = gst_caps_get_structure (caps, 0); - gst_structure_get_int (structure, "clock-rate", &clock_rate); + if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) + clock_rate = 90000; /* default */ + srccaps = gst_caps_new_simple ("audio/ac3", NULL); + gst_caps_unref (srccaps); struct frmsize_s @@ -177,9 +184,6 @@ gint payload_len; guint8 *payload; @@ -218,20 +222,7 @@ return NULL; - GST_ELEMENT_WARNING (rtpac3depay, STREAM, DECODE, -#if 0 -bad_payload: - ("Unexpected payload type."), (NULL)); -#endif GST_ELEMENT_WARNING (rtpac3depay, STREAM, DECODE, Index: gstrtpamrdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpamrdepay.c,v --- gstrtpamrdepay.c 26 Sep 2008 14:44:49 -0000 1.30 +++ gstrtpamrdepay.c 27 Oct 2008 11:03:48 -0000 1.31 @@ -174,6 +174,7 @@ const gchar *params; const gchar *str, *type; gint clock_rate, need_clock_rate; rtpamrdepay = GST_RTP_AMR_DEPAY (depayload); @@ -183,11 +184,11 @@ if ((str = gst_structure_get_string (structure, "encoding-name"))) { if (strcmp (str, "AMR") == 0) { rtpamrdepay->mode = GST_RTP_AMR_DP_MODE_NB; - clock_rate = need_clock_rate = 8000; + need_clock_rate = 8000; type = "audio/AMR"; } else if (strcmp (str, "AMR-WB") == 0) { rtpamrdepay->mode = GST_RTP_AMR_DP_MODE_WB; - clock_rate = need_clock_rate = 16000; + need_clock_rate = 16000; type = "audio/AMR-WB"; } else goto invalid_mode; @@ -235,7 +236,8 @@ rtpamrdepay->channels = atoi (params); + clock_rate = need_clock_rate; /* we require 1 channel, 8000 Hz, octet aligned, no CRC, @@ -254,13 +256,10 @@ srccaps = gst_caps_new_simple (type, "channels", G_TYPE_INT, rtpamrdepay->channels, "rate", G_TYPE_INT, clock_rate, NULL); - gst_pad_set_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload), srccaps); + res = gst_pad_set_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload), srccaps); - rtpamrdepay->negotiated = TRUE; invalid_mode: @@ -290,12 +289,6 @@ - if (!rtpamrdepay->negotiated) - goto not_negotiated; - goto invalid_packet; /* setup frame size pointer */ if (rtpamrdepay->mode == GST_RTP_AMR_DP_MODE_NB) frame_size = nb_frame_size; @@ -421,33 +414,18 @@ GST_BUFFER_DURATION (outbuf) = num_packets * 20 * GST_MSECOND; if (marker) { - /* marker bit marks a discont buffer */ + /* marker bit marks a discont buffer after a talkspurt. */ GST_DEBUG_OBJECT (depayload, "marker bit was set"); GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); marker = FALSE; } - gst_buffer_set_caps (outbuf, - GST_PAD_CAPS (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload))); GST_DEBUG_OBJECT (depayload, "pushing buffer of size %d", GST_BUFFER_SIZE (outbuf)); return outbuf; -invalid_packet: - GST_ELEMENT_WARNING (rtpamrdepay, STREAM, DECODE, - (NULL), ("AMR RTP packet did not validate")); -not_negotiated: - GST_ELEMENT_ERROR (rtpamrdepay, STREAM, NOT_IMPLEMENTED, - (NULL), ("not negotiated")); too_small: GST_ELEMENT_WARNING (rtpamrdepay, STREAM, DECODE, Index: gstrtpamrdepay.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpamrdepay.h,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- gstrtpamrdepay.h 1 Jun 2007 11:16:17 -0000 1.9 +++ gstrtpamrdepay.h 27 Oct 2008 11:03:48 -0000 1.10 @@ -49,7 +49,6 @@ GstBaseRTPDepayload depayload; - gboolean negotiated; GstRtpAMRDepayMode mode; gboolean octet_align; Index: gstrtpdvdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpdvdepay.c,v retrieving revision 1.1 diff -u -d -r1.1 -r1.2 --- gstrtpdvdepay.c 12 May 2008 18:27:24 -0000 1.1 +++ gstrtpdvdepay.c 27 Oct 2008 11:03:48 -0000 1.2 @@ -173,7 +173,7 @@ GstRTPDVDepay *rtpdvdepay; gboolean systemstream, ret; const gchar *encode, *media; @@ -181,8 +181,9 @@ - if (gst_structure_has_field (structure, "clock-rate")) - gst_structure_get_int (structure, "clock-rate", &clock_rate); + depayload->clock_rate = clock_rate; /* we really need the encode property to figure out the frame size, it's also * required by the spec */ @@ -230,9 +231,6 @@ ret = gst_pad_set_caps (depayload->srcpad, srccaps); - depayload->clock_rate = clock_rate; - rtpdvdepay->negotiated = TRUE; return ret; @@ -307,9 +305,6 @@ GstRTPDVDepay *dvdepay = GST_RTP_DV_DEPAY (base); gboolean marker; - if (!dvdepay->negotiated) marker = gst_rtp_buffer_get_marker (in); /* Check if the received packet contains (the start of) a new frame, we do @@ -361,14 +356,6 @@ dvdepay->prev_ts = rtp_ts; return out; - /* ERRORS */ - GST_ELEMENT_ERROR (dvdepay, STREAM, NOT_IMPLEMENTED, static void @@ -381,7 +368,6 @@ depay->prev_ts = -1; depay->have_header = FALSE; depay->frame_nr = 0; - depay->negotiated = FALSE; static GstStateChangeReturn Index: gstrtpdvdepay.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpdvdepay.h,v --- gstrtpdvdepay.h 12 May 2008 18:27:24 -0000 1.1 +++ gstrtpdvdepay.h 27 Oct 2008 11:03:48 -0000 1.2 @@ -51,7 +51,6 @@ gint width, height; gint rate_num, rate_denom; }; struct _GstRTPDVDepayClass Index: gstrtpg726depay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpg726depay.c,v --- gstrtpg726depay.c 18 Jun 2008 10:12:56 -0000 1.1 +++ gstrtpg726depay.c 27 Oct 2008 11:03:48 -0000 1.2 @@ -130,13 +130,14 @@ gboolean ret; - gint clock_rate = 8000; /* default */ const gchar *encoding_name; gint bitrate; + clock_rate = 8000; /* default */ encoding_name = gst_structure_get_string (structure, "encoding-name"); @@ -175,27 +176,22 @@ gst_rtp_g726_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) - GstCaps *srccaps; GstBuffer *outbuf = NULL; GST_DEBUG ("process : got %d bytes, mark %d ts %u seqn %d", - GST_BUFFER_SIZE (buf), - gst_rtp_buffer_get_marker (buf), + GST_BUFFER_SIZE (buf), marker, gst_rtp_buffer_get_timestamp (buf), gst_rtp_buffer_get_seq (buf)); - srccaps = GST_PAD_CAPS (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload)); - if (!srccaps) { - /* Set the default caps */ - srccaps = gst_caps_new_simple ("audio/x-adpcm", - "channels", G_TYPE_INT, 1, - "rate", G_TYPE_INT, SAMPLE_RATE, - "bitrate", G_TYPE_INT, DEFAULT_BIT_RATE, - "layout", G_TYPE_STRING, LAYOUT_G726, NULL); - gst_pad_set_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload), srccaps); - gst_caps_unref (srccaps); outbuf = gst_rtp_buffer_get_payload_buffer (buf); + /* mark start of talkspurt with discont */ Index: gstrtpg729depay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpg729depay.c,v --- gstrtpg729depay.c 13 May 2008 08:59:41 -0000 1.2 +++ gstrtpg729depay.c 27 Oct 2008 11:03:48 -0000 1.3 @@ -120,7 +120,6 @@ depayload = GST_BASE_RTP_DEPAYLOAD (rtpg729depay); - depayload->clock_rate = 8000; gst_pad_use_fixed_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload)); @@ -153,13 +152,13 @@ if (clock_rate != 8000) goto wrong_clock_rate; srccaps = gst_caps_new_simple ("audio/G729", "channels", G_TYPE_INT, channels, "rate", G_TYPE_INT, clock_rate, NULL); ret = gst_pad_set_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload), srccaps); - rtpg729depay->negotiated = ret; @@ -184,18 +183,10 @@ GstRtpG729Depay *rtpg729depay; gint payload_len; rtpg729depay = GST_RTP_G729_DEPAY (depayload); - if (!rtpg729depay->negotiated) - if (!gst_rtp_buffer_validate (buf)) { - GST_ELEMENT_WARNING (rtpg729depay, STREAM, DECODE, - (NULL), ("G729 RTP packet did not validate")); payload_len = gst_rtp_buffer_get_payload_len (buf); /* At least 2 bytes (CNG from G729 Annex B) */ @@ -212,6 +203,12 @@ + /* marker bit starts talkspurt */ GST_DEBUG ("gst_rtp_g729_depay_chain: pushing buffer of size %d", GST_BUFFER_SIZE (outbuf)); @@ -219,12 +216,6 @@ - GST_ELEMENT_ERROR (rtpg729depay, STREAM, NOT_IMPLEMENTED, bad_packet: /* no fatal error */ Index: gstrtpg729depay.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpg729depay.h,v --- gstrtpg729depay.h 13 May 2008 08:35:48 -0000 1.1 +++ gstrtpg729depay.h 27 Oct 2008 11:03:49 -0000 1.2 @@ -46,8 +46,6 @@ gint channels; Index: gstrtpgsmdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpgsmdepay.c,v retrieving revision 1.32 retrieving revision 1.33 diff -u -d -r1.32 -r1.33 --- gstrtpgsmdepay.c 9 Jan 2008 11:10:59 -0000 1.32 +++ gstrtpgsmdepay.c 27 Oct 2008 11:03:49 -0000 1.33 @@ -118,11 +118,12 @@ srccaps = gst_caps_new_simple ("audio/x-gsm", @@ -137,14 +138,21 @@ gst_rtp_gsm_depay_process (GstBaseRTPDepayload * _depayload, GstBuffer * buf) + /* mark start of talkspurt with DISCONT */ Index: gstrtpgsmpay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpgsmpay.c,v --- gstrtpgsmpay.c 4 Oct 2007 07:29:48 -0000 1.32 +++ gstrtpgsmpay.c 27 Oct 2008 11:03:49 -0000 1.33 @@ -111,20 +111,26 @@ const char *stname; stname = gst_structure_get_name (structure); - if (0 == strcmp ("audio/x-gsm", stname)) { - gst_basertppayload_set_options (payload, "audio", FALSE, "GSM", 8000); - } else { - return FALSE; + if (strcmp ("audio/x-gsm", stname)) + goto invalid_type; - gst_basertppayload_set_outcaps (payload, NULL); + gst_basertppayload_set_options (payload, "audio", FALSE, "GSM", 8000); + res = gst_basertppayload_set_outcaps (payload, NULL); +invalid_type: + GST_WARNING_OBJECT (payload, "invalid media type received"); static GstFlowReturn Index: gstrtph263depay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtph263depay.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- gstrtph263depay.c 9 Jan 2008 11:11:00 -0000 1.5 +++ gstrtph263depay.c 27 Oct 2008 11:03:49 -0000 1.6 @@ -147,9 +147,10 @@ GstStructure *structure = gst_caps_get_structure (caps, 0); filter->clock_rate = clock_rate; srccaps = gst_caps_new_simple ("video/x-h263", @@ -164,22 +165,17 @@ gst_rtp_h263_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) GstRtpH263Depay *rtph263depay; guint8 *payload; guint header_len; guint SBIT, EBIT; gboolean F, P, M; gboolean I; rtph263depay = GST_RTP_H263_DEPAY (depayload); /* flush remaining data on discont */ if (GST_BUFFER_IS_DISCONT (buf)) { GST_LOG_OBJECT (depayload, "Discont buffer, flushing adapter"); @@ -326,13 +322,6 @@ - GST_ELEMENT_WARNING (rtph263depay, STREAM, DECODE, - ("Packet did not validate"), (NULL)); Index: gstrtph263pay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtph263pay.c,v retrieving revision 1.15 retrieving revision 1.16 diff -u -d -r1.15 -r1.16 --- gstrtph263pay.c 7 Sep 2007 18:04:41 -0000 1.15 +++ gstrtph263pay.c 27 Oct 2008 11:03:49 -0000 1.16 @@ -263,11 +263,12 @@ static gboolean gst_rtp_h263_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps) - payload->pt = GST_RTP_PAYLOAD_H263; gst_basertppayload_set_options (payload, "video", TRUE, "H263", 90000); static guint @@ -350,7 +351,8 @@ memcpy (payload, data + curpos, payload_len); - GST_BUFFER_TIMESTAMP (outbuf) = rtph263pay->first_ts; + GST_BUFFER_TIMESTAMP (outbuf) = rtph263pay->first_timestamp; + GST_BUFFER_DURATION (outbuf) = rtph263pay->first_duration; ret = gst_basertppayload_push (GST_BASE_RTP_PAYLOAD (rtph263pay), outbuf); @@ -373,7 +375,8 @@ rtph263pay = GST_RTP_H263_PAY (payload); size = GST_BUFFER_SIZE (buffer); - rtph263pay->first_ts = GST_BUFFER_TIMESTAMP (buffer); + rtph263pay->first_timestamp = GST_BUFFER_TIMESTAMP (buffer); + rtph263pay->first_duration = GST_BUFFER_DURATION (buffer); /* we always encode and flush a full picture */ gst_adapter_push (rtph263pay->adapter, buffer); Index: gstrtph263pay.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtph263pay.h,v retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- gstrtph263pay.h 1 Jun 2006 21:07:25 -0000 1.6 +++ gstrtph263pay.h 27 Oct 2008 11:03:49 -0000 1.7 @@ -45,7 +45,8 @@ GstBaseRTPPayload payload; GstAdapter *adapter; - GstClockTime first_ts; + GstClockTime first_timestamp; + GstClockTime first_duration; struct _GstRtpH263PayClass Index: gstrtph263pdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtph263pdepay.c,v retrieving revision 1.28 diff -u -d -r1.27 -r1.28 --- gstrtph263pdepay.c 2 May 2008 12:44:18 -0000 1.27 +++ gstrtph263pdepay.c 27 Oct 2008 11:03:49 -0000 1.28 @@ -156,10 +156,12 @@ GstCaps *srccaps = NULL; const gchar *encoding_name = NULL; @@ -216,10 +218,10 @@ if (!srccaps) goto no_caps; - gst_pad_set_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (filter), srccaps); + res = gst_pad_set_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (filter), srccaps); no_encoding_name: @@ -237,15 +239,11 @@ gst_rtp_h263p_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) GstRtpH263PDepay *rtph263pdepay; rtph263pdepay = GST_RTP_H263P_DEPAY (depayload); GST_LOG_OBJECT (depayload, "DISCONT, flushing adapter"); @@ -266,7 +264,7 @@ header_len = 2; if (payload_len < header_len) - goto bad_packet; + goto too_small; M = gst_rtp_buffer_get_marker (buf); @@ -292,7 +290,7 @@ if ((!P && payload_len < header_len) || (P && payload_len < header_len - 2)) if (P) { /* FIXME, have to make the packet writable hear. Better to reset these @@ -353,12 +351,6 @@ - GST_ELEMENT_WARNING (rtph263pdepay, STREAM, DECODE, GST_ELEMENT_WARNING (rtph263pdepay, STREAM, DECODE, Index: gstrtph263ppay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtph263ppay.c,v retrieving revision 1.24 retrieving revision 1.25 diff -u -d -r1.24 -r1.25 --- gstrtph263ppay.c 9 Jan 2008 11:11:00 -0000 1.24 +++ gstrtph263ppay.c 27 Oct 2008 11:03:49 -0000 1.25 @@ -168,7 +168,6 @@ GST_DEBUG_CATEGORY_INIT (rtph263ppay_debug, "rtph263ppay", 0, "rtph263ppay (RFC 4629)"); @@ -195,10 +194,12 @@ gst_rtp_h263p_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps) gst_basertppayload_set_options (payload, "video", TRUE, "H263-1998", 90000); @@ -237,8 +238,6 @@ gst_rtp_h263p_pay_flush (GstRtpH263PPay * rtph263ppay) @@ -332,7 +331,9 @@ payload[0] = (fragmented && !found_gob) ? 0x00 : 0x04; payload[1] = 0; - GST_BUFFER_TIMESTAMP (outbuf) = rtph263ppay->first_ts; + GST_BUFFER_TIMESTAMP (outbuf) = rtph263ppay->first_timestamp; + GST_BUFFER_DURATION (outbuf) = rtph263ppay->first_duration; gst_adapter_flush (rtph263ppay->adapter, towrite); ret = gst_basertppayload_push (GST_BASE_RTP_PAYLOAD (rtph263ppay), outbuf); @@ -355,7 +356,8 @@ rtph263ppay = GST_RTP_H263P_PAY (payload); - rtph263ppay->first_ts = GST_BUFFER_TIMESTAMP (buffer); + rtph263ppay->first_timestamp = GST_BUFFER_TIMESTAMP (buffer); + rtph263ppay->first_duration = GST_BUFFER_DURATION (buffer); gst_adapter_push (rtph263ppay->adapter, buffer); Index: gstrtph263ppay.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtph263ppay.h,v --- gstrtph263ppay.h 21 May 2007 08:57:18 -0000 1.9 +++ gstrtph263ppay.h 27 Oct 2008 11:03:50 -0000 1.10 @@ -51,7 +51,8 @@ GstBaseRTPPayload payload; GstAdapter *adapter; - GstClockTime first_ts; + GstClockTime first_timestamp; + GstClockTime first_duration; GstFragmentationMode fragmentation_mode; Index: gstrtph264depay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtph264depay.c,v retrieving revision 1.18 retrieving revision 1.19 diff -u -d -r1.18 -r1.19 --- gstrtph264depay.c 20 May 2008 11:33:05 -0000 1.18 +++ gstrtph264depay.c 27 Oct 2008 11:03:50 -0000 1.19 @@ -253,17 +253,19 @@ gst_rtp_h264_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) - GstCaps *srccaps = NULL; - gint clock_rate = 90000; GstRtpH264Depay *rtph264depay; const gchar *ps, *profile; GstBuffer *codec_data; guint8 *b64; rtph264depay = GST_RTP_H264_DEPAY (depayload); + clock_rate = 90000; srccaps = gst_caps_new_simple ("video/x-h264", NULL); @@ -395,15 +397,16 @@ "codec_data", GST_TYPE_BUFFER, codec_data, NULL); incomplete_caps: GST_DEBUG_OBJECT (depayload, "we have incomplete caps"); + gst_caps_unref (srccaps); return FALSE; @@ -419,9 +422,6 @@ gst_adapter_clear (rtph264depay->adapter); @@ -668,12 +668,6 @@ - GST_ELEMENT_WARNING (rtph264depay, STREAM, DECODE, - (NULL), ("Packet did not validate")); undefined_type: GST_ELEMENT_WARNING (rtph264depay, STREAM, DECODE, Index: gstrtph264pay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtph264pay.c,v retrieving revision 1.13 retrieving revision 1.14 diff -u -d -r1.13 -r1.14 --- gstrtph264pay.c 20 May 2008 13:57:44 -0000 1.13 +++ gstrtph264pay.c 27 Oct 2008 11:03:50 -0000 1.14 @@ -304,6 +304,8 @@ data += 2; size -= 2; + GST_LOG_OBJECT (rtph264pay, "SPS %d size %d", i, nal_size); if (size < nal_size) goto avcc_error; @@ -335,6 +337,8 @@ + GST_LOG_OBJECT (rtph264pay, "PPS %d size %d", i, nal_size); Index: gstrtpilbcdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpilbcdepay.c,v --- gstrtpilbcdepay.c 10 Aug 2007 17:08:01 -0000 1.13 +++ gstrtpilbcdepay.c 27 Oct 2008 11:03:50 -0000 1.14 @@ -30,7 +30,7 @@ static const GstElementDetails gst_rtp_ilbc_depay_details = GST_ELEMENT_DETAILS ("RTP iLBC packet depayloader", "Codec/Depayloader/Network", - "Extracts iLBC audio from RTP packets", + "Extracts iLBC audio from RTP packets (RFC 3952)", "Philippe Kalaf <phi...@co...>"); /* RtpiLBCDepay signals and args */ @@ -152,13 +152,17 @@ const gchar *mode_str = NULL; - gint mode; + gint mode, clock_rate; mode = rtpilbcdepay->mode; + clock_rate = 8000; /* parse mode, if we can */ mode_str = gst_structure_get_string (structure, "mode"); if (mode_str) { @@ -176,9 +180,6 @@ GST_DEBUG ("set caps on source: %" GST_PTR_FORMAT " (ret=%d)", srccaps, ret); - /* always fixed clock rate of 8000 */ @@ -186,14 +187,21 @@ gst_rtp_ilbc_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) Index: gstrtpilbcpay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpilbcpay.c,v retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- gstrtpilbcpay.c 7 May 2008 09:52:34 -0000 1.10 +++ gstrtpilbcpay.c 27 Oct 2008 11:03:50 -0000 1.11 @@ -131,20 +131,21 @@ - gst_structure_get_int (structure, "mode", &mode); - if (mode != 20 && mode != 30) - goto wrong_mode; payload_name = gst_structure_get_name (structure); if (g_ascii_strcasecmp ("audio/x-iLBC", payload_name)) goto wrong_caps; + if (!gst_structure_get_int (structure, "mode", &mode)) + goto no_mode; + if (mode != 20 && mode != 30) + goto wrong_mode; gst_basertppayload_set_options (basertppayload, "audio", TRUE, "ILBC", 8000); /* set options for this frame based audio codec */ gst_base_rtp_audio_payload_set_frame_options (basertpaudiopayload, mode, mode == 30 ? 50 : 38); mode_str = g_strdup_printf ("%d", mode); ret = gst_basertppayload_set_outcaps (basertppayload, "mode", G_TYPE_STRING, @@ -159,17 +160,22 @@ -wrong_mode: - GST_ERROR_OBJECT (rtpilbcpay, "mode must be 20 or 30, received %d", mode); wrong_caps: GST_ERROR_OBJECT (rtpilbcpay, "expected audio/x-iLBC, received %s", payload_name); +no_mode: + GST_ERROR_OBJECT (rtpilbcpay, "did not receive a mode"); +wrong_mode: + GST_ERROR_OBJECT (rtpilbcpay, "mode must be 20 or 30, received %d", mode); mode_changed: GST_ERROR_OBJECT (rtpilbcpay, "Mode has changed from %d to %d! " Index: gstrtpmp1sdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp1sdepay.c,v --- gstrtpmp1sdepay.c 5 Aug 2008 13:54:18 -0000 1.1 +++ gstrtpmp1sdepay.c 27 Oct 2008 11:03:50 -0000 1.2 @@ -134,20 +134,22 @@ GstRtpMP1SDepay *rtpmp1sdepay; rtpmp1sdepay = GST_RTP_MP1S_DEPAY (depayload); srccaps = gst_caps_new_simple ("video/mpeg", "systemstream", G_TYPE_BOOLEAN, TRUE, NULL); @@ -155,30 +157,15 @@ - gint payload_len; - if (G_UNLIKELY (!gst_rtp_buffer_validate (buf))) - payload_len = gst_rtp_buffer_get_payload_len (buf); - outbuf = gst_rtp_buffer_get_payload_subbuffer (buf, 0, -1); - gst_buffer_set_caps (outbuf, GST_PAD_CAPS (depayload->srcpad)); GST_DEBUG ("gst_rtp_mp1s_depay_chain: pushing buffer of size %d", - GST_ELEMENT_WARNING (rtpmp1sdepay, STREAM, DECODE, Index: gstrtpmp2tdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp2tdepay.c,v --- gstrtpmp2tdepay.c 9 Jan 2008 11:11:00 -0000 1.10 +++ gstrtpmp2tdepay.c 27 Oct 2008 11:03:50 -0000 1.11 @@ -148,21 +148,23 @@ GstRtpMP2TDepay *rtpmp2tdepay; rtpmp2tdepay = GST_RTP_MP2T_DEPAY (depayload); srccaps = gst_caps_new_simple ("video/mpegts", "packetsize", G_TYPE_INT, 188, @@ -174,9 +176,6 @@ if (G_UNLIKELY (payload_len <= rtpmp2tdepay->skip_first_bytes)) @@ -185,7 +184,6 @@ outbuf = gst_rtp_buffer_get_payload_subbuffer (buf, rtpmp2tdepay->skip_first_bytes, -1); GST_DEBUG ("gst_rtp_mp2t_depay_chain: pushing buffer of size %d", @@ -193,12 +191,6 @@ - GST_ELEMENT_WARNING (rtpmp2tdepay, STREAM, DECODE, GST_ELEMENT_WARNING (rtpmp2tdepay, STREAM, DECODE, Index: gstrtpmp4adepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4adepay.c,v retrieving revision 1.8 diff -u -d -r1.8 -r1.9 --- gstrtpmp4adepay.c 9 Jan 2008 11:11:00 -0000 1.8 +++ gstrtpmp4adepay.c 27 Oct 2008 11:03:50 -0000 1.9 @@ -138,20 +138,21 @@ GstRtpMP4ADepay *rtpmp4adepay; const gchar *str; - gint object_type = 2; /* AAC LC default */ + gint object_type; gint channels = 2; /* default */ rtpmp4adepay = GST_RTP_MP4A_DEPAY (depayload); - if (gst_structure_has_field (structure, "object")) - gst_structure_get_int (structure, "object", &object_type); + if (!gst_structure_get_int (structure, "object", &object_type)) + object_type = 2; /* AAC LC default */ srccaps = gst_caps_new_simple ("audio/mpeg", "mpegversion", G_TYPE_INT, 4, @@ -219,10 +220,10 @@ bad_config: @@ -233,9 +234,6 @@ gst_adapter_clear (rtpmp4adepay->adapter); @@ -322,12 +320,6 @@ - GST_ELEMENT_WARNING (rtpmp4adepay, STREAM, DECODE, wrong_size: GST_ELEMENT_WARNING (rtpmp4adepay, STREAM, DECODE, Index: gstrtpmp4apay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4apay.c,v --- gstrtpmp4apay.c 26 Sep 2008 13:55:48 -0000 1.1 +++ gstrtpmp4apay.c 27 Oct 2008 11:03:50 -0000 1.2 @@ -254,21 +254,24 @@ -static void +static gboolean gst_rtp_mp4a_pay_new_caps (GstRtpMP4APay * rtpmp4apay) gchar *config; GValue v = { 0 }; g_value_init (&v, GST_TYPE_BUFFER); gst_value_set_buffer (&v, rtpmp4apay->config); config = gst_value_serialize (&v); - gst_basertppayload_set_outcaps (GST_BASE_RTP_PAYLOAD (rtpmp4apay), + res = gst_basertppayload_set_outcaps (GST_BASE_RTP_PAYLOAD (rtpmp4apay), "cpresent", G_TYPE_STRING, "0", "config", G_TYPE_STRING, config, NULL); g_value_unset (&v); g_free (config); @@ -277,6 +280,7 @@ GstRtpMP4APay *rtpmp4apay; const GValue *codec_data; rtpmp4apay = GST_RTP_MP4A_PAY (payload); @@ -290,7 +294,6 @@ guint8 *config; guint8 *data; guint size, i; - gboolean res; buffer = gst_value_get_buffer (codec_data); GST_LOG_OBJECT (rtpmp4apay, "configuring codec_data"); @@ -339,9 +342,9 @@ gst_basertppayload_set_options (payload, "audio", TRUE, "MP4A-LATM", rtpmp4apay->rate); - gst_rtp_mp4a_pay_new_caps (rtpmp4apay); + res = gst_rtp_mp4a_pay_new_caps (rtpmp4apay); config_failed: Index: gstrtpmp4gdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gdepay.c,v --- gstrtpmp4gdepay.c 15 Sep 2008 21:10:23 -0000 1.18 +++ gstrtpmp4gdepay.c 27 Oct 2008 11:03:50 -0000 1.19 @@ -225,19 +225,20 @@ gst_rtp_mp4g_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) GstRtpMP4GDepay *rtpmp4gdepay; gint someint; rtpmp4gdepay = GST_RTP_MP4G_DEPAY (depayload); if ((str = gst_structure_get_string (structure, "media"))) { @@ -299,10 +300,10 @@ unknown_media: @@ -424,9 +425,6 @@ GST_DEBUG_OBJECT (rtpmp4gdepay, "received DISCONT"); @@ -628,7 +626,6 @@ avail = gst_adapter_available (rtpmp4gdepay->adapter); outbuf = gst_adapter_take_buffer (rtpmp4gdepay->adapter, avail); - gst_buffer_set_caps (outbuf, GST_PAD_CAPS (depayload->srcpad)); GST_DEBUG ("gst_rtp_mp4g_depay_chain: pushing buffer of size %d", GST_BUFFER_SIZE (outbuf)); @@ -640,12 +637,6 @@ - GST_ELEMENT_WARNING (rtpmp4gdepay, STREAM, DECODE, short_payload: GST_ELEMENT_WARNING (rtpmp4gdepay, STREAM, DECODE, Index: gstrtpmp4gpay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gpay.c,v retrieving revision 1.20 retrieving revision 1.21 diff -u -d -r1.20 -r1.21 --- gstrtpmp4gpay.c 12 Feb 2008 23:38:18 -0000 1.20 +++ gstrtpmp4gpay.c 27 Oct 2008 11:03:51 -0000 1.21 @@ -172,6 +172,7 @@ g_object_unref (rtpmp4gpay->adapter); rtpmp4gpay->adapter = NULL; g_free (rtpmp4gpay->params); rtpmp4gpay->params = NULL; @@ -326,11 +327,12 @@ gst_rtp_mp4g_pay_new_caps (GstRtpMP4GPay * rtpmp4gpay) #define MP4GCAPS \ "streamtype", G_TYPE_STRING, rtpmp4gpay->streamtype, \ @@ -348,10 +350,10 @@ /* hmm, silly */ if (rtpmp4gpay->params) { - gst_basertppayload_set_outcaps (GST_BASE_RTP_PAYLOAD (rtpmp4gpay), + res = gst_basertppayload_set_outcaps (GST_BASE_RTP_PAYLOAD (rtpmp4gpay), "encoding-params", G_TYPE_STRING, rtpmp4gpay->params, MP4GCAPS); } else { MP4GCAPS); @@ -359,6 +361,7 @@ #undef MP4GCAPS @@ -368,6 +371,7 @@ gchar *media_type = NULL; rtpmp4gpay = GST_RTP_MP4G_PAY (payload); @@ -379,7 +383,6 @@ if (G_VALUE_TYPE (codec_data) == GST_TYPE_BUFFER) { GstBuffer *buffer; const gchar *name; GST_LOG_OBJECT (rtpmp4gpay, "configuring codec_data"); @@ -412,9 +415,9 @@ gst_basertppayload_set_options (payload, media_type, TRUE, "MPEG4-GENERIC", rtpmp4gpay->rate); - gst_rtp_mp4g_pay_new_caps (rtpmp4gpay); + res = gst_rtp_mp4g_pay_new_caps (rtpmp4gpay); Index: gstrtpmp4vdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4vdepay.c,v retrieving revision 1.23 diff -u -d -r1.23 -r1.24 --- gstrtpmp4vdepay.c 9 Jan 2008 11:11:00 -0000 1.23 +++ gstrtpmp4vdepay.c 27 Oct 2008 11:03:51 -0000 1.24 @@ -136,14 +136,15 @@ GstRtpMP4VDepay *rtpmp4vdepay; rtpmp4vdepay = GST_RTP_MP4V_DEPAY (depayload); @@ -167,10 +168,10 @@ g_warning ("cannot convert config to buffer"); @@ -181,9 +182,6 @@ if (GST_BUFFER_IS_DISCONT (buf)) gst_adapter_clear (rtpmp4vdepay->adapter); @@ -198,7 +196,6 @@ avail = gst_adapter_available (rtpmp4vdepay->adapter); outbuf = gst_adapter_take_buffer (rtpmp4vdepay->adapter, avail); - gst_buffer_set_caps (outbuf, GST_PAD_CAPS (depayload->srcpad)); GST_DEBUG ("gst_rtp_mp4v_depay_chain: pushing buffer of size %d", @@ -206,13 +203,6 @@ return outbuf; - GST_ELEMENT_WARNING (rtpmp4vdepay, STREAM, DECODE, Index: gstrtpmp4vpay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4vpay.c,v retrieving revision 1.29 diff -u -d -r1.29 -r1.30 --- gstrtpmp4vpay.c 22 Oct 2007 09:53:16 -0000 1.29 +++ gstrtpmp4vpay.c 27 Oct 2008 11:03:51 -0000 1.30 @@ -192,18 +192,19 @@ G_OBJECT_CLASS (parent_class)->finalize (object); gst_rtp_mp4v_pay_new_caps (GstRtpMP4VPay * rtpmp4vpay) gchar *profile, *config; profile = g_strdup_printf ("%d", rtpmp4vpay->profile); gst_value_set_buffer (&v, rtpmp4vpay->config); - gst_basertppayload_set_outcaps (GST_BASE_RTP_PAYLOAD (rtpmp4vpay), + res = gst_basertppayload_set_outcaps (GST_BASE_RTP_PAYLOAD (rtpmp4vpay), "profile-level-id", G_TYPE_STRING, profile, "config", G_TYPE_STRING, config, NULL); @@ -211,6 +212,8 @@ g_free (profile); @@ -219,12 +222,15 @@ GstRtpMP4VPay *rtpmp4vpay; rtpmp4vpay = GST_RTP_MP4V_PAY (payload); gst_basertppayload_set_options (payload, "video", TRUE, "MP4V-ES", rtpmp4vpay->rate); + res = TRUE; codec_data = gst_structure_get_value (structure, "codec_data"); if (codec_data) { @@ -249,12 +255,12 @@ if (rtpmp4vpay->config) gst_buffer_unref (rtpmp4vpay->config); rtpmp4vpay->config = gst_buffer_copy (buffer); - gst_rtp_mp4v_pay_new_caps (rtpmp4vpay); + res = gst_rtp_mp4v_pay_new_caps (rtpmp4vpay); done: Index: gstrtpmpadepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmpadepay.c,v --- gstrtpmpadepay.c 9 Jan 2008 11:11:01 -0000 1.20 +++ gstrtpmpadepay.c 27 Oct 2008 11:03:51 -0000 1.21 @@ -115,16 +115,23 @@ GstRtpMPADepay *rtpmpadepay; + GstCaps *outcaps; rtpmpadepay = GST_RTP_MPA_DEPAY (depayload); + outcaps = gst_caps_new_simple ("audio/mpeg", NULL); + res = gst_pad_set_caps (depayload->srcpad, outcaps); + gst_caps_unref (outcaps); @@ -135,20 +142,18 @@ guint16 frag_offset; + gboolean marker; payload_len = gst_rtp_buffer_get_payload_len (buf); - payload = gst_rtp_buffer_get_payload (buf); if (payload_len <= 4) goto empty_packet; + payload = gst_rtp_buffer_get_payload (buf); /* strip off header * * 0 1 2 3 @@ -161,7 +166,12 @@ /* subbuffer skipping the 4 header bytes */ outbuf = gst_rtp_buffer_get_payload_subbuffer (buf, 4, -1); + marker = gst_rtp_buffer_get_marker (buf); + if (marker) { + /* mark start of talkspurt with discont */ + GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT); + } GST_DEBUG_OBJECT (rtpmpadepay, "gst_rtp_mpa_depay_chain: pushing buffer of size %d", @@ -173,20 +183,7 @@ - GST_ELEMENT_WARNING (rtpmpadepay, STREAM, DECODE, GST_ELEMENT_WARNING (rtpmpadepay, STREAM, DECODE, Index: gstrtpmpapay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmpapay.c,v diff -u -d -r1.19 -r1.20 --- gstrtpmpapay.c 29 Mar 2007 14:03:21 -0000 1.19 +++ gstrtpmpapay.c 27 Oct 2008 11:03:51 -0000 1.20 @@ -146,10 +146,12 @@ gst_rtp_mpa_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps) gst_basertppayload_set_options (payload, "audio", TRUE, "MPA", 90000); Index: gstrtpmpvdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmpvdepay.c,v --- gstrtpmpvdepay.c 9 Jan 2008 11:11:01 -0000 1.6 +++ gstrtpmpvdepay.c 27 Oct 2008 11:03:51 -0000 1.7 @@ -118,16 +118,25 @@ GstRtpMPVDepay *rtpmpvdepay; rtpmpvdepay = GST_RTP_MPV_DEPAY (depayload); + outcaps = gst_caps_new_simple ("video/mpeg", + "mpegversion", G_TYPE_INT, 2, + "systemstream", G_TYPE_BOOLEAN, FALSE, NULL); @@ -138,9 +147,6 @@ gint payload_len, payload_header; @@ -197,12 +203,7 @@ - GST_ELEMENT_WARNING (rtpmpvdepay, STREAM, DECODE, - (NULL), ("Packet did not validate.")); GST_ELEMENT_WARNING (rtpmpvdepay, STREAM, DECODE, Index: gstrtpmpvpay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmpvpay.c,v --- gstrtpmpvpay.c 25 Jan 2008 10:53:17 -0000 1.1 +++ gstrtpmpvpay.c 27 Oct 2008 11:03:51 -0000 1.2 @@ -118,15 +118,16 @@ gst_basertppayload_set_options (payload, "video", FALSE, "MPV", 90000); Index: gstrtppcmadepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtppcmadepay.c,v retrieving revision 1.12 diff -u -d -r1.12 -r1.13 --- gstrtppcmadepay.c 11 Jun 2007 10:21:13 -0000 1.12 +++ gstrtppcmadepay.c 27 Oct 2008 11:03:51 -0000 1.13 @@ -121,11 +121,12 @@ srccaps = gst_caps_new_simple ("audio/x-alaw", @@ -139,25 +140,27 @@ gst_rtp_pcma_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) + guint len; - srccaps = gst_caps_new_simple ("audio/x-alaw", - "channels", G_TYPE_INT, 1, "rate", G_TYPE_INT, 8000, NULL); + len = gst_rtp_buffer_get_payload_len (buf); + GST_BUFFER_DURATION (outbuf) = + gst_util_uint64_scale_int (len, GST_SECOND, depayload->clock_rate); Index: gstrtppcmapay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtppcmapay.c,v diff -u -d -r1.11 -r1.12 --- gstrtppcmapay.c 14 Mar 2007 22:21:26 -0000 1.11 +++ gstrtppcmapay.c 27 Oct 2008 11:03:51 -0000 1.12 @@ -110,12 +110,14 @@ gst_rtp_pcma_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps) payload->pt = GST_RTP_PAYLOAD_PCMA; - gst_basertppayload_set_options (payload, "audio", FALSE, "PCMA", 8000); + gst_basertppayload_set_options (payload, "audio", FALSE, "PCMA", 8000); gboolean Index: gstrtppcmudepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtppcmudepay.c,v --- gstrtppcmudepay.c 2 May 2008 12:44:18 -0000 1.12 +++ gstrtppcmudepay.c 27 Oct 2008 11:03:52 -0000 1.13 srccaps = gst_caps_new_simple ("audio/x-mulaw", @@ -139,30 +140,27 @@ gst_rtp_pcmu_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) guint len; - srccaps = gst_caps_new_simple ("audio/x-mulaw", len = gst_rtp_buffer_get_payload_len (buf); GST_BUFFER_DURATION (outbuf) = gst_util_uint64_scale_int (len, GST_SECOND, depayload->clock_rate); Index: gstrtppcmupay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtppcmupay.c,v --- gstrtppcmupay.c 14 Mar 2007 22:21:26 -0000 1.11 +++ gstrtppcmupay.c 27 Oct 2008 11:03:52 -0000 1.12 gst_rtp_pcmu_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps) payload->pt = GST_RTP_PAYLOAD_PCMU; - gst_basertppayload_set_options (payload, "audio", FALSE, "PCMU", 8000); + gst_basertppayload_set_options (payload, "audio", FALSE, "PCMU", 8000); Index: gstrtpspeexdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpspeexdepay.c,v retrieving revision 1.17 diff -u -d -r1.16 -r1.17 --- gstrtpspeexdepay.c 7 Jul 2008 15:34:12 -0000 1.16 +++ gstrtpspeexdepay.c 27 Oct 2008 11:03:52 -0000 1.17 @@ -104,7 +104,6 @@ gst_rtp_speex_depay_init (GstRtpSPEEXDepay * rtpspeexdepay, GstRtpSPEEXDepayClass * klass) - GST_BASE_RTP_DEPAYLOAD (rtpspeexdepay)->clock_rate = 8000; static gint @@ -134,12 +133,15 @@ GstBuffer *buf; guint8 *data; rtpspeexdepay = GST_RTP_SPEEX_DEPAY (depayload); if (!(params = gst_structure_get_string (structure, "encoding-params"))) @@ -181,15 +183,28 @@ data += 4; GST_WRITE_UINT32_LE (data, 0); /* reserved2 */ + srccaps = gst_caps_new_simple ("audio/x-speex", NULL); + gst_buffer_set_caps (buf, GST_PAD_CAPS (depayload->srcpad)); gst_base_rtp_depayload_push (GST_BASE_RTP_DEPAYLOAD (rtpspeexdepay), buf); buf = gst_buffer_new_and_alloc (sizeof (gst_rtp_speex_comment)); memcpy (GST_BUFFER_DATA (buf), gst_rtp_speex_comment, sizeof (gst_rtp_speex_comment)); + GST_DEBUG_OBJECT (depayload, "no clock-rate specified"); @@ -205,6 +220,8 @@ /* nothing special to be done */ + GST_BUFFER_DURATION (outbuf) = 20 * GST_MSECOND; Index: gstrtpspeexpay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpspeexpay.c,v --- gstrtpspeexpay.c 2 May 2008 12:34:22 -0000 1.15 +++ gstrtpspeexpay.c 27 Oct 2008 11:03:52 -0000 1.16 @@ -151,6 +151,7 @@ guint32 version, header_size, rate, mode, nb_channels; GstBaseRTPPayload *payload; gchar *cstr; /* we need the header string (8), the version string (20), the version * and the header length. */ @@ -190,11 +191,11 @@ gst_basertppayload_set_options (payload, "audio", FALSE, "SPEEX", rate); cstr = g_strdup_printf ("%d", nb_channels); - gst_basertppayload_set_outcaps (payload, "encoding-params", + res = gst_basertppayload_set_outcaps (payload, "encoding-params", G_TYPE_STRING, cstr, NULL); g_free (cstr); Index: gstrtpsv3vdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpsv3vdepay.c,v --- gstrtpsv3vdepay.c 9 Jan 2008 11:11:01 -0000 1.8 +++ gstrtpsv3vdepay.c 27 Oct 2008 11:03:52 -0000 1.9 @@ -123,32 +123,27 @@ gst_rtp_sv3v_depay_setcaps (GstBaseRTPDepayload * filter, GstCaps * caps) - gint clock_rate = 90000; // default + clock_rate = 90000; // default + /* will set caps later */ return TRUE; gst_rtp_sv3v_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) GstRtpSV3VDepay *rtpsv3vdepay; guint16 seq; rtpsv3vdepay = GST_RTP_SV3V_DEPAY (depayload); /* flush on sequence number gaps */ seq = gst_rtp_buffer_get_seq (buf); if (seq != rtpsv3vdepay->nextseq) { @@ -236,9 +231,6 @@ avail = gst_adapter_available (rtpsv3vdepay->adapter); outbuf = gst_adapter_take_buffer (rtpsv3vdepay->adapter, avail); - /* timestamp for complete buffer is that of last buffer as well */ - gst_buffer_set_caps (outbuf, GST_PAD_CAPS (depayload->srcpad)); return outbuf; @@ -248,7 +240,7 @@ GST_ELEMENT_WARNING (rtpsv3vdepay, STREAM, DECODE, + (N... [truncated message content] |
From: <wt...@ke...> - 2008-10-27 11:34:45
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Mon Oct 27 2008 11:28:44 UTC Log message: Patch by: Olivier Crete <tester at tester dot ca> * gst/rtp/gstrtpL16pay.c: (gst_rtp_L16_pay_class_init), (gst_rtp_L16_pay_setcaps), (gst_rtp_L16_pay_getcaps): Implement getcaps in rtpL16pay. Fixes #556484. Modified files: . : ChangeLog gst/rtp : gstrtpL16pay.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.3782&r2=1.3783 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpL16pay.c.diff?r1=1.27&r2=1.28 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.3782 retrieving revision 1.3783 diff -u -d -r1.3782 -r1.3783 --- ChangeLog 27 Oct 2008 11:03:46 -0000 1.3782 +++ ChangeLog 27 Oct 2008 11:28:28 -0000 1.3783 @@ -1,5 +1,13 @@ 2008-10-27 Wim Taymans <wim...@co...> + Patch by: Olivier Crete <tester at tester dot ca> + + * gst/rtp/gstrtpL16pay.c: (gst_rtp_L16_pay_class_init), + (gst_rtp_L16_pay_setcaps), (gst_rtp_L16_pay_getcaps): + Implement getcaps in rtpL16pay. Fixes #556484. +2008-10-27 Wim Taymans <wim...@co...> * gst/rtp/gstrtpL16depay.c: (gst_rtp_L16_depay_setcaps), (gst_rtp_L16_depay_process): Check if clock-rate and channels are valid. Index: gstrtpL16pay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpL16pay.c,v retrieving revision 1.27 retrieving revision 1.28 diff -u -d -r1.27 -r1.28 --- gstrtpL16pay.c 27 Oct 2008 11:03:48 -0000 1.27 +++ gstrtpL16pay.c 27 Oct 2008 11:28:30 -0000 1.28 @@ -58,12 +58,17 @@ "payload = (int) [ 96, 127 ], " "clock-rate = (int) [ 1, MAX ], " "encoding-name = (string) \"L16\", " - "channels = (int) [ 1, MAX ], " - "rate = (int) [ 1, MAX ];" + "channels = (int) [ 1, MAX ];" "application/x-rtp, " "media = (string) \"audio\", " - "payload = (int) { " GST_RTP_PAYLOAD_L16_STEREO_STRING ", " - GST_RTP_PAYLOAD_L16_MONO_STRING " }," "clock-rate = (int) 44100") + "encoding-name = (string) \"L16\", " + "payload = (int) " GST_RTP_PAYLOAD_L16_STEREO_STRING ", " + "clock-rate = (int) 44100;" + "application/x-rtp, " + "media = (string) \"audio\", " + "payload = (int) " GST_RTP_PAYLOAD_L16_MONO_STRING ", " + "clock-rate = (int) 44100") ); static void gst_rtp_L16_pay_class_init (GstRtpL16PayClass * klass); @@ -75,6 +80,8 @@ GstCaps * caps); static GstFlowReturn gst_rtp_L16_pay_handle_buffer (GstBaseRTPPayload * pad, GstBuffer * buffer); +static GstCaps *gst_rtp_L16_pay_getcaps (GstBaseRTPPayload * rtppayload, + GstPad * pad); static GstBaseRTPPayloadClass *parent_class = NULL; @@ -132,6 +139,7 @@ gobject_class->finalize = gst_rtp_L16_pay_finalize; gstbasertppayload_class->set_caps = gst_rtp_L16_pay_setcaps; + gstbasertppayload_class->get_caps = gst_rtp_L16_pay_getcaps; gstbasertppayload_class->handle_buffer = gst_rtp_L16_pay_handle_buffer; GST_DEBUG_CATEGORY_INIT (rtpL16pay_debug, "rtpL16pay", 0, @@ -164,6 +172,7 @@ GstStructure *structure; gint channels, rate; gboolean res; + gchar *params; rtpL16pay = GST_RTP_L16_PAY (basepayload); @@ -176,9 +185,13 @@ if (!gst_structure_get_int (structure, "channels", &channels)) goto no_channels; gst_basertppayload_set_options (basepayload, "audio", TRUE, "L16", rate); + params = g_strdup_printf ("%d", channels); res = gst_basertppayload_set_outcaps (basepayload, - "channels", G_TYPE_INT, channels, "rate", G_TYPE_INT, rate, NULL); + "encoding-params", G_TYPE_STRING, params, "channels", G_TYPE_INT, + channels, NULL); + g_free (params); rtpL16pay->rate = rate; rtpL16pay->channels = channels; @@ -273,6 +286,47 @@ return ret; } +static GstCaps * +gst_rtp_L16_pay_getcaps (GstBaseRTPPayload * rtppayload, GstPad * pad) +{ + GstCaps *otherpadcaps; + GstCaps *caps; + otherpadcaps = gst_pad_get_allowed_caps (rtppayload->srcpad); + caps = gst_caps_copy (gst_pad_get_pad_template_caps (pad)); + if (otherpadcaps) { + if (!gst_caps_is_empty (otherpadcaps)) { + GstStructure *structure; + gint channels; + gint pt; + gint rate; + structure = gst_caps_get_structure (otherpadcaps, 0); + if (gst_structure_get_int (structure, "channels", &channels)) { + gst_caps_set_simple (caps, "channels", G_TYPE_INT, channels, NULL); + } else if (gst_structure_get_int (structure, "payload", &pt)) { + if (pt == 10) + gst_caps_set_simple (caps, "channels", G_TYPE_INT, 2, NULL); + else if (pt == 11) + gst_caps_set_simple (caps, "channels", G_TYPE_INT, 1, NULL); + } + if (gst_structure_get_int (structure, "clock-rate", &rate)) { + gst_caps_set_simple (caps, "rate", G_TYPE_INT, rate, NULL); + if (pt == 10 || pt == 11) + gst_caps_set_simple (caps, "rate", G_TYPE_INT, 44100, NULL); + } + gst_caps_unref (otherpadcaps); + } + return caps; +} gboolean gst_rtp_L16_pay_plugin_init (GstPlugin * plugin) { |
From: <wt...@ke...> - 2008-10-28 10:08:05
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Tue Oct 28 2008 10:02:03 UTC Log message: * gst/rtp/gstrtpL16depay.c: (gst_rtp_L16_depay_setcaps): * gst/rtp/gstrtpL16pay.c: (gst_rtp_L16_pay_setcaps), (gst_rtp_L16_pay_getcaps): * gst/rtp/gstrtpchannels.c: (check_channels), (gst_rtp_channels_get_by_pos), (gst_rtp_channels_get_by_order), (gst_rtp_channels_create_default): * gst/rtp/gstrtpchannels.h: Add mappings for multichannel support. Does not completely just work because the getcaps function does not yet return the allowed channel mappings. See #556641. Modified files: . : ChangeLog gst/rtp : gstrtpL16depay.c gstrtpL16pay.c Added files: gst/rtp : gstrtpchannels.c gstrtpchannels.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.3784&r2=1.3785 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpL16depay.c.diff?r1=1.31&r2=1.32 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpL16pay.c.diff?r1=1.28&r2=1.29 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpchannels.c?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpchannels.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.3784 retrieving revision 1.3785 diff -u -d -r1.3784 -r1.3785 --- ChangeLog 28 Oct 2008 06:50:50 -0000 1.3784 +++ ChangeLog 28 Oct 2008 10:01:46 -0000 1.3785 @@ -1,3 +1,16 @@ +2008-10-28 Wim Taymans <wim...@co...> + + * gst/rtp/gstrtpL16depay.c: (gst_rtp_L16_depay_setcaps): + * gst/rtp/gstrtpL16pay.c: (gst_rtp_L16_pay_setcaps), + (gst_rtp_L16_pay_getcaps): + * gst/rtp/gstrtpchannels.c: (check_channels), + (gst_rtp_channels_get_by_pos), (gst_rtp_channels_get_by_order), + (gst_rtp_channels_create_default): + * gst/rtp/gstrtpchannels.h: + Add mappings for multichannel support. Does not completely just work + because the getcaps function does not yet return the allowed channel + mappings. See #556641. 2008-10-28 Stefan Kost <en...@us...> * gst/goom/Makefile.am: Index: gstrtpL16depay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpL16depay.c,v retrieving revision 1.31 retrieving revision 1.32 diff -u -d -r1.31 -r1.32 --- gstrtpL16depay.c 27 Oct 2008 11:03:48 -0000 1.31 +++ gstrtpL16depay.c 28 Oct 2008 10:01:48 -0000 1.32 @@ -24,7 +24,11 @@ #include <string.h> #include <stdlib.h> +#include <gst/audio/audio.h> +#include <gst/audio/multichannel.h> #include "gstrtpL16depay.h" +#include "gstrtpchannels.h" GST_DEBUG_CATEGORY_STATIC (rtpL16depay_debug); #define GST_CAT_DEFAULT (rtpL16depay_debug) @@ -146,6 +150,8 @@ gint channels; GstCaps *srccaps; gboolean res; + const gchar *channel_order; + const GstRTPChannelOrder *order; rtpL16depay = GST_RTP_L16_DEPAY (depayload); @@ -163,6 +169,7 @@ clock_rate = 44100; break; default: + /* no fixed mapping, we need channels and clock-rate */ channels = 0; clock_rate = 0; @@ -189,6 +196,25 @@ "depth", G_TYPE_INT, 16, "rate", G_TYPE_INT, clock_rate, "channels", G_TYPE_INT, channels, NULL); + /* add channel positions */ + channel_order = gst_structure_get_string (structure, "channel-order"); + order = gst_rtp_channels_get_by_order (channels, channel_order); + if (order) { + gst_audio_set_channel_positions (gst_caps_get_structure (srccaps, 0), + order->pos); + } else { + GstAudioChannelPosition *pos; + GST_ELEMENT_WARNING (rtpL16depay, STREAM, DECODE, + (NULL), ("Unknown channel order '%s' for %d channels", + GST_STR_NULL (channel_order), channels)); + /* create default NONE layout */ + pos = gst_rtp_channels_create_default (channels); + gst_audio_set_channel_positions (gst_caps_get_structure (srccaps, 0), pos); + g_free (pos); + } res = gst_pad_set_caps (depayload->srcpad, srccaps); gst_caps_unref (srccaps); Index: gstrtpL16pay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpL16pay.c,v retrieving revision 1.28 retrieving revision 1.29 diff -u -d -r1.28 -r1.29 --- gstrtpL16pay.c 27 Oct 2008 11:28:30 -0000 1.28 +++ gstrtpL16pay.c 28 Oct 2008 10:01:49 -0000 1.29 @@ -23,9 +23,12 @@ #include <gst/rtp/gstrtpbuffer.h> #include "gstrtpL16pay.h" GST_DEBUG_CATEGORY_STATIC (rtpL16pay_debug); #define GST_CAT_DEFAULT (rtpL16pay_debug) @@ -173,6 +176,8 @@ gint channels, rate; gchar *params; + GstAudioChannelPosition *pos; rtpL16pay = GST_RTP_L16_PAY (basepayload); @@ -185,13 +190,33 @@ if (!gst_structure_get_int (structure, "channels", &channels)) goto no_channels; + /* get the channel order */ + pos = gst_audio_get_channel_positions (structure); + if (pos) + order = gst_rtp_channels_get_by_pos (channels, pos); + else + order = NULL; gst_basertppayload_set_options (basepayload, "audio", TRUE, "L16", rate); params = g_strdup_printf ("%d", channels); - res = gst_basertppayload_set_outcaps (basepayload, - "encoding-params", G_TYPE_STRING, params, "channels", G_TYPE_INT, - channels, NULL); + if (!order && channels > 2) { + GST_ELEMENT_WARNING (rtpL16pay, STREAM, DECODE, + (NULL), ("Unknown channel order for %d channels", channels)); + if (order && order->name) { + res = gst_basertppayload_set_outcaps (basepayload, + "encoding-params", G_TYPE_STRING, params, "channels", G_TYPE_INT, + channels, "channel-order", G_TYPE_STRING, order->name, NULL); + channels, NULL); g_free (params); + g_free (pos); rtpL16pay->rate = rate; rtpL16pay->channels = channels; --- NEW FILE: gstrtpchannels.c --- /* GStreamer * Copyright (C) <2008> Wim Taymans <wim...@gm...> * * 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. */ #include <string.h> #include <stdlib.h> #include "gstrtpchannels.h" /* * RTP channel positions as discussed in RFC 3551 and also RFC 3555 * We can't really represent the described channel positions in GStreamer but we * implement a (very rough) approximation here. static gboolean check_channels (const GstRTPChannelOrder * order, const GstAudioChannelPosition * pos) { gint i; gboolean res = TRUE; for (i = 0; i < order->channels; i++) { if (order->pos[i] != pos[i]) { res = FALSE; break; } } return res; } /** * gst_rtp_channels_get_by_pos: * @channels: the amount of channels * @pos: a channel layout * Return a description of the channel layout. * Returns: a #GstRTPChannelOrder with the channel information or NULL when @pos * is not a valid layout. const GstRTPChannelOrder * gst_rtp_channels_get_by_pos (gint channels, const GstAudioChannelPosition * pos) const GstRTPChannelOrder *res = NULL; g_return_val_if_fail (pos != NULL, NULL); for (i = 0; channel_orders[i].pos; i++) { if (channel_orders[i].channels != channels) continue; if (check_channels (&channel_orders[i], pos)) { res = &channel_orders[i]; * gst_rtp_channels_create_default: * @order: a channel order * Get the channel order info the @order and @channels. * Returns: a #GstRTPChannelOrder with the channel information or NULL when * @order is not a know layout for @channels. gst_rtp_channels_get_by_order (gint channels, const gchar * order) /* no name but channels match, continue */ if (!channel_orders[i].name || !order) { /* compare names */ if (g_ascii_strcasecmp (channel_orders[i].name, order)) { * Create a default none channel mapping for @channels. * Returns: a #GstAudioChannelPosition with all the channel position info set to * #GST_AUDIO_CHANNEL_POSITION_NONE. GstAudioChannelPosition * gst_rtp_channels_create_default (gint channels) GstAudioChannelPosition *posn; g_return_val_if_fail (channels > 0, NULL); posn = g_new (GstAudioChannelPosition, channels); for (i = 0; i < channels; i++) posn[i] = GST_AUDIO_CHANNEL_POSITION_NONE; return posn; --- NEW FILE: gstrtpchannels.h --- #include <gst/audio/audio.h> #include <gst/audio/multichannel.h> typedef struct const gchar *name; gint channels; const GstAudioChannelPosition *pos; } GstRTPChannelOrder; static const GstAudioChannelPosition pos_4_1[] = { GST_AUDIO_CHANNEL_POSITION_FRONT_LEFT, GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT, GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT, GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT }; static const GstAudioChannelPosition pos_4_2[] = { GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER, GST_AUDIO_CHANNEL_POSITION_LFE static const GstAudioChannelPosition pos_4_3[] = { static const GstAudioChannelPosition pos_5_1[] = { GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT, GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER static const GstAudioChannelPosition pos_6_1[] = { static const GstAudioChannelPosition pos_6_2[] = { GST_AUDIO_CHANNEL_POSITION_LFE, static const GstAudioChannelPosition pos_8_1[] = { GST_AUDIO_CHANNEL_POSITION_REAR_LEFT, GST_AUDIO_CHANNEL_POSITION_REAR_RIGHT static const GstAudioChannelPosition pos_8_2[] = { static const GstAudioChannelPosition pos_8_3[] = { static const GstAudioChannelPosition pos_def_1[] = { GST_AUDIO_CHANNEL_POSITION_NONE static const GstAudioChannelPosition pos_def_2[] = { GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT static const GstAudioChannelPosition pos_def_3[] = { static const GstAudioChannelPosition pos_def_4[] = { static const GstAudioChannelPosition pos_def_5[] = { static const GstAudioChannelPosition pos_def_6[] = { static const GstRTPChannelOrder channel_orders[] = /* 4 channels */ { "DV.LRLsRs", 4, pos_4_1 }, { "DV.LRCS", 4, pos_4_2 }, { "DV.LRCWo", 4, pos_4_3 }, /* 5 channels */ { "DV.LRLsRsC", 5, pos_5_1 }, /* 6 channels */ { "DV.LRLsRsCS", 6, pos_6_1 }, { "DV.LmixRmixTWoQ1Q2", 6, pos_6_2 }, /* 8 channels */ { "DV.LRCWoLsRsLmixRmix", 8, pos_8_1 }, { "DV.LRCWoLs1Rs1Ls2Rs2", 8, pos_8_2 }, { "DV.LRCWoLsRsLcRc", 8, pos_8_3 }, /* default layouts */ { NULL, 1, pos_def_1 }, { NULL, 2, pos_def_2 }, { NULL, 3, pos_def_3 }, { NULL, 4, pos_def_4 }, { NULL, 5, pos_def_5 }, { NULL, 6, pos_def_6 }, /* terminator, invalid entry */ { NULL, 0, NULL }, const GstRTPChannelOrder * gst_rtp_channels_get_by_pos (gint channels, const GstAudioChannelPosition *pos); const GstRTPChannelOrder * gst_rtp_channels_get_by_order (gint channels, const gchar *order); GstAudioChannelPosition * gst_rtp_channels_create_default (gint channels); |
From: <wt...@ke...> - 2008-10-28 17:40:09
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Tue Oct 28 2008 17:40:03 UTC Log message: * gst/rtp/Makefile.am: Also commit updated makefile Modified files: . : ChangeLog gst/rtp : Makefile.am Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.3786&r2=1.3787 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/Makefile.am.diff?r1=1.51&r2=1.52 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.3786 retrieving revision 1.3787 diff -u -d -r1.3786 -r1.3787 --- ChangeLog 28 Oct 2008 14:56:06 -0000 1.3786 +++ ChangeLog 28 Oct 2008 17:39:46 -0000 1.3787 @@ -1,3 +1,8 @@ +2008-10-28 Wim Taymans <wim...@co...> + + * gst/rtp/Makefile.am: + Also commit updated makefile 2008-10-28 Sebastian Dröge <sl...@ci...> * gst/wavenc/gstwavenc.c: (gst_wavenc_chain): Index: Makefile.am RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/Makefile.am,v retrieving revision 1.51 retrieving revision 1.52 diff -u -d -r1.51 -r1.52 --- Makefile.am 26 Sep 2008 13:55:48 -0000 1.51 +++ Makefile.am 28 Oct 2008 17:39:48 -0000 1.52 @@ -3,6 +3,7 @@ libgstrtp_la_SOURCES = \ fnv1hash.c \ gstrtp.c \ + gstrtpchannels.c \ gstrtpdepay.c \ gstrtpac3depay.c \ gstrtpdvdepay.c \ @@ -62,12 +63,14 @@ libgstrtp_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) libgstrtp_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) \ + -lgstaudio-@GST_MAJORMINOR@ \ -lgsttag-@GST_MAJORMINOR@ \ -lgstrtp-@GST_MAJORMINOR@ $(WINSOCK2_LIBS) libgstrtp_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) noinst_HEADERS = \ fnv1hash.h \ + gstrtpchannels.h \ gstrtpL16depay.h \ gstrtpL16pay.h \ gstrtpac3depay.h \ |
From: <wt...@ke...> - 2008-10-28 17:42:22
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Tue Oct 28 2008 17:42:17 UTC Log message: * gst/rtp/gstrtpchannels.c: (gst_rtp_channels_get_by_index): * gst/rtp/gstrtpchannels.h: Add method to get possible channel positions. Modified files: . : ChangeLog gst/rtp : gstrtpchannels.c gstrtpchannels.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.3787&r2=1.3788 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpchannels.c.diff?r1=1.1&r2=1.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpchannels.h.diff?r1=1.1&r2=1.2 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.3787 retrieving revision 1.3788 diff -u -d -r1.3787 -r1.3788 --- ChangeLog 28 Oct 2008 17:39:46 -0000 1.3787 +++ ChangeLog 28 Oct 2008 17:42:00 -0000 1.3788 @@ -1,5 +1,11 @@ 2008-10-28 Wim Taymans <wim...@co...> + * gst/rtp/gstrtpchannels.c: (gst_rtp_channels_get_by_index): + * gst/rtp/gstrtpchannels.h: + Add method to get possible channel positions. + +2008-10-28 Wim Taymans <wim...@co...> * gst/rtp/Makefile.am: Also commit updated makefile Index: gstrtpchannels.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpchannels.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- gstrtpchannels.c 28 Oct 2008 10:01:49 -0000 1.1 +++ gstrtpchannels.c 28 Oct 2008 17:42:02 -0000 1.2 @@ -111,6 +111,37 @@ } /** + * gst_rtp_channels_get_by_index: + * @channels: the amount of channels + * @idx: the channel index to retrieve + * + * Get the allowed channel order descriptions for @channels. @idx can be used to + * retrieve the desired index. + * Returns: a #GstRTPChannelOrder at @idx, NULL when there are no valid channel + * orders. + */ +const GstRTPChannelOrder * +gst_rtp_channels_get_by_index (gint channels, guint idx) +{ + gint i; + const GstRTPChannelOrder *res = NULL; + for (i = 0; channel_orders[i].pos; i++) { + if (channel_orders[i].channels != channels) + continue; + if (idx == 0) { + res = &channel_orders[i]; + break; + } + idx--; + } + return res; +} +/** * gst_rtp_channels_create_default: * @channels: the amount of channels * Index: gstrtpchannels.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpchannels.h,v --- gstrtpchannels.h 28 Oct 2008 10:01:49 -0000 1.1 +++ gstrtpchannels.h 28 Oct 2008 17:42:02 -0000 1.2 @@ -181,5 +181,6 @@ const GstAudioChannelPosition *pos); const GstRTPChannelOrder * gst_rtp_channels_get_by_order (gint channels, const gchar *order); +const GstRTPChannelOrder * gst_rtp_channels_get_by_index (gint channels, guint idx); GstAudioChannelPosition * gst_rtp_channels_create_default (gint channels); |
From: <wt...@ke...> - 2008-10-29 18:28:43
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Wed Oct 29 2008 18:28:39 UTC Log message: * gst/rtp/gstrtpL16pay.c: (gst_rtp_L16_pay_flush), (gst_rtp_L16_pay_getcaps): Only put an integral amount of samples in the RTP packet. Fixes #556641. Modified files: . : ChangeLog gst/rtp : gstrtpL16pay.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.3788&r2=1.3789 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpL16pay.c.diff?r1=1.29&r2=1.30 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.3788 retrieving revision 1.3789 diff -u -d -r1.3788 -r1.3789 --- ChangeLog 28 Oct 2008 17:42:00 -0000 1.3788 +++ ChangeLog 29 Oct 2008 18:28:24 -0000 1.3789 @@ -1,3 +1,10 @@ +2008-10-29 Wim Taymans <wim...@co...> + + * gst/rtp/gstrtpL16pay.c: (gst_rtp_L16_pay_flush), + (gst_rtp_L16_pay_getcaps): + Only put an integral amount of samples in the RTP packet. + Fixes #556641. 2008-10-28 Wim Taymans <wim...@co...> * gst/rtp/gstrtpchannels.c: (gst_rtp_channels_get_by_index): Index: gstrtpL16pay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpL16pay.c,v retrieving revision 1.29 retrieving revision 1.30 diff -u -d -r1.29 -r1.30 --- gstrtpL16pay.c 28 Oct 2008 10:01:49 -0000 1.29 +++ gstrtpL16pay.c 29 Oct 2008 18:28:25 -0000 1.30 @@ -245,6 +245,10 @@ guint samples; GstClockTime duration; + /* calculate the amount of samples and round down the length */ + samples = len / (2 * rtpL16pay->channels); + len = samples * (2 * rtpL16pay->channels); /* now alloc output buffer */ outbuf = gst_rtp_buffer_new_allocate (len, 0, 0); @@ -255,7 +259,6 @@ 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; @@ -348,7 +351,6 @@ } gst_caps_unref (otherpadcaps); } - return caps; } |
From: <wt...@ke...> - 2008-10-30 10:31:56
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Thu Oct 30 2008 10:31:51 UTC Log message: * gst/rtp/gstrtpmpadepay.c: (gst_rtp_mpa_depay_setcaps): * gst/rtp/gstrtpmpapay.c: Narrow down the caps of the mpeg audio pay/depayloaders to only accept mpeg version 1. Fixes #558427. Modified files: . : ChangeLog gst/rtp : gstrtpmpadepay.c gstrtpmpapay.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.3789&r2=1.3790 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmpadepay.c.diff?r1=1.21&r2=1.22 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmpapay.c.diff?r1=1.20&r2=1.21 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.3789 retrieving revision 1.3790 diff -u -d -r1.3789 -r1.3790 --- ChangeLog 29 Oct 2008 18:28:24 -0000 1.3789 +++ ChangeLog 30 Oct 2008 10:31:23 -0000 1.3790 @@ -1,3 +1,10 @@ +2008-10-30 Wim Taymans <wim...@co...> + + * gst/rtp/gstrtpmpadepay.c: (gst_rtp_mpa_depay_setcaps): + * gst/rtp/gstrtpmpapay.c: + Narrow down the caps of the mpeg audio pay/depayloaders to only accept + mpeg version 1. Fixes #558427. 2008-10-29 Wim Taymans <wim...@co...> * gst/rtp/gstrtpL16pay.c: (gst_rtp_L16_pay_flush), Index: gstrtpmpadepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmpadepay.c,v retrieving revision 1.21 retrieving revision 1.22 diff -u -d -r1.21 -r1.22 --- gstrtpmpadepay.c 27 Oct 2008 11:03:51 -0000 1.21 +++ gstrtpmpadepay.c 30 Oct 2008 10:31:33 -0000 1.22 @@ -40,7 +40,7 @@ GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - GST_STATIC_CAPS ("audio/mpeg") + GST_STATIC_CAPS ("audio/mpeg, " "mpegversion = (int) 1") ); static GstStaticPadTemplate gst_rtp_mpa_depay_sink_template = @@ -127,7 +127,8 @@ clock_rate = 90000; depayload->clock_rate = clock_rate; - outcaps = gst_caps_new_simple ("audio/mpeg", NULL); + outcaps = + gst_caps_new_simple ("audio/mpeg", "mpegversion", G_TYPE_INT, 1, NULL); res = gst_pad_set_caps (depayload->srcpad, outcaps); gst_caps_unref (outcaps); Index: gstrtpmpapay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmpapay.c,v retrieving revision 1.20 diff -u -d -r1.20 -r1.21 --- gstrtpmpapay.c 27 Oct 2008 11:03:51 -0000 1.20 +++ gstrtpmpapay.c 30 Oct 2008 10:31:35 -0000 1.21 @@ -38,7 +38,7 @@ GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, static GstStaticPadTemplate gst_rtp_mpa_pay_src_template = |
From: <wt...@ke...> - 2008-11-11 17:29:22
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Tue Nov 11 2008 17:29:17 UTC Log message: Patch by: Olivier Crete <tester at tester dot ca> * gst/rtp/gstrtpg729pay.c: (gst_rtp_g729_pay_base_init), (gst_rtp_g729_pay_class_init), (gst_rtp_g729_pay_init), (gst_rtp_g729_pay_set_caps), (gst_rtp_g729_pay_handle_buffer): * gst/rtp/gstrtpg729pay.h: Replace G729 payloader with an improved version. Fixes #532409. Modified files: . : ChangeLog gst/rtp : gstrtpg729pay.c gstrtpg729pay.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.3805&r2=1.3806 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpg729pay.c.diff?r1=1.1&r2=1.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpg729pay.h.diff?r1=1.1&r2=1.2 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.3805 retrieving revision 1.3806 diff -u -d -r1.3805 -r1.3806 --- ChangeLog 11 Nov 2008 16:00:46 -0000 1.3805 +++ ChangeLog 11 Nov 2008 17:29:01 -0000 1.3806 @@ -1,5 +1,15 @@ 2008-11-11 Wim Taymans <wim...@co...> + Patch by: Olivier Crete <tester at tester dot ca> + + * gst/rtp/gstrtpg729pay.c: (gst_rtp_g729_pay_base_init), + (gst_rtp_g729_pay_class_init), (gst_rtp_g729_pay_init), + (gst_rtp_g729_pay_set_caps), (gst_rtp_g729_pay_handle_buffer): + * gst/rtp/gstrtpg729pay.h: + Replace G729 payloader with an improved version. Fixes #532409. +2008-11-11 Wim Taymans <wim...@co...> * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_create_transports_string), (gst_rtspsrc_change_state): Only send one transport at a time for improved compatibility with some Index: gstrtpg729pay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpg729pay.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- gstrtpg729pay.c 13 May 2008 08:35:52 -0000 1.1 +++ gstrtpg729pay.c 11 Nov 2008 17:29:03 -0000 1.2 @@ -1,4 +1,7 @@ /* GStreamer + * Copyright (C) <2007> Nokia Corporation + * Copyright (C) <2007> Collabora Ltd + * @author: Olivier Crete <oli...@co...> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -16,129 +19,282 @@ * Boston, MA 02111-1307, USA. */ +/* + * This payloader assumes that the data will ALWAYS come as zero or more + * 10 bytes frame of audio followed by 0 or 1 2 byte frame of silence. + * Any other buffer format won't work + */ #ifdef HAVE_CONFIG_H -#include "config.h" +#include <config.h> #endif -#include "gstrtpg729pay.h" +#include <string.h> #include <gst/rtp/gstrtpbuffer.h> +#include <gst/base/gstadapter.h> -/* elementfactory information */ -static GstElementDetails gst_rtpg729pay_details = { - "RTP Payloader for G729 Audio", - "Codec/Payloader/Network", - "Packetize G729 audio streams into RTP packets", - "Laurent Glayal <spg...@ya...>" -}; +#include "gstrtpg729pay.h" -GST_DEBUG_CATEGORY_STATIC (rtpg729pay_debug); -#define GST_CAT_DEFAULT (rtpg729pay_debug) +/* TODO: fix gstrtpbuffer.h */ +#undef GST_RTP_PAYLOAD_G729 +#define GST_RTP_PAYLOAD_G729 18 +#undef GST_RTP_PAYLOAD_G729_STRING +#define GST_RTP_PAYLOAD_G729_STRING "18" -static GstStaticPadTemplate gst_rtpg729pay_sink_template = +#define G729_FRAME_SIZE 10 +#define G729B_CN_FRAME_SIZE 2 +#define G729_FRAME_DURATION (10 * GST_MSECOND) +#define G729_FRAME_DURATION_MS (10) +static gboolean +gst_rtp_g729_pay_set_caps (GstBaseRTPPayload * payload, GstCaps * caps); +static GstFlowReturn +gst_rtp_g729_pay_handle_buffer (GstBaseRTPPayload * payload, GstBuffer * buf); +static const GstElementDetails gst_rtp_g729_pay_details = +GST_ELEMENT_DETAILS ("G729 RTP packet payloader", + "Codec/Payloader/Network", + "Packetize G729 audio into RTP packets", + "Olivier Crete <oli...@co...>"); +static GstStaticPadTemplate gst_rtp_g729_pay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - GST_STATIC_CAPS ("audio/G729, channels=(int)1, rate=(int)8000") + GST_STATIC_CAPS ("audio/G729, " /* according to RFC 3555 */ + "channels = (int) 1, " "rate = (int) 8000") ); -static GstStaticPadTemplate gst_rtpg729pay_src_template = +static GstStaticPadTemplate gst_rtp_g729_pay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"audio\", " - "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " - "clock-rate = (int) 8000, " "encoding-name = (string) \"G729\";" + "payload = (int) " GST_RTP_PAYLOAD_G729_STRING ", " + "clock-rate = (int) 8000, " + "encoding-name = (string) \"G729\"; " "application/x-rtp, " - "payload = (int) " GST_RTP_PAYLOAD_G729_STRING ", " - "clock-rate = (int) 8000") + "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " + "clock-rate = (int) 8000, " "encoding-name = (string) \"G729\"") -static gboolean gst_rtpg729pay_setcaps (GstBaseRTPPayload * payload, - GstCaps * caps); +static void +gst_rtp_g729_pay_init (GstRTPG729Pay * pay, GstRTPG729PayClass * klass); -GST_BOILERPLATE (GstRtpG729Pay, gst_rtpg729pay, GstBaseRTPAudioPayload, +GST_BOILERPLATE (GstRTPG729Pay, gst_rtp_g729_pay, GstBaseRTPAudioPayload, GST_TYPE_BASE_RTP_AUDIO_PAYLOAD); static void -gst_rtpg729pay_base_init (gpointer klass) +gst_rtp_g729_pay_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_rtpg729pay_sink_template)); + gst_static_pad_template_get (&gst_rtp_g729_pay_sink_template)); - gst_static_pad_template_get (&gst_rtpg729pay_src_template)); - gst_element_class_set_details (element_class, &gst_rtpg729pay_details); + gst_static_pad_template_get (&gst_rtp_g729_pay_src_template)); + gst_element_class_set_details (element_class, &gst_rtp_g729_pay_details); } -gst_rtpg729pay_class_init (GstRtpG729PayClass * klass) +gst_rtp_g729_pay_class_init (GstRTPG729PayClass * klass) - GObjectClass *gobject_class; - GstElementClass *gstelement_class; - GstBaseRTPPayloadClass *gstbasertppayload_class; - - gobject_class = (GObjectClass *) klass; - gstelement_class = (GstElementClass *) klass; - gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; - parent_class = g_type_class_ref (GST_TYPE_BASE_RTP_PAYLOAD); - gstbasertppayload_class->set_caps = gst_rtpg729pay_setcaps; + GstBaseRTPPayloadClass *payload_class = GST_BASE_RTP_PAYLOAD_CLASS (klass); - GST_DEBUG_CATEGORY_INIT (rtpg729pay_debug, "rtpg729pay", 0, - "G729 audio RTP payloader"); + payload_class->set_caps = gst_rtp_g729_pay_set_caps; + payload_class->handle_buffer = gst_rtp_g729_pay_handle_buffer; -gst_rtpg729pay_init (GstRtpG729Pay * rtpg729pay, GstRtpG729PayClass * klass) +gst_rtp_g729_pay_init (GstRTPG729Pay * pay, GstRTPG729PayClass * klass) - GstBaseRTPPayload *basertppayload; - GstBaseRTPAudioPayload *basertpaudiopayload; + GstBaseRTPPayload *payload = GST_BASE_RTP_PAYLOAD (pay); + GstBaseRTPAudioPayload *audiopayload = GST_BASE_RTP_AUDIO_PAYLOAD (pay); - basertppayload = GST_BASE_RTP_PAYLOAD (rtpg729pay); - basertpaudiopayload = GST_BASE_RTP_AUDIO_PAYLOAD (rtpg729pay); + payload->pt = GST_RTP_PAYLOAD_G729; + gst_basertppayload_set_options (payload, "audio", FALSE, "G729", 8000); - /* we don't set the payload type, it should be set by the application using - * the pt property or the default 96 will be used */ - basertppayload->clock_rate = 8000; + gst_base_rtp_audio_payload_set_frame_based (audiopayload); + gst_base_rtp_audio_payload_set_frame_options (audiopayload, + G729_FRAME_DURATION_MS, G729_FRAME_SIZE); - /* tell basertpaudiopayload that this is a frame based codec */ - gst_base_rtp_audio_payload_set_frame_based (basertpaudiopayload); - gst_basertppayload_set_options (basertppayload, "audio", FALSE, "G729", 8000); - gst_base_rtp_audio_payload_set_frame_options (basertpaudiopayload, 10, 10); static gboolean -gst_rtpg729pay_setcaps (GstBaseRTPPayload * basertppayload, GstCaps * caps) +gst_rtp_g729_pay_set_caps (GstBaseRTPPayload * payload, GstCaps * caps) - GstRtpG729Pay *rtpg729pay; - gboolean ret; GstStructure *structure; - const char *payload_name; - rtpg729pay = GST_RTP_G729_PAY (basertppayload); - basertpaudiopayload = GST_BASE_RTP_AUDIO_PAYLOAD (basertppayload); + gint pt; structure = gst_caps_get_structure (caps, 0); + if (!gst_structure_get_int (structure, "payload", &pt)) + pt = GST_RTP_PAYLOAD_G729; - payload_name = gst_structure_get_name (structure); - if (g_strcasecmp ("audio/G729", payload_name) != 0) - goto wrong_name; + payload->pt = pt; + payload->dynamic = pt != GST_RTP_PAYLOAD_G729; - ret = gst_basertppayload_set_outcaps (basertppayload, NULL); + gst_basertppayload_set_outcaps (payload, NULL); + return TRUE; +} +gst_rtp_g729_pay_handle_buffer (GstBaseRTPPayload * payload, GstBuffer * buf) +{ + GstFlowReturn ret = GST_FLOW_OK; + GstBaseRTPAudioPayload *basertpaudiopayload = + GST_BASE_RTP_AUDIO_PAYLOAD (payload); + GstAdapter *adapter = NULL; + guint payload_len; + const guint8 *data = NULL; + guint available; + guint maxptime_octets = G_MAXUINT; + guint minptime_octets = 0; + guint min_payload_len; + guint max_payload_len; + gboolean use_adapter = FALSE; + available = GST_BUFFER_SIZE (buf); + if (available % G729_FRAME_SIZE != 0 && + available % G729_FRAME_SIZE != G729B_CN_FRAME_SIZE) + goto invalid_size; + /* max number of bytes based on given ptime, has to be multiple of + * frame_duration */ + if (payload->max_ptime != -1) { + guint ptime_ms = payload->max_ptime / 1000000; + maxptime_octets = G729_FRAME_SIZE * + (int) (ptime_ms / G729_FRAME_DURATION_MS); + if (maxptime_octets < G729_FRAME_SIZE) { + GST_WARNING_OBJECT (basertpaudiopayload, "Given ptime %d is smaller than" + " minimum %d ns, overwriting to minimum", + payload->max_ptime, G729_FRAME_DURATION_MS); + maxptime_octets = G729_FRAME_SIZE; + } + } + max_payload_len = MIN ( + /* MTU max */ + (int) (gst_rtp_buffer_calc_payload_len (GST_BASE_RTP_PAYLOAD_MTU + (basertpaudiopayload), 0, 0) / G729_FRAME_SIZE) * G729_FRAME_SIZE, + /* ptime max */ + maxptime_octets); + /* min number of bytes based on a given ptime, has to be a multiple + of frame duration */ + { + guint64 min_ptime; + g_object_get (G_OBJECT (payload), "min-ptime", &min_ptime, NULL); + min_ptime = min_ptime / 1000000; + minptime_octets = G729_FRAME_SIZE * + (int) (min_ptime / G729_FRAME_DURATION_MS); + min_payload_len = MAX (minptime_octets, G729_FRAME_SIZE); + if (min_payload_len > max_payload_len) { + min_payload_len = max_payload_len; + GST_DEBUG_OBJECT (basertpaudiopayload, + "Calculated min_payload_len %u and max_payload_len %u", + min_payload_len, max_payload_len); + adapter = gst_base_rtp_audio_payload_get_adapter (basertpaudiopayload); + if (adapter && gst_adapter_available (adapter)) { + /* If there is always data in the adapter, we have to use it */ + gst_adapter_push (adapter, buf); + available = gst_adapter_available (adapter); + use_adapter = TRUE; + } else { + /* let's set the base timestamp */ + basertpaudiopayload->base_ts = GST_BUFFER_TIMESTAMP (buf); + /* If buffer fits on an RTP packet, let's just push it through */ + /* this will check against max_ptime and max_mtu */ + if (GST_BUFFER_SIZE (buf) >= min_payload_len && + GST_BUFFER_SIZE (buf) <= max_payload_len) { + ret = gst_base_rtp_audio_payload_push (basertpaudiopayload, + GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf), + GST_BUFFER_TIMESTAMP (buf)); + gst_buffer_unref (buf); + return ret; + available = GST_BUFFER_SIZE (buf); + data = (guint8 *) GST_BUFFER_DATA (buf); + /* as long as we have full frames */ + /* this loop will push all available buffers till the last frame */ + while (available >= min_payload_len || + available % G729_FRAME_SIZE == G729B_CN_FRAME_SIZE) { + guint num; + /* We send as much as we can */ + if (available <= max_payload_len) { + payload_len = available; + } else { + payload_len = MIN (max_payload_len, + (available / G729_FRAME_SIZE) * G729_FRAME_SIZE); + if (use_adapter) { + data = gst_adapter_peek (adapter, payload_len); + ret = gst_base_rtp_audio_payload_push (basertpaudiopayload, data, + payload_len, basertpaudiopayload->base_ts); + num = payload_len / G729_FRAME_SIZE; + basertpaudiopayload->base_ts += G729_FRAME_DURATION * num; + gst_adapter_flush (adapter, payload_len); + available = gst_adapter_available (adapter); + available -= payload_len; + data += payload_len; + if (!use_adapter) { + if (available != 0 && adapter) { + GstBuffer *buf2; + buf2 = gst_buffer_create_sub (buf, + GST_BUFFER_SIZE (buf) - available, available); + gst_adapter_push (adapter, buf2); + if (adapter) { + g_object_unref (adapter); return ret; /* ERRORS */ -wrong_name: +invalid_size: { - GST_ERROR_OBJECT (rtpg729pay, "wrong name, expected 'audio/G729', got '%s'", - payload_name); - return FALSE; + GST_ELEMENT_ERROR (payload, STREAM, WRONG_TYPE, + ("Invalid input buffer size"), + ("Invalid buffer size, should be a multiple of" + " G729_FRAME_SIZE(10) with an optional G729B_CN_FRAME_SIZE(2)" + " added to it, but it is %u", available)); + gst_buffer_unref (buf); + return GST_FLOW_ERROR; } Index: gstrtpg729pay.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpg729pay.h,v --- gstrtpg729pay.h 13 May 2008 08:35:55 -0000 1.1 +++ gstrtpg729pay.h 11 Nov 2008 17:29:03 -0000 1.2 @@ -1,4 +1,6 @@ @@ -25,25 +27,25 @@ G_BEGIN_DECLS #define GST_TYPE_RTP_G729_PAY \ - (gst_rtpg729pay_get_type()) + (gst_rtp_g729_pay_get_type()) #define GST_RTP_G729_PAY(obj) \ - (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_G729_PAY,GstRtpG729Pay)) + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_G729_PAY,GstRTPG729Pay)) #define GST_RTP_G729_PAY_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_G729_PAY,GstRtpG729PayClass)) + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_G729_PAY,GstRTPG729PayClass)) #define GST_IS_RTP_G729_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_G729_PAY)) #define GST_IS_RTP_G729_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_G729_PAY)) -typedef struct _GstRtpG729Pay GstRtpG729Pay; -typedef struct _GstRtpG729PayClass GstRtpG729PayClass; +typedef struct _GstRTPG729Pay GstRTPG729Pay; +typedef struct _GstRTPG729PayClass GstRTPG729PayClass; -struct _GstRtpG729Pay +struct _GstRTPG729Pay GstBaseRTPAudioPayload audiopayload; }; -struct _GstRtpG729PayClass +struct _GstRTPG729PayClass GstBaseRTPAudioPayloadClass parent_class; |
From: <wt...@ke...> - 2008-11-11 17:33:22
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Tue Nov 11 2008 17:33:14 UTC Log message: * gst/rtp/gstrtpg729pay.c: (gst_rtp_g729_pay_set_caps): Don't ignore the return value of setcaps. Modified files: . : ChangeLog gst/rtp : gstrtpg729pay.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.3806&r2=1.3807 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpg729pay.c.diff?r1=1.2&r2=1.3 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.3806 retrieving revision 1.3807 diff -u -d -r1.3806 -r1.3807 --- ChangeLog 11 Nov 2008 17:29:01 -0000 1.3806 +++ ChangeLog 11 Nov 2008 17:32:58 -0000 1.3807 @@ -1,5 +1,10 @@ 2008-11-11 Wim Taymans <wim...@co...> + * gst/rtp/gstrtpg729pay.c: (gst_rtp_g729_pay_set_caps): + Don't ignore the return value of setcaps. + +2008-11-11 Wim Taymans <wim...@co...> Patch by: Olivier Crete <tester at tester dot ca> * gst/rtp/gstrtpg729pay.c: (gst_rtp_g729_pay_base_init), Index: gstrtpg729pay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpg729pay.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- gstrtpg729pay.c 11 Nov 2008 17:29:03 -0000 1.2 +++ gstrtpg729pay.c 11 Nov 2008 17:33:00 -0000 1.3 @@ -126,6 +126,7 @@ static gboolean gst_rtp_g729_pay_set_caps (GstBaseRTPPayload * payload, GstCaps * caps) { + gboolean res; GstStructure *structure; gint pt; @@ -136,9 +137,9 @@ payload->pt = pt; payload->dynamic = pt != GST_RTP_PAYLOAD_G729; - gst_basertppayload_set_outcaps (payload, NULL); + res = gst_basertppayload_set_outcaps (payload, NULL); - return TRUE; + return res; } static GstFlowReturn |
From: <wt...@ke...> - 2008-11-13 14:04:58
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Thu Nov 13 2008 14:04:55 UTC Log message: Patch by: Yotam <sh dot yotam at gmail dot com> * gst/rtp/gstrtpmp4vpay.c: (gst_rtp_mp4v_pay_event): Flush the remaining frames on EOS. Fixes #560641. Modified files: . : ChangeLog gst/rtp : gstrtpmp4vpay.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.3810&r2=1.3811 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4vpay.c.diff?r1=1.30&r2=1.31 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.3810 retrieving revision 1.3811 diff -u -d -r1.3810 -r1.3811 --- ChangeLog 12 Nov 2008 16:37:04 -0000 1.3810 +++ ChangeLog 13 Nov 2008 14:04:36 -0000 1.3811 @@ -1,3 +1,10 @@ +2008-11-13 Wim Taymans <wim...@co...> + + Patch by: Yotam <sh dot yotam at gmail dot com> + * gst/rtp/gstrtpmp4vpay.c: (gst_rtp_mp4v_pay_event): + Flush the remaining frames on EOS. Fixes #560641. 2008-11-12 Jan Schmidt <jan...@su...> * gst/rtp/gstrtpg729pay.c: (gst_rtp_g729_pay_handle_buffer): Index: gstrtpmp4vpay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4vpay.c,v retrieving revision 1.30 retrieving revision 1.31 diff -u -d -r1.30 -r1.31 --- gstrtpmp4vpay.c 27 Oct 2008 11:03:51 -0000 1.30 +++ gstrtpmp4vpay.c 13 Nov 2008 14:04:40 -0000 1.31 @@ -1,5 +1,5 @@ /* GStreamer - * Copyright (C) <2005> Wim Taymans <wi...@fl...> + * Copyright (C) <2005> Wim Taymans <wim...@gm...> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -35,7 +35,7 @@ GST_ELEMENT_DETAILS ("RTP MPEG-4 Video packet payloader", "Codec/Payloader/Network", "Payload MPEG-4 video as RTP packets (RFC 3016)", - "Wim Taymans <wi...@fl...>"); + "Wim Taymans <wim...@gm...>"); static GstStaticPadTemplate gst_rtp_mp4v_pay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", @@ -495,6 +495,9 @@ switch (GST_EVENT_TYPE (event)) { case GST_EVENT_NEWSEGMENT: + case GST_EVENT_EOS: + /* This flush call makes sure that the last buffer is always pushed + * to the base payloader */ gst_rtp_mp4v_pay_flush (rtpmp4vpay); break; case GST_EVENT_FLUSH_STOP: |
From: <wt...@ke...> - 2008-11-14 11:42:56
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Fri Nov 14 2008 11:42:10 UTC Log message: Patch by: Bjorn Ostby <bjornos at axis dot com> * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: (plugin_init): * gst/rtp/gstrtpjpegpay.c: (gst_rtp_jpeg_pay_base_init), (gst_rtp_jpeg_pay_class_init), (gst_rtp_jpeg_pay_init), (gst_rtp_jpeg_pay_setcaps), (gst_rtp_jpeg_pay_header_size), (gst_rtp_jpeg_pay_read_quant_table), (gst_rtp_jpeg_pay_scan_marker), (gst_rtp_jpeg_pay_handle_buffer), (gst_rtp_jpeg_pay_set_property), (gst_rtp_jpeg_pay_get_property), (gst_rtp_jpeg_pay_plugin_init): * gst/rtp/gstrtpjpegpay.h: Add JPEG payloader. Fixes #560756. Modified files: . : ChangeLog gst/rtp : Makefile.am gstrtp.c Added files: gst/rtp : gstrtpjpegpay.c gstrtpjpegpay.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.3815&r2=1.3816 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/Makefile.am.diff?r1=1.53&r2=1.54 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtp.c.diff?r1=1.46&r2=1.47 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpjpegpay.c?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpjpegpay.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.3815 retrieving revision 1.3816 diff -u -d -r1.3815 -r1.3816 --- ChangeLog 13 Nov 2008 17:45:57 -0000 1.3815 +++ ChangeLog 14 Nov 2008 11:41:53 -0000 1.3816 @@ -1,3 +1,19 @@ +2008-11-14 Wim Taymans <wim...@co...> + + Patch by: Bjorn Ostby <bjornos at axis dot com> + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: (plugin_init): + * gst/rtp/gstrtpjpegpay.c: (gst_rtp_jpeg_pay_base_init), + (gst_rtp_jpeg_pay_class_init), (gst_rtp_jpeg_pay_init), + (gst_rtp_jpeg_pay_setcaps), (gst_rtp_jpeg_pay_header_size), + (gst_rtp_jpeg_pay_read_quant_table), + (gst_rtp_jpeg_pay_scan_marker), (gst_rtp_jpeg_pay_handle_buffer), + (gst_rtp_jpeg_pay_set_property), (gst_rtp_jpeg_pay_get_property), + (gst_rtp_jpeg_pay_plugin_init): + * gst/rtp/gstrtpjpegpay.h: + Add JPEG payloader. Fixes #560756. 2008-11-13 Wim Taymans <wim...@co...> Patch by: Fabricio Godoy <skarllot at gmail dot com> Index: Makefile.am RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/Makefile.am,v retrieving revision 1.53 retrieving revision 1.54 diff -u -d -r1.53 -r1.54 --- Makefile.am 4 Nov 2008 12:28:29 -0000 1.53 +++ Makefile.am 14 Nov 2008 11:41:55 -0000 1.54 @@ -32,6 +32,7 @@ gstrtph263pay.c \ gstrtph264depay.c \ gstrtph264pay.c \ + gstrtpjpegpay.c \ gstrtpL16depay.c \ gstrtpL16pay.c \ gstasteriskh263.c \ @@ -101,6 +102,7 @@ gstrtph263pay.h \ gstrtph264depay.h \ gstrtph264pay.h \ + gstrtpjpegpay.h \ gstrtpmp1sdepay.h \ gstrtpmp2tdepay.h \ gstrtpmp2tpay.h \ Index: gstrtp.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtp.c,v retrieving revision 1.46 retrieving revision 1.47 diff -u -d -r1.46 -r1.47 --- gstrtp.c 26 Sep 2008 13:55:48 -0000 1.46 +++ gstrtp.c 14 Nov 2008 11:41:55 -0000 1.47 @@ -49,6 +49,7 @@ #include "gstrtph263pay.h" #include "gstrtph264depay.h" #include "gstrtph264pay.h" +#include "gstrtpjpegpay.h" #include "gstrtpL16depay.h" #include "gstrtpL16pay.h" #include "gstasteriskh263.h" @@ -158,6 +159,9 @@ if (!gst_rtp_h264_pay_plugin_init (plugin)) return FALSE; + if (!gst_rtp_jpeg_pay_plugin_init (plugin)) + return FALSE; if (!gst_rtp_L16_pay_plugin_init (plugin)) --- NEW FILE: gstrtpjpegpay.c --- /* GStreamer * Copyright (C) 2008 Axis Communications <dev...@ax...> * @author Bjorn Ostby <bjo...@ax...> * @author Peter Kjellerstedt <pet...@ax...> * * 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. */ /** * SECTION:rtpjpegpay * @short_description: RTP payloader for JPEG pictures * Payload encode JPEG pictures into RTP packets according to RFC 2435. * For detailed information see: http://www.rfc-editor.org/rfc/rfc2435.txt * The payloader takes a JPEG picture, scans the header for quantization * tables (if needed) and constructs the RTP packet header followed by * the actual JPEG entropy scan. * The payloader assumes that correct width and height is found in the caps. #ifdef HAVE_CONFIG_H # include "config.h" #endif #include <string.h> #include <gst/rtp/gstrtpbuffer.h> #include "gstrtpjpegpay.h" /* elementfactory information */ static const GstElementDetails gst_rtp_jpeg_pay_details = GST_ELEMENT_DETAILS ("RTP packet payloader", "Codec/Payloader/Network", "Payload-encodes JPEG pictures into a RTP packet", "Axis Communications <dev...@ax...>"); static GstStaticPadTemplate gst_rtp_jpeg_pay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("image/jpeg, " " height = (int) [0, 2040], " " width = (int) [0, 2040]; " "video/x-jpeg, " " height = (int) [0, 2040], " " width = (int) [0, 2040]") ); static GstStaticPadTemplate gst_rtp_jpeg_pay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_STATIC_CAPS ("application/x-rtp, " " media = (string) \"video\", " " payload = (int) 26 , " " clock-rate = (int) 90000, " " encoding-name = (string) \"JPEG\"") GST_DEBUG_CATEGORY_STATIC (rtpjpegpay_debug); #define GST_CAT_DEFAULT (rtpjpegpay_debug) * QUANT_PREFIX_LEN: * Prefix length in the header before the quantization tables: * Two size bytes and one byte for precision #define QUANT_PREFIX_LEN 3 * DEFAULT_JPEG_QUALITY: #define DEFAULT_JPEG_QUALITY 0 * DEFAULT_JPEG_TYPE: #define DEFAULT_JPEG_TYPE 0 typedef enum _RtpJpegMarker RtpJpegMarker; * RtpJpegMarker: * @JPEG_MARKER: Prefix for JPEG marker * @JPEG_MARKER_SOI: Start of Image marker * @JPEG_MARKER_JFIF: JFIF marker * @JPEG_MARKER_CMT: Comment marker * @JPEG_MARKER_DQT: Define Quantization Table marker * @JPEG_MARKER_SOF: Start of Frame marker * @JPEG_MARKER_DHT: Define Huffman Table marker * @JPEG_MARKER_SOS: Start of Scan marker * @JPEG_MARKER_EOI: End of Image marker * Identifers for markers in JPEG header enum _RtpJpegMarker { JPEG_MARKER = 0xFF, JPEG_MARKER_SOI = 0xD8, JPEG_MARKER_JFIF = 0xE0, JPEG_MARKER_CMT = 0xFE, JPEG_MARKER_DQT = 0xDB, JPEG_MARKER_SOF = 0xC0, JPEG_MARKER_DHT = 0xC4, JPEG_MARKER_SOS = 0xDA, JPEG_MARKER_EOI = 0xD9, }; enum PROP_0, PROP_JPEG_QUALITY, PROP_JPEG_TYPE Q_TABLE_0 = 0, Q_TABLE_1, Q_TABLE_MAX /* only support for two tables at the moment */ typedef struct _RtpJpegHeader RtpJpegHeader; typedef struct _RtpQuantHeader RtpQuantHeader; * RtpJpegHeader: * @type_spec: type specific * @offset: fragment offset * @type: type field * @q: quantization table for this frame * @width: width of image in 8-pixel multiples * @height: height of image in 8-pixel multiples * 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 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Type-specific | Fragment Offset | * | Type | Q | Width | Height | struct _RtpJpegHeader #if (G_BYTE_ORDER == G_LITTLE_ENDIAN) guint type_spec:8; guint offset:24; #else guint8 type; guint8 q; guint8 width; guint8 height; * RtpQuantHeader * @mbz: must be zero * @precision: specify size of quantization tables * @length: length of quantization data * | MBZ | Precision | Length | * | Quantization Table Data | * | ... | struct _RtpQuantHeader guint8 mbz; guint8 precision; guint16 length; /* FIXME: restart marker header currently unsupported */ static void gst_rtp_jpeg_pay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_rtp_jpeg_pay_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static gboolean gst_rtp_jpeg_pay_setcaps (GstBaseRTPPayload * basepayload, GstCaps * caps); static GstFlowReturn gst_rtp_jpeg_pay_handle_buffer (GstBaseRTPPayload * pad, GstBuffer * buffer); GST_BOILERPLATE (GstRtpJPEGPay, gst_rtp_jpeg_pay, GstBaseRTPPayload, GST_TYPE_BASE_RTP_PAYLOAD); static void gst_rtp_jpeg_pay_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_jpeg_pay_src_template)); gst_static_pad_template_get (&gst_rtp_jpeg_pay_sink_template)); gst_element_class_set_details (element_class, &gst_rtp_jpeg_pay_details); } gst_rtp_jpeg_pay_class_init (GstRtpJPEGPayClass * klass) GObjectClass *gobject_class; GstBaseRTPPayloadClass *gstbasertppayload_class; gobject_class = (GObjectClass *) klass; gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; gobject_class->set_property = gst_rtp_jpeg_pay_set_property; gobject_class->get_property = gst_rtp_jpeg_pay_get_property; gstbasertppayload_class->set_caps = gst_rtp_jpeg_pay_setcaps; gstbasertppayload_class->handle_buffer = gst_rtp_jpeg_pay_handle_buffer; g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_JPEG_QUALITY, g_param_spec_int ("quality", "Quality", "Quality factor on JPEG data", 0, 255, DEFAULT_JPEG_QUALITY, G_PARAM_READWRITE)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_JPEG_TYPE, g_param_spec_int ("type", "Type", "JPEG Type", 0, 255, DEFAULT_JPEG_TYPE, G_PARAM_READWRITE)); GST_DEBUG_CATEGORY_INIT (rtpjpegpay_debug, "rtpjpegpay", 0, "Motion JPEG RTP Payloader"); gst_rtp_jpeg_pay_init (GstRtpJPEGPay * rtpjpegpay, GstRtpJPEGPayClass * klass) rtpjpegpay->quality = DEFAULT_JPEG_QUALITY; rtpjpegpay->type = DEFAULT_JPEG_TYPE; static gboolean gst_rtp_jpeg_pay_setcaps (GstBaseRTPPayload * basepayload, GstCaps * caps) GstStructure *caps_structure = gst_caps_get_structure (caps, 0); GstRtpJPEGPay *rtpjpegpay; rtpjpegpay = GST_RTP_JPEG_PAY (basepayload); if (!gst_structure_get_int (caps_structure, "height", &rtpjpegpay->height)) { goto caps_fail; } if (!gst_structure_get_int (caps_structure, "width", &rtpjpegpay->width)) { rtpjpegpay->height /= 8; rtpjpegpay->width /= 8; gst_basertppayload_set_options (basepayload, "video", TRUE, "JPEG", 90000); gst_basertppayload_set_outcaps (basepayload, NULL); return TRUE; caps_fail: GST_ERROR_OBJECT (rtpjpegpay, "Failed to get width/height from caps"); return FALSE; static guint gst_rtp_jpeg_pay_header_size (const guint8 * data, guint offset) return data[offset] << 8 | data[offset + 1]; gst_rtp_jpeg_pay_read_quant_table (const guint8 * data, guint offset, const guint8 ** quantizer_table, RtpQuantHeader * qtable, guint8 index) gint quant_size = gst_rtp_jpeg_pay_header_size (data, offset); qtable->precision |= (data[offset + 2] & 0x10) ? (1 << index) : 0x00; /* ommit length and precision prefix from table */ quantizer_table[index] = &data[offset + QUANT_PREFIX_LEN]; quant_size -= QUANT_PREFIX_LEN; qtable->length += quant_size; return quant_size; static RtpJpegMarker gst_rtp_jpeg_pay_scan_marker (const guint8 * data, guint size, guint * offset) while ((data[(*offset)++] != JPEG_MARKER) && ((*offset) < size)); if (G_UNLIKELY ((*offset) >= size)) { return JPEG_MARKER_EOI; } else { return data[(*offset)++]; static GstFlowReturn gst_rtp_jpeg_pay_handle_buffer (GstBaseRTPPayload * basepayload, GstBuffer * buffer) GstClockTime timestamp; GstFlowReturn ret = GST_FLOW_ERROR; RtpJpegHeader jpeg_header; RtpQuantHeader quant_header; const guint8 *jpeg_quantizer_table[Q_TABLE_MAX] = { NULL }; guint8 *data; guint8 quant_table_index = 0; guint size; guint mtu; guint bytes_left; guint quant_data_size = sizeof (quant_header); guint jpeg_header_size = 0; guint offset = 0; gboolean frame_done = FALSE; gboolean sos_found = FALSE; mtu = GST_BASE_RTP_PAYLOAD_MTU (rtpjpegpay); jpeg_header.type_spec = 0; jpeg_header.offset = 0; jpeg_header.type = rtpjpegpay->type; jpeg_header.q = rtpjpegpay->quality; jpeg_header.width = rtpjpegpay->width; jpeg_header.height = rtpjpegpay->height; size = GST_BUFFER_SIZE (buffer); data = GST_BUFFER_DATA (buffer); timestamp = GST_BUFFER_TIMESTAMP (buffer); /* parse the jpeg header for 'start of scan' and read quant tables if needed */ while (!sos_found && (offset < size)) { switch (gst_rtp_jpeg_pay_scan_marker (data, size, &offset)) { case JPEG_MARKER_JFIF: case JPEG_MARKER_CMT: case JPEG_MARKER_SOF: case JPEG_MARKER_DHT: offset += gst_rtp_jpeg_pay_header_size (data, offset); break; case JPEG_MARKER_DQT:{ if ((jpeg_header.q >= 128) && (quant_table_index < Q_TABLE_MAX)) { if (!quant_table_index) { quant_header.length = 0; quant_header.precision = 0; quant_header.mbz = 0; } quant_data_size += gst_rtp_jpeg_pay_read_quant_table (data, offset, jpeg_quantizer_table, &quant_header, quant_table_index); quant_table_index++; } } case JPEG_MARKER_SOS: sos_found = TRUE; jpeg_header_size = offset + gst_rtp_jpeg_pay_header_size (data, offset); case JPEG_MARKER_EOI: GST_WARNING ("EOI reached before SOS!"); case JPEG_MARKER_SOI: default: } size -= jpeg_header_size; data += jpeg_header_size; offset = 0; bytes_left = sizeof (jpeg_header) + quant_data_size + size; while (!frame_done) { GstBuffer *outbuf; guint8 *payload; guint payload_size = (bytes_left < mtu ? bytes_left : mtu); outbuf = gst_rtp_buffer_new_allocate (payload_size, 0, 0); GST_BUFFER_TIMESTAMP (outbuf) = timestamp; if (payload_size == bytes_left) { frame_done = TRUE; gst_rtp_buffer_set_marker (outbuf, 1); payload = gst_rtp_buffer_get_payload (outbuf); memcpy (payload, &jpeg_header, sizeof (jpeg_header)); payload += sizeof (jpeg_header); payload_size -= sizeof (jpeg_header); /* only send quant table with first packet */ if (G_UNLIKELY (quant_data_size > 0)) { guint8 index; const guint8 table_size = quant_header.length / quant_table_index; quant_header.length = g_htons (quant_header.length); memcpy (payload, &quant_header, sizeof (quant_header)); payload += sizeof (quant_header); for (index = 0; index < quant_table_index; index++) { memcpy (payload, jpeg_quantizer_table[index], table_size); payload += table_size; payload_size -= quant_data_size; bytes_left -= quant_data_size; quant_data_size = 0; memcpy (payload, &data[offset], payload_size); ret = gst_basertppayload_push (basepayload, outbuf); if (ret != GST_FLOW_OK) break; bytes_left -= payload_size; offset += payload_size; jpeg_header.offset = ((offset & 0x0000FF) << 16) | ((offset & 0xFF0000) >> 16) | (offset & 0x00FF00); jpeg_header.offset = offset; gst_buffer_unref (buffer); return ret; gst_rtp_jpeg_pay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) rtpjpegpay = GST_RTP_JPEG_PAY (object); switch (prop_id) { case PROP_JPEG_QUALITY: rtpjpegpay->quality = g_value_get_int (value); GST_DEBUG_OBJECT (object, "quality = %d", rtpjpegpay->quality); case PROP_JPEG_TYPE: rtpjpegpay->type = g_value_get_int (value); GST_DEBUG_OBJECT (object, "type = %d", rtpjpegpay->type); default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); gst_rtp_jpeg_pay_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) g_value_set_int (value, rtpjpegpay->quality); g_value_set_int (value, rtpjpegpay->type); gboolean gst_rtp_jpeg_pay_plugin_init (GstPlugin * plugin) return gst_element_register (plugin, "rtpjpegpay", GST_RANK_NONE, GST_TYPE_RTP_JPEG_PAY); --- NEW FILE: gstrtpjpegpay.h --- #ifndef __GST_RTP_JPEG_PAY_H__ #define __GST_RTP_JPEG_PAY_H__ #include <gst/gst.h> #include <gst/rtp/gstbasertppayload.h> G_BEGIN_DECLS #define GST_TYPE_RTP_JPEG_PAY \ (gst_rtp_jpeg_pay_get_type()) #define GST_RTP_JPEG_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_JPEG_PAY,GstRtpJPEGPay)) #define GST_RTP_JPEG_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_JPEG_PAY,GstRtpJPEGPayClass)) #define GST_IS_RTP_JPEG_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_JPEG_PAY)) #define GST_IS_RTP_JPEG_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_JPEG_PAY)) typedef struct _GstRtpJPEGPay GstRtpJPEGPay; typedef struct _GstRtpJPEGPayClass GstRtpJPEGPayClass; struct _GstRtpJPEGPay GstBaseRTPPayload payload; gint height; guint8 quality; gint width; struct _GstRtpJPEGPayClass GstBaseRTPPayloadClass parent_class; gboolean gst_rtp_jpeg_pay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_JPEG_PAY_H__ */ |
From: <wt...@ke...> - 2008-11-14 18:41:55
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Fri Nov 14 2008 18:41:43 UTC Log message: * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: (plugin_init): * gst/rtp/gstrtpjpegdepay.c: (gst_rtp_jpeg_depay_base_init), (gst_rtp_jpeg_depay_class_init), (gst_rtp_jpeg_depay_init), (gst_rtp_jpeg_depay_finalize), (MakeTables), (MakeQuantHeader), (MakeHuffmanHeader), (MakeDRIHeader), (MakeHeaders), (gst_rtp_jpeg_depay_setcaps), (gst_rtp_jpeg_depay_process), (gst_rtp_jpeg_depay_change_state), (gst_rtp_jpeg_depay_plugin_init): * gst/rtp/gstrtpjpegdepay.h: Add a jpeg depayloader. * gst/rtp/gstrtpjpegpay.c: Set the default properties on the payloader to better defaults. Modified files: . : ChangeLog gst/rtp : Makefile.am gstrtp.c gstrtpjpegpay.c Added files: gst/rtp : gstrtpjpegdepay.c gstrtpjpegdepay.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.3817&r2=1.3818 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/Makefile.am.diff?r1=1.54&r2=1.55 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtp.c.diff?r1=1.47&r2=1.48 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpjpegdepay.c?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpjpegdepay.h?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpjpegpay.c.diff?r1=1.1&r2=1.2 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.3817 retrieving revision 1.3818 diff -u -d -r1.3817 -r1.3818 --- ChangeLog 14 Nov 2008 15:42:31 -0000 1.3817 +++ ChangeLog 14 Nov 2008 18:41:27 -0000 1.3818 @@ -1,3 +1,20 @@ +2008-11-14 Wim Taymans <wim...@co...> + + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: (plugin_init): + * gst/rtp/gstrtpjpegdepay.c: (gst_rtp_jpeg_depay_base_init), + (gst_rtp_jpeg_depay_class_init), (gst_rtp_jpeg_depay_init), + (gst_rtp_jpeg_depay_finalize), (MakeTables), (MakeQuantHeader), + (MakeHuffmanHeader), (MakeDRIHeader), (MakeHeaders), + (gst_rtp_jpeg_depay_setcaps), (gst_rtp_jpeg_depay_process), + (gst_rtp_jpeg_depay_change_state), + (gst_rtp_jpeg_depay_plugin_init): + * gst/rtp/gstrtpjpegdepay.h: + Add a jpeg depayloader. + * gst/rtp/gstrtpjpegpay.c: + Set the default properties on the payloader to better defaults. 2008-11-14 Stefan Kost <en...@us...> * sys/v4l2/gstv4l2.c: Index: Makefile.am RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/Makefile.am,v retrieving revision 1.54 retrieving revision 1.55 diff -u -d -r1.54 -r1.55 --- Makefile.am 14 Nov 2008 11:41:55 -0000 1.54 +++ Makefile.am 14 Nov 2008 18:41:28 -0000 1.55 @@ -32,6 +32,7 @@ gstrtph263pay.c \ gstrtph264depay.c \ gstrtph264pay.c \ + gstrtpjpegdepay.c \ gstrtpjpegpay.c \ gstrtpL16depay.c \ gstrtpL16pay.c \ @@ -102,6 +103,7 @@ gstrtph263pay.h \ gstrtph264depay.h \ gstrtph264pay.h \ + gstrtpjpegdepay.h \ gstrtpjpegpay.h \ gstrtpmp1sdepay.h \ gstrtpmp2tdepay.h \ Index: gstrtp.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtp.c,v retrieving revision 1.47 retrieving revision 1.48 diff -u -d -r1.47 -r1.48 --- gstrtp.c 14 Nov 2008 11:41:55 -0000 1.47 +++ gstrtp.c 14 Nov 2008 18:41:29 -0000 1.48 @@ -49,6 +49,7 @@ #include "gstrtph263pay.h" #include "gstrtph264depay.h" #include "gstrtph264pay.h" +#include "gstrtpjpegdepay.h" #include "gstrtpjpegpay.h" #include "gstrtpL16depay.h" #include "gstrtpL16pay.h" @@ -159,6 +160,9 @@ if (!gst_rtp_h264_pay_plugin_init (plugin)) return FALSE; + if (!gst_rtp_jpeg_depay_plugin_init (plugin)) + return FALSE; if (!gst_rtp_jpeg_pay_plugin_init (plugin)) --- NEW FILE: gstrtpjpegdepay.c --- /* GStreamer * Copyright (C) <2008> Wim Taymans <wim...@gm...> * * 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 "gstrtpjpegdepay.h" GST_DEBUG_CATEGORY_STATIC (rtpjpegdepay_debug); #define GST_CAT_DEFAULT (rtpjpegdepay_debug) /* elementfactory information */ static const GstElementDetails gst_rtp_jpegdepay_details = GST_ELEMENT_DETAILS ("RTP JPEG depayloader", "Codec/Depayloader/Network", "Extracts JPEG video from RTP packets (RFC 2435)", "Wim Taymans <wim...@gm...>"); static GstStaticPadTemplate gst_rtp_jpeg_depay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, GST_STATIC_CAPS ("image/jpeg") ); static GstStaticPadTemplate gst_rtp_jpeg_depay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"video\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) 90000, " "encoding-name = (string) \"JPEG\";" "application/x-rtp, " "payload = (int) " GST_RTP_PAYLOAD_JPEG_STRING ", " "clock-rate = (int) 90000") GST_BOILERPLATE (GstRtpJPEGDepay, gst_rtp_jpeg_depay, GstBaseRTPDepayload, GST_TYPE_BASE_RTP_DEPAYLOAD); static void gst_rtp_jpeg_depay_finalize (GObject * object); static gboolean gst_rtp_jpeg_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps); static GstBuffer *gst_rtp_jpeg_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf); static GstStateChangeReturn gst_rtp_jpeg_depay_change_state (GstElement * element, GstStateChange transition); static void gst_rtp_jpeg_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_jpeg_depay_src_template)); gst_static_pad_template_get (&gst_rtp_jpeg_depay_sink_template)); gst_element_class_set_details (element_class, &gst_rtp_jpegdepay_details); } gst_rtp_jpeg_depay_class_init (GstRtpJPEGDepayClass * klass) GObjectClass *gobject_class; GstElementClass *gstelement_class; GstBaseRTPDepayloadClass *gstbasertpdepayload_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; gobject_class->finalize = gst_rtp_jpeg_depay_finalize; parent_class = g_type_class_peek_parent (klass); gstelement_class->change_state = gst_rtp_jpeg_depay_change_state; gstbasertpdepayload_class->set_caps = gst_rtp_jpeg_depay_setcaps; gstbasertpdepayload_class->process = gst_rtp_jpeg_depay_process; GST_DEBUG_CATEGORY_INIT (rtpjpegdepay_debug, "rtpjpegdepay", 0, "JPEG Video RTP Depayloader"); gst_rtp_jpeg_depay_init (GstRtpJPEGDepay * rtpjpegdepay, GstRtpJPEGDepayClass * klass) rtpjpegdepay->adapter = gst_adapter_new (); gst_rtp_jpeg_depay_finalize (GObject * object) GstRtpJPEGDepay *rtpjpegdepay; rtpjpegdepay = GST_RTP_JPEG_DEPAY (object); g_object_unref (rtpjpegdepay->adapter); rtpjpegdepay->adapter = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); /* * Table K.1 from JPEG spec. static const int jpeg_luma_quantizer[64] = { 16, 11, 10, 16, 24, 40, 51, 61, 12, 12, 14, 19, 26, 58, 60, 55, 14, 13, 16, 24, 40, 57, 69, 56, 14, 17, 22, 29, 51, 87, 80, 62, 18, 22, 37, 56, 68, 109, 103, 77, 24, 35, 55, 64, 81, 104, 113, 92, 49, 64, 78, 87, 103, 121, 120, 101, 72, 92, 95, 98, 112, 100, 103, 99 }; * Table K.2 from JPEG spec. static const int jpeg_chroma_quantizer[64] = { 17, 18, 24, 47, 99, 99, 99, 99, 18, 21, 26, 66, 99, 99, 99, 99, 24, 26, 56, 99, 99, 99, 99, 99, 47, 66, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99 /* Call MakeTables with the Q factor and a guint8[128] return array MakeTables (GstRtpJPEGDepay * rtpjpegdepay, gint Q, guint8 qtable[128]) gint i; guint factor; factor = CLAMP (Q, 1, 99); if (Q < 50) Q = 5000 / factor; else Q = 200 - factor * 2; for (i = 0; i < 64; i++) { gint lq = (jpeg_luma_quantizer[i] * Q + 50) / 100; gint cq = (jpeg_chroma_quantizer[i] * Q + 50) / 100; /* Limit the quantizers to 1 <= q <= 255 */ qtable[i] = CLAMP (lq, 1, 255); qtable[i + 64] = CLAMP (cq, 1, 255); } static const guint8 lum_dc_codelens[] = { 0, 1, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 static const guint8 lum_dc_symbols[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 static const guint8 lum_ac_codelens[] = { 0, 2, 1, 3, 3, 2, 4, 3, 5, 5, 4, 4, 0, 0, 1, 0x7d static const guint8 lum_ac_symbols[] = { 0x01, 0x02, 0x03, 0x00, 0x04, 0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32, 0x81, 0x91, 0xa1, 0x08, 0x23, 0x42, 0xb1, 0xc1, 0x15, 0x52, 0xd1, 0xf0, 0x24, 0x33, 0x62, 0x72, 0x82, 0x09, 0x0a, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa static const guint8 chm_dc_codelens[] = { 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 static const guint8 chm_dc_symbols[] = { static const guint8 chm_ac_codelens[] = { 0, 2, 1, 2, 4, 4, 3, 4, 7, 5, 4, 4, 0, 1, 2, 0x77 static const guint8 chm_ac_symbols[] = { 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 0x51, 0x07, 0x61, 0x71, 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xa1, 0xb1, 0xc1, 0x09, 0x23, 0x33, 0x52, 0xf0, 0x15, 0x62, 0x72, 0xd1, 0x0a, 0x16, 0x24, 0x34, 0xe1, 0x25, 0xf1, 0x17, 0x18, 0x19, 0x1a, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, static guint8 * MakeQuantHeader (guint8 * p, guint8 * qt, gint size, gint tableNo) *p++ = 0xff; *p++ = 0xdb; /* DQT */ *p++ = 0; /* length msb */ *p++ = size + 3; /* length lsb */ *p++ = tableNo; memcpy (p, qt, size); return (p + size); MakeHuffmanHeader (guint8 * p, const guint8 * codelens, int ncodes, const guint8 * symbols, int nsymbols, int tableNo, int tableClass) *p++ = 0xc4; /* DHT */ *p++ = 3 + ncodes + nsymbols; /* length lsb */ *p++ = (tableClass << 4) | tableNo; memcpy (p, codelens, ncodes); p += ncodes; memcpy (p, symbols, nsymbols); p += nsymbols; return (p); MakeDRIHeader (guint8 * p, guint16 dri) *p++ = 0xdd; /* DRI */ *p++ = 0x0; /* length msb */ *p++ = 4; /* length lsb */ *p++ = dri >> 8; /* dri msb */ *p++ = dri & 0xff; /* dri lsb */ * Arguments: * type, width, height: as supplied in RTP/JPEG header * qt: quantization tables as either derived from * the Q field using MakeTables() or as specified * in section 4.2. * dri: restart interval in MCUs, or 0 if no restarts. * p: pointer to return area * Return value: * The length of the generated headers. * Generate a frame and scan headers that can be prepended to the * RTP/JPEG data payload to produce a JPEG compressed image in * interchange format (except for possible trailing garbage and * absence of an EOI marker to terminate the scan). static guint MakeHeaders (guint8 * p, int type, int width, int height, guint8 * qt, guint precision, guint16 dri) guint8 *start = p; gint size; *p++ = 0xd8; /* SOI */ size = ((precision & 1) ? 128 : 64); p = MakeQuantHeader (p, qt, size, 0); qt += size; size = ((precision & 2) ? 128 : 64); p = MakeQuantHeader (p, qt, size, 1); if (dri != 0) p = MakeDRIHeader (p, dri); *p++ = 0xc0; /* SOF */ *p++ = 17; /* length lsb */ *p++ = 8; /* 8-bit precision */ *p++ = height >> 8; /* height msb */ *p++ = height; /* height lsb */ *p++ = width >> 8; /* width msb */ *p++ = width; /* width lsb */ *p++ = 3; /* number of components */ *p++ = 0; /* comp 0 */ if (type == 0) *p++ = 0x21; /* hsamp = 2, vsamp = 1 */ *p++ = 0x22; /* hsamp = 2, vsamp = 2 */ *p++ = 0; /* quant table 0 */ *p++ = 1; /* comp 1 */ *p++ = 0x11; /* hsamp = 1, vsamp = 1 */ *p++ = 1; /* quant table 1 */ *p++ = 2; /* comp 2 */ p = MakeHuffmanHeader (p, lum_dc_codelens, sizeof (lum_dc_codelens), lum_dc_symbols, sizeof (lum_dc_symbols), 0, 0); p = MakeHuffmanHeader (p, lum_ac_codelens, sizeof (lum_ac_codelens), lum_ac_symbols, sizeof (lum_ac_symbols), 0, 1); p = MakeHuffmanHeader (p, chm_dc_codelens, sizeof (chm_dc_codelens), chm_dc_symbols, sizeof (chm_dc_symbols), 1, 0); p = MakeHuffmanHeader (p, chm_ac_codelens, sizeof (chm_ac_codelens), chm_ac_symbols, sizeof (chm_ac_symbols), 1, 1); *p++ = 0xda; /* SOS */ *p++ = 12; /* length lsb */ *p++ = 3; /* 3 components */ *p++ = 0; /* huffman table 0 */ *p++ = 0x11; /* huffman table 1 */ *p++ = 0; /* first DCT coeff */ *p++ = 63; /* last DCT coeff */ *p++ = 0; /* sucessive approx. */ return (p - start); static gboolean gst_rtp_jpeg_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) GstStructure *structure; GstCaps *outcaps; gint clock_rate; gboolean res; rtpjpegdepay = GST_RTP_JPEG_DEPAY (depayload); structure = gst_caps_get_structure (caps, 0); if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) clock_rate = 90000; depayload->clock_rate = clock_rate; outcaps = gst_caps_new_simple ("image/jpeg", "framerate", GST_TYPE_FRACTION, 0, 1, NULL); res = gst_pad_set_caps (depayload->srcpad, outcaps); gst_caps_unref (outcaps); return res; static GstBuffer * gst_rtp_jpeg_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) GstBuffer *outbuf; gint payload_len, header_len; guint8 *payload; guint frag_offset; gint Q; guint type, width, height; guint16 dri, precision, length; guint8 *qtable; if (GST_BUFFER_IS_DISCONT (buf)) { gst_adapter_clear (rtpjpegdepay->adapter); payload_len = gst_rtp_buffer_get_payload_len (buf); if (payload_len < 8) goto empty_packet; payload = gst_rtp_buffer_get_payload (buf); header_len = 0; /* 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 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Type-specific | Fragment Offset | * | Type | Q | Width | Height | */ frag_offset = (payload[1] << 16) | (payload[2] << 8) | payload[3]; type = payload[4]; Q = payload[5]; width = payload[6] * 8; height = payload[7] * 8; GST_DEBUG_OBJECT (rtpjpegdepay, "frag %u, type %u, Q %d, width %u, height %u", frag_offset, type, Q, width, height); header_len += 8; payload += 8; payload_len -= 8; dri = 0; if (type > 63) { if (payload_len < 4) goto empty_packet; /* 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 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Restart Interval |F|L| Restart Count | */ dri = (payload[0] << 8) | payload[1]; GST_DEBUG_OBJECT (rtpjpegdepay, "DRI %" G_GUINT16_FORMAT, dri); payload += 4; header_len += 4; payload_len -= 4; if (Q >= 128 && frag_offset == 0) { * | MBZ | Precision | Length | * | Quantization Table Data | * | ... | precision = payload[1]; length = (payload[2] << 8) | payload[3]; GST_DEBUG_OBJECT (rtpjpegdepay, "precision %04x, length %" G_GUINT16_FORMAT, precision, length); if (Q == 255 && length == 0) if (length > payload_len) qtable = payload; payload += length; header_len += length; payload_len -= length; } else { length = 0; qtable = NULL; precision = 0; if (frag_offset == 0) { guint size; /* first packet */ if (length == 0) { if (Q < 128) { /* no quant table, see if we have one cached */ qtable = rtpjpegdepay->qtables[Q]; if (!qtable) { GST_DEBUG_OBJECT (rtpjpegdepay, "making Q %d table", Q); /* make and cache the table */ qtable = g_new (guint8, 128); MakeTables (rtpjpegdepay, Q, qtable); rtpjpegdepay->qtables[Q] = qtable; } else { GST_DEBUG_OBJECT (rtpjpegdepay, "using cached table for Q %d", Q); } /* all 8 bit quantizers */ precision = 0; } } /* max header length, should be big enough */ outbuf = gst_buffer_new_and_alloc (1000); size = MakeHeaders (GST_BUFFER_DATA (outbuf), type, width, height, qtable, precision, dri); GST_DEBUG_OBJECT (rtpjpegdepay, "pushing %u bytes header", size); GST_BUFFER_SIZE (outbuf) = size; gst_adapter_push (rtpjpegdepay->adapter, outbuf); /* take JPEG data, push in the adapter */ GST_DEBUG_OBJECT (rtpjpegdepay, "pushing data at offset %d", header_len); outbuf = gst_rtp_buffer_get_payload_subbuffer (buf, header_len, -1); gst_adapter_push (rtpjpegdepay->adapter, outbuf); outbuf = NULL; if (gst_rtp_buffer_get_marker (buf)) { guint avail; /* last buffer take all data out of the adapter */ avail = gst_adapter_available (rtpjpegdepay->adapter); outbuf = gst_adapter_take_buffer (rtpjpegdepay->adapter, avail); GST_DEBUG_OBJECT (rtpjpegdepay, "last buffer, returning %u bytes", avail); return outbuf; /* ERRORS */ empty_packet: { GST_ELEMENT_WARNING (rtpjpegdepay, STREAM, DECODE, ("Empty Payload."), (NULL)); return NULL; static GstStateChangeReturn gst_rtp_jpeg_depay_change_state (GstElement * element, GstStateChange transition) GstStateChangeReturn ret; rtpjpegdepay = GST_RTP_JPEG_DEPAY (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: break; default: ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); case GST_STATE_CHANGE_READY_TO_NULL: return ret; gboolean gst_rtp_jpeg_depay_plugin_init (GstPlugin * plugin) return gst_element_register (plugin, "rtpjpegdepay", GST_RANK_MARGINAL, GST_TYPE_RTP_JPEG_DEPAY); --- NEW FILE: gstrtpjpegdepay.h --- * Copyright (C) <2005> Wim Taymans <wi...@fl...> #ifndef __GST_RTP_JPEG_DEPAY_H__ #define __GST_RTP_JPEG_DEPAY_H__ #include <gst/gst.h> #include <gst/base/gstadapter.h> #include <gst/rtp/gstbasertpdepayload.h> G_BEGIN_DECLS #define GST_TYPE_RTP_JPEG_DEPAY \ (gst_rtp_jpeg_depay_get_type()) #define GST_RTP_JPEG_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_JPEG_DEPAY,GstRtpJPEGDepay)) #define GST_RTP_JPEG_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_JPEG_DEPAY,GstRtpJPEGDepayClass)) #define GST_IS_RTP_JPEG_DEPAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_JPEG_DEPAY)) #define GST_IS_RTP_JPEG_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_JPEG_DEPAY)) typedef struct _GstRtpJPEGDepay GstRtpJPEGDepay; typedef struct _GstRtpJPEGDepayClass GstRtpJPEGDepayClass; struct _GstRtpJPEGDepay GstBaseRTPDepayload depayload; GstAdapter *adapter; /* cached quant tables */ guint8 * qtables[255]; struct _GstRtpJPEGDepayClass GstBaseRTPDepayloadClass parent_class; gboolean gst_rtp_jpeg_depay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_JPEG_DEPAY_H__ */ Index: gstrtpjpegpay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpjpegpay.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- gstrtpjpegpay.c 14 Nov 2008 11:41:55 -0000 1.1 +++ gstrtpjpegpay.c 14 Nov 2008 18:41:29 -0000 1.2 @@ -45,9 +45,9 @@ /* elementfactory information */ static const GstElementDetails gst_rtp_jpeg_pay_details = -GST_ELEMENT_DETAILS ("RTP packet payloader", +GST_ELEMENT_DETAILS ("RTP JPEG payloader", "Codec/Payloader/Network", - "Payload-encodes JPEG pictures into a RTP packet", + "Payload-encodes JPEG pictures into RTP packets (RFC 2435)", "Axis Communications <dev...@ax...>"); static GstStaticPadTemplate gst_rtp_jpeg_pay_sink_template = @@ -86,13 +86,13 @@ * DEFAULT_JPEG_QUALITY: * */ -#define DEFAULT_JPEG_QUALITY 0 +#define DEFAULT_JPEG_QUALITY 255 /** * DEFAULT_JPEG_TYPE: -#define DEFAULT_JPEG_TYPE 0 +#define DEFAULT_JPEG_TYPE 1 typedef enum _RtpJpegMarker RtpJpegMarker; |
From: <wt...@ke...> - 2008-11-25 18:03:28
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Tue Nov 25 2008 18:03:17 UTC Log message: * gst/rtp/gstasteriskh263.c: * gst/rtp/gstasteriskh263.h: * gst/rtp/gstrtpL16depay.c: (gst_rtp_L16_depay_setcaps): * gst/rtp/gstrtpL16depay.h: * gst/rtp/gstrtpL16pay.c: * gst/rtp/gstrtpL16pay.h: * gst/rtp/gstrtpac3depay.c: (gst_rtp_ac3_depay_setcaps): * gst/rtp/gstrtpac3depay.h: * gst/rtp/gstrtpamrdepay.c: * gst/rtp/gstrtpamrdepay.h: * gst/rtp/gstrtpamrpay.c: * gst/rtp/gstrtpamrpay.h: * gst/rtp/gstrtpdepay.c: * gst/rtp/gstrtpdepay.h: * gst/rtp/gstrtpdvdepay.c: (gst_rtp_dv_depay_setcaps): * gst/rtp/gstrtpg726depay.c: * gst/rtp/gstrtpg726pay.c: * gst/rtp/gstrtpg729depay.c: * gst/rtp/gstrtpg729pay.c: * gst/rtp/gstrtpgsmdepay.c: * gst/rtp/gstrtpgsmpay.c: (gst_rtp_gsm_pay_setcaps): * gst/rtp/gstrtph263depay.c: (gst_rtp_h263_depay_setcaps): * gst/rtp/gstrtph263depay.h: * gst/rtp/gstrtph263pay.c: * gst/rtp/gstrtph263pay.h: * gst/rtp/gstrtph263pdepay.c: (gst_rtp_h263p_depay_setcaps): * gst/rtp/gstrtph263pdepay.h: * gst/rtp/gstrtph263ppay.c: * gst/rtp/gstrtph263ppay.h: * gst/rtp/gstrtph264depay.c: * gst/rtp/gstrtph264depay.h: * gst/rtp/gstrtph264pay.c: * gst/rtp/gstrtph264pay.h: * gst/rtp/gstrtpilbcdepay.c: * gst/rtp/gstrtpilbcpay.c: * gst/rtp/gstrtpjpegdepay.h: * gst/rtp/gstrtpmp1sdepay.c: (gst_rtp_mp1s_depay_setcaps): * gst/rtp/gstrtpmp1sdepay.h: * gst/rtp/gstrtpmp2tdepay.c: (gst_rtp_mp2t_depay_setcaps): * gst/rtp/gstrtpmp2tdepay.h: * gst/rtp/gstrtpmp2tpay.c: * gst/rtp/gstrtpmp2tpay.h: * gst/rtp/gstrtpmp4adepay.c: (gst_rtp_mp4a_depay_setcaps): * gst/rtp/gstrtpmp4apay.c: * gst/rtp/gstrtpmp4apay.h: * gst/rtp/gstrtpmp4gdepay.c: (gst_rtp_mp4g_depay_setcaps): * gst/rtp/gstrtpmp4gdepay.h: * gst/rtp/gstrtpmp4gpay.c: * gst/rtp/gstrtpmp4gpay.h: * gst/rtp/gstrtpmp4vdepay.c: (gst_rtp_mp4v_depay_setcaps): * gst/rtp/gstrtpmp4vdepay.h: * gst/rtp/gstrtpmp4vpay.c: (gst_rtp_mp4v_pay_event): * gst/rtp/gstrtpmp4vpay.h: * gst/rtp/gstrtpmpadepay.c: * gst/rtp/gstrtpmpadepay.h: * gst/rtp/gstrtpmpapay.c: * gst/rtp/gstrtpmpapay.h: * gst/rtp/gstrtpmpvdepay.c: * gst/rtp/gstrtpmpvdepay.h: * gst/rtp/gstrtppcmadepay.c: (gst_rtp_pcma_depay_process): * gst/rtp/gstrtppcmapay.c: * gst/rtp/gstrtppcmudepay.c: * gst/rtp/gstrtppcmupay.c: * gst/rtp/gstrtpspeexdepay.c: * gst/rtp/gstrtpspeexpay.c: * gst/rtp/gstrtpsv3vdepay.c: * gst/rtp/gstrtpsv3vdepay.h: * gst/rtp/gstrtptheoradepay.c: * gst/rtp/gstrtptheoradepay.h: * gst/rtp/gstrtptheorapay.c: * gst/rtp/gstrtptheorapay.h: * gst/rtp/gstrtpvorbisdepay.c: * gst/rtp/gstrtpvorbisdepay.h: * gst/rtp/gstrtpvorbispay.c: (gst_rtp_vorbis_pay_finish_headers): * gst/rtp/gstrtpvorbispay.h: * gst/rtp/gstrtpvrawdepay.c: (gst_rtp_vraw_depay_setcaps): * gst/rtp/gstrtpvrawpay.c: Fix the descriptions and fix some email addresses. Modified files: . : ChangeLog gst/rtp : gstasteriskh263.c gstasteriskh263.h gstrtpL16depay.c gstrtpL16depay.h gstrtpL16pay.c gstrtpL16pay.h gstrtpac3depay.c gstrtpac3depay.h gstrtpamrdepay.c gstrtpamrdepay.h gstrtpamrpay.c gstrtpamrpay.h gstrtpdepay.c gstrtpdepay.h gstrtpdvdepay.c gstrtpg726depay.c gstrtpg726pay.c gstrtpg729depay.c gstrtpg729pay.c gstrtpgsmdepay.c gstrtpgsmpay.c gstrtph263depay.c gstrtph263depay.h gstrtph263pay.c gstrtph263pay.h gstrtph263pdepay.c gstrtph263pdepay.h gstrtph263ppay.c gstrtph263ppay.h gstrtph264depay.c gstrtph264depay.h gstrtph264pay.c gstrtph264pay.h gstrtpilbcdepay.c gstrtpilbcpay.c gstrtpjpegdepay.h gstrtpmp1sdepay.c gstrtpmp1sdepay.h gstrtpmp2tdepay.c gstrtpmp2tdepay.h gstrtpmp2tpay.c gstrtpmp2tpay.h gstrtpmp4adepay.c gstrtpmp4apay.c gstrtpmp4apay.h gstrtpmp4gdepay.c gstrtpmp4gdepay.h gstrtpmp4gpay.c gstrtpmp4gpay.h gstrtpmp4vdepay.c gstrtpmp4vdepay.h gstrtpmp4vpay.c gstrtpmp4vpay.h gstrtpmpadepay.c gstrtpmpadepay.h gstrtpmpapay.c gstrtpmpapay.h gstrtpmpvdepay.c gstrtpmpvdepay.h gstrtppcmadepay.c gstrtppcmapay.c gstrtppcmudepay.c gstrtppcmupay.c gstrtpspeexdepay.c gstrtpspeexpay.c gstrtpsv3vdepay.c gstrtpsv3vdepay.h gstrtptheoradepay.c gstrtptheoradepay.h gstrtptheorapay.c gstrtptheorapay.h gstrtpvorbisdepay.c gstrtpvorbisdepay.h gstrtpvorbispay.c gstrtpvorbispay.h gstrtpvrawdepay.c gstrtpvrawpay.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.3834&r2=1.3835 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstasteriskh263.c.diff?r1=1.14&r2=1.15 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstasteriskh263.h.diff?r1=1.6&r2=1.7 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpL16depay.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.13&r2=1.14 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpL16pay.c.diff?r1=1.30&r2=1.31 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpL16pay.h.diff?r1=1.13&r2=1.14 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpac3depay.c.diff?r1=1.3&r2=1.4 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpac3depay.h.diff?r1=1.1&r2=1.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpamrdepay.c.diff?r1=1.31&r2=1.32 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpamrdepay.h.diff?r1=1.10&r2=1.11 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpamrpay.c.diff?r1=1.24&r2=1.25 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpamrpay.h.diff?r1=1.9&r2=1.10 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpdepay.c.diff?r1=1.15&r2=1.16 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpdepay.h.diff?r1=1.6&r2=1.7 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpdvdepay.c.diff?r1=1.2&r2=1.3 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpg726depay.c.diff?r1=1.2&r2=1.3 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpg726pay.c.diff?r1=1.4&r2=1.5 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpg729depay.c.diff?r1=1.3&r2=1.4 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpg729pay.c.diff?r1=1.4&r2=1.5 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpgsmdepay.c.diff?r1=1.33&r2=1.34 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpgsmpay.c.diff?r1=1.33&r2=1.34 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtph263depay.c.diff?r1=1.6&r2=1.7 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtph263depay.h.diff?r1=1.2&r2=1.3 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtph263pay.c.diff?r1=1.16&r2=1.17 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtph263pay.h.diff?r1=1.7&r2=1.8 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtph263pdepay.c.diff?r1=1.28&r2=1.29 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtph263pdepay.h.diff?r1=1.8&r2=1.9 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtph263ppay.c.diff?r1=1.25&r2=1.26 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtph263ppay.h.diff?r1=1.10&r2=1.11 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtph264depay.c.diff?r1=1.19&r2=1.20 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtph264depay.h.diff?r1=1.4&r2=1.5 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtph264pay.c.diff?r1=1.14&r2=1.15 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtph264pay.h.diff?r1=1.6&r2=1.7 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpilbcdepay.c.diff?r1=1.14&r2=1.15 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpilbcpay.c.diff?r1=1.11&r2=1.12 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpjpegdepay.h.diff?r1=1.1&r2=1.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp1sdepay.c.diff?r1=1.2&r2=1.3 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp1sdepay.h.diff?r1=1.1&r2=1.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp2tdepay.c.diff?r1=1.11&r2=1.12 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp2tdepay.h.diff?r1=1.2&r2=1.3 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp2tpay.c.diff?r1=1.3&r2=1.4 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp2tpay.h.diff?r1=1.2&r2=1.3 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4adepay.c.diff?r1=1.9&r2=1.10 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4apay.c.diff?r1=1.2&r2=1.3 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4apay.h.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.19&r2=1.20 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gdepay.h.diff?r1=1.2&r2=1.3 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gpay.c.diff?r1=1.21&r2=1.22 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gpay.h.diff?r1=1.8&r2=1.9 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4vdepay.c.diff?r1=1.24&r2=1.25 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4vdepay.h.diff?r1=1.7&r2=1.8 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4vpay.c.diff?r1=1.31&r2=1.32 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4vpay.h.diff?r1=1.12&r2=1.13 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmpadepay.c.diff?r1=1.22&r2=1.23 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmpadepay.h.diff?r1=1.7&r2=1.8 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmpapay.c.diff?r1=1.21&r2=1.22 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmpapay.h.diff?r1=1.8&r2=1.9 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmpvdepay.c.diff?r1=1.7&r2=1.8 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmpvdepay.h.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.13&r2=1.14 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtppcmapay.c.diff?r1=1.12&r2=1.13 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtppcmudepay.c.diff?r1=1.13&r2=1.14 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtppcmupay.c.diff?r1=1.12&r2=1.13 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpspeexdepay.c.diff?r1=1.17&r2=1.18 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpspeexpay.c.diff?r1=1.16&r2=1.17 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpsv3vdepay.c.diff?r1=1.9&r2=1.10 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpsv3vdepay.h.diff?r1=1.1&r2=1.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtptheoradepay.c.diff?r1=1.10&r2=1.11 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtptheoradepay.h.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.13&r2=1.14 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtptheorapay.h.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.16&r2=1.17 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpvorbisdepay.h.diff?r1=1.2&r2=1.3 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpvorbispay.c.diff?r1=1.17&r2=1.18 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpvorbispay.h.diff?r1=1.3&r2=1.4 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpvrawdepay.c.diff?r1=1.3&r2=1.4 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpvrawpay.c.diff?r1=1.2&r2=1.3 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.3834 retrieving revision 1.3835 diff -u -d -r1.3834 -r1.3835 --- ChangeLog 25 Nov 2008 17:47:22 -0000 1.3834 +++ ChangeLog 25 Nov 2008 18:02:52 -0000 1.3835 @@ -1,3 +1,84 @@ +2008-11-25 Wim Taymans <wim...@co...> + + * gst/rtp/gstasteriskh263.c: + * gst/rtp/gstasteriskh263.h: + * gst/rtp/gstrtpL16depay.c: (gst_rtp_L16_depay_setcaps): + * gst/rtp/gstrtpL16depay.h: + * gst/rtp/gstrtpL16pay.c: + * gst/rtp/gstrtpL16pay.h: + * gst/rtp/gstrtpac3depay.c: (gst_rtp_ac3_depay_setcaps): + * gst/rtp/gstrtpac3depay.h: + * gst/rtp/gstrtpamrdepay.c: + * gst/rtp/gstrtpamrdepay.h: + * gst/rtp/gstrtpamrpay.c: + * gst/rtp/gstrtpamrpay.h: + * gst/rtp/gstrtpdepay.c: + * gst/rtp/gstrtpdepay.h: + * gst/rtp/gstrtpdvdepay.c: (gst_rtp_dv_depay_setcaps): + * gst/rtp/gstrtpg726depay.c: + * gst/rtp/gstrtpg726pay.c: + * gst/rtp/gstrtpg729depay.c: + * gst/rtp/gstrtpg729pay.c: + * gst/rtp/gstrtpgsmdepay.c: + * gst/rtp/gstrtpgsmpay.c: (gst_rtp_gsm_pay_setcaps): + * gst/rtp/gstrtph263depay.c: (gst_rtp_h263_depay_setcaps): + * gst/rtp/gstrtph263depay.h: + * gst/rtp/gstrtph263pay.c: + * gst/rtp/gstrtph263pay.h: + * gst/rtp/gstrtph263pdepay.c: (gst_rtp_h263p_depay_setcaps): + * gst/rtp/gstrtph263pdepay.h: + * gst/rtp/gstrtph263ppay.c: + * gst/rtp/gstrtph263ppay.h: + * gst/rtp/gstrtph264depay.c: + * gst/rtp/gstrtph264depay.h: + * gst/rtp/gstrtph264pay.c: + * gst/rtp/gstrtph264pay.h: + * gst/rtp/gstrtpilbcdepay.c: + * gst/rtp/gstrtpilbcpay.c: + * gst/rtp/gstrtpjpegdepay.h: + * gst/rtp/gstrtpmp1sdepay.c: (gst_rtp_mp1s_depay_setcaps): + * gst/rtp/gstrtpmp1sdepay.h: + * gst/rtp/gstrtpmp2tdepay.c: (gst_rtp_mp2t_depay_setcaps): + * gst/rtp/gstrtpmp2tdepay.h: + * gst/rtp/gstrtpmp2tpay.c: + * gst/rtp/gstrtpmp2tpay.h: + * gst/rtp/gstrtpmp4adepay.c: (gst_rtp_mp4a_depay_setcaps): + * gst/rtp/gstrtpmp4apay.c: + * gst/rtp/gstrtpmp4apay.h: + * gst/rtp/gstrtpmp4gdepay.c: (gst_rtp_mp4g_depay_setcaps): + * gst/rtp/gstrtpmp4gdepay.h: + * gst/rtp/gstrtpmp4gpay.c: + * gst/rtp/gstrtpmp4gpay.h: + * gst/rtp/gstrtpmp4vdepay.c: (gst_rtp_mp4v_depay_setcaps): + * gst/rtp/gstrtpmp4vdepay.h: + * gst/rtp/gstrtpmp4vpay.c: (gst_rtp_mp4v_pay_event): + * gst/rtp/gstrtpmp4vpay.h: + * gst/rtp/gstrtpmpadepay.c: + * gst/rtp/gstrtpmpadepay.h: + * gst/rtp/gstrtpmpapay.c: + * gst/rtp/gstrtpmpapay.h: + * gst/rtp/gstrtpmpvdepay.c: + * gst/rtp/gstrtpmpvdepay.h: + * gst/rtp/gstrtppcmadepay.c: (gst_rtp_pcma_depay_process): + * gst/rtp/gstrtppcmapay.c: + * gst/rtp/gstrtppcmudepay.c: + * gst/rtp/gstrtppcmupay.c: + * gst/rtp/gstrtpspeexdepay.c: + * gst/rtp/gstrtpspeexpay.c: + * gst/rtp/gstrtpsv3vdepay.c: + * gst/rtp/gstrtpsv3vdepay.h: + * gst/rtp/gstrtptheoradepay.c: + * gst/rtp/gstrtptheoradepay.h: + * gst/rtp/gstrtptheorapay.c: + * gst/rtp/gstrtptheorapay.h: + * gst/rtp/gstrtpvorbisdepay.c: + * gst/rtp/gstrtpvorbisdepay.h: + * gst/rtp/gstrtpvorbispay.c: (gst_rtp_vorbis_pay_finish_headers): + * gst/rtp/gstrtpvorbispay.h: + * gst/rtp/gstrtpvrawdepay.c: (gst_rtp_vraw_depay_setcaps): + * gst/rtp/gstrtpvrawpay.c: + Fix the descriptions and fix some email addresses. 2008-11-25 Julien Moutte <ju...@fl...> * gst/qtdemux/qtdemux.c: (qtdemux_video_caps): Add MPG1 and MPG2 fourcc Index: gstasteriskh263.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstasteriskh263.c,v retrieving revision 1.14 retrieving revision 1.15 diff -u -d -r1.14 -r1.15 --- gstasteriskh263.c 25 Apr 2008 13:31:48 -0000 1.14 +++ gstasteriskh263.c 25 Nov 2008 18:02:54 -0000 1.15 @@ -1,5 +1,5 @@ /* GStreamer - * Copyright (C) <2005> Wim Taymans <wi...@fl...> + * Copyright (C) <2005> Wim Taymans <wim...@gm...> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -49,7 +49,7 @@ /* elementfactory information */ static const GstElementDetails gst_rtp_h263p_depaydetails = -GST_ELEMENT_DETAILS ("RTP packet parser", +GST_ELEMENT_DETAILS ("RTP Asterisk H263 depayloader", "Codec/Depayloader/Network", "Extracts H263 video from RTP and encodes in Asterisk H263 format", "Neil Stratford <ne...@vi...>"); Index: gstasteriskh263.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstasteriskh263.h,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- gstasteriskh263.h 29 Mar 2007 14:40:35 -0000 1.6 +++ gstasteriskh263.h 25 Nov 2008 18:02:54 -0000 1.7 Index: gstrtpL16depay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpL16depay.c,v retrieving revision 1.32 retrieving revision 1.33 diff -u -d -r1.32 -r1.33 --- gstrtpL16depay.c 28 Oct 2008 10:01:48 -0000 1.32 +++ gstrtpL16depay.c 25 Nov 2008 18:02:54 -0000 1.33 - * Copyright (C) <2007> Wim Taymans <wi...@fl...> + * Copyright (C) <2007> Wim Taymans <wim...@gm...> @@ -35,10 +35,10 @@ static const GstElementDetails gst_rtp_L16_depay_details = -GST_ELEMENT_DETAILS ("RTP packet depayloader", +GST_ELEMENT_DETAILS ("RTP audio depayloader", "Extracts raw audio from RTP packets", - "Zeeshan Ali <za...@ya...>," "Wim Taymans <wi...@fl...>"); + "Zeeshan Ali <za...@ya...>," "Wim Taymans <wim...@gm...>"); static GstStaticPadTemplate gst_rtp_L16_depay_src_template = GST_STATIC_PAD_TEMPLATE ("src", Index: gstrtpL16depay.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpL16depay.h,v retrieving revision 1.13 diff -u -d -r1.13 -r1.14 --- gstrtpL16depay.h 24 Jan 2007 18:20:14 -0000 1.13 +++ gstrtpL16depay.h 25 Nov 2008 18:02:54 -0000 1.14 Index: gstrtpL16pay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpL16pay.c,v retrieving revision 1.30 retrieving revision 1.31 diff -u -d -r1.30 -r1.31 --- gstrtpL16pay.c 29 Oct 2008 18:28:25 -0000 1.30 +++ gstrtpL16pay.c 25 Nov 2008 18:02:54 -0000 1.31 static const GstElementDetails gst_rtp_L16_pay_details = -GST_ELEMENT_DETAILS ("RTP packet payloader", +GST_ELEMENT_DETAILS ("RTP audio payloader", "Codec/Payloader/Network", "Payload-encode Raw audio into RTP packets (RFC 3551)", - "Wim Taymans <wi...@fl...>"); + "Wim Taymans <wim...@gm...>"); static GstStaticPadTemplate gst_rtp_L16_pay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", Index: gstrtpL16pay.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpL16pay.h,v --- gstrtpL16pay.h 25 Jan 2007 10:54:19 -0000 1.13 +++ gstrtpL16pay.h 25 Nov 2008 18:02:55 -0000 1.14 Index: gstrtpac3depay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpac3depay.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- gstrtpac3depay.c 27 Oct 2008 11:03:48 -0000 1.3 +++ gstrtpac3depay.c 25 Nov 2008 18:02:55 -0000 1.4 @@ -31,10 +31,10 @@ static const GstElementDetails gst_rtp_ac3depay_details = +GST_ELEMENT_DETAILS ("RTP AC3 depayloader", "Extracts AC3 audio from RTP packets (RFC 4184)", static GstStaticPadTemplate gst_rtp_ac3_depay_src_template = Index: gstrtpac3depay.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpac3depay.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- gstrtpac3depay.h 24 Jan 2007 15:18:34 -0000 1.1 +++ gstrtpac3depay.h 25 Nov 2008 18:02:55 -0000 1.2 Index: gstrtpamrdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpamrdepay.c,v diff -u -d -r1.31 -r1.32 --- gstrtpamrdepay.c 27 Oct 2008 11:03:48 -0000 1.31 +++ gstrtpamrdepay.c 25 Nov 2008 18:02:55 -0000 1.32 @@ -39,10 +39,10 @@ static const GstElementDetails gst_rtp_amrdepay_details = +GST_ELEMENT_DETAILS ("RTP AMR depayloader", "Extracts AMR or AMR-WB audio from RTP packets (RFC 3267)", /* RtpAMRDepay signals and args */ enum Index: gstrtpamrdepay.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpamrdepay.h,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- gstrtpamrdepay.h 27 Oct 2008 11:03:48 -0000 1.10 +++ gstrtpamrdepay.h 25 Nov 2008 18:02:55 -0000 1.11 Index: gstrtpamrpay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpamrpay.c,v retrieving revision 1.24 retrieving revision 1.25 diff -u -d -r1.24 -r1.25 --- gstrtpamrpay.c 26 Sep 2008 14:44:49 -0000 1.24 +++ gstrtpamrpay.c 25 Nov 2008 18:02:55 -0000 1.25 @@ -45,10 +45,10 @@ static const GstElementDetails gst_rtp_amrpay_details = +GST_ELEMENT_DETAILS ("RTP AMR payloader", "Payload-encode AMR or AMR-WB audio into RTP packets (RFC 3267)", static GstStaticPadTemplate gst_rtp_amr_pay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", Index: gstrtpamrpay.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpamrpay.h,v retrieving revision 1.9 diff -u -d -r1.9 -r1.10 --- gstrtpamrpay.h 1 Jun 2007 11:16:17 -0000 1.9 +++ gstrtpamrpay.h 25 Nov 2008 18:02:55 -0000 1.10 Index: gstrtpdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpdepay.c,v retrieving revision 1.16 diff -u -d -r1.15 -r1.16 --- gstrtpdepay.c 9 Jan 2008 11:10:59 -0000 1.15 +++ gstrtpdepay.c 25 Nov 2008 18:02:55 -0000 1.16 @@ -25,10 +25,10 @@ static const GstElementDetails rtpdepay_details = -GST_ELEMENT_DETAILS ("RTP depayloader", +GST_ELEMENT_DETAILS ("Dummy RTP session manager", "Accepts raw RTP and RTCP packets and sends them forward", static GstStaticPadTemplate gst_rtp_depay_src_rtp_template = GST_STATIC_PAD_TEMPLATE ("srcrtp", Index: gstrtpdepay.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpdepay.h,v --- gstrtpdepay.h 1 Jun 2006 21:07:25 -0000 1.6 +++ gstrtpdepay.h 25 Nov 2008 18:02:55 -0000 1.7 Index: gstrtpg726depay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpg726depay.c,v diff -u -d -r1.2 -r1.3 --- gstrtpg726depay.c 27 Oct 2008 11:03:48 -0000 1.2 +++ gstrtpg726depay.c 25 Nov 2008 18:02:56 -0000 1.3 @@ -37,7 +37,7 @@ static const GstElementDetails gst_rtp_g726depay_details = +GST_ELEMENT_DETAILS ("RTP G.726 depayloader", "Extracts G.726 audio from RTP packets", "Axis Communications <dev...@ax...>"); Index: gstrtpg726pay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpg726pay.c,v retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- gstrtpg726pay.c 19 Jun 2008 11:24:54 -0000 1.4 +++ gstrtpg726pay.c 25 Nov 2008 18:02:56 -0000 1.5 @@ -31,7 +31,7 @@ #include "gstrtpg726pay.h" static const GstElementDetails gst_rtp_g726_pay_details = +GST_ELEMENT_DETAILS ("RTP G.726 payloader", "Payload-encodes G.726 audio into a RTP packet", Index: gstrtpg729depay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpg729depay.c,v --- gstrtpg729depay.c 27 Oct 2008 11:03:48 -0000 1.3 +++ gstrtpg729depay.c 25 Nov 2008 18:02:56 -0000 1.4 @@ -33,9 +33,9 @@ static const GstElementDetails gst_rtp_g729depay_details = +GST_ELEMENT_DETAILS ("RTP G.729 depayloader", - "Extracts G729 audio from RTP packets (RFC 3551)", + "Extracts G.729 audio from RTP packets (RFC 3551)", "Laurent Glayal <spg...@ya...>"); Index: gstrtpg729pay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpg729pay.c,v --- gstrtpg729pay.c 12 Nov 2008 16:37:06 -0000 1.4 +++ gstrtpg729pay.c 25 Nov 2008 18:02:56 -0000 1.5 @@ -53,9 +53,9 @@ static const GstElementDetails gst_rtp_g729_pay_details = -GST_ELEMENT_DETAILS ("G729 RTP packet payloader", +GST_ELEMENT_DETAILS ("RTP G.729 payloader", - "Packetize G729 audio into RTP packets", + "Packetize G.729 audio into RTP packets", "Olivier Crete <oli...@co...>"); static GstStaticPadTemplate gst_rtp_g729_pay_sink_template = Index: gstrtpgsmdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpgsmdepay.c,v retrieving revision 1.34 diff -u -d -r1.33 -r1.34 --- gstrtpgsmdepay.c 27 Oct 2008 11:03:49 -0000 1.33 +++ gstrtpgsmdepay.c 25 Nov 2008 18:02:56 -0000 1.34 static GstElementDetails gst_rtp_gsmdepay_details = { - "RTP packet depayloader", + "RTP GSM depayloader", "Codec/Depayloader/Network", "Extracts GSM audio from RTP packets", "Zeeshan Ali <ze...@gm...>" Index: gstrtpgsmpay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpgsmpay.c,v --- gstrtpgsmpay.c 27 Oct 2008 11:03:49 -0000 1.33 +++ gstrtpgsmpay.c 25 Nov 2008 18:02:56 -0000 1.34 @@ -33,7 +33,7 @@ static const GstElementDetails gst_rtp_gsm_pay_details = -GST_ELEMENT_DETAILS ("RTP GSM audio payloader", +GST_ELEMENT_DETAILS ("RTP GSM payloader", "Payload-encodes GSM audio into a RTP packet", "Zeeshan Ali <ze...@gm...>"); Index: gstrtph263depay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtph263depay.c,v --- gstrtph263depay.c 27 Oct 2008 11:03:49 -0000 1.6 +++ gstrtph263depay.c 25 Nov 2008 18:02:56 -0000 1.7 @@ -4,7 +4,7 @@ * Copyright 2007 Collabora Ltd, * @author: Philippe Kalaf <phi...@co...> * <2007> Edward Hervey <bi...@bi...> static const GstElementDetails gst_rtp_h263depay_details = -GST_ELEMENT_DETAILS ("RTP H263 packet depayloader", +GST_ELEMENT_DETAILS ("RTP H263 depayloader", "Extracts H263 video from RTP packets (RFC 2190)", "Philippe Kalaf <phi...@co...>, " Index: gstrtph263depay.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtph263depay.h,v --- gstrtph263depay.h 27 Nov 2007 00:01:41 -0000 1.2 +++ gstrtph263depay.h 25 Nov 2008 18:02:56 -0000 1.3 Index: gstrtph263pay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtph263pay.c,v retrieving revision 1.17 diff -u -d -r1.16 -r1.17 --- gstrtph263pay.c 27 Oct 2008 11:03:49 -0000 1.16 +++ gstrtph263pay.c 25 Nov 2008 18:02:56 -0000 1.17 @@ -145,7 +145,7 @@ static const GstElementDetails gst_rtp_h263pay_details = +GST_ELEMENT_DETAILS ("RTP H263 payloader", "Payload-encodes H263 video in RTP packets (RFC 2190)", Index: gstrtph263pay.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtph263pay.h,v retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- gstrtph263pay.h 27 Oct 2008 11:03:49 -0000 1.7 +++ gstrtph263pay.h 25 Nov 2008 18:02:57 -0000 1.8 Index: gstrtph263pdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtph263pdepay.c,v retrieving revision 1.28 retrieving revision 1.29 diff -u -d -r1.28 -r1.29 --- gstrtph263pdepay.c 27 Oct 2008 11:03:49 -0000 1.28 +++ gstrtph263pdepay.c 25 Nov 2008 18:02:57 -0000 1.29 @@ -28,10 +28,10 @@ static const GstElementDetails gst_rtp_h263pdepay_details = "Extracts H263/+/++ video from RTP packets (RFC 4629)", static GstStaticPadTemplate gst_rtp_h263p_depay_src_template = Index: gstrtph263pdepay.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtph263pdepay.h,v diff -u -d -r1.8 -r1.9 --- gstrtph263pdepay.h 29 Mar 2007 14:40:35 -0000 1.8 +++ gstrtph263pdepay.h 25 Nov 2008 18:02:57 -0000 1.9 Index: gstrtph263ppay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtph263ppay.c,v retrieving revision 1.26 diff -u -d -r1.25 -r1.26 --- gstrtph263ppay.c 27 Oct 2008 11:03:49 -0000 1.25 +++ gstrtph263ppay.c 25 Nov 2008 18:02:57 -0000 1.26 @@ -59,10 +59,10 @@ static const GstElementDetails gst_rtp_h263ppay_details = "Payload-encodes H263/+/++ video in RTP packets (RFC 4629)", static GstStaticPadTemplate gst_rtp_h263p_pay_sink_template = Index: gstrtph263ppay.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtph263ppay.h,v --- gstrtph263ppay.h 27 Oct 2008 11:03:50 -0000 1.10 +++ gstrtph263ppay.h 25 Nov 2008 18:02:57 -0000 1.11 Index: gstrtph264depay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtph264depay.c,v retrieving revision 1.19 retrieving revision 1.20 diff -u -d -r1.19 -r1.20 --- gstrtph264depay.c 27 Oct 2008 11:03:50 -0000 1.19 +++ gstrtph264depay.c 25 Nov 2008 18:02:57 -0000 1.20 - * Copyright (C) <2006> Wim Taymans <wi...@fl...> + * Copyright (C) <2006> Wim Taymans <wim...@gm...> @@ -44,10 +44,10 @@ static const GstElementDetails gst_rtp_h264depay_details = +GST_ELEMENT_DETAILS ("RTP H264 depayloader", "Extracts H264 video from RTP packets (RFC 3984)", static GstStaticPadTemplate gst_rtp_h264_depay_src_template = Index: gstrtph264depay.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtph264depay.h,v --- gstrtph264depay.h 20 May 2008 11:33:05 -0000 1.4 +++ gstrtph264depay.h 25 Nov 2008 18:02:57 -0000 1.5 Index: gstrtph264pay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtph264pay.c,v --- gstrtph264pay.c 27 Oct 2008 11:03:50 -0000 1.14 +++ gstrtph264pay.c 25 Nov 2008 18:02:57 -0000 1.15 @@ -42,7 +42,7 @@ static const GstElementDetails gst_rtp_h264pay_details = +GST_ELEMENT_DETAILS ("RTP H264 payloader", "Payload-encode H264 video into RTP packets (RFC 3984)", Index: gstrtph264pay.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtph264pay.h,v --- gstrtph264pay.h 20 May 2008 13:57:44 -0000 1.6 +++ gstrtph264pay.h 25 Nov 2008 18:02:58 -0000 1.7 Index: gstrtpilbcdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpilbcdepay.c,v --- gstrtpilbcdepay.c 27 Oct 2008 11:03:50 -0000 1.14 +++ gstrtpilbcdepay.c 25 Nov 2008 18:02:58 -0000 1.15 @@ -28,7 +28,7 @@ static const GstElementDetails gst_rtp_ilbc_depay_details = -GST_ELEMENT_DETAILS ("RTP iLBC packet depayloader", +GST_ELEMENT_DETAILS ("RTP iLBC depayloader", "Extracts iLBC audio from RTP packets (RFC 3952)", "Philippe Kalaf <phi...@co...>"); Index: gstrtpilbcpay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpilbcpay.c,v retrieving revision 1.12 diff -u -d -r1.11 -r1.12 --- gstrtpilbcpay.c 27 Oct 2008 11:03:50 -0000 1.11 +++ gstrtpilbcpay.c 25 Nov 2008 18:02:58 -0000 1.12 @@ -27,7 +27,7 @@ static GstElementDetails gst_rtpilbcpay_details = { - "RTP Payloader for iLBC Audio", + "RTP iLBC Payloader", "Codec/Payloader/Network", "Packetize iLBC audio streams into RTP packets", "Philippe Kalaf <phi...@co...>" Index: gstrtpjpegdepay.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpjpegdepay.h,v --- gstrtpjpegdepay.h 14 Nov 2008 18:41:29 -0000 1.1 +++ gstrtpjpegdepay.h 25 Nov 2008 18:02:58 -0000 1.2 Index: gstrtpmp1sdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp1sdepay.c,v --- gstrtpmp1sdepay.c 27 Oct 2008 11:03:50 -0000 1.2 +++ gstrtpmp1sdepay.c 25 Nov 2008 18:02:58 -0000 1.3 static const GstElementDetails gst_rtp_mp1sdepay_details = +GST_ELEMENT_DETAILS ("RTP MPEG1 System Stream depayloader", "Extracts MPEG1 System Streams from RTP packets (RFC 3555)", "Wim Taymans <wim...@gm...>"); Index: gstrtpmp1sdepay.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp1sdepay.h,v --- gstrtpmp1sdepay.h 5 Aug 2008 13:54:18 -0000 1.1 +++ gstrtpmp1sdepay.h 25 Nov 2008 18:02:58 -0000 1.2 Index: gstrtpmp2tdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp2tdepay.c,v --- gstrtpmp2tdepay.c 27 Oct 2008 11:03:50 -0000 1.11 +++ gstrtpmp2tdepay.c 25 Nov 2008 18:02:58 -0000 1.12 static const GstElementDetails gst_rtp_mp2tdepay_details = +GST_ELEMENT_DETAILS ("RTP MPEG Transport Stream depayloader", "Extracts MPEG2 TS from RTP packets (RFC 2250)", - "Wim Taymans <wi...@fl...>\n" + "Wim Taymans <wim...@gm...>\n" "Thijs Vermeir <thi...@ba...>"); /* RtpMP2TDepay signals and args */ Index: gstrtpmp2tdepay.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp2tdepay.h,v --- gstrtpmp2tdepay.h 2 Mar 2007 12:16:16 -0000 1.2 +++ gstrtpmp2tdepay.h 25 Nov 2008 18:02:58 -0000 1.3 Index: gstrtpmp2tpay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp2tpay.c,v --- gstrtpmp2tpay.c 15 Nov 2007 18:19:19 -0000 1.3 +++ gstrtpmp2tpay.c 25 Nov 2008 18:02:58 -0000 1.4 @@ -29,10 +29,10 @@ static const GstElementDetails gst_rtp_mp2t_pay_details = -GST_ELEMENT_DETAILS ("RTP MP2T audio payloader", +GST_ELEMENT_DETAILS ("RTP MPEG2 Transport Stream payloader", "Payload-encodes MPEG2 TS into RTP packets (RFC 2250)", static GstStaticPadTemplate gst_rtp_mp2t_pay_sink_template = Index: gstrtpmp2tpay.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp2tpay.h,v --- gstrtpmp2tpay.h 15 Nov 2007 18:19:19 -0000 1.2 +++ gstrtpmp2tpay.h 25 Nov 2008 18:02:58 -0000 1.3 Index: gstrtpmp4adepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4adepay.c,v --- gstrtpmp4adepay.c 27 Oct 2008 11:03:50 -0000 1.9 +++ gstrtpmp4adepay.c 25 Nov 2008 18:02:58 -0000 1.10 @@ -1,6 +1,6 @@ * Copyright (C) <2007> Nokia Corporation (contact <ste...@no...>) - * <2007> Wim Taymans <wi...@fl...> + * <2007> Wim Taymans <wim...@gm...> @@ -31,11 +31,11 @@ static const GstElementDetails gst_rtp_mp4adepay_details = +GST_ELEMENT_DETAILS ("RTP MPEG4 audio depayloader", "Extracts MPEG4 audio from RTP packets (RFC 3016)", "Nokia Corporation (contact <ste...@no...>), " static GstStaticPadTemplate gst_rtp_mp4a_depay_src_template = Index: gstrtpmp4apay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4apay.c,v --- gstrtpmp4apay.c 27 Oct 2008 11:03:50 -0000 1.2 +++ gstrtpmp4apay.c 25 Nov 2008 18:02:59 -0000 1.3 @@ -32,7 +32,7 @@ static const GstElementDetails gst_rtp_mp4apay_details = +GST_ELEMENT_DETAILS ("RTP MPEG4 audio payloader", "Payload MPEG4 audio as RTP packets (RFC 3016)", Index: gstrtpmp4apay.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4apay.h,v --- gstrtpmp4apay.h 26 Sep 2008 13:55:48 -0000 1.1 +++ gstrtpmp4apay.h 25 Nov 2008 18:02:59 -0000 1.2 Index: gstrtpmp4gdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gdepay.c,v --- gstrtpmp4gdepay.c 27 Oct 2008 11:03:50 -0000 1.19 +++ gstrtpmp4gdepay.c 25 Nov 2008 18:02:59 -0000 1.20 @@ -32,10 +32,10 @@ static const GstElementDetails gst_rtp_mp4gdepay_details = +GST_ELEMENT_DETAILS ("RTP MPEG4 ES depayloader", "Extracts MPEG4 elementary streams from RTP packets (RFC 3640)", static GstStaticPadTemplate gst_rtp_mp4g_depay_src_template = GST_STATIC_PAD_TEMPLATE ("src", Index: gstrtpmp4gdepay.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gdepay.h,v --- gstrtpmp4gdepay.h 15 Sep 2008 21:10:23 -0000 1.2 +++ gstrtpmp4gdepay.h 25 Nov 2008 18:02:59 -0000 1.3 Index: gstrtpmp4gpay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gpay.c,v retrieving revision 1.21 retrieving revision 1.22 diff -u -d -r1.21 -r1.22 --- gstrtpmp4gpay.c 27 Oct 2008 11:03:51 -0000 1.21 +++ gstrtpmp4gpay.c 25 Nov 2008 18:02:59 -0000 1.22 static const GstElementDetails gst_rtp_mp4gpay_details = +GST_ELEMENT_DETAILS ("RTP MPEG4 ES payloader", "Payload MPEG4 elementary streams as RTP packets (RFC 3640)", static GstStaticPadTemplate gst_rtp_mp4g_pay_sink_template = Index: gstrtpmp4gpay.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gpay.h,v --- gstrtpmp4gpay.h 12 Feb 2008 23:38:18 -0000 1.8 +++ gstrtpmp4gpay.h 25 Nov 2008 18:02:59 -0000 1.9 Index: gstrtpmp4vdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4vdepay.c,v --- gstrtpmp4vdepay.c 27 Oct 2008 11:03:51 -0000 1.24 +++ gstrtpmp4vdepay.c 25 Nov 2008 18:02:59 -0000 1.25 static const GstElementDetails gst_rtp_mp4vdepay_details = +GST_ELEMENT_DETAILS ("RTP MPEG4 video depayloader", "Extracts MPEG4 video from RTP packets (RFC 3016)", static GstStaticPadTemplate gst_rtp_mp4v_depay_src_template = Index: gstrtpmp4vdepay.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4vdepay.h,v --- gstrtpmp4vdepay.h 1 Jun 2006 21:07:25 -0000 1.7 +++ gstrtpmp4vdepay.h 25 Nov 2008 18:02:59 -0000 1.8 Index: gstrtpmp4vpay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4vpay.c,v --- gstrtpmp4vpay.c 13 Nov 2008 14:04:40 -0000 1.31 +++ gstrtpmp4vpay.c 25 Nov 2008 18:03:00 -0000 1.32 static const GstElementDetails gst_rtp_mp4vpay_details = -GST_ELEMENT_DETAILS ("RTP MPEG-4 Video packet payloader", +GST_ELEMENT_DETAILS ("RTP MPEG4 Video payloader", "Payload MPEG-4 video as RTP packets (RFC 3016)", Index: gstrtpmp4vpay.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4vpay.h,v diff -u -d -r1.12 -r1.13 --- gstrtpmp4vpay.h 27 Sep 2007 11:10:12 -0000 1.12 +++ gstrtpmp4vpay.h 25 Nov 2008 18:03:00 -0000 1.13 Index: gstrtpmpadepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmpadepay.c,v retrieving revision 1.23 diff -u -d -r1.22 -r1.23 --- gstrtpmpadepay.c 30 Oct 2008 10:31:33 -0000 1.22 +++ gstrtpmpadepay.c 25 Nov 2008 18:03:00 -0000 1.23 static const GstElementDetails gst_rtp_mpadepay_details = +GST_ELEMENT_DETAILS ("RTP MPEG audio depayloader", "Extracts MPEG audio from RTP packets (RFC 2038)", static GstStaticPadTemplate gst_rtp_mpa_depay_src_template = Index: gstrtpmpadepay.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmpadepay.h,v --- gstrtpmpadepay.h 9 Jan 2007 12:23:48 -0000 1.7 +++ gstrtpmpadepay.h 25 Nov 2008 18:03:00 -0000 1.8 Index: gstrtpmpapay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmpapay.c,v --- gstrtpmpapay.c 30 Oct 2008 10:31:35 -0000 1.21 +++ gstrtpmpapay.c 25 Nov 2008 18:03:00 -0000 1.22 static const GstElementDetails gst_rtp_mpapay_details = +GST_ELEMENT_DETAILS ("RTP MPEG audio payloader", "Payload MPEG audio as RTP packets (RFC 2038)", static GstStaticPadTemplate gst_rtp_mpa_pay_sink_template = Index: gstrtpmpapay.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmpapay.h,v --- gstrtpmpapay.h 1 Jun 2006 21:07:25 -0000 1.8 +++ gstrtpmpapay.h 25 Nov 2008 18:03:00 -0000 1.9 Index: gstrtpmpvdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmpvdepay.c,v --- gstrtpmpvdepay.c 27 Oct 2008 11:03:51 -0000 1.7 +++ gstrtpmpvdepay.c 25 Nov 2008 18:03:00 -0000 1.8 static const GstElementDetails gst_rtp_mpvdepay_details = +GST_ELEMENT_DETAILS ("RTP MPEG video depayloader", "Extracts MPEG video from RTP packets (RFC 2250)", /* FIXME, we set the mpeg version to 2, we should ideally be looking at contents * of the stream to figure out the version */ Index: gstrtpmpvdepay.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmpvdepay.h,v --- gstrtpmpvdepay.h 9 Jan 2007 12:23:48 -0000 1.1 +++ gstrtpmpvdepay.h 25 Nov 2008 18:03:00 -0000 1.2 Index: gstrtppcmadepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtppcmadepay.c,v --- gstrtppcmadepay.c 27 Oct 2008 11:03:51 -0000 1.13 +++ gstrtppcmadepay.c 25 Nov 2008 18:03:00 -0000 1.14 @@ -29,7 +29,7 @@ static const GstElementDetails gst_rtp_pcmadepay_details = +GST_ELEMENT_DETAILS ("RTP PCMA depayloader", "Extracts PCMA audio from RTP packets", "Edgard Lima <edg...@in...>, Zeeshan Ali <ze...@gm...>"); Index: gstrtppcmapay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtppcmapay.c,v --- gstrtppcmapay.c 27 Oct 2008 11:03:51 -0000 1.12 +++ gstrtppcmapay.c 25 Nov 2008 18:03:00 -0000 1.13 static const GstElementDetails gst_rtp_pcma_pay_details = +GST_ELEMENT_DETAILS ("RTP PCMA payloader", "Payload-encodes PCMA audio into a RTP packet", "Edgard Lima <edg...@in...>"); Index: gstrtppcmudepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtppcmudepay.c,v --- gstrtppcmudepay.c 27 Oct 2008 11:03:52 -0000 1.13 +++ gstrtppcmudepay.c 25 Nov 2008 18:03:01 -0000 1.14 static const GstElementDetails gst_rtp_pcmudepay_details = +GST_ELEMENT_DETAILS ("RTP PCMU depayloader", "Extracts PCMU audio from RTP packets", Index: gstrtppcmupay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtppcmupay.c,v --- gstrtppcmupay.c 27 Oct 2008 11:03:52 -0000 1.12 +++ gstrtppcmupay.c 25 Nov 2008 18:03:01 -0000 1.13 static const GstElementDetails gst_rtp_pcmu_pay_details = +GST_ELEMENT_DETAILS ("RTP PCMU payloader", "Payload-encodes PCMU audio into a RTP packet", Index: gstrtpspeexdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpspeexdepay.c,v retrieving revision 1.18 diff -u -d -r1.17 -r1.18 --- gstrtpspeexdepay.c 27 Oct 2008 11:03:52 -0000 1.17 +++ gstrtpspeexdepay.c 25 Nov 2008 18:03:01 -0000 1.18 static const GstElementDetails gst_rtp_speexdepay_details = +GST_ELEMENT_DETAILS ("RTP Speex depayloader", "Extracts Speex audio from RTP packets", Index: gstrtpspeexpay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpspeexpay.c,v --- gstrtpspeexpay.c 27 Oct 2008 11:03:52 -0000 1.16 +++ gstrtpspeexpay.c 25 Nov 2008 18:03:01 -0000 1.17 static const GstElementDetails gst_rtp_speex_pay_details = +GST_ELEMENT_DETAILS ("RTP Speex payloader", "Payload-encodes Speex audio into a RTP packet", Index: gstrtpsv3vdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpsv3vdepay.c,v --- gstrtpsv3vdepay.c 27 Oct 2008 11:03:52 -0000 1.9 +++ gstrtpsv3vdepay.c 25 Nov 2008 18:03:01 -0000 1.10 static const GstElementDetails gst_rtp_sv3vdepay_details = +GST_ELEMENT_DETAILS ("RTP SVQ3 depayloader", "Extracts SVQ3 video from RTP packets (no RFC)", static GstStaticPadTemplate gst_rtp_sv3v_depay_src_template = Index: gstrtpsv3vdepay.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpsv3vdepay.h,v --- gstrtpsv3vdepay.h 18 Aug 2006 16:52:21 -0000 1.1 +++ gstrtpsv3vdepay.h 25 Nov 2008 18:03:01 -0000 1.2 Index: gstrtptheoradepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtptheoradepay.c,v --- gstrtptheoradepay.c 27 Oct 2008 11:03:52 -0000 1.10 +++ gstrtptheoradepay.c 25 Nov 2008 18:03:01 -0000 1.11 static const GstElementDetails gst_rtp_theora_depay_details = +GST_ELEMENT_DETAILS ("RTP Theora depayloader", "Extracts Theora video from RTP packets (draft-01 of RFC XXXX)", static GstStaticPadTemplate gst_rtp_theora_depay_sink_template = Index: gstrtptheoradepay.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtptheoradepay.h,v --- gstrtptheoradepay.h 8 Nov 2006 01:28:00 -0000 1.1 +++ gstrtptheoradepay.h 25 Nov 2008 18:03:01 -0000 1.2 Index: gstrtptheorapay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtptheorapay.c,v --- gstrtptheorapay.c 27 Oct 2008 11:03:52 -0000 1.13 +++ gstrtptheorapay.c 25 Nov 2008 18:03:01 -0000 1.14 static const GstElementDetails gst_rtp_theorapay_details = "Payload-encode Theora video into RTP packets (draft-01 RFC XXXX)", static GstStaticPadTemplate gst_rtp_theora_pay_src_template = Index: gstrtptheorapay.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtptheorapay.h,v --- gstrtptheorapay.h 8 Nov 2006 01:28:00 -0000 1.1 +++ gstrtptheorapay.h 25 Nov 2008 18:03:02 -0000 1.2 Index: gstrtpvorbisdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpvorbisdepay.c,v --- gstrtpvorbisdepay.c 27 Oct 2008 11:03:52 -0000 1.16 +++ gstrtpvorbisdepay.c 25 Nov 2008 18:03:02 -0000 1.17 @@ -36,10 +36,10 @@ static const GstElementDetails gst_rtp_vorbis_depay_details = +GST_ELEMENT_DETAILS ("RTP Vorbis depayloader", "Extracts Vorbis Audio from RTP packets (RFC 5215)", static GstStaticPadTemplate gst_rtp_vorbis_depay_sink_template = Index: gstrtpvorbisdepay.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpvorbisdepay.h,v --- gstrtpvorbisdepay.h 7 Nov 2006 01:43:06 -0000 1.2 +++ gstrtpvorbisdepay.h 25 Nov 2008 18:03:02 -0000 1.3 Index: gstrtpvorbispay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpvorbispay.c,v --- gstrtpvorbispay.c 27 Oct 2008 11:03:52 -0000 1.17 +++ gstrtpvorbispay.c 25 Nov 2008 18:03:02 -0000 1.18 @@ -37,10 +37,10 @@ static const GstElementDetails gst_rtp_vorbispay_details = "Payload-encode Vorbis audio into RTP packets (RFC 5215)", + "Wim Taymans <wim...@gm...>"); static GstStaticPadTemplate gst_rtp_vorbis_pay_src_template = Index: gstrtpvorbispay.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpvorbispay.h,v --- gstrtpvorbispay.h 7 Nov 2006 01:43:06 -0000 1.3 +++ gstrtpvorbispay.h 25 Nov 2008 18:03:02 -0000 1.4 Index: gstrtpvrawdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpvrawdepay.c,v --- gstrtpvrawdepay.c 27 Oct 2008 11:03:53 -0000 1.3 +++ gstrtpvrawdepay.c 25 Nov 2008 18:03:02 -0000 1.4 static const GstElementDetails gst_rtp_vrawdepay_details = +GST_ELEMENT_DETAILS ("RTP Raw Video depayloader", "Extracts raw video from RTP packets (RFC 4175)", Index: gstrtpvrawpay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpvrawpay.c,v --- gstrtpvrawpay.c 27 Oct 2008 11:03:53 -0000 1.2 +++ gstrtpvrawpay.c 25 Nov 2008 18:03:02 -0000 1.3 static const GstElementDetails gst_rtp_vrawpay_details = +GST_ELEMENT_DETAILS ("RTP Raw Video payloader", "Payload raw video as RTP packets (RFC 4175)", |
From: <wt...@ke...> - 2008-12-08 12:36:45
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Mon Dec 08 2008 12:36:35 UTC Log message: * gst/rtp/gstrtpmp4vpay.c: (gst_rtp_mp4v_pay_flush), (gst_rtp_mp4v_pay_event): Don't try to push packets before we could find a valid config startcode. Fixes #563509. Modified files: . : ChangeLog gst/rtp : gstrtpmp4vpay.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.3849&r2=1.3850 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4vpay.c.diff?r1=1.32&r2=1.33 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.3849 retrieving revision 1.3850 diff -u -d -r1.3849 -r1.3850 --- ChangeLog 7 Dec 2008 19:22:47 -0000 1.3849 +++ ChangeLog 8 Dec 2008 12:36:18 -0000 1.3850 @@ -1,3 +1,10 @@ +2008-12-08 Wim Taymans <wim...@co...> + + * gst/rtp/gstrtpmp4vpay.c: (gst_rtp_mp4v_pay_flush), + (gst_rtp_mp4v_pay_event): + Don't try to push packets before we could find a valid config + startcode. Fixes #563509. 2008-12-07 Sebastian Dröge <seb...@co...> Patch by: Brian Cameron <brian.cameron at sun dot com> Index: gstrtpmp4vpay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4vpay.c,v retrieving revision 1.32 retrieving revision 1.33 diff -u -d -r1.32 -r1.33 --- gstrtpmp4vpay.c 25 Nov 2008 18:03:00 -0000 1.32 +++ gstrtpmp4vpay.c 8 Dec 2008 12:36:21 -0000 1.33 @@ -283,6 +283,12 @@ * over multiple packets. */ avail = gst_adapter_available (rtpmp4vpay->adapter); + if (rtpmp4vpay->config == NULL) { + /* when we don't have a config yet, flush things out */ + gst_adapter_flush (rtpmp4vpay->adapter, avail); + avail = 0; + } ret = GST_FLOW_OK; while (avail > 0) { |
From: <wt...@ke...> - 2008-12-08 12:38:03
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Mon Dec 08 2008 12:37:59 UTC Log message: * gst/rtp/gstrtpmp4apay.c: (gst_rtp_mp4a_pay_handle_buffer): Copy incomming timestamp to outgoing packets. Modified files: . : ChangeLog gst/rtp : gstrtpmp4apay.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.3850&r2=1.3851 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4apay.c.diff?r1=1.3&r2=1.4 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.3850 retrieving revision 1.3851 diff -u -d -r1.3850 -r1.3851 --- ChangeLog 8 Dec 2008 12:36:18 -0000 1.3850 +++ ChangeLog 8 Dec 2008 12:37:43 -0000 1.3851 @@ -1,5 +1,10 @@ 2008-12-08 Wim Taymans <wim...@co...> + * gst/rtp/gstrtpmp4apay.c: (gst_rtp_mp4a_pay_handle_buffer): + Copy incomming timestamp to outgoing packets. + +2008-12-08 Wim Taymans <wim...@co...> * gst/rtp/gstrtpmp4vpay.c: (gst_rtp_mp4v_pay_flush), (gst_rtp_mp4v_pay_event): Don't try to push packets before we could find a valid config Index: gstrtpmp4apay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4apay.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- gstrtpmp4apay.c 25 Nov 2008 18:02:59 -0000 1.3 +++ gstrtpmp4apay.c 8 Dec 2008 12:37:45 -0000 1.4 @@ -366,6 +366,7 @@ guint count, mtu, size; guint8 *data; gboolean fragmented; + GstClockTime timestamp; ret = GST_FLOW_OK; @@ -373,6 +374,7 @@ size = GST_BUFFER_SIZE (buffer); data = GST_BUFFER_DATA (buffer); + timestamp = GST_BUFFER_TIMESTAMP (buffer); fragmented = FALSE; mtu = GST_BASE_RTP_PAYLOAD_MTU (rtpmp4apay); @@ -432,6 +434,9 @@ /* marker only if the packet is complete */ gst_rtp_buffer_set_marker (outbuf, size == 0); + /* copy incomming timestamp (if any) to outgoing buffers */ + GST_BUFFER_TIMESTAMP (outbuf) = timestamp; ret = gst_basertppayload_push (GST_BASE_RTP_PAYLOAD (rtpmp4apay), outbuf); fragmented = TRUE; |
From: <wt...@ke...> - 2008-12-09 14:19:41
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Tue Dec 09 2008 14:19:30 UTC Log message: * gst/rtp/gstrtpjpegdepay.c: (gst_rtp_jpeg_depay_process): Add an EOI marker at the end of the jpeg frame when it's missing. Fixes #563056. Modified files: . : ChangeLog gst/rtp : gstrtpjpegdepay.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.3857&r2=1.3858 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpjpegdepay.c.diff?r1=1.1&r2=1.2 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.3857 retrieving revision 1.3858 diff -u -d -r1.3857 -r1.3858 --- ChangeLog 9 Dec 2008 10:47:13 -0000 1.3857 +++ ChangeLog 9 Dec 2008 14:19:11 -0000 1.3858 @@ -1,3 +1,9 @@ +2008-12-09 Wim Taymans <wim...@co...> + + * gst/rtp/gstrtpjpegdepay.c: (gst_rtp_jpeg_depay_process): + Add an EOI marker at the end of the jpeg frame when it's missing. + Fixes #563056. 2008-12-09 Sebastian Dröge <seb...@co...> * tests/check/elements/videocrop.c: (check_1x1_buffer): Index: gstrtpjpegdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpjpegdepay.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- gstrtpjpegdepay.c 14 Nov 2008 18:41:29 -0000 1.1 +++ gstrtpjpegdepay.c 9 Dec 2008 14:19:16 -0000 1.2 @@ -549,7 +549,6 @@ GST_BUFFER_SIZE (outbuf) = size; gst_adapter_push (rtpjpegdepay->adapter, outbuf); - } /* take JPEG data, push in the adapter */ @@ -560,12 +559,32 @@ if (gst_rtp_buffer_get_marker (buf)) { guint avail; + guint8 end[2]; + guint8 *data; /* last buffer take all data out of the adapter */ avail = gst_adapter_available (rtpjpegdepay->adapter); + GST_DEBUG_OBJECT (rtpjpegdepay, "marker set, last buffer"); + /* take the last bytes of the jpeg data to see if there is an EOI + * marker */ + gst_adapter_copy (rtpjpegdepay->adapter, end, avail - 2, 2); + if (end[0] != 0xff && end[1] != 0xd9) { + GST_DEBUG_OBJECT (rtpjpegdepay, "no EOI marker, adding one"); + /* no EOI marker, add one */ + outbuf = gst_buffer_new_and_alloc (2); + data = GST_BUFFER_DATA (outbuf); + data[0] = 0xff; + data[1] = 0xd9; + gst_adapter_push (rtpjpegdepay->adapter, outbuf); + avail += 2; + } outbuf = gst_adapter_take_buffer (rtpjpegdepay->adapter, avail); - GST_DEBUG_OBJECT (rtpjpegdepay, "last buffer, returning %u bytes", avail); + GST_DEBUG_OBJECT (rtpjpegdepay, "returning %u bytes", avail); return outbuf; |