Advertisement
Guest User

Untitled

a guest
May 17th, 2018
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.48 KB | None | 0 0
  1. #ifdef QT_QML_DEBUG
  2. #include <QtQuick>
  3. #endif
  4.  
  5. #include <sailfishapp.h>
  6. #include <gst/gst.h>
  7.  
  8. //#define AUDIO_ENABLED
  9.  
  10. GstElement *pipeline, *video_source, *venc, *capsfilter0, *capsfilter1, *capsfilter2, *parser, *muxer,
  11. *sink, *fake1, *queue1, *queue2, *queue3, *queue4, *queue5, *droideglsink, *audio_source,
  12. *audio_encoder, *video_tee, *audio_tee, *tee_v_queue, *tee_a_queue,
  13. *video_handoff, *audio_handoff, *audio_enc_filter, *identity;
  14. GMainLoop *loop;
  15.  
  16. static gboolean
  17. handle_keyboard (GIOChannel * source, GIOCondition cond,
  18. GstPipeline * pipeline)
  19. {
  20. gchar *str = NULL;
  21.  
  22. if (g_io_channel_read_line (source, &str, NULL, NULL,
  23. NULL) != G_IO_STATUS_NORMAL) {
  24. return TRUE;
  25. }
  26.  
  27. switch (g_ascii_tolower (str[0])) {
  28. case 'z': {
  29. g_print("Dump pipleine\n");
  30. GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS (GST_BIN (pipeline),
  31. GST_DEBUG_GRAPH_SHOW_ALL, "ZZZ");
  32. }
  33. break;
  34. case 'q': {
  35. g_print("Stop pipleine\n");
  36. g_main_loop_quit (loop);
  37. //gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_NULL);
  38. g_print("Stop pipleine command sent\n");
  39. }
  40. break;
  41. default:
  42. break;
  43. }
  44. return TRUE;
  45. }
  46.  
  47. static gboolean
  48. bus_call (GstBus *bus,
  49. GstMessage *msg,
  50. gpointer data)
  51. {
  52. GMainLoop *loop = (GMainLoop *) data;
  53.  
  54. switch (GST_MESSAGE_TYPE (msg)) {
  55.  
  56. case GST_MESSAGE_EOS:
  57. g_print ("End of stream\n");
  58. g_main_loop_quit (loop);
  59. break;
  60.  
  61. case GST_MESSAGE_ERROR: {
  62. gchar *debug;
  63. GError *error;
  64.  
  65. gst_message_parse_error (msg, &error, &debug);
  66. g_free (debug);
  67.  
  68. g_printerr ("Error: %s\n", error->message);
  69. g_error_free (error);
  70.  
  71. g_main_loop_quit (loop);
  72. break;
  73. }
  74. case GST_MESSAGE_STATE_CHANGED: {
  75. /* We are only interested in state-changed messages from the pipeline */
  76. if (GST_MESSAGE_SRC (msg) == GST_OBJECT (pipeline)) {
  77. GstState old_state, new_state, pending_state;
  78. gchar* fname = NULL;
  79.  
  80. gst_message_parse_state_changed (msg, &old_state, &new_state,
  81. &pending_state);
  82.  
  83. g_print ("Pipeline state changed from %s to %s:\n",
  84. gst_element_state_get_name (old_state),
  85. gst_element_state_get_name (new_state));
  86.  
  87. fname = g_strdup_printf("DUMP_%s-%s", gst_element_state_get_name (old_state),
  88. gst_element_state_get_name (new_state));
  89.  
  90. //GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS (GST_BIN (pipeline),
  91. // GST_DEBUG_GRAPH_SHOW_ALL, fname);
  92.  
  93. g_free(fname);
  94. }
  95. }
  96. break;
  97. default:
  98. g_print("GST_MESSAGE %d\n", GST_MESSAGE_TYPE (msg));
  99. break;
  100. }
  101.  
  102. return TRUE;
  103. }
  104.  
  105.  
  106. void video_handoff_cb (GstElement* object, GstBuffer* buf, GstPad* pad,
  107. gpointer user_data)
  108. {
  109. if (GST_IS_BUFFER (buf)) {
  110. GstMemory* mem = gst_buffer_peek_memory(buf, 0);
  111. GstMapInfo info;
  112. gst_memory_map(mem, &info, GST_MAP_READ);
  113.  
  114. g_print("Video buffer received: size %u flags 0x%x nalu_type 0x%x\n", gst_buffer_get_size(buf),
  115. gst_buffer_get_flags(buf), info.data[4] & 0x1f);
  116.  
  117. gst_memory_unmap(mem, &info);
  118. }
  119. }
  120.  
  121. void video_handoff_preroll_cb (GstElement* object, GstBuffer* buf, GstPad* pad,
  122. gpointer user_data)
  123. {
  124. video_handoff_cb(object, buf, pad, user_data);
  125. }
  126.  
  127. void audio_handoff_cb (GstElement* object, GstBuffer* buf, GstPad* pad,
  128. gpointer user_data)
  129. {
  130. if (GST_IS_BUFFER (buf)) {
  131. GstMemory* mem = gst_buffer_peek_memory(buf, 0);
  132. GstMapInfo info;
  133. gst_memory_map(mem, &info, GST_MAP_READ);
  134.  
  135. g_print("Audio buffer received size %u flags 0x%x data 0x%x", gst_buffer_get_size(buf),
  136. gst_buffer_get_flags(buf), info.data[0]);
  137.  
  138. gst_memory_unmap(mem, &info);
  139. }
  140. }
  141.  
  142. void audio_handoff_preroll_cb (GstElement* object, GstBuffer* buf, GstPad* pad,
  143. gpointer user_data)
  144. {
  145. audio_handoff_cb(object, buf, pad, user_data);
  146. }
  147.  
  148. int main(int argc, char *argv[])
  149. {
  150. // SailfishApp::main() will display "qml/gst1.qml", if you need more
  151. // control over initialization, you can use:
  152. //
  153. // - SailfishApp::application(int, char *[]) to get the QGuiApplication *
  154. // - SailfishApp::createView() to get a new QQuickView * instance
  155. // - SailfishApp::pathTo(QString) to get a QUrl to a resource file
  156. // - SailfishApp::pathToMainQml() to get a QUrl to the main QML file
  157. //
  158. // To display the view, call "show()" (will show fullscreen on device).
  159.  
  160. GstBus *bus;
  161. guint bus_watch_id;
  162. GIOChannel *io_stdin;
  163. guint handle_keyboard_id;
  164.  
  165. /* Initialization */
  166. gst_init (&argc, &argv);
  167.  
  168. loop = g_main_loop_new (NULL, TRUE);
  169.  
  170. /* Create gstreamer elements */
  171. pipeline = gst_pipeline_new ("video-recorder");
  172.  
  173. /* Video */
  174. video_source = gst_element_factory_make ("droidcamsrc", "videosrc");
  175. venc = gst_element_factory_make ("droidvenc", "videoenc");
  176. identity = gst_element_factory_make("identity", "identity");
  177. parser = gst_element_factory_make ("h264parse", "h264parser");
  178. capsfilter0 = gst_element_factory_make("capsfilter", "capsfilter0");
  179. capsfilter1 = gst_element_factory_make("capsfilter", "capsfilter1");
  180. capsfilter2 = gst_element_factory_make("capsfilter", "capsfilter2");
  181. muxer = gst_element_factory_make ("matroskamux", "muxer");
  182. sink = gst_element_factory_make ("filesink", "sink");
  183. fake1 = gst_element_factory_make ("fakesink", "fake1");
  184. queue1 = gst_element_factory_make ("queue", "queue1");
  185. queue2 = gst_element_factory_make ("queue", "queue2");
  186. queue3 = gst_element_factory_make ("queue", "queue3");
  187. queue4 = gst_element_factory_make ("queue", "queue4");
  188. queue5 = gst_element_factory_make ("queue", "queue5");
  189. g_object_set(GST_OBJECT(video_source), "mode", 2, NULL);
  190. g_object_set(GST_OBJECT(identity), "silent", FALSE, NULL);
  191. g_object_set(GST_OBJECT(video_source), "camera-device", 0, NULL);
  192. g_object_set(GST_OBJECT(video_source), "sensor-orientation", 90, NULL);
  193. g_object_set(GST_OBJECT(sink), "location", "/home/nemo/stream.mp4", NULL);
  194. g_object_set(GST_OBJECT(capsfilter0), "caps", gst_caps_from_string("video/x-raw(memory:DroidVideoMetaData), width=1280, height=720, framerate=30/1"), NULL);
  195. g_object_set(GST_OBJECT(capsfilter1), "caps", gst_caps_from_string("video/x-h264, width=1280, height=720, framerate=30/1"), NULL);
  196. g_object_set(GST_OBJECT(capsfilter2), "caps", gst_caps_from_string("video/x-raw(memory:DroidMediaBuffer), width=1280, height=720, framerate=30/1"), NULL);
  197.  
  198. tee_v_queue = gst_element_factory_make ("queue", "tee_v_queue");
  199. tee_a_queue = gst_element_factory_make ("queue", "tee_a_queue");
  200. droideglsink = gst_element_factory_make ("droideglsink", "droideglsink");
  201. video_tee = gst_element_factory_make ("tee", "vtee");
  202. audio_tee = gst_element_factory_make ("tee", "atee");
  203. video_handoff = gst_element_factory_make ("fakesink", "fake_video_handoff");
  204. audio_handoff = gst_element_factory_make ("fakesink", "fake_audio_handoff");
  205.  
  206. /* Audio */
  207. audio_source = gst_element_factory_make ("pulsesrc", "audiosrc");
  208. audio_encoder = gst_element_factory_make ("droidaenc", "audioenc");
  209. audio_enc_filter = gst_element_factory_make ("capsfilter", "audioenc_filter");
  210. g_object_set(GST_OBJECT(audio_enc_filter), "caps",
  211. gst_caps_from_string("audio/mpeg,mpegversion=4"), NULL);
  212.  
  213. if (!pipeline) {
  214. g_printerr ("One element could not be created. Exiting.\n");
  215. return -1;
  216. }
  217.  
  218. gst_bin_add_many(GST_BIN (pipeline), video_source, venc, parser, muxer, sink, queue1,
  219. queue2, queue3, capsfilter0, capsfilter1, capsfilter2, fake1, video_tee, tee_v_queue, identity,
  220. queue4, video_handoff, NULL);
  221.  
  222. GstPad* vid_src = gst_element_get_static_pad(video_source, "vidsrc");
  223. GstPad* vf_src = gst_element_get_static_pad(video_source, "vfsrc");
  224. GstPad* img_src = gst_element_get_static_pad(video_source, "imgsrc");
  225. GstPad* queue1_sink = gst_element_get_static_pad(queue1, "sink");
  226. GstPad* queue2_sink = gst_element_get_static_pad(queue2, "sink");
  227. GstPad* queue3_sink = gst_element_get_static_pad(queue3, "sink");
  228. GstPad* filter1_sink = gst_element_get_static_pad(capsfilter1, "sink");
  229. GstPad* filter2_sink = gst_element_get_static_pad(capsfilter2, "sink");
  230. GstPad* mux_video_pad = gst_element_get_request_pad(muxer, "video_%u");
  231. GstPad* tee_v_srcpad = gst_element_get_request_pad(video_tee, "src_%u");
  232. GstPad* venc_src_pad = gst_element_get_static_pad(venc, "src");
  233.  
  234. /* Video ES */
  235. //gst_element_link_many(video_source, capsfilter0, venc, NULL);
  236. //gst_pad_link(venc_src_pad, filter1_sink);
  237. gst_element_link_many(video_source, capsfilter1, identity, NULL);
  238. gst_element_link_many(identity, queue1, parser, video_tee, NULL);
  239. gst_element_link_many(video_tee, queue4, muxer, sink, NULL);
  240. gst_element_link_many(video_tee, tee_v_queue, video_handoff, NULL);
  241. //gst_pad_link(tee_v_srcpad, mux_video_pad);
  242.  
  243. /* Preview/ViewFinder */
  244. gst_element_link_many(queue2, capsfilter2, fake1, NULL);
  245. gst_pad_link(vf_src, queue2_sink);
  246.  
  247. /* Photos */
  248. //gst_element_link_many(queue3, fake2, NULL);
  249. //gst_pad_link(img_src, queue3_sink);
  250. g_object_set( video_handoff, "signal-handoffs", TRUE, NULL);
  251. g_signal_connect(video_handoff, "handoff", G_CALLBACK (video_handoff_cb), NULL);
  252. g_signal_connect(video_handoff, "preroll-handoff", G_CALLBACK (video_handoff_preroll_cb), NULL);
  253.  
  254. #ifdef AUDIO_ENABLED
  255. GstPad* mux_audio_pad = gst_element_get_request_pad(muxer, "audio_%u");
  256. GstPad* tee_a_srcpad = gst_element_get_request_pad(audio_tee, "src_%u");
  257.  
  258. gst_bin_add_many(GST_BIN (pipeline), audio_source, audio_encoder, audio_enc_filter,
  259. tee_a_queue, audio_tee, audio_handoff, queue5, NULL);
  260. /* Audio */
  261. gst_element_link_many(audio_source, queue3, audio_encoder, audio_enc_filter, audio_tee, NULL);
  262. gst_element_link_many(audio_tee, tee_a_queue, audio_handoff, NULL);
  263. gst_element_link_many(audio_tee, queue5, muxer, sink, NULL);
  264.  
  265. // gst_pad_link(tee_a_srcpad, mux_audio_pad);
  266.  
  267. g_object_set(audio_handoff, "signal-handoffs", TRUE, NULL);
  268. g_signal_connect(audio_handoff, "handoff", G_CALLBACK (audio_handoff_cb), NULL);
  269. g_signal_connect(audio_handoff, "preroll-handoff", G_CALLBACK (audio_handoff_preroll_cb), NULL);
  270. #endif
  271.  
  272. /* we add a message handler */
  273. bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
  274. bus_watch_id = gst_bus_add_watch (bus, bus_call, loop);
  275. gst_object_unref (bus);
  276.  
  277. io_stdin = g_io_channel_unix_new (fileno (stdin));
  278. handle_keyboard_id =
  279. g_io_add_watch (io_stdin, G_IO_IN, (GIOFunc) handle_keyboard, pipeline);
  280.  
  281. gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PLAYING);
  282.  
  283. //GstElement* doridsrc = gst_bin_get_by_name(GST_BIN (pipeline), "droidsrc");
  284. g_signal_emit_by_name (video_source, "start-capture", NULL);
  285.  
  286. /* Iterate */
  287. g_print ("Running...\n");
  288. g_main_loop_run (loop);
  289. gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_NULL);
  290. g_print ("Main loop stopped...\n");
  291.  
  292. return SailfishApp::main(argc, argv);
  293. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement