Skip to content
  • Thibault Saunier's avatar
    v4l2dec: Fix race when going from PAUSED to READY · 7b7a8098
    Thibault Saunier authored
    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
    7b7a8098