Following the code I am using to build a pipeline to stream raw pcm samples
on rtp stream. static gboolean push_buffer2(AppData * app) { gpointer raw_buffer; GstBuffer *app_buffer; GstMemory *mem; GstFlowReturn ret; app->num_frame++; if (!app->isCallConnected && connectedCalls != 0) { return TRUE; } char *data = app->dataQueue->pop(); if (data == NULL) { data = (char*)malloc(sizeof(char) * 960); memset(data, 0, 960); } app_buffer = gst_buffer_new(); //mem = gst_allocator_alloc(NULL, BUFFER_SIZE, NULL); mem = gst_memory_new_wrapped(GST_MEMORY_FLAG_READONLY, data, 960, 0, 960, NULL, NULL); gst_buffer_append_memory(app_buffer, mem); gst_buffer_set_size(app_buffer, BUFFER_SIZE); /* Setting the correct timestamp for the buffer is very important, otherwise the * resulting file won't be created correctly */ GST_BUFFER_TIMESTAMP(app_buffer) = (GstClockTime)((app->num_frame * 0.06) * 1e9); /* push new buffer */ g_signal_emit_by_name(app->source, "push-buffer", app_buffer, &ret); gst_buffer_unref(app_buffer); if (ret != GST_FLOW_OK) { /* some error, stop sending data */ return FALSE; } //return TRUE; return TRUE; } /* This signal callback is called when appsrc needs data, we add an idle handler * to the mainloop to start pushing data into the appsrc */ static void start_feed(GstElement * pipeline, guint size, AppData * app) { if (app->source_id == 0) { //g_print("start feeding at frame %i\n", app->num_frame); app->source_id = g_idle_add((GSourceFunc)push_buffer2, app); } } /* This callback is called when appsrc has enough data and we can stop sending. * We remove the idle handler from the mainloop */ static void stop_feed(GstElement * pipeline, AppData * app) { if (app->source_id != 0) { //g_print("stop feeding at frame %i\n", app->num_frame); g_source_remove(app->source_id); app->source_id = 0; } } static void runGstPipeline() { GstBus *bus = NULL; //GstElement *appsrc = NULL; //GstElement *appsrc2 = NULL; GstElement *pipeline, *mixer, *ac1, *mulawenc, *rtppcmupay, *udpsink, *appsrc, *ac2, *ar, *wavenc, *wavparse, *ac3; GstCaps *caps = gst_caps_new_simple("audio/x-raw", "format", G_TYPE_STRING, "S16LE", "channels", G_TYPE_INT, 1, "rate", G_TYPE_INT, 8000, NULL); GstPad *adder_sinkpad1; gst_init(NULL, NULL); pipeline = gst_pipeline_new("audio-send-pipeline"); mixer = gst_element_factory_make("adder", "audio-mixer"); ac1 = gst_element_factory_make("audioconvert", "conv1"); mulawenc = gst_element_factory_make("mulawenc", "mulaw-enc"); rtppcmupay = gst_element_factory_make("rtppcmupay", "pay"); udpsink = gst_element_factory_make("udpsink", "sink"); g_object_set(udpsink, "host", "127.0.0.1", "port", 5000, NULL); appsrc = gst_element_factory_make("appsrc", "source1"); gst_app_src_set_caps(GST_APP_SRC(appsrc), caps); ac2 = gst_element_factory_make("audioconvert", "conv2"); ar = gst_element_factory_make("audioresample", "resam1"); wavenc = gst_element_factory_make("wavenc", "enc1"); wavparse = gst_element_factory_make("wavparse", "parse1"); ac3 = gst_element_factory_make("audioconvert", "conv3"); if (!pipeline || !mixer || !ac1 || !mulawenc || !rtppcmupay || !udpsink || !appsrc || !ac2 || !ar || !wavenc || !wavparse || !ac3) { g_printerr("One or more elements could not be created. Exiting\n"); return; } bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline)); gst_bin_add_many(GST_BIN(pipeline), mixer ,ac1 ,mulawenc ,rtppcmupay ,udpsink ,appsrc ,ac2 ,ar ,wavenc ,wavparse ,ac3, NULL); int n = 0; if ((n = gst_element_link(mixer, ac1)) == 0) { g_print("link error: %d\n", n); g_print("cannot link mixer with caps-filter-1\n"); } if ((n = gst_element_link(ac1, mulawenc)) == 0) { g_print("link error: %d\n", n); g_print("cannot link audio-convert-1 with mulawenc\n"); } if ((n = gst_element_link(mulawenc, udpsink)) == 0) { g_print("link error: %d\n", n); g_print("cannot link mulawenc with udpsink\n"); } if ((n = gst_element_link(appsrc, ac2)) == 0) { g_print("link error: %d\n", n); g_print("cannot link appsrc with caps-filter-2\n"); } if ((n = gst_element_link(ac2, ar)) == 0) { g_print("link error: %d\n", n); g_print("cannot link audio-convert-2 with audio-resample\n"); } if ((n = gst_element_link(ar, wavenc)) == 0) { g_print("link error: %d\n", n); g_print("cannot link audio-resample with wav-enc\n"); } if ((n = gst_element_link(wavenc, wavparse)) == 0) { g_print("link error: %d\n", n); g_print("cannot link wav-enc with wav-parse\n"); } if ((n = gst_element_link(wavparse, ac3)) == 0) { g_print("link error: %d\n", n); g_print("cannot link wav-parse with ac3\n"); } adder_sinkpad1 = gst_element_get_request_pad(mixer, "sink_%u"); g_print("PadName : %s", gst_pad_get_name(adder_sinkpad1)); GstPad *srcPad = gst_element_get_static_pad(ac3, "src"); if ((n = gst_pad_link(srcPad, adder_sinkpad1)) != 0) { g_print("pad error: %d\n", n); g_print("cannot link audio-convert-3 with adder"); } sendAppData = g_new0(AppData, 1); sendAppData->pipeline = pipeline; sendAppData->loop = g_main_loop_new(NULL, FALSE); /* setting up pipeline, we push media data into this pipeline that will * then be recorded to a file, encoded with a codec*/ if (sendAppData->pipeline == NULL) { g_print("Bad pipeline\n"); return; } sendAppData->source = appsrc; sendAppData->dataQueue = &dataQueue; /* setting maximum of bytes queued */ gst_app_src_set_max_bytes((GstAppSrc *)appsrc, QUEUED_FRAMES * BUFFER_SIZE); g_signal_connect(sendAppData->source, "need-data", G_CALLBACK(start_feed), sendAppData); g_signal_connect(sendAppData->source, "enough-data", G_CALLBACK(stop_feed), sendAppData); /* add watch for messages */ //bus = gst_element_get_bus(sendAppData->pipeline); gst_bus_add_watch(bus, (GstBusFunc)on_pipeline_message, sendAppData); gst_object_unref(bus); /* configure the appsrc, we will push data into the appsrc from the * mainloop */ gst_element_set_state(sendAppData->pipeline, GST_STATE_PLAYING); sendAppData->dataQueue = new ThreadSafeQueue<char*>(); available.push(sendAppData); /* this mainloop is stopped when we receive an error or EOS */ g_print("Creating movie...\n"); g_main_loop_run(sendAppData->loop); g_print("Done.\n"); gst_element_set_state(sendAppData->pipeline, GST_STATE_NULL); /* Cleaning up */ gst_object_unref(sendAppData->source); gst_object_unref(sendAppData->pipeline); g_main_loop_unref(sendAppData->loop); g_free(sendAppData); /* $$$$$$$$$$$$$$$$$$$$$$$$ STOP PIPELINE AND RETURN $$$$$$$$$$$$$$$$$$$$$$$$ */ } -- Sent from: http://gstreamer-devel.966125.n4.nabble.com/ _______________________________________________ gstreamer-devel mailing list [hidden email] https://lists.freedesktop.org/mailman/listinfo/gstreamer-devel |
Free forum by Nabble | Edit this page |