diff options
Diffstat (limited to 'src/plugins/gstreamer_extractor.c')
-rw-r--r-- | src/plugins/gstreamer_extractor.c | 62 |
1 files changed, 33 insertions, 29 deletions
diff --git a/src/plugins/gstreamer_extractor.c b/src/plugins/gstreamer_extractor.c index 78dd1e5..5a6fcec 100644 --- a/src/plugins/gstreamer_extractor.c +++ b/src/plugins/gstreamer_extractor.c | |||
@@ -636,6 +636,14 @@ struct PrivStruct | |||
636 | enum CurrentStreamType st; | 636 | enum CurrentStreamType st; |
637 | }; | 637 | }; |
638 | 638 | ||
639 | |||
640 | static GQuark *audio_quarks; | ||
641 | |||
642 | static GQuark *video_quarks; | ||
643 | |||
644 | static GQuark *subtitle_quarks; | ||
645 | |||
646 | |||
639 | static void send_streams (GstDiscovererStreamInfo *info, struct PrivStruct *ps); | 647 | static void send_streams (GstDiscovererStreamInfo *info, struct PrivStruct *ps); |
640 | 648 | ||
641 | static void send_tag_foreach (const GstTagList * tags, const gchar * tag, | 649 | static void send_tag_foreach (const GstTagList * tags, const gchar * tag, |
@@ -649,13 +657,6 @@ static void feed_data (GstElement * appsrc, guint size, struct PrivStruct * ps); | |||
649 | static gboolean seek_data (GstElement * appsrc, guint64 position, struct PrivStruct * ps); | 657 | static gboolean seek_data (GstElement * appsrc, guint64 position, struct PrivStruct * ps); |
650 | 658 | ||
651 | 659 | ||
652 | static GstDiscoverer *dc; | ||
653 | static struct PrivStruct *ps; | ||
654 | |||
655 | static GQuark *audio_quarks; | ||
656 | static GQuark *video_quarks; | ||
657 | static GQuark *subtitle_quarks; | ||
658 | |||
659 | static void | 660 | static void |
660 | _new_discovered_uri (GstDiscoverer * dc, GstDiscovererInfo * info, GError * err, struct PrivStruct * ps) | 661 | _new_discovered_uri (GstDiscoverer * dc, GstDiscovererInfo * info, GError * err, struct PrivStruct * ps) |
661 | { | 662 | { |
@@ -671,28 +672,9 @@ _discoverer_finished (GstDiscoverer * dc, struct PrivStruct * ps) | |||
671 | static int | 672 | static int |
672 | initialize () | 673 | initialize () |
673 | { | 674 | { |
674 | gint timeout = 10; | ||
675 | GError *err = NULL; | ||
676 | |||
677 | gst_init (NULL, NULL); | 675 | gst_init (NULL, NULL); |
678 | |||
679 | GST_DEBUG_CATEGORY_INIT (gstreamer_extractor, "GstExtractor", | 676 | GST_DEBUG_CATEGORY_INIT (gstreamer_extractor, "GstExtractor", |
680 | 0, "GStreamer-based libextractor plugin"); | 677 | 0, "GStreamer-based libextractor plugin"); |
681 | dc = gst_discoverer_new (timeout * GST_SECOND, &err); | ||
682 | if (G_UNLIKELY (dc == NULL)) { | ||
683 | g_print ("Error initializing: %s\n", err->message); | ||
684 | return FALSE; | ||
685 | } | ||
686 | |||
687 | ps = g_new0 (struct PrivStruct, 1); | ||
688 | ps->dc = dc; | ||
689 | ps->loop = g_main_loop_new (NULL, TRUE); | ||
690 | |||
691 | /* connect signals */ | ||
692 | g_signal_connect (dc, "discovered", G_CALLBACK (_new_discovered_uri), ps); | ||
693 | g_signal_connect (dc, "finished", G_CALLBACK (_discoverer_finished), ps); | ||
694 | g_signal_connect (dc, "source-setup", G_CALLBACK (_source_setup), ps); | ||
695 | |||
696 | audio_quarks = g_new0 (GQuark, 4); | 678 | audio_quarks = g_new0 (GQuark, 4); |
697 | audio_quarks[0] = g_quark_from_string ("rate"); | 679 | audio_quarks[0] = g_quark_from_string ("rate"); |
698 | audio_quarks[1] = g_quark_from_string ("channels"); | 680 | audio_quarks[1] = g_quark_from_string ("channels"); |
@@ -1596,10 +1578,27 @@ EXTRACTOR_gstreamer_extract_method (struct EXTRACTOR_ExtractContext *ec) | |||
1596 | static int initialized = FALSE; | 1578 | static int initialized = FALSE; |
1597 | int64_t offset; | 1579 | int64_t offset; |
1598 | void *data; | 1580 | void *data; |
1581 | GstDiscoverer *dc; | ||
1582 | struct PrivStruct *ps; | ||
1583 | GError *err = NULL; | ||
1584 | gint timeout = 10; | ||
1585 | |||
1586 | if ( (! initialized) && | ||
1587 | (! (initialized = initialize ())) ) | ||
1588 | return; | ||
1589 | dc = gst_discoverer_new (timeout * GST_SECOND, &err); | ||
1590 | if (G_UNLIKELY (dc == NULL)) { | ||
1591 | g_print ("Error initializing: %s\n", err->message); | ||
1592 | return; | ||
1593 | } | ||
1594 | /* connect signals */ | ||
1595 | g_signal_connect (dc, "discovered", G_CALLBACK (_new_discovered_uri), ps); | ||
1596 | g_signal_connect (dc, "finished", G_CALLBACK (_discoverer_finished), ps); | ||
1597 | g_signal_connect (dc, "source-setup", G_CALLBACK (_source_setup), ps); | ||
1599 | 1598 | ||
1600 | if (! initialized) | 1599 | ps = g_new0 (struct PrivStruct, 1); |
1601 | if (! (initialized = initialize ())) | 1600 | ps->dc = dc; |
1602 | return; | 1601 | ps->loop = g_main_loop_new (NULL, TRUE); |
1603 | ps->ec = ec; | 1602 | ps->ec = ec; |
1604 | ps->length = ps->ec->get_size (ps->ec->cls); | 1603 | ps->length = ps->ec->get_size (ps->ec->cls); |
1605 | if (ps->length == UINT_MAX) | 1604 | if (ps->length == UINT_MAX) |
@@ -1609,6 +1608,11 @@ EXTRACTOR_gstreamer_extract_method (struct EXTRACTOR_ExtractContext *ec) | |||
1609 | g_idle_add ((GSourceFunc) _run_async, ps); | 1608 | g_idle_add ((GSourceFunc) _run_async, ps); |
1610 | g_main_loop_run (ps->loop); | 1609 | g_main_loop_run (ps->loop); |
1611 | gst_discoverer_stop (dc); | 1610 | gst_discoverer_stop (dc); |
1611 | g_free (ps); | ||
1612 | ps = NULL; | ||
1613 | gst_object_unref (GST_OBJECT (dc)); | ||
1614 | dc = NULL; | ||
1612 | } | 1615 | } |
1613 | 1616 | ||
1617 | |||
1614 | /* end of gstreamer_extractor.c */ | 1618 | /* end of gstreamer_extractor.c */ |