Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "player.h"
- 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 *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)
- {
- GstPad *sinkpad;
- GstElement *decoder = (GstElement *) data;
- sinkpad = gst_element_get_static_pad(decoder, "sink");
- gst_pad_link(pad, sinkpad);
- gst_object_unref(sinkpad);
- }
- GstElement * make_element(Player * p, const char * elem_name, const char * name){
- GstElement * elem = gst_element_factory_make(elem_name, name);
- if(elem == NULL){
- g_printerr ("%s could not be created. Exiting.\n", elem_name);
- exit(EXIT_FAILURE);
- }
- gst_bin_add(GST_BIN(p->pipeline), elem);
- return elem;
- }
- node_t v_gst_element_link_many(GstElement * elem, va_list args){
- GstElement * next = va_arg(args, GstElement*);
- if(elem == NULL || next == NULL)
- return NULL;
- gst_element_link(elem, next);
- GstElement * last = next;
- while((next = va_arg(args, GstElement*)) != NULL){
- gst_element_link(last, next);
- last = next;
- }
- return last;
- }
- node_t file_node(Player * p, const char * filename, ...){
- GstElement * file_elem = make_element(p, "filesrc", filename);
- g_object_set(G_OBJECT(file_elem), "location", filename, NULL);
- node_t node;
- va_list args;
- va_start(args, filename);
- node = v_gst_element_link_many(file_elem, args);
- va_end(args);
- return node;
- }
- node_t demux_node(node_t demuxer, GstElement * elem, ...){
- g_signal_connect(demuxer, "pad-added", G_CALLBACK (on_pad_added), elem);
- node_t node;
- va_list args;
- va_start(args, elem);
- node = v_gst_element_link_many(elem, args);
- va_end(args);
- if(node == NULL)
- return elem;
- else
- return node;
- }
- node_t mux_node(node_t node1, node_t node2, GstElement * elem, ...){
- gst_element_link(node1, elem);
- gst_element_link(node2, elem);
- node_t node;
- va_list args;
- va_start(args, elem);
- node = v_gst_element_link_many(elem, args);
- va_end(args);
- return node;
- }
- void link_element(Player * p, const char * src, const char * dst){
- gst_element_link(gst_bin_get_by_name(p->pipeline, src),
- gst_bin_get_by_name(p->pipeline, dst));
- }
- void unlink_element(Player * p, const char * src, const char * dst){
- gst_element_unlink(gst_bin_get_by_name(p->pipeline, src),
- gst_bin_get_by_name(p->pipeline, dst));
- }
- char * get_sub_name(char * video_filename){
- char * sub_filename = malloc(strlen(video_filename)*sizeof(char));
- int dot_pos = 0;
- if(sub_filename == NULL){
- fprintf(stderr, "Malloc failed\n");
- exit(EXIT_FAILURE);
- }
- for(int i = 0; video_filename[i] != 0; i++){
- sub_filename[i] = video_filename[i];
- if(video_filename[i] == '.')
- dot_pos = i;
- }
- strcpy(sub_filename + dot_pos + 1, "srt");
- return sub_filename;
- }
- Player * player_init(){
- Player * p = malloc(sizeof(Player));
- if(p == NULL)
- return NULL;
- gst_init(NULL, NULL);
- p->loop = g_main_loop_new(NULL, FALSE);
- p->pipeline = gst_pipeline_new("pipeline");
- if(!p->pipeline){
- g_printerr("Pipeline could not be created.\n");
- free(p);
- return NULL;
- }
- GstBus * bus = gst_pipeline_get_bus(GST_PIPELINE(p->pipeline));
- gst_bus_add_watch(bus, bus_call, p->loop);
- gst_object_unref(bus);
- return p;
- }
- void player_clean(Player * p){
- gst_object_unref(GST_OBJECT (p->pipeline));
- free(p);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement