All pastes #913687 Raw Edit

Anonymous

public text v1 · immutable
·published 2008-02-22 07:24 UTC
rendered paste body
#include <gst/gst.h>
#include <string.h>

static GMainLoop *loop;
GstElement *src, *pipeline, *csp, *venc, *fsink;
GstElement *audio_convert, *aenc, *mux, *fsink,*alsa_src,*video_queue,*audio_queue,*audio_bin,*video_bin;
GstPad *muxpad,*audio_pad,*video_pad,*mux_video_pad,*mux_audio_pad, *bin_audio_pad, *bin_video_pad;
GstCaps* caps,*audio_caps;

int flag = 0;

static gboolean ob_in_iofunc (GIOChannel* iochannel, GIOCondition condition, gpointer data)
{

  gchar buffer[256];
  int bytes_read;
  gint fd;
  gint ret;

  fd = g_io_channel_unix_get_fd(iochannel);
  bytes_read = read(fd, buffer, 256);
  buffer[bytes_read-1] = '\0';
  g_print("command:: %s\n", buffer);

  gst_element_set_state(src, GST_STATE_NULL);
  sleep(2);
  g_main_loop_quit (loop);

}

int
main (int argc, char *argv[])
{
  gst_init (&argc, &argv);

  pipeline = gst_pipeline_new (NULL);
  g_assert (pipeline);
 
  audio_bin = gst_bin_new(NULL);
  g_assert(audio_bin);

  video_bin = gst_bin_new(NULL);
  g_assert(video_bin);

  src = gst_element_factory_make ("videotestsrc", "src");
  g_assert (src);

  caps = gst_caps_new_simple("video/x-raw-rgb",
				"width", G_TYPE_INT, 176,
 			 	"height", G_TYPE_INT, 144,
                         	 NULL);

  csp = gst_element_factory_make ("ffmpegcolorspace", "csp");
  g_assert (csp);
    
  venc = gst_element_factory_make ("ffenc_mpeg4", "venc");
  g_assert (venc);

  video_queue = gst_element_factory_make("queue", "video_queue");
  g_assert (video_queue);


  mux = gst_element_factory_make ("ffmux_3gp", "mux");
  g_assert (mux);

  fsink = gst_element_factory_make ("filesink", "fsink");
  g_assert (fsink);
  g_object_set (G_OBJECT (fsink), "location", "sinkav.3gp", NULL);


  alsa_src = gst_element_factory_make ("audiotestsrc", "asrc");
  g_assert (src);
 
  audio_caps = gst_caps_new_simple("audio/x-raw-int",
				"rate", G_TYPE_INT, 8000,
 			 	"channels", G_TYPE_INT, 1,
				"depth",G_TYPE_INT,16,
                         	 NULL);

  audio_convert = gst_element_factory_make ("audioconvert", "aconv");
  g_assert (audio_convert);
    
  aenc = gst_element_factory_make ("amrnbenc", "aenc");
  g_assert (aenc);

  audio_queue = gst_element_factory_make("queue", "audio_queue");
  g_assert (audio_queue);

  gst_bin_add_many (GST_BIN (audio_bin), alsa_src, audio_convert, aenc, audio_queue,NULL);
  gst_bin_add_many (GST_BIN (video_bin), src, csp, venc, video_queue,NULL);
  gst_bin_add_many(GST_BIN (pipeline), audio_bin, video_bin, NULL);
  gst_bin_add_many(GST_BIN (pipeline), mux, fsink, NULL);
  gst_element_link(mux, fsink);

  if(!gst_element_link_filtered(alsa_src, audio_convert, audio_caps))
  {
	g_print("\nCouldn't Link Filter Caps\n");
  }
  gst_element_link_many (alsa_src, audio_convert, aenc, audio_queue, NULL);
  audio_pad = gst_element_get_pad(audio_queue, "src");
  g_assert(audio_pad);
  gst_element_add_pad(audio_bin, gst_ghost_pad_new("src", audio_pad));
  bin_audio_pad = gst_element_get_pad(audio_bin, "src");
  mux_audio_pad = gst_element_get_request_pad(mux, "audio_%d");
  g_print ("new pad %s\n", gst_pad_get_name (mux_audio_pad));
  g_assert(mux_audio_pad);
  gst_pad_link(bin_audio_pad, mux_audio_pad);

  if(!gst_element_link_filtered(src, csp, caps))
  {
	g_print("\nCouldn't Link Filter Caps\n");
  }
  gst_element_link_many (src,csp, venc, video_queue, NULL);
  video_pad = gst_element_get_pad(video_queue, "src");
  g_assert(video_pad);
  gst_element_add_pad(video_bin, gst_ghost_pad_new("src", video_pad));
  bin_video_pad = gst_element_get_pad(video_bin, "src");
  mux_video_pad = gst_element_get_request_pad(mux, "video_%d");
  g_print ("new pad %s\n", gst_pad_get_name (mux_video_pad));
  g_assert(mux_video_pad);
  gst_pad_link(bin_video_pad, mux_video_pad);

  
  g_print("\n Before playing the pipepline \n");
  

  gst_element_set_state(pipeline, GST_STATE_PLAYING); 

  /* we need to run a GLib main loop to get out of here */
  loop = g_main_loop_new (NULL, FALSE);
  
  GIOChannel*in;
  in = g_io_channel_unix_new (fileno(stdin));
  g_io_add_watch(in, G_IO_IN, ob_in_iofunc, NULL);
    
  g_main_loop_run (loop);

   /* Free the main loop */
  g_main_loop_unref (loop);

  return 0;
}