why appsrc can only work 200 times?

Jun Zhang zjustc at gmail.com
Tue Dec 6 11:03:40 PST 2011


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/60f30ab2/attachment.html>


More information about the gstreamer-devel mailing list