mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 04:01:08 +00:00
gst/rtp/gstrtpmp2tdepay.*: Add support to strip off proprietary headers. Fixes #350278.
Original commit message from CVS: Patch by: Thijs Vermeir <thijsvermeir at gmail dot com> * gst/rtp/gstrtpmp2tdepay.c: (gst_rtp_mp2t_depay_class_init), (gst_rtp_mp2t_depay_init), (gst_rtp_mp2t_depay_process), (gst_rtp_mp2t_depay_set_property), (gst_rtp_mp2t_depay_get_property): * gst/rtp/gstrtpmp2tdepay.h: Add support to strip off proprietary headers. Fixes #350278.
This commit is contained in:
parent
56004b0df6
commit
fe901ccec7
3 changed files with 51 additions and 11 deletions
11
ChangeLog
11
ChangeLog
|
@ -1,3 +1,14 @@
|
||||||
|
2007-03-02 Wim Taymans <wim@fluendo.com>
|
||||||
|
|
||||||
|
Patch by: Thijs Vermeir <thijsvermeir at gmail dot com>
|
||||||
|
|
||||||
|
* gst/rtp/gstrtpmp2tdepay.c: (gst_rtp_mp2t_depay_class_init),
|
||||||
|
(gst_rtp_mp2t_depay_init), (gst_rtp_mp2t_depay_process),
|
||||||
|
(gst_rtp_mp2t_depay_set_property),
|
||||||
|
(gst_rtp_mp2t_depay_get_property):
|
||||||
|
* gst/rtp/gstrtpmp2tdepay.h:
|
||||||
|
Add support to strip off proprietary headers. Fixes #350278.
|
||||||
|
|
||||||
2007-03-02 Wim Taymans <wim@fluendo.com>
|
2007-03-02 Wim Taymans <wim@fluendo.com>
|
||||||
|
|
||||||
* ext/hal/hal.c:
|
* ext/hal/hal.c:
|
||||||
|
|
|
@ -31,7 +31,8 @@ static const GstElementDetails gst_rtp_mp2tdepay_details =
|
||||||
GST_ELEMENT_DETAILS ("RTP packet depayloader",
|
GST_ELEMENT_DETAILS ("RTP packet depayloader",
|
||||||
"Codec/Depayloader/Network",
|
"Codec/Depayloader/Network",
|
||||||
"Extracts MPEG2 TS from RTP packets (RFC 2250)",
|
"Extracts MPEG2 TS from RTP packets (RFC 2250)",
|
||||||
"Wim Taymans <wim@fluendo.com>");
|
"Wim Taymans <wim@fluendo.com>\n"
|
||||||
|
"Thijs Vermeir <thijs.vermeir@barco.com>");
|
||||||
|
|
||||||
/* RtpMP2TDepay signals and args */
|
/* RtpMP2TDepay signals and args */
|
||||||
enum
|
enum
|
||||||
|
@ -40,10 +41,12 @@ enum
|
||||||
LAST_SIGNAL
|
LAST_SIGNAL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define DEFAULT_SKIP_FIRST_BYTES 0
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
ARG_0,
|
PROP_0,
|
||||||
ARG_FREQUENCY
|
PROP_SKIP_FIRST_BYTES
|
||||||
};
|
};
|
||||||
|
|
||||||
static GstStaticPadTemplate gst_rtp_mp2t_depay_src_template =
|
static GstStaticPadTemplate gst_rtp_mp2t_depay_src_template =
|
||||||
|
@ -123,13 +126,24 @@ gst_rtp_mp2t_depay_class_init (GstRtpMP2TDepayClass * klass)
|
||||||
gobject_class->set_property = gst_rtp_mp2t_depay_set_property;
|
gobject_class->set_property = gst_rtp_mp2t_depay_set_property;
|
||||||
gobject_class->get_property = gst_rtp_mp2t_depay_get_property;
|
gobject_class->get_property = gst_rtp_mp2t_depay_get_property;
|
||||||
|
|
||||||
|
g_object_class_install_property (gobject_class, PROP_SKIP_FIRST_BYTES,
|
||||||
|
g_param_spec_uint ("skip-first-bytes",
|
||||||
|
"Skip first bytes",
|
||||||
|
"The amount of bytes that need to be skipped at the beginning of the payload",
|
||||||
|
0, G_MAXUINT, 0, G_PARAM_READWRITE));
|
||||||
|
|
||||||
gstelement_class->change_state = gst_rtp_mp2t_depay_change_state;
|
gstelement_class->change_state = gst_rtp_mp2t_depay_change_state;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_rtp_mp2t_depay_init (GstRtpMP2TDepay * rtpmp2tdepay,
|
gst_rtp_mp2t_depay_init (GstRtpMP2TDepay * depayload,
|
||||||
GstRtpMP2TDepayClass * klass)
|
GstRtpMP2TDepayClass * klass)
|
||||||
{
|
{
|
||||||
|
GstRtpMP2TDepay *rtpmp2tdepay;
|
||||||
|
|
||||||
|
rtpmp2tdepay = GST_RTP_MP2T_DEPAY (depayload);
|
||||||
|
|
||||||
|
rtpmp2tdepay->skip_first_bytes = DEFAULT_SKIP_FIRST_BYTES;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
|
@ -159,21 +173,22 @@ gst_rtp_mp2t_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf)
|
||||||
GstRtpMP2TDepay *rtpmp2tdepay;
|
GstRtpMP2TDepay *rtpmp2tdepay;
|
||||||
GstBuffer *outbuf;
|
GstBuffer *outbuf;
|
||||||
gint payload_len;
|
gint payload_len;
|
||||||
guint8 *payload;
|
|
||||||
guint32 timestamp;
|
guint32 timestamp;
|
||||||
|
|
||||||
rtpmp2tdepay = GST_RTP_MP2T_DEPAY (depayload);
|
rtpmp2tdepay = GST_RTP_MP2T_DEPAY (depayload);
|
||||||
|
|
||||||
if (!gst_rtp_buffer_validate (buf))
|
if (G_UNLIKELY (!gst_rtp_buffer_validate (buf)))
|
||||||
goto bad_packet;
|
goto bad_packet;
|
||||||
|
|
||||||
payload_len = gst_rtp_buffer_get_payload_len (buf);
|
payload_len = gst_rtp_buffer_get_payload_len (buf);
|
||||||
payload = gst_rtp_buffer_get_payload (buf);
|
|
||||||
|
if (G_UNLIKELY (payload_len <= rtpmp2tdepay->skip_first_bytes))
|
||||||
|
goto empty_packet;
|
||||||
|
|
||||||
timestamp = gst_rtp_buffer_get_timestamp (buf);
|
timestamp = gst_rtp_buffer_get_timestamp (buf);
|
||||||
|
|
||||||
outbuf = gst_buffer_new_and_alloc (payload_len);
|
outbuf =
|
||||||
memcpy (GST_BUFFER_DATA (outbuf), payload, payload_len);
|
gst_rtp_buffer_get_payload_subbuffer (rtpmp2tdepay->skip_first_bytes, -1);
|
||||||
|
|
||||||
gst_buffer_set_caps (outbuf, GST_PAD_CAPS (depayload->srcpad));
|
gst_buffer_set_caps (outbuf, GST_PAD_CAPS (depayload->srcpad));
|
||||||
GST_BUFFER_TIMESTAMP (outbuf) =
|
GST_BUFFER_TIMESTAMP (outbuf) =
|
||||||
|
@ -184,10 +199,17 @@ gst_rtp_mp2t_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf)
|
||||||
|
|
||||||
return outbuf;
|
return outbuf;
|
||||||
|
|
||||||
|
/* ERRORS */
|
||||||
bad_packet:
|
bad_packet:
|
||||||
{
|
{
|
||||||
GST_ELEMENT_WARNING (rtpmp2tdepay, STREAM, DECODE,
|
GST_ELEMENT_WARNING (rtpmp2tdepay, STREAM, DECODE,
|
||||||
("Packet did not validate"), (NULL));
|
(NULL), ("Packet did not validate"));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
empty_packet:
|
||||||
|
{
|
||||||
|
GST_ELEMENT_WARNING (rtpmp2tdepay, STREAM, DECODE,
|
||||||
|
(NULL), ("Packet was empty"));
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -201,6 +223,9 @@ gst_rtp_mp2t_depay_set_property (GObject * object, guint prop_id,
|
||||||
rtpmp2tdepay = GST_RTP_MP2T_DEPAY (object);
|
rtpmp2tdepay = GST_RTP_MP2T_DEPAY (object);
|
||||||
|
|
||||||
switch (prop_id) {
|
switch (prop_id) {
|
||||||
|
case PROP_SKIP_FIRST_BYTES:
|
||||||
|
rtpmp2tdepay->skip_first_bytes = g_value_get_uint (value);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
|
@ -216,6 +241,9 @@ gst_rtp_mp2t_depay_get_property (GObject * object, guint prop_id,
|
||||||
rtpmp2tdepay = GST_RTP_MP2T_DEPAY (object);
|
rtpmp2tdepay = GST_RTP_MP2T_DEPAY (object);
|
||||||
|
|
||||||
switch (prop_id) {
|
switch (prop_id) {
|
||||||
|
case PROP_SKIP_FIRST_BYTES:
|
||||||
|
g_value_set_uint (value, rtpmp2tdepay->skip_first_bytes);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -36,13 +36,14 @@ G_BEGIN_DECLS
|
||||||
(G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_MP2T_DEPAY))
|
(G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_RTP_MP2T_DEPAY))
|
||||||
#define GST_IS_RTP_MP2T_DEPAY_CLASS(klass) \
|
#define GST_IS_RTP_MP2T_DEPAY_CLASS(klass) \
|
||||||
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_MP2T_DEPAY))
|
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_RTP_MP2T_DEPAY))
|
||||||
|
|
||||||
typedef struct _GstRtpMP2TDepay GstRtpMP2TDepay;
|
typedef struct _GstRtpMP2TDepay GstRtpMP2TDepay;
|
||||||
typedef struct _GstRtpMP2TDepayClass GstRtpMP2TDepayClass;
|
typedef struct _GstRtpMP2TDepayClass GstRtpMP2TDepayClass;
|
||||||
|
|
||||||
struct _GstRtpMP2TDepay
|
struct _GstRtpMP2TDepay
|
||||||
{
|
{
|
||||||
GstBaseRTPDepayload depayload;
|
GstBaseRTPDepayload depayload;
|
||||||
|
|
||||||
|
guint8 skip_first_bytes;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _GstRtpMP2TDepayClass
|
struct _GstRtpMP2TDepayClass
|
||||||
|
|
Loading…
Reference in a new issue