videorate: Add property to force an output framerate

API: GstVideoRate:force-fps

Changing the framerate during playback is not possible
with a capsfilter downstream if upstream is not using
gst_pad_alloc_buffer(). In that case there's no way in
0.10 to signal to videorate that the preferred framerate
has changed.

This new property will force the output framerate to
a specific value and can be changed during playback.
This commit is contained in:
Sebastian Dröge 2011-11-24 14:29:49 +01:00
parent 683735a01e
commit ec062ef3f2
2 changed files with 39 additions and 2 deletions

View File

@ -89,6 +89,8 @@ enum
#define DEFAULT_DROP_ONLY FALSE #define DEFAULT_DROP_ONLY FALSE
#define DEFAULT_AVERAGE_PERIOD 0 #define DEFAULT_AVERAGE_PERIOD 0
#define DEFAULT_MAX_RATE G_MAXINT #define DEFAULT_MAX_RATE G_MAXINT
#define DEFAULT_FORCE_FPS_N -1
#define DEFAULT_FORCE_FPS_D 1
enum enum
{ {
@ -102,7 +104,8 @@ enum
ARG_SKIP_TO_FIRST, ARG_SKIP_TO_FIRST,
ARG_DROP_ONLY, ARG_DROP_ONLY,
ARG_AVERAGE_PERIOD, ARG_AVERAGE_PERIOD,
ARG_MAX_RATE ARG_MAX_RATE,
ARG_FORCE_FPS
/* FILL ME */ /* FILL ME */
}; };
@ -270,6 +273,19 @@ gst_video_rate_class_init (GstVideoRateClass * klass)
"(in frames per second, implies drop-only)", "(in frames per second, implies drop-only)",
1, G_MAXINT, DEFAULT_MAX_RATE, 1, G_MAXINT, DEFAULT_MAX_RATE,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS));
/**
* GstVideoRate:force-fps:
*
* Forced output framerate
*
* Since: 0.10.36
*/
g_object_class_install_property (object_class, ARG_FORCE_FPS,
gst_param_spec_fraction ("force-fps", "Force output framerate",
"Force output framerate (negative means negotiate via caps)",
-1, 1, G_MAXINT, 1, DEFAULT_FORCE_FPS_N, DEFAULT_FORCE_FPS_D,
G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS));
} }
static void static void
@ -389,7 +405,16 @@ gst_video_rate_transform_caps (GstBaseTransform * trans,
s = gst_caps_get_structure (ret, 0); s = gst_caps_get_structure (ret, 0);
s2 = gst_structure_copy (s); s2 = gst_structure_copy (s);
if (videorate->drop_only) { if (videorate->force_fps_n >= 0 && videorate->force_fps_d >= 0) {
if (direction == GST_PAD_SINK) {
gst_caps_remove_structure (ret, 0);
gst_structure_set (s2, "framerate", GST_TYPE_FRACTION,
videorate->force_fps_n, videorate->force_fps_d, NULL);
} else {
gst_structure_set (s2, "framerate", GST_TYPE_FRACTION_RANGE, 0, 1,
G_MAXINT, 1, NULL);
}
} else if (videorate->drop_only) {
gint min_num = 0, min_denom = 1; gint min_num = 0, min_denom = 1;
gint max_num = G_MAXINT, max_denom = 1; gint max_num = G_MAXINT, max_denom = 1;
@ -563,6 +588,8 @@ gst_video_rate_init (GstVideoRate * videorate, GstVideoRateClass * klass)
videorate->average_period = DEFAULT_AVERAGE_PERIOD; videorate->average_period = DEFAULT_AVERAGE_PERIOD;
videorate->average_period_set = DEFAULT_AVERAGE_PERIOD; videorate->average_period_set = DEFAULT_AVERAGE_PERIOD;
videorate->max_rate = DEFAULT_MAX_RATE; videorate->max_rate = DEFAULT_MAX_RATE;
videorate->force_fps_n = DEFAULT_FORCE_FPS_N;
videorate->force_fps_d = DEFAULT_FORCE_FPS_D;
videorate->from_rate_numerator = 0; videorate->from_rate_numerator = 0;
videorate->from_rate_denominator = 0; videorate->from_rate_denominator = 0;
@ -1176,6 +1203,11 @@ gst_video_rate_set_property (GObject * object,
g_atomic_int_set (&videorate->max_rate, g_value_get_int (value)); g_atomic_int_set (&videorate->max_rate, g_value_get_int (value));
goto reconfigure; goto reconfigure;
break; break;
case ARG_FORCE_FPS:
videorate->force_fps_n = gst_value_get_fraction_numerator (value);
videorate->force_fps_d = gst_value_get_fraction_denominator (value);
goto reconfigure;
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;
@ -1226,6 +1258,10 @@ gst_video_rate_get_property (GObject * object,
case ARG_MAX_RATE: case ARG_MAX_RATE:
g_value_set_int (value, g_atomic_int_get (&videorate->max_rate)); g_value_set_int (value, g_atomic_int_get (&videorate->max_rate));
break; break;
case ARG_FORCE_FPS:
gst_value_set_fraction (value, videorate->force_fps_n,
videorate->force_fps_d);
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

@ -76,6 +76,7 @@ struct _GstVideoRate
gboolean skip_to_first; gboolean skip_to_first;
gboolean drop_only; gboolean drop_only;
guint64 average_period_set; guint64 average_period_set;
gint force_fps_n, force_fps_d;
volatile int max_rate; volatile int max_rate;
}; };