From 7ad4c74196815cd3a8956e5a8e3b3ad932cbad12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Canek=20Pel=C3=A1ez=20Vald=C3=A9s?= Date: Tue, 14 Apr 2020 11:14:28 -0500 Subject: [PATCH] Still doesn't work, let's try cutting branches. --- src/camera.vala | 145 ++++++++++++++++++++++++++++++++--------------- src/devices.vala | 26 ++++----- 2 files changed, 113 insertions(+), 58 deletions(-) diff --git a/src/camera.vala b/src/camera.vala index fed3713..c1058a9 100644 --- a/src/camera.vala +++ b/src/camera.vala @@ -51,12 +51,12 @@ namespace Fromage { private Gst.Element vq1; private Gst.Element vq2; private Gst.Element vq3; - private Gst.Element vq4; private Gst.Element tee; private Gst.Element dec; private Gst.Element vc; private Gst.Element text; private Gst.Element gtksink; + private Gst.Element dummy; private Gst.Element fakesink; private Gst.Element vc264; private Gst.Element x264enc; @@ -133,9 +133,6 @@ namespace Fromage { vsrc = videodev.device.create_element("vsrc"); filter = Gst.ElementFactory.make("capsfilter", "filter"); vq0 = Gst.ElementFactory.make("queue", "vq0"); - vq0.set("max-size-buffers", 0); - vq0.set("max-size-bytes", 0); - vq0.set("max-size-time", 1000000000); tee = Gst.ElementFactory.make("tee", "tee"); vq1 = Gst.ElementFactory.make("queue", "vq1"); vq1.set("leaky", 1); @@ -163,13 +160,10 @@ namespace Fromage { vsrc = videodev.device.create_element("vsrc"); filter = Gst.ElementFactory.make("capsfilter", "filter"); vq0 = Gst.ElementFactory.make("queue", "vq0"); - vq0.set("max-size-buffers", 0); - vq0.set("max-size-bytes", 0); - vq0.set("max-size-time", 1000000000); + parse = Gst.ElementFactory.make("h264parse", "parse"); tee = Gst.ElementFactory.make("tee", "tee"); vq1 = Gst.ElementFactory.make("queue", "vq1"); vq1.set("leaky", 1); - parse = Gst.ElementFactory.make("h264parse", "parse"); dec = Gst.ElementFactory.make("avdec_h264", "dec"); vc = Gst.ElementFactory.make("videoconvert", "vc"); text = Gst.ElementFactory.make("textoverlay", "text"); @@ -178,15 +172,16 @@ namespace Fromage { text.set("valignment", 2); gtksink = Gst.ElementFactory.make("gtksink", "gtksink"); vq2 = Gst.ElementFactory.make("queue", "vq2"); + dummy = Gst.ElementFactory.make("capsfilter", "dummy"); fakesink = Gst.ElementFactory.make("fakesink", "fakesink"); fakesink.set("async", false); - pipeline.add_many(vsrc, filter, vq0, tee, - vq1, parse, dec, vc, text, gtksink, - vq2, fakesink); - vsrc.link_many(filter, vq0, tee); - tee.link_many(vq1, parse, dec, vc, text, gtksink); - tee.link_many(vq2, fakesink); + pipeline.add_many(vsrc, filter, parse, vq0, tee, + vq1, dec, vc, text, gtksink, + vq2, dummy, fakesink); + vsrc.link_many(filter, parse, vq0, tee); + tee.link_many(vq1, dec, vc, text, gtksink); + tee.link_many(vq2, dummy, fakesink); } /** @@ -227,9 +222,6 @@ namespace Fromage { Gst.PadProbeInfo info) { pad.remove_probe(info.id); if (saving) { - fakesink.set_state(Gst.State.NULL); - pipeline.remove(fakesink); - if (videodev.is_test) return set_videotest_filesink(); if (setup.media_type == VideoSetup.RAW) @@ -274,12 +266,17 @@ namespace Fromage { private Gst.PadProbeReturn set_v4l2h264_fakesink() { stderr.printf("set_v4l2h264_fakesink\n"); - var srcpad = vq3.get_static_pad("src"); + var srcpad = mp4mux.get_static_pad("src"); srcpad.add_probe(Gst.PadProbeType.BLOCK | Gst.PadProbeType.EVENT_DOWNSTREAM, - flush_v4l2h264_filesink); - - var sinkpad = vq3.get_static_pad("sink"); + replace_v4l2h264_filesink); + + string pad_name = ""; + mp4mux.foreach_sink_pad((e, p) => { + pad_name = p.name; + return GLib.Source.REMOVE; + }); + var sinkpad = mp4mux.get_static_pad(pad_name); sinkpad.send_event(new Gst.Event.eos()); return Gst.PadProbeReturn.OK; @@ -291,9 +288,6 @@ namespace Fromage { x264enc.set("speed-preset", 6); mp4mux = Gst.ElementFactory.make("mpegtsmux", "mp4mux"); vq3 = Gst.ElementFactory.make("queue", "vq3"); - vq3.set("max-size-buffers", 0); - vq3.set("max-size-bytes", 0); - vq3.set("max-size-time", 1000000000); filesink = Gst.ElementFactory.make("filesink", "filesink"); filesink.set("location", "/home/canek/test.mp4"); @@ -310,9 +304,6 @@ namespace Fromage { x264enc.set("speed-preset", 6); mp4mux = Gst.ElementFactory.make("mpegtsmux", "mp4mux"); vq3 = Gst.ElementFactory.make("queue", "vq3"); - vq3.set("max-size-buffers", 0); - vq3.set("max-size-bytes", 0); - vq3.set("max-size-time", 1000000000); filesink = Gst.ElementFactory.make("filesink", "filesink"); filesink.set("location", "/home/canek/test.mp4"); @@ -324,27 +315,65 @@ namespace Fromage { } private Gst.PadProbeReturn set_v4l2h264_filesink() { - vq3 = Gst.ElementFactory.make("queue", "vq3"); - vq3.set("max-size-buffers", 0); - vq3.set("max-size-bytes", 0); - vq3.set("max-size-time", 1000000000); + stderr.printf("set_v4l2h264_filesink\n"); + var srcpad = dummy.get_static_pad("src"); + srcpad.add_probe(Gst.PadProbeType.BLOCK | + Gst.PadProbeType.EVENT_DOWNSTREAM, + replace_v4l2h264_fakesink); + + var sinkpad = dummy.get_static_pad("sink"); + sinkpad.send_event(new Gst.Event.eos()); + + return Gst.PadProbeReturn.OK; + } + + private Gst.PadProbeReturn + replace_v4l2h264_fakesink(Gst.Pad pad, Gst.PadProbeInfo info) { + stderr.printf("replace_v4l2h264_fakesink: %s\n", pad.get_parent_element().name); + var event = info.get_event(); + if (event == null || event.type != Gst.EventType.EOS) + return Gst.PadProbeReturn.PASS; + + pad.remove_probe(info.id); + dummy.set_state(Gst.State.NULL); + fakesink.set_state(Gst.State.NULL); + stderr.printf("Removing dummy fakesink\n"); + pipeline.remove_many(dummy, fakesink); + mp4mux = Gst.ElementFactory.make("mpegtsmux", "mp4mux"); - vq4 = Gst.ElementFactory.make("queue", "vq4"); - vq4.set("max-size-buffers", 0); - vq4.set("max-size-bytes", 0); - vq4.set("max-size-time", 1000000000); + vq3 = Gst.ElementFactory.make("queue", "vq3"); filesink = Gst.ElementFactory.make("filesink", "filesink"); filesink.set("location", "/home/canek/test.mp4"); - pipeline.add_many(vq3, mp4mux, vq4, filesink); - vq2.link_many(vq3, mp4mux, vq4, filesink); + pipeline.add_many(mp4mux, vq3, filesink); + vq2.link_many(mp4mux, vq3, filesink); + mp4mux.set_state(Gst.State.PLAYING); vq3.set_state(Gst.State.PLAYING); + filesink.set_state(Gst.State.PLAYING); - return Gst.PadProbeReturn.DROP; + return Gst.PadProbeReturn.REMOVE; } + + // private Gst.PadProbeReturn set_v4l2h264_filesink() { + // mp4mux = Gst.ElementFactory.make("mpegtsmux", "mp4mux"); + // vq3 = Gst.ElementFactory.make("queue", "vq3"); + // vq3.set("max-size-buffers", 0); + // vq3.set("max-size-bytes", 0); + // vq3.set("max-size-time", 1000000000); + // filesink = Gst.ElementFactory.make("filesink", "filesink"); + // filesink.set("location", "/home/canek/test.mp4"); + + // pipeline.add_many(mp4mux, vq3, filesink); + // vq2.link_many(mp4mux, vq3, filesink); + // mp4mux.set_state(Gst.State.PLAYING); + + // return Gst.PadProbeReturn.DROP; + // } + private Gst.PadProbeReturn flush_videotest_filesink(Gst.Pad pad, Gst.PadProbeInfo info) { + stderr.printf("pad: %s\n", pad.name); var event = info.get_event(); if (event == null || event.type != Gst.EventType.EOS) return Gst.PadProbeReturn.PASS; @@ -358,27 +387,34 @@ namespace Fromage { pipeline.add(fakesink); vq2.link(fakesink); fakesink.set_state(Gst.State.PLAYING); + return Gst.PadProbeReturn.DROP; } private Gst.PadProbeReturn - flush_v4l2h264_filesink(Gst.Pad pad, Gst.PadProbeInfo info) { - stderr.printf("flush_v4l2h264_filesink\n"); + replace_v4l2h264_filesink(Gst.Pad pad, Gst.PadProbeInfo info) { + stderr.printf("repace_v4l2h264_filesink: %s\n", pad.get_parent_element().name); var event = info.get_event(); if (event == null || event.type != Gst.EventType.EOS) return Gst.PadProbeReturn.PASS; pad.remove_probe(info.id); + mp4mux.set_state(Gst.State.NULL); vq3.set_state(Gst.State.NULL); - pipeline.remove_many(vq3, mp4mux, vq4, filesink); + filesink.set_state(Gst.State.NULL); + stderr.printf("Removing mp4mux vq3 filesink\n"); + pipeline.remove_many(mp4mux, vq3, filesink); + dummy = Gst.ElementFactory.make("capsfilter", "dummy"); fakesink = Gst.ElementFactory.make("fakesink", "fakesink"); fakesink.set("async", false); - pipeline.add(fakesink); - vq2.link(fakesink); + + pipeline.add_many(dummy, fakesink); + vq2.link_many(dummy, fakesink); + dummy.set_state(Gst.State.PLAYING); fakesink.set_state(Gst.State.PLAYING); - - return Gst.PadProbeReturn.DROP; + + return Gst.PadProbeReturn.REMOVE; } /* Starts the camera asynchronously. */ @@ -433,6 +469,12 @@ namespace Fromage { switch (message.type) { case Gst.MessageType.STATE_CHANGED: return; + // case Gst.MessageType.STREAM_STATUS: + // Gst.StreamStatusType type; + // unowned Gst.Element owner; + // message.parse_stream_status(out type, out owner); + // stderr.printf("%s: %s\n", owner.name, ss(type)); + // return; case Gst.MessageType.ERROR: GLib.Error error; string debug; @@ -441,5 +483,18 @@ namespace Fromage { return; } } + + // private string ss(Gst.StreamStatusType sst) { + // switch (sst) { + // case CREATE: return "create"; + // case ENTER: return "enter"; + // case LEAVE: return "leave"; + // case DESTROY: return "destroy"; + // case START: return "start"; + // case PAUSE: return "pause"; + // case STOP: return "stop"; + // } + // return "invalid"; + // } } } diff --git a/src/devices.vala b/src/devices.vala index f26028b..f985967 100644 --- a/src/devices.vala +++ b/src/devices.vala @@ -51,13 +51,13 @@ namespace Fromage { while (t != null) { switch (t.data.get_device_class()) { case "Audio/Source": - stderr.printf("%s: %s\n", t.data.get_name(), - t.data.get_display_name()); - var caps = t.data.get_caps(); - for (uint i = 0; i < caps.get_size(); i++) { - var st = caps.get_structure(i).copy(); - stderr.printf("\t%s\n", st.to_string()); - } + // stderr.printf("%s: %s\n", t.data.get_name(), + // t.data.get_display_name()); + // var caps = t.data.get_caps(); + // for (uint i = 0; i < caps.get_size(); i++) { + // var st = caps.get_structure(i).copy(); + // stderr.printf("\t%s\n", st.to_string()); + // } //audio_devices.add(new AudioDevice(t.data)); break; case "Video/Source": @@ -67,12 +67,12 @@ namespace Fromage { t = t.next; } - foreach (var vd in video_devices) { - stderr.printf("%s:\n", vd.name); - foreach (var vs in vd.setups) { - stderr.printf("\t%s:\n", vs.to_string()); - } - } + // foreach (var vd in video_devices) { + // stderr.printf("%s:\n", vd.name); + // foreach (var vs in vd.setups) { + // stderr.printf("\t%s:\n", vs.to_string()); + // } + // } } private bool monitor_devices(Gst.Bus bus, Gst.Message message) { -- GitLab