Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #ifdef QT_QML_DEBUG
- #include <QtQuick>
- #endif
- #include <sailfishapp.h>
- #include <gst/gst.h>
- //#define AUDIO_ENABLED
- GstElement *pipeline, *video_source, *venc, *capsfilter0, *capsfilter1, *capsfilter2, *parser, *muxer,
- *sink, *fake1, *queue1, *queue2, *queue3, *queue4, *queue5, *droideglsink, *audio_source,
- *audio_encoder, *video_tee, *audio_tee, *tee_v_queue, *tee_a_queue,
- *video_handoff, *audio_handoff, *audio_enc_filter, *identity;
- GMainLoop *loop;
- static gboolean
- handle_keyboard (GIOChannel * source, GIOCondition cond,
- GstPipeline * pipeline)
- {
- gchar *str = NULL;
- if (g_io_channel_read_line (source, &str, NULL, NULL,
- NULL) != G_IO_STATUS_NORMAL) {
- return TRUE;
- }
- switch (g_ascii_tolower (str[0])) {
- case 'z': {
- g_print("Dump pipleine\n");
- GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS (GST_BIN (pipeline),
- GST_DEBUG_GRAPH_SHOW_ALL, "ZZZ");
- }
- break;
- case 'q': {
- g_print("Stop pipleine\n");
- g_main_loop_quit (loop);
- //gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_NULL);
- g_print("Stop pipleine command sent\n");
- }
- break;
- default:
- break;
- }
- return TRUE;
- }
- static gboolean
- bus_call (GstBus *bus,
- GstMessage *msg,
- gpointer data)
- {
- GMainLoop *loop = (GMainLoop *) data;
- switch (GST_MESSAGE_TYPE (msg)) {
- case GST_MESSAGE_EOS:
- g_print ("End of stream\n");
- g_main_loop_quit (loop);
- break;
- case GST_MESSAGE_ERROR: {
- gchar *debug;
- GError *error;
- gst_message_parse_error (msg, &error, &debug);
- g_free (debug);
- g_printerr ("Error: %s\n", error->message);
- g_error_free (error);
- g_main_loop_quit (loop);
- break;
- }
- case GST_MESSAGE_STATE_CHANGED: {
- /* We are only interested in state-changed messages from the pipeline */
- if (GST_MESSAGE_SRC (msg) == GST_OBJECT (pipeline)) {
- GstState old_state, new_state, pending_state;
- gchar* fname = NULL;
- gst_message_parse_state_changed (msg, &old_state, &new_state,
- &pending_state);
- g_print ("Pipeline state changed from %s to %s:\n",
- gst_element_state_get_name (old_state),
- gst_element_state_get_name (new_state));
- fname = g_strdup_printf("DUMP_%s-%s", gst_element_state_get_name (old_state),
- gst_element_state_get_name (new_state));
- //GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS (GST_BIN (pipeline),
- // GST_DEBUG_GRAPH_SHOW_ALL, fname);
- g_free(fname);
- }
- }
- break;
- default:
- g_print("GST_MESSAGE %d\n", GST_MESSAGE_TYPE (msg));
- break;
- }
- return TRUE;
- }
- void video_handoff_cb (GstElement* object, GstBuffer* buf, GstPad* pad,
- gpointer user_data)
- {
- if (GST_IS_BUFFER (buf)) {
- GstMemory* mem = gst_buffer_peek_memory(buf, 0);
- GstMapInfo info;
- gst_memory_map(mem, &info, GST_MAP_READ);
- g_print("Video buffer received: size %u flags 0x%x nalu_type 0x%x\n", gst_buffer_get_size(buf),
- gst_buffer_get_flags(buf), info.data[4] & 0x1f);
- gst_memory_unmap(mem, &info);
- }
- }
- void video_handoff_preroll_cb (GstElement* object, GstBuffer* buf, GstPad* pad,
- gpointer user_data)
- {
- video_handoff_cb(object, buf, pad, user_data);
- }
- void audio_handoff_cb (GstElement* object, GstBuffer* buf, GstPad* pad,
- gpointer user_data)
- {
- if (GST_IS_BUFFER (buf)) {
- GstMemory* mem = gst_buffer_peek_memory(buf, 0);
- GstMapInfo info;
- gst_memory_map(mem, &info, GST_MAP_READ);
- g_print("Audio buffer received size %u flags 0x%x data 0x%x", gst_buffer_get_size(buf),
- gst_buffer_get_flags(buf), info.data[0]);
- gst_memory_unmap(mem, &info);
- }
- }
- void audio_handoff_preroll_cb (GstElement* object, GstBuffer* buf, GstPad* pad,
- gpointer user_data)
- {
- audio_handoff_cb(object, buf, pad, user_data);
- }
- int main(int argc, char *argv[])
- {
- // SailfishApp::main() will display "qml/gst1.qml", if you need more
- // control over initialization, you can use:
- //
- // - SailfishApp::application(int, char *[]) to get the QGuiApplication *
- // - SailfishApp::createView() to get a new QQuickView * instance
- // - SailfishApp::pathTo(QString) to get a QUrl to a resource file
- // - SailfishApp::pathToMainQml() to get a QUrl to the main QML file
- //
- // To display the view, call "show()" (will show fullscreen on device).
- GstBus *bus;
- guint bus_watch_id;
- GIOChannel *io_stdin;
- guint handle_keyboard_id;
- /* Initialization */
- gst_init (&argc, &argv);
- loop = g_main_loop_new (NULL, TRUE);
- /* Create gstreamer elements */
- pipeline = gst_pipeline_new ("video-recorder");
- /* Video */
- video_source = gst_element_factory_make ("droidcamsrc", "videosrc");
- venc = gst_element_factory_make ("droidvenc", "videoenc");
- identity = gst_element_factory_make("identity", "identity");
- parser = gst_element_factory_make ("h264parse", "h264parser");
- capsfilter0 = gst_element_factory_make("capsfilter", "capsfilter0");
- capsfilter1 = gst_element_factory_make("capsfilter", "capsfilter1");
- capsfilter2 = gst_element_factory_make("capsfilter", "capsfilter2");
- muxer = gst_element_factory_make ("matroskamux", "muxer");
- sink = gst_element_factory_make ("filesink", "sink");
- fake1 = gst_element_factory_make ("fakesink", "fake1");
- queue1 = gst_element_factory_make ("queue", "queue1");
- queue2 = gst_element_factory_make ("queue", "queue2");
- queue3 = gst_element_factory_make ("queue", "queue3");
- queue4 = gst_element_factory_make ("queue", "queue4");
- queue5 = gst_element_factory_make ("queue", "queue5");
- g_object_set(GST_OBJECT(video_source), "mode", 2, NULL);
- g_object_set(GST_OBJECT(identity), "silent", FALSE, NULL);
- g_object_set(GST_OBJECT(video_source), "camera-device", 0, NULL);
- g_object_set(GST_OBJECT(video_source), "sensor-orientation", 90, NULL);
- g_object_set(GST_OBJECT(sink), "location", "/home/nemo/stream.mp4", NULL);
- g_object_set(GST_OBJECT(capsfilter0), "caps", gst_caps_from_string("video/x-raw(memory:DroidVideoMetaData), width=1280, height=720, framerate=30/1"), NULL);
- g_object_set(GST_OBJECT(capsfilter1), "caps", gst_caps_from_string("video/x-h264, width=1280, height=720, framerate=30/1"), NULL);
- g_object_set(GST_OBJECT(capsfilter2), "caps", gst_caps_from_string("video/x-raw(memory:DroidMediaBuffer), width=1280, height=720, framerate=30/1"), NULL);
- tee_v_queue = gst_element_factory_make ("queue", "tee_v_queue");
- tee_a_queue = gst_element_factory_make ("queue", "tee_a_queue");
- droideglsink = gst_element_factory_make ("droideglsink", "droideglsink");
- video_tee = gst_element_factory_make ("tee", "vtee");
- audio_tee = gst_element_factory_make ("tee", "atee");
- video_handoff = gst_element_factory_make ("fakesink", "fake_video_handoff");
- audio_handoff = gst_element_factory_make ("fakesink", "fake_audio_handoff");
- /* Audio */
- audio_source = gst_element_factory_make ("pulsesrc", "audiosrc");
- audio_encoder = gst_element_factory_make ("droidaenc", "audioenc");
- audio_enc_filter = gst_element_factory_make ("capsfilter", "audioenc_filter");
- g_object_set(GST_OBJECT(audio_enc_filter), "caps",
- gst_caps_from_string("audio/mpeg,mpegversion=4"), NULL);
- if (!pipeline) {
- g_printerr ("One element could not be created. Exiting.\n");
- return -1;
- }
- gst_bin_add_many(GST_BIN (pipeline), video_source, venc, parser, muxer, sink, queue1,
- queue2, queue3, capsfilter0, capsfilter1, capsfilter2, fake1, video_tee, tee_v_queue, identity,
- queue4, video_handoff, NULL);
- GstPad* vid_src = gst_element_get_static_pad(video_source, "vidsrc");
- GstPad* vf_src = gst_element_get_static_pad(video_source, "vfsrc");
- GstPad* img_src = gst_element_get_static_pad(video_source, "imgsrc");
- GstPad* queue1_sink = gst_element_get_static_pad(queue1, "sink");
- GstPad* queue2_sink = gst_element_get_static_pad(queue2, "sink");
- GstPad* queue3_sink = gst_element_get_static_pad(queue3, "sink");
- GstPad* filter1_sink = gst_element_get_static_pad(capsfilter1, "sink");
- GstPad* filter2_sink = gst_element_get_static_pad(capsfilter2, "sink");
- GstPad* mux_video_pad = gst_element_get_request_pad(muxer, "video_%u");
- GstPad* tee_v_srcpad = gst_element_get_request_pad(video_tee, "src_%u");
- GstPad* venc_src_pad = gst_element_get_static_pad(venc, "src");
- /* Video ES */
- //gst_element_link_many(video_source, capsfilter0, venc, NULL);
- //gst_pad_link(venc_src_pad, filter1_sink);
- gst_element_link_many(video_source, capsfilter1, identity, NULL);
- gst_element_link_many(identity, queue1, parser, video_tee, NULL);
- gst_element_link_many(video_tee, queue4, muxer, sink, NULL);
- gst_element_link_many(video_tee, tee_v_queue, video_handoff, NULL);
- //gst_pad_link(tee_v_srcpad, mux_video_pad);
- /* Preview/ViewFinder */
- gst_element_link_many(queue2, capsfilter2, fake1, NULL);
- gst_pad_link(vf_src, queue2_sink);
- /* Photos */
- //gst_element_link_many(queue3, fake2, NULL);
- //gst_pad_link(img_src, queue3_sink);
- g_object_set( video_handoff, "signal-handoffs", TRUE, NULL);
- g_signal_connect(video_handoff, "handoff", G_CALLBACK (video_handoff_cb), NULL);
- g_signal_connect(video_handoff, "preroll-handoff", G_CALLBACK (video_handoff_preroll_cb), NULL);
- #ifdef AUDIO_ENABLED
- GstPad* mux_audio_pad = gst_element_get_request_pad(muxer, "audio_%u");
- GstPad* tee_a_srcpad = gst_element_get_request_pad(audio_tee, "src_%u");
- gst_bin_add_many(GST_BIN (pipeline), audio_source, audio_encoder, audio_enc_filter,
- tee_a_queue, audio_tee, audio_handoff, queue5, NULL);
- /* Audio */
- gst_element_link_many(audio_source, queue3, audio_encoder, audio_enc_filter, audio_tee, NULL);
- gst_element_link_many(audio_tee, tee_a_queue, audio_handoff, NULL);
- gst_element_link_many(audio_tee, queue5, muxer, sink, NULL);
- // gst_pad_link(tee_a_srcpad, mux_audio_pad);
- g_object_set(audio_handoff, "signal-handoffs", TRUE, NULL);
- g_signal_connect(audio_handoff, "handoff", G_CALLBACK (audio_handoff_cb), NULL);
- g_signal_connect(audio_handoff, "preroll-handoff", G_CALLBACK (audio_handoff_preroll_cb), NULL);
- #endif
- /* we add a message handler */
- bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
- bus_watch_id = gst_bus_add_watch (bus, bus_call, loop);
- gst_object_unref (bus);
- io_stdin = g_io_channel_unix_new (fileno (stdin));
- handle_keyboard_id =
- g_io_add_watch (io_stdin, G_IO_IN, (GIOFunc) handle_keyboard, pipeline);
- gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PLAYING);
- //GstElement* doridsrc = gst_bin_get_by_name(GST_BIN (pipeline), "droidsrc");
- g_signal_emit_by_name (video_source, "start-capture", NULL);
- /* Iterate */
- g_print ("Running...\n");
- g_main_loop_run (loop);
- gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_NULL);
- g_print ("Main loop stopped...\n");
- return SailfishApp::main(argc, argv);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement