summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>2012-10-25 17:50:52 +0200
committerJosep Torra <n770galaxy@gmail.com>2013-03-05 10:53:09 +0100
commitcba42fc79e74a69e2f8b7b433c83f7cc1d541ebc (patch)
tree3d2ce822dc6a7541cb2009920e45a0e3dd9ba944
parent41ecfcd429d45f47378f8e9e3c201dd2af6abb9d (diff)
videoparsers: use parsed or upstream fps to set some baseparse parameters
Conflicts: gst/videoparsers/gstmpeg4videoparse.c
-rw-r--r--gst/videoparsers/gsth264parse.c19
-rw-r--r--gst/videoparsers/gstmpeg4videoparse.c27
-rw-r--r--gst/videoparsers/gstmpegvideoparse.c24
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 */