int main (int argc, char *argv[]) { GMainLoop *loop; GstRTSPServer *server; GstRTSPMountPoints *mounts; GstRTSPMediaFactory *factory; gst_init (&argc, &argv); loop = g_main_loop_new (NULL, FALSE); /* create a server instance */ server = gst_rtsp_server_new (); /* get the mount points for this server, every server has a default object * that be used to map uri mount points to media factories */ mounts = gst_rtsp_server_get_mount_points (server); /* make a media factory for a test stream. The default media factory can use * gst-launch syntax to create pipelines. * any launch line works as long as it contains elements named pay%d. Each * element with pay%d names will be a stream */ factory = gst_rtsp_media_factory_new (); gst_rtsp_media_factory_set_launch (factory, "( " "videotestsrc ! video/x-raw,width=352,height=288,framerate=15/1 ! " "x264enc ! rtph264pay name=pay0 pt=96 " "audiotestsrc ! audio/x-raw,rate=8000 ! " "alawenc ! rtppcmapay name=pay1 pt=97 " ")"); gst_rtsp_media_factory_set_shared (factory, TRUE); g_signal_connect (factory, "media-constructed", (GCallback) media_constructed, NULL); /* attach the test factory to the /test url */ gst_rtsp_mount_points_add_factory (mounts, "/test", factory); /* don't need the ref to the mapper anymore */ g_object_unref (mounts); /* attach the server to the default maincontext */ if (gst_rtsp_server_attach (server, NULL) == 0) goto failed; g_timeout_add_seconds (2, (GSourceFunc) timeout, server); /* start serving */ g_print ("stream ready at rtsp://127.0.0.1:8554/test\n"); g_main_loop_run (loop); return 0; /* ERRORS */ failed: { g_print ("failed to attach the server\n"); return -1; } }
static GstRTSPClient * setup_client (const gchar * launch_line) { GstRTSPClient *client; GstRTSPSessionPool *session_pool; GstRTSPMountPoints *mount_points; GstRTSPMediaFactory *factory; GstRTSPThreadPool *thread_pool; client = gst_rtsp_client_new (); session_pool = gst_rtsp_session_pool_new (); gst_rtsp_client_set_session_pool (client, session_pool); mount_points = gst_rtsp_mount_points_new (); factory = gst_rtsp_media_factory_new (); if (launch_line == NULL) gst_rtsp_media_factory_set_launch (factory, "videotestsrc ! video/x-raw,width=352,height=288 ! rtpgstpay name=pay0 pt=96"); else gst_rtsp_media_factory_set_launch (factory, launch_line); gst_rtsp_mount_points_add_factory (mount_points, "/test", factory); gst_rtsp_client_set_mount_points (client, mount_points); thread_pool = gst_rtsp_thread_pool_new (); gst_rtsp_client_set_thread_pool (client, thread_pool); g_object_unref (mount_points); g_object_unref (session_pool); g_object_unref (thread_pool); return client; }
void ReStream::AddChannelStream(char* rtspUrl,int CID, int DID, char* width,char* height, char* frameRate,char* bitrate, char * outputRtspUrl, bool isResize, int restreamID ) { try { if(isServerAttached){ GstRTSPMediaFactory *factory; char desc[SIZEOFCHARARRAYBIGGER]; char mountUrl[SIZEOFCHARARRAYBIGGER]; factory = gst_rtsp_media_factory_new (); if( isResize ) sprintf(desc,"( rtspsrc location=%s latency=0 retry=2 timeout=10000 tcp-timeout=100000 ! rtph264depay ! decodebin ! videoconvert ! videoscale ! video/x-raw,width=%s,height=%s ! videorate ! video/x-raw,framerate=%s/1 ! x264enc bitrate=%s ! rtph264pay name=pay0 pt=96 )", rtspUrl,width,height, frameRate, bitrate); else sprintf(desc,"( rtspsrc location=%s latency=0 retry=2 timeout=10000 tcp-timeout=100000 do-timestamp=true protocols=tcp ! rtph264depay ! rtph264pay name=pay0 pt=96 )",rtspUrl); gst_rtsp_media_factory_set_launch (factory,desc); g_signal_connect (factory, "media-configure", (GCallback) media_configure, NULL); g_signal_connect (server, "client-connected", (GCallback) client_connected, NULL); g_signal_connect (factory, "media-constructed", (GCallback) media_constructed, NULL); gst_rtsp_media_factory_set_shared (factory, TRUE); if(!isLocalStream ){ if ( !isResize ) sprintf(mountUrl,"/BroadCID%dDID%d",CID,DID); else sprintf(mountUrl,"/BroadCID%dDID%dRES%d",CID,DID,restreamID); } else{ if ( !isResize ) sprintf(mountUrl,"/localCID%dDID%d",CID,DID); else sprintf(mountUrl,"/localCID%dDID%dRES%d",CID,DID,restreamID); } gst_rtsp_mount_points_add_factory (mounts, mountUrl, factory); gst_rtsp_server_set_backlog (server, 10); if( isLocalStream ){ sprintf( outputRtspUrl,"rtsp://%s:%s%s","127.0.0.1",portNo,mountUrl); }else{ sprintf( outputRtspUrl,"rtsp://%s:%s%s",ipAddress,portNo,mountUrl); } if ( ISDEBUG ){ cout<<"\nDesc---"<<outputRtspUrl<<endl; cout<<"Channel Add Successful\n"; } } else{ if ( ISDEBUG ) cout<<"Server is Not Attached. Hence cannot add channel\n"; } } catch(Exception &e){ commclass.PrintException("ReStream","CV::AddChannelStream",e); } catch(exception &e){ commclass.PrintException("ReStream","STD::AddChannelStream",e); } }
int main (int argc, char *argv[]) { GMainLoop *loop; GstRTSPServer *server; GstRTSPMountPoints *mounts; GstRTSPMediaFactory *factory; GOptionContext *optctx; GError *error = NULL; optctx = g_option_context_new ("<launch line> - Test RTSP Server, Launch\n\n" "Example: \"( decodebin name=depay0 ! autovideosink )\""); g_option_context_add_main_entries (optctx, entries, NULL); g_option_context_add_group (optctx, gst_init_get_option_group ()); if (!g_option_context_parse (optctx, &argc, &argv, &error)) { g_printerr ("Error parsing options: %s\n", error->message); return -1; } if (argc < 2) { g_print ("%s\n", g_option_context_get_help (optctx, TRUE, NULL)); return 1; } g_option_context_free (optctx); loop = g_main_loop_new (NULL, FALSE); /* create a server instance */ server = gst_rtsp_server_new (); /* get the mount points for this server, every server has a default object * that be used to map uri mount points to media factories */ mounts = gst_rtsp_server_get_mount_points (server); /* make a media factory for a test stream. The default media factory can use * gst-launch syntax to create pipelines. * any launch line works as long as it contains elements named depay%d. Each * element with depay%d names will be a stream */ factory = gst_rtsp_media_factory_new (); gst_rtsp_media_factory_set_transport_mode (factory, GST_RTSP_TRANSPORT_MODE_RECORD); gst_rtsp_media_factory_set_launch (factory, argv[1]); gst_rtsp_media_factory_set_latency (factory, 2000); /* attach the test factory to the /test url */ gst_rtsp_mount_points_add_factory (mounts, "/test", factory); /* don't need the ref to the mapper anymore */ g_object_unref (mounts); /* attach the server to the default maincontext */ gst_rtsp_server_attach (server, NULL); /* start serving */ g_print ("stream ready at rtsp://127.0.0.1:%s/test\n", port); g_main_loop_run (loop); return 0; }
int main (int argc, char *argv[]) { GMainLoop *loop; GstRTSPServer *server; GstRTSPMountPoints *mounts; GstRTSPMediaFactory *factory; gchar *str; gst_init (&argc, &argv); if (argc < 2) { g_message ("usage: %s <filename.sdp>", argv[0]); return -1; } loop = g_main_loop_new (NULL, FALSE); /* create a server instance */ server = gst_rtsp_server_new (); /* get the mount points for this server, every server has a default object * that be used to map uri mount points to media factories */ mounts = gst_rtsp_server_get_mount_points (server); /* make a media factory for a test stream. The default media factory can use * gst-launch syntax to create pipelines. * any launch line works as long as it contains elements named pay%d. Each * element with pay%d names will be a stream */ factory = gst_rtsp_media_factory_new (); str = g_strdup_printf ("( filesrc location=%s ! sdpdemux name=dynpay0 )", argv[1]); gst_rtsp_media_factory_set_launch (factory, str); gst_rtsp_media_factory_set_shared (factory, TRUE); g_signal_connect (factory, "media-configure", (GCallback) media_configure, NULL); g_free (str); /* attach the test factory to the /test url */ gst_rtsp_mount_points_add_factory (mounts, "/test", factory); /* don't need the ref to the mapper anymore */ g_object_unref (mounts); /* attach the server to the default maincontext */ gst_rtsp_server_attach (server, NULL); g_timeout_add_seconds (2, (GSourceFunc) timeout, server); /* start serving */ g_main_loop_run (loop); return 0; }
int main(int argc, char *argv[]) { GMainLoop *loop; GstRTSPServer *server; GstRTSPMediaMapping *mapping; GstRTSPMediaFactory *factory; gchar * profile_file_name = DEFAULT_PROFILE_FILE; GstRTSPServerConfiguration * server_config; gst_init(&argc, &argv); loop = g_main_loop_new(NULL, FALSE); /* create a server instance */ server = gst_rtsp_server_new(); /* get the mapping for this server, every server has a default mapper object * that be used to map uri mount points to media factories */ mapping = gst_rtsp_server_get_media_mapping(server); /* make a media factory for a jpeg stream. The default media factory can use * gst-launch syntax to create pipelines. * any launch line works as long as it contains elements named pay%d. Each * element with pay%d names will be a stream */ factory = gst_rtsp_media_factory_new(); /* set webcam source and port to listen for factory */ gst_rtsp_factory_set_device_source(factory, "v4l2src", "/dev/video0", 3000); /* prepare server configuration for jpeg stream */ server_config = gst_rtsp_server_configuration_load(profile_file_name); /* map server configuration to media factory */ gst_rtsp_media_factory_set_server_configuration(factory, server_config); /* share the pipeline with multiple clients */ gst_rtsp_media_factory_set_shared(factory, TRUE); /* attach the test factory to the /jpg url */ gst_rtsp_media_mapping_add_factory(mapping, "/jpg", factory); /* don't need the ref to the mapper anymore */ g_object_unref(mapping); /* attach the server to the default maincontext */ gst_rtsp_server_attach(server, NULL); g_timeout_add_seconds(2, (GSourceFunc) timeout, server); /* start serving */ g_main_loop_run(loop); return 0; }
int main (int argc, char *argv[]) { GMainLoop *loop; GstRTSPServer *server; GstRTSPMountPoints *mounts; GstRTSPMediaFactory *factory; gst_init (&argc, &argv); if (argc < 2) { g_print ("usage: %s <launch line> \n" "example: %s \"( videotestsrc ! x264enc ! rtph264pay name=pay0 pt=96 )\"\n", argv[0], argv[0]); return -1; } loop = g_main_loop_new (NULL, FALSE); /* create a server instance */ server = gst_rtsp_server_new (); /* get the mount points for this server, every server has a default object * that be used to map uri mount points to media factories */ mounts = gst_rtsp_server_get_mount_points (server); /* make a media factory for a test stream. The default media factory can use * gst-launch syntax to create pipelines. * any launch line works as long as it contains elements named pay%d. Each * element with pay%d names will be a stream */ factory = gst_rtsp_media_factory_new (); gst_rtsp_media_factory_set_launch (factory, argv[1]); gst_rtsp_media_factory_set_shared (factory, TRUE); /* attach the test factory to the /test url */ gst_rtsp_mount_points_add_factory (mounts, "/test", factory); /* don't need the ref to the mapper anymore */ g_object_unref (mounts); /* attach the server to the default maincontext */ gst_rtsp_server_attach (server, NULL); /* start serving */ g_print ("stream ready at rtsp://127.0.0.1:8554/test\n"); g_main_loop_run (loop); return 0; }
//void ReStream::AddVODStream(char* fileName,char * mountUrl, int CID, int DID, char* width,char* height, char* frameRate,char* bitrate, char * outputRtspUrl, bool isResize ) void ReStream::AddVODStream( char* fileName,char * mountUrl, char * outputRtspUrl ) { try { if(isServerAttached){ GstRTSPMediaFactory *factory; char desc[SIZEOFCHARARRAYBIGGER]; char localUrl[SIZEOFCHARARRAYBIGGER]; factory = gst_rtsp_media_factory_new (); sprintf(desc,"( filesrc location=%s ! decodebin ! x264enc ! rtph264pay name=pay0 pt=96 )",fileName); gst_rtsp_media_factory_set_launch (factory,desc); gst_rtsp_media_factory_set_shared (factory, FALSE); cout<<"mountRl before = "<<mountUrl<<endl; sprintf(localUrl,"/%s",mountUrl); cout<<"mountRl after = "<<localUrl<<endl; gst_rtsp_mount_points_add_factory (mounts, localUrl, factory); gst_rtsp_server_set_backlog (server, 10); if( isLocalStream ){ sprintf( outputRtspUrl,"rtsp://%s:%s%s","127.0.0.1",portNo,localUrl); }else{ sprintf( outputRtspUrl,"rtsp://%s:%s%s",ipAddress,portNo,localUrl); } if ( ISDEBUG ){ cout<<"\nVODDesc---"<<outputRtspUrl<<endl; cout<<"VOD Add Successful\n"; } } else{ if ( ISDEBUG ) cout<<"Server is Not Attached. Hence cannot add channel\n"; } } catch(Exception &e){ commclass.PrintException("ReStream","CV::AddChannelStream",e); } catch(exception &e){ commclass.PrintException("ReStream","STD::AddChannelStream",e); } }
int main (int argc, char *argv[]) { GMainLoop *loop; GstRTSPServer *server; GstRTSPMediaMapping *mapping; GstRTSPMediaFactory *factory; gst_init (&argc, &argv); loop = g_main_loop_new (NULL, FALSE); /* create a server instance */ server = gst_rtsp_server_new (); /* get the mapping for this server, every server has a default mapper object * that be used to map uri mount points to media factories */ mapping = gst_rtsp_server_get_media_mapping (server); /* make a media factory for a test stream. The default media factory can use * gst-launch syntax to create pipelines. * any launch line works as long as it contains elements named pay%d. Each * element with pay%d names will be a stream */ factory = gst_rtsp_media_factory_new (); gst_rtsp_media_factory_set_launch (factory, "( videotestsrc is-live=1 ! x264enc ! rtph264pay name=pay0 pt=96 )"); gst_rtsp_media_factory_set_shared (factory, TRUE); /* attach the test factory to the /test url */ gst_rtsp_media_mapping_add_factory (mapping, "/test", factory); /* don't need the ref to the mapper anymore */ g_object_unref (mapping); /* attach the server to the default maincontext */ gst_rtsp_server_attach (server, NULL); /* start serving */ g_main_loop_run (loop); return 0; }
static GstRTSPClient * setup_multicast_client (void) { GstRTSPClient *client; GstRTSPSessionPool *session_pool; GstRTSPMountPoints *mount_points; GstRTSPMediaFactory *factory; GstRTSPAddressPool *address_pool; GstRTSPThreadPool *thread_pool; client = gst_rtsp_client_new (); session_pool = gst_rtsp_session_pool_new (); gst_rtsp_client_set_session_pool (client, session_pool); mount_points = gst_rtsp_mount_points_new (); factory = gst_rtsp_media_factory_new (); gst_rtsp_media_factory_set_launch (factory, "audiotestsrc ! audio/x-raw,rate=44100 ! audioconvert ! rtpL16pay name=pay0"); address_pool = gst_rtsp_address_pool_new (); fail_unless (gst_rtsp_address_pool_add_range (address_pool, "233.252.0.1", "233.252.0.1", 5000, 5010, 1)); gst_rtsp_media_factory_set_address_pool (factory, address_pool); gst_rtsp_media_factory_add_role (factory, "user", "media.factory.access", G_TYPE_BOOLEAN, TRUE, "media.factory.construct", G_TYPE_BOOLEAN, TRUE, NULL); gst_rtsp_mount_points_add_factory (mount_points, "/test", factory); gst_rtsp_client_set_mount_points (client, mount_points); thread_pool = gst_rtsp_thread_pool_new (); gst_rtsp_client_set_thread_pool (client, thread_pool); g_object_unref (mount_points); g_object_unref (session_pool); g_object_unref (address_pool); g_object_unref (thread_pool); return client; }
int main (int argc, char *argv[]) { GMainLoop *loop; GstRTSPServer *server; GstRTSPMediaMapping *mapping; GstRTSPMediaFactory *factory; gst_init (&argc, &argv); loop = g_main_loop_new (NULL, FALSE); server = gst_rtsp_server_new (); mapping = gst_rtsp_server_get_media_mapping (server); factory = gst_rtsp_media_factory_new (); gst_rtsp_media_factory_set_launch (factory, "( v4l2src is-live=1 device=/dev/video1 ! jpegenc ! rtpjpegpay name=pay0 pt=96 )"); gst_rtsp_media_factory_set_shared (factory, TRUE); gst_rtsp_media_mapping_add_factory (mapping, "/test", factory); g_object_unref (mapping); gst_rtsp_server_attach (server, NULL); g_main_loop_run (loop); return 0; }
void gss_rtsp_stream_start (GssRtspStream * rtsp_stream) { GString *pipe_desc; int pipe_fds[2]; int ret; ret = pipe (pipe_fds); if (ret < 0) { return; } pipe_desc = g_string_new (""); g_string_append (pipe_desc, "( "); g_string_append_printf (pipe_desc, "fdsrc fd=%d name=src ! ", pipe_fds[0]); g_string_append (pipe_desc, "oggdemux name=demux ! "); g_string_append (pipe_desc, "queue ! rtptheorapay name=pay0 pt=96 "); g_string_append (pipe_desc, "demux. ! queue ! rtpvorbispay name=pay1 pt=97 "); g_string_append (pipe_desc, ")"); GST_DEBUG ("%s", pipe_desc->str); rtsp_stream->factory = gst_rtsp_media_factory_new (); gst_rtsp_media_factory_set_launch (rtsp_stream->factory, pipe_desc->str); g_string_free (pipe_desc, FALSE); rtsp_stream->mapping = gst_rtsp_server_get_media_mapping (rtsp_stream->server); gst_rtsp_media_mapping_add_factory (rtsp_stream->mapping, "/stream", rtsp_stream->factory); g_object_unref (rtsp_stream->mapping); g_signal_emit_by_name (rtsp_stream->stream->sink, "add", pipe_fds[1]); gst_rtsp_server_attach (rtsp_stream->server, NULL); }
static void test_prepare_reusable (GstRTSPThreadPool * pool, const gchar * launch_line) { GstRTSPMediaFactory *factory; GstRTSPMedia *media; GstRTSPUrl *url; GstRTSPThread *thread; factory = gst_rtsp_media_factory_new (); fail_if (gst_rtsp_media_factory_is_shared (factory)); fail_unless (gst_rtsp_url_parse ("rtsp://localhost:8554/test", &url) == GST_RTSP_OK); gst_rtsp_media_factory_set_launch (factory, launch_line); media = gst_rtsp_media_factory_construct (factory, url); fail_unless (GST_IS_RTSP_MEDIA (media)); fail_unless (gst_rtsp_media_n_streams (media) == 1); g_object_set (G_OBJECT (media), "reusable", TRUE, NULL); thread = gst_rtsp_thread_pool_get_thread (pool, GST_RTSP_THREAD_TYPE_MEDIA, NULL); fail_unless (gst_rtsp_media_prepare (media, thread)); fail_unless (gst_rtsp_media_unprepare (media)); fail_unless (gst_rtsp_media_n_streams (media) == 1); thread = gst_rtsp_thread_pool_get_thread (pool, GST_RTSP_THREAD_TYPE_MEDIA, NULL); fail_unless (gst_rtsp_media_prepare (media, thread)); fail_unless (gst_rtsp_media_unprepare (media)); g_object_unref (media); gst_rtsp_url_free (url); g_object_unref (factory); }
int main (int argc, char *argv[]) { GMainLoop *loop; GstRTSPServer *server; GstRTSPMountPoints *mounts; GstRTSPMediaFactory *factory; GOptionContext *optctx; GError *error = NULL; gchar *str; optctx = g_option_context_new ("<filename.ogg> - Test RTSP Server, OGG"); g_option_context_add_main_entries (optctx, entries, NULL); g_option_context_add_group (optctx, gst_init_get_option_group ()); if (!g_option_context_parse (optctx, &argc, &argv, &error)) { g_printerr ("Error parsing options: %s\n", error->message); return -1; } g_option_context_free (optctx); loop = g_main_loop_new (NULL, FALSE); /* create a server instance */ server = gst_rtsp_server_new (); g_object_set (server, "service", port, NULL); /* get the mount points for this server, every server has a default object * that be used to map uri mount points to media factories */ mounts = gst_rtsp_server_get_mount_points (server); // filesrc location=amy.wav ! wavparse ! audioconvert ! audioresample ! alawenc ! rtppcmapay audioconvert ! audioresample ! vorbisenc // /home/dhruv/Music/ str = "( " "flitesrc location=%s ! wavparse ! audioconvert ! audioresample ! alawenc ! rtppcmapay name=pay0 pt=96 " ")"; /* make a media factory for a test stream. The default media factory can use * gst-launch syntax to create pipelines. * any launch line works as long as it contains elements named pay%d. Each * element with pay%d names will be a stream */ factory = gst_rtsp_media_factory_new (); //klass = GST_RTSP_MEDIA_FACTORY_GET_CLASS (factory); //klass->create_element = my_default_create_element; gst_rtsp_media_factory_set_launch (factory, str); //g_free (str); /* attach the test factory to the /test url */ gst_rtsp_mount_points_add_factory (mounts, "/test", factory); /* don't need the ref to the mapper anymore */ g_object_unref (mounts); /* attach the server to the default maincontext */ gst_rtsp_server_attach (server, NULL); /* start serving */ g_print ("stream ready at rtsp://127.0.0.1:%s/test\n", port); g_main_loop_run (loop); return 0; }
int main (int argc, char *argv[]) { GMainLoop *loop; GstRTSPServer *server; GstRTSPMountPoints *mounts; GstRTSPMediaFactory *factory; GOptionContext *optctx; GError *error = NULL; gchar *str; optctx = g_option_context_new ("<filename.mp4> - Test RTSP Server, MP4"); g_option_context_add_main_entries (optctx, entries, NULL); g_option_context_add_group (optctx, gst_init_get_option_group ()); if (!g_option_context_parse (optctx, &argc, &argv, &error)) { g_printerr ("Error parsing options: %s\n", error->message); return -1; } if (argc < 2) { g_print ("%s\n", g_option_context_get_help (optctx, TRUE, NULL)); return 1; } g_option_context_free (optctx); loop = g_main_loop_new (NULL, FALSE); /* create a server instance */ server = gst_rtsp_server_new (); g_object_set (server, "service", port, NULL); /* get the mount points for this server, every server has a default object * that be used to map uri mount points to media factories */ mounts = gst_rtsp_server_get_mount_points (server); str = g_strdup_printf ("( " "filesrc location=\"%s\" ! qtdemux name=d " "d. ! queue ! rtph264pay pt=96 name=pay0 " "d. ! queue ! rtpmp4apay pt=97 name=pay1 " ")", argv[1]); /* make a media factory for a test stream. The default media factory can use * gst-launch syntax to create pipelines. * any launch line works as long as it contains elements named pay%d. Each * element with pay%d names will be a stream */ factory = gst_rtsp_media_factory_new (); gst_rtsp_media_factory_set_launch (factory, str); g_signal_connect (factory, "media-configure", (GCallback) media_configure_cb, factory); g_free (str); /* attach the test factory to the /test url */ gst_rtsp_mount_points_add_factory (mounts, "/test", factory); /* don't need the ref to the mapper anymore */ g_object_unref (mounts); /* attach the server to the default maincontext */ gst_rtsp_server_attach (server, NULL); /* start serving */ g_print ("stream ready at rtsp://127.0.0.1:%s/test\n", port); g_main_loop_run (loop); return 0; }
int main(int argc, char *argv[]) { GMainLoop *loop; GstRTSPServer *server; GstRTSPMediaMapping *mapping; GstRTSPMediaFactory *factory_h264, *factory_mpeg4; GstRTSPServerConfiguration * server_config = NULL; gchar * audio_profile_name = NULL; gst_init(&argc, &argv); loop = g_main_loop_new(NULL, FALSE); /* create a server instance */ server = gst_rtsp_server_new(); /* get the mapping for this server, every server has a default mapper object * that be used to map uri mount points to media factories */ mapping = gst_rtsp_server_get_media_mapping(server); /* make a media factory for a h264 video stream and audio (aac, g711 or g726) stream. The default media factory can use * gst-launch syntax to create pipelines. * any launch line works as long as it contains elements named pay%d. Each * element with pay%d names will be a stream */ factory_h264 = gst_rtsp_media_factory_new(); factory_h264->two_streams = TRUE; /* set webcam source and port to listen for factory */ gst_rtsp_factory_set_device_source(factory_h264, "v4l2src", "/dev/video0", 3000); /* Load server configuration for h264 stream */ server_config = gst_rtsp_server_configuration_load(DEFAULT_PROFILE_FILE_VIDEO_H264); /* check to see if we need audio stream for our server */ if (argc > 1 && server_config != NULL) { if (g_strrstr(argv[1], "aac")) { audio_profile_name = "audio AAC"; } else if (g_strrstr(argv[1], "g726")) { audio_profile_name = "audio G726"; } else if (g_strrstr(argv[1], "g711")) { audio_profile_name = "audio G711"; } /* set default audio format for our configuration */ if (audio_profile_name != NULL) { gst_rtsp_server_configuration_set_default_audio_pipeline(server_config, audio_profile_name); } } /* apply server config to the factory */ gst_rtsp_media_factory_set_server_configuration(factory_h264, server_config); /* share the pipeline with multiple clients */ gst_rtsp_media_factory_set_shared(factory_h264, TRUE); /* attach the test factory to the /h264 url */ gst_rtsp_media_mapping_add_factory(mapping, "/h264", factory_h264); /* make a media factory for a mpeg 4 video stream and audio (aac, g711 or g726) stream. The default media factory can use * gst-launch syntax to create pipelines. * any launch line works as long as it contains elements named pay%d. Each * element with pay%d names will be a stream */ factory_mpeg4 = gst_rtsp_media_factory_new(); factory_mpeg4->two_streams = TRUE; /* set webcam source and port to listen for factory */ /* gst_rtsp_factory_set_device_source (factory_jpg, "v4l2src", "/dev/video0", 3000); */ factory_mpeg4->v4l2src_pipeline = factory_h264->v4l2src_pipeline; factory_mpeg4->v4l2src_port = factory_h264->v4l2src_port + 1; factory_mpeg4->multiudpsink = factory_h264->multiudpsink; /* prepare server configuration for mpeg4 stream */ server_config = gst_rtsp_server_configuration_load(DEFAULT_PROFILE_FILE_VIDEO_MPEG4); /* set default audio profile fo mpeg4 stream */ if (audio_profile_name != NULL) { gst_rtsp_server_configuration_set_default_audio_pipeline(server_config, audio_profile_name); } /* now, map server configuration to the factory */ gst_rtsp_media_factory_set_server_configuration(factory_mpeg4, server_config); /* share the pipeline with multiple clients */ gst_rtsp_media_factory_set_shared(factory_mpeg4, TRUE); /* attach the test factory to the /mp4 url */ gst_rtsp_media_mapping_add_factory(mapping, "/mp4", factory_mpeg4); /* don't need the ref to the mapper anymore */ g_object_unref(mapping); /* attach the server to the default maincontext */ gst_rtsp_server_attach(server, NULL); g_timeout_add_seconds(2, (GSourceFunc) timeout, server); /* start serving */ g_main_loop_run(loop); return 0; }
int main (int argc, char *argv[]) { GMainLoop *loop; GstRTSPServer *server; GstRTSPMountPoints *mounts; GstRTSPMediaFactory *factory; GOptionContext *optctx; GError *error = NULL; GstRTSPAuth *auth; GstRTSPToken *token; gchar *basic; #ifdef WITH_TLS GTlsCertificate *cert; #endif optctx = g_option_context_new ("<launch line> - Test RTSP Server, Launch\n\n" "Example: \"( decodebin name=depay0 ! autovideosink )\""); g_option_context_add_main_entries (optctx, entries, NULL); g_option_context_add_group (optctx, gst_init_get_option_group ()); if (!g_option_context_parse (optctx, &argc, &argv, &error)) { g_printerr ("Error parsing options: %s\n", error->message); return -1; } if (argc < 2) { g_print ("%s\n", g_option_context_get_help (optctx, TRUE, NULL)); return 1; } g_option_context_free (optctx); loop = g_main_loop_new (NULL, FALSE); /* create a server instance */ server = gst_rtsp_server_new (); g_object_set (server, "service", port, NULL); /* get the mount points for this server, every server has a default object * that be used to map uri mount points to media factories */ mounts = gst_rtsp_server_get_mount_points (server); /* make a media factory for a test stream. The default media factory can use * gst-launch syntax to create pipelines. * any launch line works as long as it contains elements named depay%d. Each * element with depay%d names will be a stream */ factory = gst_rtsp_media_factory_new (); gst_rtsp_media_factory_set_transport_mode (factory, GST_RTSP_TRANSPORT_MODE_RECORD); gst_rtsp_media_factory_set_launch (factory, argv[1]); gst_rtsp_media_factory_set_latency (factory, 2000); #ifdef WITH_TLS gst_rtsp_media_factory_set_profiles (factory, GST_RTSP_PROFILE_SAVP | GST_RTSP_PROFILE_SAVPF); #else gst_rtsp_media_factory_set_profiles (factory, GST_RTSP_PROFILE_AVP | GST_RTSP_PROFILE_AVPF); #endif /* allow user to access this resource */ gst_rtsp_media_factory_add_role (factory, "user", GST_RTSP_PERM_MEDIA_FACTORY_ACCESS, G_TYPE_BOOLEAN, TRUE, GST_RTSP_PERM_MEDIA_FACTORY_CONSTRUCT, G_TYPE_BOOLEAN, TRUE, NULL); /* Anonymous users can see but not construct, so get UNAUTHORIZED */ gst_rtsp_media_factory_add_role (factory, "anonymous", GST_RTSP_PERM_MEDIA_FACTORY_ACCESS, G_TYPE_BOOLEAN, TRUE, GST_RTSP_PERM_MEDIA_FACTORY_CONSTRUCT, G_TYPE_BOOLEAN, FALSE, NULL); /* attach the test factory to the /test url */ gst_rtsp_mount_points_add_factory (mounts, "/test", factory); /* don't need the ref to the mapper anymore */ g_object_unref (mounts); /* Set up the auth for user account */ /* make a new authentication manager */ auth = gst_rtsp_auth_new (); #ifdef WITH_TLS cert = g_tls_certificate_new_from_pem ("-----BEGIN CERTIFICATE-----" "MIICJjCCAY+gAwIBAgIBBzANBgkqhkiG9w0BAQUFADCBhjETMBEGCgmSJomT8ixk" "ARkWA0NPTTEXMBUGCgmSJomT8ixkARkWB0VYQU1QTEUxHjAcBgNVBAsTFUNlcnRp" "ZmljYXRlIEF1dGhvcml0eTEXMBUGA1UEAxMOY2EuZXhhbXBsZS5jb20xHTAbBgkq" "hkiG9w0BCQEWDmNhQGV4YW1wbGUuY29tMB4XDTExMDExNzE5NDcxN1oXDTIxMDEx" "NDE5NDcxN1owSzETMBEGCgmSJomT8ixkARkWA0NPTTEXMBUGCgmSJomT8ixkARkW" "B0VYQU1QTEUxGzAZBgNVBAMTEnNlcnZlci5leGFtcGxlLmNvbTBcMA0GCSqGSIb3" "DQEBAQUAA0sAMEgCQQDYScTxk55XBmbDM9zzwO+grVySE4rudWuzH2PpObIonqbf" "hRoAalKVluG9jvbHI81eXxCdSObv1KBP1sbN5RzpAgMBAAGjIjAgMAkGA1UdEwQC" "MAAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwDQYJKoZIhvcNAQEFBQADgYEAYx6fMqT1" "Gvo0jq88E8mc+bmp4LfXD4wJ7KxYeadQxt75HFRpj4FhFO3DOpVRFgzHlOEo3Fwk" "PZOKjvkT0cbcoEq5whLH25dHoQxGoVQgFyAP5s+7Vp5AlHh8Y/vAoXeEVyy/RCIH" "QkhUlAflfDMcrrYjsmwoOPSjhx6Mm/AopX4=" "-----END CERTIFICATE-----" "-----BEGIN PRIVATE KEY-----" "MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEA2EnE8ZOeVwZmwzPc" "88DvoK1ckhOK7nVrsx9j6TmyKJ6m34UaAGpSlZbhvY72xyPNXl8QnUjm79SgT9bG" "zeUc6QIDAQABAkBRFJZ32VbqWMP9OVwDJLiwC01AlYLnka0mIQZbT/2xq9dUc9GW" "U3kiVw4lL8v/+sPjtTPCYYdzHHOyDen6znVhAiEA9qJT7BtQvRxCvGrAhr9MS022" "tTdPbW829BoUtIeH64cCIQDggG5i48v7HPacPBIH1RaSVhXl8qHCpQD3qrIw3FMw" "DwIga8PqH5Sf5sHedy2+CiK0V4MRfoU4c3zQ6kArI+bEgSkCIQCLA1vXBiE31B5s" "bdHoYa1BXebfZVd+1Hd95IfEM5mbRwIgSkDuQwV55BBlvWph3U8wVIMIb4GStaH8" "W535W8UBbEg=" "-----END PRIVATE KEY-----", -1, &error); if (cert == NULL) { g_printerr ("failed to parse PEM: %s\n", error->message); return -1; } gst_rtsp_auth_set_tls_certificate (auth, cert); g_object_unref (cert); #endif /* make default token - anonymous unauthenticated access */ token = gst_rtsp_token_new (GST_RTSP_TOKEN_MEDIA_FACTORY_ROLE, G_TYPE_STRING, "anonymous", NULL); gst_rtsp_auth_set_default_token (auth, token); gst_rtsp_token_unref (token); /* make user token */ token = gst_rtsp_token_new (GST_RTSP_TOKEN_MEDIA_FACTORY_ROLE, G_TYPE_STRING, "user", NULL); basic = gst_rtsp_auth_make_basic ("user", "password"); gst_rtsp_auth_add_basic (auth, basic, token); g_free (basic); gst_rtsp_token_unref (token); /* set as the server authentication manager */ gst_rtsp_server_set_auth (server, auth); g_object_unref (auth); /* attach the server to the default maincontext */ gst_rtsp_server_attach (server, NULL); /* start serving */ #ifdef WITH_TLS g_print ("stream ready at rtsps://127.0.0.1:%s/test\n", port); #else g_print ("stream ready at rtsp://127.0.0.1:%s/test\n", port); #endif g_main_loop_run (loop); return 0; }