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.c70
1 files changed, 62 insertions, 8 deletions
diff --git a/src/plugins/gstreamer_extractor.c b/src/plugins/gstreamer_extractor.c
index cb314cf..162ae09 100644
--- a/src/plugins/gstreamer_extractor.c
+++ b/src/plugins/gstreamer_extractor.c
@@ -647,6 +647,7 @@ static GQuark *video_quarks;
647 647
648static GQuark *subtitle_quarks; 648static GQuark *subtitle_quarks;
649 649
650static GQuark duration_quark;
650 651
651static void send_streams (GstDiscovererStreamInfo *info, struct PrivStruct *ps); 652static void send_streams (GstDiscovererStreamInfo *info, struct PrivStruct *ps);
652 653
@@ -700,6 +701,8 @@ initialize (struct InitData *id, struct PrivStruct *ps)
700 subtitle_quarks[0] = g_quark_from_string ("language-code"); 701 subtitle_quarks[0] = g_quark_from_string ("language-code");
701 subtitle_quarks[1] = g_quark_from_string (NULL); 702 subtitle_quarks[1] = g_quark_from_string (NULL);
702 703
704 duration_quark = g_quark_from_string ("duration");
705
703 id->dc = gst_discoverer_new (timeout * GST_SECOND, &err); 706 id->dc = gst_discoverer_new (timeout * GST_SECOND, &err);
704 if (G_UNLIKELY (id->dc == NULL)) { 707 if (G_UNLIKELY (id->dc == NULL)) {
705 g_print ("Error initializing: %s\n", err->message); 708 g_print ("Error initializing: %s\n", err->message);
@@ -1155,16 +1158,19 @@ send_stream_info (GstDiscovererStreamInfo * info, struct PrivStruct *ps)
1155 send_subtitle_info (GST_DISCOVERER_SUBTITLE_INFO (info), ps); 1158 send_subtitle_info (GST_DISCOVERER_SUBTITLE_INFO (info), ps);
1156 else if (GST_IS_DISCOVERER_CONTAINER_INFO (info)) 1159 else if (GST_IS_DISCOVERER_CONTAINER_INFO (info))
1157 { 1160 {
1161 GList *child;
1158 GstDiscovererContainerInfo *c = GST_DISCOVERER_CONTAINER_INFO (info); 1162 GstDiscovererContainerInfo *c = GST_DISCOVERER_CONTAINER_INFO (info);
1159 GList *children = gst_discoverer_container_info_get_streams (c); 1163 GList *children = gst_discoverer_container_info_get_streams (c);
1160 if (children) 1164 for (child = children; (NULL != child) && (!ps->time_to_leave);
1165 child = child->next)
1161 { 1166 {
1162 GstDiscovererStreamInfo *sinfo = children->data; 1167 GstDiscovererStreamInfo *sinfo = child->data;
1163 /* send_streams () will unref it */ 1168 /* send_streams () will unref it */
1164 gst_discoverer_stream_info_ref (sinfo); 1169 gst_discoverer_stream_info_ref (sinfo);
1165 send_streams (sinfo, ps); 1170 send_streams (sinfo, ps);
1166 gst_discoverer_stream_info_list_free (children);
1167 } 1171 }
1172 if (children)
1173 gst_discoverer_stream_info_list_free (children);
1168 } 1174 }
1169} 1175}
1170 1176
@@ -1177,9 +1183,12 @@ send_tag_foreach (const GstTagList * tags, const gchar * tag,
1177 size_t i; 1183 size_t i;
1178 size_t tagl = sizeof (__known_tags) / sizeof (struct KnownTag); 1184 size_t tagl = sizeof (__known_tags) / sizeof (struct KnownTag);
1179 struct KnownTag *kt = NULL; 1185 struct KnownTag *kt = NULL;
1186 struct KnownTag unknown_tag = {NULL, EXTRACTOR_METATYPE_UNKNOWN};
1187
1180 1188
1181 GValue val = { 0, }; 1189 GValue val = { 0, };
1182 gchar *str; 1190 gchar *str = NULL;
1191 GQuark tag_quark;
1183 1192
1184 GstSample *sample; 1193 GstSample *sample;
1185 1194
@@ -1194,10 +1203,12 @@ send_tag_foreach (const GstTagList * tags, const gchar * tag,
1194 break; 1203 break;
1195 } 1204 }
1196 if (kt == NULL) 1205 if (kt == NULL)
1197 return; 1206 kt = &unknown_tag;
1198 1207
1199 gst_tag_list_copy_value (&val, tags, tag); 1208 gst_tag_list_copy_value (&val, tags, tag);
1200 1209
1210 tag_quark = g_quark_from_string (tag);
1211
1201 switch (G_VALUE_TYPE (&val)) 1212 switch (G_VALUE_TYPE (&val))
1202 { 1213 {
1203 case G_TYPE_STRING: 1214 case G_TYPE_STRING:
@@ -1276,6 +1287,13 @@ send_tag_foreach (const GstTagList * tags, const gchar * tag,
1276 gst_buffer_unmap (buf, &mi); 1287 gst_buffer_unmap (buf, &mi);
1277 } 1288 }
1278 } 1289 }
1290 else if ((G_VALUE_TYPE (&val) == G_TYPE_UINT64) &&
1291 (tag_quark == duration_quark))
1292 {
1293 GstClockTime duration = (GstClockTime) g_value_get_uint64 (&val);
1294 if ((GST_CLOCK_TIME_IS_VALID (duration)) && (duration > 0))
1295 str = g_strdup_printf ("%" GST_TIME_FORMAT, GST_TIME_ARGS (duration));
1296 }
1279 else 1297 else
1280 str = gst_value_serialize (&val); 1298 str = gst_value_serialize (&val);
1281 break; 1299 break;
@@ -1338,6 +1356,19 @@ send_tag_foreach (const GstTagList * tags, const gchar * tag,
1338 break; 1356 break;
1339 } 1357 }
1340 break; 1358 break;
1359 case EXTRACTOR_METATYPE_NOMINAL_BITRATE:
1360 switch (ps->st)
1361 {
1362 case STREAM_TYPE_AUDIO:
1363 skip = TRUE;
1364 break;
1365 case STREAM_TYPE_VIDEO:
1366 skip = TRUE;
1367 break;
1368 default:
1369 break;
1370 }
1371 break;
1341 case EXTRACTOR_METATYPE_IMAGE_DIMENSIONS: 1372 case EXTRACTOR_METATYPE_IMAGE_DIMENSIONS:
1342 switch (ps->st) 1373 switch (ps->st)
1343 { 1374 {
@@ -1348,6 +1379,30 @@ send_tag_foreach (const GstTagList * tags, const gchar * tag,
1348 break; 1379 break;
1349 } 1380 }
1350 break; 1381 break;
1382 case EXTRACTOR_METATYPE_DURATION:
1383 switch (ps->st)
1384 {
1385 case STREAM_TYPE_VIDEO:
1386 le_type = EXTRACTOR_METATYPE_VIDEO_DURATION;
1387 break;
1388 case STREAM_TYPE_AUDIO:
1389 le_type = EXTRACTOR_METATYPE_AUDIO_DURATION;
1390 break;
1391 case STREAM_TYPE_SUBTITLE:
1392 le_type = EXTRACTOR_METATYPE_SUBTITLE_DURATION;
1393 break;
1394 default:
1395 break;
1396 }
1397 break;
1398 case EXTRACTOR_METATYPE_UNKNOWN:
1399 /* Convert to "key=value" form */
1400 {
1401 gchar *new_str = g_strdup_printf ("%s=%s", tag, str);
1402 g_free (str);
1403 str = new_str;
1404 }
1405 break;
1351 default: 1406 default:
1352 break; 1407 break;
1353 } 1408 }
@@ -1501,10 +1556,9 @@ send_info (GstDiscovererInfo * info, struct PrivStruct *ps)
1501 GstClockTime duration; 1556 GstClockTime duration;
1502 1557
1503 duration = gst_discoverer_info_get_duration (info); 1558 duration = gst_discoverer_info_get_duration (info);
1504 if (duration > 0) 1559 if ((GST_CLOCK_TIME_IS_VALID (duration)) && (duration > 0))
1505 { 1560 {
1506 s = g_strdup_printf ("%" GST_TIME_FORMAT, 1561 s = g_strdup_printf ("%" GST_TIME_FORMAT, GST_TIME_ARGS (duration));
1507 GST_TIME_ARGS (gst_discoverer_info_get_duration (info)));
1508 if (s) 1562 if (s)
1509 ps->time_to_leave = ps->ec->proc (ps->ec->cls, "gstreamer", 1563 ps->time_to_leave = ps->ec->proc (ps->ec->cls, "gstreamer",
1510 EXTRACTOR_METATYPE_DURATION, EXTRACTOR_METAFORMAT_UTF8, "text/plain", 1564 EXTRACTOR_METATYPE_DURATION, EXTRACTOR_METAFORMAT_UTF8, "text/plain",