/* Standard Linux headers */ #include /* Demo headers */ #include #include #include #include "encode.h" #include "writer.h" #include /* The levels of initialization */ #define VIDEOFILEINITIALIZED 0x1 int Save_cnt = 0; int Save_cnt2 = 0; int Save_Limit = 100; int StoreImage( char *pName, void *pAddr, long nSize ); //Edit 1 #include #include #include #include /* * an example application of using appsrc in push mode to create a video file. * from buffers we push into the pipeline. */ #define BUFFER_SIZE 1843200 #define QUEUED_FRAMES 3 /* these are the caps we are going to pass through the appsrc */ 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; /* called when we get a GstMessage from the pipeline when we get EOS, we * exit the mainloop and this testapp. */ 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; } /****************************************************************************** * writerThrFxn ******************************************************************************/ /** * @brief Writer thread * @param "void *arg" : arguments * @return status */ void *writerThrFxn(void *arg) { /********************************************************************************* Reading of Application buufer (we) **********************************************************************************/ AppData *app = NULL; gchar *string = NULL; GstBus *bus = NULL; GstElement *appsrc = NULL; gst_init (NULL, NULL); app = g_new0 (AppData, 1); string = g_strdup_printf ("appsrc is-live=true name=source caps=\"%s\" ! udpsink host=172.24.190.141 port=5000", video_caps); app->pipeline = gst_parse_launch (string, NULL); g_free (string); if (app->pipeline == NULL) { g_print ("Bad pipeline\n"); } appsrc = gst_bin_get_by_name (GST_BIN (app->pipeline), "source"); g_object_set (appsrc, "format", GST_FORMAT_TIME, NULL); gst_app_src_set_max_bytes((GstAppSrc *)appsrc, QUEUED_FRAMES * BUFFER_SIZE); 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"); /*************************** Enters infinite loop ********************************/ while (!gblGetQuit()) { 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 ("Done.\n"); gst_app_src_end_of_stream (GST_APP_SRC (app->source)); gst_element_set_state (app->pipeline, GST_STATE_NULL); /* Cleaning up */ gst_object_unref (bus); gst_object_unref (app->source); gst_object_unref (app->pipeline); g_free (app); }