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
Post a Comment