why appsrc can only work 200 times?
Jun Zhang
zjustc at gmail.com
Tue Dec 6 11:47:35 PST 2011
Hi Mike
I found the error. It was the space when I make the filesink element.
Thanks for your help anyway.
Regards,
Jun
On Tue, Dec 6, 2011 at 2:03 PM, Jun Zhang <zjustc at gmail.com> wrote:
> Hi Mike,
>
> Thanks for your quick reply.
>
> Here is my codes for test.
> pipeline: appsrc->queue->filesink
>
> appsrc will read data from array mp3;
>
>
> Would you please take a look and give me some advice?
>
>
>
> //=====================begin of test codes==========
>
> // 200 error
>
> #include <gst/gst.h>
> #include <glib.h>
> #include <unistd.h>
> #include <stdlib.h>
> #include <pthread.h>
> #include <gst/app/gstappsrc.h>
> #include <string.h>
>
>
> static const guint8 mp3[] = { 0x11, 0x22, 0x33, 0x44, 0x50, 0x66,
> 0x08, 0xbb, 0x4b, 0x00, 0xff, 0xff, 0xff, 0x20, 0xbb, 0xff,0x08, 0xbb,
> 0x4b, 0x00, 0xff, 0xff, 0xff, 0x20, 0xbb, 0xff,
> 0x08, 0xbb, 0x4b, 0x00, 0xff, 0xff, 0xff, 0x20, 0xbb, 0xff,0x08, 0xbb,
> 0x4b, 0x00, 0xff, 0xff, 0xff, 0x20, 0xbb, 0xff,
> 0x08, 0xbb, 0x4b, 0x00, 0xff, 0xff, 0xff, 0x20, 0xbb, 0xff,0x08, 0xbb,
> 0x4b, 0x00, 0xff, 0xff, 0xff, 0x20, 0xbb, 0xff,
> 0x08, 0xbb, 0x4b, 0x00, 0xff, 0xff, 0xff, 0x20, 0xbb, 0xff,0x08, 0xbb,
> 0x4b, 0x00, 0xff, 0xff, 0xff, 0x20, 0xbb, 0xff,
> 0x08, 0xbb, 0x4b, 0x00, 0xff, 0xff, 0xff, 0x20, 0xbb, 0xff,0x08, 0xbb,
> 0x4b, 0x00, 0xff, 0xff, 0xff, 0x20, 0xbb, 0xff,
> 0x08, 0xbb, 0x4b, 0x00, 0xff, 0xff, 0xff, 0x20, 0xbb, 0xff,0x08, 0xbb,
> 0x4b, 0x00, 0xff, 0xff, 0xff, 0x20, 0xbb, 0xff,
> 0x08, 0xbb, 0x4b, 0x00, 0xff, 0xff, 0xff, 0x20, 0xbb, 0xff,0x08, 0xbb,
> 0x4b, 0x00, 0xff, 0xff, 0xff, 0x20, 0xbb, 0xff,
> 0x08, 0xbb, 0x4b, 0x00, 0xff, 0xff, 0xff, 0x20, 0xbb, 0xff,0x08, 0xbb,
> 0x4b, 0x00, 0xff, 0xff, 0xff, 0x20, 0xbb, 0xff,
> 0x08, 0xbb, 0x4b, 0x00, 0xff, 0xff, 0xff, 0x20, 0xbb, 0xff,0x08, 0xbb,
> 0x4b, 0x00, 0xff, 0xff, 0xff, 0x20, 0xbb, 0xff,
> 0x08, 0xbb, 0x4b, 0x00, 0xff, 0xff, 0xff, 0x20, 0xbb, 0xff,0x08, 0xbb,
> 0x4b, 0x00, 0xff, 0xff, 0xff, 0x20, 0xbb, 0xff,
> 0x08, 0xbb, 0x4b, 0x00, 0xff, 0xff, 0xff, 0x20, 0xbb, 0xff,0x08, 0xbb,
> 0x4b, 0x00, 0xff, 0xff, 0xff, 0x20, 0xbb, 0xff,
> 0x08, 0xbb, 0x4b, 0x00, 0xff, 0xff, 0xff, 0x20, 0xbb, 0xff,0x08, 0xbb,
> 0x4b, 0x00, 0xff, 0xff, 0xff, 0x20, 0x45, 0x32
> };
>
>
> typedef struct _App App;
>
> struct _App
> {
> GstElement *appsrc;
> GstElement *filesink;
> GstElement *queue;
> GstElement *pipeline;
> GMainLoop *loop;
> guint length;
> guint64 offset;
> };
>
>
> App s_app;
>
>
>
> static void feed_data (GstElement * appsrc, guint size, App* app)
> {
> GstFlowReturn ret;
> g_print("************************start**********************************
> \n");
>
> if (app->offset >= app->length) {
> /* we are EOS, send end-of-stream */
> g_signal_emit_by_name (appsrc, "end-of-stream", &ret);
> return;
> }
>
> GstBuffer *buffer;
> guint8 frame_size;
> guint8 *tmpdata=malloc(1);
> *tmpdata=mp3[app->offset];
> frame_size=1;
>
>
> buffer = gst_buffer_new_and_alloc (frame_size);
> gst_buffer_set_data(buffer, tmpdata, frame_size);
>
> g_print("buffer data = 0x%x \n", *GST_BUFFER_DATA(buffer));
> g_signal_emit_by_name (appsrc, "push-buffer", buffer, &ret);
>
> gst_buffer_unref (buffer);
>
> app->offset=app->offset+1;
> g_print("Read thread frame offset = %d \n", app->offset);
> return;
> }
>
> static gboolean
> bus_call(GstBus * bus, GstMessage * msg, App * app)
> {
> GST_DEBUG ("got message %s",
> gst_message_type_get_name (GST_MESSAGE_TYPE (msg)));
>
> switch (GST_MESSAGE_TYPE (msg)) {
> case GST_MESSAGE_EOS:
> g_main_loop_quit (app->loop);
> g_error ("End of streame");
> break;
>
> case GST_MESSAGE_ERROR: {
> gchar *debug = NULL;
> GError *err = NULL;
> gst_message_parse_error (msg, &err, &debug);
> g_print ("Error: %s\n", err->message);
> g_error_free (err);
> if (debug) {
> g_print ("Debug details: %s\n", debug);
> g_free (debug);
> }
> g_main_loop_quit (app->loop);
> break;
> }
> default:
> break;
> }
> return TRUE;
> }
>
>
> int main()
> {
> gst_init(NULL,NULL);
>
> App *app=&s_app;
> g_print (" app->FIFObuf ok \n ");
>
>
> GstBus* bus;
> app->length=sizeof(mp3);
> app->offset=0;
>
> GstStateChangeReturn ret;
> g_print (" Gstreamer Init completed \n ");
>
>
>
>
> app->appsrc = gst_element_factory_make("appsrc", "appsrc");
> app->filesink = gst_element_factory_make(" filesink", " filesink");
> app->queue = gst_element_factory_make("queue", "queue");
> app->pipeline = gst_pipeline_new("server");
> app->loop = g_main_loop_new(NULL, TRUE);
> g_print ("1 \n");
> // g_object_set(G_OBJECT(app->appsrc, "is-live", TRUE,
> "caps","video/x-264",NULL);
>
> // g_object_set(G_OBJECT(app->appsrc),
> "is-live",TRUE,"max-bytes",0,NULL);
> g_object_set(G_OBJECT(app->filesink), "location", "appsrc.data",
> NULL);
> g_print ("2 \n");
> g_signal_connect(G_OBJECT(app->appsrc), "need-data",
> G_CALLBACK(feed_data), app);
>
> g_print ("3 \n");
>
> bus = gst_pipeline_get_bus (GST_PIPELINE (app->pipeline));
> gst_bus_add_watch (bus, (GstBusFunc)bus_call, app->loop);
> gst_object_unref(bus);
>
>
> gst_bin_add_many(GST_BIN(app->pipeline),app->appsrc,app->queue,app->filesink,NULL);
>
> if (!gst_element_link_many (app->appsrc,app->queue,app->filesink,
> NULL)) {
> g_print ("Failed to link one or more elements! \n");
> return -1;
> }
>
>
> ret=gst_element_set_state(app->pipeline, GST_STATE_PLAYING);
> g_print("Gst-Pipeline is Running.........\n");
>
> if (ret == GST_STATE_CHANGE_FAILURE) {
> GstMessage *msg;
> g_print ("Failed to start up pipeline! \n");
> /* check if there is an error message with details on the bus */
> msg = gst_bus_poll (bus, GST_MESSAGE_ERROR, 0);
> if (msg) {
> GError *err = NULL;
> gst_message_parse_error (msg, &err, NULL);
> g_print ("ERROR: %s\n", err->message);
> g_error_free (err);
> gst_message_unref (msg);
> }
> return -1;
> //pthread_exit (NULL);
> }
>
> g_main_loop_run(app->loop);
>
> /* Out of the main loop, clean up nicely */
> g_print("Returned, stopping playback\n");
> gst_element_set_state(app->pipeline, GST_STATE_NULL);
>
> g_print("Deleting pipeline\n");
> gst_object_unref(GST_OBJECT(app->pipeline));
>
> g_object_unref(app->appsrc);
>
> return 0;
> }
>
>
> //=================end of test codes
>
>
>
>
>
> On Tue, Dec 6, 2011 at 1:26 PM, Michael Smith <msmith at xiph.org> wrote:
>
>> There is no such limitation in appsrc - it does have a maximum number
>> of bytes to buffer internally (defaults to 200000), but that shouldn't
>> be a problem unless the rest of your pipeline isn't running. Also, 300
>> is a lot smaller than 200000, so perhaps you have another problem.
>>
>> Perhaps there's a bug with how the rest of your pipeline works. Of
>> course, since you provided no details about your application other
>> than that it uses appsrc, I can't suggest anything specific.
>>
>> Mike
>>
>>
>>
>> On Tue, Dec 6, 2011 at 9:09 AM, Nathan <zjustc at gmail.com> wrote:
>> > Greetings,
>> >
>> > Currently, I am testing the appsrc element, which will use "need-data"
>> > signal.
>> > g_signal_connect(G_OBJECT(app->appsrc), "need-data",
>> > G_CALLBACK(feed_data), app)
>> > my feed_data function will read data from a array with 300 guint8
>> numbers.
>> >
>> > The codes work fine in the beginning, however it will stop when the
>> > feed_data read the 200th number.
>> > I run it for many times, the code will exactly stop at 200th number.
>> >
>> > Anyone knows how that happen?
>> > Any trick to set the properties of appsrc?
>> >
>> > Thanks,
>> >
>> > Jun
>> >
>> > --
>> > View this message in context:
>> http://gstreamer-devel.966125.n4.nabble.com/why-appsrc-can-only-work-200-times-tp4165570p4165570.html
>> > Sent from the GStreamer-devel mailing list archive at Nabble.com.
>> > _______________________________________________
>> > gstreamer-devel mailing list
>> > gstreamer-devel at lists.freedesktop.org
>> > http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
>> _______________________________________________
>> gstreamer-devel mailing list
>> gstreamer-devel at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/gstreamer-devel
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/gstreamer-devel/attachments/20111206/d9b1fe1a/attachment.htm>
More information about the gstreamer-devel
mailing list