[gst-devel] realvideodec element blocked when close_library (in transition of NULL to READY), why?

Lukas Ruetz lukas.ruetz at gmx.at
Thu Nov 19 11:56:33 CET 2009


Hi,

Am Donnerstag, den 19.11.2009, 17:44 +0800 schrieb wuzw:
> hi all:
>     I wrote my gst app which used realvideodec element like
> this( ignored some non-significant code):
>  
> main()
> {
>     ........
>     pthread_creat(&my_thread, null, create_pipe_func, null);
>  
>     while(1)
>     {
>         c = getchar();
>  
>         if(c = 'b')
>         {
>             sleep(10);
>         }
>     }
>     
> }
>  
> create_pipe_func()
> {
>      loop = g_main_loop_new(null, false);
>      pipeline = _create_pipeline();//make all element and link them,
> set pad-added callback for delayed link to realvideodec sink pad
>      gst_element_set_state(pipeline, GST_STATE_PLAYING);
>  
>      g_mainn_loop_run(loop);
> }
>  
> my pipeline is like this:
> filesrc --> rmdemux --> realvideodec --> fakesink
>  
> my problem is:
>  
> I use the app to play rv4 file, and stream thread blocked on
> close_library().
> gst log like this(sorry, I can not copy and paste for some reason, so
> i type some significant logs):
> ------------------------------------------------------------------------------------------------
> gstelement.c:2496:gst_element_set_state_func:<realvideodec0> final:
> set state from NULL to READY
> gstrealvideodec.c:456:open_library:<realvideodec0> Attempting to open
> shared library for real video version 2
> ....
> gstrealvideodec.c:557:close_library:<realvideodec0> closing library
> module
> gstrealvideodec.c:456:open_library:<realvideodec0> Attempting to open
> shared library for real video version 3
> ....
> gstrealvideodec.c:557:close_library:<realvideodec0> closing library
> module
> ------------------------------------------------------------------------------------------------
>  
> no more things logged. I added some print to glib source code and
> found that dlclose() blocked.
>  
> if  i input 'b' now , stream tread unblocked and went on correctly.
>  
>  
>  
>  
> If my code like :
> main()
> {
>     ........
>     create_pipe_func();
>  
>         
> }
>  
> create_pipe_func()
> {
>      loop = g_main_loop_new(null, false);
>      pipeline = _create_pipeline();//make all element and link them,
> set pad-added callback for delayed link to realvideodec sink pad
>      gst_element_set_state(pipeline, GST_STATE_PLAYING);
>  
>      g_mainn_loop_run(loop);
> }
>  
> every thing is ok. 
> why? 
>  

Have you initialized glib-threading?

main () {
  ...
  g_thread_init( NULL );
  gst_init( &argc, &argv );
  ...
}

Maybe it's safer to use the glib threading functions - at least it works
for me.

lukas






More information about the gstreamer-devel mailing list