v4l2dec: Fix race when going from PAUSED to READY
authorThibault Saunier <thibault.saunier@osg.samsung.com>
Fri, 17 Feb 2017 13:01:08 +0000 (10:01 -0300)
committerThibault Saunier <thibault.saunier@osg.samsung.com>
Fri, 7 Apr 2017 14:31:03 +0000 (11:31 -0300)
commit7b7a809818a0fa77dee1e340b42473a1e6e9ea8a
treec0067bd5ef8d77289fd32faf5e20c66aa88de096
parente4da670a1a287a8b82d701b62c3808a26cc53098
v4l2dec: Fix race when going from PAUSED to READY

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
sys/v4l2/gstv4l2videodec.c
sys/v4l2/gstv4l2videodec.h