main: Allow to pass different devices and height/width
[apps/camera-gstreamer.git] / app / main.cpp
index fff9c4c..d4c0671 100644 (file)
@@ -23,8 +23,6 @@
 #include <gst/video/videooverlay.h>
 #include <gst/wayland/wayland.h>
 
-#define DEFAULT_VIDEO_DEVICE   "/dev/video0"
-
 // these only applies if the window is a dialog/pop-up one
 // by default the compositor make the window maximized
 #define WINDOW_WIDTH_SIZE      640
@@ -160,7 +158,9 @@ get_next_buffer(struct window *window)
         * the 'old' one and force creation of the buffer with the newer
         * dimensions */
        if (window->wait_for_configure && window->maximized) {
-               if (!window->buffers[0].busy) {
+               /* The 'old' buffer might not exist if maximized is received
+                * from the start. */
+               if (window->buffers[0].buffer && !window->buffers[0].busy) {
                        wl_buffer_destroy(window->buffers[0].buffer);
                        window->buffers[0].buffer = NULL;
                        window->wait_for_configure = false;
@@ -652,6 +652,12 @@ int main(int argc, char *argv[])
        struct receiver_data receiver_data = {};
        struct display *display;
        struct window *window;
+       const char *camera_device = NULL;
+       const char *width_str = NULL;
+       const char *height_str = NULL;
+       int width;
+       int height;
+
        char pipeline_str[1024];
        GError *error = NULL;
        const char *app_id = "camera-gstreamer";
@@ -667,9 +673,24 @@ int main(int argc, char *argv[])
        gargv[0] = strdup(argv[0]);
        gargv[1] = strdup("--gst-debug-level=2");
 
+       camera_device = getenv("DEFAULT_V4L2_DEVICE");
+       if (!camera_device)
+               camera_device = get_first_camera_device();
+       width_str = getenv("DEFAULT_V4L2_DEVICE_WIDTH");
+       if (!width_str)
+               width = WINDOW_WIDTH_SIZE;
+       else
+               width = atoi(width_str);
+
+       height_str = getenv("DEFAULT_V4L2_DEVICE_HEIGHT");
+       if (!height_str)
+               height = WINDOW_HEIGHT_SIZE;
+       else
+               height = atoi(height_str);
+
        memset(pipeline_str, 0, sizeof(pipeline_str));
        snprintf(pipeline_str, sizeof(pipeline_str), "v4l2src device=%s ! video/x-raw,width=%d,height=%d ! waylandsink", 
-               DEFAULT_VIDEO_DEVICE, WINDOW_WIDTH_SIZE, WINDOW_HEIGHT_SIZE);
+               camera_device, width, height);
        gst_init(&gargc, &gargv);
 
        setbuf(stdout, NULL);
@@ -679,7 +700,7 @@ int main(int argc, char *argv[])
        GstElement *pipeline = gst_parse_launch(pipeline_str, &error);
        if (error || !pipeline) {
                fprintf(stderr, "gstreamer pipeline construction failed!\n");
-               free(argv);
+               free(gargv);
                return EXIT_FAILURE;
        }
 
@@ -702,7 +723,7 @@ int main(int argc, char *argv[])
        window = create_window(display, WINDOW_WIDTH_SIZE, WINDOW_HEIGHT_SIZE, app_id); 
 
        if (!window) {
-               free(argv);
+               free(gargv);
                return EXIT_FAILURE;
        }
 
@@ -733,7 +754,7 @@ int main(int argc, char *argv[])
 
        destroy_window(window);
        destroy_display(display);
-       free(argv);
+       free(gargv);
 
        gst_element_set_state(pipeline, GST_STATE_NULL);
        gst_object_unref(pipeline);