int main (int argc, char *argv[]) { App *app = &s_app; GstBus *bus; int i; app->is_seekable = FALSE; app->enable_cutlist = FALSE; app->segment_count = 0; app->current_segment = 0; app->epmap_filename = NULL; app->f_epmap = NULL; app->no_source_pids = 0; app->no_sink_pids = 0; app->requested_pid_count = 0; app->auto_pids = TRUE; for (i = 0; i < MAX_PIDS; i++) { app->a_sink_pids[i] = -1; } app->queue_size = DEFAULT_QUEUE_SIZE; gst_init (NULL, NULL); GST_DEBUG_CATEGORY_INIT (bdremux_debug, "BDREMUX", GST_DEBUG_BOLD|GST_DEBUG_FG_YELLOW|GST_DEBUG_BG_BLUE, "blu-ray movie stream remuxer"); parse_options (argc, argv, app); if (app->epmap_filename) { app->f_epmap = fopen (app->epmap_filename, "w"); } else app->f_epmap = stdout; if (!app->f_epmap) { bdremux_errout (g_strdup_printf("could not open %s for writing entry point map! (%i)", app->epmap_filename, errno)); } if (app->enable_cutlist) load_cutlist (app); for (i = 0; i < app->segment_count; i++) { GST_INFO ("segment count %i index %i in_pts %lld out_pts %lld", i, app->seek_segments[i].index, app->seek_segments[i].in_pts, app->seek_segments[i].out_pts); } for (i = 0; i < app->no_source_pids; i++) { if (app->no_sink_pids <= i) app->a_sink_pids[app->no_sink_pids++] = app->a_source_pids[i]; GST_DEBUG ("source pid [%i] = 0x%04x, sink pid [%i] = 0x%04x app->no_sink_pids=%i", i, app->a_source_pids[i], i, app->a_sink_pids[i], app->no_sink_pids); } app->loop = g_main_loop_new (NULL, TRUE); app->pipeline = gst_pipeline_new ("blu-ray movie stream remuxer"); g_assert (app->pipeline); app->filesrc = gst_element_factory_make ("filesrc", "filesrc"); app->tsdemux = gst_element_factory_make ("mpegtsdemux", "tsdemux"); if (!app->tsdemux) { bdremux_errout("mpegtsdemux not found! please install gst-plugin-mpegtsdemux!"); } app->m2tsmux = gst_element_factory_make ("mpegtsmux", "m2tsmux"); if (!app->m2tsmux) { bdremux_errout("mpegtsmux not found! please install gst-plugin-mpegtsmux!"); } app->filesink = gst_element_factory_make ("filesink", "filesink"); app->queue = gst_element_factory_make ("multiqueue", "multiqueue"); app->videoparser = NULL; gst_bin_add_many (GST_BIN (app->pipeline), app->filesrc, app->tsdemux, app->queue, app->m2tsmux, app->filesink, NULL); g_object_set (G_OBJECT (app->filesrc), "location", app->in_filename, NULL); g_object_set (G_OBJECT (app->queue), "max-size-bytes", app->queue_size, NULL); g_object_set (G_OBJECT (app->queue), "max-size-buffers", 0, NULL); g_object_set (G_OBJECT (app->queue), "max-size-time", 0, NULL); g_object_set (G_OBJECT (app->m2tsmux), "m2ts-mode", TRUE, NULL); g_object_set (G_OBJECT (app->m2tsmux), "alignment", 32, NULL); g_object_set (G_OBJECT (app->filesink), "location", app->out_filename, NULL); gst_element_link (app->filesrc, app->tsdemux); gst_element_link (app->m2tsmux, app->filesink); g_signal_connect (app->tsdemux, "pad-added", G_CALLBACK (demux_pad_added_cb), app); app->queue_cb_handler_id = g_signal_connect (app->queue, "overrun", G_CALLBACK (queue_filled_cb), app); if (app->enable_indexing) { app->index = gst_index_factory_make ("memindex"); if (app->index) { g_signal_connect (G_OBJECT (app->index), "entry_added", G_CALLBACK (entry_added), app); g_object_set (G_OBJECT (app->index), "resolver", 1, NULL); gst_element_set_index (app->m2tsmux, app->index); } } bus = gst_pipeline_get_bus (GST_PIPELINE (app->pipeline)); gst_bus_add_watch (bus, (GstBusFunc) bus_message, app); gst_element_set_state (app->pipeline, GST_STATE_PLAYING); g_main_loop_run (app->loop); g_message ("stopping"); gst_element_set_state (app->pipeline, GST_STATE_NULL); gst_object_unref (bus); g_main_loop_unref (app->loop); if (app->epmap_filename) { fclose (app->f_epmap); } return 0; }
/* * Method: set_index(index) * index: the index to set, as a Gst::Index. * * Sets the specified index on the element. * * Returns: self. */ static VALUE rg_set_index(VALUE self, VALUE index) { gst_element_set_index(SELF(self), RGST_INDEX(index)); return self; }