[vlc-commits] [Git][videolan/vlc][master] 4 commits: input: decoder: split decoder_Init from LoadDecoder

Jean-Baptiste Kempf (@jbk) gitlab at videolan.org
Tue Aug 15 09:03:28 UTC 2023



Jean-Baptiste Kempf pushed to branch master at VideoLAN / VLC


Commits:
8daa3f65 by Alexandre Janniaux at 2023-08-15T08:50:17+00:00
input: decoder: split decoder_Init from LoadDecoder

decoder_Init() is setting up p_owner->dec whereas LoadDecoder will read
and write p_owner. To modify LoadDecoder, we want to ensure that the
fifo is locked, but we cannot lock the fifo for LoadDecoder.

Extracting the decoder_Init() ensure we can lock correctly afterwards.

Co-authored-by: Steve Lhomme <robux4 at ycbcr.xyz>

- - - - -
f19e27a4 by Alexandre Janniaux at 2023-08-15T08:50:17+00:00
input: decoder: fix data race on decoder format

We cannot read or write the decoder object without being under the fifo
lock, so ensure we locked first. It fixes some thread sanitizer issues
between decoder_Init() and vlc_input_decoder_Flush().

    WARNING: ThreadSanitizer: data race (pid=876901)
      Read of size 8 at 0x7b7000010028 by thread T25:
        #0 vlc_input_decoder_Flush ../../src/input/decoder.c:2317 (libvlccore.so.9+0x69d7a) (BuildId: 1912c3713753e3bafbd8f9b735ec069a39be1f4d)
        #1 EsOutDestroyDecoder ../../src/input/es_out.c:2360 (libvlccore.so.9+0x716cf) (BuildId: 1912c3713753e3bafbd8f9b735ec069a39be1f4d)
        #2 EsOutUnselectEs ../../src/input/es_out.c:2534 (libvlccore.so.9+0x7a1bd) (BuildId: 1912c3713753e3bafbd8f9b735ec069a39be1f4d)
        #3 EsOutVaPrivControlLocked ../../src/input/es_out.c:3733 (libvlccore.so.9+0x75832) (BuildId: 1912c3713753e3bafbd8f9b735ec069a39be1f4d)
        #4 EsOutPrivControl ../../src/input/es_out.c:4043 (libvlccore.so.9+0x783ad) (BuildId: 1912c3713753e3bafbd8f9b735ec069a39be1f4d)
        #5 es_out_in_vaPrivControl ../../src/input/es_out_timeshift.c:464 (libvlccore.so.9+0x81a06) (BuildId: 1912c3713753e3bafbd8f9b735ec069a39be1f4d)
        #6 es_out_in_PrivControl ../../src/input/es_out_timeshift.c:474 (libvlccore.so.9+0x81a06)
        #7 CmdExecutePrivControl ../../src/input/es_out_timeshift.c:1868 (libvlccore.so.9+0x81b78) (BuildId: 1912c3713753e3bafbd8f9b735ec069a39be1f4d)
        #8 PrivControlLocked ../../src/input/es_out_timeshift.c:758 (libvlccore.so.9+0x840be) (BuildId: 1912c3713753e3bafbd8f9b735ec069a39be1f4d)
        #9 PrivControl ../../src/input/es_out_timeshift.c:817 (libvlccore.so.9+0x840be)
        #10 es_out_vaPrivControl ../../src/input/es_out.h:105 (libvlccore.so.9+0x86f7c) (BuildId: 1912c3713753e3bafbd8f9b735ec069a39be1f4d)
        #11 es_out_PrivControl ../../src/input/es_out.h:112 (libvlccore.so.9+0x86f7c)
        #12 es_out_SetMode ../../src/input/es_out.h:119 (libvlccore.so.9+0x91ba9) (BuildId: 1912c3713753e3bafbd8f9b735ec069a39be1f4d)
        #13 End ../../src/input/input.c:1425 (libvlccore.so.9+0x91ba9)
        #14 Run ../../src/input/input.c:431 (libvlccore.so.9+0x920d4) (BuildId: 1912c3713753e3bafbd8f9b735ec069a39be1f4d)

      Previous write of size 8 at 0x7b7000010028 by thread T27:
        #0 decoder_Init ../../src/input/decoder_helpers.c:50 (libvlccore.so.9+0x6c1ce) (BuildId: 1912c3713753e3bafbd8f9b735ec069a39be1f4d)
        #1 LoadDecoder ../../src/input/decoder.c:370 (libvlccore.so.9+0x672ae) (BuildId: 1912c3713753e3bafbd8f9b735ec069a39be1f4d)
        #2 DecoderThread_Reload ../../src/input/decoder.c:431 (libvlccore.so.9+0x67593) (BuildId: 1912c3713753e3bafbd8f9b735ec069a39be1f4d)
        #3 DecoderThread_ProcessInput ../../src/input/decoder.c:1595 (libvlccore.so.9+0x687f9) (BuildId: 1912c3713753e3bafbd8f9b735ec069a39be1f4d)
        #4 DecoderThread_DecodeBlock ../../src/input/decoder.c:1562 (libvlccore.so.9+0x6865b) (BuildId: 1912c3713753e3bafbd8f9b735ec069a39be1f4d)
        #5 DecoderThread_ProcessInput ../../src/input/decoder.c:1667 (libvlccore.so.9+0x6895e) (BuildId: 1912c3713753e3bafbd8f9b735ec069a39be1f4d)
        #6 DecoderThread ../../src/input/decoder.c:1795 (libvlccore.so.9+0x6a487) (BuildId: 1912c3713753e3bafbd8f9b735ec069a39be1f4d)

