Hi.

I want to accept the buffer from a custom buffer and transfer it to a 
gst-rtsp-server. So, I am using appsrc, to do this. Using a code similar to 
below, I was able to write to a file. For this, I need the pipeline (as a 
GstElement) which is being executed by the gst_rtsp_media_facory_set_launch 
(factory, string), so that I can procure the appsrc element, bus, and change 
the state of the pipeline.

I have tried using a similar code and writing to a file via filesink and it 
worked successfully.

Can someone help me out in getting the pipeline (appsrc ! rtpmp4vpay) as a 
GstElement???? Is there any other way to achieve this??? I am aware that the 
GstRTSPMedia has a pipeline, but I am unable to get it.

The code that I am using (I am mentioning the most important part of the code 
only. The complete code is there in the attached appsrc_rtspserver.txt) is:

typedef struct
{
  GstElement *pipeline;
  GstElement *source;
  guint source_id;
} AppData;

GstRTSPServer *server;
GstRTSPMediaFactory *factory;
GstRTSPMediaMapping *mapping;

server = gst_rtsp_server_new ();
factory = gst_rtsp_media_factory_new ();
gst_rtsp_media_factory_set_shared (factory, TRUE);

gchar *string = NULL;
string = g_strdup_printf ("(appsrc is-live=TRUE name=source caps=\"%s\" ! 
rtpmp4vpay pt=96 name=pay0 )", video_caps);
gst_rtsp_media_factory_set_launch (factory, string);
g_free (string);

AppData *app = NULL;
GstBus *bus = NULL;
GstElement *appsrc = NULL;
gst_init (NULL, NULL);
app = g_new0 (AppData, 1);

/*app->pipeline =                    ;*/  /* I need the pipeline for this */
if (app->pipeline == NULL) {
    g_print ("Bad pipeline\n");
    }

  appsrc = gst_bin_get_by_name (GST_BIN (app->pipeline), "source");
  /* configure for time-based format */
  g_object_set (appsrc, "format", GST_FORMAT_TIME, NULL);
  /* setting maximum of bytes queued. default is 200000 */
  gst_app_src_set_max_bytes((GstAppSrc *)appsrc, QUEUED_FRAMES * BUFFER_SIZE);
  /* uncomment the next line to block when appsrc has buffered enough */
  /* g_object_set (appsrc, "block", TRUE, NULL); */
  app->source = appsrc;
  bus = gst_element_get_bus (app->pipeline);
  gst_bus_add_watch (bus, (GstBusFunc) on_pipeline_message, app);
  gst_element_set_state (app->pipeline, GST_STATE_PLAYING);

  GstBuffer *app_buffer;
  GstFlowReturn ret;

/* While (Infinite loop) */

/* Procuring of the custom buffer (we) */

  app_buffer = gst_app_buffer_new (we.encodedBuffer, we.frameSize, g_free, 
we.encodedBuffer);
  gst_buffer_set_caps (app_buffer, gst_caps_from_string (video_caps));
  GST_BUFFER_TIMESTAMP(app_buffer) = (GstClockTime)((we.timestamp) * 1e6);
  g_signal_emit_by_name (app->source, "push-buffer", app_buffer, &ret);

/* end of infinite loop */

Thanks in advance.

Regards,
Neel.

#define BUFFER_SIZE  1843200

#define QUEUED_FRAMES 3

const gchar *video_caps =
    "video/mpeg, mpegversion=(int)4, framerate=(fraction)1001/30000, 
width=(int)1280, height=(int)720";

typedef struct
{
  GstElement *pipeline;
  GstElement *source;
  guint source_id;
} AppData;

static gboolean
on_pipeline_message (GstBus * bus, GstMessage * message, AppData * app)
{
  GstState state, pending;

  switch (GST_MESSAGE_TYPE (message)) {
    case GST_MESSAGE_EOS:
      g_print ("Received End of Stream message\n");
      break;
    case GST_MESSAGE_ERROR:
      g_print ("Received error\n");
      break;
    case GST_MESSAGE_STATE_CHANGED:
          gst_element_get_state(app->source, &state, &pending, 
GST_CLOCK_TIME_NONE);
      /* g_print ("State changed from %i to %i\n", state, pending); */
      break;
        default:
      break;
  }
  return TRUE;
}

void *writerThrFxn(void *arg)
{

GstRTSPServer *server;
GstRTSPMediaFactory *factory;
GstRTSPMediaMapping *mapping;

server = gst_rtsp_server_new ();
factory = gst_rtsp_media_factory_new ();
gst_rtsp_media_factory_set_shared (factory, TRUE);

gchar *string = NULL;
string = g_strdup_printf ("(appsrc is-live=TRUE name=source caps=\"%s\" ! 
rtpmp4vpay pt=96 name=pay0 )", video_caps);
gst_rtsp_media_factory_set_launch (factory, string);
g_free (string);

mapping = gst_rtsp_server_get_media_mapping (server);

gst_rtsp_media_mapping_add_factory (mapping, "/test", factory);

  AppData *app = NULL;
  GstBus *bus = NULL;
  GstElement *appsrc = NULL;
  gst_init (NULL, NULL);
  app = g_new0 (AppData, 1);

//app->pipeline = 

  if (app->pipeline == NULL) {
    g_print ("Bad pipeline\n");
    }
    
  appsrc = gst_bin_get_by_name (GST_BIN (app->pipeline), "source");
  /* configure for time-based format */
  g_object_set (appsrc, "format", GST_FORMAT_TIME, NULL);
  /* setting maximum of bytes queued. default is 200000 */
  gst_app_src_set_max_bytes((GstAppSrc *)appsrc, QUEUED_FRAMES * BUFFER_SIZE);
  /* uncomment the next line to block when appsrc has buffered enough */
  /* g_object_set (appsrc, "block", TRUE, NULL); */

  app->source = appsrc;
  bus = gst_element_get_bus (app->pipeline);
  gst_bus_add_watch (bus, (GstBusFunc) on_pipeline_message, app);
  gst_element_set_state (app->pipeline, GST_STATE_PLAYING);
  
  GstBuffer *app_buffer;
  GstFlowReturn ret;
  
    DBG("Entering writer main loop.\n");
 
   while (!gblGetQuit()) {                     /* Infinite loop */
        
/* Procure the custom buffer we */

  g_print ("Creating movie...\n");
  
  app_buffer = gst_app_buffer_new (we.encodedBuffer, we.frameSize, g_free, 
we.encodedBuffer);
  gst_buffer_set_caps (app_buffer, gst_caps_from_string (video_caps));
  GST_BUFFER_TIMESTAMP(app_buffer) = (GstClockTime)((we.timestamp) * 1e6);

  g_signal_emit_by_name (app->source, "push-buffer", app_buffer, &ret);
  g_print ("buffer\n");

 }

  g_print ("Done.\n");
  gst_app_src_end_of_stream (GST_APP_SRC (app->source));
  gst_element_set_state (app->pipeline, GST_STATE_NULL);

  /* Cleaning up */
  g_object_unref (mapping);
  gst_object_unref (bus);
  gst_object_unref (app->source);
  gst_object_unref (app->pipeline);
  g_free (app);

}
------------------------------------------------------------------------------
_______________________________________________
Gstreamer-embedded mailing list
Gstreamer-embedded@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/gstreamer-embedded

Reply via email to