summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArnaud Vrac <avrac@freebox.fr>2012-09-02 20:17:14 +0200
committerEdward Hervey <edward.hervey@collabora.co.uk>2012-09-14 09:14:27 +0200
commit744bd3d3f249aa9ec548bbfe2371acf6bd098094 (patch)
tree5779e5c1a0172b70339d664eb7807e410dc01001
parent0331fb6203ecbe60230296ddf20e70d61e00eb7f (diff)
downloadgstreamer-plugins-bad-744bd3d3f249aa9ec548bbfe2371acf6bd098094.tar.gz
mpeg4videoparse: use previously parsed visual object when parsing VOL
https://bugzilla.gnome.org/show_bug.cgi?id=683254
-rw-r--r--gst/videoparsers/gstmpeg4videoparse.c30
-rw-r--r--gst/videoparsers/gstmpeg4videoparse.h3
2 files changed, 25 insertions, 8 deletions
diff --git a/gst/videoparsers/gstmpeg4videoparse.c b/gst/videoparsers/gstmpeg4videoparse.c
index 5e9770ea0..842c6eac9 100644
--- a/gst/videoparsers/gstmpeg4videoparse.c
+++ b/gst/videoparsers/gstmpeg4videoparse.c
@@ -192,6 +192,7 @@ gst_mpeg4vparse_reset_frame (GstMpeg4VParse * mp4vparse)
mp4vparse->vop_offset = -1;
mp4vparse->vo_found = FALSE;
mp4vparse->vol_offset = -1;
+ mp4vparse->vo_offset = -1;
}
static void
@@ -238,6 +239,8 @@ static gboolean
gst_mpeg4vparse_process_config (GstMpeg4VParse * mp4vparse,
const guint8 * data, guint offset, gsize size)
{
+ GstMpeg4VisualObject *vo;
+
/* only do stuff if something new */
if (mp4vparse->config
&& !gst_buffer_memcmp (mp4vparse->config, offset, data, size))
@@ -249,10 +252,12 @@ gst_mpeg4vparse_process_config (GstMpeg4VParse * mp4vparse,
return FALSE;
}
+ vo = mp4vparse->vo_found ? &mp4vparse->vo : NULL;
+
/* If the parsing fail, we accept the config only if we don't have
* any config yet. */
if (gst_mpeg4_parse_video_object_layer (&mp4vparse->vol,
- NULL, data + mp4vparse->vol_offset,
+ vo, data + mp4vparse->vol_offset,
size - mp4vparse->vol_offset) != GST_MPEG4_PARSER_OK &&
mp4vparse->config)
return FALSE;
@@ -344,6 +349,14 @@ gst_mpeg4vparse_process_sc (GstMpeg4VParse * mp4vparse, GstMpeg4Packet * packet,
return TRUE;
}
+ if (mp4vparse->vo_offset >= 0) {
+ gst_mpeg4_parse_visual_object (&mp4vparse->vo, NULL,
+ packet->data + mp4vparse->vo_offset,
+ packet->offset - 3 - mp4vparse->vo_offset);
+ mp4vparse->vo_offset = -1;
+ mp4vparse->vo_found = TRUE;
+ }
+
switch (packet->type) {
case GST_MPEG4_VIDEO_OBJ_PLANE:
case GST_MPEG4_GROUP_OF_VOP:
@@ -358,22 +371,17 @@ gst_mpeg4vparse_process_sc (GstMpeg4VParse * mp4vparse, GstMpeg4Packet * packet,
GST_LOG_OBJECT (mp4vparse, "startcode is User Data");
}
/* parse config data ending here if proper startcodes found earlier;
- * preferably start at VOS (visual object sequence),
- * otherwise at VO (video object) */
+ * we should have received a visual object before. */
if (mp4vparse->vo_found) {
-
/*Do not take care startcode into account */
gst_mpeg4vparse_process_config (mp4vparse,
packet->data, packet->offset, packet->offset - 3);
-
- /* avoid accepting again for a VOP sc following a GOP sc */
mp4vparse->vo_found = FALSE;
}
break;
}
case GST_MPEG4_VISUAL_OBJ_SEQ_START:
GST_LOG_OBJECT (mp4vparse, "Visual Sequence Start");
- mp4vparse->vo_found = TRUE;
mp4vparse->profile = gst_codec_utils_mpeg4video_get_profile (packet->data
+ packet->offset + 1, packet->offset);
mp4vparse->level = gst_codec_utils_mpeg4video_get_level (packet->data
@@ -381,6 +389,7 @@ gst_mpeg4vparse_process_sc (GstMpeg4VParse * mp4vparse, GstMpeg4Packet * packet,
break;
case GST_MPEG4_VISUAL_OBJ:
GST_LOG_OBJECT (mp4vparse, "Visual Object");
+ mp4vparse->vo_offset = packet->offset;
break;
default:
if (packet->type >= GST_MPEG4_VIDEO_LAYER_FIRST &&
@@ -395,7 +404,6 @@ gst_mpeg4vparse_process_sc (GstMpeg4VParse * mp4vparse, GstMpeg4Packet * packet,
/* VO (video object) cases */
} else if (packet->type <= GST_MPEG4_VIDEO_OBJ_LAST) {
GST_LOG_OBJECT (mp4vparse, "Video object");
- mp4vparse->vo_found = TRUE;
}
break;
}
@@ -805,6 +813,12 @@ gst_mpeg4vparse_set_caps (GstBaseParse * parse, GstCaps * caps)
packet.type <= GST_MPEG4_VIDEO_LAYER_LAST)
mp4vparse->vol_offset = packet.offset;
+ else if (packet.type == GST_MPEG4_VISUAL_OBJ) {
+ gst_mpeg4_parse_visual_object (&mp4vparse->vo, NULL,
+ data + packet.offset, MIN (packet.size, size));
+ mp4vparse->vo_found = TRUE;
+ }
+
res = gst_mpeg4_parse (&packet, FALSE, NULL, data, packet.offset, size);
}
diff --git a/gst/videoparsers/gstmpeg4videoparse.h b/gst/videoparsers/gstmpeg4videoparse.h
index 7611749ef..339af6a00 100644
--- a/gst/videoparsers/gstmpeg4videoparse.h
+++ b/gst/videoparsers/gstmpeg4videoparse.h
@@ -55,6 +55,9 @@ struct _GstMpeg4VParse {
gboolean vop_coded;
gboolean update_caps;
+ GstMpeg4VisualObject vo;
+ gint vo_offset;
+
GstBuffer *config;
GstMpeg4VideoObjectLayer vol;
gboolean vol_offset;