All pastes #956495 Raw Edit

Something

public text v1 · immutable
#956495 ·published 2008-03-25 10:47 UTC
rendered paste body
#include <stdio.h>
#include <gst/gst.h>


GstElement *vsrc, *vconv, *venc, *muxer, *fsink, *muxer, *queue1, *queue2, *pipeline, *vsink, *tee, *joker, *scale, *asrc, *aenc;
GMainLoop* loop;
GIOChannel *in;
int fd;
GstPad *rpad, *spad, *vmuxpad;
GstBin *pbin;
GstBus *bus;

gboolean fsave;
gulong id;

static gboolean
bus_call (GstBus     *bus,
	  GstMessage *msg,
	  gpointer    data)
{
  GMainLoop *loop = (GMainLoop *) data;

  switch (GST_MESSAGE_TYPE (msg)) {
    case GST_MESSAGE_EOS:
      g_print ("End-of-stream\n");
      g_main_loop_quit (loop);
      break;
    case GST_MESSAGE_ERROR: {
      gchar *debug;
      GError *err;

      gst_message_parse_error (msg, &err, &debug);
      g_free (debug);

      g_print ("Error: %s\n", err->message);
      g_error_free (err);

      g_main_loop_quit (loop);
      break;
    }
     case GST_MESSAGE_STATE_CHANGED: {
      GstState old, new, pending;
      gst_message_parse_state_changed(msg, &old, &new, &pending);
      g_print ("%s changed state from %d to %d, pending %d\n", GST_ELEMENT_NAME(GST_MESSAGE_SRC(msg)), old , new, pending);

      
      break;
    }
    case GST_MESSAGE_CLOCK_LOST:{
       g_print("$$$$$$$$$$$$$$$$$$$ lost clock\n");
       break;
    }
      
    default:
      break;
  }

  return TRUE;
}


gboolean buffer_probe(GstPad *pad, GstMiniObject *mini_obj, gpointer user_data)
{
  g_print("***************%s %d\n", __FUNCTION__, fsave);
       
  return fsave;
}



static gboolean ob_in_iofunc (GIOChannel* iochannel, GIOCondition condition, gpointer data)
{
    char buffer[256];
    GstMessage *msg;
    GstState state, pending;

    fd = g_io_channel_unix_get_fd(iochannel);
    read(fd, buffer, 256);
 
   g_print("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@entry\n");
    if(buffer[0] == 's'){
         fsave = FALSE;
         rpad = gst_element_get_pad (queue2, "src");
         id = gst_pad_add_buffer_probe (rpad, buffer_probe, NULL);

         gst_element_set_state(joker, GST_STATE_READY);
         gst_element_get_state(joker, &state, &pending, GST_CLOCK_TIME_NONE);
         gst_element_set_state(joker, GST_STATE_NULL);
         gst_element_get_state(joker, &state, &pending, GST_CLOCK_TIME_NONE);
         g_print("unlinking\n");
         gst_element_unlink (queue2, joker);
         gst_bin_remove(GST_BIN(pipeline), joker);
         asrc = gst_element_factory_make ("alsasrc", "asrc");
         aenc = gst_element_factory_make ("amrnbenc", "aenc");
         scale = gst_element_factory_make ("videoscale", "scale");
         venc = gst_element_factory_make ("ffenc_mpeg4", "videoenc");
         muxer = gst_element_factory_make ("ffmux_3gp", "muxer");
         fsink = gst_element_factory_make ("filesink", "fsink");
         g_object_set (G_OBJECT (fsink), "location", "file.3gp", NULL);
         gst_bin_add_many(GST_BIN(pipeline), asrc, aenc, scale, venc, muxer, fsink, NULL);
         gst_element_link(queue2, scale);
         GstCaps * caps = gst_caps_new_simple ("video/x-raw-yuv",
                                                  "format", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('I', '4', '2', '0'),
                                                  "width", G_TYPE_INT, 176,
                                                  "height", G_TYPE_INT, 144,
                                                  NULL);
         gst_element_link_filtered (scale, venc, caps);
         rpad = gst_element_get_pad (venc, "src");
         spad = gst_element_get_request_pad (muxer, "video_45");
         gst_pad_link(rpad, spad);
         gst_element_link(muxer, fsink);
         gst_element_link(asrc, aenc);
         rpad = gst_element_get_pad (aenc, "src");
         spad = gst_element_get_request_pad (muxer, "audio_45"); 
         gst_pad_link(rpad, spad);
         fsave = TRUE;
         gst_element_set_state(pipeline, GST_STATE_PAUSED);
         gst_element_get_state(pipeline, &state, &pending, GST_CLOCK_TIME_NONE);
         //gst_pad_remove_buffer_probe (rpad, id); 
         gst_element_set_state(pipeline, GST_STATE_PLAYING);
         g_print("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$exit\n"); 
    }
    else if(buffer[0] == 'e'){
         g_print("sending eos\n");
         gst_element_set_state(vsrc, GST_STATE_NULL);
         gst_element_set_state(asrc, GST_STATE_NULL);
    }
   
    return TRUE;
}



int main()
{
    gst_init(NULL, NULL);
    loop  = g_main_loop_new(NULL, FALSE);
    in = g_io_channel_unix_new (fileno(stdin));
    g_io_add_watch(in, G_IO_IN, ob_in_iofunc, NULL);
    
    pipeline = gst_pipeline_new(NULL); 
    pbin = gst_bin_new("pbin");
 
    vsrc = gst_element_factory_make ("v4lsrc", "videosrc");
    //g_object_set(G_OBJECT(vsrc), "num-buffers", 300, NULL);
    GstCaps * caps = gst_caps_new_simple ("video/x-raw-yuv",
					    "format", GST_TYPE_FOURCC, GST_MAKE_FOURCC ('I', '4', '2', '0'),
					    "width", G_TYPE_INT, 320,
					    "height", G_TYPE_INT, 240,
					    NULL);
    tee = gst_element_factory_make ("tee","teer");

    queue1 = gst_element_factory_make ("queue", "preview");
    vsink = gst_element_factory_make ("xvimagesink", "videosink");
    gst_bin_add_many (GST_BIN(pbin), queue1, vsink, NULL);
    gst_element_link (queue1, vsink);

    queue2 = gst_element_factory_make ("queue", "recording");
    joker = gst_element_factory_make ("fakesink", "joker"); 

    gst_bin_add_many(GST_BIN(pipeline), vsrc, tee, pbin, queue2, joker, NULL);
    gst_element_link(queue2, joker);
    gst_element_link_filtered(vsrc, tee, caps);

    rpad = gst_element_get_pad (queue1, "sink");
    gst_element_add_pad(GST_ELEMENT(pbin), gst_ghost_pad_new("sink", rpad));
    rpad = gst_element_get_request_pad(tee, "src01");
    spad = gst_element_get_pad (GST_ELEMENT(pbin), "sink");
    gst_pad_link(rpad, spad);
  
    rpad = gst_element_get_request_pad(tee, "src02");
    spad = gst_element_get_pad (GST_ELEMENT(queue2), "sink");
    gst_pad_link(rpad, spad);
     
    bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
    gst_bus_add_watch (bus, bus_call, loop);
    //gst_object_unref (bus);
 
    gst_element_set_state(pipeline, GST_STATE_PLAYING);
        
    g_main_loop_run(loop);
         
    return 0;
}