Advertisement
Guest User

Untitled

a guest
Sep 29th, 2010
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.92 KB | None | 0 0
  1. #include <string> /*sorry, I feel comfortable using std::strings.*/
  2. #include <gst/gst.h>
  3. #include <glib.h>
  4.  
  5. /*Global vars*/
  6. GstElement *pipeline=NULL, *textoverlay=NULL;
  7. GMainLoop *loop=NULL;
  8. bool sub_loaded=false;
  9.  
  10. const char *avipath = "hardcoded-path-to-avi-file";
  11. const char *srtpath = "hardcoded-path-to-srt-file";
  12.  
  13. /*Various functions*/
  14.  
  15. static void no_more_pads(GstElement *element, gpointer data);
  16.  
  17. static gboolean bus_call (GstBus *bus, GstMessage *msg, gpointer data)
  18. {
  19.  
  20.   switch (GST_MESSAGE_TYPE (msg)) {
  21.  
  22.     case GST_MESSAGE_EOS:
  23.       g_print ("End of stream\n");
  24.       g_main_loop_quit (loop);
  25.       break;
  26.  
  27.     case GST_MESSAGE_ERROR: {
  28.       gchar  *debug;
  29.       GError *error;
  30.  
  31.       gst_message_parse_error (msg, &error, &debug);
  32.       g_free (debug);
  33.  
  34.       g_printerr ("Error: %s\n", error->message);
  35.       g_error_free (error);
  36.  
  37.       g_main_loop_quit (loop);
  38.       break;
  39.     }
  40.     default:
  41.       break;
  42.   }
  43.  
  44.   return TRUE;
  45. }
  46.  
  47. static void on_pad_added (GstElement *element, GstPad *pad, gpointer data)
  48. {
  49.     std::string mime_type;
  50.     GstElement *queue, *decoder, *converter, *sink, *parser;
  51.     GstPad *sinkpad;   
  52.    
  53.     /*get mime-type*/
  54.     GstCaps* caps = gst_pad_get_caps (pad);
  55.     GstStructure* structure = gst_caps_get_structure(caps, 0);
  56.     mime_type = gst_structure_get_name(structure);
  57.     gst_caps_unref(caps);
  58.    
  59.     /*plug a queue in the pad and decide what to do according to the mimetype*/
  60.     queue = gst_element_factory_make("queue", NULL);
  61.     sinkpad = gst_element_get_static_pad(queue, "sink");
  62.     gst_bin_add(GST_BIN(pipeline), queue);
  63.     gst_pad_link(pad, sinkpad);
  64.     gst_object_unref(sinkpad);
  65.    
  66.     /*now check the mimetype and decide what to do*/
  67.     if (mime_type.find("video") != mime_type.npos)
  68.     {/*the video stream. I assume an XVID/DIVX stream*/
  69.    
  70.         decoder = gst_element_factory_make("ffdec_mpeg4", NULL);
  71.         converter = gst_element_factory_make("ffmpegcolorspace", NULL);
  72.         textoverlay = gst_element_factory_make("textoverlay", NULL);
  73.         sink = gst_element_factory_make("xvimagesink", NULL);
  74.        
  75.         gst_bin_add_many(GST_BIN(pipeline), decoder, converter, textoverlay, sink, NULL);
  76.         gst_element_link_many(queue, decoder, converter, textoverlay, sink, NULL);
  77.        
  78.         gst_element_set_state(queue, GST_STATE_PAUSED);
  79.         gst_element_set_state(decoder, GST_STATE_PAUSED);
  80.         gst_element_set_state(converter, GST_STATE_PAUSED);
  81.         gst_element_set_state(textoverlay, GST_STATE_PAUSED);
  82.         gst_element_set_state(sink, GST_STATE_PAUSED);
  83.     }
  84.     else
  85.     {/*the audio stream. I assume an mp3 stream.*/
  86.    
  87.         parser = gst_element_factory_make("mp3parse", NULL);
  88.         decoder = gst_element_factory_make("mad", NULL);
  89.         converter = gst_element_factory_make("audioconvert", NULL);    
  90.         sink = gst_element_factory_make("alsasink", NULL);     
  91.        
  92.         gst_bin_add_many(GST_BIN(pipeline), parser, decoder, converter, sink, NULL);       
  93.         gst_element_link_many(queue, parser, decoder, converter, sink, NULL);      
  94.        
  95.         gst_element_set_state(queue, GST_STATE_PAUSED);    
  96.         gst_element_set_state(parser, GST_STATE_PAUSED);
  97.         gst_element_set_state(decoder, GST_STATE_PAUSED);
  98.         gst_element_set_state(converter, GST_STATE_PAUSED);    
  99.         gst_element_set_state(sink, GST_STATE_PAUSED);
  100.     }
  101.  
  102. }
  103.  
  104. void load_sub()
  105. {
  106.     GstElement *source, *parser, *queue;
  107.    
  108.     source = gst_element_factory_make("filesrc", NULL);
  109.     parser = gst_element_factory_make("subparse", NULL);
  110.     queue = gst_element_factory_make("queue", NULL);
  111.    
  112.     gst_bin_add_many(GST_BIN(pipeline), source, parser, queue, NULL);
  113.    
  114.     g_object_set(G_OBJECT(source), "location", srtpath, NULL);
  115.     gst_element_set_state(source, GST_STATE_PAUSED);
  116.    
  117.     gst_element_link_many(source, parser, queue, textoverlay, NULL);
  118.    
  119.     gst_element_set_state(parser, GST_STATE_PAUSED);
  120.     gst_element_set_state(queue, GST_STATE_PAUSED);
  121.    
  122.    
  123.     no_more_pads(NULL, NULL);  
  124. }
  125.  
  126. static void no_more_pads(GstElement *element, gpointer data)
  127. {  
  128.     if (!sub_loaded)
  129.     {
  130.         sub_loaded = true;
  131.         load_sub();    
  132.     }
  133.     else
  134.     {
  135.         gst_element_set_state(pipeline, GST_STATE_PLAYING);
  136.     }
  137. }
  138.  
  139.  
  140. int main(int argc, char *argv[])
  141. {
  142.     GstElement *source=NULL, *demuxer=NULL;
  143.     GstBus *bus;
  144.     gst_init(&argc, &argv);
  145.    
  146.     loop = g_main_loop_new(NULL, FALSE);
  147.    
  148.     pipeline = gst_pipeline_new("pipeline");
  149.    
  150.     source = gst_element_factory_make("filesrc", NULL);
  151.     demuxer = gst_element_factory_make("avidemux", NULL);
  152.    
  153.     g_object_set(G_OBJECT(source), "location", avipath, NULL);
  154.    
  155.     bus = gst_pipeline_get_bus(GST_PIPELINE(pipeline));
  156.     gst_bus_add_watch(bus, bus_call, NULL);
  157.     gst_object_unref(bus);
  158.    
  159.     gst_bin_add_many(GST_BIN(pipeline), source, demuxer, NULL);
  160.     gst_element_link(source, demuxer);
  161.    
  162.     g_signal_connect (demuxer, "pad-added", G_CALLBACK(on_pad_added), NULL);
  163.     g_signal_connect (demuxer, "no-more-pads", G_CALLBACK(no_more_pads), NULL);
  164.    
  165.     gst_element_set_state(pipeline, GST_STATE_PAUSED);
  166.     g_main_loop_run(loop); 
  167.    
  168.     gst_element_set_state(pipeline, GST_STATE_NULL);
  169.     gst_object_unref(GST_OBJECT(pipeline));
  170.    
  171.     return 0;
  172. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement