#define BUFFER_SIZE 1843200 #define QUEUED_FRAMES 3 const gchar *video_caps = "video/mpeg, mpegversion=(int)4, framerate=(fraction)1001/30000, width=(int)1280, height=(int)720"; typedef struct { GstElement *pipeline; GstElement *source; guint source_id; } AppData; static gboolean on_pipeline_message (GstBus * bus, GstMessage * message, AppData * app) { GstState state, pending; switch (GST_MESSAGE_TYPE (message)) { case GST_MESSAGE_EOS: g_print ("Received End of Stream message\n"); break; case GST_MESSAGE_ERROR: g_print ("Received error\n"); break; case GST_MESSAGE_STATE_CHANGED: gst_element_get_state(app->source, &state, &pending, GST_CLOCK_TIME_NONE); /* g_print ("State changed from %i to %i\n", state, pending); */ break; default: break; } return TRUE; } void *writerThrFxn(void *arg) { GstRTSPServer *server; GstRTSPMediaFactory *factory; GstRTSPMediaMapping *mapping; server = gst_rtsp_server_new (); factory = gst_rtsp_media_factory_new (); gst_rtsp_media_factory_set_shared (factory, TRUE); gchar *string = NULL; string = g_strdup_printf ("(appsrc is-live=TRUE name=source caps=\"%s\" ! rtpmp4vpay pt=96 name=pay0 )", video_caps); gst_rtsp_media_factory_set_launch (factory, string); g_free (string); mapping = gst_rtsp_server_get_media_mapping (server); gst_rtsp_media_mapping_add_factory (mapping, "/test", factory); AppData *app = NULL; GstBus *bus = NULL; GstElement *appsrc = NULL; gst_init (NULL, NULL); app = g_new0 (AppData, 1); //app->pipeline = if (app->pipeline == NULL) { g_print ("Bad pipeline\n"); } appsrc = gst_bin_get_by_name (GST_BIN (app->pipeline), "source"); /* configure for time-based format */ g_object_set (appsrc, "format", GST_FORMAT_TIME, NULL); /* setting maximum of bytes queued. default is 200000 */ gst_app_src_set_max_bytes((GstAppSrc *)appsrc, QUEUED_FRAMES * BUFFER_SIZE); /* uncomment the next line to block when appsrc has buffered enough */ /* g_object_set (appsrc, "block", TRUE, NULL); */ app->source = appsrc; bus = gst_element_get_bus (app->pipeline); gst_bus_add_watch (bus, (GstBusFunc) on_pipeline_message, app); gst_element_set_state (app->pipeline, GST_STATE_PLAYING); GstBuffer *app_buffer; GstFlowReturn ret; DBG("Entering writer main loop.\n"); while (!gblGetQuit()) { /* Infinite loop */ /* Procure the custom buffer we */ g_print ("Creating movie...\n"); app_buffer = gst_app_buffer_new (we.encodedBuffer, we.frameSize, g_free, we.encodedBuffer); gst_buffer_set_caps (app_buffer, gst_caps_from_string (video_caps)); GST_BUFFER_TIMESTAMP(app_buffer) = (GstClockTime)((we.timestamp) * 1e6); g_signal_emit_by_name (app->source, "push-buffer", app_buffer, &ret); g_print ("buffer\n"); } g_print ("Done.\n"); gst_app_src_end_of_stream (GST_APP_SRC (app->source)); gst_element_set_state (app->pipeline, GST_STATE_NULL); /* Cleaning up */ g_object_unref (mapping); gst_object_unref (bus); gst_object_unref (app->source); gst_object_unref (app->pipeline); g_free (app); }