From 977b68d77988d0aee90e713cb251884180612b36 Mon Sep 17 00:00:00 2001 From: Michael Smith Date: Fri, 3 Nov 2006 15:44:31 +0000 Subject: [PATCH] gst/typefind/gsttypefindfunctions.c: Recognise more mpeg4 elementary video streams. Original commit message from CVS: * gst/typefind/gsttypefindfunctions.c: (mpeg4_video_type_find): Recognise more mpeg4 elementary video streams. --- ChangeLog | 5 ++++ gst/typefind/gsttypefindfunctions.c | 39 ++++++++++++++++++++++------- 2 files changed, 35 insertions(+), 9 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8681d5ef47..3d10c1a82a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2006-11-03 Michael Smith + + * gst/typefind/gsttypefindfunctions.c: (mpeg4_video_type_find): + Recognise more mpeg4 elementary video streams. + 2006-11-02 Edward Hervey * gst/typefind/gsttypefindfunctions.c: (mp3_type_find_at_offset): diff --git a/gst/typefind/gsttypefindfunctions.c b/gst/typefind/gsttypefindfunctions.c index cff87ed8c9..376ef4f571 100644 --- a/gst/typefind/gsttypefindfunctions.c +++ b/gst/typefind/gsttypefindfunctions.c @@ -1292,19 +1292,40 @@ static GstStaticCaps mpeg4_video_caps = GST_STATIC_CAPS ("video/mpeg, " static void mpeg4_video_type_find (GstTypeFind * tf, gpointer unused) { - /* Header is a video object start code followed by a video object layer - * start code. The last byte of this 8-byte header can be from 0x20 - 0x2F */ - static const guint8 header[] = { 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01 }; + /* Header consists of: a series of start codes (00 00 01 xx), some with + * associated data. + * Optionally, we start with a visual_object_sequence_start_code, followed by + * (optionally) visual_object_start_code), then the mandatory + * video_object_start_code and video_object_layer_start_code) + */ guint8 *data = NULL; + int offset = 0; + gboolean seen_vos = FALSE; - data = gst_type_find_peek (tf, 0, 8); + while (TRUE) { + data = gst_type_find_peek (tf, offset, 4); + if (data && data[0] == 0 && data[1] == 0 && data[2] == 1) { + int sc = data[3]; - if (data && memcmp (data, header, 7) == 0 && - data[7] >= 0x20 && data[7] <= 0x2F) { - GstCaps *caps = gst_caps_copy (MPEG4_VIDEO_CAPS); + if (sc == 0xB0) /* visual_object_sequence_start_code */ + offset += 5; + else if (sc == 0xB5) /* visual_object_start_code */ + offset += 5; + else if (sc >= 0x00 && sc <= 0x1F) { /* video_object_start_code */ + offset += 4; + seen_vos = TRUE; + } else if (sc >= 0x20 && sc <= 0x2F) { /* video_object_layer_start_code */ + if (seen_vos) { + GstCaps *caps = gst_caps_copy (MPEG4_VIDEO_CAPS); - gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM - 1, caps); - gst_caps_unref (caps); + gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM - 1, caps); + gst_caps_unref (caps); + return; + } + } else + return; + } else + return; } }