summaryrefslogtreecommitdiffstats
path: root/gst/flv
diff options
context:
space:
mode:
authorJulien Moutte <julien@moutte.net>2007-08-22 14:50:51 +0000
committerJulien Moutte <julien@moutte.net>2007-08-22 14:50:51 +0000
commit37327082676d18ecd7515d08847048d09fba0f56 (patch)
tree0d5014a99a2e9767066b3bdf7b0ea6471c83bb9f /gst/flv
parent79a984c303998dd0ca17f4cc64f5e4321522d575 (diff)
downloadgst-plugins-bad-37327082676d18ecd7515d08847048d09fba0f56.tar.gz
gst-plugins-bad-37327082676d18ecd7515d08847048d09fba0f56.tar.bz2
gst-plugins-bad-37327082676d18ecd7515d08847048d09fba0f56.zip
gst/flv/: Handle pixel aspect ratio through metadata tags like ASF does. Fluendo muxer supports this and
Original commit message from CVS: 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.
Diffstat (limited to 'gst/flv')
-rw-r--r--gst/flv/gstflvdemux.c3
-rw-r--r--gst/flv/gstflvdemux.h3
-rw-r--r--gst/flv/gstflvparse.c23
3 files changed, 28 insertions, 1 deletions
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);