mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-22 08:17:01 +00:00
215cfcf993
When g_option_context_parse fails, context and error variables are not getting free'd which results in memory leaks. Free'ing the same. And replacing g_error_free with g_clear_error, which checks if the error being passed is not NULL and sets the variable to NULL on free'ing. https://bugzilla.gnome.org/show_bug.cgi?id=753851
101 lines
3.1 KiB
C
101 lines
3.1 KiB
C
/* GStreamer
|
|
* Copyright (C) 2015 Sebastian Dröge <sebastian@centricular.com>
|
|
*
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Library General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Library General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Library General Public
|
|
* License along with this library; if not, write to the
|
|
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
|
|
* Boston, MA 02110-1301, USA.
|
|
*/
|
|
|
|
/* Create a PTP client clock and print times and statistics.
|
|
*
|
|
* When running this from a GStreamer build tree, you will have to set
|
|
* GST_PTP_HELPER to libs/gst/helpers/.libs/gst-ptp-helper and also
|
|
* make sure that it has the right permissions (setuid root or appropriate
|
|
* capabilities
|
|
*
|
|
* You can test this with any PTP compatible clock, e.g. ptpd from here: http://ptpd.sourceforge.net/
|
|
*
|
|
* For testing the accuracy, you can use the PTP reflector available from
|
|
* http://code.centricular.com/ptp-clock-reflector/ or here
|
|
* https://github.com/sdroege/ptp-clock-reflector
|
|
*/
|
|
|
|
#include <gst/gst.h>
|
|
#include <gst/net/net.h>
|
|
|
|
static gint domain = 0;
|
|
static gboolean stats = FALSE;
|
|
|
|
static GOptionEntry opt_entries[] = {
|
|
{"domain", 'd', 0, G_OPTION_ARG_INT, &domain,
|
|
"PTP domain", NULL},
|
|
{"stats", 's', 0, G_OPTION_ARG_NONE, &stats,
|
|
"Print PTP statistics", NULL},
|
|
{NULL}
|
|
};
|
|
|
|
static gboolean
|
|
stats_cb (guint8 d, const GstStructure * stats, gpointer user_data)
|
|
{
|
|
if (d == domain) {
|
|
gchar *stats_str = gst_structure_to_string (stats);
|
|
g_print ("Got stats: %s\n", stats_str);
|
|
g_free (stats_str);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
gint
|
|
main (gint argc, gchar ** argv)
|
|
{
|
|
GOptionContext *opt_ctx;
|
|
GstClock *clock;
|
|
GError *err = NULL;
|
|
|
|
opt_ctx = g_option_context_new ("- GStreamer PTP clock test app");
|
|
g_option_context_add_main_entries (opt_ctx, opt_entries, NULL);
|
|
g_option_context_add_group (opt_ctx, gst_init_get_option_group ());
|
|
if (!g_option_context_parse (opt_ctx, &argc, &argv, &err))
|
|
g_error ("Error parsing options: %s", err->message);
|
|
g_clear_error (&err);
|
|
g_option_context_free (opt_ctx);
|
|
|
|
if (!gst_ptp_init (GST_PTP_CLOCK_ID_NONE, NULL))
|
|
g_error ("failed to init ptp");
|
|
|
|
if (stats)
|
|
gst_ptp_statistics_callback_add (stats_cb, NULL, NULL);
|
|
|
|
clock = gst_ptp_clock_new ("test-clock", domain);
|
|
|
|
gst_clock_wait_for_sync (GST_CLOCK (clock), GST_CLOCK_TIME_NONE);
|
|
|
|
while (TRUE) {
|
|
GstClockTime local, remote;
|
|
GstClockTimeDiff diff;
|
|
|
|
local = g_get_real_time () * 1000;
|
|
remote = gst_clock_get_time (clock);
|
|
diff = GST_CLOCK_DIFF (local, remote);
|
|
|
|
g_print ("local: %" GST_TIME_FORMAT " ptp: %" GST_TIME_FORMAT " diff: %s%"
|
|
GST_TIME_FORMAT "\n", GST_TIME_ARGS (local), GST_TIME_ARGS (remote),
|
|
(diff < 0 ? "-" : " "), GST_TIME_ARGS (ABS (diff)));
|
|
g_usleep (100000);
|
|
}
|
|
|
|
return 0;
|
|
}
|