summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSreerenj Balachandran <sreerenj.balachandran@intel.com>2013-02-21 11:38:45 +0200
committerTim-Philipp Müller <tim@centricular.net>2013-02-21 12:20:36 +0000
commit9791f0aaf164828df7e112ca23ccd88ba0a7f45c (patch)
tree45de7f394cd26aa7a0f6a1d432ba22281ac12754
parenta86ca535c88a604daa431b0bc1cf4cd8fbb2d100 (diff)
typefindfunctions: recognize SVC and MVC nal units in h264 streams
Ensure the detection of svc and mvc as a part of h264 stream. Once the typefinder detect a subset_sequence_parameter_set(ssps), then each nal unit with type 14 or 20 should be detected as a part of h264 stream thereafter. https://bugzilla.gnome.org/show_bug.cgi?id=694346
-rw-r--r--gst/typefind/gsttypefindfunctions.c26
1 files changed, 17 insertions, 9 deletions
diff --git a/gst/typefind/gsttypefindfunctions.c b/gst/typefind/gsttypefindfunctions.c
index a38f84d11..5f3c22746 100644
--- a/gst/typefind/gsttypefindfunctions.c
+++ b/gst/typefind/gsttypefindfunctions.c
@@ -2505,6 +2505,7 @@ h264_video_type_find (GstTypeFind * tf, gpointer unused)
gboolean seen_idr = FALSE;
gboolean seen_sps = FALSE;
gboolean seen_pps = FALSE;
+ gboolean seen_ssps = FALSE;
int nut, ref;
int good = 0;
int bad = 0;
@@ -2539,18 +2540,25 @@ h264_video_type_find (GstTypeFind * tf, gpointer unused)
good++;
}
} else if (nut >= 14 && nut <= 33) {
- /* reserved */
- /* Theoretically these are good, since if they exist in the
- stream it merely means that a newer backwards-compatible
- h.264 stream. But we should be identifying that separately. */
- bad++;
+ if (nut == 15) {
+ seen_ssps = TRUE;
+ good++;
+ } else if (seen_ssps && (nut == 14 || nut == 20)) {
+ good++;
+ } else {
+ /* reserved */
+ /* Theoretically these are good, since if they exist in the
+ stream it merely means that a newer backwards-compatible
+ h.264 stream. But we should be identifying that separately. */
+ bad++;
+ }
} else {
/* unspecified, application specific */
/* don't consider these bad */
}
- GST_LOG ("good:%d, bad:%d, pps:%d, sps:%d, idr:%d", good, bad, seen_pps,
- seen_sps, seen_idr);
+ GST_LOG ("good:%d, bad:%d, pps:%d, sps:%d, idr:%d ssps:%d", good, bad,
+ seen_pps, seen_sps, seen_idr, seen_ssps);
if (seen_sps && seen_pps && seen_idr && good >= 10 && bad < 4) {
gst_type_find_suggest (tf, GST_TYPE_FIND_LIKELY, H264_VIDEO_CAPS);
@@ -2562,8 +2570,8 @@ h264_video_type_find (GstTypeFind * tf, gpointer unused)
data_scan_ctx_advance (tf, &c, 1);
}
- GST_LOG ("good:%d, bad:%d, pps:%d, sps:%d, idr:%d", good, bad, seen_pps,
- seen_sps, seen_idr);
+ GST_LOG ("good:%d, bad:%d, pps:%d, sps:%d, idr:%d ssps=%d", good, bad,
+ seen_pps, seen_sps, seen_idr, seen_ssps);
if (good >= 2 && bad == 0) {
gst_type_find_suggest (tf, GST_TYPE_FIND_POSSIBLE, H264_VIDEO_CAPS);