#include #include 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; }