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