Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <string> /*sorry, I feel comfortable using std::strings.*/
- #include <gst/gst.h>
- #include <glib.h>
- /*Global vars*/
- GstElement *pipeline=NULL, *textoverlay=NULL;
- GMainLoop *loop=NULL;
- bool sub_loaded=false;
- const char *avipath = "hardcoded-path-to-avi-file";
- const char *srtpath = "hardcoded-path-to-srt-file";
- /*Various functions*/
- static void no_more_pads(GstElement *element, gpointer data);
- static gboolean bus_call (GstBus *bus, GstMessage *msg, gpointer 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 *error;
- gst_message_parse_error (msg, &error, &debug);
- g_free (debug);
- g_printerr ("Error: %s\n", error->message);
- g_error_free (error);
- g_main_loop_quit (loop);
- break;
- }
- default:
- break;
- }
- return TRUE;
- }
- static void on_pad_added (GstElement *element, GstPad *pad, gpointer data)
- {
- std::string mime_type;
- GstElement *queue, *decoder, *converter, *sink, *parser;
- GstPad *sinkpad;
- /*get mime-type*/
- GstCaps* caps = gst_pad_get_caps (pad);
- GstStructure* structure = gst_caps_get_structure(caps, 0);
- mime_type = gst_structure_get_name(structure);
- gst_caps_unref(caps);
- /*plug a queue in the pad and decide what to do according to the mimetype*/
- queue = gst_element_factory_make("queue", NULL);
- sinkpad = gst_element_get_static_pad(queue, "sink");
- gst_bin_add(GST_BIN(pipeline), queue);
- gst_pad_link(pad, sinkpad);
- gst_object_unref(sinkpad);
- /*now check the mimetype and decide what to do*/
- if (mime_type.find("video") != mime_type.npos)
- {/*the video stream. I assume an XVID/DIVX stream*/
- decoder = gst_element_factory_make("ffdec_mpeg4", NULL);
- converter = gst_element_factory_make("ffmpegcolorspace", NULL);
- textoverlay = gst_element_factory_make("textoverlay", NULL);
- sink = gst_element_factory_make("xvimagesink", NULL);
- gst_bin_add_many(GST_BIN(pipeline), decoder, converter, textoverlay, sink, NULL);
- gst_element_link_many(queue, decoder, converter, textoverlay, sink, NULL);
- gst_element_set_state(queue, GST_STATE_PAUSED);
- gst_element_set_state(decoder, GST_STATE_PAUSED);
- gst_element_set_state(converter, GST_STATE_PAUSED);
- gst_element_set_state(textoverlay, GST_STATE_PAUSED);
- gst_element_set_state(sink, GST_STATE_PAUSED);
- }
- else
- {/*the audio stream. I assume an mp3 stream.*/
- parser = gst_element_factory_make("mp3parse", NULL);
- decoder = gst_element_factory_make("mad", NULL);
- converter = gst_element_factory_make("audioconvert", NULL);
- sink = gst_element_factory_make("alsasink", NULL);
- gst_bin_add_many(GST_BIN(pipeline), parser, decoder, converter, sink, NULL);
- gst_element_link_many(queue, parser, decoder, converter, sink, NULL);
- gst_element_set_state(queue, GST_STATE_PAUSED);
- gst_element_set_state(parser, GST_STATE_PAUSED);
- gst_element_set_state(decoder, GST_STATE_PAUSED);
- gst_element_set_state(converter, GST_STATE_PAUSED);
- gst_element_set_state(sink, GST_STATE_PAUSED);
- }
- }
- void load_sub()
- {
- GstElement *source, *parser, *queue;
- source = gst_element_factory_make("filesrc", NULL);
- parser = gst_element_factory_make("subparse", NULL);
- queue = gst_element_factory_make("queue", NULL);
- gst_bin_add_many(GST_BIN(pipeline), source, parser, queue, NULL);
- g_object_set(G_OBJECT(source), "location", srtpath, NULL);
- gst_element_set_state(source, GST_STATE_PAUSED);
- gst_element_link_many(source, parser, queue, textoverlay, NULL);
- gst_element_set_state(parser, GST_STATE_PAUSED);
- gst_element_set_state(queue, GST_STATE_PAUSED);
- no_more_pads(NULL, NULL);
- }
- static void no_more_pads(GstElement *element, gpointer data)
- {
- if (!sub_loaded)
- {
- sub_loaded = true;
- load_sub();
- }
- else
- {
- gst_element_set_state(pipeline, GST_STATE_PLAYING);
- }
- }
- int main(int argc, char *argv[])
- {
- GstElement *source=NULL, *demuxer=NULL;
- GstBus *bus;
- gst_init(&argc, &argv);
- loop = g_main_loop_new(NULL, FALSE);
- pipeline = gst_pipeline_new("pipeline");
- source = gst_element_factory_make("filesrc", NULL);
- demuxer = gst_element_factory_make("avidemux", NULL);
- g_object_set(G_OBJECT(source), "location", avipath, NULL);
- bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline));
- gst_bus_add_watch(bus, bus_call, NULL);
- gst_object_unref(bus);
- gst_bin_add_many(GST_BIN(pipeline), source, demuxer, NULL);
- gst_element_link(source, demuxer);
- g_signal_connect (demuxer, "pad-added", G_CALLBACK(on_pad_added), NULL);
- g_signal_connect (demuxer, "no-more-pads", G_CALLBACK(no_more_pads), NULL);
- gst_element_set_state(pipeline, GST_STATE_PAUSED);
- g_main_loop_run(loop);
- gst_element_set_state(pipeline, GST_STATE_NULL);
- gst_object_unref(GST_OBJECT(pipeline));
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement