bool ofGstUtils::setPipelineWithSink(string pipeline){ bHavePixelsChanged = false; bIsCustomWithSink = true; gstData.loop = g_main_loop_new (NULL, FALSE); gchar* pipeline_string = g_strdup((pipeline).c_str()); GError * error = NULL; gstPipeline = gst_parse_launch (pipeline_string, &error); ofLog(OF_LOG_NOTICE, "gstreamer pipeline: %s", pipeline_string); if(error!=NULL){ ofLog(OF_LOG_ERROR,"couldnt create pipeline: " + string(error->message)); return false; } gstSink = gst_bin_get_by_name(GST_BIN(gstPipeline),"sink"); gst_base_sink_set_sync(GST_BASE_SINK(gstSink), true); return startPipeline(); }
bool ofGstUtils::setPipelineWithSink(GstElement * pipeline, GstElement * sink, bool isStream_){ gstPipeline = pipeline; gstSink = sink; isStream = isStream_; if(gstSink){ gst_base_sink_set_sync(GST_BASE_SINK(gstSink), true); } if(gstSink && string(gst_plugin_feature_get_name( GST_PLUGIN_FEATURE(gst_element_get_factory(gstSink))))=="appsink"){ isAppSink = true; }else{ isAppSink = false; } return startPipeline(); }
bool ofGstUtils::loadMovie(string name){ bpp = 24; bLoaded = false; bPaused = true; speed = 1.0f; bHavePixelsChanged = false; if( name.find( "://",0 ) == string::npos){ name = "file://"+ofToDataPath(name,true); bIsStream = false; }else{ bIsStream = true; } ofLog(OF_LOG_VERBOSE,"loading "+name); gstData.loop = g_main_loop_new (NULL, FALSE); gstPipeline = gst_element_factory_make("playbin","player"); g_object_set(G_OBJECT(gstPipeline), "uri", name.c_str(), (void*)NULL); // create the oF appsink for video rgb without sync to clock gstSink = gst_element_factory_make("appsink", NULL); GstCaps *caps = gst_caps_new_simple("video/x-raw-rgb", "bpp", G_TYPE_INT, 24, //"depth", G_TYPE_INT, 24, /*"endianness",G_TYPE_INT,4321, "red_mask",G_TYPE_INT,0xff0000, "green_mask",G_TYPE_INT,0x00ff00, "blue_mask",G_TYPE_INT,0x0000ff,*/ NULL); gst_app_sink_set_caps(GST_APP_SINK(gstSink), caps); gst_caps_unref(caps); gst_base_sink_set_sync(GST_BASE_SINK(gstSink), false); g_object_set (G_OBJECT(gstPipeline),"video-sink",gstSink,(void*)NULL); GstElement *audioSink = gst_element_factory_make("gconfaudiosink", NULL); g_object_set (G_OBJECT(gstPipeline),"audio-sink",audioSink,(void*)NULL); return startPipeline();; }
bool ofGstUtils::setPipelineWithSink(string pipeline){ bHavePixelsChanged = false; bIsCustomWithSink = true; gstData.loop = g_main_loop_new (NULL, FALSE); gchar* pipeline_string = g_strdup((pipeline).c_str()); GError * error = NULL; gstPipeline = gst_parse_launch (pipeline_string, &error); gstSink = gst_bin_get_by_name(GST_BIN(gstPipeline),"sink"); gst_base_sink_set_sync(GST_BASE_SINK(gstSink), true); return startPipeline(); }
bool ofGstUtils::setPipeline(string pipeline, int bpp, bool isStream){ this->bpp = bpp; bHavePixelsChanged = false; bIsStream = isStream; gstData.loop = g_main_loop_new (NULL, FALSE); gchar* pipeline_string = g_strdup((pipeline + " ! appsink name=sink ").c_str()); // caps=video/x-raw-rgb GError * error = NULL; gstPipeline = gst_parse_launch (pipeline_string, &error); gstSink = gst_bin_get_by_name(GST_BIN(gstPipeline),"sink"); gst_base_sink_set_sync(GST_BASE_SINK(gstSink), true); return startPipeline(); }
bool ofGstUtils::setPipeline(string pipeline, int bpp, bool isStream, int w, int h){ this->bpp = bpp; bHavePixelsChanged = false; bIsStream = isStream; gstData.loop = g_main_loop_new (NULL, FALSE); if(w!=-1 && h!=-1){ width=w; height=h; } string caps; if(bpp==8) caps="video/x-raw-gray, depth=8, bpp=8"; else if(bpp==32) caps="video/x-raw-rgb, depth=32, bpp=32"; else caps="video/x-raw-rgb, depth=24, bpp=24"; gchar* pipeline_string = g_strdup((pipeline + " ! appsink name=sink caps=\"" + caps + "\"").c_str()); // caps=video/x-raw-rgb GError * error = NULL; gstPipeline = gst_parse_launch (pipeline_string, &error); ofLog(OF_LOG_NOTICE, "gstreamer pipeline: %s", pipeline_string); if(error!=NULL){ ofLog(OF_LOG_ERROR,"couldnt create pipeline: " + string(error->message)); return false; } gstSink = gst_bin_get_by_name(GST_BIN(gstPipeline),"sink"); gst_base_sink_set_sync(GST_BASE_SINK(gstSink), true); return startPipeline(); }
bool ofGstUtils::initGrabber(int w, int h, int framerate){ bpp = 3; if(!camData.bInited) get_video_devices(camData); if(camData.webcam_devices.size()==0){ ofLog(OF_LOG_ERROR,"ofGstUtils: no devices found exiting without initializing"); return false; } ofGstVideoFormat & format = selectFormat(w, h, framerate); ofLog(OF_LOG_NOTICE,"ofGstUtils: selected format: " + ofToString(format.width) + "x" + ofToString(format.height) + " " + format.mimetype + " framerate: " + ofToString(format.choosen_framerate.numerator) + "/" + ofToString(format.choosen_framerate.denominator)); bIsCamera = true; bHavePixelsChanged = false; width = w; height = h; gstData.loop = g_main_loop_new (NULL, FALSE); const char * decodebin = ""; if(format.mimetype != "video/x-raw-yuv" && format.mimetype != "video/x-raw-rgb") decodebin = "decodebin !"; const char * scale = ""; if( format.mimetype != "video/x-raw-rgb" ) scale = "ffmpegcolorspace !"; if( w!=format.width || h!=format.height ) scale = "ffvideoscale method=2 !"; string format_str_pipeline = string("%s name=video_source device=%s ! ") + "%s,width=%d,height=%d,framerate=%d/%d ! " + "%s %s " + "video/x-raw-rgb, width=%d, height=%d, depth=24 ! appsink name=sink caps=video/x-raw-rgb"; gchar* pipeline_string =g_strdup_printf ( format_str_pipeline.c_str(), camData.webcam_devices[deviceID].gstreamer_src.c_str(), camData.webcam_devices[deviceID].video_device.c_str(), format.mimetype.c_str(), format.width, format.height, format.choosen_framerate.numerator, format.choosen_framerate.denominator, decodebin, scale, w,h); ofLog(OF_LOG_NOTICE, "gstreamer pipeline: %s", pipeline_string); GError * error = NULL; gstPipeline = gst_parse_launch (pipeline_string, &error); gstSink = gst_bin_get_by_name(GST_BIN(gstPipeline),"sink"); gst_base_sink_set_sync(GST_BASE_SINK(gstSink), true); if(startPipeline()){ play(); return true; }else{ return false; } }