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