Advertisement
Guest User

Untitled

a guest
Nov 1st, 2014
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.77 KB | None | 0 0
  1. #include "player.h"
  2.  
  3. static gboolean bus_call(GstBus *bus, GstMessage *msg, gpointer data)
  4. {
  5. GMainLoop *loop = (GMainLoop *) data;
  6.  
  7. switch(GST_MESSAGE_TYPE (msg)){
  8. case GST_MESSAGE_EOS:
  9. g_print("End of stream\n");
  10. g_main_loop_quit(loop);
  11. break;
  12. case GST_MESSAGE_ERROR:
  13. {
  14. gchar *debug;
  15. GError *error;
  16.  
  17. gst_message_parse_error(msg, &error, &debug);
  18. g_free(debug);
  19.  
  20. g_printerr("Error: %s\n", error->message);
  21. g_error_free(error);
  22.  
  23. g_main_loop_quit(loop);
  24. break;
  25. }
  26. default:
  27. break;
  28. }
  29. return TRUE;
  30. }
  31.  
  32. static void on_pad_added(GstElement *element, GstPad *pad, gpointer data)
  33. {
  34. GstPad *sinkpad;
  35. GstElement *decoder = (GstElement *) data;
  36.  
  37. sinkpad = gst_element_get_static_pad(decoder, "sink");
  38.  
  39. gst_pad_link(pad, sinkpad);
  40. gst_object_unref(sinkpad);
  41. }
  42.  
  43. GstElement * make_element(Player * p, const char * elem_name, const char * name){
  44. GstElement * elem = gst_element_factory_make(elem_name, name);
  45. if(elem == NULL){
  46. g_printerr ("%s could not be created. Exiting.\n", elem_name);
  47. exit(EXIT_FAILURE);
  48. }
  49. gst_bin_add(GST_BIN(p->pipeline), elem);
  50. return elem;
  51. }
  52.  
  53. node_t v_gst_element_link_many(GstElement * elem, va_list args){
  54. GstElement * next = va_arg(args, GstElement*);
  55. if(elem == NULL || next == NULL)
  56. return NULL;
  57. gst_element_link(elem, next);
  58. GstElement * last = next;
  59. while((next = va_arg(args, GstElement*)) != NULL){
  60. gst_element_link(last, next);
  61. last = next;
  62. }
  63. return last;
  64. }
  65.  
  66. node_t file_node(Player * p, const char * filename, ...){
  67. GstElement * file_elem = make_element(p, "filesrc", filename);
  68. g_object_set(G_OBJECT(file_elem), "location", filename, NULL);
  69.  
  70. node_t node;
  71. va_list args;
  72. va_start(args, filename);
  73. node = v_gst_element_link_many(file_elem, args);
  74. va_end(args);
  75. return node;
  76. }
  77.  
  78. node_t demux_node(node_t demuxer, GstElement * elem, ...){
  79. g_signal_connect(demuxer, "pad-added", G_CALLBACK (on_pad_added), elem);
  80.  
  81. node_t node;
  82. va_list args;
  83. va_start(args, elem);
  84. node = v_gst_element_link_many(elem, args);
  85. va_end(args);
  86. if(node == NULL)
  87. return elem;
  88. else
  89. return node;
  90. }
  91.  
  92. node_t mux_node(node_t node1, node_t node2, GstElement * elem, ...){
  93. gst_element_link(node1, elem);
  94. gst_element_link(node2, elem);
  95.  
  96. node_t node;
  97. va_list args;
  98. va_start(args, elem);
  99. node = v_gst_element_link_many(elem, args);
  100. va_end(args);
  101. return node;
  102. }
  103.  
  104. void link_element(Player * p, const char * src, const char * dst){
  105. gst_element_link(gst_bin_get_by_name(p->pipeline, src),
  106. gst_bin_get_by_name(p->pipeline, dst));
  107. }
  108.  
  109. void unlink_element(Player * p, const char * src, const char * dst){
  110. gst_element_unlink(gst_bin_get_by_name(p->pipeline, src),
  111. gst_bin_get_by_name(p->pipeline, dst));
  112. }
  113.  
  114. char * get_sub_name(char * video_filename){
  115. char * sub_filename = malloc(strlen(video_filename)*sizeof(char));
  116. int dot_pos = 0;
  117. if(sub_filename == NULL){
  118. fprintf(stderr, "Malloc failed\n");
  119. exit(EXIT_FAILURE);
  120. }
  121. for(int i = 0; video_filename[i] != 0; i++){
  122. sub_filename[i] = video_filename[i];
  123. if(video_filename[i] == '.')
  124. dot_pos = i;
  125. }
  126. strcpy(sub_filename + dot_pos + 1, "srt");
  127. return sub_filename;
  128. }
  129.  
  130. Player * player_init(){
  131. Player * p = malloc(sizeof(Player));
  132. if(p == NULL)
  133. return NULL;
  134.  
  135. gst_init(NULL, NULL);
  136.  
  137. p->loop = g_main_loop_new(NULL, FALSE);
  138.  
  139. p->pipeline = gst_pipeline_new("pipeline");
  140. if(!p->pipeline){
  141. g_printerr("Pipeline could not be created.\n");
  142. free(p);
  143. return NULL;
  144. }
  145.  
  146. GstBus * bus = gst_pipeline_get_bus(GST_PIPELINE(p->pipeline));
  147. gst_bus_add_watch(bus, bus_call, p->loop);
  148. gst_object_unref(bus);
  149. return p;
  150. }
  151.  
  152. void player_clean(Player * p){
  153. gst_object_unref(GST_OBJECT (p->pipeline));
  154. free(p);
  155. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement