コード例 #1
0
        static bool TickCb()
        {
            if (_sinks.Count == 0 || random.Next() % 2 == 0)
            {
                SinkStruct  sink  = new SinkStruct();
                PadTemplate templ = _tee.GetPadTemplate("src_%u");
                Console.Write("Add ... ");
                sink.teePad   = _tee.RequestPad(templ);
                sink.queue    = ElementFactory.Make("queue");
                sink.conv     = ElementFactory.Make("videoconvert");
                sink.sink     = ElementFactory.Make("autovideosink");
                sink.removing = 0;

                _pipeline.Add(sink.queue, sink.conv, sink.sink);
                if (!Element.Link(sink.queue, sink.conv, sink.sink))
                {
                    "Cannot link elements".PrintErr();
                    return(false);
                }
                sink.queue.SyncStateWithParent();
                sink.conv.SyncStateWithParent();
                sink.sink.SyncStateWithParent();

                using (var sinkPad = sink.queue.GetStaticPad("sink"))
                {
                    sink.teePad.Link(sinkPad);
                }
                Console.WriteLine("added");
                _sinks.AddLast(sink);
            }
            else
            {
                Console.Write("remove ... ");

                var sink = _sinks.Last.Value;
                _sinks.RemoveLast();
                sink.teePad.AddProbe(PadProbeType.Idle, GetUnlinkCb(sink));
            }
            return(true);
        }
コード例 #2
0
        static PadProbeCallback GetUnlinkCb(object userData)
        {
            SinkStruct sink = (SinkStruct)userData;

            PadProbeReturn UnlinkCb(Pad pad, PadProbeInfo info)
            {
                if (Interlocked.CompareExchange(ref sink.removing, 0, 1) == 1)
                {
                    return(PadProbeReturn.Ok);
                }

                using (var sinkPad = sink.queue.GetStaticPad("sink"))
                {
                    sink.teePad.Unlink(sinkPad);
                }

                _pipeline.Remove(sink.queue);
                _pipeline.Remove(sink.conv);
                _pipeline.Remove(sink.sink);

                sink.sink.SetState(State.Null);
                sink.conv.SetState(State.Null);
                sink.queue.SetState(State.Null);

                sink.queue.Dispose();
                sink.conv.Dispose();
                sink.sink.Dispose();
                _tee.ReleaseRequestPad(sink.teePad);
                sink.teePad.Dispose();

                Console.WriteLine("removed");

                return(PadProbeReturn.Remove);
            }

            return(UnlinkCb);
        }