clockoverlay: only rerender text if time string has changed

The textoverlay element will rerender the text string whenever
overlay sets the 'need_render' flag to TRUE.  Previously, we
lazily set the flag to TRUE every time the time string was requested.
Now, we save a copy of the previously given string, and only set
'need_render' to TRUE if the string has changed.

In my tests with a 30fps video stream, and a time string including
a seconds field, this change reduced the CPU usage of the clockoverlay
element from 60% to 5%.

Fixes bug #627780.
This commit is contained in:
Chris Shoemaker 2010-08-23 18:51:18 -04:00 committed by Sebastian Dröge
parent 1b6918709c
commit 6bd90dc0cc
2 changed files with 11 additions and 4 deletions

View file

@ -117,12 +117,11 @@ static gchar *
gst_clock_overlay_get_text (GstTextOverlay * overlay, GstBuffer * video_frame)
{
gchar *time_str, *txt, *ret;
overlay->need_render = TRUE;
GstClockOverlay *clock_overlay = GST_CLOCK_OVERLAY (overlay);
txt = g_strdup (overlay->default_text);
time_str = gst_clock_overlay_render_time (GST_CLOCK_OVERLAY (overlay));
time_str = gst_clock_overlay_render_time (clock_overlay);
if (txt != NULL && *txt != '\0') {
ret = g_strdup_printf ("%s %s", txt, time_str);
} else {
@ -130,6 +129,12 @@ gst_clock_overlay_get_text (GstTextOverlay * overlay, GstBuffer * video_frame)
time_str = NULL;
}
if (g_strcmp0 (ret, clock_overlay->text)) {
overlay->need_render = TRUE;
g_free (clock_overlay->text);
clock_overlay->text = g_strdup (ret);
}
g_free (txt);
g_free (time_str);
@ -164,6 +169,7 @@ gst_clock_overlay_finalize (GObject * object)
GstClockOverlay *overlay = GST_CLOCK_OVERLAY (object);
g_free (overlay->format);
g_free (overlay->text);
overlay->format = NULL;
G_OBJECT_CLASS (parent_class)->finalize (object);

View file

@ -47,7 +47,8 @@ typedef struct _GstClockOverlayClass GstClockOverlayClass;
*/
struct _GstClockOverlay {
GstTextOverlay textoverlay;
gchar *format; /* as in strftime () */
gchar *format; /* as in strftime () */
gchar *text;
};
struct _GstClockOverlayClass {