[Bug 755400] New: splitmuxsink: deadlocks when inserted into running pipeline

GStreamer (GNOME Bugzilla) bugzilla at gnome.org
Tue Sep 22 02:48:45 PDT 2015


https://bugzilla.gnome.org/show_bug.cgi?id=755400

            Bug ID: 755400
           Summary: splitmuxsink: deadlocks when inserted into running
                    pipeline
    Classification: Platform
           Product: GStreamer
           Version: git master
                OS: Linux
            Status: NEW
          Severity: normal
          Priority: Normal
         Component: gst-plugins-good
          Assignee: gstreamer-bugs at lists.freedesktop.org
          Reporter: knorr.jesper at gmail.com
        QA Contact: gstreamer-bugs at lists.freedesktop.org
     GNOME version: ---

Created attachment 311839
  --> https://bugzilla.gnome.org/attachment.cgi?id=311839&action=edit
test case

Inserting splitmuxsink into a running pipeline causes a deadlock for the
configuration described here.
The use case is to have a live source of video+audio running continuously, with
the possibility of starting a recording using splitmuxsink. 

A test case is provided as an attachment.

The initial pipeline is as follows:

audiotestsrc is-live=true ! faac ! aacparse ! audio/mpeg,stream-format=raw !
queue ! fakesink
videotestsrc is-live=true ! x264enc key-int-max=10 ! h264parse !
video/x-h264,alignment=au,stream-format=avc ! queue ! fakesink

After 10s blocking pad probes are installed on the src pads of the two queues.
The fakesinks are removed from the pipeline, and a new splitmuxsink is created
and inserted.
The state of the splitmuxsink is set to PLAYING, and the block probes are
removed.

A few buffers are received on the sinkpad of the multiqueue inside the
splitmuxsink, but then dataflow stops.

Using GDB, I can see that the streaming thread of the audio queue srcpad is
waiting in gstsplitmuxsink.c:1071

          GST_LOG_OBJECT (pad, "Sleeping for GOP start");
------>   GST_SPLITMUX_WAIT (splitmux);
          GST_LOG_OBJECT (pad, "Done sleeping for GOP start state now %d",
              splitmux->state);

The thread for the video src pad is waiting in gstmultiqueue.c:1938 with an
allocation type query.

1925           GST_DEBUG_OBJECT (mq,
1926               "SingleQueue %d : Enqueuing query %p of type %s with id %d",
1927               sq->id, query, GST_QUERY_TYPE_NAME (query), curid);
1928           GST_MULTI_QUEUE_MUTEX_UNLOCK (mq);
1929           res = gst_data_queue_push (sq->queue, (GstDataQueueItem *)
item);
1930           GST_MULTI_QUEUE_MUTEX_LOCK (mq);
1931           /* it might be that the query has been taken out of the queue
1932            * while we were unlocked. So, we need to check if the last
1933            * handled query is the same one than the one we just
1934            * pushed. If it is, we don't need to wait for the condition
1935            * variable, otherwise we wait for the condition variable to
1936            * be signaled. */
1937           if (sq->last_handled_query != query)
1938             g_cond_wait (&sq->query_handled, &mq->qlock);

For debugging purposes, I tried dropping any allocation queries on the srcpads
of the queues. This changes the behaviour a bit. A few more buffers reaches the
multiqueue, but dataflow still stalls.

The audio streaming thread still stalls waiting for GOP complete. The video
thread is waiting in gstdataqueue.c:520, which seems to indicate that the queue
is full. Several GOPs are queued, but the output file is still empty.

The tests have been done using 1.5.91. Pipeline works just fine if the
splitmuxsink is used from the beginning instead of the fakesinks.

-- 
You are receiving this mail because:
You are the QA Contact for the bug.
You are the assignee for the bug.


More information about the gstreamer-bugs mailing list