diff options
Diffstat (limited to 'src/plugins/gstreamer_extractor.c')
-rw-r--r-- | src/plugins/gstreamer_extractor.c | 70 |
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 | ||
648 | static GQuark *subtitle_quarks; | 648 | static GQuark *subtitle_quarks; |
649 | 649 | ||
650 | static GQuark duration_quark; | ||
650 | 651 | ||
651 | static void send_streams (GstDiscovererStreamInfo *info, struct PrivStruct *ps); | 652 | static 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", |