aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/gstreamer_extractor.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/gstreamer_extractor.c')
-rw-r--r--src/plugins/gstreamer_extractor.c76
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
621typedef struct 622typedef struct
@@ -652,6 +653,10 @@ static int initialized = FALSE;
652static GstDiscoverer *dc; 653static GstDiscoverer *dc;
653static PrivStruct *ps; 654static PrivStruct *ps;
654 655
656static GQuark *audio_quarks;
657static GQuark *video_quarks;
658static GQuark *subtitle_quarks;
659
655static void 660static 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;