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; |