Merge branch 'master' into 0.11
authorWim Taymans <wim.taymans@collabora.co.uk>
Thu, 17 Nov 2011 16:17:11 +0000 (17:17 +0100)
committerWim Taymans <wim.taymans@collabora.co.uk>
Thu, 17 Nov 2011 16:17:11 +0000 (17:17 +0100)
Conflicts:
ext/speex/gstspeexenc.c
gst/rtpmanager/rtpsession.c

1  2 
ext/flac/gstflacenc.c
ext/speex/gstspeexenc.c
gst/audioparsers/gstflacparse.c
gst/rtpmanager/gstrtpsession.c
gst/rtpmanager/rtpsession.c
gst/rtpmanager/rtpsession.h
gst/rtpmanager/rtpsource.h
sys/v4l2/gstv4l2object.c

Simple merge
@@@ -528,27 -545,21 +530,27 @@@ static GstFlowRetur
  gst_speex_enc_encode (GstSpeexEnc * enc, GstBuffer * buf)
  {
    gint frame_size = enc->frame_size;
 -  gint bytes = frame_size * 2 * enc->channels, samples, size;
 +  gint bytes = frame_size * 2 * enc->channels, samples;
    gint outsize, written, dtx_ret = 0;
-   guint8 *data, *bdata, *outdata;
 -  guint8 *data, *data0 = NULL;
++  guint8 *data, *data0 = NULL, *bdata, *outdata;
 +  gsize bsize, size;
    GstBuffer *outbuf;
    GstFlowReturn ret = GST_FLOW_OK;
  
    if (G_LIKELY (buf)) {
 -    data = GST_BUFFER_DATA (buf);
 -    size = GST_BUFFER_SIZE (buf);
 +    bdata = gst_buffer_map (buf, &bsize, NULL, GST_MAP_READ);
  
 -    if (G_UNLIKELY (size % bytes)) {
 +    if (G_UNLIKELY (bsize % bytes)) {
        GST_DEBUG_OBJECT (enc, "draining; adding silence samples");
 -      size = ((size / bytes) + 1) * bytes;
 +
 +      size = ((bsize / bytes) + 1) * bytes;
-       data = g_malloc0 (size);
+       data0 = data = g_malloc0 (size);
 -      memcpy (data, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf));
 +      memcpy (data, bdata, bsize);
 +      gst_buffer_unmap (buf, bdata, bsize);
 +      bdata = NULL;
 +    } else {
 +      data = bdata;
 +      size = bsize;
      }
    } else {
      GST_DEBUG_OBJECT (enc, "nothing to drain");
Simple merge
Simple merge
@@@ -3302,38 -3348,76 +3385,77 @@@ rtp_session_on_sending_rtcp (RTPSessio
      gboolean early)
  {
    gboolean ret = FALSE;
+   GHashTableIter iter;
+   gpointer key, value;
+   gboolean started_fir = FALSE;
+   GstRTCPPacket fir_rtcppacket;
++  GstRTCPBuffer rtcp;
  
    RTP_SESSION_LOCK (sess);
  
-   while (sess->rtcp_pli_requests->len) {
-     GstRTCPPacket rtcppacket;
-     guint media_ssrc = g_array_index (sess->rtcp_pli_requests, guint32, 0);
-     RTPSource *media_src = g_hash_table_lookup (sess->ssrcs[sess->mask_idx],
-         GUINT_TO_POINTER (media_ssrc));
-     if (media_src && !rtp_source_has_retained (media_src,
-             has_pli_compare_func, NULL)) {
-       GstRTCPBuffer rtcp;
-       gst_rtcp_buffer_map (buffer, GST_MAP_WRITE, &rtcp);
-       if (gst_rtcp_buffer_add_packet (&rtcp, GST_RTCP_TYPE_PSFB, &rtcppacket)) {
-         gst_rtcp_packet_fb_set_type (&rtcppacket, GST_RTCP_PSFB_TYPE_PLI);
-         gst_rtcp_packet_fb_set_sender_ssrc (&rtcppacket,
++  gst_rtcp_buffer_map (buffer, GST_MAP_WRITE, &rtcp);
++
+   g_hash_table_iter_init (&iter, sess->ssrcs[sess->mask_idx]);
+   while (g_hash_table_iter_next (&iter, &key, &value)) {
+     guint media_ssrc = GPOINTER_TO_UINT (key);
+     RTPSource *media_src = value;
+     guint8 *fci_data;
+     if (media_src->send_fir) {
+       if (!started_fir) {
 -        if (!gst_rtcp_buffer_add_packet (buffer, GST_RTCP_TYPE_PSFB,
++        if (!gst_rtcp_buffer_add_packet (&rtcp, GST_RTCP_TYPE_PSFB,
+                 &fir_rtcppacket))
+           break;
+         gst_rtcp_packet_fb_set_type (&fir_rtcppacket, GST_RTCP_PSFB_TYPE_FIR);
+         gst_rtcp_packet_fb_set_sender_ssrc (&fir_rtcppacket,
              rtp_source_get_ssrc (sess->source));
-         gst_rtcp_packet_fb_set_media_ssrc (&rtcppacket, media_ssrc);
+         gst_rtcp_packet_fb_set_media_ssrc (&fir_rtcppacket, 0);
+         if (!gst_rtcp_packet_fb_set_fci_length (&fir_rtcppacket, 2)) {
+           gst_rtcp_packet_remove (&fir_rtcppacket);
+           break;
+         }
          ret = TRUE;
-         gst_rtcp_buffer_unmap (&rtcp);
+         started_fir = TRUE;
        } else {
-         /* Break because the packet is full, will put next request in a
-          * further packet
-          */
-         gst_rtcp_buffer_unmap (&rtcp);
-         break;
+         if (!gst_rtcp_packet_fb_set_fci_length (&fir_rtcppacket,
+                 !gst_rtcp_packet_fb_get_fci_length (&fir_rtcppacket) + 2))
+           break;
        }
+       fci_data = gst_rtcp_packet_fb_get_fci (&fir_rtcppacket) -
+           ((gst_rtcp_packet_fb_get_fci_length (&fir_rtcppacket) - 2) * 4);
+       GST_WRITE_UINT32_BE (fci_data, media_ssrc);
+       fci_data += 4;
+       fci_data[0] = media_src->current_send_fir_seqnum;
+       fci_data[1] = fci_data[2] = fci_data[3] = 0;
+       media_src->send_fir = FALSE;
      }
+   }
+   g_hash_table_iter_init (&iter, sess->ssrcs[sess->mask_idx]);
+   while (g_hash_table_iter_next (&iter, &key, &value)) {
+     guint media_ssrc = GPOINTER_TO_UINT (key);
+     RTPSource *media_src = value;
+     GstRTCPPacket pli_rtcppacket;
  
-     g_array_remove_index (sess->rtcp_pli_requests, 0);
+     if (media_src->send_pli && !rtp_source_has_retained (media_src,
+             has_pli_compare_func, NULL)) {
 -      if (gst_rtcp_buffer_add_packet (buffer, GST_RTCP_TYPE_PSFB,
 -              &pli_rtcppacket)) {
 -        gst_rtcp_packet_fb_set_type (&pli_rtcppacket, GST_RTCP_PSFB_TYPE_PLI);
 -        gst_rtcp_packet_fb_set_sender_ssrc (&pli_rtcppacket,
 -            rtp_source_get_ssrc (sess->source));
 -        gst_rtcp_packet_fb_set_media_ssrc (&pli_rtcppacket, media_ssrc);
 -        ret = TRUE;
 -      } else {
++      if (!gst_rtcp_buffer_add_packet (&rtcp, GST_RTCP_TYPE_PSFB,
++              &pli_rtcppacket))
+         /* Break because the packet is full, will put next request in a
 -         * further packet
 -         */
++         * further packet */
+         break;
 -      }
++      gst_rtcp_packet_fb_set_type (&pli_rtcppacket, GST_RTCP_PSFB_TYPE_PLI);
++      gst_rtcp_packet_fb_set_sender_ssrc (&pli_rtcppacket,
++          rtp_source_get_ssrc (sess->source));
++      gst_rtcp_packet_fb_set_media_ssrc (&pli_rtcppacket, media_ssrc);
++      ret = TRUE;
+     }
+     media_src->send_pli = FALSE;
    }
++  gst_rtcp_buffer_unmap (&rtcp);
  
    RTP_SESSION_UNLOCK (sess);
  
Simple merge
Simple merge
Simple merge