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:
Thijs Vermeir 2007-03-02 12:16:16 +00:00 committed by Wim Taymans
parent 56004b0df6
commit fe901ccec7
3 changed files with 51 additions and 11 deletions

View file

@ -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:

View file

@ -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;

View file

@ -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