91 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			91 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include <gst/gst.h>
 | |
| #include <gst/mpegts/mpegts.h>
 | |
| 
 | |
| #define PIPELINE_STR "videotestsrc num-buffers=100 ! x264enc ! queue ! mpegtsmux name=mux ! fakesink"
 | |
| 
 | |
| static void
 | |
| _on_bus_message (GstBus * bus, GstMessage * message, GMainLoop * mainloop)
 | |
| {
 | |
|   switch (GST_MESSAGE_TYPE (message)) {
 | |
|     case GST_MESSAGE_ERROR:
 | |
|     case GST_MESSAGE_EOS:
 | |
|       g_main_loop_quit (mainloop);
 | |
|       break;
 | |
|     default:
 | |
|       break;
 | |
|   }
 | |
| }
 | |
| 
 | |
| static void
 | |
| advertise_service (GstElement * mux)
 | |
| {
 | |
|   GstMpegtsSDTService *service;
 | |
|   GstMpegtsSDT *sdt;
 | |
|   GstMpegtsDescriptor *desc;
 | |
|   GstMpegtsSection *section;
 | |
| 
 | |
|   sdt = gst_mpegts_sdt_new ();
 | |
| 
 | |
|   sdt->actual_ts = TRUE;
 | |
|   sdt->transport_stream_id = 42;
 | |
| 
 | |
|   service = gst_mpegts_sdt_service_new ();
 | |
|   service->service_id = 42;
 | |
|   service->running_status =
 | |
|       GST_MPEGTS_RUNNING_STATUS_RUNNING + service->service_id;
 | |
|   service->EIT_schedule_flag = FALSE;
 | |
|   service->EIT_present_following_flag = FALSE;
 | |
|   service->free_CA_mode = FALSE;
 | |
| 
 | |
|   desc = gst_mpegts_descriptor_from_dvb_service
 | |
|       (GST_DVB_SERVICE_DIGITAL_TELEVISION, "some-service", NULL);
 | |
| 
 | |
|   g_ptr_array_add (service->descriptors, desc);
 | |
|   g_ptr_array_add (sdt->services, service);
 | |
| 
 | |
|   section = gst_mpegts_section_from_sdt (sdt);
 | |
|   gst_mpegts_section_send_event (section, mux);
 | |
|   gst_mpegts_section_unref (section);
 | |
| }
 | |
| 
 | |
| int
 | |
| main (int argc, char **argv)
 | |
| {
 | |
|   GstElement *pipeline = NULL;
 | |
|   GError *error = NULL;
 | |
|   GstBus *bus;
 | |
|   GMainLoop *mainloop;
 | |
|   GstElement *mux;
 | |
| 
 | |
|   gst_init (&argc, &argv);
 | |
| 
 | |
|   pipeline = gst_parse_launch (PIPELINE_STR, &error);
 | |
|   if (error) {
 | |
|     g_print ("pipeline could not be constructed: %s\n", error->message);
 | |
|     g_clear_error (&error);
 | |
|     return 1;
 | |
|   }
 | |
| 
 | |
|   mainloop = g_main_loop_new (NULL, FALSE);
 | |
| 
 | |
|   mux = gst_bin_get_by_name (GST_BIN (pipeline), "mux");
 | |
|   advertise_service (mux);
 | |
|   gst_object_unref (mux);
 | |
| 
 | |
|   /* Put a bus handler */
 | |
|   bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
 | |
|   gst_bus_add_signal_watch (bus);
 | |
|   g_signal_connect (bus, "message", (GCallback) _on_bus_message, mainloop);
 | |
| 
 | |
|   /* Start pipeline */
 | |
|   gst_element_set_state (pipeline, GST_STATE_PLAYING);
 | |
|   g_main_loop_run (mainloop);
 | |
| 
 | |
|   gst_element_set_state (pipeline, GST_STATE_NULL);
 | |
| 
 | |
|   gst_object_unref (pipeline);
 | |
|   gst_object_unref (bus);
 | |
| 
 | |
|   return 0;
 | |
| }
 |