diff --git a/gst/audioparsers/gstmpegaudioparse.c b/gst/audioparsers/gstmpegaudioparse.c index b570b1aac0..f4cb1ccd24 100644 --- a/gst/audioparsers/gstmpegaudioparse.c +++ b/gst/audioparsers/gstmpegaudioparse.c @@ -199,6 +199,7 @@ gst_mpeg_audio_parse_reset (GstMpegAudioParse * mp3parse) mp3parse->freerate = 0; mp3parse->hdr_bitrate = 0; + mp3parse->bitrate_is_constant = TRUE; mp3parse->xing_flags = 0; mp3parse->xing_bitrate = 0; @@ -755,6 +756,9 @@ gst_mpeg_audio_parse_handle_frame (GstBaseParse * parse, (version == 1) ? 10 : 30, 2); } + if (mp3parse->hdr_bitrate && mp3parse->hdr_bitrate != bitrate) { + mp3parse->bitrate_is_constant = FALSE; + } mp3parse->hdr_bitrate = bitrate; /* For first frame; check for seek tables and output a codec tag */ @@ -1227,6 +1231,14 @@ gst_mpeg_audio_parse_time_to_bytepos (GstMpegAudioParse * mp3parse, return TRUE; } + /* If we have had a constant bit rate (so far), use it directly, as it + * may give slightly more accurate results than the base class. */ + if (mp3parse->bitrate_is_constant && mp3parse->hdr_bitrate) { + *bytepos = gst_util_uint64_scale (ts, mp3parse->hdr_bitrate, + 8 * GST_SECOND); + return TRUE; + } + return FALSE; } @@ -1292,6 +1304,14 @@ gst_mpeg_audio_parse_bytepos_to_time (GstMpegAudioParse * mp3parse, return TRUE; } + /* If we have had a constant bit rate (so far), use it directly, as it + * may give slightly more accurate results than the base class. */ + if (mp3parse->bitrate_is_constant && mp3parse->hdr_bitrate) { + *ts = gst_util_uint64_scale (bytepos, 8 * GST_SECOND, + mp3parse->hdr_bitrate); + return TRUE; + } + return FALSE; } diff --git a/gst/audioparsers/gstmpegaudioparse.h b/gst/audioparsers/gstmpegaudioparse.h index 5e576beae5..e7fa8099fb 100644 --- a/gst/audioparsers/gstmpegaudioparse.h +++ b/gst/audioparsers/gstmpegaudioparse.h @@ -69,6 +69,7 @@ struct _GstMpegAudioParse { /* Bitrate from non-vbr headers */ guint32 hdr_bitrate; + gboolean bitrate_is_constant; /* Xing info */ guint32 xing_flags;