diff options
author | Arnaud Vrac <avrac@freebox.fr> | 2012-09-02 20:17:14 +0200 |
---|---|---|
committer | Edward Hervey <edward.hervey@collabora.co.uk> | 2012-09-14 09:14:27 +0200 |
commit | 744bd3d3f249aa9ec548bbfe2371acf6bd098094 (patch) | |
tree | 5779e5c1a0172b70339d664eb7807e410dc01001 | |
parent | 0331fb6203ecbe60230296ddf20e70d61e00eb7f (diff) | |
download | gstreamer-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.c | 30 | ||||
-rw-r--r-- | gst/videoparsers/gstmpeg4videoparse.h | 3 |
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; |