c++ - GStreamer multiple appsrc cause the application to crash -


i have problem gstreamer 1.0 when multiple appsrc used in same pipeline. pipeline receives data 2 different sources, , mix them single video using videomixer element. pipeline following:

 videomixer name=mix \  appsrc name=src0 ! video/x-raw,format=rgb,width=640,height=480,framerate=60/1 ! videoconvert  ! video/x-raw,format=i420  ! videobox left=-0  ! mix.sink_0 \  appsrc name=src1 ! video/x-raw,format=rgb,width=640,height=480,framerate=60/1 ! videoconvert  ! video/x-raw,format=i420  ! videobox left=-640  ! mix.sink_1 \  mix.  ! videoconvert ! autovideosink sync=false 

each appsrc registers callback functions using: gstappsrccallbacks

when run application, crashes after each appsrc receives 2 or 3 frames (it crashes randomly). no error being reported on console, or in pipeline bus message listener. don't error messages @ all.

if tried run single appsrc without mixer, runs without problem:

appsrc name=src0 ! video/x-raw,format=rgb,width=640,height=480,framerate=60/1 ! videoconvert  ! video/x-raw,format=i420  ! videoconvert ! autovideosink sync=false 

gstreamer version:1.5.2 / windows

edit here code using init appsrc:

gstappsrccallbacks srccb; gstappsrc* videosrc; videosrc = gst_app_src(gst_bin_get_by_name(gst_bin(getpipeline()), "src0")); srccb.need_data = &start_feed; srccb.enough_data = &stop_feed; srccb.seek_data = &seek_data; gst_app_src_set_callbacks(videosrc, &srccb, this, null);   static void start_feed(gstappsrc *source, guint size, gpointer data) {     videosrcdata* o = static_cast<videosrcdata*>(data);     if (o->sourceid == 0) {         gst_debug("start feeding");         o->sourceid = g_idle_add((gsourcefunc)read_data, o);     } }  static gboolean read_data(videosrcdata *d) {     gstflowreturn ret;      gstbuffer *buffer;     if (needbuffer(0, &buffer) == gst_flow_ok)     {         ret = gst_app_src_push_buffer(d->videosrc, buffer);         if (ret != gst_flow_ok){             ret = gst_app_src_end_of_stream(d->videosrc);             return false;         }     }     return true;  }  gstflowreturn needbuffer(gstmysrc * sink, gstbuffer ** buffer) {     if (!m_grabber->grabframe()) //ask video grabber prepare image frame     {         return gst_flow_error;     }     m_grabber->lock();      //get image frame     const video::imageinfo* ifo = m_grabber->getlastframe();     int len = ifo->imagedatasize;     gstmapinfo map;     gstbuffer* outbuf = gst_buffer_new_and_alloc(len);     gst_buffer_map(outbuf, &map, gst_map_write);     memcpy(map.data, ifo->imagedata, len);     gst_buffer_unmap(outbuf, &map);     m_grabber->unlock();     *buffer = outbuf;     return gst_flow_ok; } 

i confirmed data size , format matching requested 1 in pipeline caps

update 1:

after several trials, seems when 1 appsrc used in videomixer, application crash. example pipeline:

 videomixer name=mix \  appsrc name=src0 ! video/x-raw,format=rgb,width=640,height=480,framerate=60/1 ! videoconvert  ! video/x-raw,format=i420  ! videobox left=-0  ! mix.sink_0 \  videotestsrc ! video/x-raw,format=rgb,width=640,height=480,framerate=60/1 ! videoconvert  ! video/x-raw,format=i420  ! videobox left=-640  ! mix.sink_1 \  mix.  ! videoconvert ! autovideosink sync=false 

the thing see that's odd here:

gstappsrccallbacks srccb; gstappsrc* videosrc; videosrc = gst_app_src(gst_bin_get_by_name(gst_bin(getpipeline()), "src0")); srccb.need_data = &start_feed; srccb.enough_data = &stop_feed; srccb.seek_data = &seek_data; 

where point address of function, , should able assign it.

srccb.need_data = start_feed; srccb.enough_data = stop_feed; srccb.seek_data = seek_data; 

also, can try not using m_grabber object , see if works? make each appsrc fill buffer different color.

what using debug? if app crashes debugger should halt , allow examine active threads , find offending line number.


Comments