diff options
-rw-r--r-- | ChangeLog | 11 | ||||
-rw-r--r-- | gst/flv/gstflvdemux.c | 3 | ||||
-rw-r--r-- | gst/flv/gstflvdemux.h | 3 | ||||
-rw-r--r-- | gst/flv/gstflvparse.c | 23 |
4 files changed, 39 insertions, 1 deletions
@@ -1,5 +1,16 @@ 2007-08-22 Julien MOUTTE <julien@moutte.net> + * gst/flv/gstflvdemux.c: (gst_flv_demux_cleanup), + (gst_flv_demux_pull_tag): + * gst/flv/gstflvdemux.h: + * gst/flv/gstflvparse.c: (gst_flv_parse_metadata_item), + (gst_flv_parse_tag_script), (gst_flv_parse_tag_audio), + (gst_flv_parse_tag_video): Handle pixel aspect ratio through + metadata tags like ASF does. Fluendo muxer supports this and + Flash players can support it as well this way. + +2007-08-22 Julien MOUTTE <julien@moutte.net> + * gst/flv/gstflvdemux.c: (gst_flv_demux_pull_tag): * gst/flv/gstflvparse.c: (gst_flv_parse_metadata_item), (gst_flv_parse_tag_script), (gst_flv_parse_tag_audio), diff --git a/gst/flv/gstflvdemux.c b/gst/flv/gstflvdemux.c index 3a644c38..b94479ea 100644 --- a/gst/flv/gstflvdemux.c +++ b/gst/flv/gstflvdemux.c @@ -90,7 +90,10 @@ gst_flv_demux_cleanup (GstFLVDemux * demux) demux->has_audio = FALSE; demux->has_video = FALSE; demux->push_tags = FALSE; + demux->got_par = FALSE; + demux->w = demux->h = 0; + demux->par_x = demux->par_y = 1; demux->video_offset = 0; demux->audio_offset = 0; demux->offset = demux->cur_tag_offset = 0; diff --git a/gst/flv/gstflvdemux.h b/gst/flv/gstflvdemux.h index c3a4cf21..29d71c59 100644 --- a/gst/flv/gstflvdemux.h +++ b/gst/flv/gstflvdemux.h @@ -92,11 +92,14 @@ struct _GstFLVDemux /* Video infos */ guint32 w; guint32 h; + guint32 par_x; + guint32 par_y; guint16 video_codec_tag; guint64 video_offset; gboolean video_need_discont; gboolean video_need_segment; gboolean video_linked; + gboolean got_par; gboolean random_access; gboolean need_header; diff --git a/gst/flv/gstflvparse.c b/gst/flv/gstflvparse.c index dd7794d1..eeb64546 100644 --- a/gst/flv/gstflvparse.c +++ b/gst/flv/gstflvparse.c @@ -123,6 +123,13 @@ gst_flv_parse_metadata_item (GstFLVDemux * demux, const guint8 * data, GST_TAG_DURATION, demux->duration, NULL); } else { if (tag_name) { + if (!strcmp (tag_name, "AspectRatioX")) { + demux->par_x = value_union.value_double; + demux->got_par = TRUE; + } else if (!strcmp (tag_name, "AspectRatioY")) { + demux->par_y = value_union.value_double; + demux->got_par = TRUE; + } if (!gst_tag_exists (tag_name)) { gst_tag_register (tag_name, GST_TAG_FLAG_META, G_TYPE_DOUBLE, tag_name, tag_name, gst_tag_merge_use_first); @@ -718,6 +725,13 @@ gst_flv_parse_tag_video (GstFLVDemux * demux, const guint8 * data, goto beach; } + gst_caps_set_simple (caps, "pixel-aspect-ratio", GST_TYPE_FRACTION, + demux->par_x, demux->par_y, NULL); + + /* When we ve set pixel-aspect-ratio we use that boolean to detect a + * metadata tag that would come later and trigger a caps change */ + demux->got_par = FALSE; + gst_pad_set_caps (demux->video_pad, caps); GST_DEBUG_OBJECT (demux, "created video pad with caps %" GST_PTR_FORMAT, @@ -751,7 +765,7 @@ gst_flv_parse_tag_video (GstFLVDemux * demux, const guint8 * data, } /* Check if caps have changed */ - if (G_UNLIKELY (codec_tag != demux->video_codec_tag)) { + if (G_UNLIKELY (codec_tag != demux->video_codec_tag || demux->got_par)) { GstCaps *caps = NULL; GST_DEBUG_OBJECT (demux, "video settings have changed, changing caps"); @@ -780,6 +794,13 @@ gst_flv_parse_tag_video (GstFLVDemux * demux, const guint8 * data, goto beach; } + gst_caps_set_simple (caps, "pixel-aspect-ratio", GST_TYPE_FRACTION, + demux->par_x, demux->par_y, NULL); + + /* When we ve set pixel-aspect-ratio we use that boolean to detect a + * metadata tag that would come later and trigger a caps change */ + demux->got_par = FALSE; + gst_pad_set_caps (demux->video_pad, caps); gst_caps_unref (caps); |