diff options
author | Teemu Katajisto <ext-teemu.katajisto@nokia.com> | 2009-11-26 12:12:06 +0200 |
---|---|---|
committer | Thiago Santos <thiago.sousa.santos@collabora.co.uk> | 2010-04-13 12:00:35 -0300 |
commit | 0176533c02da38905b579f6364e3b10a2d0e6d50 (patch) | |
tree | 410f28363c5feb3838e95a830c5353e197506ca9 /tests/examples | |
parent | ae57a90fe239f6178240bf5d380ead1fd27b23e3 (diff) | |
download | gstreamer-plugins-bad-0176533c02da38905b579f6364e3b10a2d0e6d50.tar.gz |
camerabin: add gst-camerabin-test command line test tool
gst-camerabin-test tool can be used to capture still images and
video clips using camerabin element.
Diffstat (limited to 'tests/examples')
-rw-r--r-- | tests/examples/camerabin/Makefile.am | 14 | ||||
-rw-r--r-- | tests/examples/camerabin/gst-camerabin-test.c | 728 |
2 files changed, 741 insertions, 1 deletions
diff --git a/tests/examples/camerabin/Makefile.am b/tests/examples/camerabin/Makefile.am index afd4c3616..3d43b9618 100644 --- a/tests/examples/camerabin/Makefile.am +++ b/tests/examples/camerabin/Makefile.am @@ -32,7 +32,19 @@ gst_camera_perf_SOURCES = gst-camera-perf.c gst_camera_perf_CFLAGS = $(GST_CFLAGS) gst_camera_perf_LDADD = $(GST_LIBS) -bin_PROGRAMS = gst-camera-perf $(GST_CAMERABIN_GTK_EXAMPLES) +if HAVE_X11 + +GST_CAMERABIN_X11_EXAMPLES = gst-camerabin-test + +gst_camerabin_test_SOURCES = gst-camerabin-test.c +gst_camerabin_test_CFLAGS = $(GST_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) +gst_camerabin_test_LDADD = -lgstinterfaces-@GST_MAJORMINOR@ $(GST_LIBS) $(GST_PLUGINS_BASE_LIBS) $(X11_LIBS) + +else +GST_CAMERABIN_X11_EXAMPLES = +endif + +bin_PROGRAMS = gst-camera-perf $(GST_CAMERABIN_X11_EXAMPLES) $(GST_CAMERABIN_GTK_EXAMPLES) EXTRA_DIST = $(GST_CAMERABIN_UI_FILES) diff --git a/tests/examples/camerabin/gst-camerabin-test.c b/tests/examples/camerabin/gst-camerabin-test.c new file mode 100644 index 000000000..66ee52620 --- /dev/null +++ b/tests/examples/camerabin/gst-camerabin-test.c @@ -0,0 +1,728 @@ +/* + * GStreamer + * Copyright (C) 2010 Nokia Corporation <multimedia@maemo.org> + * + * 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + + /* + Compile using: + gcc -Wall `pkg-config --cflags --libs gstreamer-0.10` gst-camerabin-test.c -o gst-camerabin-test + + Examples: + ./gst-camerabin-test --image-width=2048 --image-height=1536 --image-enc=dspjpegenc + ./gst-camerabin-test --mode=1 --capture-time=10 --image-width=848 --image-height=480 --view-framerate-num=2825 \ + --view-framerate-den=100 --audio-src=pulsesrc --audio-enc=nokiaaacenc --video-enc=dspmp4venc \ + --video-mux=mp4mux --src-colorspace=UYVY + + ./gst-camerabin-test --help + Usage: + gst-camerabin-test [OPTION...] + + camerabin command line test application + + Help Options: + -h, --help Show help options + --help-all Show all help options + --help-gst Show GStreamer Options + + Application Options: + --ev-compensation EV compensation (-2.5..2.5, default = 0) + --aperture Aperture (size of lens opening, default = 0 (auto)) + --flash-mode Flash mode (default = 0 (auto)) + --scene-mode Scene mode (default = 6 (auto)) + --exposure Exposure (default = 0 (auto)) + --iso-speed ISO speed (default = 0 (auto)) + --white-balance-mode White balance mode (default = 0 (auto)) + --colour-tone-mode Colour tone mode (default = 0 (auto)) + --directory Directory for capture file(s) (default is current directory) + --mode Capture mode (default = 0 (image), 1 = video) + --capture-time Time to capture video in seconds (default = 10) + --capture-total Total number of captures to be done + --flags Flags for camerabin, (default = 0x9) + --mute Mute audio (default = 0 (no)) + --zoom Zoom (100 = 1x (default), 200 = 2x etc.) + --audio-src Audio source used in video recording + --audio-bitrate Audio bitrate (default 128000) + --audio-samplerate Audio samplerate (default 48000) + --audio-channels Audio channels (default 1) + --video-src Video source used in still capture and video recording + --audio-enc Audio encoder used in video recording + --video-enc Video encoder used in video recording + --image-enc Image encoder used in still capture + --image-pp Image post-processing element + --video-mux Muxer used in video recording + --viewfinder-sink Viewfinder sink (default = fakesink) + --image-width Width for image capture + --image-height Height for image capture + --view-framerate-num Framerate numerator for viewfinder + --view-framerate-den Framerate denominator for viewfinder + --src-colorspace Colorspace format for videosource (e.g. YUY2, UYVY) + --preview-caps Preview caps (e.g. video/x-raw-rgb,width=320,height=240) + --video-source-filter Video filter to process all frames from video source + + */ + +/* + * Includes + */ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include <gst/gst.h> +#include <gst/interfaces/xoverlay.h> +#include <string.h> +#include <sys/time.h> +#include <time.h> +#include <unistd.h> +#include <stdlib.h> +#include <glib.h> +#include <glib/gstdio.h> + +#include <X11/Xlib.h> +#include <X11/Xatom.h> +/* + * debug logging + */ +GST_DEBUG_CATEGORY_STATIC (camerabin_test); +#define GST_CAT_DEFAULT camerabin_test + +typedef struct _ResultType +{ + GstClockTime avg; + GstClockTime min; + GstClockTime max; + guint32 times; +} ResultType; + +/* + * Global vars + */ +static GstElement *camera_bin = NULL; +static GMainLoop *loop = NULL; + +/* commandline options */ +static gchar *audiosrc_name = NULL; +static gchar *videosrc_name = NULL; +static gchar *audioenc_name = NULL; +static gchar *videoenc_name = NULL; +static gchar *imageenc_name = NULL; +static gchar *imagepp_name = NULL; +static gchar *videomux_name = NULL; +static gchar *vfsink_name = NULL; +static gchar *src_csp = NULL; +static gint image_width = 1280; +static gint image_height = 720; +static gint view_framerate_num = 2825; +static gint view_framerate_den = 100; + +/* photography interface command line options */ +static gfloat ev_compensation = 0.0; +static gint aperture = 0; +static gint flash_mode = 0; +static gint scene_mode = 6; +static gint64 exposure = 0; +static gint iso_speed = 0; +static gint wb_mode = 0; +static gint color_mode = 0; +static gint mode = 1; +static gint flags = 0x4f; +static gint mute = 0; +static gint zoom = 100; + +static gint capture_time = 10; +static gint capture_count = 0; +static gint capture_total = 1; + +/* audio capsfilter options */ +static gint audio_bitrate = 128000; +static gint audio_samplerate = 48000; +static gint audio_channels = 1; + +static gchar *video_src_filter = NULL; + +static int x_width = 320; +static int x_height = 240; + +/* test configuration for common callbacks */ +static GString *filename = NULL; + +static gchar *preview_caps_name = NULL; + +/* X window variables */ +static Display *display = NULL; +static Window window = 0; + +/* + * Prototypes + */ +static gboolean run_pipeline (gpointer user_data); +static void set_metadata (GstElement * camera); + +static void +create_host_window (void) +{ + unsigned long valuemask; + XSetWindowAttributes attributes; + + display = XOpenDisplay (NULL); + if (display) { + window = + XCreateSimpleWindow (display, DefaultRootWindow (display), 0, 0, + x_width, x_height, 0, 0, 0); + if (window) { + valuemask = CWOverrideRedirect; + attributes.override_redirect = True; + XChangeWindowAttributes (display, window, valuemask, &attributes); + XSetWindowBackgroundPixmap (display, window, None); + XMapRaised (display, window); + XSync (display, FALSE); + } else { + GST_DEBUG ("could not create X window!"); + } + } else { + GST_DEBUG ("could not open display!"); + } +} + +static gboolean +img_capture_done (GstElement * camera, const gchar * fname, gpointer user_data) +{ + gboolean ret = FALSE; + + GST_DEBUG ("image done: %s", fname); + if (capture_count < capture_total) { + g_idle_add ((GSourceFunc) run_pipeline, NULL); + } else { + g_main_loop_quit (loop); + } + return ret; +} + +static GstBusSyncReply +bus_callback (GstBus * bus, GstMessage * message, gpointer data) +{ + const GstStructure *st; + const GValue *image; + GstBuffer *buf = NULL; + guint8 *data_buf = NULL; + gchar *caps_string; + guint size = 0; + gchar *preview_filename = NULL; + FILE *f = NULL; + size_t written; + + switch (GST_MESSAGE_TYPE (message)) { + case GST_MESSAGE_ERROR:{ + GError *err; + gchar *debug; + + gst_message_parse_error (message, &err, &debug); + g_print ("Error: %s\n", err->message); + g_error_free (err); + g_free (debug); + + /* Write debug graph to file */ + GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS (GST_BIN (camera_bin), + GST_DEBUG_GRAPH_SHOW_ALL, "camerabin.error"); + + g_main_loop_quit (loop); + break; + } + case GST_MESSAGE_STATE_CHANGED: + if (GST_IS_BIN (GST_MESSAGE_SRC (message))) { + GstState oldstate, newstate; + + gst_message_parse_state_changed (message, &oldstate, &newstate, NULL); + GST_DEBUG_OBJECT (GST_MESSAGE_SRC (message), "state-changed: %s -> %s", + gst_element_state_get_name (oldstate), + gst_element_state_get_name (newstate)); + } + break; + case GST_MESSAGE_EOS: + /* end-of-stream */ + GST_INFO ("got eos() - should not happen"); + g_main_loop_quit (loop); + break; + default: + st = gst_message_get_structure (message); + if (st) { + if (gst_structure_has_name (message->structure, "prepare-xwindow-id")) { + if (window) { + gst_x_overlay_set_xwindow_id (GST_X_OVERLAY (GST_MESSAGE_SRC + (message)), window); + gst_message_unref (message); + message = NULL; + return GST_BUS_DROP; + } + } else if (gst_structure_has_name (st, "image-captured")) { + GST_DEBUG ("image-captured"); + } else if (gst_structure_has_name (st, "preview-image")) { + GST_DEBUG ("preview-image"); + //extract preview-image from msg + image = gst_structure_get_value (st, "buffer"); + if (image) { + buf = gst_value_get_buffer (image); + data_buf = GST_BUFFER_DATA (buf); + size = GST_BUFFER_SIZE (buf); + preview_filename = g_strdup_printf ("test_vga.rgb"); + caps_string = gst_caps_to_string (GST_BUFFER_CAPS (buf)); + g_print ("writing buffer to %s, buffer caps: %s\n", + preview_filename, caps_string); + g_free (caps_string); + f = g_fopen (preview_filename, "w"); + if (f) { + written = fwrite (data_buf, size, 1, f); + if (!written) { + g_print ("errro writing file\n"); + } + fclose (f); + } else { + g_print ("error opening file for raw image writing\n"); + } + g_free (preview_filename); + } + } + } + /* unhandled message */ + break; + } + return GST_BUS_PASS; +} + +/* + * Helpers + */ + +static void +cleanup_pipeline (void) +{ + if (camera_bin) { + GST_INFO_OBJECT (camera_bin, "stopping and destroying"); + gst_element_set_state (camera_bin, GST_STATE_NULL); + gst_object_unref (camera_bin); + camera_bin = NULL; + } +} + +static gboolean +setup_pipeline_element (const gchar * property_name, const gchar * element_name, + GstElement ** res_elem) +{ + gboolean res = TRUE; + GstElement *elem = NULL; + + if (element_name) { + elem = gst_element_factory_make (element_name, NULL); + if (elem) { + g_object_set (camera_bin, property_name, elem, NULL); + } else { + GST_WARNING ("can't create element '%s' for property '%s'", element_name, + property_name); + res = FALSE; + } + } else { + GST_DEBUG ("no element for property '%s' given", property_name); + } + if (res_elem) + *res_elem = elem; + return res; +} + +static GstElement * +create_audioencoder_bin (void) +{ + GstElement *bin, *aenc, *filter; + GstPad *pad; + GstCaps *audio_caps; + + bin = gst_bin_new ("aebin"); + filter = gst_element_factory_make ("capsfilter", "aefilter"); + aenc = gst_element_factory_make (audioenc_name, "aenc"); + + if (!g_ascii_strcasecmp (audioenc_name, "pulsesrc")) { + g_object_set (G_OBJECT (aenc), + "bitrate", audio_bitrate, "profile", 2, NULL); + } + + audio_caps = gst_caps_new_simple ("audio/x-raw-int", + "channels", G_TYPE_INT, audio_channels, + "rate", G_TYPE_INT, audio_samplerate, NULL); + + if (!audio_caps) { + g_warning ("error generating caps"); + } + + g_object_set (G_OBJECT (filter), "caps", audio_caps, NULL); + + gst_caps_unref (audio_caps); + + gst_bin_add_many (GST_BIN (bin), filter, aenc, NULL); + gst_element_link (filter, aenc); + + pad = gst_element_get_static_pad (filter, "sink"); + gst_element_add_pad (bin, gst_ghost_pad_new ("sink", pad)); + gst_object_unref (GST_OBJECT (pad)); + + pad = gst_element_get_static_pad (aenc, "src"); + gst_element_add_pad (bin, gst_ghost_pad_new ("src", pad)); + gst_object_unref (GST_OBJECT (pad)); + + return bin; +} + +static gboolean +setup_pipeline (void) +{ + GstBus *bus; + gboolean res = TRUE; + GstElement *vmux = NULL, *ienc = NULL, *sink = NULL, *aenc = NULL, *ipp = + NULL; + + camera_bin = gst_element_factory_make ("camerabin", NULL); + if (NULL == camera_bin) { + g_warning ("can't create camerabin element\n"); + goto error; + } + g_object_set (camera_bin, "flags", flags, NULL); + + g_signal_connect (camera_bin, "image-done", (GCallback) img_capture_done, + NULL); + + bus = gst_pipeline_get_bus (GST_PIPELINE (camera_bin)); + gst_bus_set_sync_handler (bus, bus_callback, NULL); + gst_object_unref (bus); + + GST_INFO_OBJECT (camera_bin, "camerabin created"); + + /* configure used elements */ + res &= setup_pipeline_element ("viewfinder-sink", vfsink_name, &sink); + res &= setup_pipeline_element ("audio-source", audiosrc_name, NULL); + res &= setup_pipeline_element ("video-source", videosrc_name, NULL); + res &= setup_pipeline_element ("video-source-filter", video_src_filter, NULL); + + if (audioenc_name) { + aenc = create_audioencoder_bin (); + if (aenc) + g_object_set (camera_bin, "audio-encoder", aenc, NULL); + else + GST_WARNING ("Could not make audio encoder element"); + } + + res &= setup_pipeline_element ("video-encoder", videoenc_name, NULL); + res &= setup_pipeline_element ("image-encoder", imageenc_name, &ienc); + res &= setup_pipeline_element ("image-post-processing", imagepp_name, &ipp); + res &= setup_pipeline_element ("video-muxer", videomux_name, &vmux); + if (!res) { + goto error; + } + GST_INFO_OBJECT (camera_bin, "elements created"); + + /* set properties */ + if (src_csp && strlen (src_csp) == 4) { + GstCaps *filter_caps; + + /* FIXME: why do we need to set this? */ + filter_caps = gst_caps_new_simple ("video/x-raw-yuv", + "format", GST_TYPE_FOURCC, + GST_MAKE_FOURCC (src_csp[0], src_csp[1], src_csp[2], src_csp[3]), NULL); + if (filter_caps) { + g_object_set (camera_bin, "filter-caps", filter_caps, NULL); + gst_caps_unref (filter_caps); + } else { + g_warning ("can't make filter-caps with format=%s\n", src_csp); + goto error; + } + } + + g_object_set (sink, "sync", TRUE, NULL); + + GST_INFO_OBJECT (camera_bin, "elements configured"); + + /* configure a resolution and framerate */ + if (mode == 1) { + g_signal_emit_by_name (camera_bin, "set-video-resolution-fps", image_width, + image_height, view_framerate_num, view_framerate_den, NULL); + } else { + g_signal_emit_by_name (camera_bin, "set-image-resolution", image_width, + image_height, NULL); + } + + if (GST_STATE_CHANGE_FAILURE == + gst_element_set_state (camera_bin, GST_STATE_READY)) { + g_warning ("can't set camerabin to ready\n"); + goto error; + } + GST_INFO_OBJECT (camera_bin, "camera ready"); + + if (GST_STATE_CHANGE_FAILURE == + gst_element_set_state (camera_bin, GST_STATE_PLAYING)) { + g_warning ("can't set camerabin to playing\n"); + goto error; + } + GST_INFO_OBJECT (camera_bin, "camera started"); + return TRUE; +error: + cleanup_pipeline (); + return FALSE; +} + +static gboolean +stop_capture (gpointer user_data) +{ + g_signal_emit_by_name (camera_bin, "capture-stop", 0); + if (capture_count < capture_total) { + g_idle_add ((GSourceFunc) run_pipeline, NULL); + } else { + g_main_loop_quit (loop); + } + return FALSE; +} + +static void +set_metadata (GstElement * camera) +{ + GstTagSetter *setter = GST_TAG_SETTER (camera); + GTimeVal time = { 0, 0 }; + gchar *desc_str; + GDate *date = g_date_new (); + + g_get_current_time (&time); + g_date_set_time_val (date, &time); + + desc_str = g_strdup_printf ("captured by %s", g_get_real_name ()); + + gst_tag_setter_add_tags (setter, GST_TAG_MERGE_REPLACE, + GST_TAG_DATE, date, + GST_TAG_DESCRIPTION, desc_str, + GST_TAG_TITLE, "gst-camerabin-test capture", + GST_TAG_GEO_LOCATION_LONGITUDE, 1.0, + GST_TAG_GEO_LOCATION_LATITUDE, 2.0, + GST_TAG_GEO_LOCATION_ELEVATION, 3.0, + "device-make", "gst-camerabin-test make", + "device-model", "gst-camerabin-test model", NULL); + + g_free (desc_str); + g_date_free (date); +} + +static gboolean +run_pipeline (gpointer user_data) +{ + GstCaps *preview_caps = NULL; + + g_object_set (camera_bin, "mode", mode, NULL); + + if (preview_caps_name != NULL) { + preview_caps = gst_caps_from_string (preview_caps_name); + if (preview_caps) { + g_object_set (camera_bin, "preview-caps", preview_caps, NULL); + GST_DEBUG ("Preview caps set"); + } else + GST_DEBUG ("Preview caps set but could not create caps from string"); + } + + set_metadata (camera_bin); + + if (capture_total) { + gchar *filename_str = filename->str; + filename_str = g_strdup_printf ("%s%d", filename->str, capture_count); + g_object_set (camera_bin, "filename", filename_str, NULL); + g_free (filename_str); + } else { + g_object_set (camera_bin, "filename", filename->str, NULL); + } + + g_object_set (camera_bin, "ev-compensation", ev_compensation, NULL); + g_object_set (camera_bin, "aperture", aperture, NULL); + g_object_set (camera_bin, "flash-mode", flash_mode, NULL); + g_object_set (camera_bin, "scene-mode", scene_mode, NULL); + g_object_set (camera_bin, "exposure", exposure, NULL); + g_object_set (camera_bin, "iso-speed", iso_speed, NULL); + g_object_set (camera_bin, "white-balance-mode", wb_mode, NULL); + g_object_set (camera_bin, "colour-tone-mode", color_mode, NULL); + g_object_set (camera_bin, "mute", mute, NULL); + g_object_set (camera_bin, "zoom", zoom, NULL); + + capture_count++; + g_signal_emit_by_name (camera_bin, "capture-start", 0); + + + if (mode == 1) { + g_timeout_add ((capture_time * 1000), (GSourceFunc) stop_capture, NULL); + } + + return FALSE; +} + +int +main (int argc, char *argv[]) +{ + gchar *target_times = NULL; + gchar *ev_option = NULL; + gchar *fn_option = NULL; + + GOptionEntry options[] = { + {"ev-compensation", '\0', G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_STRING, + &ev_option, + "EV compensation (-2.5..2.5, default = 0)", NULL}, + {"aperture", '\0', G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_INT, &aperture, + "Aperture (size of lens opening, default = 0 (auto))", NULL}, + {"flash-mode", '\0', G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_INT, + &flash_mode, + "Flash mode (default = 0 (auto))", NULL}, + {"scene-mode", '\0', G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_INT, + &scene_mode, + "Scene mode (default = 6 (auto))", NULL}, + {"exposure", '\0', G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_INT64, + &exposure, + "Exposure (default = 0 (auto))", NULL}, + {"iso-speed", '\0', G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_INT, + &iso_speed, + "ISO speed (default = 0 (auto))", NULL}, + {"white-balance-mode", '\0', G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_INT, + &wb_mode, + "White balance mode (default = 0 (auto))", NULL}, + {"colour-tone-mode", '\0', G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_INT, + &color_mode, + "Colour tone mode (default = 0 (auto))", NULL}, + {"directory", '\0', 0, G_OPTION_ARG_STRING, &fn_option, + "Directory for capture file(s) (default is current directory)", NULL}, + {"mode", '\0', G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_INT, &mode, + "Capture mode (default = 0 (image), 1 = video)", NULL}, + {"capture-time", '\0', G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_INT, + &capture_time, + "Time to capture video in seconds (default = 10)", NULL}, + {"capture-total", '\0', 0, G_OPTION_ARG_INT, &capture_total, + "Total number of captures to be done (default = 1)", NULL}, + {"flags", '\0', G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_INT, &flags, + "Flags for camerabin, (default = 0x9)", NULL}, + {"mute", '\0', G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_STRING, &mute, + "Mute audio (default = 0 (no))", NULL}, + {"zoom", '\0', G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_STRING, &zoom, + "Zoom (100 = 1x (default), 200 = 2x etc.)", NULL}, + {"audio-src", '\0', 0, G_OPTION_ARG_STRING, &audiosrc_name, + "Audio source used in video recording", NULL}, + {"audio-bitrate", '\0', 0, G_OPTION_ARG_INT, &audio_bitrate, + "Audio bitrate (default 128000)", NULL}, + {"audio-samplerate", '\0', 0, G_OPTION_ARG_INT, &audio_samplerate, + "Audio samplerate (default 48000)", NULL}, + {"audio-channels", '\0', 0, G_OPTION_ARG_INT, &audio_channels, + "Audio channels (default 1)", NULL}, + {"video-src", '\0', 0, G_OPTION_ARG_STRING, &videosrc_name, + "Video source used in still capture and video recording", NULL}, + {"audio-enc", '\0', 0, G_OPTION_ARG_STRING, &audioenc_name, + "Audio encoder used in video recording", NULL}, + {"video-enc", '\0', 0, G_OPTION_ARG_STRING, &videoenc_name, + "Video encoder used in video recording", NULL}, + {"image-enc", '\0', 0, G_OPTION_ARG_STRING, &imageenc_name, + "Image encoder used in still capture", NULL}, + {"image-pp", '\0', 0, G_OPTION_ARG_STRING, &imagepp_name, + "Image post-processing element", NULL}, + {"video-mux", '\0', 0, G_OPTION_ARG_STRING, &videomux_name, + "Muxer used in video recording", NULL}, + {"viewfinder-sink", '\0', 0, G_OPTION_ARG_STRING, &vfsink_name, + "Viewfinder sink (default = fakesink)", NULL}, + {"image-width", '\0', 0, G_OPTION_ARG_INT, &image_width, + "Width for image capture", NULL}, + {"image-height", '\0', 0, G_OPTION_ARG_INT, &image_height, + "Height for image capture", NULL}, + {"view-framerate-num", '\0', 0, G_OPTION_ARG_INT, &view_framerate_num, + "Framerate numerator for viewfinder", NULL}, + {"view-framerate-den", '\0', 0, G_OPTION_ARG_INT, &view_framerate_den, + "Framerate denominator for viewfinder", NULL}, + {"src-colorspace", '\0', 0, G_OPTION_ARG_STRING, &src_csp, + "Colorspace format for videosource (e.g. YUY2, UYVY)", NULL}, + {"preview-caps", '\0', 0, G_OPTION_ARG_STRING, &preview_caps_name, + "Preview caps (e.g. video/x-raw-rgb,width=320,height=240)", NULL}, + {"video-source-filter", '\0', 0, G_OPTION_ARG_STRING, &video_src_filter, + "Video filter to process all frames from video source", NULL}, + {"x-width", '\0', 0, G_OPTION_ARG_INT, &x_width, + "X window width (default = 320)", NULL}, + {"x-height", '\0', 0, G_OPTION_ARG_INT, &x_height, + "X window height (default = 240)", NULL}, + {NULL} + }; + + GOptionContext *ctx; + GError *err = NULL; + + /* if we fail to create xwindow should we care? */ + create_host_window (); + + if (!g_thread_supported ()) + g_thread_init (NULL); + + ctx = g_option_context_new ("\n\ncamerabin command line test application."); + g_option_context_add_main_entries (ctx, options, NULL); + g_option_context_add_group (ctx, gst_init_get_option_group ()); + if (!g_option_context_parse (ctx, &argc, &argv, &err)) { + g_print ("Error initializing: %s\n", err->message); + exit (1); + } + g_option_context_free (ctx); + + GST_DEBUG_CATEGORY_INIT (camerabin_test, "camerabin-test", 0, + "camerabin test"); + + /* FIXME: error handling */ + if (ev_option != NULL) + ev_compensation = strtod (ev_option, (char **) NULL); + + if (vfsink_name == NULL) + vfsink_name = g_strdup ("fakesink"); + + filename = g_string_new (fn_option); + if (filename->len == 0) + filename = g_string_append (filename, "."); + + filename = g_string_append (filename, "/test_%04u"); + if (mode == 1) + filename = g_string_append (filename, ".mp4"); + else + filename = g_string_append (filename, ".jpg"); + + /* init */ + if (setup_pipeline ()) { + loop = g_main_loop_new (NULL, FALSE); + g_idle_add ((GSourceFunc) run_pipeline, NULL); + g_main_loop_run (loop); + cleanup_pipeline (); + g_main_loop_unref (loop); + } + /* free */ + g_string_free (filename, TRUE); + g_free (ev_option); + g_free (audiosrc_name); + g_free (videosrc_name); + g_free (audioenc_name); + g_free (videoenc_name); + g_free (imageenc_name); + g_free (imagepp_name); + g_free (videomux_name); + g_free (vfsink_name); + g_free (src_csp); + g_free (target_times); + + if (window) + XDestroyWindow (display, window); + + if (display) + XCloseDisplay (display); + + return 0; +} |