static void gst_rtp_qcelp_depay_init (GstRtpQCELPDepay * rtpqcelpdepay) { GstRTPBaseDepayload G_GNUC_UNUSED *depayload; depayload = GST_RTP_BASE_DEPAYLOAD (rtpqcelpdepay); }
static void gst_rtp_base_depayload_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { GstRTPBaseDepayload *depayload; GstRTPBaseDepayloadPrivate *priv; depayload = GST_RTP_BASE_DEPAYLOAD (object); priv = depayload->priv; switch (prop_id) { case PROP_STATS: g_value_take_boxed (value, gst_rtp_base_depayload_create_stats (depayload)); break; case PROP_SOURCE_INFO: g_value_set_boolean (value, gst_rtp_base_depayload_is_source_info_enabled (depayload)); break; case PROP_MAX_REORDER: g_value_set_int (value, priv->max_reorder); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } }
static void fs_rtp_xdata_depay_init (FsRTPXdataDepay * rtpxdatadepay) { GstRTPBaseDepayload *depayload = GST_RTP_BASE_DEPAYLOAD (rtpxdatadepay); depayload->clock_rate = 90000; }
static void gst_rtp_pcmu_depay_init (GstRtpPcmuDepay * rtppcmudepay) { GstRTPBaseDepayload *depayload; depayload = GST_RTP_BASE_DEPAYLOAD (rtppcmudepay); gst_pad_use_fixed_caps (GST_RTP_BASE_DEPAYLOAD_SRCPAD (depayload)); }
static GstStateChangeReturn gst_rtp_base_depayload_change_state (GstElement * element, GstStateChange transition) { GstRTPBaseDepayload *filter; GstRTPBaseDepayloadPrivate *priv; GstStateChangeReturn ret; filter = GST_RTP_BASE_DEPAYLOAD (element); priv = filter->priv; switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: break; case GST_STATE_CHANGE_READY_TO_PAUSED: filter->need_newsegment = TRUE; priv->npt_start = 0; priv->npt_stop = -1; priv->play_speed = 1.0; priv->play_scale = 1.0; priv->clock_base = -1; priv->next_seqnum = -1; priv->negotiated = FALSE; priv->discont = FALSE; break; case GST_STATE_CHANGE_PAUSED_TO_PLAYING: break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { case GST_STATE_CHANGE_PLAYING_TO_PAUSED: break; case GST_STATE_CHANGE_PAUSED_TO_READY: gst_caps_replace (&priv->last_caps, NULL); gst_event_replace (&priv->segment_event, NULL); break; case GST_STATE_CHANGE_READY_TO_NULL: break; default: break; } return ret; }
static gboolean gst_rtp_base_depayload_handle_sink_event (GstPad * pad, GstObject * parent, GstEvent * event) { gboolean res = FALSE; GstRTPBaseDepayload *filter; GstRTPBaseDepayloadClass *bclass; filter = GST_RTP_BASE_DEPAYLOAD (parent); bclass = GST_RTP_BASE_DEPAYLOAD_GET_CLASS (filter); if (bclass->handle_event) res = bclass->handle_event (filter, event); else gst_event_unref (event); return res; }
static void flush_packets (GstRtpQCELPDepay * depay) { guint i, size; GST_DEBUG_OBJECT (depay, "flushing packets"); size = depay->packets->len; for (i = 0; i < size; i++) { GstBuffer *outbuf; outbuf = g_ptr_array_index (depay->packets, i); g_ptr_array_index (depay->packets, i) = NULL; gst_rtp_base_depayload_push (GST_RTP_BASE_DEPAYLOAD (depay), outbuf); } /* and reset interleaving state */ depay->interleaved = FALSE; depay->bundling = 0; }
static gboolean gst_rtp_quicktime_parse_sd (GstRtpXQTDepay * rtpxqtdepay, guint8 * data, guint data_len) { gint len; guint32 fourcc; if (data_len < 8) goto too_short; len = (data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3]; if (len > data_len) goto too_short; fourcc = QT_FOURCC (data + 4); GST_DEBUG_OBJECT (rtpxqtdepay, "parsing %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (fourcc)); switch (fourcc) { case FOURCC_avc1: { guint32 chlen; if (len < 0x56) goto too_short; len -= 0x56; data += 0x56; /* find avcC */ while (len >= 8) { chlen = QT_UINT32 (data); fourcc = QT_FOURCC (data + 4); if (fourcc == FOURCC_avcC) { GstBuffer *buf; gint size; GstCaps *caps; GST_DEBUG_OBJECT (rtpxqtdepay, "found avcC codec_data in sd, %u", chlen); /* parse, if found */ if (chlen < len) size = chlen - 8; else size = len - 8; buf = gst_buffer_new_and_alloc (size); gst_buffer_fill (buf, 0, data + 8, size); caps = gst_caps_new_simple ("video/x-h264", "codec_data", GST_TYPE_BUFFER, buf, NULL); gst_buffer_unref (buf); gst_pad_set_caps (GST_RTP_BASE_DEPAYLOAD (rtpxqtdepay)->srcpad, caps); gst_caps_unref (caps); break; } len -= chlen; data += chlen; } break; } default: break; } return TRUE; /* ERRORS */ too_short: { return FALSE; } }
static GstBuffer * gst_dtmf_src_generate_tone (GstRtpDTMFDepay * rtpdtmfdepay, GstRTPDTMFPayload payload) { GstBuffer *buf; GstMapInfo map; gint16 *p; gint tone_size; double i = 0; double amplitude, f1, f2; double volume_factor; DTMF_KEY key = DTMF_KEYS[payload.event]; guint32 clock_rate; GstRTPBaseDepayload *depayload = GST_RTP_BASE_DEPAYLOAD (rtpdtmfdepay); gint volume; static GstAllocationParams params = { 0, 1, 0, 0, }; clock_rate = depayload->clock_rate; /* Create a buffer for the tone */ tone_size = (payload.duration * SAMPLE_SIZE * CHANNELS) / 8; buf = gst_buffer_new_allocate (NULL, tone_size, ¶ms); GST_BUFFER_DURATION (buf) = payload.duration * GST_SECOND / clock_rate; volume = payload.volume; gst_buffer_map (buf, &map, GST_MAP_WRITE); p = (gint16 *) map.data; volume_factor = pow (10, (-volume) / 20); /* * For each sample point we calculate 'x' as the * the amplitude value. */ for (i = 0; i < (tone_size / (SAMPLE_SIZE / 8)); i++) { /* * We add the fundamental frequencies together. */ f1 = sin (2 * M_PI * key.low_frequency * (rtpdtmfdepay->sample / clock_rate)); f2 = sin (2 * M_PI * key.high_frequency * (rtpdtmfdepay->sample / clock_rate)); amplitude = (f1 + f2) / 2; /* Adjust the volume */ amplitude *= volume_factor; /* Make the [-1:1] interval into a [-32767:32767] interval */ amplitude *= 32767; /* Store it in the data buffer */ *(p++) = (gint16) amplitude; (rtpdtmfdepay->sample)++; } gst_buffer_unmap (buf, &map); return buf; }
static gboolean gst_rtp_speex_depay_setcaps (GstRTPBaseDepayload * depayload, GstCaps * caps) { GstStructure *structure; GstRtpSPEEXDepay *rtpspeexdepay; gint clock_rate, nb_channels; GstBuffer *buf; GstMapInfo map; guint8 *data; const gchar *params; GstCaps *srccaps; gboolean res; rtpspeexdepay = GST_RTP_SPEEX_DEPAY (depayload); structure = gst_caps_get_structure (caps, 0); if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) goto no_clockrate; 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); gst_buffer_map (buf, &map, GST_MAP_WRITE); data = map.data; 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 */ data += 4; GST_WRITE_UINT32_LE (data, clock_rate); /* rate */ data += 4; GST_WRITE_UINT32_LE (data, gst_rtp_speex_depay_get_mode (clock_rate)); /* mode */ data += 4; GST_WRITE_UINT32_LE (data, 4); /* mode_bitstream_version */ data += 4; GST_WRITE_UINT32_LE (data, nb_channels); /* nb_channels */ data += 4; GST_WRITE_UINT32_LE (data, -1); /* bitrate */ data += 4; GST_WRITE_UINT32_LE (data, 0xa0); /* frame_size */ data += 4; GST_WRITE_UINT32_LE (data, 0); /* VBR */ data += 4; GST_WRITE_UINT32_LE (data, 1); /* frames_per_packet */ data += 4; GST_WRITE_UINT32_LE (data, 0); /* extra_headers */ data += 4; GST_WRITE_UINT32_LE (data, 0); /* reserved1 */ data += 4; GST_WRITE_UINT32_LE (data, 0); /* reserved2 */ gst_buffer_unmap (buf, &map); srccaps = gst_caps_new_empty_simple ("audio/x-speex"); res = gst_pad_set_caps (depayload->srcpad, srccaps); gst_caps_unref (srccaps); gst_rtp_base_depayload_push (GST_RTP_BASE_DEPAYLOAD (rtpspeexdepay), buf); buf = gst_buffer_new_and_alloc (sizeof (gst_rtp_speex_comment)); gst_buffer_fill (buf, 0, gst_rtp_speex_comment, sizeof (gst_rtp_speex_comment)); gst_rtp_base_depayload_push (GST_RTP_BASE_DEPAYLOAD (rtpspeexdepay), buf); return res; /* ERRORS */ no_clockrate: { GST_DEBUG_OBJECT (depayload, "no clock-rate specified"); return FALSE; } }
static gboolean gst_rtp_celt_depay_setcaps (GstRTPBaseDepayload * depayload, GstCaps * caps) { GstStructure *structure; GstRtpCELTDepay *rtpceltdepay; gint clock_rate, nb_channels = 0, frame_size = 0; GstBuffer *buf; GstMapInfo map; guint8 *ptr; const gchar *params; GstCaps *srccaps; gboolean res; rtpceltdepay = GST_RTP_CELT_DEPAY (depayload); structure = gst_caps_get_structure (caps, 0); if (!gst_structure_get_int (structure, "clock-rate", &clock_rate)) goto no_clockrate; depayload->clock_rate = clock_rate; if ((params = gst_structure_get_string (structure, "encoding-params"))) nb_channels = atoi (params); if (!nb_channels) nb_channels = DEFAULT_CHANNELS; if ((params = gst_structure_get_string (structure, "frame-size"))) frame_size = atoi (params); if (!frame_size) frame_size = DEFAULT_FRAMESIZE; rtpceltdepay->frame_size = frame_size; GST_DEBUG_OBJECT (depayload, "clock-rate=%d channels=%d frame-size=%d", clock_rate, nb_channels, frame_size); /* construct minimal header and comment packet for the decoder */ buf = gst_buffer_new_and_alloc (60); gst_buffer_map (buf, &map, GST_MAP_WRITE); ptr = map.data; memcpy (ptr, "CELT ", 8); ptr += 8; memcpy (ptr, "1.1.12", 7); ptr += 20; GST_WRITE_UINT32_LE (ptr, 0x80000006); /* version */ ptr += 4; GST_WRITE_UINT32_LE (ptr, 56); /* header_size */ ptr += 4; GST_WRITE_UINT32_LE (ptr, clock_rate); /* rate */ ptr += 4; GST_WRITE_UINT32_LE (ptr, nb_channels); /* channels */ ptr += 4; GST_WRITE_UINT32_LE (ptr, frame_size); /* frame-size */ ptr += 4; GST_WRITE_UINT32_LE (ptr, -1); /* overlap */ ptr += 4; GST_WRITE_UINT32_LE (ptr, -1); /* bytes_per_packet */ ptr += 4; GST_WRITE_UINT32_LE (ptr, 0); /* extra headers */ gst_buffer_unmap (buf, &map); srccaps = gst_caps_new_empty_simple ("audio/x-celt"); res = gst_pad_set_caps (depayload->srcpad, srccaps); gst_caps_unref (srccaps); gst_rtp_base_depayload_push (GST_RTP_BASE_DEPAYLOAD (rtpceltdepay), buf); buf = gst_buffer_new_and_alloc (sizeof (gst_rtp_celt_comment)); gst_buffer_fill (buf, 0, gst_rtp_celt_comment, sizeof (gst_rtp_celt_comment)); gst_rtp_base_depayload_push (GST_RTP_BASE_DEPAYLOAD (rtpceltdepay), buf); return res; /* ERRORS */ no_clockrate: { GST_ERROR_OBJECT (depayload, "no clock-rate specified"); return FALSE; } }