GstAppSrc Error Stopped Playing. Not Negotiated (-4)

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

GstAppSrc Error Stopped Playing. Not Negotiated (-4)

namakilam7
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