- - - - -
6369ea50 by Alexandre Janniaux at 2023-08-15T08:50:17+00:00
input: decoder: lock fifo when reloading decoder

Reloading the decoder was never protected against races because
processing an input frame was done unprotected. The rationale behind was
that we cannot lock the vlc_input_decoder_t FIFO when calling any
function from the decoder_t object implementation.

This commit is broadening the locks everywhere but when:
 - the decoder is created (LoadDecoder)
 - the decoder is destroyed (decoder_Clean)
 - the decode callback is called on the decoder (decoder_t::pf_decode)

It fixes race conditions on the outputs (audio, video) and the usage of
the dec_fmt_in structure.

    WARNING: ThreadSanitizer: data race (pid=2404868)
      Write of size 8 at 0x7b7000010028 by thread T27:
        #0 decoder_Init ../../src/input/decoder_helpers.c:50 (libvlccore.so.9+0x6c1fe) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d)
        #1 DecoderThread_Reload ../../src/input/decoder.c:428 (libvlccore.so.9+0x67581) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d)
        #2 DecoderThread_ProcessInput ../../src/input/decoder.c:1593 (libvlccore.so.9+0x68829) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d)
        #3 DecoderThread_DecodeBlock ../../src/input/decoder.c:1560 (libvlccore.so.9+0x6868b) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d)
        #4 DecoderThread_ProcessInput ../../src/input/decoder.c:1665 (libvlccore.so.9+0x6898e) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d)
        #5 DecoderThread ../../src/input/decoder.c:1793 (libvlccore.so.9+0x6a4b7) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d)

      Previous read of size 8 at 0x7b7000010028 by thread T25:
        #0 vlc_input_decoder_Flush ../../src/input/decoder.c:2318 (libvlccore.so.9+0x69dc2) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d)
        #1 EsOutDestroyDecoder ../../src/input/es_out.c:2360 (libvlccore.so.9+0x716ff) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d)
        #2 EsOutUnselectEs ../../src/input/es_out.c:2534 (libvlccore.so.9+0x7a1ed) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d)
        #3 EsOutVaPrivControlLocked ../../src/input/es_out.c:3733 (libvlccore.so.9+0x75862) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d)
        #4 EsOutPrivControl ../../src/input/es_out.c:4043 (libvlccore.so.9+0x783dd) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d)
        #5 es_out_in_vaPrivControl ../../src/input/es_out_timeshift.c:464 (libvlccore.so.9+0x81a36) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d)
        #6 es_out_in_PrivControl ../../src/input/es_out_timeshift.c:474 (libvlccore.so.9+0x81a36)
        #7 CmdExecutePrivControl ../../src/input/es_out_timeshift.c:1868 (libvlccore.so.9+0x81ba8) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d)
        #8 PrivControlLocked ../../src/input/es_out_timeshift.c:758 (libvlccore.so.9+0x840ee) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d)
        #9 PrivControl ../../src/input/es_out_timeshift.c:817 (libvlccore.so.9+0x840ee)
        #10 es_out_vaPrivControl ../../src/input/es_out.h:105 (libvlccore.so.9+0x86fac) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d)
        #11 es_out_PrivControl ../../src/input/es_out.h:112 (libvlccore.so.9+0x86fac)
        #12 es_out_SetMode ../../src/input/es_out.h:119 (libvlccore.so.9+0x91bd9) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d)
        #13 End ../../src/input/input.c:1425 (libvlccore.so.9+0x91bd9)
        #14 Run ../../src/input/input.c:431 (libvlccore.so.9+0x92104) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d)

      Location is heap block of size 2008 at 0x7b7000010000 allocated by thread T25:
        #0 calloc /usr/src/debug/gcc/gcc/libsanitizer/tsan/tsan_interceptors_posix.cpp:701 (libtsan.so.2+0x43413) (BuildId: 7e8fcb9ed0a63b98f2293e37c92ac955413efd9e)
        #1 vlc_custom_create ../../src/misc/objects.c:97 (libvlccore.so.9+0x10e4c3) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d)
        #2 CreateDecoder ../../src/input/decoder.c:1873 (libvlccore.so.9+0x676cf) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d)
        #3 decoder_New ../../src/input/decoder.c:2132 (libvlccore.so.9+0x676cf)
        #4 vlc_input_decoder_New ../../src/input/decoder.c:2191 (libvlccore.so.9+0x698a0) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d)
        #5 EsOutCreateDecoder ../../src/input/es_out.c:2302 (libvlccore.so.9+0x786da) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d)
        #6 EsOutSelectEs ../../src/input/es_out.c:2444 (libvlccore.so.9+0x78ec3) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d)
        #7 EsOutSelect ../../src/input/es_out.c:2733 (libvlccore.so.9+0x7935a) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d)
        #8 EsOutVaPrivControlLocked ../../src/input/es_out.c:3737 (libvlccore.so.9+0x7713c) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d)
        #9 EsOutPrivControl ../../src/input/es_out.c:4043 (libvlccore.so.9+0x783dd) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d)
        #10 es_out_in_vaPrivControl ../../src/input/es_out_timeshift.c:464 (libvlccore.so.9+0x81a36) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d)
        #11 es_out_in_PrivControl ../../src/input/es_out_timeshift.c:474 (libvlccore.so.9+0x81a36)
        #12 CmdExecutePrivControl ../../src/input/es_out_timeshift.c:1868 (libvlccore.so.9+0x81ba8) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d)
        #13 PrivControlLocked ../../src/input/es_out_timeshift.c:758 (libvlccore.so.9+0x840ee) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d)
        #14 PrivControl ../../src/input/es_out_timeshift.c:817 (libvlccore.so.9+0x840ee)
        #15 es_out_vaPrivControl ../../src/input/es_out.h:105 (libvlccore.so.9+0x86fac) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d)
        #16 es_out_PrivControl ../../src/input/es_out.h:112 (libvlccore.so.9+0x86fac)
        #17 es_out_SetMode ../../src/input/es_out.h:119 (libvlccore.so.9+0x8d118) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d)
        #18 InitPrograms ../../src/input/input.c:1262 (libvlccore.so.9+0x8d118)
        #19 Init ../../src/input/input.c:1343 (libvlccore.so.9+0x8d118)
        #20 Run ../../src/input/input.c:426 (libvlccore.so.9+0x92064) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d)

      Thread T27 'vlc-dec-video' (tid=2404917, running) created by thread T25 at:
        #0 pthread_create /usr/src/debug/gcc/gcc/libsanitizer/tsan/tsan_interceptors_posix.cpp:1036 (libtsan.so.2+0x44219) (BuildId: 7e8fcb9ed0a63b98f2293e37c92ac955413efd9e)
        #1 vlc_clone_attr ../../src/posix/thread.c:180 (libvlccore.so.9+0x11f789) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d)
        #2 vlc_clone ../../src/posix/thread.c:191 (libvlccore.so.9+0x11f789)
        #3 decoder_New ../../src/input/decoder.c:2169 (libvlccore.so.9+0x67eea) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d)
        #4 vlc_input_decoder_New ../../src/input/decoder.c:2191 (libvlccore.so.9+0x698a0) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d)
        #5 EsOutCreateDecoder ../../src/input/es_out.c:2302 (libvlccore.so.9+0x786da) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d)
        #6 EsOutSelectEs ../../src/input/es_out.c:2444 (libvlccore.so.9+0x78ec3) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d)
        #7 EsOutSelect ../../src/input/es_out.c:2733 (libvlccore.so.9+0x7935a) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d)
        #8 EsOutVaPrivControlLocked ../../src/input/es_out.c:3737 (libvlccore.so.9+0x7713c) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d)
        #9 EsOutPrivControl ../../src/input/es_out.c:4043 (libvlccore.so.9+0x783dd) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d)
        #10 es_out_in_vaPrivControl ../../src/input/es_out_timeshift.c:464 (libvlccore.so.9+0x81a36) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d)
        #11 es_out_in_PrivControl ../../src/input/es_out_timeshift.c:474 (libvlccore.so.9+0x81a36)
        #12 CmdExecutePrivControl ../../src/input/es_out_timeshift.c:1868 (libvlccore.so.9+0x81ba8) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d)
        #13 PrivControlLocked ../../src/input/es_out_timeshift.c:758 (libvlccore.so.9+0x840ee) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d)
        #14 PrivControl ../../src/input/es_out_timeshift.c:817 (libvlccore.so.9+0x840ee)
        #15 es_out_vaPrivControl ../../src/input/es_out.h:105 (libvlccore.so.9+0x86fac) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d)
        #16 es_out_PrivControl ../../src/input/es_out.h:112 (libvlccore.so.9+0x86fac)
        #17 es_out_SetMode ../../src/input/es_out.h:119 (libvlccore.so.9+0x8d118) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d)
        #18 InitPrograms ../../src/input/input.c:1262 (libvlccore.so.9+0x8d118)
        #19 Init ../../src/input/input.c:1343 (libvlccore.so.9+0x8d118)
        #20 Run ../../src/input/input.c:426 (libvlccore.so.9+0x92064) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d)

      Thread T25 'vlc-input' (tid=2404915, running) created by main thread at:
        #0 pthread_create /usr/src/debug/gcc/gcc/libsanitizer/tsan/tsan_interceptors_posix.cpp:1036 (libtsan.so.2+0x44219) (BuildId: 7e8fcb9ed0a63b98f2293e37c92ac955413efd9e)
        #1 vlc_clone_attr ../../src/posix/thread.c:180 (libvlccore.so.9+0x11f789) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d)
        #2 vlc_clone ../../src/posix/thread.c:191 (libvlccore.so.9+0x11f789)
        #3 input_Start ../../src/input/input.c:131 (libvlccore.so.9+0x8a4a3) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d)
        #4 vlc_player_input_Start ../../src/player/input.c:96 (libvlccore.so.9+0x9e4a2) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d)
        #5 vlc_player_Start ../../src/player/player.c:1177 (libvlccore.so.9+0x998f0) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d)
        #6 play_scenario ../../test/src/input/decoder/input_decoder.c:260 (test_src_input_decoder+0x3295) (BuildId: 37860f3bd060e79331c2c7c0168bd76a7e275f6e)
        #7 OpenIntf ../../test/src/input/decoder/input_decoder.c:289 (test_src_input_decoder+0x3295)
        #8 generic_start ../../src/modules/modules.c:280 (libvlccore.so.9+0x3fca9) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d)
        #9 vlc_module_load ../../src/modules/modules.c:248 (libvlccore.so.9+0x40992) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d)
        #10 module_need ../../src/modules/modules.c:291 (libvlccore.so.9+0x40c39) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d)
        #11 intf_Create ../../src/interface/interface.c:173 (libvlccore.so.9+0x49a3a) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d)
        #12 libvlc_InternalAddIntf ../../src/interface/interface.c:268 (libvlccore.so.9+0x49e71) (BuildId: 177c3c73d277ee30e8dd794a139cdeda1889ec4d)
        #13 libvlc_add_intf ../../lib/playlist.c:41 (libvlc.so.12+0xd678) (BuildId: 9df6c3ada3ed68d6ad4df6e6a25454ae0f0d2376)
        #14 main ../../test/src/input/decoder/input_decoder.c:351 (test_src_input_decoder+0x2584) (BuildId: 37860f3bd060e79331c2c7c0168bd76a7e275f6e)

    SUMMARY: ThreadSanitizer: data race ../../src/input/decoder_helpers.c:50 in decoder_Init
    ==================

