コード例 #1
0
ファイル: bdremux.c プロジェクト: OpenDMM/bdremux
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;
}
コード例 #2
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;
}