diff options
author | Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> | 2012-10-25 17:50:52 +0200 |
---|---|---|
committer | Josep Torra <n770galaxy@gmail.com> | 2013-03-05 10:53:09 +0100 |
commit | cba42fc79e74a69e2f8b7b433c83f7cc1d541ebc (patch) | |
tree | 3d2ce822dc6a7541cb2009920e45a0e3dd9ba944 | |
parent | 41ecfcd429d45f47378f8e9e3c201dd2af6abb9d (diff) |
videoparsers: use parsed or upstream fps to set some baseparse parameters
Conflicts:
gst/videoparsers/gstmpeg4videoparse.c
-rw-r--r-- | gst/videoparsers/gsth264parse.c | 19 | ||||
-rw-r--r-- | gst/videoparsers/gstmpeg4videoparse.c | 27 | ||||
-rw-r--r-- | gst/videoparsers/gstmpegvideoparse.c | 24 |
3 files changed, 48 insertions, 22 deletions
diff --git a/gst/videoparsers/gsth264parse.c b/gst/videoparsers/gsth264parse.c index c0f2b4216..c28a7d9ad 100644 --- a/gst/videoparsers/gsth264parse.c +++ b/gst/videoparsers/gsth264parse.c @@ -1105,18 +1105,29 @@ gst_h264_parse_update_src_caps (GstH264Parse * h264parse, GstCaps * caps) } if (G_UNLIKELY (modified)) { + gint fps_num = h264parse->fps_num; + gint fps_den = h264parse->fps_den; + GstClockTime latency; + caps = gst_caps_copy (sink_caps); /* sps should give this */ gst_caps_set_simple (caps, "width", G_TYPE_INT, sps->width, "height", G_TYPE_INT, sps->height, NULL); + + /* upstream overrides */ + if (s && gst_structure_has_field (s, "framerate")) + gst_structure_get_fraction (s, "framerate", &fps_num, &fps_den); + /* but not necessarily or reliably this */ - if (h264parse->fps_num > 0 && h264parse->fps_den > 0 && - (!s || !gst_structure_has_field (s, "framerate"))) { + if (fps_num > 0 && fps_den > 0) { GST_INFO_OBJECT (h264parse, "setting framerate in caps"); gst_caps_set_simple (caps, "framerate", - GST_TYPE_FRACTION, h264parse->fps_num, h264parse->fps_den, NULL); + GST_TYPE_FRACTION, fps_num, fps_den, NULL); gst_base_parse_set_frame_rate (GST_BASE_PARSE (h264parse), - h264parse->fps_num, h264parse->fps_den, 0, 0); + fps_num, fps_den, 0, 0); + latency = gst_util_uint64_scale (GST_SECOND, fps_den, fps_num); + gst_base_parse_set_latency (GST_BASE_PARSE (h264parse), latency, + latency); } } } diff --git a/gst/videoparsers/gstmpeg4videoparse.c b/gst/videoparsers/gstmpeg4videoparse.c index 3ac8afb04..7b47477a8 100644 --- a/gst/videoparsers/gstmpeg4videoparse.c +++ b/gst/videoparsers/gstmpeg4videoparse.c @@ -485,6 +485,7 @@ static void gst_mpeg4vparse_update_src_caps (GstMpeg4VParse * mp4vparse) { GstCaps *caps = NULL; + GstStructure *s = NULL; GST_LOG_OBJECT (mp4vparse, "Updating caps"); @@ -497,6 +498,7 @@ gst_mpeg4vparse_update_src_caps (GstMpeg4VParse * mp4vparse) caps = GST_PAD_CAPS (GST_BASE_PARSE_SINK_PAD (mp4vparse)); if (caps) { caps = gst_caps_copy (caps); + s = gst_caps_get_structure (caps, 0); } else { caps = gst_caps_new_simple ("video/mpeg", "mpegversion", G_TYPE_INT, 4, @@ -520,17 +522,24 @@ gst_mpeg4vparse_update_src_caps (GstMpeg4VParse * mp4vparse) "height", G_TYPE_INT, mp4vparse->vol.height, NULL); } - /* perhaps we have a framerate */ - if (mp4vparse->vol.fixed_vop_time_increment != 0) { + /* perhaps we have a framerate */ + { gint fps_num = mp4vparse->vol.vop_time_increment_resolution; gint fps_den = mp4vparse->vol.fixed_vop_time_increment; - GstClockTime latency = gst_util_uint64_scale (GST_SECOND, fps_den, fps_num); - - gst_caps_set_simple (caps, "framerate", - GST_TYPE_FRACTION, fps_num, fps_den, NULL); - gst_base_parse_set_frame_rate (GST_BASE_PARSE (mp4vparse), - fps_num, fps_den, 0, 0); - gst_base_parse_set_latency (GST_BASE_PARSE (mp4vparse), latency, latency); + GstClockTime latency; + + /* upstream overrides */ + if (s && gst_structure_has_field (s, "framerate")) + gst_structure_get_fraction (s, "framerate", &fps_num, &fps_den); + + if (fps_den > 0 && fps_num > 0) { + gst_caps_set_simple (caps, "framerate", + GST_TYPE_FRACTION, fps_num, fps_den, NULL); + gst_base_parse_set_frame_rate (GST_BASE_PARSE (mp4vparse), + fps_num, fps_den, 0, 0); + latency = gst_util_uint64_scale (GST_SECOND, fps_den, fps_num); + gst_base_parse_set_latency (GST_BASE_PARSE (mp4vparse), latency, latency); + } } /* or pixel-aspect-ratio */ diff --git a/gst/videoparsers/gstmpegvideoparse.c b/gst/videoparsers/gstmpegvideoparse.c index 826218db2..2f4607553 100644 --- a/gst/videoparsers/gstmpegvideoparse.c +++ b/gst/videoparsers/gstmpegvideoparse.c @@ -618,17 +618,23 @@ gst_mpegv_parse_update_src_caps (GstMpegvParse * mpvparse) } /* perhaps we have a framerate */ - if (mpvparse->fps_num > 0 && mpvparse->fps_den > 0 && - (!s || !gst_structure_has_field (s, "framerate"))) { + { gint fps_num = mpvparse->fps_num; gint fps_den = mpvparse->fps_den; - GstClockTime latency = gst_util_uint64_scale (GST_SECOND, fps_den, fps_num); - - gst_caps_set_simple (caps, "framerate", - GST_TYPE_FRACTION, fps_num, fps_den, NULL); - gst_base_parse_set_frame_rate (GST_BASE_PARSE (mpvparse), - fps_num, fps_den, 0, 0); - gst_base_parse_set_latency (GST_BASE_PARSE (mpvparse), latency, latency); + GstClockTime latency; + + /* upstream overrides */ + if (s && gst_structure_has_field (s, "framerate")) + gst_structure_get_fraction (s, "framerate", &fps_num, &fps_den); + + if (fps_den > 0 && fps_num > 0) { + gst_caps_set_simple (caps, "framerate", + GST_TYPE_FRACTION, fps_num, fps_den, NULL); + gst_base_parse_set_frame_rate (GST_BASE_PARSE (mpvparse), + fps_num, fps_den, 0, 0); + latency = gst_util_uint64_scale (GST_SECOND, fps_den, fps_num); + gst_base_parse_set_latency (GST_BASE_PARSE (mpvparse), latency, latency); + } } /* or pixel-aspect-ratio */ |