/* Set the URI to play */ g_object_set (data.source, "uri","rtsp:admin@admin:192.168.1.250:80", NULL); As if my server gets down or if their is some problem with my camera. So i want if there is an element provided by you people so that i can listen if ip address is available or not if not it sends a message ip address is not available. I resolve this problem by calling a method recursively because whenever it does not get any data from source it give a msg end of stream or error so after getting that msg i deference all elements and at the end i recursively call same method so that i can check if source is available or not but after two three call backs it give segmentation fault. I also tried with ping methodology but give same result. Here is my code.. void * camera1(void * u) { printf("Thread starting....\n"); GstMessage *msg; CustomData data; guint bus_watch_id; GstBus *bus; GstStateChangeReturn ret; gboolean terminate = FALSE; char cam2[9]="cam2"; printf("start playing11..\n"); data.source = gst_element_factory_make ("uridecodebin", "source"); data.convert = gst_element_factory_make ("videoconvert", "convert"); // data.sink = gst_element_factory_make ("autoaudiosink", "sink"); // data.videoconvert1 = gst_element_factory_make("videoconvert", "videoconvert1"); data.videoconvert2 = gst_element_factory_make("videoconvert", "videoconvert2"); //data.queue1 = gst_element_factory_make("queue", "queue1"); data.queue2 = gst_element_factory_make("queue", "queue2"); data.tee = gst_element_factory_make("tee", "tee"); data.frameratefilter = gst_element_factory_make("capsfilter", NULL); data.videorate = gst_element_factory_make("videorate", NULL); data.avenc = gst_element_factory_make("avenc_mpeg2video", NULL); data.avimux = gst_element_factory_make("avimux", NULL); data.filesink = gst_element_factory_make("multifilesink", "filesink"); // data.splitmuxsink = gst_element_factory_make("splitmuxsink", "splitmuxsink"); printf("start playing22..\n"); /* Create the empty pipeline */ data.pipeline = gst_pipeline_new ("test-pipeline"); if (!data.pipeline || !data.source || !data.convert || !data.videoconvert2 || !data.queue2 || !data.tee || !data.filesink ) { g_printerr ("Not all elements could be created.\n"); return 0; } printf("start playing33..\n"); g_object_set(G_OBJECT(data.frameratefilter), "caps", gst_caps_from_string("video/x-raw,framerate=50/1"), NULL); printf("start playing44..\n"); /* Build the pipeline. Note that we are NOT linking the source at this * point. We will do it later. */ gst_bin_add_many (GST_BIN (data.pipeline), data.source, data.convert ,data.videoconvert2, data.queue2, data.tee,data.frameratefilter, data.videorate,data.avenc,data.avimux,data.filesink,NULL); if (!gst_element_link (data.convert, data.tee)) { g_printerr ("Elements could not be linked.\n"); gst_object_unref (data.pipeline); return 0; }printf("start playing..\n"); if (!gst_element_link_many(data.queue2, data.videorate, data.frameratefilter, data.videoconvert2, data.avenc,data.avimux, data.filesink, NULL)) g_error("Failed to link save elements!"); if ( !(data.tee_src_pad_template = gst_element_class_get_pad_template (GST_ELEMENT_GET_CLASS (data.tee), "src_%u"))) { g_critical ("Unable to get pad template!"); return; } printf("start playing..\n"); // data.qpad1 = gst_element_get_static_pad(data.queue1, "sink"); data.qpad2 = gst_element_get_static_pad(data.queue2, "sink"); // data.teepad1 = gst_element_request_pad (data.tee, data.tee_src_pad_template, NULL, NULL); //g_print ("Obtained request pad %s for queue1 branch.\n", gst_pad_get_name (data.teepad1)); data.teepad2 = gst_element_request_pad (data.tee, data.tee_src_pad_template, NULL, NULL); g_print ("Obtained request pad %s for queue2 branch.\n", gst_pad_get_name (data.teepad2)); if( !data.teepad2 || !data.qpad2){ g_error("Creation of one tee pad failed."); return; } printf("start playing..\n"); // gst_pad_link (data.teepad1, data.qpad1); gst_pad_link (data.teepad2, data.qpad2); // gst_object_unref (GST_OBJECT (data.qpad1)); gst_object_unref (GST_OBJECT (data.qpad2)); //gst_object_unref (GST_OBJECT (data.teepad1)); gst_object_unref (GST_OBJECT (data.teepad2)); printf("start playing.12345.\n"); GST_DEBUG_BIN_TO_DOT_FILE(GST_BIN(data.pipeline), GST_DEBUG_GRAPH_SHOW_ALL, "pipeline_graph"); printf("%s",message[6]+10); /* Set the URI to play */ g_object_set (data.source, "uri",message[7]+10, NULL); /* Connect to the pad-added signal */ g_signal_connect (data.source, "pad-added", G_CALLBACK (pad_added_handler), &data); //printf("%s",*prop); /* Start playing */ printf("start playing12..\n"); ret = gst_element_set_state (data.pipeline, GST_STATE_PLAYING); if (ret == GST_STATE_CHANGE_FAILURE) { g_printerr ("Unable to set the pipeline to the playing state.\n"); gst_object_unref (data.pipeline); return 0; } g_object_set(G_OBJECT (data.filesink),"location","/home/bitcomm-31/Videos/Cam1/shubham_%03d.mp4","async",0, NULL); g_object_set(G_OBJECT (data.filesink),"post-messages", TRUE, "multifilesink", 0, NULL); g_object_set(G_OBJECT (data.filesink),"next-file", 4,"multifilesink", 0, NULL); g_object_set(G_OBJECT (data.filesink), "max-file-size", 500000, "multifilesink", 0, NULL); g_object_set(G_OBJECT (data.filesink), "max-files ",5, "multifilesink", 0, NULL); printf("Thread Start.. Listen to bus\n"); /* Listen to the bus */ bus = gst_element_get_bus (data.pipeline); printf("Bus status fetched\n"); do { msg = gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE, GST_MESSAGE_ANY); //msg=GST_MESSAGE_EOS; printf("Enetring switch case\n"); /* Parse message */ if (msg != NULL) { GError *err; gchar *debug_info; printf("msg.type %u\n",GST_MESSAGE_TYPE (msg)); switch (GST_MESSAGE_TYPE (msg)) { case GST_MESSAGE_ERROR: gst_message_parse_error (msg, &err, &debug_info); g_printerr ("Error received from element %s: %s\n", GST_OBJECT_NAME (msg->src), err->message); g_printerr ("Debugging information: %s\n", debug_info ? debug_info : "none"); g_clear_error (&err); g_free (debug_info); terminate = TRUE; break; case GST_MESSAGE_EOS: g_print ("End-Of-Stream reached.\n"); terminate = TRUE; break; case GST_MESSAGE_STATE_CHANGED: /* We are only interested in state-changed messages from the pipeline */ if (GST_MESSAGE_SRC (msg) == GST_OBJECT (data.pipeline)) { GstState old_state, new_state, pending_state; gst_message_parse_state_changed (msg, &old_state, &new_state, &pending_state); g_print ("Pipeline state changed from %s to %s:\n", gst_element_state_get_name (old_state), gst_element_state_get_name (new_state)); } break; //////START case GST_MESSAGE_UNKNOWN: g_print("GST_MESSAGE_UNKNOWN\n"); break; //case GST_MESSAGE_ELEMENT: //g_print("########################GST_MESSAGE_ELEMENT START #################\n"); //g_message ("get message %s", gst_structure_get_name (gst_message_get_structure(msg))); //g_print ("filenemae %d",gst_message_get_structure(msg))->index); //g_print("########################GST_MESSAGE_ELEMENT END #################\n"); //break; case GST_MESSAGE_ELEMENT: s = gst_message_get_structure (msg); if (gst_structure_has_name(s, "GstMultiFileSink")) { //time_t t = time(NULL); // struct tm *tm = localtime(&t); // printf("%s\n", asctime(tm)); //==================================================date time spaceless====================\\ //localtime() uses the time pointed by t , // to fill a tm structure with the // values that represent the // corresponding local time. time_t t ; struct tm *tmp ; time( &t ); tmp = localtime( &t ); // using strftime to display time strftime(MY_TIME, sizeof(MY_TIME), "%c", tmp); printf("date and timeopjofizdfvbid%s\n", MY_TIME ); //==================================================date time spaceless====================\\ g_print("########################GST_MESSAGE_ELEMENT START#################\n"); g_print("File written.\n"); filename = gst_structure_get_string (s, "filename"); // g_print ("filename------------ %s\n",filename); char path[1000]={0,}; sprintf(path,"%s",filename); printf("path---########----------%s\n",path); g_print ("name-after strcpy--path--------- %s\n",path); char path3[]="/home/bitcomm-31/Videos/Cam1/"; char date[100]={0,}; sprintf(date,"%s",MY_TIME); strcat(date,".mp4"); char path2[2000]={0,}; strcat(path2,path3); strcat(path2,date); int value; value = rename(path, path2); if(!value) { printf("%s\n", "File name changed successfully"); } else { perror("Error"); } g_print("########################GST_MESSAGE_ELEMENT END#################\n"); } break; //////END default: /* We should not reach here */ //g_printerr ("Unexpected message received.\n"); break; } gst_message_unref (msg); } printf("value of terminate %d\n",terminate); } while (!terminate); gst_element_set_state (data.pipeline, GST_STATE_NULL); gst_object_unref (data.pipeline); return camera1 (void) ; } _______________________________________________ gstreamer-devel mailing list [hidden email] https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel |
Free forum by Nabble | Edit this page |