gst/rtpmanager/gstrtpjitterbuffer.c: Make the buffer metadata writable before inserti...
authorOlivier Crete <tester@tester.ca>
Tue, 5 Aug 2008 09:42:53 +0000 (09:42 +0000)
committerTim-Philipp Müller <tim.muller@collabora.co.uk>
Tue, 11 Aug 2009 01:30:37 +0000 (02:30 +0100)
Original commit message from CVS:
Based on patch by: Olivier Crete <tester at tester dot ca>
* gst/rtpmanager/gstrtpjitterbuffer.c:
(gst_rtp_jitter_buffer_chain), (gst_rtp_jitter_buffer_loop):
Make the buffer metadata writable before inserting it in the
jitterbuffer because the jitterbuffer will modify the timestamps.
* gst/rtpmanager/rtpjitterbuffer.c:
Update method comment about requiring writable metadata on buffers.
* gst/rtpmanager/rtpsession.c: (rtp_session_process_sr),
(rtp_session_process_rtcp):
Make the RTCP buffer metadata writable because we want to modify the
metadata.
Fixes #546312.

gst/rtpmanager/gstrtpjitterbuffer.c
gst/rtpmanager/rtpjitterbuffer.c
gst/rtpmanager/rtpsession.c

index 52430ff..b9b1569 100644 (file)
@@ -927,6 +927,10 @@ gst_rtp_jitter_buffer_chain (GstPad * pad, GstBuffer * buffer)
     }
   }
 
+  /* we need to make the metadata writable before pushing it in the jitterbuffer
+   * because the jitterbuffer will update the timestamp */
+  buffer = gst_buffer_make_metadata_writable (buffer);
+
   /* now insert the packet into the queue in sorted order. This function returns
    * FALSE if a packet with the same seqnum was already in the queue, meaning we
    * have a duplicate. */
@@ -1236,8 +1240,8 @@ push_buffer:
   outbuf = rtp_jitter_buffer_pop (priv->jbuf);
 
   if (discont || priv->discont) {
-    /* set DISCONT flag when we missed a packet. */
-    outbuf = gst_buffer_make_metadata_writable (outbuf);
+    /* set DISCONT flag when we missed a packet. We pushed the buffer writable
+     * into the jitterbuffer so we can modify now. */
     GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT);
     priv->discont = FALSE;
   }
index caca165..70a49c1 100644 (file)
@@ -339,6 +339,7 @@ no_skew:
  * Inserts @buf into the packet queue of @jbuf. The sequence number of the
  * packet will be used to sort the packets. This function takes ownerhip of
  * @buf when the function returns %TRUE.
+ * @buf should have writable metadata when calling this function.
  *
  * Returns: %FALSE if a packet with the same number already existed.
  */
index 59b1d8d..1998247 100644 (file)
@@ -1437,6 +1437,9 @@ rtp_session_process_sr (RTPSession * sess, GstRTCPPacket * packet,
   if (!source)
     return;
 
+  /* we somehow need to transfer the clock_base and the base time to the next
+   * element, we use the offset and offset_end fields in the buffer for this
+   * hack */
   GST_BUFFER_OFFSET (packet->buffer) = source->clock_base;
   GST_BUFFER_OFFSET_END (packet->buffer) = source->clock_base_time;
 
@@ -1669,6 +1672,9 @@ rtp_session_process_rtcp (RTPSession * sess, GstBuffer * buffer,
   if (sess->sent_bye)
     goto ignore;
 
+  /* make writable, we might want to change the buffer */
+  buffer = gst_buffer_make_metadata_writable (buffer);
+
   /* start processing the compound packet */
   more = gst_rtcp_buffer_get_first_packet (buffer, &packet);
   while (more) {