#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
* 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;
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";
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);
+
fprintf(stdout, "Using pipeline: %s\n", pipeline_str);
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;
}
window = create_window(display, WINDOW_WIDTH_SIZE, WINDOW_HEIGHT_SIZE, app_id);
if (!window) {
- free(argv);
+ free(gargv);
return EXIT_FAILURE;
}
destroy_window(window);
destroy_display(display);
- free(argv);
+ free(gargv);
gst_element_set_state(pipeline, GST_STATE_NULL);
gst_object_unref(pipeline);