gstrtpbasedepayload_class->process_rtp_packet = gst_rtp_vorbis_depay_process;
gstrtpbasedepayload_class->set_caps = gst_rtp_vorbis_depay_setcaps;
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_rtp_vorbis_depay_sink_template));
- gst_element_class_add_pad_template (gstelement_class,
- gst_static_pad_template_get (&gst_rtp_vorbis_depay_src_template));
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_rtp_vorbis_depay_sink_template);
+ gst_element_class_add_static_pad_template (gstelement_class,
+ &gst_rtp_vorbis_depay_src_template);
gst_element_class_set_static_metadata (gstelement_class,
"RTP Vorbis depayloader", "Codec/Depayloader/Network/RTP",
static void
free_config (GstRtpVorbisConfig * conf)
{
- GList *headers;
-
- for (headers = conf->headers; headers; headers = g_list_next (headers)) {
- GstBuffer *header = GST_BUFFER_CAST (headers->data);
-
- gst_buffer_unref (header);
- }
- g_list_free (conf->headers);
+ g_list_free_full (conf->headers, (GDestroyNotify) gst_buffer_unref);
g_free (conf);
}
static void
free_indents (GstRtpVorbisDepay * rtpvorbisdepay)
{
- GList *walk;
-
- for (walk = rtpvorbisdepay->configs; walk; walk = g_list_next (walk)) {
- free_config ((GstRtpVorbisConfig *) walk->data);
- }
- g_list_free (rtpvorbisdepay->configs);
+ g_list_free_full (rtpvorbisdepay->configs, (GDestroyNotify) free_config);
rtpvorbisdepay->configs = NULL;
}
G_OBJECT_CLASS (parent_class)->finalize (object);
}
+static gboolean
+gst_rtp_vorbis_depay_has_ident (GstRtpVorbisDepay * rtpvorbisdepay,
+ guint32 ident)
+{
+ GList *walk;
+
+ for (walk = rtpvorbisdepay->configs; walk; walk = g_list_next (walk)) {
+ GstRtpVorbisConfig *conf = (GstRtpVorbisConfig *) walk->data;
+
+ if (conf->ident == ident)
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
/* takes ownership of confbuf */
static gboolean
gst_rtp_vorbis_depay_parse_configuration (GstRtpVorbisDepay * rtpvorbisdepay,
if (size < length && size + 1 != length)
goto too_small;
+ if (gst_rtp_vorbis_depay_has_ident (rtpvorbisdepay, ident)) {
+ size -= length;
+ data += length;
+ offset += length;
+ continue;
+ }
+
/* read header sizes we read 2 sizes, the third size (for which we allocate
* space) must be derived from the total packed header length. */
h_sizes = g_newa (guint, n_headers + 1);
rtpvorbisdepay = GST_RTP_VORBIS_DEPAY (depayload);
- payload = gst_rtp_buffer_get_payload (rtp);
payload_len = gst_rtp_buffer_get_payload_len (rtp);
GST_DEBUG_OBJECT (depayload, "got RTP packet of size %d", payload_len);
if (G_UNLIKELY (payload_len < 4))
goto packet_short;
+ payload = gst_rtp_buffer_get_payload (rtp);
header = GST_READ_UINT32_BE (payload);
/*
* 0 1 2 3
/* fragmented packets, assemble */
if (F != 0) {
GstBuffer *vdata;
- guint headerskip;
if (F == 1) {
/* if we start a packet, clear adapter and start assembling. */
if (!rtpvorbisdepay->assembling)
goto no_output;
- /* first assembled packet, reuse 2 bytes to store the length */
- headerskip = (F == 1 ? 4 : 6);
/* skip header and length. */
- vdata = gst_rtp_buffer_get_payload_subbuffer (rtp, headerskip, -1);
+ vdata = gst_rtp_buffer_get_payload_subbuffer (rtp, 6, -1);
GST_DEBUG_OBJECT (depayload, "assemble vorbis packet");
gst_adapter_push (rtpvorbisdepay->adapter, vdata);
goto no_output;
/* construct assembled buffer */
- payload_buffer =
- gst_adapter_take_buffer (rtpvorbisdepay->adapter, payload_len);
+ length = gst_adapter_available (rtpvorbisdepay->adapter);
+ payload_buffer = gst_adapter_take_buffer (rtpvorbisdepay->adapter, length);
} else {
payload_buffer = gst_rtp_buffer_get_payload_subbuffer (rtp, 4, -1);
+ length = 0;
}
GST_DEBUG_OBJECT (depayload, "assemble done");
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+*
*/
while (payload_len > 2) {
- length = GST_READ_UINT16_BE (payload);
-
- payload += 2;
- payload_len -= 2;
+ /* If length is not 0, we have a reassembled packet for which we
+ * calculated the length already and don't have to skip over the
+ * length field anymore
+ */
+ if (length == 0) {
+ length = GST_READ_UINT16_BE (payload);
+ payload += 2;
+ payload_len -= 2;
+ }
GST_DEBUG_OBJECT (depayload, "read length %u, avail: %d", length,
payload_len);
}
return NULL;
}
- /* ERORRS */
+ /* ERRORS */
switch_failed:
{
GST_ELEMENT_WARNING (rtpvorbisdepay, STREAM, DECODE,
(NULL), ("Could not switch codebooks"));
- if (payload_buffer) {
- gst_buffer_unmap (payload_buffer, &map);
- gst_buffer_unref (payload_buffer);
- }
return NULL;
}
packet_short:
{
GST_ELEMENT_WARNING (rtpvorbisdepay, STREAM, DECODE,
(NULL), ("Packet was too short (%d < 4)", payload_len));
- if (payload_buffer) {
- gst_buffer_unmap (payload_buffer, &map);
- gst_buffer_unref (payload_buffer);
- }
return NULL;
}
ignore_reserved: