mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 20:21:24 +00:00
7b7a809818
Running `gst-validate-launcher -t validate.file.playback.change_state_intensive.vorbis_vp8_1_webm` on odroid XU4 (s5p-mfc v4l2 driver) often leads to: ERROR:../subprojects/gst-plugins-good/sys/v4l2/gstv4l2videodec.c:215:gst_v4l2_video_dec_stop: assertion failed: (g_atomic_int_get (&self->processing) == FALSE) This happens when the following race happens: - T0: Main thread - T1: Upstream streaming thread - T2. v4l2dec processing thread) [The decoder is in PAUSED state] T0. The validate scenario runs `Executing (36/40) set-state: state=null repeat=40` T1- The decoder handles a frame T2- A decoded frame is push downstream T2- Downstream returns FLUSHING as it is already flushing changing state T2- The decoder stops its processing thread and sets `->processing = FALSE` T1- The decoder handles another frame T1- `->process` is FALSE so the decoder restarts its streaming thread T0- In v4l2dec-> stop the processing thread is stopped NOTE: At this point the processing thread loop never started. T0- assertion failed: (g_atomic_int_get (&self->processing) == FALSE) Here I am removing the whole ->processing logic to base it all on the GstTask state to avoid duplicating the knowledge. https://bugzilla.gnome.org/show_bug.cgi?id=778830 |
||
---|---|---|
.. | ||
ext | ||
gstv4l2.c | ||
gstv4l2allocator.c | ||
gstv4l2allocator.h | ||
gstv4l2bufferpool.c | ||
gstv4l2bufferpool.h | ||
gstv4l2colorbalance.c | ||
gstv4l2colorbalance.h | ||
gstv4l2deviceprovider.c | ||
gstv4l2deviceprovider.h | ||
gstv4l2object.c | ||
gstv4l2object.h | ||
gstv4l2radio.c | ||
gstv4l2radio.h | ||
gstv4l2sink.c | ||
gstv4l2sink.h | ||
gstv4l2src.c | ||
gstv4l2src.h | ||
gstv4l2transform.c | ||
gstv4l2transform.h | ||
gstv4l2tuner.c | ||
gstv4l2tuner.h | ||
gstv4l2videodec.c | ||
gstv4l2videodec.h | ||
gstv4l2vidorient.c | ||
gstv4l2vidorient.h | ||
Makefile.am | ||
meson.build | ||
README | ||
tuner.c | ||
tuner.h | ||
tunerchannel.c | ||
tunerchannel.h | ||
tunernorm.c | ||
tunernorm.h | ||
v4l2-utils.c | ||
v4l2-utils.h | ||
v4l2_calls.c | ||
v4l2_calls.h |
v4l2 plugins ============ The idea is a bit the same as the idea for the v4l1 plugins. We want one generic v4l2element, and a few child objects (probably only two: v4l2src and v4l2sink): /-------- v4l2src v4l2element ---= \-------- v4l2sink Both v4l2src and v4l2sink have a uncompressed and a compressed recording-/playback-mode. Since this is all part of v4l2, the 'client' of these elements, i.e. an application using v4l2src/v4l2sink, will hardly notice this. All capsnego stuff is done inside, and the plugin knows which formats are compressed and which are not. Please note that the v4l1 and the v4l2 plugins are *not* compatible concerning properties. Naming has been kept the same where possible, but in some cases, properties had to be removed or added to make full use of v4l2. V4L2 API: http://linux.bytesex.org/v4l2/. http://v4l2spec.bytesex.org/ /usr/include/linux/videodev2.h or Kernel patches available from http://dl.bytesex.org/patches/. Articles: http://lwn.net/Articles/203924/