videomaxrate: Make period over which to average configurable

This commit is contained in:
Olivier Crête 2010-06-10 20:25:01 -04:00
parent 3449d16566
commit b9601e2096
2 changed files with 64 additions and 6 deletions

View File

@ -44,6 +44,11 @@ static GstStaticPadTemplate gst_video_max_rate_sink_template =
GST_STATIC_CAPS ("video/x-raw-yuv; video/x-raw-rgb") GST_STATIC_CAPS ("video/x-raw-yuv; video/x-raw-rgb")
); );
static void gst_video_max_rate_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec);
static void gst_video_max_rate_get_property (GObject * object, guint prop_id,
GValue * value, GParamSpec * pspec);
static gboolean gst_video_max_rate_start (GstBaseTransform * trans); static gboolean gst_video_max_rate_start (GstBaseTransform * trans);
static gboolean gst_video_max_rate_sink_event (GstBaseTransform * trans, static gboolean gst_video_max_rate_sink_event (GstBaseTransform * trans,
GstEvent * event); GstEvent * event);
@ -57,6 +62,14 @@ static GstFlowReturn gst_video_max_rate_transform_ip (GstBaseTransform * trans,
GST_BOILERPLATE (GstVideoMaxRate, gst_video_max_rate, GstBaseTransform, GST_BOILERPLATE (GstVideoMaxRate, gst_video_max_rate, GstBaseTransform,
GST_TYPE_BASE_TRANSFORM); GST_TYPE_BASE_TRANSFORM);
#define DEFAULT_AVERAGE_PERIOD GST_SECOND
enum
{
PROP_0,
PROP_AVERAGE_PERIOD
};
static void static void
gst_video_max_rate_base_init (gpointer gclass) gst_video_max_rate_base_init (gpointer gclass)
{ {
@ -76,8 +89,12 @@ gst_video_max_rate_base_init (gpointer gclass)
static void static void
gst_video_max_rate_class_init (GstVideoMaxRateClass * klass) gst_video_max_rate_class_init (GstVideoMaxRateClass * klass)
{ {
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
GstBaseTransformClass *base_class = GST_BASE_TRANSFORM_CLASS (klass); GstBaseTransformClass *base_class = GST_BASE_TRANSFORM_CLASS (klass);
gobject_class->set_property = gst_video_max_rate_set_property;
gobject_class->get_property = gst_video_max_rate_get_property;
base_class->transform_caps = base_class->transform_caps =
GST_DEBUG_FUNCPTR (gst_video_max_rate_transform_caps); GST_DEBUG_FUNCPTR (gst_video_max_rate_transform_caps);
base_class->set_caps = GST_DEBUG_FUNCPTR (gst_video_max_rate_set_caps); base_class->set_caps = GST_DEBUG_FUNCPTR (gst_video_max_rate_set_caps);
@ -85,6 +102,12 @@ gst_video_max_rate_class_init (GstVideoMaxRateClass * klass)
GST_DEBUG_FUNCPTR (gst_video_max_rate_transform_ip); GST_DEBUG_FUNCPTR (gst_video_max_rate_transform_ip);
base_class->event = GST_DEBUG_FUNCPTR (gst_video_max_rate_sink_event); base_class->event = GST_DEBUG_FUNCPTR (gst_video_max_rate_sink_event);
base_class->start = GST_DEBUG_FUNCPTR (gst_video_max_rate_start); base_class->start = GST_DEBUG_FUNCPTR (gst_video_max_rate_start);
g_object_class_install_property (gobject_class, PROP_AVERAGE_PERIOD,
g_param_spec_uint64 ("average-period", "Period over which to average",
"Period over which to average the framerate (in ns)",
1, G_MAXINT64, DEFAULT_AVERAGE_PERIOD,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
} }
static void static void
@ -100,11 +123,46 @@ gst_video_max_rate_init (GstVideoMaxRate * videomaxrate,
{ {
gst_video_max_rate_reset (videomaxrate); gst_video_max_rate_reset (videomaxrate);
videomaxrate->wanted_diff = 0; videomaxrate->wanted_diff = 0;
videomaxrate->average_period = DEFAULT_AVERAGE_PERIOD;
gst_base_transform_set_gap_aware (GST_BASE_TRANSFORM (videomaxrate), TRUE); gst_base_transform_set_gap_aware (GST_BASE_TRANSFORM (videomaxrate), TRUE);
gst_base_transform_set_in_place (GST_BASE_TRANSFORM (videomaxrate), TRUE); gst_base_transform_set_in_place (GST_BASE_TRANSFORM (videomaxrate), TRUE);
} }
static void
gst_video_max_rate_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec)
{
GstVideoMaxRate *videomaxrate = GST_VIDEO_MAX_RATE (object);
switch (prop_id) {
case PROP_AVERAGE_PERIOD:
videomaxrate->average_period = g_value_get_uint64 (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
gst_video_max_rate_get_property (GObject * object, guint prop_id,
GValue * value, GParamSpec * pspec)
{
GstVideoMaxRate *videomaxrate = GST_VIDEO_MAX_RATE (object);
switch (prop_id) {
case PROP_AVERAGE_PERIOD:
g_value_set_uint64 (value, videomaxrate->average_period);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static gboolean static gboolean
gst_video_max_rate_start (GstBaseTransform * trans) gst_video_max_rate_start (GstBaseTransform * trans)
{ {
@ -184,7 +242,6 @@ gst_video_max_rate_transform_ip (GstBaseTransform * trans, GstBuffer * buf)
{ {
GstVideoMaxRate *videomaxrate = GST_VIDEO_MAX_RATE (trans); GstVideoMaxRate *videomaxrate = GST_VIDEO_MAX_RATE (trans);
GstClockTime ts = GST_BUFFER_TIMESTAMP (buf); GstClockTime ts = GST_BUFFER_TIMESTAMP (buf);
const GstClockTime average_period = GST_SECOND;
if (!GST_BUFFER_TIMESTAMP_IS_VALID (buf) || videomaxrate->wanted_diff == 0) if (!GST_BUFFER_TIMESTAMP_IS_VALID (buf) || videomaxrate->wanted_diff == 0)
return GST_FLOW_OK; return GST_FLOW_OK;
@ -204,17 +261,17 @@ gst_video_max_rate_transform_ip (GstBaseTransform * trans, GstBuffer * buf)
if (videomaxrate->average) { if (videomaxrate->average) {
GstClockTimeDiff wanted_diff; GstClockTimeDiff wanted_diff;
if (G_LIKELY (average_period > videomaxrate->wanted_diff)) if (G_LIKELY (videomaxrate->average_period > videomaxrate->wanted_diff))
wanted_diff = videomaxrate->wanted_diff; wanted_diff = videomaxrate->wanted_diff;
else else
wanted_diff = average_period * 10; wanted_diff = videomaxrate->average_period * 10;
videomaxrate->average = videomaxrate->average =
gst_util_uint64_scale_round (videomaxrate->average, gst_util_uint64_scale_round (videomaxrate->average,
average_period - wanted_diff, videomaxrate->average_period - wanted_diff,
average_period) + videomaxrate->average_period) +
gst_util_uint64_scale_round (diff, wanted_diff, gst_util_uint64_scale_round (diff, wanted_diff,
average_period); videomaxrate->average_period);
} else { } else {
videomaxrate->average = diff; videomaxrate->average = diff;
} }

View File

@ -46,6 +46,7 @@ struct _GstVideoMaxRate
GstBaseTransform parent; GstBaseTransform parent;
GstClockTimeDiff wanted_diff; GstClockTimeDiff wanted_diff;
GstClockTime average_period;
GstClockTime last_ts; GstClockTime last_ts;
GstClockTimeDiff average; GstClockTimeDiff average;