baseparse: add skip property

This commit is contained in:
Mark Nauwelaerts 2010-09-25 14:32:06 +02:00
parent 06bfa83d66
commit b5a3d60363

View file

@ -266,6 +266,10 @@ struct _GstBaseParsePrivate
gboolean exact_position; gboolean exact_position;
/* seek events are temporarily kept to match them with newsegments */ /* seek events are temporarily kept to match them with newsegments */
GSList *pending_seeks; GSList *pending_seeks;
/* property */
/* number of initial frames to discard */
gint skip;
}; };
typedef struct _GstBaseParseSeek typedef struct _GstBaseParseSeek
@ -276,6 +280,23 @@ typedef struct _GstBaseParseSeek
GstClockTime start_ts; GstClockTime start_ts;
} GstBaseParseSeek; } GstBaseParseSeek;
/* signals and args */
enum
{
/* FILL ME */
LAST_SIGNAL
};
enum
{
PROP_0,
PROP_SKIP
/* FILL ME */
};
#define PROP_DEFAULT_SKIP 0
static GstElementClass *parent_class = NULL; static GstElementClass *parent_class = NULL;
static void gst_base_parse_class_init (GstBaseParseClass * klass); static void gst_base_parse_class_init (GstBaseParseClass * klass);
@ -314,6 +335,10 @@ static void gst_base_parse_reset (GstBaseParse * parse);
static void gst_base_parse_set_index (GstElement * element, GstIndex * index); static void gst_base_parse_set_index (GstElement * element, GstIndex * index);
static GstIndex *gst_base_parse_get_index (GstElement * element); static GstIndex *gst_base_parse_get_index (GstElement * element);
static void gst_base_parse_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec);
static void gst_base_parse_get_property (GObject * object, guint prop_id,
GValue * value, GParamSpec * pspec);
static gboolean gst_base_parse_sink_activate (GstPad * sinkpad); static gboolean gst_base_parse_sink_activate (GstPad * sinkpad);
static gboolean gst_base_parse_sink_activate_push (GstPad * pad, static gboolean gst_base_parse_sink_activate_push (GstPad * pad,
@ -403,6 +428,14 @@ gst_base_parse_class_init (GstBaseParseClass * klass)
gstelement_class->set_index = GST_DEBUG_FUNCPTR (gst_base_parse_set_index); gstelement_class->set_index = GST_DEBUG_FUNCPTR (gst_base_parse_set_index);
gstelement_class->get_index = GST_DEBUG_FUNCPTR (gst_base_parse_get_index); gstelement_class->get_index = GST_DEBUG_FUNCPTR (gst_base_parse_get_index);
gobject_class->set_property = gst_base_parse_set_property;
gobject_class->get_property = gst_base_parse_get_property;
g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_SKIP,
g_param_spec_int ("skip", "skip", "Discard number of initial frames",
0, G_MAXINT, PROP_DEFAULT_SKIP,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/* Default handlers */ /* Default handlers */
klass->check_valid_frame = gst_base_parse_check_frame; klass->check_valid_frame = gst_base_parse_check_frame;
klass->parse_frame = gst_base_parse_parse_frame; klass->parse_frame = gst_base_parse_parse_frame;
@ -460,6 +493,7 @@ gst_base_parse_init (GstBaseParse * parse, GstBaseParseClass * bclass)
parse->adapter = gst_adapter_new (); parse->adapter = gst_adapter_new ();
parse->priv->pad_mode = GST_ACTIVATE_NONE; parse->priv->pad_mode = GST_ACTIVATE_NONE;
parse->priv->skip = PROP_DEFAULT_SKIP;
/* init state */ /* init state */
gst_base_parse_reset (parse); gst_base_parse_reset (parse);
@ -1501,9 +1535,15 @@ gst_base_parse_push_buffer (GstBaseParse * parse, GstBuffer * buffer)
gst_buffer_unref (buffer); gst_buffer_unref (buffer);
ret = GST_FLOW_OK; ret = GST_FLOW_OK;
} else if (ret == GST_FLOW_OK) { } else if (ret == GST_FLOW_OK) {
if (G_LIKELY (!parse->priv->skip)) {
ret = gst_pad_push (parse->srcpad, buffer); ret = gst_pad_push (parse->srcpad, buffer);
GST_LOG_OBJECT (parse, "frame (%d bytes) pushed: %s", GST_LOG_OBJECT (parse, "frame (%d bytes) pushed: %s",
GST_BUFFER_SIZE (buffer), gst_flow_get_name (ret)); GST_BUFFER_SIZE (buffer), gst_flow_get_name (ret));
} else {
GST_DEBUG_OBJECT (parse, "initial frame (%d bytes) discarded",
GST_BUFFER_SIZE (buffer));
parse->priv->skip--;
}
} else { } else {
gst_buffer_unref (buffer); gst_buffer_unref (buffer);
GST_LOG_OBJECT (parse, "frame (%d bytes) not pushed: %s", GST_LOG_OBJECT (parse, "frame (%d bytes) not pushed: %s",
@ -2871,6 +2911,41 @@ gst_base_parse_get_index (GstElement * element)
return result; return result;
} }
static void
gst_base_parse_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec)
{
GstBaseParse *parse;
parse = GST_BASE_PARSE (object);
switch (prop_id) {
case PROP_SKIP:
parse->priv->skip = g_value_get_int (value);
break;
default:
break;
}
}
static void
gst_base_parse_get_property (GObject * object, guint prop_id, GValue * value,
GParamSpec * pspec)
{
GstBaseParse *parse;
parse = GST_BASE_PARSE (object);
switch (prop_id) {
case PROP_SKIP:
g_value_set_int (value, parse->priv->skip);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static GstStateChangeReturn static GstStateChangeReturn
gst_base_parse_change_state (GstElement * element, GstStateChange transition) gst_base_parse_change_state (GstElement * element, GstStateChange transition)
{ {