diff options
Diffstat (limited to 'src/plugins/gstreamer_extractor.c')
-rw-r--r-- | src/plugins/gstreamer_extractor.c | 76 |
1 files changed, 66 insertions, 10 deletions
diff --git a/src/plugins/gstreamer_extractor.c b/src/plugins/gstreamer_extractor.c index a1a08ee..fe5ef69 100644 --- a/src/plugins/gstreamer_extractor.c +++ b/src/plugins/gstreamer_extractor.c | |||
@@ -615,7 +615,8 @@ enum CurrentStreamType | |||
615 | STREAM_TYPE_AUDIO = 1, | 615 | STREAM_TYPE_AUDIO = 1, |
616 | STREAM_TYPE_VIDEO = 2, | 616 | STREAM_TYPE_VIDEO = 2, |
617 | STREAM_TYPE_SUBTITLE = 3, | 617 | STREAM_TYPE_SUBTITLE = 3, |
618 | STREAM_TYPE_CONTAINER = 4 | 618 | STREAM_TYPE_CONTAINER = 4, |
619 | STREAM_TYPE_IMAGE = 5 | ||
619 | }; | 620 | }; |
620 | 621 | ||
621 | typedef struct | 622 | typedef struct |
@@ -652,6 +653,10 @@ static int initialized = FALSE; | |||
652 | static GstDiscoverer *dc; | 653 | static GstDiscoverer *dc; |
653 | static PrivStruct *ps; | 654 | static PrivStruct *ps; |
654 | 655 | ||
656 | static GQuark *audio_quarks; | ||
657 | static GQuark *video_quarks; | ||
658 | static GQuark *subtitle_quarks; | ||
659 | |||
655 | static void | 660 | static void |
656 | _new_discovered_uri (GstDiscoverer * dc, GstDiscovererInfo * info, GError * err, PrivStruct * ps) | 661 | _new_discovered_uri (GstDiscoverer * dc, GstDiscovererInfo * info, GError * err, PrivStruct * ps) |
657 | { | 662 | { |
@@ -690,6 +695,24 @@ initialize () | |||
690 | g_signal_connect (dc, "finished", G_CALLBACK (_discoverer_finished), ps); | 695 | g_signal_connect (dc, "finished", G_CALLBACK (_discoverer_finished), ps); |
691 | g_signal_connect (dc, "source-setup", G_CALLBACK (_source_setup), ps); | 696 | g_signal_connect (dc, "source-setup", G_CALLBACK (_source_setup), ps); |
692 | 697 | ||
698 | audio_quarks = g_new0 (GQuark, 4); | ||
699 | audio_quarks[0] = g_quark_from_string ("rate"); | ||
700 | audio_quarks[1] = g_quark_from_string ("channels"); | ||
701 | audio_quarks[2] = g_quark_from_string ("depth"); | ||
702 | audio_quarks[3] = g_quark_from_string (NULL); | ||
703 | |||
704 | video_quarks = g_new0 (GQuark, 6); | ||
705 | video_quarks[0] = g_quark_from_string ("width"); | ||
706 | video_quarks[1] = g_quark_from_string ("height"); | ||
707 | video_quarks[2] = g_quark_from_string ("framerate"); | ||
708 | video_quarks[3] = g_quark_from_string ("max-framerate"); | ||
709 | video_quarks[4] = g_quark_from_string ("pixel-aspect-ratio"); | ||
710 | video_quarks[5] = g_quark_from_string (NULL); | ||
711 | |||
712 | subtitle_quarks = g_new0 (GQuark, 2); | ||
713 | subtitle_quarks[0] = g_quark_from_string ("language-code"); | ||
714 | subtitle_quarks[1] = g_quark_from_string (NULL); | ||
715 | |||
693 | return TRUE; | 716 | return TRUE; |
694 | } | 717 | } |
695 | 718 | ||
@@ -863,6 +886,30 @@ send_structure_foreach (GQuark field_id, const GValue *value, | |||
863 | const gchar *field_name = g_quark_to_string (field_id); | 886 | const gchar *field_name = g_quark_to_string (field_id); |
864 | const gchar *type_name = g_type_name (G_VALUE_TYPE (value)); | 887 | const gchar *type_name = g_type_name (G_VALUE_TYPE (value)); |
865 | GType gst_fraction = GST_TYPE_FRACTION; | 888 | GType gst_fraction = GST_TYPE_FRACTION; |
889 | GQuark *quark; | ||
890 | |||
891 | switch (ps->st) | ||
892 | { | ||
893 | case STREAM_TYPE_AUDIO: | ||
894 | for (quark = audio_quarks; *quark != 0; quark++) | ||
895 | if (*quark == field_id) | ||
896 | return TRUE; | ||
897 | break; | ||
898 | case STREAM_TYPE_VIDEO: | ||
899 | case STREAM_TYPE_IMAGE: | ||
900 | for (quark = video_quarks; *quark != 0; quark++) | ||
901 | if (*quark == field_id) | ||
902 | return TRUE; | ||
903 | break; | ||
904 | case STREAM_TYPE_SUBTITLE: | ||
905 | for (quark = subtitle_quarks; *quark != 0; quark++) | ||
906 | if (*quark == field_id) | ||
907 | return TRUE; | ||
908 | break; | ||
909 | case STREAM_TYPE_CONTAINER: | ||
910 | break; | ||
911 | } | ||
912 | |||
866 | 913 | ||
867 | /* TODO: check a list of known quarks, use specific EXTRACTOR_MetaType */ | 914 | /* TODO: check a list of known quarks, use specific EXTRACTOR_MetaType */ |
868 | switch (G_VALUE_TYPE (value)) | 915 | switch (G_VALUE_TYPE (value)) |
@@ -1093,10 +1140,21 @@ send_stream_info (GstDiscovererStreamInfo * info, PrivStruct *ps) | |||
1093 | 1140 | ||
1094 | caps = gst_discoverer_stream_info_get_caps (info); | 1141 | caps = gst_discoverer_stream_info_get_caps (info); |
1095 | 1142 | ||
1143 | if (GST_IS_DISCOVERER_AUDIO_INFO (info)) | ||
1144 | ps->st = STREAM_TYPE_AUDIO; | ||
1145 | else if (GST_IS_DISCOVERER_VIDEO_INFO (info)) | ||
1146 | ps->st = STREAM_TYPE_VIDEO; | ||
1147 | else if (GST_IS_DISCOVERER_SUBTITLE_INFO (info)) | ||
1148 | ps->st = STREAM_TYPE_SUBTITLE; | ||
1149 | else if (GST_IS_DISCOVERER_CONTAINER_INFO (info)) | ||
1150 | ps->st = STREAM_TYPE_CONTAINER; | ||
1151 | |||
1096 | if (caps) | 1152 | if (caps) |
1097 | { | 1153 | { |
1098 | GstStructure *structure = gst_caps_get_structure (caps, 0); | 1154 | GstStructure *structure = gst_caps_get_structure (caps, 0); |
1099 | const gchar *structname = gst_structure_get_name (structure); | 1155 | const gchar *structname = gst_structure_get_name (structure); |
1156 | if (g_str_has_prefix (structname, "image/")) | ||
1157 | ps->st = STREAM_TYPE_IMAGE; | ||
1100 | ps->time_to_leave = ps->ec->proc (ps->ec->cls, "gstreamer", | 1158 | ps->time_to_leave = ps->ec->proc (ps->ec->cls, "gstreamer", |
1101 | EXTRACTOR_METATYPE_MIMETYPE, EXTRACTOR_METAFORMAT_UTF8, "text/plain", | 1159 | EXTRACTOR_METATYPE_MIMETYPE, EXTRACTOR_METAFORMAT_UTF8, "text/plain", |
1102 | (const char *) structname, strlen (structname) + 1); | 1160 | (const char *) structname, strlen (structname) + 1); |
@@ -1108,7 +1166,10 @@ send_stream_info (GstDiscovererStreamInfo * info, PrivStruct *ps) | |||
1108 | } | 1166 | } |
1109 | 1167 | ||
1110 | if (ps->time_to_leave) | 1168 | if (ps->time_to_leave) |
1169 | { | ||
1170 | ps->st = STREAM_TYPE_NONE; | ||
1111 | return; | 1171 | return; |
1172 | } | ||
1112 | 1173 | ||
1113 | misc = gst_discoverer_stream_info_get_misc (info); | 1174 | misc = gst_discoverer_stream_info_get_misc (info); |
1114 | if (misc) | 1175 | if (misc) |
@@ -1117,22 +1178,17 @@ send_stream_info (GstDiscovererStreamInfo * info, PrivStruct *ps) | |||
1117 | } | 1178 | } |
1118 | 1179 | ||
1119 | if (ps->time_to_leave) | 1180 | if (ps->time_to_leave) |
1181 | { | ||
1182 | ps->st = STREAM_TYPE_NONE; | ||
1120 | return; | 1183 | return; |
1184 | } | ||
1121 | 1185 | ||
1122 | tags = gst_discoverer_stream_info_get_tags (info); | 1186 | tags = gst_discoverer_stream_info_get_tags (info); |
1123 | if (tags) | 1187 | if (tags) |
1124 | { | 1188 | { |
1125 | if (GST_IS_DISCOVERER_AUDIO_INFO (info)) | ||
1126 | ps->st = STREAM_TYPE_AUDIO; | ||
1127 | else if (GST_IS_DISCOVERER_VIDEO_INFO (info)) | ||
1128 | ps->st = STREAM_TYPE_VIDEO; | ||
1129 | else if (GST_IS_DISCOVERER_SUBTITLE_INFO (info)) | ||
1130 | ps->st = STREAM_TYPE_SUBTITLE; | ||
1131 | else if (GST_IS_DISCOVERER_CONTAINER_INFO (info)) | ||
1132 | ps->st = STREAM_TYPE_CONTAINER; | ||
1133 | gst_tag_list_foreach (tags, send_tag_foreach, ps); | 1189 | gst_tag_list_foreach (tags, send_tag_foreach, ps); |
1134 | ps->st = STREAM_TYPE_NONE; | ||
1135 | } | 1190 | } |
1191 | ps->st = STREAM_TYPE_NONE; | ||
1136 | 1192 | ||
1137 | if (ps->time_to_leave) | 1193 | if (ps->time_to_leave) |
1138 | return; | 1194 | return; |