Crash in GstBaseSink on EOF

Marko Mikkonen mmikkone at mail.student.oulu.fi
Mon Mar 7 08:18:58 PST 2011


PLEASE, I need SOMEONE to take a look at this. This looks to me like a 
bug in GStreamer itself or GstBaseSink or GstAudioBaseSink.

I had to recompile everything again to get rid of optimization, because 
it scrambled the debugger at last stages before the call to 
WSAWaitForMultipleEvents. What I found out was that in gst_poll_wait in 
gstpoll.c, the test "if (TEST_REBUILD (set))" on the line 1241 fails. If 
I comment out the test, the event gets set and my pipeline works:

/*    if (TEST_REBUILD (set)) {*/
       g_mutex_lock (set->lock);
#ifndef G_OS_WIN32
       g_array_set_size (set->active_fds, set->fds->len);
       memcpy (set->active_fds->data, set->fds->data,
           set->fds->len * sizeof (struct pollfd));
#else
       if (!gst_poll_prepare_winsock_active_sets (set))      /*If I 
comment out the if-clause, the execution reaches this line.*/
         goto winsock_error;
#endif
       g_mutex_unlock (set->lock);
/*    }*/

This is probably a bad hack and &(set)->rebuild that is tested in 
if-clause should be set earlier(???). But where? What's the purpose of 
&(set)->rebuild? Could someone PLEASE take a look at this! I'm a total 
n00b with GStreamer and I have next to no idea what this code does.

-Marko


6.3.2011 17:20, Marko Mikkonen kirjoitti:
> I'm developing a custom source plugin on Windows using MinGW and I'm 
> experiencing a crash at EOF event in GstBaseSink. My pipeline looks 
> like this:
>
> my_source_plugin ! decodebin2 ! directsoundsink
>
> My source plugin is essentially outputting an mp3 file. The sound 
> comes out without problems. At the end of file gstreamer goes to wait 
> for the playing to stop (afaik, on the basis that I've understood from 
> debugging these files). Then in gst_poll_wait, in the switch-case 
> block "GST_POLL_MODE_WINDOWS", WSAWaitForMultipleEvents is called with 
> zero event handle count and null event array pointer as arguments. The 
> function doesn't seem to like something and crashes. I can't debug any 
> further, because it's a Windows kernel function. I haven't found any 
> documentation which would say anything about the case when these 
> arguments are zero so I don't know if this is the real problem (but I 
> feel like it is).
>
> I'm not sure what my plugin is doing wrong. Maybe it's sending a wrong 
> length of media or something, but I still think GstBaseSink should not 
> crash in this case.
>
> The traceback of the crash point looks like this:
>
> Thread [8] 0 (Suspended : Breakpoint)
> Crash somewhere in here ->    WSAWaitForMultipleEvents()
>     gst_poll_wait() at gstpoll.c:1 376 0x6b7016a7
>     gst_system_clock_id_wait_jitter_unlocked() at gstsystemclock.c:619 
> 0x6b712a91
>     gst_clock_id_wait() at gstclock.c:467 0x6b6d4fe8
>     gst_base_sink_wait_clock() at gstbasesink.c:2 129 0x6caca295
>     gst_base_sink_wait_eos() at gstbasesink.c:2 324 0x6cad1283
>     gst_base_audio_sink_drain() at gstbaseaudiosink.c:866 0x7068853e
>     gst_base_audio_sink_event() at gstbaseaudiosink.c:894 0x7068deaf
>     gst_base_sink_render_object() at gstbasesink.c:2 908 0x6caca790
>     gst_base_sink_queue_object_unlocked() at gstbasesink.c:3 156 
> 0x6cacfcae
>     gst_base_sink_event() at gstbasesink.c:3 315 0x6cad0905
>     gst_pad_send_event() at gstpad.c:5 365 0x6b6f645d
>     gst_pad_push_event() at gstpad.c:5 217 0x6b6f6a15
>     gst_base_transform_sink_event() at gstbasetransform.c:1 956 
> 0x6cadb27a
>     gst_pad_send_event() at gstpad.c:5 365 0x6b6f645d
>     gst_pad_push_event() at gstpad.c:5 217 0x6b6f6a15
>     gst_pad_send_event() at gstpad.c:5 365 0x6b6f645d
>     gst_pad_push_event() at gstpad.c:5 217 0x6b6f6a15
>     gst_pad_send_event() at gstpad.c:5 365 0x6b6f645d
>     gst_pad_push_event() at gstpad.c:5 217 0x6b6f6a15
>     gst_pad_send_event() at gstpad.c:5 365 0x6b6f645d
> <...more frames...>
>
> The last function, WSAWaitForMultipleEvents, is called like this:
>
>         wait_ret = WSAWaitForMultipleEvents (set->active_events->len,
>             (HANDLE *) set->active_events->data, FALSE, t, FALSE);
>
> Here set->active_events->len and set->active_events->data are both 
> null. Variable t has some value (about 100-300, it varies).
>
> I have compiled everything myself and the gstreamer package is 
> gstreamer-0.10.32. I don't know how else to clarify this situation. 
> You can email me and ask for the values of variables in any of the 
> functions in the stack, if you need them.
>
> The question is of course: What is the problem and how to fix it?
>
> -Marko
> _______________________________________________
> gstreamer-devel mailing list
> gstreamer-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
>
>



More information about the gstreamer-devel mailing list