Fixes #27582

- - - - -
55ad5969 by Steve Lhomme at 2023-08-15T08:50:17+00:00
input: decoder: remove p_dec shortcut

p_dec is only used once, and p_dec->fmt_int references dec_fmt_in so
inline the p_owner->dec and dec->fmt_in in the call to avoid the
intermediate variable.

- - - - -


1 changed file:

- src/input/decoder.c


Changes:

=====================================
src/input/decoder.c
=====================================
@@ -364,11 +364,8 @@ static void Decoder_UpdateOutState(vlc_input_decoder_t *owner)
 /**
  * Load a decoder module
  */
-static int LoadDecoder( decoder_t *p_dec, bool b_packetizer, es_format_t *fmt_in,
-                        const es_format_t *restrict p_fmt )
+static int LoadDecoder(decoder_t *p_dec, bool b_packetizer, es_format_t *fmt_in)
 {
-    decoder_Init( p_dec, fmt_in, p_fmt );
-
     p_dec->b_frame_drop_allowed = true;
 
     /* Find a suitable decoder/packetizer module */
@@ -408,7 +405,9 @@ static int DecoderThread_Reload( vlc_input_decoder_t *p_owner,
     }
 
     /* Restart the decoder module */
+    vlc_fifo_Unlock(p_owner->p_fifo);
     decoder_Clean( p_dec );
+    vlc_fifo_Lock(p_owner->p_fifo);
     es_format_Clean( &p_owner->dec_fmt_in );
     p_owner->error = false;
 
@@ -428,12 +427,16 @@ static int DecoderThread_Reload( vlc_input_decoder_t *p_owner,
         }
     }
 
