From: <wt...@ke...> - 2007-02-16 12:30:40
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Fri Feb 16 2007 12:30:34 UTC Log message: * gst/rtp/README: Fix case of string params. * gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process): Fix depayloader, support more packet types. Add sync codes to make sure the packetizer can do its job. * gst/rtp/gstrtpmp4gdepay.c: * gst/rtp/gstrtpmp4gpay.c: * gst/rtp/gstrtpmpvdepay.c: (gst_rtp_mpv_depay_process): Fix caps case again. Modified files: . : ChangeLog gst/rtp : README gstrtph264depay.c gstrtpmp4gdepay.c gstrtpmp4gpay.c gstrtpmpvdepay.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2743&r2=1.2744 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/README.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.7&r2=1.8 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gdepay.c.diff?r1=1.9&r2=1.10 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gpay.c.diff?r1=1.14&r2=1.15 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmpvdepay.c.diff?r1=1.2&r2=1.3 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2743 retrieving revision 1.2744 diff -u -d -r1.2743 -r1.2744 --- ChangeLog 15 Feb 2007 12:26:27 -0000 1.2743 +++ ChangeLog 16 Feb 2007 12:30:22 -0000 1.2744 @@ -1,3 +1,18 @@ +2007-02-16 Wim Taymans <wi...@fl...> + + * gst/rtp/README: + Fix case of string params. + * gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_class_init), + (gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process): + Fix depayloader, support more packet types. + Add sync codes to make sure the packetizer can do its job. + * gst/rtp/gstrtpmp4gdepay.c: + * gst/rtp/gstrtpmp4gpay.c: + * gst/rtp/gstrtpmpvdepay.c: (gst_rtp_mpv_depay_process): + Fix caps case again. 2007-02-15 Wim Taymans <wi...@fl...> * gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_process): Index: README RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/README,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- README 25 Jan 2007 14:22:53 -0000 1.10 +++ README 16 Feb 2007 12:30:22 -0000 1.11 @@ -43,7 +43,8 @@ Converted to lower-case. Optional parameters as key/value pairs, media type specific. The value type - should be of type G_TYPE_STRING. The key and value are converted to lower-case. + should be of type G_TYPE_STRING. The key is converted to lower-case. The + value is left in its original case. A parameter with no value is converted to <param>=1. Example: Index: gstrtph264depay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtph264depay.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- gstrtph264depay.c 15 Feb 2007 12:26:28 -0000 1.7 +++ gstrtph264depay.c 16 Feb 2007 12:30:22 -0000 1.8 @@ -26,6 +26,12 @@ #include <gst/rtp/gstrtpbuffer.h> #include "gstrtph264depay.h" +GST_DEBUG_CATEGORY_STATIC (rtph264depay_debug); +#define GST_CAT_DEFAULT (rtph264depay_debug) +/* 2 or 3 bytes syncword */ +static const guint8 sync_bytes[] = { 0, 0, 1 }; /* elementfactory information */ static const GstElementDetails gst_rtp_h264depay_details = GST_ELEMENT_DETAILS ("RTP packet depayloader", @@ -132,6 +138,9 @@ gobject_class->get_property = gst_rtp_h264_depay_get_property; gstelement_class->change_state = gst_rtp_h264_depay_change_state; + GST_DEBUG_CATEGORY_INIT (rtph264depay_debug, "rtph264depay", 0, + "H264 Video RTP Depayloader"); } static void @@ -203,11 +212,14 @@ static gboolean -gst_rtp_h264_depay_setcaps (GstBaseRTPDepayload * filter, GstCaps * caps) +gst_rtp_h264_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) { GstCaps *srccaps = NULL; gint clock_rate = 90000; GstStructure *structure = gst_caps_get_structure (caps, 0); + GstRtpH264Depay *rtph264depay; + rtph264depay = GST_RTP_H264_DEPAY (depayload); if (gst_structure_has_field (structure, "clock-rate")) { gst_structure_get_int (structure, "clock-rate", &clock_rate); @@ -235,25 +247,25 @@ /* we seriously overshoot the length, but it's fine. */ codec_data = gst_buffer_new_and_alloc (len); b64 = GST_BUFFER_DATA (codec_data); - total = 0; for (i = 0; params[i]; i++) { - *b64++ = 0; - *b64++ = 1; + GST_DEBUG_OBJECT (depayload, "decoding param %d", i); + memcpy (b64, sync_bytes, sizeof (sync_bytes)); + b64 += sizeof (sync_bytes); len = decode_base64 (params[i], b64); - total += (len + 3); + total += len + sizeof (sync_bytes); b64 += len; } GST_BUFFER_SIZE (codec_data) = total; - gst_caps_set_simple (srccaps, - "codec_data", GST_TYPE_BUFFER, codec_data, NULL); + /* don't set codec_data, we send unpacketized data so let the decoder + * packetize for us */ + gst_adapter_push (rtph264depay->adapter, codec_data); } - filter->clock_rate = clock_rate; + depayload->clock_rate = clock_rate; - gst_pad_set_caps (filter->srcpad, srccaps); + gst_pad_set_caps (depayload->srcpad, srccaps); gst_caps_unref (srccaps); return TRUE; @@ -262,9 +274,9 @@ static GstBuffer * gst_rtp_h264_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) GstRtpH264Depay *rtph264depay; GstBuffer *outbuf; + guint8 nal_unit_type; rtph264depay = GST_RTP_H264_DEPAY (depayload); @@ -275,11 +287,15 @@ gint payload_len; guint8 *payload; guint header_len; - guint8 nal_ref_idc, nal_unit_type; + guint8 nal_ref_idc; + guint8 *outdata; + guint outsize, nalu_size; payload_len = gst_rtp_buffer_get_payload_len (buf); payload = gst_rtp_buffer_get_payload (buf); + GST_DEBUG_OBJECT (rtph264depay, "receiving %d bytes", payload_len); /* +---------------+ * |0|1|2|3|4|5|6|7| * +-+-+-+-+-+-+-+-+ @@ -291,6 +307,9 @@ nal_ref_idc = (payload[0] & 0x60) >> 5; nal_unit_type = payload[0] & 0x1f; + /* at least one byte header with type */ + header_len = 1; GST_DEBUG_OBJECT (rtph264depay, "NRI %d, Type %d", nal_ref_idc, nal_unit_type); @@ -300,18 +319,60 @@ case 31: /* undefined */ goto undefined_type; - case 24: - /* STAP-A Single-time aggregation packet 5.7.1 */ - header_len = 1; - goto not_implemented; - break; case 25: /* STAP-B Single-time aggregation packet 5.7.1 */ + /* 2 byte extra header for DON */ + header_len += 2; + /* fallthrough */ + case 24: + { + /* strip headers */ + payload += header_len; + payload_len -= header_len; + /* STAP-A Single-time aggregation packet 5.7.1 */ + while (payload_len > 2) { + /* 1 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | NALU Size | + */ + nalu_size = (payload[0] << 8) | payload[1]; + /* strip NALU size */ + payload += 2; + payload_len -= 2; + if (nalu_size > payload_len) + nalu_size = payload_len; + outsize = nalu_size + sizeof (sync_bytes); + outbuf = gst_buffer_new_and_alloc (outsize); + outdata = GST_BUFFER_DATA (outbuf); + memcpy (outdata, sync_bytes, sizeof (sync_bytes)); + outdata += sizeof (sync_bytes); + memcpy (outdata, payload, nalu_size); + gst_adapter_push (rtph264depay->adapter, outbuf); + payload += nalu_size; + payload_len -= nalu_size; + } + outsize = gst_adapter_available (rtph264depay->adapter); + outbuf = gst_adapter_take_buffer (rtph264depay->adapter, outsize); + gst_buffer_set_caps (outbuf, GST_PAD_CAPS (depayload->srcpad)); + return outbuf; + } case 26: /* MTAP16 Multi-time aggregation packet 5.7.2 */ + header_len = 5; case 27: /* MTAP24 Multi-time aggregation packet 5.7.2 */ - header_len = 3; + header_len = 6; goto not_implemented; break; case 28: @@ -336,33 +397,40 @@ if (S) { /* NAL unit starts here */ - guint8 *outdata; - guint outsize; + guint8 nal_header; - outsize = payload_len - 1; + /* reconstruct NAL header */ + nal_header = (payload[0] & 0xe0) | (payload[1] & 0x1f); - outbuf = gst_buffer_new_and_alloc (outsize + 3); + /* strip type header, keep FU header, we'll reuse it to reconstruct + * the NAL header. */ + payload += 1; + payload_len -= 1; + nalu_size = payload_len; outdata = GST_BUFFER_DATA (outbuf); - memcpy (outdata + 3, payload + 1, outsize); - /* reconstruct NAL header */ - outdata[0] = 0x00; - outdata[1] = 0x00; - outdata[2] = 0x01; - outdata[3] = (payload[0] & 0xe0) | (payload[1] & 0x1f); + outdata[0] = nal_header; + GST_DEBUG_OBJECT (rtph264depay, "queueing %d bytes", outsize); /* and assemble in the adapter */ gst_adapter_push (rtph264depay->adapter, outbuf); } else { - /* NAL unit data */ - /* strip off 2 header bytes */ - outsize = payload_len - 2; + /* strip off FU indicator and FU header bytes */ + outsize = payload_len; outbuf = gst_buffer_new_and_alloc (outsize); - memcpy (outdata, payload + 2, outsize); + memcpy (outdata, payload, outsize); @@ -370,16 +438,8 @@ /* if NAL unit ends, flush the adapter */ if (E) { outsize = gst_adapter_available (rtph264depay->adapter); - outdata = gst_adapter_take (rtph264depay->adapter, outsize); - outbuf = gst_buffer_new (); - GST_BUFFER_SIZE (outbuf) = outsize; - GST_BUFFER_DATA (outbuf) = outdata; - GST_BUFFER_MALLOCDATA (outbuf) = outdata; + outbuf = gst_adapter_take_buffer (rtph264depay->adapter, outsize); gst_buffer_set_caps (outbuf, GST_PAD_CAPS (depayload->srcpad)); @@ -391,18 +451,15 @@ } default: { - guint outsize; - guint8 *outdata; /* 1-23 NAL unit Single NAL unit packet per H.264 5.6 */ /* the entire payload is the output buffer */ - outsize = payload_len + 3; + nalu_size = payload_len; + outsize = nalu_size + sizeof (sync_bytes); outbuf = gst_buffer_new_and_alloc (outsize); outdata = GST_BUFFER_DATA (outbuf); - outdata[0] = 0; - outdata[1] = 0; - outdata[2] = 1; - memcpy (&outdata[3], payload, payload_len); + memcpy (outdata, sync_bytes, sizeof (sync_bytes)); + outdata += sizeof (sync_bytes); + memcpy (outdata, payload, nalu_size); gst_buffer_set_caps (outbuf, GST_PAD_CAPS (depayload->srcpad)); @@ -417,19 +474,19 @@ bad_packet: { GST_ELEMENT_WARNING (rtph264depay, STREAM, DECODE, - ("Packet did not validate"), (NULL)); + (NULL), ("Packet did not validate")); return NULL; undefined_type: - ("Undefined packet type"), (NULL)); + (NULL), ("Undefined packet type")); not_implemented: GST_ELEMENT_ERROR (rtph264depay, STREAM, FORMAT, - (NULL), ("NAL unit type not supported yet")); + (NULL), ("NAL unit type %d not supported yet", nal_unit_type)); Index: gstrtpmp4gdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gdepay.c,v retrieving revision 1.9 diff -u -d -r1.9 -r1.10 --- gstrtpmp4gdepay.c 25 Jan 2007 14:22:53 -0000 1.9 +++ gstrtpmp4gdepay.c 16 Feb 2007 12:30:22 -0000 1.10 @@ -70,7 +70,7 @@ "streamtype = (string) { \"4\", \"5\" }, " /* 4 = video, 5 = audio */ /* "profile-level-id = (string) [1,MAX], " */ /* "config = (string) [1,MAX]" */ - "mode = (string) { \"generic\", \"celp-cbr\", \"celp-vbr\", \"aac-lbr\", \"aac-hbr\" } " + "mode = (string) { \"generic\", \"CELP-cbr\", \"CELP-vbr\", \"AAC-lbr\", \"AAC-hbr\" } " /* Optional general parameters */ /* "objecttype = (string) [1,MAX], " */ /* "constantsize = (string) [1,MAX], " *//* constant size of each AU */ Index: gstrtpmp4gpay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gpay.c,v retrieving revision 1.14 retrieving revision 1.15 diff -u -d -r1.14 -r1.15 --- gstrtpmp4gpay.c 25 Jan 2007 14:22:53 -0000 1.14 +++ gstrtpmp4gpay.c 16 Feb 2007 12:30:22 -0000 1.15 @@ -59,7 +59,7 @@ Index: gstrtpmpvdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmpvdepay.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- gstrtpmpvdepay.c 24 Jan 2007 12:22:50 -0000 1.2 +++ gstrtpmpvdepay.c 16 Feb 2007 12:30:22 -0000 1.3 @@ -217,20 +217,13 @@ GST_ELEMENT_WARNING (rtpmpvdepay, STREAM, DECODE, - ("Packet did not validate."), (NULL)); - return NULL; - } -#if 0 -bad_payload: - { - GST_DEBUG_OBJECT (rtpmpvdepay, "Unexpected payload type %u", pt); + (NULL), ("Packet did not validate.")); -#endif empty_packet: - ("Empty payload."), (NULL)); + (NULL), ("Empty payload.")); |
From: <wt...@ke...> - 2007-02-18 13:24:42
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Sun Feb 18 2007 13:24:38 UTC Log message: * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: (plugin_init): * gst/rtp/gstrtpmp2tpay.c: (gst_rtp_mp2t_pay_base_init), (gst_rtp_mp2t_pay_class_init), (gst_rtp_mp2t_pay_init), (gst_rtp_mp2t_pay_setcaps), (gst_rtp_mp2t_pay_handle_buffer), (gst_rtp_mp2t_pay_plugin_init): * gst/rtp/gstrtpmp2tpay.h: Added simple mpeg transport stream payloader. Modified files: . : ChangeLog gst/rtp : Makefile.am gstrtp.c Added files: gst/rtp : gstrtpmp2tpay.c gstrtpmp2tpay.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2745&r2=1.2746 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/Makefile.am.diff?r1=1.39&r2=1.40 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtp.c.diff?r1=1.35&r2=1.36 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp2tpay.c?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp2tpay.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.2745 retrieving revision 1.2746 diff -u -d -r1.2745 -r1.2746 --- ChangeLog 16 Feb 2007 12:32:00 -0000 1.2745 +++ ChangeLog 18 Feb 2007 13:24:25 -0000 1.2746 @@ -1,3 +1,14 @@ +2007-02-18 Wim Taymans <wi...@fl...> + + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: (plugin_init): + * gst/rtp/gstrtpmp2tpay.c: (gst_rtp_mp2t_pay_base_init), + (gst_rtp_mp2t_pay_class_init), (gst_rtp_mp2t_pay_init), + (gst_rtp_mp2t_pay_setcaps), (gst_rtp_mp2t_pay_handle_buffer), + (gst_rtp_mp2t_pay_plugin_init): + * gst/rtp/gstrtpmp2tpay.h: + Added simple mpeg transport stream payloader. 2007-02-16 Wim Taymans <wi...@fl...> * gst/rtsp/URLS: Index: Makefile.am RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/Makefile.am,v retrieving revision 1.39 retrieving revision 1.40 diff -u -d -r1.39 -r1.40 --- Makefile.am 24 Jan 2007 18:20:14 -0000 1.39 +++ Makefile.am 18 Feb 2007 13:24:26 -0000 1.40 @@ -25,6 +25,7 @@ gstrtpL16pay.c \ gstasteriskh263.c \ gstrtpmp2tdepay.c \ + gstrtpmp2tpay.c \ gstrtpmp4vdepay.c \ gstrtpmp4vpay.c \ gstrtpmp4gdepay.c \ @@ -72,6 +73,7 @@ gstrtph263pay.h \ gstrtph264depay.h \ gstrtpmp2tdepay.h \ + gstrtpmp2tpay.h \ gstrtpmp4vdepay.h \ gstrtpmp4vpay.h \ gstrtpmp4gdepay.h \ Index: gstrtp.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtp.c,v retrieving revision 1.35 retrieving revision 1.36 diff -u -d -r1.35 -r1.36 --- gstrtp.c 24 Jan 2007 18:20:14 -0000 1.35 +++ gstrtp.c 18 Feb 2007 13:24:26 -0000 1.36 @@ -44,6 +44,7 @@ #include "gstrtpL16pay.h" #include "gstasteriskh263.h" #include "gstrtpmp2tdepay.h" +#include "gstrtpmp2tpay.h" #include "gstrtpmp4vdepay.h" #include "gstrtpmp4vpay.h" #include "gstrtpmp4gdepay.h" @@ -128,6 +129,9 @@ if (!gst_rtp_mp2t_depay_plugin_init (plugin)) return FALSE; + if (!gst_rtp_mp2t_pay_plugin_init (plugin)) + return FALSE; if (!gst_rtp_mp4v_pay_plugin_init (plugin)) --- NEW FILE: gstrtpmp2tpay.c --- /* GStreamer * Copyright (C) <2007> Wim Taymans <wi...@fl...> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include <stdlib.h> #include <string.h> #include <gst/rtp/gstrtpbuffer.h> #include "gstrtpmp2tpay.h" /* elementfactory information */ static const GstElementDetails gst_rtp_mp2t_pay_details = GST_ELEMENT_DETAILS ("RTP MP2T audio payloader", "Codec/Payloader/Network", "Payload-encodes MPEG2 TS into RTP packets (RFC 2250)", "Wim Taymans <wi...@fl...>"); static GstStaticPadTemplate gst_rtp_mp2t_pay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/mpegts," "packetsize=(int)188," "systemstream=(boolean)true") ); static GstStaticPadTemplate gst_rtp_mp2t_pay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"video\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) 90000, " "encoding-name = (string) \"MP2T-ES\"") static gboolean gst_rtp_mp2t_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps); static GstFlowReturn gst_rtp_mp2t_pay_handle_buffer (GstBaseRTPPayload * payload, GstBuffer * buffer); GST_BOILERPLATE (GstRTPMP2TPay, gst_rtp_mp2t_pay, GstBaseRTPPayload, GST_TYPE_BASE_RTP_PAYLOAD); static void gst_rtp_mp2t_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_mp2t_pay_sink_template)); gst_static_pad_template_get (&gst_rtp_mp2t_pay_src_template)); gst_element_class_set_details (element_class, &gst_rtp_mp2t_pay_details); } gst_rtp_mp2t_pay_class_init (GstRTPMP2TPayClass * klass) GObjectClass *gobject_class; GstElementClass *gstelement_class; GstBaseRTPPayloadClass *gstbasertppayload_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; gstbasertppayload_class->set_caps = gst_rtp_mp2t_pay_setcaps; gstbasertppayload_class->handle_buffer = gst_rtp_mp2t_pay_handle_buffer; gst_rtp_mp2t_pay_init (GstRTPMP2TPay * rtpmp2tpay, GstRTPMP2TPayClass * klass) GST_BASE_RTP_PAYLOAD (rtpmp2tpay)->clock_rate = 90000; GST_BASE_RTP_PAYLOAD_PT (rtpmp2tpay) = GST_RTP_PAYLOAD_MP2T; static gboolean gst_rtp_mp2t_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps) const char *stname; GstStructure *structure; structure = gst_caps_get_structure (caps, 0); stname = gst_structure_get_name (structure); gst_basertppayload_set_options (payload, "video", TRUE, "MP2T-ES", 90000); gst_basertppayload_set_outcaps (payload, NULL); return TRUE; static GstFlowReturn gst_rtp_mp2t_pay_handle_buffer (GstBaseRTPPayload * basepayload, GstBuffer * buffer) GstRTPMP2TPay *rtpmp2tpay; guint size, payload_len; GstBuffer *outbuf; guint8 *payload, *data; GstClockTime timestamp; GstFlowReturn ret; rtpmp2tpay = GST_RTP_MP2T_PAY (basepayload); size = GST_BUFFER_SIZE (buffer); data = GST_BUFFER_DATA (buffer); timestamp = GST_BUFFER_TIMESTAMP (buffer); /* FIXME, only one MP2T frame per RTP packet for now */ payload_len = size; outbuf = gst_rtp_buffer_new_allocate (payload_len, 0, 0); /* copy timestamp */ GST_BUFFER_TIMESTAMP (outbuf) = timestamp; /* get payload */ payload = gst_rtp_buffer_get_payload (outbuf); /* copy data in payload */ memcpy (payload, data, size); gst_buffer_unref (buffer); GST_DEBUG_OBJECT (rtpmp2tpay, "pushing buffer of size %d", GST_BUFFER_SIZE (outbuf)); ret = gst_basertppayload_push (basepayload, outbuf); return ret; gboolean gst_rtp_mp2t_pay_plugin_init (GstPlugin * plugin) return gst_element_register (plugin, "rtpmp2tpay", GST_RANK_NONE, GST_TYPE_RTP_MP2T_PAY); --- NEW FILE: gstrtpmp2tpay.h --- #ifndef __GST_RTP_MP2T_PAY_H__ #define __GST_RTP_MP2T_PAY_H__ #include <gst/gst.h> #include <gst/rtp/gstbasertppayload.h> G_BEGIN_DECLS typedef struct _GstRTPMP2TPay GstRTPMP2TPay; typedef struct _GstRTPMP2TPayClass GstRTPMP2TPayClass; #define GST_TYPE_RTP_MP2T_PAY \ (gst_rtp_mp2t_pay_get_type()) #define GST_RTP_MP2T_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_MP2T_PAY,GstRTPMP2TPay)) #define GST_RTP_MP2T_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_MP2T_PAY,GstRTPMP2TPayClass)) #define GST_IS_RTP_MP2T_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_MP2T_PAY)) #define GST_IS_RTP_MP2T_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_MP2T_PAY)) struct _GstRTPMP2TPay GstBaseRTPPayload payload; }; struct _GstRTPMP2TPayClass GstBaseRTPPayloadClass parent_class; gboolean gst_rtp_mp2t_pay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_MP2T_PAY_H__ */ |
From: <wt...@ke...> - 2007-03-02 12:16:32
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Fri Mar 02 2007 12:16:28 UTC Log message: Patch by: Thijs Vermeir <thijsvermeir at gmail dot com> * gst/rtp/gstrtpmp2tdepay.c: (gst_rtp_mp2t_depay_class_init), (gst_rtp_mp2t_depay_init), (gst_rtp_mp2t_depay_process), (gst_rtp_mp2t_depay_set_property), (gst_rtp_mp2t_depay_get_property): * gst/rtp/gstrtpmp2tdepay.h: Add support to strip off proprietary headers. Fixes #350278. Modified files: . : ChangeLog gst/rtp : gstrtpmp2tdepay.c gstrtpmp2tdepay.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2774&r2=1.2775 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp2tdepay.c.diff?r1=1.5&r2=1.6 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp2tdepay.h.diff?r1=1.1&r2=1.2 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2774 retrieving revision 1.2775 diff -u -d -r1.2774 -r1.2775 --- ChangeLog 2 Mar 2007 11:22:35 -0000 1.2774 +++ ChangeLog 2 Mar 2007 12:16:15 -0000 1.2775 @@ -1,5 +1,16 @@ 2007-03-02 Wim Taymans <wi...@fl...> + Patch by: Thijs Vermeir <thijsvermeir at gmail dot com> + + * gst/rtp/gstrtpmp2tdepay.c: (gst_rtp_mp2t_depay_class_init), + (gst_rtp_mp2t_depay_init), (gst_rtp_mp2t_depay_process), + (gst_rtp_mp2t_depay_set_property), + (gst_rtp_mp2t_depay_get_property): + * gst/rtp/gstrtpmp2tdepay.h: + Add support to strip off proprietary headers. Fixes #350278. +2007-03-02 Wim Taymans <wi...@fl...> * ext/hal/hal.c: Fix compilation. Index: gstrtpmp2tdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp2tdepay.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- gstrtpmp2tdepay.c 24 Jan 2007 15:18:34 -0000 1.5 +++ gstrtpmp2tdepay.c 2 Mar 2007 12:16:16 -0000 1.6 @@ -31,7 +31,8 @@ GST_ELEMENT_DETAILS ("RTP packet depayloader", "Codec/Depayloader/Network", "Extracts MPEG2 TS from RTP packets (RFC 2250)", - "Wim Taymans <wi...@fl...>"); + "Wim Taymans <wi...@fl...>\n" + "Thijs Vermeir <thi...@ba...>"); /* RtpMP2TDepay signals and args */ enum @@ -40,10 +41,12 @@ LAST_SIGNAL }; +#define DEFAULT_SKIP_FIRST_BYTES 0 { - ARG_0, - ARG_FREQUENCY + PROP_0, + PROP_SKIP_FIRST_BYTES static GstStaticPadTemplate gst_rtp_mp2t_depay_src_template = @@ -123,13 +126,24 @@ gobject_class->set_property = gst_rtp_mp2t_depay_set_property; gobject_class->get_property = gst_rtp_mp2t_depay_get_property; + g_object_class_install_property (gobject_class, PROP_SKIP_FIRST_BYTES, + g_param_spec_uint ("skip-first-bytes", + "Skip first bytes", + "The amount of bytes that need to be skipped at the beginning of the payload", + 0, G_MAXUINT, 0, G_PARAM_READWRITE)); gstelement_class->change_state = gst_rtp_mp2t_depay_change_state; } static void -gst_rtp_mp2t_depay_init (GstRtpMP2TDepay * rtpmp2tdepay, +gst_rtp_mp2t_depay_init (GstRtpMP2TDepay * depayload, GstRtpMP2TDepayClass * klass) + GstRtpMP2TDepay *rtpmp2tdepay; + rtpmp2tdepay = GST_RTP_MP2T_DEPAY (depayload); + rtpmp2tdepay->skip_first_bytes = DEFAULT_SKIP_FIRST_BYTES; static gboolean @@ -159,21 +173,22 @@ GstRtpMP2TDepay *rtpmp2tdepay; GstBuffer *outbuf; gint payload_len; - guint8 *payload; guint32 timestamp; rtpmp2tdepay = GST_RTP_MP2T_DEPAY (depayload); - if (!gst_rtp_buffer_validate (buf)) + if (G_UNLIKELY (!gst_rtp_buffer_validate (buf))) goto bad_packet; payload_len = gst_rtp_buffer_get_payload_len (buf); - payload = gst_rtp_buffer_get_payload (buf); + if (G_UNLIKELY (payload_len <= rtpmp2tdepay->skip_first_bytes)) + goto empty_packet; timestamp = gst_rtp_buffer_get_timestamp (buf); - outbuf = gst_buffer_new_and_alloc (payload_len); - memcpy (GST_BUFFER_DATA (outbuf), payload, payload_len); + outbuf = + gst_rtp_buffer_get_payload_subbuffer (rtpmp2tdepay->skip_first_bytes, -1); gst_buffer_set_caps (outbuf, GST_PAD_CAPS (depayload->srcpad)); GST_BUFFER_TIMESTAMP (outbuf) = @@ -184,10 +199,17 @@ return outbuf; + /* ERRORS */ bad_packet: { GST_ELEMENT_WARNING (rtpmp2tdepay, STREAM, DECODE, - ("Packet did not validate"), (NULL)); + (NULL), ("Packet did not validate")); + return NULL; + } +empty_packet: + { + GST_ELEMENT_WARNING (rtpmp2tdepay, STREAM, DECODE, + (NULL), ("Packet was empty")); return NULL; } @@ -201,6 +223,9 @@ rtpmp2tdepay = GST_RTP_MP2T_DEPAY (object); switch (prop_id) { + case PROP_SKIP_FIRST_BYTES: + rtpmp2tdepay->skip_first_bytes = g_value_get_uint (value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -216,6 +241,9 @@ + g_value_set_uint (value, rtpmp2tdepay->skip_first_bytes); Index: gstrtpmp2tdepay.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp2tdepay.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- gstrtpmp2tdepay.h 12 Jul 2006 09:34:15 -0000 1.1 +++ gstrtpmp2tdepay.h 2 Mar 2007 12:16:16 -0000 1.2 @@ -36,13 +36,14 @@ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_MP2T_DEPAY)) #define GST_IS_RTP_MP2T_DEPAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_MP2T_DEPAY)) - typedef struct _GstRtpMP2TDepay GstRtpMP2TDepay; typedef struct _GstRtpMP2TDepayClass GstRtpMP2TDepayClass; struct _GstRtpMP2TDepay GstBaseRTPDepayload depayload; + guint8 skip_first_bytes; struct _GstRtpMP2TDepayClass |
From: <wt...@ke...> - 2007-03-02 12:53:11
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Fri Mar 02 2007 12:53:08 UTC Log message: * gst/rtp/gstrtpmp2tdepay.c: (gst_rtp_mp2t_depay_process): Fix compilation. Modified files: . : ChangeLog gst/rtp : gstrtpmp2tdepay.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2775&r2=1.2776 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp2tdepay.c.diff?r1=1.6&r2=1.7 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2775 retrieving revision 1.2776 diff -u -d -r1.2775 -r1.2776 --- ChangeLog 2 Mar 2007 12:16:15 -0000 1.2775 +++ ChangeLog 2 Mar 2007 12:52:55 -0000 1.2776 @@ -1,5 +1,10 @@ 2007-03-02 Wim Taymans <wi...@fl...> + * gst/rtp/gstrtpmp2tdepay.c: (gst_rtp_mp2t_depay_process): + Fix compilation. + +2007-03-02 Wim Taymans <wi...@fl...> Patch by: Thijs Vermeir <thijsvermeir at gmail dot com> * gst/rtp/gstrtpmp2tdepay.c: (gst_rtp_mp2t_depay_class_init), Index: gstrtpmp2tdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp2tdepay.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- gstrtpmp2tdepay.c 2 Mar 2007 12:16:16 -0000 1.6 +++ gstrtpmp2tdepay.c 2 Mar 2007 12:52:56 -0000 1.7 @@ -188,7 +188,8 @@ timestamp = gst_rtp_buffer_get_timestamp (buf); outbuf = - gst_rtp_buffer_get_payload_subbuffer (rtpmp2tdepay->skip_first_bytes, -1); + gst_rtp_buffer_get_payload_subbuffer (buf, rtpmp2tdepay->skip_first_bytes, + -1); gst_buffer_set_caps (outbuf, GST_PAD_CAPS (depayload->srcpad)); GST_BUFFER_TIMESTAMP (outbuf) = |
From: <wt...@ke...> - 2007-03-05 16:39:45
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Mon Mar 05 2007 16:39:41 UTC Log message: * gst/rtp/gstrtpspeexdepay.c: (gst_rtp_speex_depay_class_init), (gst_rtp_speex_depay_get_mode), (gst_rtp_speex_depay_setcaps), (gst_rtp_speex_depay_process): * gst/rtp/gstrtpspeexpay.c: (gst_rtp_speex_pay_base_init), (gst_rtp_speex_pay_class_init), (gst_rtp_speex_pay_setcaps), (gst_rtp_speex_pay_parse_ident), (gst_rtp_speex_pay_handle_buffer), (gst_rtp_speex_pay_change_state): * gst/rtp/gstrtpspeexpay.h: Fix speex (de)payloader. Fixes #358040. Modified files: . : ChangeLog gst/rtp : gstrtpspeexdepay.c gstrtpspeexpay.c gstrtpspeexpay.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2795&r2=1.2796 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpspeexdepay.c.diff?r1=1.12&r2=1.13 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpspeexpay.c.diff?r1=1.12&r2=1.13 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpspeexpay.h.diff?r1=1.5&r2=1.6 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2795 retrieving revision 1.2796 diff -u -d -r1.2795 -r1.2796 --- ChangeLog 5 Mar 2007 15:42:58 -0000 1.2795 +++ ChangeLog 5 Mar 2007 16:39:29 -0000 1.2796 @@ -1,3 +1,15 @@ +2007-03-05 Wim Taymans <wi...@fl...> + + * gst/rtp/gstrtpspeexdepay.c: (gst_rtp_speex_depay_class_init), + (gst_rtp_speex_depay_get_mode), (gst_rtp_speex_depay_setcaps), + (gst_rtp_speex_depay_process): + * gst/rtp/gstrtpspeexpay.c: (gst_rtp_speex_pay_base_init), + (gst_rtp_speex_pay_class_init), (gst_rtp_speex_pay_setcaps), + (gst_rtp_speex_pay_parse_ident), (gst_rtp_speex_pay_handle_buffer), + (gst_rtp_speex_pay_change_state): + * gst/rtp/gstrtpspeexpay.h: + Fix speex (de)payloader. Fixes #358040. 2007-03-05 Jan Schmidt <th...@ma...> * ext/gconf/gstswitchsink.c: (gst_switch_sink_reset), Index: gstrtpspeexdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpspeexdepay.c,v retrieving revision 1.12 retrieving revision 1.13 diff -u -d -r1.12 -r1.13 --- gstrtpspeexdepay.c 25 Jan 2007 14:22:53 -0000 1.12 +++ gstrtpspeexdepay.c 5 Mar 2007 16:39:29 -0000 1.13 @@ -94,8 +94,6 @@ gstelement_class = (GstElementClass *) klass; gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; - parent_class = g_type_class_peek_parent (klass); - gstbasertpdepayload_class->process = gst_rtp_speex_depay_process; gstbasertpdepayload_class->set_caps = gst_rtp_speex_depay_setcaps; } @@ -107,37 +105,104 @@ GST_BASE_RTP_DEPAYLOAD (rtpspeexdepay)->clock_rate = 8000; +static gint +gst_rtp_speex_depay_get_mode (gint rate) +{ + if (rate > 25000) + return 2; + else if (rate > 12500) + return 1; + else + return 0; +} +/* len 4 bytes LE, + * vendor string (len bytes), + * user_len 4 (0) bytes LE + */ +static const gchar gst_rtp_speex_comment[] = + "\045\0\0\0Depayloaded with GStreamer speexdepay\0\0\0\0"; static gboolean gst_rtp_speex_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) { - GstCaps *srccaps; - gboolean ret; + GstStructure *structure; + GstRtpSPEEXDepay *rtpspeexdepay; + gint clock_rate, nb_channels; + GstBuffer *buf; + guint8 *data; + const gchar *params; - srccaps = - gst_static_pad_template_get_caps (&gst_rtp_speex_depay_src_template); - ret = gst_pad_set_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload), srccaps); + rtpspeexdepay = GST_RTP_SPEEX_DEPAY (depayload); - gst_caps_unref (srccaps); - return ret; + structure = gst_caps_get_structure (caps, 0); + gst_structure_get_int (structure, "clock-rate", &clock_rate); + depayload->clock_rate = clock_rate; + if (!(params = gst_structure_get_string (structure, "encoding-params"))) + nb_channels = 1; + else { + nb_channels = atoi (params); + } + /* construct minimal header and comment packet for the decoder */ + buf = gst_buffer_new_and_alloc (80); + data = GST_BUFFER_DATA (buf); + memcpy (data, "Speex ", 8); + data += 8; + memcpy (data, "1.1.12", 7); + data += 20; + GST_WRITE_UINT32_LE (data, 1); /* version */ + data += 4; + GST_WRITE_UINT32_LE (data, 80); /* header_size */ + GST_WRITE_UINT32_LE (data, clock_rate); /* rate */ + GST_WRITE_UINT32_LE (data, gst_rtp_speex_depay_get_mode (clock_rate)); /* mode */ + GST_WRITE_UINT32_LE (data, 4); /* mode_bitstream_version */ + GST_WRITE_UINT32_LE (data, nb_channels); /* nb_channels */ + GST_WRITE_UINT32_LE (data, -1); /* bitrate */ + GST_WRITE_UINT32_LE (data, 0xa0); /* frame_size */ + GST_WRITE_UINT32_LE (data, 0); /* VBR */ + GST_WRITE_UINT32_LE (data, 1); /* frames_per_packet */ + GST_WRITE_UINT32_LE (data, 0); /* extra_headers */ + GST_WRITE_UINT32_LE (data, 0); /* reserved1 */ + GST_WRITE_UINT32_LE (data, 0); /* reserved2 */ + 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)); + return TRUE; static GstBuffer * gst_rtp_speex_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) GstBuffer *outbuf = NULL; - gint payload_len; - guint8 *payload; GST_DEBUG ("process : got %d bytes, mark %d ts %u seqn %d", GST_BUFFER_SIZE (buf), gst_rtp_buffer_get_marker (buf), gst_rtp_buffer_get_timestamp (buf), gst_rtp_buffer_get_seq (buf)); - payload_len = gst_rtp_buffer_get_payload_len (buf); - payload = gst_rtp_buffer_get_payload (buf); + /* nothing special to be done */ + outbuf = gst_rtp_buffer_get_payload_buffer (buf); - outbuf = gst_buffer_new_and_alloc (payload_len); - memcpy (GST_BUFFER_DATA (outbuf), payload, payload_len); return outbuf; Index: gstrtpspeexpay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpspeexpay.c,v --- gstrtpspeexpay.c 25 Jan 2007 14:22:53 -0000 1.12 +++ gstrtpspeexpay.c 5 Mar 2007 16:39:29 -0000 1.13 @@ -27,6 +27,9 @@ #include "gstrtpspeexpay.h" +GST_DEBUG_CATEGORY_STATIC (rtpspeexpay_debug); +#define GST_CAT_DEFAULT (rtpspeexpay_debug) /* elementfactory information */ static const GstElementDetails gst_rtp_speex_pay_details = GST_ELEMENT_DETAILS ("RTP packet payloader", @@ -48,11 +51,14 @@ GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " - "clock-rate = (int) 8000, " + "clock-rate = (int) [ 6000, 48000 ], " "encoding-name = (string) \"SPEEX\", " "encoding-params = (string) \"1\"") ); +static GstStateChangeReturn gst_rtp_speex_pay_change_state (GstElement * + element, GstStateChange transition); static gboolean gst_rtp_speex_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps); static GstFlowReturn gst_rtp_speex_pay_handle_buffer (GstBaseRTPPayload * @@ -71,6 +77,9 @@ gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&gst_rtp_speex_pay_src_template)); gst_element_class_set_details (element_class, &gst_rtp_speex_pay_details); + GST_DEBUG_CATEGORY_INIT (rtpspeexpay_debug, "rtpspeexpay", 0, + "Speex RTP Payloader"); static void @@ -84,7 +93,7 @@ gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; + gstelement_class->change_state = gst_rtp_speex_pay_change_state; gstbasertppayload_class->set_caps = gst_rtp_speex_pay_setcaps; gstbasertppayload_class->handle_buffer = gst_rtp_speex_pay_handle_buffer; @@ -101,10 +110,95 @@ gst_rtp_speex_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps) - gst_basertppayload_set_options (payload, "audio", FALSE, "speex", 8000); - gst_basertppayload_set_outcaps (payload, NULL); + /* don't configure yet, we wait for the ident packet */ +static gboolean +gst_rtp_speex_pay_parse_ident (GstRtpSPEEXPay * rtpspeexpay, + const guint8 * data, guint size) + 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. */ + if (size < 36) + goto too_small; + if (!g_str_has_prefix ((const gchar *) data, "Speex ")) + goto wrong_header; + /* skip header and version string */ + data += 28; + version = GST_READ_UINT32_LE (data); + if (version != 1) + goto wrong_version; + /* ensure sizes */ + header_size = GST_READ_UINT32_LE (data); + if (header_size < 80) + goto header_too_small; + if (size < header_size) + goto payload_too_small; + rate = GST_READ_UINT32_LE (data); + mode = GST_READ_UINT32_LE (data); + nb_channels = GST_READ_UINT32_LE (data); + GST_DEBUG_OBJECT (rtpspeexpay, "rate %d, mode %d, nb_channels %d", + rate, mode, nb_channels); + payload = GST_BASE_RTP_PAYLOAD (rtpspeexpay); + gst_basertppayload_set_options (payload, "audio", FALSE, "SPEEX", rate); + cstr = g_strdup_printf ("%d", nb_channels); + gst_basertppayload_set_outcaps (payload, "encoding-params", + G_TYPE_STRING, cstr, NULL); + g_free (cstr); return TRUE; + /* ERRORS */ +too_small: + { + GST_DEBUG_OBJECT (rtpspeexpay, + "ident packet too small, need at least 32 bytes"); + return FALSE; +wrong_header: + "ident packet does not start with \"Speex \""); +wrong_version: + GST_DEBUG_OBJECT (rtpspeexpay, "can only handle version 1, have version %d", + version); +header_too_small: + "header size too small, need at least 80 bytes, " "got only %d", + header_size); +payload_too_small: + "payload too small, need at least %d bytes, got only %d", header_size, + size); static GstFlowReturn @@ -121,6 +215,26 @@ rtpspeexpay = GST_RTP_SPEEX_PAY (basepayload); size = GST_BUFFER_SIZE (buffer); + data = GST_BUFFER_DATA (buffer); + switch (rtpspeexpay->packet) { + case 0: + /* ident packet. We need to parse the headers to construct the RTP + * properties. */ + if (!gst_rtp_speex_pay_parse_ident (rtpspeexpay, data, size)) + goto parse_error; + ret = GST_FLOW_OK; + goto done; + case 1: + /* comment packet, we ignore it */ + default: + /* other packets go in the payload */ + break; timestamp = GST_BUFFER_TIMESTAMP (buffer); /* FIXME, only one SPEEX frame per RTP packet for now */ @@ -135,8 +249,6 @@ /* get payload */ payload = gst_rtp_buffer_get_payload (outbuf); - data = GST_BUFFER_DATA (buffer); /* copy data in payload */ memcpy (&payload[0], data, size); @@ -144,6 +256,46 @@ ret = gst_basertppayload_push (basepayload, outbuf); +done: + rtpspeexpay->packet++; + return ret; +parse_error: + GST_ELEMENT_ERROR (rtpspeexpay, STREAM, DECODE, (NULL), + ("Error parsing first identification packet.")); + return GST_FLOW_ERROR; +static GstStateChangeReturn +gst_rtp_speex_pay_change_state (GstElement * element, GstStateChange transition) + GstRtpSPEEXPay *rtpspeexpay; + GstStateChangeReturn ret; + rtpspeexpay = GST_RTP_SPEEX_PAY (element); + switch (transition) { + case GST_STATE_CHANGE_NULL_TO_READY: + case GST_STATE_CHANGE_READY_TO_PAUSED: + rtpspeexpay->packet = 0; + ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); + case GST_STATE_CHANGE_READY_TO_NULL: return ret; Index: gstrtpspeexpay.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpspeexpay.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- gstrtpspeexpay.h 1 Jun 2006 21:07:25 -0000 1.5 +++ gstrtpspeexpay.h 5 Mar 2007 16:39:29 -0000 1.6 @@ -38,6 +38,8 @@ struct _GstRtpSPEEXPay GstBaseRTPPayload payload; + guint64 packet; }; struct _GstRtpSPEEXPayClass |
From: <wt...@ke...> - 2007-03-05 17:08:53
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Mon Mar 05 2007 17:08:44 UTC Log message: * gst/rtp/gstrtpmp4gpay.c: (gst_rtp_mp4g_pay_setcaps): * gst/rtp/gstrtptheorapay.c: (gst_rtp_theora_pay_finish_headers): * gst/rtp/gstrtpvorbispay.c: (gst_rtp_vorbis_pay_finish_headers): Fix encoding-name case. Modified files: . : ChangeLog gst/rtp : gstrtpmp4gpay.c gstrtptheorapay.c gstrtpvorbispay.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2796&r2=1.2797 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gpay.c.diff?r1=1.16&r2=1.17 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtptheorapay.c.diff?r1=1.3&r2=1.4 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpvorbispay.c.diff?r1=1.7&r2=1.8 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2796 retrieving revision 1.2797 diff -u -d -r1.2796 -r1.2797 --- ChangeLog 5 Mar 2007 16:39:29 -0000 1.2796 +++ ChangeLog 5 Mar 2007 17:08:31 -0000 1.2797 @@ -1,5 +1,12 @@ 2007-03-05 Wim Taymans <wi...@fl...> + * gst/rtp/gstrtpmp4gpay.c: (gst_rtp_mp4g_pay_setcaps): + * gst/rtp/gstrtptheorapay.c: (gst_rtp_theora_pay_finish_headers): + * gst/rtp/gstrtpvorbispay.c: (gst_rtp_vorbis_pay_finish_headers): + Fix encoding-name case. + +2007-03-05 Wim Taymans <wi...@fl...> * gst/rtp/gstrtpspeexdepay.c: (gst_rtp_speex_depay_class_init), (gst_rtp_speex_depay_get_mode), (gst_rtp_speex_depay_setcaps), (gst_rtp_speex_depay_process): Index: gstrtpmp4gpay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gpay.c,v retrieving revision 1.16 retrieving revision 1.17 diff -u -d -r1.16 -r1.17 --- gstrtpmp4gpay.c 4 Mar 2007 13:52:01 -0000 1.16 +++ gstrtpmp4gpay.c 5 Mar 2007 17:08:32 -0000 1.17 @@ -414,7 +414,7 @@ if (media_type == NULL) goto config_failed; - gst_basertppayload_set_options (payload, media_type, TRUE, "mpeg4-generic", + gst_basertppayload_set_options (payload, media_type, TRUE, "MPEG4-GENERIC", rtpmp4gpay->rate); gst_rtp_mp4g_pay_new_caps (rtpmp4gpay); Index: gstrtptheorapay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtptheorapay.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- gstrtptheorapay.c 25 Jan 2007 14:22:53 -0000 1.3 +++ gstrtptheorapay.c 5 Mar 2007 17:08:32 -0000 1.4 @@ -312,7 +312,7 @@ /* configure payloader settings */ wstr = g_strdup_printf ("%d", rtptheorapay->width); hstr = g_strdup_printf ("%d", rtptheorapay->height); - gst_basertppayload_set_options (basepayload, "video", TRUE, "theora", 90000); + gst_basertppayload_set_options (basepayload, "video", TRUE, "THEORA", 90000); gst_basertppayload_set_outcaps (basepayload, "sampling", G_TYPE_STRING, "YCbCr-4:2:0", "width", G_TYPE_STRING, wstr, Index: gstrtpvorbispay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpvorbispay.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- gstrtpvorbispay.c 25 Jan 2007 14:22:53 -0000 1.7 +++ gstrtpvorbispay.c 5 Mar 2007 17:08:32 -0000 1.8 @@ -306,7 +306,7 @@ cstr = g_strdup_printf ("%d", rtpvorbispay->channels); - gst_basertppayload_set_options (basepayload, "audio", TRUE, "vorbis", + 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, |
From: <wt...@ke...> - 2007-03-29 08:09:06
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Thu Mar 29 2007 08:09:01 UTC Log message: Patch by: Laurent Glayal <spglegle at yahoo dot fr> * gst/rtp/Makefile.am: * gst/rtp/gstrtp.c: (plugin_init): * gst/rtp/gstrtph264pay.c: (gst_rtp_h264_pay_base_init), (gst_rtp_h264_pay_class_init), (gst_rtp_h264_pay_init), (gst_rtp_h264_pay_finalize), (gst_rtp_h264_pay_setcaps), (gst_rtp_h264_pay_handle_buffer), (gst_rtp_h264_pay_set_property), (gst_rtp_h264_pay_get_property), (gst_rtp_h264_pay_change_state), (gst_rtp_h264_pay_plugin_init): * gst/rtp/gstrtph264pay.h: Added H264 payloader. Fixes #423782. * gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process): Small fixes. Modified files: . : ChangeLog gst/rtp : Makefile.am gstrtp.c gstrtph264depay.c Added files: gst/rtp : gstrtph264pay.c gstrtph264pay.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2840&r2=1.2841 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/Makefile.am.diff?r1=1.41&r2=1.42 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtp.c.diff?r1=1.37&r2=1.38 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtph264depay.c.diff?r1=1.8&r2=1.9 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtph264pay.c?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtph264pay.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.2840 retrieving revision 1.2841 diff -u -d -r1.2840 -r1.2841 --- ChangeLog 28 Mar 2007 22:27:36 -0000 1.2840 +++ ChangeLog 29 Mar 2007 08:08:48 -0000 1.2841 @@ -1,3 +1,22 @@ +2007-03-29 Wim Taymans <wi...@fl...> + + Patch by: Laurent Glayal <spglegle at yahoo dot fr> + * gst/rtp/Makefile.am: + * gst/rtp/gstrtp.c: (plugin_init): + * gst/rtp/gstrtph264pay.c: (gst_rtp_h264_pay_base_init), + (gst_rtp_h264_pay_class_init), (gst_rtp_h264_pay_init), + (gst_rtp_h264_pay_finalize), (gst_rtp_h264_pay_setcaps), + (gst_rtp_h264_pay_handle_buffer), (gst_rtp_h264_pay_set_property), + (gst_rtp_h264_pay_get_property), (gst_rtp_h264_pay_change_state), + (gst_rtp_h264_pay_plugin_init): + * gst/rtp/gstrtph264pay.h: + Added H264 payloader. Fixes #423782. + * gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_class_init), + (gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process): + Small fixes. 2007-03-29 Sebastian Dröge <sl...@ci...> * gst/wavparse/gstwavparse.c: Index: Makefile.am RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/Makefile.am,v retrieving revision 1.41 retrieving revision 1.42 diff -u -d -r1.41 -r1.42 --- Makefile.am 28 Mar 2007 18:40:12 -0000 1.41 +++ Makefile.am 29 Mar 2007 08:08:49 -0000 1.42 @@ -21,6 +21,7 @@ gstrtph263ppay.c \ gstrtph263pay.c \ gstrtph264depay.c \ + gstrtph264pay.c \ gstrtpL16depay.c \ gstrtpL16pay.c \ gstasteriskh263.c \ @@ -73,6 +74,7 @@ gstrtph263ppay.h \ gstrtph263pay.h \ gstrtph264depay.h \ + gstrtph264pay.h \ gstrtpmp2tdepay.h \ gstrtpmp2tpay.h \ gstrtpmp4vdepay.h \ Index: gstrtp.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtp.c,v retrieving revision 1.37 retrieving revision 1.38 diff -u -d -r1.37 -r1.38 --- gstrtp.c 28 Mar 2007 18:40:12 -0000 1.37 +++ gstrtp.c 29 Mar 2007 08:08:49 -0000 1.38 @@ -40,6 +40,7 @@ #include "gstrtph263ppay.h" #include "gstrtph263pay.h" #include "gstrtph264depay.h" +#include "gstrtph264pay.h" #include "gstrtpL16depay.h" #include "gstrtpL16pay.h" #include "gstasteriskh263.h" @@ -118,6 +119,9 @@ if (!gst_rtp_h264_depay_plugin_init (plugin)) return FALSE; + if (!gst_rtp_h264_pay_plugin_init (plugin)) + return FALSE; if (!gst_rtp_L16_pay_plugin_init (plugin)) Index: gstrtph264depay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtph264depay.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- gstrtph264depay.c 16 Feb 2007 12:30:22 -0000 1.8 +++ gstrtph264depay.c 29 Mar 2007 08:08:49 -0000 1.9 @@ -127,18 +127,15 @@ gstelement_class = (GstElementClass *) klass; gstbasertpdepayload_class = (GstBaseRTPDepayloadClass *) klass; - parent_class = g_type_class_peek_parent (klass); - - gstbasertpdepayload_class->process = gst_rtp_h264_depay_process; - gstbasertpdepayload_class->set_caps = gst_rtp_h264_depay_setcaps; gobject_class->finalize = gst_rtp_h264_depay_finalize; gobject_class->set_property = gst_rtp_h264_depay_set_property; gobject_class->get_property = gst_rtp_h264_depay_get_property; gstelement_class->change_state = gst_rtp_h264_depay_change_state; + gstbasertpdepayload_class->process = gst_rtp_h264_depay_process; + gstbasertpdepayload_class->set_caps = gst_rtp_h264_depay_setcaps; GST_DEBUG_CATEGORY_INIT (rtph264depay_debug, "rtph264depay", 0, "H264 Video RTP Depayloader"); } @@ -221,9 +218,9 @@ rtph264depay = GST_RTP_H264_DEPAY (depayload); - if (gst_structure_has_field (structure, "clock-rate")) { + if (gst_structure_has_field (structure, "clock-rate")) gst_structure_get_int (structure, "clock-rate", &clock_rate); - } + depayload->clock_rate = clock_rate; srccaps = gst_caps_new_simple ("video/x-h264", NULL); @@ -263,8 +260,6 @@ gst_adapter_push (rtph264depay->adapter, codec_data); } - depayload->clock_rate = clock_rate; gst_pad_set_caps (depayload->srcpad, srccaps); gst_caps_unref (srccaps); --- NEW FILE: gstrtph264pay.c --- /* GStreamer * * 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 "gstrtph264pay.h" GST_DEBUG_CATEGORY_STATIC (rtph264pay_debug); #define GST_CAT_DEFAULT (rtph264pay_debug) /* references: * RFC 3984 /* elementfactory information */ static const GstElementDetails gst_rtp_h264pay_details = GST_ELEMENT_DETAILS ("RTP packet payloader", "Codec/Payloader/Network", "Payload-encode H264 video into RTP packets (RFC 3984)", "Laurent Glayal <spg...@ya...>"); static GstStaticPadTemplate gst_rtp_h264_pay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("video/x-h264") ); static GstStaticPadTemplate gst_rtp_h264_pay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_STATIC_CAPS ("application/x-rtp, " "media = (string) \"video\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) 90000, " "encoding-name = (string) \"H264\"") static void gst_rtp_h264_pay_finalize (GObject * object); static void gst_rtp_h264_pay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_rtp_h264_pay_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static GstStateChangeReturn gst_rtp_h264_pay_change_state (GstElement * element, GstStateChange transition); static gboolean gst_rtp_h264_pay_setcaps (GstBaseRTPPayload * basepayload, GstCaps * caps); static GstFlowReturn gst_rtp_h264_pay_handle_buffer (GstBaseRTPPayload * pad, GstBuffer * buffer); GST_BOILERPLATE (GstRtpH264Pay, gst_rtp_h264_pay, GstBaseRTPPayload, GST_TYPE_BASE_RTP_PAYLOAD); static void gst_rtp_h264_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_h264_pay_src_template)); gst_static_pad_template_get (&gst_rtp_h264_pay_sink_template)); gst_element_class_set_details (element_class, &gst_rtp_h264pay_details); } gst_rtp_h264_pay_class_init (GstRtpH264PayClass * klass) GObjectClass *gobject_class; GstElementClass *gstelement_class; GstBaseRTPPayloadClass *gstbasertppayload_class; gobject_class = (GObjectClass *) klass; gstelement_class = (GstElementClass *) klass; gstbasertppayload_class = (GstBaseRTPPayloadClass *) klass; gobject_class->finalize = gst_rtp_h264_pay_finalize; gobject_class->set_property = gst_rtp_h264_pay_set_property; gobject_class->get_property = gst_rtp_h264_pay_get_property; gstelement_class->change_state = gst_rtp_h264_pay_change_state; gstbasertppayload_class->set_caps = gst_rtp_h264_pay_setcaps; gstbasertppayload_class->handle_buffer = gst_rtp_h264_pay_handle_buffer; GST_DEBUG_CATEGORY_INIT (rtph264pay_debug, "rtph264pay", 0, "H264 RTP Payloader"); gst_rtp_h264_pay_init (GstRtpH264Pay * rtph264pay, GstRtpH264PayClass * klass) gst_rtp_h264_pay_finalize (GObject * object) GstRtpH264Pay *rtph264pay; rtph264pay = GST_RTP_H264_PAY (object); G_OBJECT_CLASS (parent_class)->finalize (object); static gboolean gst_rtp_h264_pay_setcaps (GstBaseRTPPayload * basepayload, GstCaps * caps) rtph264pay = GST_RTP_H264_PAY (basepayload); gst_basertppayload_set_options (basepayload, "video", TRUE, "H264", 90000); gst_basertppayload_set_outcaps (basepayload, NULL); return TRUE; static GstFlowReturn gst_rtp_h264_pay_handle_buffer (GstBaseRTPPayload * basepayload, GstBuffer * buffer) GstFlowReturn ret; guint size, idxdata; GstBuffer *outbuf; guint8 *payload, *data, *pdata; guint8 nalType; GstClockTime timestamp; guint packet_len, payload_len, mtu; mtu = GST_BASE_RTP_PAYLOAD_MTU (rtph264pay); size = GST_BUFFER_SIZE (buffer); data = GST_BUFFER_DATA (buffer); timestamp = GST_BUFFER_TIMESTAMP (buffer); GST_DEBUG_OBJECT (basepayload, "got %d bytes", size); /* H264 stream analysis */ pdata = data; idxdata = size; while (idxdata > 5 && (pdata[0] != 0x00 || pdata[1] != 0x00 || pdata[2] != 0x1 || (pdata[3] & 0x1f) < 1 || (pdata[3] & 0x1f) > 23) ) { pdata++; idxdata--; GST_DEBUG_OBJECT (basepayload, "idxdata=%d", idxdata); } if (idxdata < 5) { GST_DEBUG_OBJECT (basepayload, "Returning GST_FLOW_OK without creating RTP packet"); return GST_FLOW_OK; pdata += 3; idxdata -= 3; nalType = pdata[0] & 0x1f; GST_DEBUG_OBJECT (basepayload, "Processing Buffer with NAL TYPE=%d", nalType); packet_len = gst_rtp_buffer_calc_packet_len (idxdata, 0, 0); if (packet_len < mtu) { "NAL Unit fit in one packet datasize=%d mtu=%d", idxdata, mtu); /* will fit in one packet */ outbuf = gst_rtp_buffer_new_allocate (idxdata, 0, 0); GST_BUFFER_TIMESTAMP (outbuf) = timestamp; gst_rtp_buffer_set_marker (outbuf, 1); payload = gst_rtp_buffer_get_payload (outbuf); GST_DEBUG_OBJECT (basepayload, "Copying %d bytes to outbuf", idxdata); memcpy (payload, pdata, idxdata); gst_buffer_unref (buffer); ret = gst_basertppayload_push (basepayload, outbuf); return ret; } else { "NAL Unit DOES NOT fit in one packet datasize=%d mtu=%d", idxdata, mtu); /* Fragmentation Units FU-A */ guint8 nalHeader; guint limitedSize; int ii = 0, start = 1, end = 0, first = 0; nalHeader = *pdata; ret = GST_FLOW_OK; GST_DEBUG_OBJECT (basepayload, "Using FU-A fragmentation for data size=%d", idxdata); payload_len = gst_rtp_buffer_calc_payload_len (mtu - 2, 0, 0); /* We keep 2 bytes for FU indicator and FU Header */ while (end == 0) { limitedSize = idxdata < payload_len ? idxdata : payload_len; GST_DEBUG_OBJECT (basepayload, "Inside FU-A fragmentation limitedSize=%d iteration=%d", limitedSize, ii); outbuf = gst_rtp_buffer_new_allocate (limitedSize + 2, 0, 0); GST_BUFFER_TIMESTAMP (outbuf) = timestamp; gst_rtp_buffer_set_marker (outbuf, end); payload = gst_rtp_buffer_get_payload (outbuf); if (limitedSize == idxdata) { GST_DEBUG_OBJECT (basepayload, "end idxdata=%d iteration=%d", idxdata, ii); end = 1; } /* FU indicator */ payload[0] = (nalHeader & 0x60) | 28; /* FU Header */ payload[1] = (start << 7) | (end << 6) | (nalHeader & 0x1f); memcpy (&payload[2], pdata + first, limitedSize); "recorded %d payload bytes into packet iteration=%d", limitedSize + 2, ret = gst_basertppayload_push (basepayload, outbuf); if (ret != GST_FLOW_OK) break; idxdata -= limitedSize; first += limitedSize; ii++; start = 0; } GST_ELEMENT_ERROR (basepayload, STREAM, FORMAT, (NULL), ("Should not be there !!")); gst_buffer_unref (buffer); return GST_FLOW_ERROR; gst_rtp_h264_pay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) switch (prop_id) { default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; gst_rtp_h264_pay_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) static GstStateChangeReturn gst_rtp_h264_pay_change_state (GstElement * element, GstStateChange transition) GstStateChangeReturn ret; rtph264pay = GST_RTP_H264_PAY (element); switch (transition) { ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); return ret; gboolean gst_rtp_h264_pay_plugin_init (GstPlugin * plugin) return gst_element_register (plugin, "rtph264pay", GST_RANK_NONE, GST_TYPE_RTP_H264_PAY); --- NEW FILE: gstrtph264pay.h --- * Copyright (C) <2006> Wim Taymans <wi...@fl...> #ifndef __GST_RTP_H264_PAY_H__ #define __GST_RTP_H264_PAY_H__ #include <gst/gst.h> #include <gst/rtp/gstbasertppayload.h> G_BEGIN_DECLS #define GST_TYPE_RTP_H264_PAY \ (gst_rtp_h264_pay_get_type()) #define GST_RTP_H264_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_RTP_H264_PAY,GstRtpH264Pay)) #define GST_RTP_H264_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_RTP_H264_PAY,GstRtpH264PayClass)) #define GST_IS_RTP_H264_PAY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_H264_PAY)) #define GST_IS_RTP_H264_PAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_H264_PAY)) typedef struct _GstRtpH264Pay GstRtpH264Pay; typedef struct _GstRtpH264PayClass GstRtpH264PayClass; struct _GstRtpH264Pay GstBaseRTPPayload payload; }; struct _GstRtpH264PayClass GstBaseRTPPayloadClass parent_class; gboolean gst_rtp_h264_pay_plugin_init (GstPlugin * plugin); G_END_DECLS #endif /* __GST_RTP_H264_PAY_H__ */ |
From: <wt...@ke...> - 2007-03-29 14:03:45
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Thu Mar 29 2007 14:03:33 UTC Log message: * gst/rtp/gstrtpL16depay.c: (gst_rtp_L16_depay_process): * gst/rtp/gstrtpgsmdepay.c: (gst_rtp_gsm_depay_process): * gst/rtp/gstrtpilbcdepay.c: (gst_rtp_ilbc_depay_process): * gst/rtp/gstrtpmp2tdepay.c: (gst_rtp_mp2t_depay_process): * gst/rtp/gstrtpmp4gdepay.c: (gst_rtp_mp4g_depay_process): * gst/rtp/gstrtpmp4gpay.c: (gst_rtp_mp4g_pay_flush): * gst/rtp/gstrtpmp4vdepay.c: (gst_rtp_mp4v_depay_setcaps), (gst_rtp_mp4v_depay_process): * gst/rtp/gstrtpmp4vpay.c: (gst_rtp_mp4v_pay_flush): * gst/rtp/gstrtpmpadepay.c: (gst_rtp_mpa_depay_process): * gst/rtp/gstrtpmpapay.c: (gst_rtp_mpa_pay_flush): * gst/rtp/gstrtpmpvdepay.c: (gst_rtp_mpv_depay_process): * gst/rtp/gstrtppcmadepay.c: (gst_rtp_pcma_depay_process): * gst/rtp/gstrtppcmudepay.c: (gst_rtp_pcmu_depay_process): * gst/rtp/gstrtpsv3vdepay.c: (gst_rtp_sv3v_depay_process): Use more efficient adapter and rtpbuffer methods when possible. Modified files: . : ChangeLog gst/rtp : gstrtpL16depay.c gstrtpgsmdepay.c gstrtpilbcdepay.c gstrtpmp2tdepay.c gstrtpmp4gdepay.c gstrtpmp4gpay.c gstrtpmp4vdepay.c gstrtpmp4vpay.c gstrtpmpadepay.c gstrtpmpapay.c gstrtpmpvdepay.c gstrtppcmadepay.c gstrtppcmudepay.c gstrtpsv3vdepay.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2843&r2=1.2844 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpL16depay.c.diff?r1=1.26&r2=1.27 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpgsmdepay.c.diff?r1=1.28&r2=1.29 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpilbcdepay.c.diff?r1=1.9&r2=1.10 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp2tdepay.c.diff?r1=1.7&r2=1.8 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gdepay.c.diff?r1=1.10&r2=1.11 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gpay.c.diff?r1=1.17&r2=1.18 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4vdepay.c.diff?r1=1.21&r2=1.22 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4vpay.c.diff?r1=1.24&r2=1.25 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmpadepay.c.diff?r1=1.18&r2=1.19 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmpapay.c.diff?r1=1.18&r2=1.19 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmpvdepay.c.diff?r1=1.3&r2=1.4 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtppcmadepay.c.diff?r1=1.9&r2=1.10 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtppcmudepay.c.diff?r1=1.8&r2=1.9 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpsv3vdepay.c.diff?r1=1.5&r2=1.6 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2843 retrieving revision 1.2844 diff -u -d -r1.2843 -r1.2844 --- ChangeLog 29 Mar 2007 12:14:21 -0000 1.2843 +++ ChangeLog 29 Mar 2007 14:03:21 -0000 1.2844 @@ -1,3 +1,22 @@ +2007-03-29 Wim Taymans <wi...@fl...> + + * gst/rtp/gstrtpL16depay.c: (gst_rtp_L16_depay_process): + * gst/rtp/gstrtpgsmdepay.c: (gst_rtp_gsm_depay_process): + * gst/rtp/gstrtpilbcdepay.c: (gst_rtp_ilbc_depay_process): + * gst/rtp/gstrtpmp2tdepay.c: (gst_rtp_mp2t_depay_process): + * gst/rtp/gstrtpmp4gdepay.c: (gst_rtp_mp4g_depay_process): + * gst/rtp/gstrtpmp4gpay.c: (gst_rtp_mp4g_pay_flush): + * gst/rtp/gstrtpmp4vdepay.c: (gst_rtp_mp4v_depay_setcaps), + (gst_rtp_mp4v_depay_process): + * gst/rtp/gstrtpmp4vpay.c: (gst_rtp_mp4v_pay_flush): + * gst/rtp/gstrtpmpadepay.c: (gst_rtp_mpa_depay_process): + * gst/rtp/gstrtpmpapay.c: (gst_rtp_mpa_pay_flush): + * gst/rtp/gstrtpmpvdepay.c: (gst_rtp_mpv_depay_process): + * gst/rtp/gstrtppcmadepay.c: (gst_rtp_pcma_depay_process): + * gst/rtp/gstrtppcmudepay.c: (gst_rtp_pcmu_depay_process): + * gst/rtp/gstrtpsv3vdepay.c: (gst_rtp_sv3v_depay_process): + Use more efficient adapter and rtpbuffer methods when possible. 2007-03-29 Sebastian Dröge <sl...@ci...> * gst/wavenc/gstwavenc.c: (gst_wavenc_create_header_buf), Index: gstrtpL16depay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpL16depay.c,v retrieving revision 1.26 retrieving revision 1.27 diff -u -d -r1.26 -r1.27 --- gstrtpL16depay.c 24 Jan 2007 18:20:14 -0000 1.26 +++ gstrtpL16depay.c 29 Mar 2007 14:03:21 -0000 1.27 @@ -220,10 +220,8 @@ { gint payload_len; - guint8 *payload; payload_len = gst_rtp_buffer_get_payload_len (buf); - payload = gst_rtp_buffer_get_payload (buf); if (payload_len <= 0) goto empty_packet; Index: gstrtpgsmdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpgsmdepay.c,v retrieving revision 1.28 retrieving revision 1.29 diff -u -d -r1.28 -r1.29 --- gstrtpgsmdepay.c 24 Jan 2007 12:22:50 -0000 1.28 +++ gstrtpgsmdepay.c 29 Mar 2007 14:03:21 -0000 1.29 @@ -123,19 +123,14 @@ gst_rtp_gsm_depay_process (GstBaseRTPDepayload * _depayload, GstBuffer * buf) { GstBuffer *outbuf = NULL; - gint payload_len; - guint8 *payload; GST_DEBUG ("process : got %d bytes, mark %d ts %u seqn %d", GST_BUFFER_SIZE (buf), gst_rtp_buffer_get_marker (buf), gst_rtp_buffer_get_timestamp (buf), gst_rtp_buffer_get_seq (buf)); - payload_len = gst_rtp_buffer_get_payload_len (buf); - payload = gst_rtp_buffer_get_payload (buf); + outbuf = gst_rtp_buffer_get_payload_buffer (buf); - outbuf = gst_buffer_new_and_alloc (payload_len); - memcpy (GST_BUFFER_DATA (outbuf), payload, payload_len); return outbuf; } Index: gstrtpilbcdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpilbcdepay.c,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- gstrtpilbcdepay.c 25 Jan 2007 14:22:53 -0000 1.9 +++ gstrtpilbcdepay.c 29 Mar 2007 14:03:21 -0000 1.10 @@ -169,18 +169,13 @@ gst_rtp_ilbc_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) - gint header_len; - header_len = gst_rtp_buffer_calc_header_len (0); - - outbuf = gst_buffer_create_sub (buf, header_len, payload_len); Index: gstrtpmp2tdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp2tdepay.c,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- gstrtpmp2tdepay.c 2 Mar 2007 12:52:56 -0000 1.7 +++ gstrtpmp2tdepay.c 29 Mar 2007 14:03:21 -0000 1.8 @@ -173,7 +173,6 @@ GstRtpMP2TDepay *rtpmp2tdepay; GstBuffer *outbuf; gint payload_len; - guint32 timestamp; rtpmp2tdepay = GST_RTP_MP2T_DEPAY (depayload); @@ -185,15 +184,10 @@ if (G_UNLIKELY (payload_len <= rtpmp2tdepay->skip_first_bytes)) goto empty_packet; - timestamp = gst_rtp_buffer_get_timestamp (buf); outbuf = gst_rtp_buffer_get_payload_subbuffer (buf, rtpmp2tdepay->skip_first_bytes, -1); gst_buffer_set_caps (outbuf, GST_PAD_CAPS (depayload->srcpad)); - GST_BUFFER_TIMESTAMP (outbuf) = - gst_util_uint64_scale_int (timestamp, GST_SECOND, depayload->clock_rate); GST_DEBUG ("gst_rtp_mp2t_depay_chain: pushing buffer of size %d", GST_BUFFER_SIZE (outbuf)); Index: gstrtpmp4gdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gdepay.c,v retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- gstrtpmp4gdepay.c 16 Feb 2007 12:30:22 -0000 1.10 +++ gstrtpmp4gdepay.c 29 Mar 2007 14:03:21 -0000 1.11 @@ -276,7 +276,7 @@ goto bad_packet; - gint payload_len; + gint payload_len, payload_header; guint8 *payload; guint32 timestamp; guint AU_headers_len; @@ -284,6 +284,7 @@ payload = gst_rtp_buffer_get_payload (buf); + payload_header = 0; if (rtpmp4gdepay->sizelength > 0) { /* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- .. -+-+-+-+-+-+-+-+-+-+ @@ -298,6 +299,7 @@ /* skip header */ payload += 2; + payload_header += 2; payload_len -= 2; /* FIXME, use bits */ @@ -309,14 +311,15 @@ /* skip special headers */ payload += (AU_headers_len + 7) / 8; + payload_header += (AU_headers_len + 7) / 8; payload_len = AU_size; } timestamp = gst_rtp_buffer_get_timestamp (buf); - outbuf = gst_buffer_new_and_alloc (payload_len); - memcpy (GST_BUFFER_DATA (outbuf), payload, payload_len); + /* strip header from payload and push in the adapter */ + outbuf = + gst_rtp_buffer_get_payload_subbuffer (buf, payload_header, payload_len); gst_adapter_push (rtpmp4gdepay->adapter, outbuf); /* if this was the last packet of the VOP, create and push a buffer */ @@ -325,11 +328,7 @@ avail = gst_adapter_available (rtpmp4gdepay->adapter); - outbuf = gst_buffer_new (); - GST_BUFFER_SIZE (outbuf) = avail; - GST_BUFFER_MALLOCDATA (outbuf) = - gst_adapter_take (rtpmp4gdepay->adapter, avail); - GST_BUFFER_DATA (outbuf) = GST_BUFFER_MALLOCDATA (outbuf); + outbuf = gst_adapter_take_buffer (rtpmp4gdepay->adapter, avail); gst_buffer_set_caps (outbuf, GST_PAD_CAPS (depayload->srcpad)); GST_BUFFER_TIMESTAMP (outbuf) = gst_util_uint64_scale_int (timestamp, GST_SECOND, depayload->clock_rate); Index: gstrtpmp4gpay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gpay.c,v retrieving revision 1.17 retrieving revision 1.18 diff -u -d -r1.17 -r1.18 --- gstrtpmp4gpay.c 5 Mar 2007 17:08:32 -0000 1.17 +++ gstrtpmp4gpay.c 29 Mar 2007 14:03:21 -0000 1.18 @@ -453,7 +453,6 @@ while (avail > 0) { guint towrite; - guint8 *data; guint payload_len; guint packet_len; @@ -511,9 +510,8 @@ payload[2] = (total & 0x1fe0) >> 5; payload[3] = (total & 0x1f) << 3; /* we use 13 bits for the size, 3 bits index */ - data = (guint8 *) gst_adapter_peek (rtpmp4gpay->adapter, payload_len); - memcpy (&payload[4], data, payload_len); + /* copy stuff from adapter to payload */ + gst_adapter_copy (rtpmp4gpay->adapter, &payload[4], 0, payload_len); gst_adapter_flush (rtpmp4gpay->adapter, payload_len); /* marker only if the packet is complete */ Index: gstrtpmp4vdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4vdepay.c,v retrieving revision 1.21 retrieving revision 1.22 diff -u -d -r1.21 -r1.22 --- gstrtpmp4vdepay.c 28 Mar 2007 18:40:12 -0000 1.21 +++ gstrtpmp4vdepay.c 29 Mar 2007 14:03:21 -0000 1.22 @@ -207,7 +207,6 @@ gst_adapter_clear (rtpmp4vdepay->adapter); outbuf = gst_rtp_buffer_get_payload_buffer (buf); gst_adapter_push (rtpmp4vdepay->adapter, outbuf); /* if this was the last packet of the VOP, create and push a buffer */ @@ -217,7 +216,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", Index: gstrtpmp4vpay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4vpay.c,v retrieving revision 1.24 retrieving revision 1.25 diff -u -d -r1.24 -r1.25 --- gstrtpmp4vpay.c 24 Jan 2007 12:22:50 -0000 1.24 +++ gstrtpmp4vpay.c 29 Mar 2007 14:03:21 -0000 1.25 @@ -262,7 +262,6 @@ @@ -280,9 +279,8 @@ /* copy payload */ payload = gst_rtp_buffer_get_payload (outbuf); - data = (guint8 *) gst_adapter_peek (rtpmp4vpay->adapter, payload_len); - memcpy (payload, data, payload_len); + gst_adapter_copy (rtpmp4vpay->adapter, payload, 0, payload_len); gst_adapter_flush (rtpmp4vpay->adapter, payload_len); avail -= payload_len; Index: gstrtpmpadepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmpadepay.c,v retrieving revision 1.19 diff -u -d -r1.18 -r1.19 --- gstrtpmpadepay.c 24 Jan 2007 12:22:50 -0000 1.18 +++ gstrtpmpadepay.c 29 Mar 2007 14:03:21 -0000 1.19 @@ -161,7 +161,6 @@ guint16 frag_offset; - guint32 timestamp; @@ -179,16 +178,8 @@ */ frag_offset = (payload[2] << 8) | payload[3]; - payload_len -= 4; - payload += 4; - timestamp = gst_rtp_buffer_get_timestamp (buf); - //GST_BUFFER_TIMESTAMP (outbuf) = timestamp * GST_SECOND / 90000; + /* subbuffer skipping the 4 header bytes */ + outbuf = gst_rtp_buffer_get_payload_subbuffer (buf, 4, -1); GST_DEBUG_OBJECT (rtpmpadepay, "gst_rtp_mpa_depay_chain: pushing buffer of size %d", Index: gstrtpmpapay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmpapay.c,v --- gstrtpmpapay.c 9 Jan 2007 12:23:48 -0000 1.18 +++ gstrtpmpapay.c 29 Mar 2007 14:03:21 -0000 1.19 @@ -174,7 +174,6 @@ @@ -207,8 +206,7 @@ payload[2] = frag_offset >> 8; payload[3] = frag_offset & 0xff; - data = (guint8 *) gst_adapter_peek (rtpmpapay->adapter, payload_len); + gst_adapter_copy (rtpmpapay->adapter, &payload[4], 0, payload_len); gst_adapter_flush (rtpmpapay->adapter, payload_len); Index: gstrtpmpvdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmpvdepay.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- gstrtpmpvdepay.c 16 Feb 2007 12:30:22 -0000 1.3 +++ gstrtpmpvdepay.c 29 Mar 2007 14:03:21 -0000 1.4 @@ -158,13 +158,13 @@ guint8 T; if (payload_len <= 4) @@ -181,6 +181,7 @@ T = (payload[0] & 0x04); payload_len -= 4; + payload_header += 4; payload += 4; if (T) { @@ -197,13 +198,11 @@ goto empty_packet; payload_len -= 4; + payload_header += 4; payload += 4; + outbuf = gst_rtp_buffer_get_payload_subbuffer (buf, payload_header, -1); GST_DEBUG_OBJECT (rtpmpvdepay, "gst_rtp_mpv_depay_chain: pushing buffer of size %d", Index: gstrtppcmadepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtppcmadepay.c,v --- gstrtppcmadepay.c 24 Jan 2007 12:22:50 -0000 1.9 +++ gstrtppcmadepay.c 29 Mar 2007 14:03:21 -0000 1.10 @@ -136,8 +136,6 @@ GstCaps *srccaps; @@ -153,11 +151,8 @@ gst_caps_unref (srccaps); } Index: gstrtppcmudepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtppcmudepay.c,v diff -u -d -r1.8 -r1.9 --- gstrtppcmudepay.c 24 Jan 2007 12:22:50 -0000 1.8 +++ gstrtppcmudepay.c 29 Mar 2007 14:03:21 -0000 1.9 Index: gstrtpsv3vdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpsv3vdepay.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- gstrtpsv3vdepay.c 25 Jan 2007 14:22:53 -0000 1.5 +++ gstrtpsv3vdepay.c 29 Mar 2007 14:03:21 -0000 1.6 @@ -252,14 +252,10 @@ if (M) { /* frame is completed: push contents of adapter */ guint avail; - guint8 *data; guint32 timestamp; avail = gst_adapter_available (rtpsv3vdepay->adapter); - data = gst_adapter_take (rtpsv3vdepay->adapter, avail); - /* create buffer with data */ - outbuf = gst_rtp_buffer_new_take_data (data, avail); + outbuf = gst_adapter_take_buffer (rtpsv3vdepay->adapter, avail); /* timestamp for complete buffer is that of last buffer as well */ timestamp = gst_rtp_buffer_get_timestamp (buf); |
From: <wt...@ke...> - 2007-03-29 14:40:52
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Thu Mar 29 2007 14:40:47 UTC Log message: * gst/rtp/gstasteriskh263.h: * gst/rtp/gstrtph263pdepay.c: (gst_rtp_h263p_depay_process), (gst_rtp_h263p_depay_change_state): * gst/rtp/gstrtph263pdepay.h: * gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_class_init), (gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process), (gst_rtp_h264_depay_change_state): * gst/rtp/gstrtph264depay.h: * gst/rtp/gstrtpmp4adepay.c: (gst_rtp_mp4a_depay_class_init), (gst_rtp_mp4a_depay_setcaps), (gst_rtp_mp4a_depay_process): * gst/rtp/gstrtpmp4gdepay.c: (gst_rtp_mp4g_depay_process): Flush adapter on disconts. Modified files: . : ChangeLog gst/rtp : gstasteriskh263.h gstrtph263pdepay.c gstrtph263pdepay.h gstrtph264depay.c gstrtph264depay.h gstrtpmp4adepay.c gstrtpmp4gdepay.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2844&r2=1.2845 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstasteriskh263.h.diff?r1=1.5&r2=1.6 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtph263pdepay.c.diff?r1=1.20&r2=1.21 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtph263pdepay.h.diff?r1=1.7&r2=1.8 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtph264depay.c.diff?r1=1.9&r2=1.10 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtph264depay.h.diff?r1=1.1&r2=1.2 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4adepay.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.11&r2=1.12 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2844 retrieving revision 1.2845 diff -u -d -r1.2844 -r1.2845 --- ChangeLog 29 Mar 2007 14:03:21 -0000 1.2844 +++ ChangeLog 29 Mar 2007 14:40:34 -0000 1.2845 @@ -1,5 +1,20 @@ 2007-03-29 Wim Taymans <wi...@fl...> + * gst/rtp/gstasteriskh263.h: + * gst/rtp/gstrtph263pdepay.c: (gst_rtp_h263p_depay_process), + (gst_rtp_h263p_depay_change_state): + * gst/rtp/gstrtph263pdepay.h: + * gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_class_init), + (gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process), + (gst_rtp_h264_depay_change_state): + * gst/rtp/gstrtph264depay.h: + * gst/rtp/gstrtpmp4adepay.c: (gst_rtp_mp4a_depay_class_init), + (gst_rtp_mp4a_depay_setcaps), (gst_rtp_mp4a_depay_process): + * gst/rtp/gstrtpmp4gdepay.c: (gst_rtp_mp4g_depay_process): + Flush adapter on disconts. + +2007-03-29 Wim Taymans <wi...@fl...> * gst/rtp/gstrtpL16depay.c: (gst_rtp_L16_depay_process): * gst/rtp/gstrtpgsmdepay.c: (gst_rtp_gsm_depay_process): * gst/rtp/gstrtpilbcdepay.c: (gst_rtp_ilbc_depay_process): Index: gstasteriskh263.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstasteriskh263.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- gstasteriskh263.h 1 Jun 2006 21:07:25 -0000 1.5 +++ gstasteriskh263.h 29 Mar 2007 14:40:35 -0000 1.6 @@ -48,7 +48,6 @@ GstAdapter *adapter; - guint frequency; guint32 lastts; }; Index: gstrtph263pdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtph263pdepay.c,v retrieving revision 1.20 retrieving revision 1.21 diff -u -d -r1.20 -r1.21 --- gstrtph263pdepay.c 24 Jan 2007 12:22:50 -0000 1.20 +++ gstrtph263pdepay.c 29 Mar 2007 14:40:35 -0000 1.21 @@ -165,13 +165,19 @@ if (!gst_rtp_buffer_validate (buf)) goto bad_packet; + /* flush remaining data on discont */ + if (GST_BUFFER_IS_DISCONT (buf)) { + gst_adapter_clear (rtph263pdepay->adapter); + rtph263pdepay->wait_start = TRUE; + } { gint payload_len; guint8 *payload; gboolean P, V, M; guint32 timestamp; guint header_len; - guint8 PLEN; + guint8 PLEN, PEBIT; payload_len = gst_rtp_buffer_get_payload_len (buf); payload = gst_rtp_buffer_get_payload (buf); @@ -179,9 +185,17 @@ header_len = 2; M = gst_rtp_buffer_get_marker (buf); + /* 0 1 + * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * | RR |P|V| PLEN |PEBIT| + */ P = (payload[0] & 0x04) == 0x04; V = (payload[0] & 0x02) == 0x02; PLEN = ((payload[0] & 0x1) << 5) | (payload[1] >> 3); + PEBIT = payload[1] & 0x7; if (V) { header_len++; @@ -191,11 +205,15 @@ } if (P) { + rtph263pdepay->wait_start = FALSE; header_len -= 2; payload[header_len] = 0; payload[header_len + 1] = 0; + if (rtph263pdepay->wait_start) + goto waiting_start; /* FIXME do not ignore the VRC header (See RFC 2429 section 4.2) */ /* strip off header */ payload += header_len; @@ -205,21 +223,21 @@ if (M) { /* frame is completed: append to previous, push it out */ - guint len; + guint len, padlen; guint avail; - guint8 *data; avail = gst_adapter_available (rtph263pdepay->adapter); len = avail + payload_len; - outbuf = gst_buffer_new_and_alloc (len + (len % 4) + 4); - memset (GST_BUFFER_DATA (outbuf) + len, 0, (len % 4) + 4); + padlen = (len % 4) + 4; + outbuf = gst_buffer_new_and_alloc (len + padlen); + memset (GST_BUFFER_DATA (outbuf) + len, 0, padlen); GST_BUFFER_SIZE (outbuf) = len; /* prepend previous data */ if (avail > 0) { - data = (guint8 *) gst_adapter_peek (rtph263pdepay->adapter, avail); - memcpy (GST_BUFFER_DATA (outbuf), data, avail); + gst_adapter_copy (rtph263pdepay->adapter, GST_BUFFER_DATA (outbuf), 0, + avail); gst_adapter_flush (rtph263pdepay->adapter, avail); } memcpy (GST_BUFFER_DATA (outbuf) + avail, payload, payload_len); @@ -249,6 +267,11 @@ ("Packet did not validate"), (NULL)); return NULL; } +waiting_start: + { + GST_DEBUG_OBJECT (rtph263pdepay, "waiting for picture start"); + return NULL; } static void @@ -295,6 +318,7 @@ break; case GST_STATE_CHANGE_READY_TO_PAUSED: gst_adapter_clear (rtph263pdepay->adapter); + rtph263pdepay->wait_start = TRUE; default: Index: gstrtph263pdepay.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtph263pdepay.h,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- gstrtph263pdepay.h 1 Jun 2006 21:07:25 -0000 1.7 +++ gstrtph263pdepay.h 29 Mar 2007 14:40:35 -0000 1.8 @@ -45,8 +45,7 @@ GstBaseRTPDepayload depayload; - + gboolean wait_start; struct _GstRtpH263PDepayClass Index: gstrtph264depay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtph264depay.c,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- gstrtph264depay.c 29 Mar 2007 08:08:49 -0000 1.9 +++ gstrtph264depay.c 29 Mar 2007 14:40:35 -0000 1.10 @@ -278,6 +278,12 @@ + gst_adapter_clear (rtph264depay->adapter); + rtph264depay->wait_start = TRUE; @@ -325,6 +331,8 @@ payload += header_len; payload_len -= header_len; + rtph264depay->wait_start = FALSE; /* STAP-A Single-time aggregation packet 5.7.1 */ while (payload_len > 2) { /* 1 @@ -390,10 +398,15 @@ GST_DEBUG_OBJECT (rtph264depay, "S %d, E %d", S, E); + if (rtph264depay->wait_start && !S) + goto waiting_start; if (S) { /* NAL unit starts here */ guint8 nal_header; + rtph264depay->wait_start = FALSE; /* reconstruct NAL header */ nal_header = (payload[0] & 0xe0) | (payload[1] & 0x1f); @@ -446,6 +459,8 @@ default: { /* 1-23 NAL unit Single NAL unit packet per H.264 5.6 */ /* the entire payload is the output buffer */ nalu_size = payload_len; @@ -478,6 +493,11 @@ (NULL), ("Undefined packet type")); + GST_DEBUG_OBJECT (rtph264depay, "waiting for start"); not_implemented: GST_ELEMENT_ERROR (rtph264depay, STREAM, FORMAT, @@ -530,6 +550,7 @@ gst_adapter_clear (rtph264depay->adapter); + rtph264depay->wait_start = TRUE; Index: gstrtph264depay.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtph264depay.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- gstrtph264depay.h 16 Aug 2006 10:05:00 -0000 1.1 +++ gstrtph264depay.h 29 Mar 2007 14:40:35 -0000 1.2 struct _GstRtpH264DepayClass Index: gstrtpmp4adepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4adepay.c,v --- gstrtpmp4adepay.c 28 Mar 2007 18:40:12 -0000 1.1 +++ gstrtpmp4adepay.c 29 Mar 2007 14:40:35 -0000 1.2 @@ -249,8 +249,9 @@ /* flush remaining data on discont */ - if (GST_BUFFER_IS_DISCONT (buf)) gst_adapter_clear (rtpmp4adepay->adapter); outbuf = gst_rtp_buffer_get_payload_buffer (buf); Index: gstrtpmp4gdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gdepay.c,v retrieving revision 1.11 retrieving revision 1.12 diff -u -d -r1.11 -r1.12 --- gstrtpmp4gdepay.c 29 Mar 2007 14:03:21 -0000 1.11 +++ gstrtpmp4gdepay.c 29 Mar 2007 14:40:35 -0000 1.12 @@ -275,6 +275,11 @@ + gst_adapter_clear (rtpmp4gdepay->adapter); gint payload_len, payload_header; |
From: <wt...@ke...> - 2007-04-05 13:57:01
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Thu Apr 05 2007 13:56:56 UTC Log message: * gst/rtp/gstrtpmp4adepay.c: (gst_rtp_mp4a_depay_class_init), (gst_rtp_mp4a_depay_setcaps), (gst_rtp_mp4a_depay_plugin_init): This element is ready to be autoplugged. Modified files: . : ChangeLog gst/rtp : gstrtpmp4adepay.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2851&r2=1.2852 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4adepay.c.diff?r1=1.2&r2=1.3 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2851 retrieving revision 1.2852 diff -u -d -r1.2851 -r1.2852 --- ChangeLog 5 Apr 2007 11:26:24 -0000 1.2851 +++ ChangeLog 5 Apr 2007 13:56:44 -0000 1.2852 @@ -1,3 +1,9 @@ +2007-04-05 Wim Taymans <wi...@fl...> + + * gst/rtp/gstrtpmp4adepay.c: (gst_rtp_mp4a_depay_class_init), + (gst_rtp_mp4a_depay_setcaps), (gst_rtp_mp4a_depay_plugin_init): + This element is ready to be autoplugged. 2007-04-05 Julien MOUTTE <ju...@mo...> * gst/avi/gstavidemux.c: (gst_avi_demux_process_next_entry): Index: gstrtpmp4adepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4adepay.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- gstrtpmp4adepay.c 29 Mar 2007 14:40:35 -0000 1.2 +++ gstrtpmp4adepay.c 5 Apr 2007 13:56:44 -0000 1.3 @@ -364,5 +364,5 @@ gst_rtp_mp4a_depay_plugin_init (GstPlugin * plugin) { return gst_element_register (plugin, "rtpmp4adepay", - GST_RANK_NONE, GST_TYPE_RTP_MP4A_DEPAY); + GST_RANK_MARGINAL, GST_TYPE_RTP_MP4A_DEPAY); } |
From: <wt...@ke...> - 2007-04-10 17:06:22
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Tue Apr 10 2007 17:06:17 UTC Log message: * gst/rtp/gstrtpamrdepay.c: (gst_rtp_amr_depay_setcaps), (gst_rtp_amr_depay_process): Fix depayloader clock_rate and some cleanups. * gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_finalize), (gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process): * gst/rtp/gstrtph264depay.h: Don't push codec_data in the adapter because it might get flushed when we get a discont. * gst/rtp/gstrtpmp4gdepay.c: (gst_rtp_mp4g_depay_process): Handle multiple AU per packet. * gst/rtp/gstrtpsv3vdepay.c: (gst_rtp_sv3v_depay_process), (gst_rtp_sv3v_depay_plugin_init): Disable rank, this one does not work. Remove timestamping, base class does that. Modified files: . : ChangeLog gst/rtp : gstrtpamrdepay.c gstrtph264depay.c gstrtph264depay.h gstrtpmp4gdepay.c gstrtpsv3vdepay.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2855&r2=1.2856 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpamrdepay.c.diff?r1=1.25&r2=1.26 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtph264depay.c.diff?r1=1.10&r2=1.11 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtph264depay.h.diff?r1=1.2&r2=1.3 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gdepay.c.diff?r1=1.13&r2=1.14 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpsv3vdepay.c.diff?r1=1.6&r2=1.7 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2855 retrieving revision 1.2856 diff -u -d -r1.2855 -r1.2856 --- ChangeLog 10 Apr 2007 12:01:33 -0000 1.2855 +++ ChangeLog 10 Apr 2007 17:06:04 -0000 1.2856 @@ -1,3 +1,23 @@ +2007-04-10 Wim Taymans <wi...@fl...> + + * gst/rtp/gstrtpamrdepay.c: (gst_rtp_amr_depay_setcaps), + (gst_rtp_amr_depay_process): + Fix depayloader clock_rate and some cleanups. + * gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_finalize), + (gst_rtp_h264_depay_setcaps), (gst_rtp_h264_depay_process): + * gst/rtp/gstrtph264depay.h: + Don't push codec_data in the adapter because it might get flushed when + we get a discont. + * gst/rtp/gstrtpmp4gdepay.c: (gst_rtp_mp4g_depay_process): + Handle multiple AU per packet. + * gst/rtp/gstrtpsv3vdepay.c: (gst_rtp_sv3v_depay_process), + (gst_rtp_sv3v_depay_plugin_init): + Disable rank, this one does not work. + Remove timestamping, base class does that. 2007-04-10 Stefan Kost <en...@us...> * gst/auparse/gstauparse.c: (gst_au_parse_parse_header): Index: gstrtpamrdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpamrdepay.c,v retrieving revision 1.25 retrieving revision 1.26 diff -u -d -r1.25 -r1.26 --- gstrtpamrdepay.c 24 Jan 2007 12:22:50 -0000 1.25 +++ gstrtpamrdepay.c 10 Apr 2007 17:06:05 -0000 1.26 @@ -197,6 +197,7 @@ if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) clock_rate = 8000; + depayload->clock_rate = clock_rate; /* we require 1 channel, 8000 Hz, octet aligned, no CRC, * no robust sorting, no interleaving for now */ @@ -233,24 +234,20 @@ { GstRtpAMRDepay *rtpamrdepay; GstBuffer *outbuf = NULL; + gint payload_len; rtpamrdepay = GST_RTP_AMR_DEPAY (depayload); if (!rtpamrdepay->negotiated) goto not_negotiated; - if (!gst_rtp_buffer_validate (buf)) { - GST_ELEMENT_WARNING (rtpamrdepay, STREAM, DECODE, - (NULL), ("AMR RTP packet did not validate")); - goto bad_packet; - } + if (!gst_rtp_buffer_validate (buf)) + goto invalid_packet; /* when we get here, 1 channel, 8000 Hz, octet aligned, no CRC, * no robust sorting, no interleaving data is to be depayloaded */ { - gint payload_len; guint8 *payload, *p, *dp; - guint32 timestamp; guint8 CMR; gint i, num_packets, num_nonempty_packets; gint amr_len; @@ -259,11 +256,8 @@ payload_len = gst_rtp_buffer_get_payload_len (buf); /* need at least 2 bytes for the header */ - if (payload_len < 2) { - GST_ELEMENT_WARNING (rtpamrdepay, STREAM, DECODE, - (NULL), ("AMR RTP payload too small (%d)", payload_len)); - goto bad_packet; - } + if (payload_len < 2) + goto too_small; payload = gst_rtp_buffer_get_payload (buf); @@ -290,11 +284,8 @@ payload_len -= 1; payload += 1; - if (ILP > ILL) { - GST_ELEMENT_WARNING (rtpamrdepay, STREAM, DECODE, - (NULL), ("AMR RTP wrong interleaving")); - goto bad_packet; - } + if (ILP > ILL) + goto wrong_interleaving; } /* @@ -317,11 +308,8 @@ fr_size = frame_size[FT]; GST_DEBUG_OBJECT (rtpamrdepay, "frame size %d", fr_size); - if (fr_size == -1) { - (NULL), ("AMR RTP frame size == -1")); + if (fr_size == -1) + goto wrong_framesize; if (fr_size > 0) { amr_len += fr_size; @@ -335,26 +323,15 @@ if (rtpamrdepay->crc) { /* data len + CRC len + header bytes should be smaller than payload_len */ - if (num_packets + num_nonempty_packets + amr_len > payload_len) { - (NULL), ("AMR RTP wrong length 1")); + if (num_packets + num_nonempty_packets + amr_len > payload_len) + goto wrong_length_1; } else { /* data len + header bytes should be smaller than payload_len */ - if (num_packets + amr_len > payload_len) { - (NULL), ("AMR RTP wrong length 2")); + if (num_packets + amr_len > payload_len) + goto wrong_length_2; - timestamp = gst_rtp_buffer_get_timestamp (buf); - outbuf = gst_buffer_new_and_alloc (payload_len); - GST_BUFFER_TIMESTAMP (outbuf) = - gst_util_uint64_scale_int (timestamp, GST_SECOND, - depayload->clock_rate); /* point to destination */ p = GST_BUFFER_DATA (outbuf); @@ -386,16 +363,51 @@ GST_DEBUG ("gst_rtp_amr_depay_chain: pushing buffer of size %d", GST_BUFFER_SIZE (outbuf)); } return outbuf; /* ERRORS */ +invalid_packet: + { + GST_ELEMENT_WARNING (rtpamrdepay, STREAM, DECODE, + (NULL), ("AMR RTP packet did not validate")); + goto bad_packet; + } not_negotiated: GST_ELEMENT_ERROR (rtpamrdepay, STREAM, NOT_IMPLEMENTED, (NULL), ("not negotiated")); return NULL; +too_small: + (NULL), ("AMR RTP payload too small (%d)", payload_len)); +wrong_interleaving: + (NULL), ("AMR RTP wrong interleaving")); +wrong_framesize: + (NULL), ("AMR RTP frame size == -1")); +wrong_length_1: + (NULL), ("AMR RTP wrong length 1")); +wrong_length_2: + (NULL), ("AMR RTP wrong length 2")); bad_packet: /* no fatal error */ Index: gstrtph264depay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtph264depay.c,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- gstrtph264depay.c 29 Mar 2007 14:40:35 -0000 1.10 +++ gstrtph264depay.c 10 Apr 2007 17:06:05 -0000 1.11 @@ -154,8 +154,10 @@ rtph264depay = GST_RTP_H264_DEPAY (object); + if (rtph264depay->codec_data) + gst_buffer_unref (rtph264depay->codec_data); g_object_unref (rtph264depay->adapter); - rtph264depay->adapter = NULL; G_OBJECT_CLASS (parent_class)->finalize (object); } @@ -255,9 +257,12 @@ GST_BUFFER_SIZE (codec_data) = total; - /* don't set codec_data, we send unpacketized data so let the decoder - * packetize for us */ - gst_adapter_push (rtph264depay->adapter, codec_data); + /* keep the codec_data, we need to send it as the first buffer. We cannot + * push it in the adapter because the adapter might be flushed on discont. + */ + if (rtph264depay->codec_data) + gst_buffer_unref (rtph264depay->codec_data); + rtph264depay->codec_data = codec_data; gst_pad_set_caps (depayload->srcpad, srccaps); @@ -333,6 +338,12 @@ rtph264depay->wait_start = FALSE; + /* prepend codec_data */ + if (rtph264depay->codec_data) { + gst_adapter_push (rtph264depay->adapter, rtph264depay->codec_data); + rtph264depay->codec_data = NULL; + } /* STAP-A Single-time aggregation packet 5.7.1 */ while (payload_len > 2) { /* 1 @@ -446,13 +457,20 @@ /* if NAL unit ends, flush the adapter */ if (E) { + GST_DEBUG_OBJECT (rtph264depay, "output %d bytes", outsize); outsize = gst_adapter_available (rtph264depay->adapter); outbuf = gst_adapter_take_buffer (rtph264depay->adapter, outsize); gst_buffer_set_caps (outbuf, GST_PAD_CAPS (depayload->srcpad)); - GST_DEBUG_OBJECT (rtph264depay, "output %d bytes", outsize); + /* push codec_data first */ + if (rtph264depay->codec_data) { + gst_buffer_set_caps (rtph264depay->codec_data, + GST_PAD_CAPS (depayload->srcpad)); + gst_base_rtp_depayload_push (depayload, rtph264depay->codec_data); + rtph264depay->codec_data = NULL; + } return outbuf; } break; @@ -473,6 +491,13 @@ gst_buffer_set_caps (outbuf, GST_PAD_CAPS (depayload->srcpad)); + /* push codec_data first */ + gst_buffer_set_caps (rtph264depay->codec_data, + GST_PAD_CAPS (depayload->srcpad)); + gst_base_rtp_depayload_push (depayload, rtph264depay->codec_data); return outbuf; } Index: gstrtph264depay.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtph264depay.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- gstrtph264depay.h 29 Mar 2007 14:40:35 -0000 1.2 +++ gstrtph264depay.h 10 Apr 2007 17:06:05 -0000 1.3 @@ -44,6 +44,7 @@ GstBaseRTPDepayload depayload; + GstBuffer *codec_data; GstAdapter *adapter; gboolean wait_start; }; Index: gstrtpmp4gdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4gdepay.c,v retrieving revision 1.13 retrieving revision 1.14 diff -u -d -r1.13 -r1.14 --- gstrtpmp4gdepay.c 10 Apr 2007 10:01:14 -0000 1.13 +++ gstrtpmp4gdepay.c 10 Apr 2007 17:06:05 -0000 1.14 @@ -287,64 +287,92 @@ guint32 timestamp; guint AU_headers_len; guint AU_size, AU_index; + gboolean M; 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; /* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- .. -+-+-+-+-+-+-+-+-+-+ * |AU-headers-length|AU-header|AU-header| |AU-header|padding| * | | (1) | (2) | | (n) * | bits | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- .. -+-+-+-+-+-+-+-+-+-+ * - * The lenght is 2 bytes and contains the length of the following + * The length is 2 bytes and contains the length of the following * AU-headers in bits. */ AU_headers_len = (payload[0] << 8) | payload[1]; + AU_headers_bytes = (AU_headers_len + 7) / 8; + num_AU_headers = AU_headers_len / 16; + GST_DEBUG_OBJECT (rtpmp4gdepay, "AU headers len %d, bytes %d, num %d", + AU_headers_len, AU_headers_bytes, num_AU_headers); /* skip header */ payload += 2; - payload_header += 2; - payload_len -= 2; + /* skip special headers */ + payload_header = 2 + AU_headers_bytes; - /* FIXME, use bits */ - AU_size = ((payload[0] << 8) | payload[1]) >> 3; - AU_index = payload[1] & 0x7; + 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; - GST_DEBUG_OBJECT (rtpmp4gdepay, "len, %d, size %d, index %d", - AU_headers_len, AU_size, AU_index); + GST_DEBUG_OBJECT (rtpmp4gdepay, "len, %d, size %d, index %d", + AU_headers_len, AU_size, AU_index); - /* skip special headers */ - payload += (AU_headers_len + 7) / 8; - payload_header += (AU_headers_len + 7) / 8; - payload_len = 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_adapter_push (rtpmp4gdepay->adapter, outbuf); + if (M) { + guint avail; - /* strip header from payload and push in the adapter */ - outbuf = - gst_rtp_buffer_get_payload_subbuffer (buf, payload_header, payload_len); - gst_adapter_push (rtpmp4gdepay->adapter, outbuf); + /* packet is complete, flush */ + avail = gst_adapter_available (rtpmp4gdepay->adapter); - /* if this was the last packet of the VOP, create and push a buffer */ - if (gst_rtp_buffer_get_marker (buf)) { - guint avail; + outbuf = gst_adapter_take_buffer (rtpmp4gdepay->adapter, avail); + gst_buffer_set_caps (outbuf, GST_PAD_CAPS (depayload->srcpad)); - avail = gst_adapter_available (rtpmp4gdepay->adapter); + GST_DEBUG ("gst_rtp_mp4g_depay_chain: pushing buffer of size %d", + GST_BUFFER_SIZE (outbuf)); - outbuf = gst_adapter_take_buffer (rtpmp4gdepay->adapter, avail); - gst_buffer_set_caps (outbuf, GST_PAD_CAPS (depayload->srcpad)); - GST_BUFFER_TIMESTAMP (outbuf) = gst_util_uint64_scale_int - (timestamp, GST_SECOND, depayload->clock_rate); + /* 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); + payload_header += AU_size; + } + } else { + /* push complete buffer in adapter */ + outbuf = gst_rtp_buffer_get_payload_subbuffer (buf, 0, payload_len); + gst_adapter_push (rtpmp4gdepay->adapter, outbuf); - GST_DEBUG ("gst_rtp_mp4g_depay_chain: pushing buffer of size %d", - GST_BUFFER_SIZE (outbuf)); + /* if this was the last packet of the VOP, create and push a buffer */ + if (M) { + guint avail; - return outbuf; - } else { - return NULL; + 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)); + return outbuf; return NULL; Index: gstrtpsv3vdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpsv3vdepay.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- gstrtpsv3vdepay.c 29 Mar 2007 14:03:21 -0000 1.6 +++ gstrtpsv3vdepay.c 10 Apr 2007 17:06:05 -0000 1.7 @@ -252,16 +252,11 @@ if (M) { /* frame is completed: push contents of adapter */ guint avail; - guint32 timestamp; 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 */ - timestamp = gst_rtp_buffer_get_timestamp (buf); - GST_BUFFER_TIMESTAMP (outbuf) = - gst_util_uint64_scale_int (timestamp, GST_SECOND, - depayload->clock_rate); gst_buffer_set_caps (outbuf, GST_PAD_CAPS (depayload->srcpad)); return outbuf; @@ -342,5 +337,5 @@ gst_rtp_sv3v_depay_plugin_init (GstPlugin * plugin) return gst_element_register (plugin, "rtpsv3vdepay", - GST_RANK_MARGINAL, GST_TYPE_RTP_SV3V_DEPAY); + GST_RANK_NONE, GST_TYPE_RTP_SV3V_DEPAY); |
From: <wt...@ke...> - 2007-04-12 14:21:13
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Thu Apr 12 2007 14:21:09 UTC Log message: * gst/rtp/gstrtph264depay.c: Use the proper sync word for SPS and PPS. Modified files: . : ChangeLog gst/rtp : gstrtph264depay.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2860&r2=1.2861 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtph264depay.c.diff?r1=1.11&r2=1.12 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2860 retrieving revision 1.2861 diff -u -d -r1.2860 -r1.2861 --- ChangeLog 12 Apr 2007 11:41:11 -0000 1.2860 +++ ChangeLog 12 Apr 2007 14:20:56 -0000 1.2861 @@ -1,3 +1,8 @@ +2007-04-12 Wim Taymans <wi...@fl...> + + * gst/rtp/gstrtph264depay.c: + Use the proper sync word for SPS and PPS. 2007-04-12 Thomas Vander Stichele <thomas at apestaart dot org> * gst/rtp/Makefile.am: Index: gstrtph264depay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtph264depay.c,v retrieving revision 1.11 retrieving revision 1.12 diff -u -d -r1.11 -r1.12 --- gstrtph264depay.c 10 Apr 2007 17:06:05 -0000 1.11 +++ gstrtph264depay.c 12 Apr 2007 14:20:56 -0000 1.12 @@ -29,8 +29,8 @@ GST_DEBUG_CATEGORY_STATIC (rtph264depay_debug); #define GST_CAT_DEFAULT (rtph264depay_debug) -/* 2 or 3 bytes syncword */ -static const guint8 sync_bytes[] = { 0, 0, 1 }; +/* 3 zero bytes syncword */ +static const guint8 sync_bytes[] = { 0, 0, 0, 1 }; /* elementfactory information */ static const GstElementDetails gst_rtp_h264depay_details = |
From: <wt...@ke...> - 2007-04-25 09:48:07
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Wed Apr 25 2007 09:48:00 UTC Log message: * gst/rtp/gstrtpL16depay.c: (gst_rtp_L16_depay_set_property): * gst/rtp/gstrtpamrdepay.c: (gst_rtp_amr_depay_init), (gst_rtp_amr_depay_setcaps), (gst_rtp_amr_depay_process): * gst/rtp/gstrtpgsmdepay.c: (gst_rtp_gsm_depay_init), (gst_rtp_gsm_depay_setcaps): * gst/rtp/gstrtph263pdepay.c: (gst_rtp_h263p_depay_setcaps): * gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_setcaps): * gst/rtp/gstrtpilbcdepay.c: (gst_rtp_ilbc_depay_class_init), (gst_rtp_ilbc_depay_init), (gst_rtp_ilbc_depay_setcaps), (gst_rtp_ilbc_depay_process), (gst_ilbc_depay_set_property), (gst_ilbc_depay_get_property): * gst/rtp/gstrtpmp2tdepay.c: (gst_rtp_mp2t_depay_setcaps): * gst/rtp/gstrtpmp4adepay.c: * gst/rtp/gstrtppcmadepay.c: (gst_rtp_pcma_depay_init), (gst_rtp_pcma_depay_setcaps): * gst/rtp/gstrtppcmudepay.c: (gst_rtp_pcmu_depay_init), (gst_rtp_pcmu_depay_setcaps): Make sure we configure the clock_rate in the baseclass in the setcaps function. Fixes #431282. Modified files: . : ChangeLog gst/rtp : gstrtpL16depay.c gstrtpamrdepay.c gstrtpgsmdepay.c gstrtph263pdepay.c gstrtph264depay.c gstrtpilbcdepay.c gstrtpmp2tdepay.c gstrtpmp4adepay.c gstrtppcmadepay.c gstrtppcmudepay.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2875&r2=1.2876 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpL16depay.c.diff?r1=1.28&r2=1.29 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpamrdepay.c.diff?r1=1.26&r2=1.27 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpgsmdepay.c.diff?r1=1.29&r2=1.30 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtph263pdepay.c.diff?r1=1.21&r2=1.22 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtph264depay.c.diff?r1=1.12&r2=1.13 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpilbcdepay.c.diff?r1=1.10&r2=1.11 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp2tdepay.c.diff?r1=1.8&r2=1.9 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4adepay.c.diff?r1=1.3&r2=1.4 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtppcmadepay.c.diff?r1=1.10&r2=1.11 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtppcmudepay.c.diff?r1=1.9&r2=1.10 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2875 retrieving revision 1.2876 diff -u -d -r1.2875 -r1.2876 --- ChangeLog 25 Apr 2007 08:36:46 -0000 1.2875 +++ ChangeLog 25 Apr 2007 09:47:48 -0000 1.2876 @@ -1,5 +1,27 @@ 2007-04-25 Wim Taymans <wi...@fl...> + * gst/rtp/gstrtpL16depay.c: (gst_rtp_L16_depay_set_property): + * gst/rtp/gstrtpamrdepay.c: (gst_rtp_amr_depay_init), + (gst_rtp_amr_depay_setcaps), (gst_rtp_amr_depay_process): + * gst/rtp/gstrtpgsmdepay.c: (gst_rtp_gsm_depay_init), + (gst_rtp_gsm_depay_setcaps): + * gst/rtp/gstrtph263pdepay.c: (gst_rtp_h263p_depay_setcaps): + * gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_setcaps): + * gst/rtp/gstrtpilbcdepay.c: (gst_rtp_ilbc_depay_class_init), + (gst_rtp_ilbc_depay_init), (gst_rtp_ilbc_depay_setcaps), + (gst_rtp_ilbc_depay_process), (gst_ilbc_depay_set_property), + (gst_ilbc_depay_get_property): + * gst/rtp/gstrtpmp2tdepay.c: (gst_rtp_mp2t_depay_setcaps): + * gst/rtp/gstrtpmp4adepay.c: + * gst/rtp/gstrtppcmadepay.c: (gst_rtp_pcma_depay_init), + (gst_rtp_pcma_depay_setcaps): + * gst/rtp/gstrtppcmudepay.c: (gst_rtp_pcmu_depay_init), + (gst_rtp_pcmu_depay_setcaps): + Make sure we configure the clock_rate in the baseclass in the setcaps + function. Fixes #431282. + +2007-04-25 Wim Taymans <wi...@fl...> * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_finalize), (gst_rtspsrc_stream_free), (request_pt_map), (gst_rtspsrc_stream_configure_transport), (gst_rtspsrc_open): Index: gstrtpL16depay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpL16depay.c,v retrieving revision 1.28 retrieving revision 1.29 diff -u -d -r1.28 -r1.29 --- gstrtpL16depay.c 10 Apr 2007 10:01:14 -0000 1.28 +++ gstrtpL16depay.c 25 Apr 2007 09:47:48 -0000 1.29 @@ -260,6 +260,7 @@ switch (prop_id) { default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } } Index: gstrtpamrdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpamrdepay.c,v retrieving revision 1.26 retrieving revision 1.27 diff -u -d -r1.26 -r1.27 --- gstrtpamrdepay.c 10 Apr 2007 17:06:05 -0000 1.26 +++ gstrtpamrdepay.c 25 Apr 2007 09:47:48 -0000 1.27 @@ -136,7 +136,6 @@ depayload = GST_BASE_RTP_DEPAYLOAD (rtpamrdepay); - depayload->clock_rate = 8000; gst_pad_use_fixed_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload)); @@ -148,7 +147,7 @@ GstRtpAMRDepay *rtpamrdepay; const gchar *params; const gchar *str; - gint clock_rate; + gint clock_rate = 8000; /* default */ rtpamrdepay = GST_RTP_AMR_DEPAY (depayload); @@ -195,8 +194,7 @@ rtpamrdepay->channels = atoi (params); - if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) - clock_rate = 8000; + gst_structure_get_int (structure, "clock-rate", &clock_rate); depayload->clock_rate = clock_rate; /* we require 1 channel, 8000 Hz, octet aligned, no CRC, Index: gstrtpgsmdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpgsmdepay.c,v retrieving revision 1.30 diff -u -d -r1.29 -r1.30 --- gstrtpgsmdepay.c 29 Mar 2007 14:03:21 -0000 1.29 +++ gstrtpgsmdepay.c 25 Apr 2007 09:47:48 -0000 1.30 @@ -103,19 +103,26 @@ gst_rtp_gsm_depay_init (GstRTPGSMDepay * rtpgsmdepay, GstRTPGSMDepayClass * klass) { - GST_BASE_RTP_DEPAYLOAD (rtpgsmdepay)->clock_rate = 8000; static gboolean -gst_rtp_gsm_depay_setcaps (GstBaseRTPDepayload * _depayload, GstCaps * caps) +gst_rtp_gsm_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) GstCaps *srccaps; gboolean ret; + GstStructure *structure; - srccaps = gst_static_pad_template_get_caps (&gst_rtp_gsm_depay_src_template); - ret = gst_pad_set_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (_depayload), srccaps); + structure = gst_caps_get_structure (caps, 0); + depayload->clock_rate = clock_rate; + srccaps = gst_caps_new_simple ("audio/x-gsm", + "channels", G_TYPE_INT, 1, "rate", G_TYPE_INT, clock_rate, NULL); + ret = gst_pad_set_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload), srccaps); gst_caps_unref (srccaps); return ret; Index: gstrtph263pdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtph263pdepay.c,v retrieving revision 1.21 retrieving revision 1.22 diff -u -d -r1.21 -r1.22 --- gstrtph263pdepay.c 29 Mar 2007 14:40:35 -0000 1.21 +++ gstrtph263pdepay.c 25 Apr 2007 09:47:48 -0000 1.22 @@ -142,17 +142,22 @@ gboolean gst_rtp_h263p_depay_setcaps (GstBaseRTPDepayload * filter, GstCaps * caps) - + GstCaps *srccaps; GstStructure *structure = gst_caps_get_structure (caps, 0); gint clock_rate = 90000; /* default */ gst_structure_get_int (structure, "clock-rate", &clock_rate); filter->clock_rate = clock_rate; + srccaps = gst_caps_new_simple ("video/x-h263", + "variant", G_TYPE_STRING, "itu", + "h263version", G_TYPE_STRING, "h263p", NULL); + gst_pad_set_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (filter), srccaps); + gst_caps_unref (srccaps); return TRUE; static GstBuffer * gst_rtp_h263p_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) Index: gstrtph264depay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtph264depay.c,v retrieving revision 1.12 retrieving revision 1.13 diff -u -d -r1.12 -r1.13 --- gstrtph264depay.c 12 Apr 2007 14:20:56 -0000 1.12 +++ gstrtph264depay.c 25 Apr 2007 09:47:48 -0000 1.13 @@ -220,8 +220,7 @@ rtph264depay = GST_RTP_H264_DEPAY (depayload); - if (gst_structure_has_field (structure, "clock-rate")) - gst_structure_get_int (structure, "clock-rate", &clock_rate); srccaps = gst_caps_new_simple ("video/x-h264", NULL); Index: gstrtpilbcdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpilbcdepay.c,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- gstrtpilbcdepay.c 29 Mar 2007 14:03:21 -0000 1.10 +++ gstrtpilbcdepay.c 25 Apr 2007 09:47:48 -0000 1.11 @@ -39,12 +39,15 @@ LAST_SIGNAL }; +#define DEFAULT_MODE GST_ILBC_MODE_30 enum - ARG_0, - ARG_MODE + PROP_0, + PROP_MODE +/* FIXME, mode should be string because it is a parameter in SDP fmtp */ static GstStaticPadTemplate gst_rtp_ilbc_depay_sink_template = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, @@ -119,11 +122,10 @@ gobject_class->set_property = gst_ilbc_depay_set_property; gobject_class->get_property = gst_ilbc_depay_get_property; - g_object_class_install_property (gobject_class, ARG_MODE, g_param_spec_enum ("mode", "Mode", "iLBC frame mode", GST_TYPE_ILBC_MODE, /* enum type */ - GST_ILBC_MODE_30, /* default value */ - G_PARAM_READWRITE)); - parent_class = g_type_class_peek_parent (klass); + /* FIXME, mode is in the caps */ + g_object_class_install_property (gobject_class, PROP_MODE, + g_param_spec_enum ("mode", "Mode", "iLBC frame mode", + GST_TYPE_ILBC_MODE, DEFAULT_MODE, G_PARAM_READWRITE)); gstbasertpdepayload_class->process = gst_rtp_ilbc_depay_process; gstbasertpdepayload_class->set_caps = gst_rtp_ilbc_depay_setcaps; @@ -137,10 +139,8 @@ depayload = GST_BASE_RTP_DEPAYLOAD (rtpilbcdepay); - /* Set default mode to 30 */ - rtpilbcdepay->mode = GST_ILBC_MODE_30; + /* Set default mode */ + rtpilbcdepay->mode = DEFAULT_MODE; @@ -149,26 +149,33 @@ GstRTPiLBCDepay *rtpilbcdepay = GST_RTP_ILBC_DEPAY (depayload); GstStructure *structure; + gint mode; - srccaps = gst_caps_copy (gst_static_pad_template_get_caps - (&gst_rtp_ilbc_depay_src_template)); - structure = gst_caps_get_structure (srccaps, 0); - gst_structure_set (structure, "mode", G_TYPE_INT, - rtpilbcdepay->mode == GST_ILBC_MODE_30 ? 30 : 20, NULL); + /* parse mode, if we can */ + mode = rtpilbcdepay->mode; + gst_structure_get_int (structure, "mode", &mode); + rtpilbcdepay->mode = mode; + srccaps = gst_caps_new_simple ("audio/x-iLBC", + "mode", G_TYPE_INT, rtpilbcdepay->mode, NULL); ret = gst_pad_set_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload), srccaps); GST_DEBUG ("set caps on source: %" GST_PTR_FORMAT " (ret=%d)", srccaps, ret); + /* always fixed clock rate of 8000 */ + depayload->clock_rate = 8000; gst_rtp_ilbc_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf) - GstBuffer *outbuf = NULL; + GstBuffer *outbuf; GST_DEBUG ("process : got %d bytes, mark %d ts %u seqn %d", GST_BUFFER_SIZE (buf), @@ -187,7 +194,7 @@ GstRTPiLBCDepay *rtpilbcdepay = GST_RTP_ILBC_DEPAY (object); - case ARG_MODE: + case PROP_MODE: rtpilbcdepay->mode = g_value_get_enum (value); @@ -203,7 +210,7 @@ g_value_set_enum (value, rtpilbcdepay->mode); Index: gstrtpmp2tdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp2tdepay.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- gstrtpmp2tdepay.c 29 Mar 2007 14:03:21 -0000 1.8 +++ gstrtpmp2tdepay.c 25 Apr 2007 09:47:48 -0000 1.9 @@ -149,7 +149,7 @@ gst_rtp_mp2t_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) GstRtpMP2TDepay *rtpmp2tdepay; @@ -157,13 +157,15 @@ rtpmp2tdepay = GST_RTP_MP2T_DEPAY (depayload); structure = gst_caps_get_structure (caps, 0); - if (gst_structure_has_field (structure, "clock-rate")) { - } + srccaps = gst_caps_new_simple ("video/mpegts", + "packetsize", G_TYPE_INT, 188, + "systemstream", G_TYPE_BOOLEAN, TRUE, NULL); + gst_pad_set_caps (GST_BASE_RTP_DEPAYLOAD_SRCPAD (depayload), srccaps); Index: gstrtpmp4adepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4adepay.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- gstrtpmp4adepay.c 5 Apr 2007 13:56:44 -0000 1.3 +++ gstrtpmp4adepay.c 25 Apr 2007 09:47:48 -0000 1.4 @@ -148,7 +148,6 @@ G_OBJECT_CLASS (parent_class)->finalize (object); gst_rtp_mp4a_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) Index: gstrtppcmadepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtppcmadepay.c,v --- gstrtppcmadepay.c 29 Mar 2007 14:03:21 -0000 1.10 +++ gstrtppcmadepay.c 25 Apr 2007 09:47:48 -0000 1.11 @@ -112,7 +112,6 @@ depayload = GST_BASE_RTP_DEPAYLOAD (rtppcmadepay); @@ -120,11 +119,17 @@ gst_rtp_pcma_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) - srccaps = gst_caps_new_simple ("audio/x-alaw", - "channels", G_TYPE_INT, 1, "rate", G_TYPE_INT, 8000, NULL); + srccaps = gst_caps_new_simple ("audio/x-alaw", Index: gstrtppcmudepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtppcmudepay.c,v diff -u -d -r1.9 -r1.10 --- gstrtppcmudepay.c 29 Mar 2007 14:03:21 -0000 1.9 +++ gstrtppcmudepay.c 25 Apr 2007 09:47:48 -0000 1.10 depayload = GST_BASE_RTP_DEPAYLOAD (rtppcmudepay); gst_rtp_pcmu_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps) - srccaps = gst_caps_new_simple ("audio/x-mulaw", + srccaps = gst_caps_new_simple ("audio/x-mulaw", |
From: <wt...@ke...> - 2007-04-27 15:30:57
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Fri Apr 27 2007 15:30:51 UTC Log message: * gst/rtp/gstrtpilbcdepay.h: Fix mode property when specified as an arg. Modified files: . : ChangeLog gst/rtp : gstrtpilbcdepay.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2884&r2=1.2885 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpilbcdepay.h.diff?r1=1.2&r2=1.3 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2884 retrieving revision 1.2885 diff -u -d -r1.2884 -r1.2885 --- ChangeLog 26 Apr 2007 15:08:19 -0000 1.2884 +++ ChangeLog 27 Apr 2007 15:30:39 -0000 1.2885 @@ -1,3 +1,8 @@ +2007-04-27 Wim Taymans <wi...@fl...> + + * gst/rtp/gstrtpilbcdepay.h: + Fix mode property when specified as an arg. 2007-04-26 Edward Hervey <ed...@fl...> * docs/plugins/gst-plugins-good-plugins-docs.sgml: Index: gstrtpilbcdepay.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpilbcdepay.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- gstrtpilbcdepay.h 13 Apr 2006 09:01:17 -0000 1.2 +++ gstrtpilbcdepay.h 27 Apr 2007 15:30:39 -0000 1.3 @@ -40,8 +40,8 @@ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_ILBC_DEPAY)) typedef enum { - GST_ILBC_MODE_20, - GST_ILBC_MODE_30 + GST_ILBC_MODE_20 = 20, + GST_ILBC_MODE_30 = 30 } GstiLBCMode; struct _GstRTPiLBCDepay |
From: <wt...@ke...> - 2007-05-01 16:14:17
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Tue May 01 2007 16:14:10 UTC Log message: Patch by: Sjoerd Simons <sjoerd at luon dot net> * gst/rtp/gstrtpmp4vpay.c: (gst_rtp_mp4v_pay_init), (gst_rtp_mp4v_pay_empty), (gst_rtp_mp4v_pay_event): * gst/rtp/gstrtpmp4vpay.h: Handle NEWSEGMENT and FLUSH events. Fixes #434824. Modified files: . : ChangeLog gst/rtp : gstrtpmp4vpay.c gstrtpmp4vpay.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2889&r2=1.2890 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4vpay.c.diff?r1=1.25&r2=1.26 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4vpay.h.diff?r1=1.10&r2=1.11 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2889 retrieving revision 1.2890 diff -u -d -r1.2889 -r1.2890 --- ChangeLog 30 Apr 2007 11:15:58 -0000 1.2889 +++ ChangeLog 1 May 2007 16:13:58 -0000 1.2890 @@ -1,3 +1,12 @@ +2007-05-01 Wim Taymans <wi...@fl...> + + Patch by: Sjoerd Simons <sjoerd at luon dot net> + * gst/rtp/gstrtpmp4vpay.c: (gst_rtp_mp4v_pay_init), + (gst_rtp_mp4v_pay_empty), (gst_rtp_mp4v_pay_event): + * gst/rtp/gstrtpmp4vpay.h: + Handle NEWSEGMENT and FLUSH events. Fixes #434824. 2007-04-30 Tim-Philipp Müller <tim at centricular dot net> * docs/plugins/gst-plugins-good-plugins-docs.sgml: Index: gstrtpmp4vpay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4vpay.c,v retrieving revision 1.25 retrieving revision 1.26 diff -u -d -r1.25 -r1.26 --- gstrtpmp4vpay.c 29 Mar 2007 14:03:21 -0000 1.25 +++ gstrtpmp4vpay.c 1 May 2007 16:13:58 -0000 1.26 @@ -84,6 +84,7 @@ GstCaps * caps); static GstFlowReturn gst_rtp_mp4v_pay_handle_buffer (GstBaseRTPPayload * payload, GstBuffer * buffer); +static gboolean gst_rtp_mp4v_pay_event (GstPad * pad, GstEvent * event); static GstBaseRTPPayloadClass *parent_class = NULL; @@ -159,10 +160,17 @@ static void gst_rtp_mp4v_pay_init (GstRtpMP4VPay * rtpmp4vpay) { + GstPad *sinkpad; rtpmp4vpay->adapter = gst_adapter_new (); rtpmp4vpay->rate = 90000; rtpmp4vpay->profile = 1; rtpmp4vpay->send_config = DEFAULT_SEND_CONFIG; + sinkpad = GST_BASE_RTP_PAYLOAD_SINKPAD (rtpmp4vpay); + rtpmp4vpay->old_event_func = sinkpad->eventfunc; + gst_pad_set_event_function (sinkpad, gst_rtp_mp4v_pay_event); } @@ -243,6 +251,12 @@ return TRUE; +static void +gst_rtp_mp4v_pay_empty (GstRtpMP4VPay * rtpmp4vpay) +{ + gst_adapter_clear (rtpmp4vpay->adapter); +} static GstFlowReturn gst_rtp_mp4v_pay_flush (GstRtpMP4VPay * rtpmp4vpay) @@ -452,6 +466,34 @@ return ret; +static gboolean +gst_rtp_mp4v_pay_event (GstPad * pad, GstEvent * event) + GstRtpMP4VPay *rtpmp4vpay; + gboolean ret; + rtpmp4vpay = GST_RTP_MP4V_PAY (gst_pad_get_parent (pad)); + GST_DEBUG ("Got event: %s", GST_EVENT_TYPE_NAME (event)); + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_NEWSEGMENT: + gst_rtp_mp4v_pay_flush (rtpmp4vpay); + break; + case GST_EVENT_FLUSH_STOP: + gst_rtp_mp4v_pay_empty (rtpmp4vpay); + default: + } + ret = rtpmp4vpay->old_event_func (pad, event); + g_object_unref (rtpmp4vpay); + return ret; gst_rtp_mp4v_pay_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) Index: gstrtpmp4vpay.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmp4vpay.h,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- gstrtpmp4vpay.h 1 Jun 2006 21:07:25 -0000 1.10 +++ gstrtpmp4vpay.h 1 May 2007 16:13:58 -0000 1.11 @@ -52,6 +52,8 @@ gint profile; GstBuffer *config; gboolean send_config; + GstPadEventFunction old_event_func; }; struct _GstRtpMP4VPayClass |
From: <wt...@ke...> - 2007-05-11 15:04:58
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Fri May 11 2007 15:04:50 UTC Log message: * gst/rtp/README: Update README with new RTP variables that will be used for synchronisation. * gst/rtp/gstrtpvorbisdepay.c: (decode_base64), (gst_rtp_vorbis_depay_parse_configuration), (gst_rtp_vorbis_depay_process): * gst/rtp/gstrtpvorbispay.c: (encode_base64), (gst_rtp_vorbis_pay_finish_headers), (gst_rtp_vorbis_pay_handle_buffer): Update vorbis pay and depayloader to draft-04. Modified files: . : ChangeLog gst/rtp : README gstrtpvorbisdepay.c gstrtpvorbispay.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2911&r2=1.2912 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/README.diff?r1=1.11&r2=1.12 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpvorbisdepay.c.diff?r1=1.8&r2=1.9 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpvorbispay.c.diff?r1=1.9&r2=1.10 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2911 retrieving revision 1.2912 diff -u -d -r1.2911 -r1.2912 --- ChangeLog 11 May 2007 11:24:13 -0000 1.2911 +++ ChangeLog 11 May 2007 15:04:38 -0000 1.2912 @@ -1,5 +1,19 @@ 2007-05-11 Wim Taymans <wi...@fl...> + * gst/rtp/README: + Update README with new RTP variables that will be used for + synchronisation. + + * gst/rtp/gstrtpvorbisdepay.c: (decode_base64), + (gst_rtp_vorbis_depay_parse_configuration), + (gst_rtp_vorbis_depay_process): + * gst/rtp/gstrtpvorbispay.c: (encode_base64), + (gst_rtp_vorbis_pay_finish_headers), + (gst_rtp_vorbis_pay_handle_buffer): + Update vorbis pay and depayloader to draft-04. +2007-05-11 Wim Taymans <wi...@fl...> * gst/rtsp/rtsptransport.c: UDP MCAST is actually the default for RTP/AVP. Index: README RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/README,v retrieving revision 1.11 retrieving revision 1.12 diff -u -d -r1.11 -r1.12 --- README 16 Feb 2007 12:30:22 -0000 1.11 +++ README 11 May 2007 15:04:38 -0000 1.12 @@ -22,16 +22,41 @@ set. * clock-rate: (int) [0 - MAXINT] - the RTP clock rate + The RTP clock rate. ssrc: (uint) [0 - MAXINT] - The ssrc value currently in use. + The ssrc value currently in use. (default = the SSRC of the first RTP + packet) + npt-start: (uint64) [0 - MAXINT] + The Normal Play Time for clock-base. This is the position in the stream and + is between 0 and the duration of the stream. This value is expressed in + nanoseconds GstClockTime. (default = 0) + npt-stop: (uint64) [0 - MAXINT] + The last position in the stream. This value is expressed in nanoseconds + GstClockTime. (default = -1, stop unknown) clock-base: (uint) [0 - MAXINT] - The RTP time representing time 0 + The RTP time representing time npt-start. (default = rtptime of first RTP + packet). + play-speed: (gdouble) [-MIN - MAX] + The intended playback speed of the stream. The client is delivered data at + the adjusted speed. The client should adjust its playback speed with this + value and thus corresponds to the GStreamer rate field in the NEWSEGMENT + event. (default = 1.0) + + play-scale: (gdouble) [-MIN - MAX] + The rate already applied to the stream. The client is delivered a stream + that is scaled by this amount. This value is used to adjust position + reporting and corresponds to the GStream applied-rate field in the + NEWSEGMENT event. (default = 1.0) seqnum-base: (uint) [0 - MAXINT] - The RTP sequence number representing the first rtp packet + The RTP sequence number representing the first rtp packet. When this + parameter is given, all sequence numbers below this seqnum should be + ignored. (default = seqnum of first RTP packet). encoding-name: (String) ANY typically second part of the mime type. ex. MP4V-ES. only required if @@ -50,15 +75,15 @@ Example: "application/x-rtp", - "media", G_TYPE_STRING, "audio", -] - "payload", G_TYPE_INT, 96, ] - required - "clock-rate", G_TYPE_INT, 8000, -] - "encoding-name", G_TYPE_STRING, "AMR", -] - required since payload >= 96 - "encoding-params", G_TYPE_STRING, "1", -] - optional param for AMR - "octet-align", G_TYPE_STRING, "1", -] - "crc", G_TYPE_STRING, "0", ] - "robust-sorting", G_TYPE_STRING, "0", ] AMR specific params. - "interleaving", G_TYPE_STRING, "0", -] + "media", G_TYPE_STRING, "audio", -. + "payload", G_TYPE_INT, 96, | - required + "clock-rate", G_TYPE_INT, 8000, -' + "encoding-name", G_TYPE_STRING, "AMR", -. - required since payload >= 96 + "encoding-params", G_TYPE_STRING, "1", -' - optional param for AMR + "octet-align", G_TYPE_STRING, "1", -. + "crc", G_TYPE_STRING, "0", | + "robust-sorting", G_TYPE_STRING, "0", | AMR specific params. + "interleaving", G_TYPE_STRING, "0", -' Mapping of caps to and from SDP fields: @@ -79,6 +104,18 @@ always use the lowercase names so that the SDP -> caps mapping remains possible. + Mapping of caps to NEWSEGMENT: + rate: <play-speed> + applied-rate: <play-scale> + format: GST_FORMAT_TIME + start: <clock-base> * GST_SECOND / <clock-rate> + stop: if <ntp-stop> != -1 + <npt-stop> - <npt-start> + start + else + -1 + time: <npt-start> usage with UDP -------------- Index: gstrtpvorbisdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpvorbisdepay.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- gstrtpvorbisdepay.c 12 Apr 2007 11:41:11 -0000 1.8 +++ gstrtpvorbisdepay.c 11 May 2007 15:04:38 -0000 1.9 @@ -30,11 +30,15 @@ GST_DEBUG_CATEGORY_STATIC (rtpvorbisdepay_debug); #define GST_CAT_DEFAULT (rtpvorbisdepay_debug) +/* references: + * http://svn.xiph.org/trunk/vorbis/doc/draft-ietf-avt-rtp-vorbis-04.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-01 of RFC XXXX)", + "Extracts Vorbis Audio from RTP packets (draft-04 of RFC XXXX)", "Wim Taymans <wi...@fl...>"); /* RtpVorbisDepay signals and args */ @@ -151,28 +155,70 @@ G_OBJECT_CLASS (parent_class)->finalize (object); } +static const guint8 a2bin[256] = { + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64, 64, 64, 63, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 64, 64, 64, + 64, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 64, 64, 64, 64, 64, + 64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64 +}; +static guint +decode_base64 (const gchar * in, guint8 * out) +{ + guint8 v1, v2; + guint len = 0; + v1 = a2bin[(gint) * in]; + while (v1 <= 63) { + /* read 4 bytes, write 3 bytes, invalid base64 are zeroes */ + v2 = a2bin[(gint) * ++in]; + *out++ = (v1 << 2) | ((v2 & 0x3f) >> 4); + v1 = (v2 > 63 ? 64 : a2bin[(gint) * ++in]); + *out++ = (v2 << 4) | ((v1 & 0x3f) >> 2); + v2 = (v1 > 63 ? 64 : a2bin[(gint) * ++in]); + *out++ = (v1 << 6) | (v2 & 0x3f); + len += 3; + } + /* move to '\0' */ + while (*in != '\0') + in++; + /* subtract padding */ + while (len > 0 && *--in == '=') + len--; + return len; +} static gboolean gst_rtp_vorbis_depay_parse_configuration (GstRtpVorbisDepay * rtpvorbisdepay, const gchar * configuration) { - GValue v = { 0 }; GstBuffer *buf; guint32 num_headers; guint8 *data; guint size; - gint i; - - /* deserialize base16 to buffer */ - g_value_init (&v, GST_TYPE_BUFFER); - if (!gst_value_deserialize (&v, configuration)) - goto wrong_configuration; + gint i, j; - buf = gst_value_get_buffer (&v); - gst_buffer_ref (buf); - g_value_unset (&v); + /* deserialize base64 to buffer */ + size = strlen (configuration); + GST_DEBUG_OBJECT (rtpvorbisdepay, "base64 config size %u", size); - data = GST_BUFFER_DATA (buf); - size = GST_BUFFER_SIZE (buf); + data = g_malloc (size); + size = decode_base64 (configuration, data); GST_DEBUG_OBJECT (rtpvorbisdepay, "config size %u", size); @@ -216,59 +262,73 @@ for (i = 0; i < num_headers; i++) { guint32 ident; guint16 length; + guint8 n_headers, b; GstRtpVorbisConfig *conf; - GstTagList *list; + guint *h_sizes; - if (size < 5) + if (size < 6) goto too_small; ident = (data[0] << 16) | (data[1] << 8) | data[2]; length = (data[3] << 8) | data[4]; - size -= 5; - data += 5; + n_headers = data[5]; + size -= 6; + data += 6; - GST_DEBUG_OBJECT (rtpvorbisdepay, "header %d, ident 0x%08x, length %u", i, - ident, length); + GST_DEBUG_OBJECT (rtpvorbisdepay, + "header %d, ident 0x%08x, length %u, left %u", i, ident, length, size); - if (size < length + VORBIS_ID_LEN) + if (size < length) - GST_DEBUG_OBJECT (rtpvorbisdepay, "preparing headers"); + /* read header sizes we read 2 sizes, the third size (for which we allocate + * space) must be derived from the total packed header length. */ + h_sizes = g_newa (guint, n_headers + 1); + for (j = 0; j < n_headers; j++) { + guint h_size; + h_size = 0; + do { + if (size < 1) + goto too_small; + b = *data++; + size--; + h_size = (h_size << 7) | (b & 0x7f); + } while (b & 0x80); + GST_DEBUG_OBJECT (rtpvorbisdepay, "headers %d: size: %u", j, h_size); + h_sizes[j] = h_size; + length -= h_size; + } + /* last header length is the remaining space */ + GST_DEBUG_OBJECT (rtpvorbisdepay, "last header size: %u", length); + h_sizes[j] = length; + GST_DEBUG_OBJECT (rtpvorbisdepay, "preparing headers"); conf = g_new0 (GstRtpVorbisConfig, 1); conf->ident = ident; - buf = gst_buffer_new_and_alloc (VORBIS_ID_LEN); - memcpy (GST_BUFFER_DATA (buf), data, VORBIS_ID_LEN); - conf->headers = g_list_append (conf->headers, buf); - data += VORBIS_ID_LEN; - size -= VORBIS_ID_LEN; + for (j = 0; j <= n_headers; j++) { - /* create a dummy comment */ - list = gst_tag_list_new (); - buf = - gst_tag_list_to_vorbiscomment_buffer (list, (guint8 *) "\003vorbis", 7, - "Vorbis RTP depayloader"); - gst_tag_list_free (list); + h_size = h_sizes[j]; + if (size < h_size) + goto too_small; - buf = gst_buffer_new_and_alloc (length); - memcpy (GST_BUFFER_DATA (buf), data, length); - data += length; - size -= length; + GST_DEBUG_OBJECT (rtpvorbisdepay, "reading header %d, size %u", j, + h_size); + buf = gst_buffer_new_and_alloc (h_size); + memcpy (GST_BUFFER_DATA (buf), data, h_size); + conf->headers = g_list_append (conf->headers, buf); + data += h_size; + size -= h_size; rtpvorbisdepay->configs = g_list_append (rtpvorbisdepay->configs, conf); } return TRUE; /* ERRORS */ -wrong_configuration: - { - GST_DEBUG_OBJECT (rtpvorbisdepay, "error parsing configuration"); - return FALSE; - } too_small: { GST_DEBUG_OBJECT (rtpvorbisdepay, "configuration too small"); @@ -421,6 +481,8 @@ payload = gst_rtp_buffer_get_payload (buf); free_payload = FALSE; + gst_util_dump_mem (GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); header = GST_READ_UINT32_BE (payload); /* * 0 1 2 3 Index: gstrtpvorbispay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpvorbispay.c,v retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- gstrtpvorbispay.c 12 Apr 2007 11:41:11 -0000 1.9 +++ gstrtpvorbispay.c 11 May 2007 15:04:38 -0000 1.10 @@ -32,7 +32,7 @@ #define GST_CAT_DEFAULT (rtpvorbispay_debug) /* references: - * http://svn.xiph.org/trunk/vorbis/doc/draft-ietf-avt-rtp-vorbis-01.txt */ @@ -208,27 +208,47 @@ return ret; +static gchar * +encode_base64 (const guint8 * in, guint size, guint * len) + gchar *ret, *d; + static const gchar *v = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + *len = ((size + 2) / 3) * 4; + d = ret = (gchar *) g_malloc (*len + 1); + for (; size; in += 3) { /* process tuplets */ + *d++ = v[in[0] >> 2]; /* byte 1: high 6 bits (1) */ + /* byte 2: low 2 bits (1), high 4 bits (2) */ + *d++ = v[((in[0] << 4) + (--size ? (in[1] >> 4) : 0)) & 0x3f]; + /* byte 3: low 4 bits (2), high 2 bits (3) */ + *d++ = size ? v[((in[1] << 2) + (--size ? (in[2] >> 6) : 0)) & 0x3f] : '='; + /* byte 4: low 6 bits (3) */ + *d++ = size ? v[in[2] & 0x3f] : '='; + if (size) + size--; /* count third character if processed */ + *d = '\0'; /* tie off string */ + return ret; /* return the resulting string */ gst_rtp_vorbis_pay_finish_headers (GstBaseRTPPayload * basepayload) GstRtpVorbisPay *rtpvorbispay = GST_RTP_VORBIS_PAY (basepayload); GList *walk; - guint length; + guint length, size, n_headers, configlen; gchar *cstr, *configuration; - guint8 *data; + guint8 *data, *config; guint32 ident; - GstBuffer *config; GST_DEBUG_OBJECT (rtpvorbispay, "finish headers"); if (!rtpvorbispay->headers) goto no_headers; - /* we need exactly 2 header packets */ - if (g_list_length (rtpvorbispay->headers) != 2) - goto no_headers; /* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Number of packed headers | * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ @@ -247,35 +267,60 @@ * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 - * | Ident | .. + * | Ident | length .. - * .. length | Identification Header .. + * .. | n. of headers | length1 | length2 .. - * .. Identification Header | + * .. | Identification Header .. + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * ................................................................. + * .. | Comment Header .. + * .. Comment Header | * | Setup Header .. * .. Setup Header | - * */ - /* count the size of the headers first */ + /* we need 4 bytes for the number of headers (which is always 1), 3 bytes for + * the ident, 2 bytes for length, 1 byte for n. of headers. */ + size = 4 + 3 + 2 + 1; + /* count the size of the headers first and update the hash */ length = 0; + n_headers = 0; ident = fnv1_hash_32_new (); for (walk = rtpvorbispay->headers; walk; walk = g_list_next (walk)) { GstBuffer *buf = GST_BUFFER_CAST (walk->data); + guint bsize; - ident = - fnv1_hash_32_update (ident, GST_BUFFER_DATA (buf), + bsize = GST_BUFFER_SIZE (buf); + length += bsize; + n_headers++; + /* count number of bytes needed for length fields, we don't need this for + * the last header. */ + if (g_list_next (walk)) { + size++; + bsize >>= 7; + } while (bsize); + /* update hash */ + ident = fnv1_hash_32_update (ident, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); - length += GST_BUFFER_SIZE (buf); - /* total config length is 4 bytes header number + size of the - * headers + 2 bytes length + 3 bytes for the ident */ - config = gst_buffer_new_and_alloc (length + 4 + 2 + 3); - data = GST_BUFFER_DATA (config); + /* packet length is header size + packet length */ + configlen = size + length; + config = data = g_malloc (configlen); /* number of packed headers, we only pack 1 header */ data[0] = 0; @@ -292,12 +337,44 @@ data[5] = (ident >> 8) & 0xff; data[6] = ident & 0xff; - /* store length minus the length of the fixed vorbis header */ - data[7] = ((length - 30) >> 8) & 0xff; - data[8] = (length - 30) & 0xff; + /* store length of all vorbis headers */ + data[7] = ((length) >> 8) & 0xff; + data[8] = (length) & 0xff; + /* store number of headers minus one. */ + data[9] = n_headers - 1; + data += 10; + /* store length for each header */ + for (walk = rtpvorbispay->headers; walk; walk = g_list_next (walk)) { + GstBuffer *buf = GST_BUFFER_CAST (walk->data); + guint bsize, size, temp; + /* only need to store the length when it's not the last header */ + if (!g_list_next (walk)) + break; + /* calc size */ + size = 0; + do { + size++; + bsize >>= 7; + } while (bsize); + temp = size; + /* write the size backwards */ + while (size) { + size--; + data[size] = bsize & 0x7f; + data += temp; /* copy header data */ - data += 9; @@ -305,10 +382,9 @@ data += GST_BUFFER_SIZE (buf); - /* serialize buffer to base16 */ - gst_value_take_buffer (&v, config); - configuration = gst_value_serialize (&v); + /* serialize to base64 */ + configuration = encode_base64 (config, configlen, &size); + g_free (config); /* configure payloader settings */ cstr = g_strdup_printf ("%d", rtpvorbispay->channels); @@ -322,7 +398,6 @@ NULL); g_free (cstr); g_free (configuration); @@ -450,12 +525,7 @@ if (rtpvorbispay->need_headers) { /* we need to collect the headers and construct a config string from them */ - if (VDT == 2) { - GST_DEBUG_OBJECT (rtpvorbispay, - "discard comment packet while collecting headers"); - ret = GST_FLOW_OK; - goto done; - } else if (VDT != 0) { + if (VDT != 0) { GST_DEBUG_OBJECT (rtpvorbispay, "collecting header"); /* append header to the list of headers */ rtpvorbispay->headers = g_list_append (rtpvorbispay->headers, buffer); |
From: <wt...@ke...> - 2007-05-14 14:47:46
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Mon May 14 2007 14:47:38 UTC Log message: * gst/rtp/gstrtpvorbisdepay.c: (gst_rtp_vorbis_depay_process): Remove annoying _dump_mem. Modified files: . : ChangeLog gst/rtp : gstrtpvorbisdepay.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2921&r2=1.2922 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpvorbisdepay.c.diff?r1=1.9&r2=1.10 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2921 retrieving revision 1.2922 diff -u -d -r1.2921 -r1.2922 --- ChangeLog 14 May 2007 11:11:42 -0000 1.2921 +++ ChangeLog 14 May 2007 14:47:25 -0000 1.2922 @@ -1,5 +1,10 @@ 2007-05-14 Wim Taymans <wi...@fl...> + * gst/rtp/gstrtpvorbisdepay.c: (gst_rtp_vorbis_depay_process): + Remove annoying _dump_mem. + +2007-05-14 Wim Taymans <wi...@fl...> * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_parse_range): Parse range correctly. Index: gstrtpvorbisdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpvorbisdepay.c,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- gstrtpvorbisdepay.c 11 May 2007 15:04:38 -0000 1.9 +++ gstrtpvorbisdepay.c 14 May 2007 14:47:26 -0000 1.10 @@ -481,8 +481,6 @@ payload = gst_rtp_buffer_get_payload (buf); free_payload = FALSE; - gst_util_dump_mem (GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); - header = GST_READ_UINT32_BE (payload); /* * 0 1 2 3 |
From: <wt...@ke...> - 2007-05-14 17:10:32
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Mon May 14 2007 17:10:24 UTC Log message: * gst/rtp/gstrtptheoradepay.c: (decode_base64), (gst_rtp_theora_depay_parse_configuration): * gst/rtp/gstrtptheorapay.c: (encode_base64), (gst_rtp_theora_pay_finish_headers), (gst_rtp_theora_pay_handle_buffer): Update theora pay/depayloader in a similar to vorbis. * gst/rtp/gstrtpvorbisdepay.c: (gst_rtp_vorbis_depay_parse_configuration): Update docs. Modified files: . : ChangeLog gst/rtp : gstrtptheoradepay.c gstrtptheorapay.c gstrtpvorbisdepay.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2923&r2=1.2924 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtptheoradepay.c.diff?r1=1.3&r2=1.4 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtptheorapay.c.diff?r1=1.5&r2=1.6 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpvorbisdepay.c.diff?r1=1.10&r2=1.11 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2923 retrieving revision 1.2924 diff -u -d -r1.2923 -r1.2924 --- ChangeLog 14 May 2007 16:19:57 -0000 1.2923 +++ ChangeLog 14 May 2007 17:10:12 -0000 1.2924 @@ -1,5 +1,18 @@ 2007-05-14 Wim Taymans <wi...@fl...> + * gst/rtp/gstrtptheoradepay.c: (decode_base64), + (gst_rtp_theora_depay_parse_configuration): + * gst/rtp/gstrtptheorapay.c: (encode_base64), + (gst_rtp_theora_pay_finish_headers), + (gst_rtp_theora_pay_handle_buffer): + Update theora pay/depayloader in a similar to vorbis. + + * gst/rtp/gstrtpvorbisdepay.c: + (gst_rtp_vorbis_depay_parse_configuration): + Update docs. +2007-05-14 Wim Taymans <wi...@fl...> * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_send): When we try to execute a method that is not supported by the server, don't error out but remove the method from the accepted methods so that Index: gstrtptheoradepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtptheoradepay.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- gstrtptheoradepay.c 25 Jan 2007 14:22:53 -0000 1.3 +++ gstrtptheoradepay.c 14 May 2007 17:10:12 -0000 1.4 @@ -59,7 +59,9 @@ "clock-rate = (int) [1, MAX ], " "encoding-name = (string) \"THEORA\"" /* All required parameters * - * "encoding-params = (string) <num channels>" + * "sampling = (string) { "YCbCr-4:2:0", "YCbCr-4:2:2", "YCbCr-4:4:4" } " + * "width = (string) [1, 1048561] (multiples of 16) " + * "height = (string) [1, 1048561] (multiples of 16) " * "delivery-method = (string) { inline, in_band, out_band/<specific_name> } " * "configuration = (string) ANY" */ @@ -77,9 +79,6 @@ GST_STATIC_CAPS ("video/x-theora") ); -/* 42 bytes for the theora identification packet length */ -#define THEORA_ID_LEN 42 - GST_BOILERPLATE (GstRtpTheoraDepay, gst_rtp_theora_depay, GstBaseRTPDepayload, GST_TYPE_BASE_RTP_DEPAYLOAD); @@ -151,28 +150,70 @@ G_OBJECT_CLASS (parent_class)->finalize (object); } +static const guint8 a2bin[256] = { + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64, 64, 64, 63, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 64, 64, 64, + 64, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 64, 64, 64, 64, 64, + 64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64, 64, 64, + 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64 +}; +static guint +decode_base64 (const gchar * in, guint8 * out) +{ + guint8 v1, v2; + guint len = 0; + v1 = a2bin[(gint) * in]; + while (v1 <= 63) { + /* read 4 bytes, write 3 bytes, invalid base64 are zeroes */ + v2 = a2bin[(gint) * ++in]; + *out++ = (v1 << 2) | ((v2 & 0x3f) >> 4); + v1 = (v2 > 63 ? 64 : a2bin[(gint) * ++in]); + *out++ = (v2 << 4) | ((v1 & 0x3f) >> 2); + v2 = (v1 > 63 ? 64 : a2bin[(gint) * ++in]); + *out++ = (v1 << 6) | (v2 & 0x3f); + len += 3; + } + /* move to '\0' */ + while (*in != '\0') + in++; + /* subtract padding */ + while (len > 0 && *--in == '=') + len--; + return len; +} static gboolean gst_rtp_theora_depay_parse_configuration (GstRtpTheoraDepay * rtptheoradepay, const gchar * configuration) { - GValue v = { 0 }; GstBuffer *buf; guint32 num_headers; guint8 *data; guint size; - gint i; - /* deserialize base16 to buffer */ - g_value_init (&v, GST_TYPE_BUFFER); - if (!gst_value_deserialize (&v, configuration)) - goto wrong_configuration; + gint i, j; - buf = gst_value_get_buffer (&v); - gst_buffer_ref (buf); - g_value_unset (&v); + /* deserialize base64 to buffer */ + size = strlen (configuration); + GST_DEBUG_OBJECT (rtptheoradepay, "base64 config size %u", size); - data = GST_BUFFER_DATA (buf); - size = GST_BUFFER_SIZE (buf); + data = g_malloc (size); + size = decode_base64 (configuration, data); GST_DEBUG_OBJECT (rtptheoradepay, "config size %u", size); @@ -201,74 +242,96 @@ /* 0 1 2 3 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - * | Ident | .. + * | Ident | length .. - * .. length | Identification Header .. + * .. | n. of headers | length1 | length2 .. - * .. Identification Header | + * .. | Identification Header .. + * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + * ................................................................. + * .. | Comment Header .. + * .. Comment Header | * | Setup Header .. * .. Setup Header | - * */ for (i = 0; i < num_headers; i++) { guint32 ident; guint16 length; + guint8 n_headers, b; GstRtpTheoraConfig *conf; - GstTagList *list; + guint *h_sizes; - if (size < 5) + if (size < 6) goto too_small; ident = (data[0] << 16) | (data[1] << 8) | data[2]; length = (data[3] << 8) | data[4]; - size -= 5; - data += 5; + n_headers = data[5]; + size -= 6; + data += 6; - GST_DEBUG_OBJECT (rtptheoradepay, "header %d, ident %08x, length %u", i, - ident, length); + GST_DEBUG_OBJECT (rtptheoradepay, + "header %d, ident 0x%08x, length %u, left %u", i, ident, length, size); - if (size < length + THEORA_ID_LEN) + if (size < length) - GST_DEBUG_OBJECT (rtptheoradepay, "preparing headers"); + /* read header sizes we read 2 sizes, the third size (for which we allocate + * space) must be derived from the total packed header length. */ + h_sizes = g_newa (guint, n_headers + 1); + for (j = 0; j < n_headers; j++) { + guint h_size; + h_size = 0; + do { + if (size < 1) + goto too_small; + b = *data++; + size--; + h_size = (h_size << 7) | (b & 0x7f); + } while (b & 0x80); + GST_DEBUG_OBJECT (rtptheoradepay, "headers %d: size: %u", j, h_size); + h_sizes[j] = h_size; + length -= h_size; + } + /* last header length is the remaining space */ + GST_DEBUG_OBJECT (rtptheoradepay, "last header size: %u", length); + h_sizes[j] = length; + GST_DEBUG_OBJECT (rtptheoradepay, "preparing headers"); conf = g_new0 (GstRtpTheoraConfig, 1); conf->ident = ident; - buf = gst_buffer_new_and_alloc (THEORA_ID_LEN); - memcpy (GST_BUFFER_DATA (buf), data, THEORA_ID_LEN); - conf->headers = g_list_append (conf->headers, buf); - data += THEORA_ID_LEN; - size -= THEORA_ID_LEN; + for (j = 0; j <= n_headers; j++) { - /* create a dummy comment */ - list = gst_tag_list_new (); - buf = - gst_tag_list_to_vorbiscomment_buffer (list, (guint8 *) "\201theora", 7, - "Theora RTP depayloader"); - gst_tag_list_free (list); + h_size = h_sizes[j]; + if (size < h_size) + goto too_small; - buf = gst_buffer_new_and_alloc (length); - memcpy (GST_BUFFER_DATA (buf), data, length); - data += length; - size -= length; + GST_DEBUG_OBJECT (rtptheoradepay, "reading header %d, size %u", j, + h_size); + buf = gst_buffer_new_and_alloc (h_size); + memcpy (GST_BUFFER_DATA (buf), data, h_size); + conf->headers = g_list_append (conf->headers, buf); + data += h_size; + size -= h_size; rtptheoradepay->configs = g_list_append (rtptheoradepay->configs, conf); } return TRUE; /* ERRORS */ -wrong_configuration: - { - GST_DEBUG_OBJECT (rtptheoradepay, "error parsing configuration"); - return FALSE; - } too_small: { GST_DEBUG_OBJECT (rtptheoradepay, "configuration too small"); Index: gstrtptheorapay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtptheorapay.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- gstrtptheorapay.c 12 Apr 2007 11:41:11 -0000 1.5 +++ gstrtptheorapay.c 14 May 2007 17:10:12 -0000 1.6 @@ -212,31 +212,46 @@ return ret; +static gchar * +encode_base64 (const guint8 * in, guint size, guint * len) + gchar *ret, *d; + static const gchar *v = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + *len = ((size + 2) / 3) * 4; + d = ret = (gchar *) g_malloc (*len + 1); + for (; size; in += 3) { /* process tuplets */ + *d++ = v[in[0] >> 2]; /* byte 1: high 6 bits (1) */ + /* byte 2: low 2 bits (1), high 4 bits (2) */ + *d++ = v[((in[0] << 4) + (--size ? (in[1] >> 4) : 0)) & 0x3f]; + /* byte 3: low 4 bits (2), high 2 bits (3) */ + *d++ = size ? v[((in[1] << 2) + (--size ? (in[2] >> 6) : 0)) & 0x3f] : '='; + /* byte 4: low 6 bits (3) */ + *d++ = size ? v[in[2] & 0x3f] : '='; + if (size) + size--; /* count third character if processed */ + *d = '\0'; /* tie off string */ + return ret; /* return the resulting string */ gst_rtp_theora_pay_finish_headers (GstBaseRTPPayload * basepayload) GstRtpTheoraPay *rtptheorapay = GST_RTP_THEORA_PAY (basepayload); GList *walk; - guint length; - gchar *configuration; - gchar *wstr, *hstr; - guint8 *data; + guint length, size, n_headers, configlen; + gchar *wstr, *hstr, *configuration; + guint8 *data, *config; guint32 ident; - GstBuffer *config; GST_DEBUG_OBJECT (rtptheorapay, "finish headers"); if (!rtptheorapay->headers) goto no_headers; - /* we need exactly 2 header packets */ - if (g_list_length (rtptheorapay->headers) != 2) { - GST_DEBUG_OBJECT (rtptheorapay, "We need 2 headers but have %d", - g_list_length (rtptheorapay->headers)); - goto no_headers; /* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ * | Number of packed headers | @@ -255,35 +270,60 @@ * 0 1 2 3 - /* count the size of the headers first */ + /* we need 4 bytes for the number of headers (which is always 1), 3 bytes for + * the ident, 2 bytes for length, 1 byte for n. of headers. */ + size = 4 + 3 + 2 + 1; + /* count the size of the headers first and update the hash */ length = 0; + n_headers = 0; ident = fnv1_hash_32_new (); for (walk = rtptheorapay->headers; walk; walk = g_list_next (walk)) { GstBuffer *buf = GST_BUFFER_CAST (walk->data); + guint bsize; - ident = - fnv1_hash_32_update (ident, GST_BUFFER_DATA (buf), + bsize = GST_BUFFER_SIZE (buf); + length += bsize; + n_headers++; + /* count number of bytes needed for length fields, we don't need this for + * the last header. */ + if (g_list_next (walk)) { + size++; + bsize >>= 7; + } while (bsize); + /* update hash */ + ident = fnv1_hash_32_update (ident, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); - length += GST_BUFFER_SIZE (buf); - /* total config length is 4 bytes header number + size of the - * headers + 2 bytes length + 3 bytes for the ident */ - config = gst_buffer_new_and_alloc (length + 4 + 2 + 3); - data = GST_BUFFER_DATA (config); + /* packet length is header size + packet length */ + configlen = size + length; + config = data = g_malloc (configlen); /* number of packed headers, we only pack 1 header */ data[0] = 0; @@ -293,18 +333,51 @@ ident = fnv1_hash_32_to_24 (ident); rtptheorapay->payload_ident = ident; + GST_DEBUG_OBJECT (rtptheorapay, "ident 0x%08x", ident); /* take lower 3 bytes */ data[4] = (ident >> 16) & 0xff; data[5] = (ident >> 8) & 0xff; data[6] = ident & 0xff; - /* store length minus the length of the fixed theora header */ - data[7] = ((length - THEORA_ID_LEN) >> 8) & 0xff; - data[8] = (length - THEORA_ID_LEN) & 0xff; + /* store length of all theora headers */ + data[7] = ((length) >> 8) & 0xff; + data[8] = (length) & 0xff; + /* store number of headers minus one. */ + data[9] = n_headers - 1; + data += 10; + /* store length for each header */ + for (walk = rtptheorapay->headers; walk; walk = g_list_next (walk)) { + GstBuffer *buf = GST_BUFFER_CAST (walk->data); + guint bsize, size, temp; + /* only need to store the length when it's not the last header */ + if (!g_list_next (walk)) + break; + /* calc size */ + size = 0; + do { + size++; + bsize >>= 7; + } while (bsize); + temp = size; + /* write the size backwards */ + while (size) { + size--; + data[size] = bsize & 0x7f; + data += temp; /* copy header data */ - data += 9; @@ -312,10 +385,9 @@ data += GST_BUFFER_SIZE (buf); - /* serialize buffer to base16 */ - gst_value_take_buffer (&v, config); - configuration = gst_value_serialize (&v); + /* serialize to base64 */ + configuration = encode_base64 (config, configlen, &size); + g_free (config); /* configure payloader settings */ wstr = g_strdup_printf ("%d", rtptheorapay->width); @@ -333,7 +405,6 @@ g_free (wstr); g_free (hstr); g_free (configuration); @@ -454,12 +525,7 @@ if (rtptheorapay->need_headers) { /* we need to collect the headers and construct a config string from them */ - if (TDT == 2) { - GST_DEBUG_OBJECT (rtptheorapay, - "discard comment packet while collecting headers"); - ret = GST_FLOW_OK; - goto done; - } else if (TDT != 0) { + if (TDT != 0) { GST_DEBUG_OBJECT (rtptheorapay, "collecting header, buffer %p", buffer); /* append header to the list of headers */ rtptheorapay->headers = g_list_append (rtptheorapay->headers, buffer); Index: gstrtpvorbisdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpvorbisdepay.c,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- gstrtpvorbisdepay.c 14 May 2007 14:47:26 -0000 1.10 +++ gstrtpvorbisdepay.c 14 May 2007 17:10:12 -0000 1.11 @@ -81,9 +81,6 @@ GST_STATIC_CAPS ("audio/x-vorbis") -/* 30 bytes for the vorbis identification packet length */ -#define VORBIS_ID_LEN 30 GST_BOILERPLATE (GstRtpVorbisDepay, gst_rtp_vorbis_depay, GstBaseRTPDepayload, @@ -247,17 +244,26 @@ |
From: <wt...@ke...> - 2007-05-21 08:57:39
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Mon May 21 2007 08:57:31 UTC Log message: Patch by: Antoine Tremblay <hexa00 at gmail dot com> * gst/rtp/gstrtph263ppay.c: (gst_fragmentation_mode_get_type), (gst_rtp_h263p_pay_class_init), (gst_rtp_h263p_pay_init), (gst_rtp_h263p_pay_set_property), (gst_rtp_h263p_pay_get_property), (gst_rtp_h263p_pay_flush): * gst/rtp/gstrtph263ppay.h: Add new fragmentation mode base on GOB headers. Fixes #438940. Modified files: . : ChangeLog gst/rtp : gstrtph263ppay.c gstrtph263ppay.h Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2935&r2=1.2936 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtph263ppay.c.diff?r1=1.20&r2=1.21 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtph263ppay.h.diff?r1=1.8&r2=1.9 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2935 retrieving revision 1.2936 diff -u -d -r1.2935 -r1.2936 --- ChangeLog 20 May 2007 14:05:42 -0000 1.2935 +++ ChangeLog 21 May 2007 08:57:18 -0000 1.2936 @@ -1,3 +1,14 @@ +2007-05-21 Wim Taymans <wi...@fl...> + + Patch by: Antoine Tremblay <hexa00 at gmail dot com> + * gst/rtp/gstrtph263ppay.c: (gst_fragmentation_mode_get_type), + (gst_rtp_h263p_pay_class_init), (gst_rtp_h263p_pay_init), + (gst_rtp_h263p_pay_set_property), (gst_rtp_h263p_pay_get_property), + (gst_rtp_h263p_pay_flush): + * gst/rtp/gstrtph263ppay.h: + Add new fragmentation mode base on GOB headers. Fixes #438940. 2007-05-20 Tim-Philipp Müller <tim at centricular dot net> * gst/rtsp/gstrtspsrc.c: (gst_rtspsrc_loop_udp): Index: gstrtph263ppay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtph263ppay.c,v retrieving revision 1.20 retrieving revision 1.21 diff -u -d -r1.20 -r1.21 --- gstrtph263ppay.c 24 Jan 2007 12:22:50 -0000 1.20 +++ gstrtph263ppay.c 21 May 2007 08:57:18 -0000 1.21 @@ -27,6 +27,36 @@ #include "gstrtph263ppay.h" +#define DEFAULT_FRAGMENTATION_MODE GST_FRAGMENTATION_MODE_NORMAL +enum +{ + PROP_0, + PROP_FRAGMENTATION_MODE +}; +#define GST_TYPE_FRAGMENTATION_MODE (gst_fragmentation_mode_get_type()) +static GType +gst_fragmentation_mode_get_type (void) + static GType fragmentation_mode_type = 0; + static const GFlagsValue fragmentation_mode[] = { + {GST_FRAGMENTATION_MODE_NORMAL, "Normal", "normal"}, + {GST_FRAGMENTATION_MODE_SYNC, "Fragment at sync points", "sync"}, + {0, NULL, NULL}, + }; + if (!fragmentation_mode_type) { + fragmentation_mode_type = + g_flags_register_static ("GstFragmentationMode", fragmentation_mode); + } + return fragmentation_mode_type; +} +GST_DEBUG_CATEGORY_STATIC (rtph263ppay_debug); +#define GST_CAT_DEFAULT rtph263ppay_debug /* elementfactory information */ static const GstElementDetails gst_rtp_h263ppay_details = GST_ELEMENT_DETAILS ("RTP packet payloader", @@ -57,6 +87,12 @@ static void gst_rtp_h263p_pay_init (GstRtpH263PPay * rtph263ppay); static void gst_rtp_h263p_pay_finalize (GObject * object); +static void gst_rtp_h263p_pay_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_rtp_h263p_pay_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); static gboolean gst_rtp_h263p_pay_setcaps (GstBaseRTPPayload * payload, GstCaps * caps); static GstFlowReturn gst_rtp_h263p_pay_handle_buffer (GstBaseRTPPayload * @@ -116,15 +152,29 @@ parent_class = g_type_class_peek_parent (klass); gobject_class->finalize = gst_rtp_h263p_pay_finalize; + gobject_class->set_property = gst_rtp_h263p_pay_set_property; + gobject_class->get_property = gst_rtp_h263p_pay_get_property; gstbasertppayload_class->set_caps = gst_rtp_h263p_pay_setcaps; gstbasertppayload_class->handle_buffer = gst_rtp_h263p_pay_handle_buffer; + g_object_class_install_property (G_OBJECT_CLASS (klass), + PROP_FRAGMENTATION_MODE, g_param_spec_enum ("fragmentation-mode", + "Fragmentation Mode", + "Packet Fragmentation Mode", GST_TYPE_FRAGMENTATION_MODE, + DEFAULT_FRAGMENTATION_MODE, G_PARAM_READWRITE)); + GST_DEBUG_CATEGORY_INIT (rtph263ppay_debug, "rtph263ppay", + 0, "rtph263ppay (RFC 2429)"); } static void gst_rtp_h263p_pay_init (GstRtpH263PPay * rtph263ppay) { rtph263ppay->adapter = gst_adapter_new (); + rtph263ppay->fragmentation_mode = DEFAULT_FRAGMENTATION_MODE; @@ -149,6 +199,43 @@ return TRUE; +static void +gst_rtp_h263p_pay_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) + GstRtpH263PPay *rtph263ppay; + rtph263ppay = GST_RTP_H263P_PAY (object); + switch (prop_id) { + case PROP_FRAGMENTATION_MODE: + rtph263ppay->fragmentation_mode = g_value_get_enum (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); +gst_rtp_h263p_pay_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) + g_value_set_enum (value, rtph263ppay->fragmentation_mode); static GstFlowReturn gst_rtp_h263p_pay_flush (GstRtpH263PPay * rtph263ppay) @@ -163,29 +250,62 @@ return GST_FLOW_OK; fragmented = FALSE; - /* This algorithm assumes the H263+ encoder sends complete frames in each * buffer */ - /* This algorithm implements the Follow-on packets method for packetization. - * This assumes low packet loss network. A more resilient method would be to - * separate large frames at synchronisation points (Segments) (See RFC 2429 - * section 6). It would be interesting to have a property such as network - * quality to select between both packetization methods */ + /* With Fragmentation Mode at GST_FRAGMENTATION_MODE_NORMAL: + * This algorithm implements the Follow-on packets method for packetization. + * This assumes low packet loss network. + * With Fragmentation Mode at GST_FRAGMENTATION_MODE_SYNC: + * This algorithm separates large frames at synchronisation points (Segments) + * (See RFC 2429 section 6). It would be interesting to have a property such as network + * quality to select between both packetization methods */ /* TODO Add VRC supprt (See RFC 2429 section 4.2) */ while (avail > 0) { guint towrite; guint8 *payload; guint8 *data; guint payload_len; gint header_len; + guint next_gop = 0; + gboolean found_gob = FALSE; + if (rtph263ppay->fragmentation_mode == GST_FRAGMENTATION_MODE_SYNC) { + /* start after 1st gop possible */ + guint parsed_len = 3; + const guint8 *parse_data = NULL; + parse_data = gst_adapter_peek (rtph263ppay->adapter, avail); + /* Check if we have a gob or eos , eossbs */ + if (avail >= 3 && *parse_data == 0 && *(parse_data + 1) == 0 + && *(parse_data + 2) >= 0x80) { + GST_DEBUG_OBJECT (rtph263ppay, " Found GOB header"); + found_gob = TRUE; + } + /* Find next and cut the packet accordingly */ + while (parsed_len + 2 < avail) { + if (parse_data[parsed_len] == 0 && parse_data[parsed_len + 1] == 0 + && parse_data[parsed_len + 2] >= 0x80) { + next_gop = parsed_len; + GST_DEBUG_OBJECT (rtph263ppay, " Next GOB Detected at : %d", + next_gop); + break; + } + parsed_len++; + } /* for picture start frames (non-fragmented), we need to remove the first * two 0x00 bytes and set P=1 */ - header_len = (fragmented ? 2 : 0); + header_len = (fragmented && !found_gob) ? 2 : 0; towrite = MIN (avail, gst_rtp_buffer_calc_payload_len (GST_BASE_RTP_PAYLOAD_MTU (rtph263ppay) - header_len, 0, 0)); + if (next_gop > 0) + towrite = MIN (next_gop, towrite); payload_len = header_len + towrite; outbuf = gst_rtp_buffer_new_allocate (payload_len, 0, 0); @@ -203,7 +323,8 @@ * | RR |P|V| PLEN |PEBIT| * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ - payload[0] = fragmented ? 0x00 : 0x04; + /* if fragmented or gop header , write p bit =1 */ + payload[0] = (fragmented && !found_gob) ? 0x00 : 0x04; payload[1] = 0; GST_BUFFER_TIMESTAMP (outbuf) = rtph263ppay->first_ts; Index: gstrtph263ppay.h RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtph263ppay.h,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- gstrtph263ppay.h 1 Jun 2006 21:07:25 -0000 1.8 +++ gstrtph263ppay.h 21 May 2007 08:57:18 -0000 1.9 @@ -40,12 +40,19 @@ typedef struct _GstRtpH263PPay GstRtpH263PPay; typedef struct _GstRtpH263PPayClass GstRtpH263PPayClass; +typedef enum + GST_FRAGMENTATION_MODE_NORMAL = 0, + GST_FRAGMENTATION_MODE_SYNC = 1 +} GstFragmentationMode; struct _GstRtpH263PPay - GstBaseRTPPayload payload; + GstBaseRTPPayload payload; - GstAdapter *adapter; - GstClockTime first_ts; + GstAdapter *adapter; + GstClockTime first_ts; + GstFragmentationMode fragmentation_mode; }; struct _GstRtpH263PPayClass |
From: <wt...@ke...> - 2007-05-21 09:55:10
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Mon May 21 2007 09:29:42 UTC Log message: * gst/rtp/gstrtph263ppay.c: (gst_fragmentation_mode_get_type), (gst_rtp_h263p_pay_flush): Fix enum registration. Modified files: . : ChangeLog gst/rtp : gstrtph263ppay.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2936&r2=1.2937 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtph263ppay.c.diff?r1=1.21&r2=1.22 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2936 retrieving revision 1.2937 diff -u -d -r1.2936 -r1.2937 --- ChangeLog 21 May 2007 08:57:18 -0000 1.2936 +++ ChangeLog 21 May 2007 09:29:30 -0000 1.2937 @@ -1,5 +1,11 @@ 2007-05-21 Wim Taymans <wi...@fl...> + * gst/rtp/gstrtph263ppay.c: (gst_fragmentation_mode_get_type), + (gst_rtp_h263p_pay_flush): + Fix enum registration. + +2007-05-21 Wim Taymans <wi...@fl...> Patch by: Antoine Tremblay <hexa00 at gmail dot com> * gst/rtp/gstrtph263ppay.c: (gst_fragmentation_mode_get_type), Index: gstrtph263ppay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtph263ppay.c,v retrieving revision 1.21 retrieving revision 1.22 diff -u -d -r1.21 -r1.22 --- gstrtph263ppay.c 21 May 2007 08:57:18 -0000 1.21 +++ gstrtph263ppay.c 21 May 2007 09:29:30 -0000 1.22 @@ -40,7 +40,7 @@ gst_fragmentation_mode_get_type (void) { static GType fragmentation_mode_type = 0; - static const GFlagsValue fragmentation_mode[] = { + static const GEnumValue fragmentation_mode[] = { {GST_FRAGMENTATION_MODE_NORMAL, "Normal", "normal"}, {GST_FRAGMENTATION_MODE_SYNC, "Fragment at sync points", "sync"}, {0, NULL, NULL}, @@ -48,7 +48,7 @@ if (!fragmentation_mode_type) { fragmentation_mode_type = - g_flags_register_static ("GstFragmentationMode", fragmentation_mode); + g_enum_register_static ("GstFragmentationMode", fragmentation_mode); } return fragmentation_mode_type; } |
From: <wt...@ke...> - 2007-06-11 10:21:37
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Mon Jun 11 2007 10:21:27 UTC Log message: Patch by: Tommi Myöhänen <ext-tommi dot myohanen at nokia dot com> * gst/rtp/gstrtppcmadepay.c: (gst_rtp_pcma_depay_setcaps): * gst/rtp/gstrtppcmudepay.c: (gst_rtp_pcmu_depay_setcaps): Add missing rate fields to caps. Fixes #441118. Modified files: . : ChangeLog gst/rtp : gstrtppcmadepay.c gstrtppcmudepay.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2973&r2=1.2974 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtppcmadepay.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.10&r2=1.11 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2973 retrieving revision 1.2974 diff -u -d -r1.2973 -r1.2974 --- ChangeLog 10 Jun 2007 21:14:10 -0000 1.2973 +++ ChangeLog 11 Jun 2007 10:21:12 -0000 1.2974 @@ -1,3 +1,11 @@ +2007-06-11 Wim Taymans <wi...@fl...> + + Patch by: Tommi Myöhänen <ext-tommi dot myohanen at nokia dot com> + * gst/rtp/gstrtppcmadepay.c: (gst_rtp_pcma_depay_setcaps): + * gst/rtp/gstrtppcmudepay.c: (gst_rtp_pcmu_depay_setcaps): + Add missing rate fields to caps. Fixes #441118. 2007-06-10 Sebastien Moutte <seb...@mo...> * win32/vs6/gst_plugins_good.dsw: Index: gstrtppcmadepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtppcmadepay.c,v retrieving revision 1.11 retrieving revision 1.12 diff -u -d -r1.11 -r1.12 --- gstrtppcmadepay.c 25 Apr 2007 09:47:48 -0000 1.11 +++ gstrtppcmadepay.c 11 Jun 2007 10:21:13 -0000 1.12 @@ -64,7 +64,7 @@ GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - GST_STATIC_CAPS ("audio/x-alaw, " "channels = (int) 1") + GST_STATIC_CAPS ("audio/x-alaw, channels = (int) 1, rate = (int) 8000") ); static GstBuffer *gst_rtp_pcma_depay_process (GstBaseRTPDepayload * depayload, Index: gstrtppcmudepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtppcmudepay.c,v retrieving revision 1.10 diff -u -d -r1.10 -r1.11 --- gstrtppcmudepay.c 25 Apr 2007 09:47:48 -0000 1.10 +++ gstrtppcmudepay.c 11 Jun 2007 10:21:13 -0000 1.11 - GST_STATIC_CAPS ("audio/x-mulaw, " "channels = (int) 1") + GST_STATIC_CAPS ("audio/x-mulaw, channels = (int) 1, rate = (int) 8000") static GstBuffer *gst_rtp_pcmu_depay_process (GstBaseRTPDepayload * depayload, |
From: <wt...@ke...> - 2007-06-13 17:11:47
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Wed Jun 13 2007 17:11:38 UTC Log message: * gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_setcaps): Make sure we allocate enough memory for the codec_data. Fixes #447210. Modified files: . : ChangeLog gst/rtp : gstrtph264depay.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.2983&r2=1.2984 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtph264depay.c.diff?r1=1.13&r2=1.14 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.2983 retrieving revision 1.2984 diff -u -d -r1.2983 -r1.2984 --- ChangeLog 12 Jun 2007 21:05:22 -0000 1.2983 +++ ChangeLog 13 Jun 2007 17:11:24 -0000 1.2984 @@ -1,3 +1,9 @@ +2007-06-13 Wim Taymans <wi...@fl...> + + * gst/rtp/gstrtph264depay.c: (gst_rtp_h264_depay_setcaps): + Make sure we allocate enough memory for the codec_data. + Fixes #447210. 2007-06-12 Sebastien Moutte <seb...@mo...> * win32/MANIFEST: Index: gstrtph264depay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtph264depay.c,v retrieving revision 1.13 retrieving revision 1.14 diff -u -d -r1.13 -r1.14 --- gstrtph264depay.c 25 Apr 2007 09:47:48 -0000 1.13 +++ gstrtph264depay.c 13 Jun 2007 17:11:24 -0000 1.14 @@ -237,10 +237,12 @@ ps = gst_structure_get_string (structure, "sprop-parameter-sets"); params = g_strsplit (ps, ",", 0); - /* count total number of bytes in base64 */ + /* count total number of bytes in base64. Also include the sync bytes in + * front of the params. */ len = 0; for (i = 0; params[i]; i++) { len += strlen (params[i]); + len += sizeof (sync_bytes); } /* we seriously overshoot the length, but it's fine. */ codec_data = gst_buffer_new_and_alloc (len); |
From: <wt...@ke...> - 2007-07-03 10:00:08
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Tue Jul 03 2007 10:00:00 UTC Log message: Patch by: Tommi Myöhänen <ext-tommi dot myohanen at nokia dot com> * gst/rtp/gstrtpilbcpay.c: (gst_rtpilbcpay_setcaps): Set the encoding-name in the rtp caps to all uppercase, as required by the caps spec. Some small cleanups in the error paths. Fixes #453037. Modified files: . : ChangeLog gst/rtp : gstrtpilbcpay.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.3006&r2=1.3007 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpilbcpay.c.diff?r1=1.5&r2=1.6 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.3006 retrieving revision 1.3007 diff -u -d -r1.3006 -r1.3007 --- ChangeLog 28 Jun 2007 19:00:43 -0000 1.3006 +++ ChangeLog 3 Jul 2007 09:59:46 -0000 1.3007 @@ -1,3 +1,12 @@ +2007-07-03 Wim Taymans,,, <set EMAIL_ADDRESS environment variable> + + Patch by: Tommi Myöhänen <ext-tommi dot myohanen at nokia dot com> + * gst/rtp/gstrtpilbcpay.c: (gst_rtpilbcpay_setcaps): + Set the encoding-name in the rtp caps to all uppercase, as required by + the caps spec. + Some small cleanups in the error paths. Fixes #453037. 2007-06-28 Sebastian Dröge <sl...@ci...> * ext/wavpack/gstwavpackparse.c: Index: gstrtpilbcpay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpilbcpay.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- gstrtpilbcpay.c 25 Jan 2007 14:22:53 -0000 1.5 +++ gstrtpilbcpay.c 3 Jul 2007 09:59:46 -0000 1.6 @@ -125,32 +125,46 @@ structure = gst_caps_get_structure (caps, 0); gst_structure_get_int (structure, "mode", &mode); - if (mode != 20 && mode != 30) { - return FALSE; - } + if (mode != 20 && mode != 30) + goto wrong_mode; payload_name = gst_structure_get_name (structure); - if (g_strcasecmp ("audio/x-iLBC", payload_name) == 0) { - 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); - } else { + if (g_strcasecmp ("audio/x-iLBC", payload_name)) + goto wrong_caps; + 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); ret = gst_basertppayload_set_outcaps (basertppayload, "mode", G_TYPE_INT, mode, NULL); - if (mode != rtpilbcpay->mode && rtpilbcpay->mode != -1) { + if (mode != rtpilbcpay->mode && rtpilbcpay->mode != -1) + goto mode_changed; + rtpilbcpay->mode = mode; + return ret; + /* ERRORS */ +wrong_mode: + { + GST_ERROR_OBJECT (rtpilbcpay, "mode must be 20 or 30, received %d", mode); + return FALSE; + } +wrong_caps: + GST_ERROR_OBJECT (rtpilbcpay, "expected audio/x-iLBC, received %s", + payload_name); +mode_changed: GST_ERROR_OBJECT (rtpilbcpay, "Mode has changed from %d to %d! " "Mode cannot change while streaming", rtpilbcpay->mode, mode); return FALSE; } - rtpilbcpay->mode = mode; - - return ret; } gboolean |
From: <wt...@ke...> - 2007-08-08 10:55:14
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Wed Aug 08 2007 10:55:04 UTC Log message: Patch by: Olivier Crete <tester at tester dot ca> * gst/rtp/gstrtpilbcdepay.c: (gst_rtp_ilbc_depay_setcaps): * gst/rtp/gstrtpilbcpay.c: (gst_rtpilbcpay_setcaps): Make mode property a string. Fixes #464475. Modified files: . : ChangeLog gst/rtp : gstrtpilbcdepay.c gstrtpilbcpay.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.3041&r2=1.3042 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpilbcdepay.c.diff?r1=1.11&r2=1.12 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpilbcpay.c.diff?r1=1.6&r2=1.7 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.3041 retrieving revision 1.3042 diff -u -d -r1.3041 -r1.3042 --- ChangeLog 5 Aug 2007 14:58:20 -0000 1.3041 +++ ChangeLog 8 Aug 2007 10:54:49 -0000 1.3042 @@ -1,3 +1,11 @@ +2007-08-08 Wim Taymans <wim...@gm...> + + Patch by: Olivier Crete <tester at tester dot ca> + * gst/rtp/gstrtpilbcdepay.c: (gst_rtp_ilbc_depay_setcaps): + * gst/rtp/gstrtpilbcpay.c: (gst_rtpilbcpay_setcaps): + Make mode property a string. Fixes #464475. 2007-08-05 Stefan Kost <en...@us...> * ext/flac/gstflacenc.c: Index: gstrtpilbcdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpilbcdepay.c,v retrieving revision 1.11 retrieving revision 1.12 diff -u -d -r1.11 -r1.12 --- gstrtpilbcdepay.c 25 Apr 2007 09:47:48 -0000 1.11 +++ gstrtpilbcdepay.c 8 Aug 2007 10:54:50 -0000 1.12 @@ -56,7 +56,8 @@ "media = (string) \"audio\", " "payload = (int) " GST_RTP_PAYLOAD_DYNAMIC_STRING ", " "clock-rate = (int) 8000, " - "encoding-name = (string) \"ILBC\", " "mode = (int) { 20, 30 }") + "encoding-name = (string) \"ILBC\", " + "mode = (string) { \"20\", \"30\" }") ); static GstStaticPadTemplate gst_rtp_ilbc_depay_src_template = @@ -149,14 +150,22 @@ GstRTPiLBCDepay *rtpilbcdepay = GST_RTP_ILBC_DEPAY (depayload); GstCaps *srccaps; GstStructure *structure; + const gchar *mode_str = NULL; gint mode; gboolean ret; structure = gst_caps_get_structure (caps, 0); - /* parse mode, if we can */ mode = rtpilbcdepay->mode; - gst_structure_get_int (structure, "mode", &mode); + /* parse mode, if we can */ + mode_str = gst_structure_get_string (structure, "mode"); + if (mode_str) { + mode = strtol (mode_str, NULL, 10); + if (mode != 20 && mode != 30) + mode = rtpilbcdepay->mode; + } rtpilbcdepay->mode = mode; srccaps = gst_caps_new_simple ("audio/x-iLBC", Index: gstrtpilbcpay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpilbcpay.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- gstrtpilbcpay.c 3 Jul 2007 09:59:46 -0000 1.6 +++ gstrtpilbcpay.c 8 Aug 2007 10:54:50 -0000 1.7 @@ -50,7 +50,8 @@ - "encoding-name = (string) \"ILBC\", " "mode = (int) {20, 30}") static gboolean gst_rtpilbcpay_setcaps (GstBaseRTPPayload * payload, @@ -116,6 +117,7 @@ GstBaseRTPAudioPayload *basertpaudiopayload; + gchar *mode_str; const char *payload_name; @@ -137,9 +139,13 @@ 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_INT, mode, - NULL); + gst_basertppayload_set_outcaps (basertppayload, "mode", G_TYPE_STRING, + mode_str, NULL); + g_free (mode_str); if (mode != rtpilbcpay->mode && rtpilbcpay->mode != -1) goto mode_changed; |
From: <wt...@ke...> - 2007-08-10 16:11:12
|
CVS Root: /cvs/gstreamer Module: gst-plugins-good Changes by: wtay Date: Fri Aug 10 2007 16:11:01 UTC Log message: * gst/rtp/gstrtpmpvdepay.c: Set the mpegversion in the caps so that autoplugging does not get confused. Modified files: . : ChangeLog gst/rtp : gstrtpmpvdepay.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/ChangeLog.diff?r1=1.3044&r2=1.3045 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-plugins-good/gst/rtp/gstrtpmpvdepay.c.diff?r1=1.4&r2=1.5 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /cvs/gstreamer/gst-plugins-good/ChangeLog,v retrieving revision 1.3044 retrieving revision 1.3045 diff -u -d -r1.3044 -r1.3045 --- ChangeLog 9 Aug 2007 10:54:04 -0000 1.3044 +++ ChangeLog 10 Aug 2007 16:10:46 -0000 1.3045 @@ -1,3 +1,9 @@ +2007-08-10 Wim Taymans <wim...@gm...> + + * gst/rtp/gstrtpmpvdepay.c: + Set the mpegversion in the caps so that autoplugging does not get + confused. 2007-08-09 Thomas Vander Stichele <thomas at apestaart dot org> * po/hu.po: Index: gstrtpmpvdepay.c RCS file: /cvs/gstreamer/gst-plugins-good/gst/rtp/gstrtpmpvdepay.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- gstrtpmpvdepay.c 29 Mar 2007 14:03:21 -0000 1.4 +++ gstrtpmpvdepay.c 10 Aug 2007 16:10:47 -0000 1.5 @@ -48,11 +48,14 @@ ARG_0, }; +/* FIXME, we set the mpeg version to 2, we should ideally be looking at contents + * of the stream to figure out the version */ static GstStaticPadTemplate gst_rtp_mpv_depay_src_template = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - GST_STATIC_CAPS ("video/mpeg, systemstream = (boolean) FALSE") + GST_STATIC_CAPS + ("video/mpeg, mpegversion = (int) 2, systemstream = (boolean) FALSE") ); static GstStaticPadTemplate gst_rtp_mpv_depay_sink_template = |