mp4gdepay: guess constantDuration better

Do a better job at guessing the constantDuration parameter when it is not
present in the caps.

Fixes #585205
This commit is contained in:
Wim Taymans 2009-06-15 22:40:35 +02:00 committed by Wim Taymans
parent cf58ba0fa5
commit a2cef3e5c2

View file

@ -245,14 +245,10 @@ gst_rtp_mp4g_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps)
if (strcmp (str, "audio") == 0) { if (strcmp (str, "audio") == 0) {
srccaps = gst_caps_new_simple ("audio/mpeg", srccaps = gst_caps_new_simple ("audio/mpeg",
"mpegversion", G_TYPE_INT, 4, NULL); "mpegversion", G_TYPE_INT, 4, NULL);
/* AAC always has a default constant duration of 1024 but it can be
* overriden below. */
rtpmp4gdepay->constantDuration = 1024;
} else if (strcmp (str, "video") == 0) { } else if (strcmp (str, "video") == 0) {
srccaps = gst_caps_new_simple ("video/mpeg", srccaps = gst_caps_new_simple ("video/mpeg",
"mpegversion", G_TYPE_INT, 4, "mpegversion", G_TYPE_INT, 4,
"systemstream", G_TYPE_BOOLEAN, FALSE, NULL); "systemstream", G_TYPE_BOOLEAN, FALSE, NULL);
rtpmp4gdepay->constantDuration = 0;
} }
} }
if (srccaps == NULL) if (srccaps == NULL)
@ -279,8 +275,7 @@ gst_rtp_mp4g_depay_setcaps (GstBaseRTPDepayload * depayload, GstCaps * caps)
rtpmp4gdepay->constantSize = rtpmp4gdepay->constantSize =
gst_rtp_mp4g_depay_parse_int (structure, "constantsize", 0); gst_rtp_mp4g_depay_parse_int (structure, "constantsize", 0);
rtpmp4gdepay->constantDuration = rtpmp4gdepay->constantDuration =
gst_rtp_mp4g_depay_parse_int (structure, "constantduration", gst_rtp_mp4g_depay_parse_int (structure, "constantduration", 0);
rtpmp4gdepay->constantDuration);
/* get config string */ /* get config string */
@ -511,6 +506,7 @@ gst_rtp_mp4g_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf)
* reconstruct the AU ordering when interleaving. */ * reconstruct the AU ordering when interleaving. */
if (i == 0) { if (i == 0) {
AU_index = gst_bs_parse_read (&bs, rtpmp4gdepay->indexlength); AU_index = gst_bs_parse_read (&bs, rtpmp4gdepay->indexlength);
if (AU_index == 0 && rtpmp4gdepay->prev_AU_index == 0) { if (AU_index == 0 && rtpmp4gdepay->prev_AU_index == 0) {
gint diff; gint diff;
@ -524,6 +520,13 @@ gst_rtp_mp4g_depay_process (GstBaseRTPDepayload * depayload, GstBuffer * buf)
else else
diff = -(rtpmp4gdepay->prev_rtptime - rtptime); diff = -(rtpmp4gdepay->prev_rtptime - rtptime);
/* if no constantDuration was given, make one */
if (rtpmp4gdepay->constantDuration == 0) {
rtpmp4gdepay->constantDuration = diff / num_AU_headers;
GST_DEBUG_OBJECT (depayload, "guessing constantDuration %d",
rtpmp4gdepay->constantDuration);
}
/* get the number of packets by dividing with the duration */ /* get the number of packets by dividing with the duration */
diff /= rtpmp4gdepay->constantDuration; diff /= rtpmp4gdepay->constantDuration;