-    if( LoadDecoder( p_dec, false, &p_owner->dec_fmt_in, &fmt_in ) )
+    decoder_Init(p_dec, &p_owner->dec_fmt_in, &fmt_in);
+    vlc_fifo_Unlock(p_owner->p_fifo);
+    if (LoadDecoder(p_dec, false, &p_owner->dec_fmt_in))
     {
+        vlc_fifo_Lock(p_owner->p_fifo);
         p_owner->error = true;
         es_format_Clean( &fmt_in );
         return VLC_EGENERIC;
     }
+    vlc_fifo_Lock(p_owner->p_fifo);
     es_format_Clean( &fmt_in );
     return VLC_SUCCESS;
 }
@@ -1538,6 +1541,8 @@ static void DecoderThread_DecodeBlock( vlc_input_decoder_t *p_owner, vlc_frame_t
     decoder_t *p_dec = &p_owner->dec;
     struct vlc_tracer *tracer = vlc_object_get_tracer( &p_dec->obj );
 
+    vlc_fifo_Unlock(p_owner->p_fifo);
+
     if ( tracer != NULL && frame != NULL )
     {
         vlc_tracer_TraceStreamDTS( tracer, "DEC", p_owner->psz_id, "IN",
@@ -1545,6 +1550,8 @@ static void DecoderThread_DecodeBlock( vlc_input_decoder_t *p_owner, vlc_frame_t
     }
 
     int ret = p_dec->pf_decode( p_dec, frame );
+
+    vlc_fifo_Lock(p_owner->p_fifo);
     switch( ret )
     {
         case VLCDEC_SUCCESS:
@@ -1602,9 +1609,7 @@ static void DecoderThread_ProcessInput( vlc_input_decoder_t *p_owner, vlc_frame_
         if( frame->i_buffer <= 0 )
             goto error;
 
-        vlc_fifo_Lock(p_owner->p_fifo);
         DecoderUpdatePreroll( &p_owner->i_preroll_end, frame );
-        vlc_fifo_Unlock(p_owner->p_fifo);
         if( unlikely( frame->i_flags & BLOCK_FLAG_CORE_PRIVATE_RELOADED ) )
         {
             /* This frame has already been packetized */
@@ -1614,7 +1619,9 @@ static void DecoderThread_ProcessInput( vlc_input_decoder_t *p_owner, vlc_frame_
 
     if( p_owner->p_sout != NULL )
     {
+        vlc_fifo_Unlock(p_owner->p_fifo);
         DecoderThread_ProcessSout( p_owner, frame );
+        vlc_fifo_Lock(p_owner->p_fifo);
         return;
     }
     if( packetize )
@@ -1650,6 +1657,7 @@ static void DecoderThread_ProcessInput( vlc_input_decoder_t *p_owner, vlc_frame_
                 packetized_frame->p_next = NULL;
 
                 DecoderThread_DecodeBlock( p_owner, packetized_frame );
+
                 if( p_owner->error )
                 {
                     block_ChainRelease( p_next );
@@ -1790,11 +1798,11 @@ static void *DecoderThread( void *p_data )
              * drain. Pass frame = NULL to decoder just once. */
         }
 
-        vlc_fifo_Unlock( p_owner->p_fifo );
-
+        /* DecoderThread_ProcessInput will unlock when playing to the decoders
+         * but will ensure it re-locks in the end. This is necessary to handle
+         * reloading, CC and packetizing. */
         DecoderThread_ProcessInput( p_owner, frame );
 
-        vlc_fifo_Lock(p_owner->p_fifo);
         if( p_owner->b_draining && frame == NULL )
         {
             p_owner->b_draining = false;
@@ -1937,7 +1945,8 @@ CreateDecoder( vlc_object_t *p_parent, const struct vlc_input_decoder_cfg *cfg )
             vlc_custom_create( p_parent, sizeof( decoder_t ), "packetizer" );
         if( p_owner->p_packetizer )
         {
-            if( LoadDecoder( p_owner->p_packetizer, true, &p_owner->pktz_fmt_in, fmt ) )
+            decoder_Init(p_owner->p_packetizer, &p_owner->pktz_fmt_in, fmt);
+            if (LoadDecoder(p_owner->p_packetizer, true, &p_owner->pktz_fmt_in))
             {
                 vlc_object_delete(p_owner->p_packetizer);
                 p_owner->p_packetizer = NULL;
@@ -1970,7 +1979,8 @@ CreateDecoder( vlc_object_t *p_parent, const struct vlc_input_decoder_cfg *cfg )
     }
 
     /* Find a suitable decoder/packetizer module */
-    if( LoadDecoder( p_dec, cfg->sout != NULL, &p_owner->dec_fmt_in, fmt ) )
+    decoder_Init(p_dec, &p_owner->dec_fmt_in, fmt);
+    if (LoadDecoder(p_dec, cfg->sout != NULL, &p_owner->dec_fmt_in))
         return p_owner;
 
     assert( p_dec->fmt_in->i_cat == p_dec->fmt_out.i_cat && fmt->i_cat == p_dec->fmt_in->i_cat);
@@ -2208,8 +2218,6 @@ vlc_input_decoder_Create( vlc_object_t *p_parent, const es_format_t *fmt, const
 
 void vlc_input_decoder_Delete( vlc_input_decoder_t *p_owner )
 {
-    decoder_t *p_dec = &p_owner->dec;
-
     vlc_fifo_Lock( p_owner->p_fifo );
     p_owner->aborting = true;
     p_owner->b_waiting = false;
@@ -2229,7 +2237,7 @@ void vlc_input_decoder_Delete( vlc_input_decoder_t *p_owner )
     }
 
     /* Delete decoder */
-    DeleteDecoder( p_owner, p_dec->fmt_in->i_cat );
+    DeleteDecoder(p_owner, p_owner->dec_fmt_in.i_cat);
 }
 
 void vlc_input_decoder_Decode( vlc_input_decoder_t *p_owner, vlc_frame_t *frame,
@@ -2239,7 +2247,9 @@ void vlc_input_decoder_Decode( vlc_input_decoder_t *p_owner, vlc_frame_t *frame,
     {
         /* DecoderThread's fifo should be empty as no decoder thread is running. */
         assert( vlc_fifo_IsEmpty( p_owner->p_fifo ) );
+        vlc_fifo_Lock(p_owner->p_fifo);
         DecoderThread_ProcessInput( p_owner, frame );
+        vlc_fifo_Unlock(p_owner->p_fifo);
         return;
     }
 
@@ -2301,7 +2311,9 @@ void vlc_input_decoder_Drain( vlc_input_decoder_t *p_owner )
     if ( vlc_input_decoder_IsSynchronous( p_owner ) )
     {
         /* Process a NULL frame synchronously to signal draining to packetizer/decoder. */
+        vlc_fifo_Lock(p_owner->p_fifo);
         DecoderThread_ProcessInput( p_owner, NULL );
+        vlc_fifo_Unlock(p_owner->p_fifo);
         return;
     }
 
@@ -2313,9 +2325,8 @@ void vlc_input_decoder_Drain( vlc_input_decoder_t *p_owner )
 
 void vlc_input_decoder_Flush( vlc_input_decoder_t *p_owner )
 {
-    enum es_format_category_e cat = p_owner->dec.fmt_in->i_cat;
-
     vlc_fifo_Lock( p_owner->p_fifo );
+    enum es_format_category_e cat = p_owner->dec.fmt_in->i_cat;
 
     /* Empty the fifo */
     block_ChainRelease( vlc_fifo_DequeueAllUnlocked( p_owner->p_fifo ) );



View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/923c50352ec9e3387d749afd86103b3cbf77aaf9...55ad596993503aff5c0510fb45e40071500758f2

-- 
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/923c50352ec9e3387d749afd86103b3cbf77aaf9...55ad596993503aff5c0510fb45e40071500758f2
You're receiving this email because of your account on code.videolan.org.


VideoLAN code repository instance


More information about the vlc-commits mailing list