gint main (gint argc, gchar ** argv) { GError *error = NULL; gchar *uri = NULL; pid_t pid; init (&argc, &argv); if (argc < 2) { fprintf (stderr, "usage: %s [av-filename-or-url]\n", argv[0]); return 1; } if (!g_strstr_len (argv[1], -1, "://")) { uri = gst_filename_to_uri (argv[1], &error); } else { uri = g_strdup (argv[1]); } if (error) { fprintf (stderr, "usage: %s [av-filename-or-url]\n", argv[0]); g_clear_error (&error); return 1; } if (socketpair (AF_UNIX, SOCK_STREAM, 0, pipes)) { fprintf (stderr, "Error creating pipes: %s\n", strerror (errno)); return 2; } if (fcntl (pipes[0], F_SETFL, O_NONBLOCK) < 0 || fcntl (pipes[1], F_SETFL, O_NONBLOCK) < 0) { fprintf (stderr, "Error setting O_NONBLOCK on pipes: %s\n", strerror (errno)); return 2; } pid = fork (); if (pid < 0) { fprintf (stderr, "Error forking: %s\n", strerror (errno)); return 1; } else if (pid > 0) { setenv ("GST_DEBUG_FILE", "gstsrc.log", 1); gst_init (&argc, &argv); start_source (uri); } else { setenv ("GST_DEBUG_FILE", "gstsink.log", 1); gst_init (&argc, &argv); start_sink (); } g_free (uri); run (pid); return 0; }
void VideoMixer::setDimensions(int width, int height) { auto lock(rwMutex_.write()); width_ = width; height_ = height; // cleanup the previous frame to have a nice copy in rendering method std::shared_ptr<VideoFrame> previous_p(obtainLastFrame()); if (previous_p) yuv422_clear_to_black(*previous_p); start_sink(); }
std::shared_ptr<AudioSink> AudioSinksManager::create_new_sink(std::string name, std::string pretty_name) { auto internal_sink = std::shared_ptr<InternalAudioSink>( new InternalAudioSink(this, std::move(name), std::move(pretty_name))); auto sink = std::shared_ptr<AudioSink>(new AudioSink(internal_sink)); pa_mainloop.get_strand().dispatch([this, internal_sink]() { if (stopping) { internal_sink->free(); } else { logger->trace("(AudioSinkManager) Registering audio_sink '{}'", internal_sink->get_name()); audio_sinks.insert(internal_sink); sink_identifier_audio_sink.emplace(internal_sink->get_identifier(), internal_sink); if (pa_context_get_state(context) == PA_CONTEXT_READY) { internal_sink->start_sink(); } } }); return sink; }