mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-19 13:55:41 +00:00
gst/mpegaudioparse/gstmpegaudioparse.*: If the Xing header provides a total time, use it to calculate the correct ave...
Original commit message from CVS: * gst/mpegaudioparse/gstmpegaudioparse.c: (gst_mp3parse_reset), (gst_mp3parse_emit_frame), (gst_mp3parse_handle_first_frame): * gst/mpegaudioparse/gstmpegaudioparse.h: If the Xing header provides a total time, use it to calculate the correct average bitrate immediately, instead of sending updates as we parse the stream.
This commit is contained in:
parent
2969f0a29c
commit
f66de5cf88
3 changed files with 35 additions and 3 deletions
|
@ -1,3 +1,12 @@
|
||||||
|
2007-06-08 Jan Schmidt <thaytan@mad.scientist.com>
|
||||||
|
|
||||||
|
* gst/mpegaudioparse/gstmpegaudioparse.c: (gst_mp3parse_reset),
|
||||||
|
(gst_mp3parse_emit_frame), (gst_mp3parse_handle_first_frame):
|
||||||
|
* gst/mpegaudioparse/gstmpegaudioparse.h:
|
||||||
|
If the Xing header provides a total time, use it to calculate the
|
||||||
|
correct average bitrate immediately, instead of sending updates as
|
||||||
|
we parse the stream.
|
||||||
|
|
||||||
2007-06-05 Sebastian Dröge <slomo@circular-chaos.org>
|
2007-06-05 Sebastian Dröge <slomo@circular-chaos.org>
|
||||||
|
|
||||||
Patch by by: Mark Nauwelaerts <manauw at skynet dot be>
|
Patch by by: Mark Nauwelaerts <manauw at skynet dot be>
|
||||||
|
|
|
@ -92,6 +92,8 @@ static GstStateChangeReturn gst_mp3parse_change_state (GstElement * element,
|
||||||
|
|
||||||
static gboolean mp3parse_bytepos_to_time (GstMPEGAudioParse * mp3parse,
|
static gboolean mp3parse_bytepos_to_time (GstMPEGAudioParse * mp3parse,
|
||||||
gint64 bytepos, GstClockTime * ts);
|
gint64 bytepos, GstClockTime * ts);
|
||||||
|
static gboolean
|
||||||
|
mp3parse_total_bytes (GstMPEGAudioParse * mp3parse, gint64 * total);
|
||||||
|
|
||||||
static GstElementClass *parent_class = NULL;
|
static GstElementClass *parent_class = NULL;
|
||||||
|
|
||||||
|
@ -280,6 +282,9 @@ gst_mp3parse_reset (GstMPEGAudioParse * mp3parse)
|
||||||
mp3parse->last_posted_bitrate = 0;
|
mp3parse->last_posted_bitrate = 0;
|
||||||
mp3parse->frame_count = 0;
|
mp3parse->frame_count = 0;
|
||||||
mp3parse->sent_codec_tag = FALSE;
|
mp3parse->sent_codec_tag = FALSE;
|
||||||
|
|
||||||
|
mp3parse->xing_flags = 0;
|
||||||
|
mp3parse->xing_bitrate = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -397,6 +402,7 @@ static GstFlowReturn
|
||||||
gst_mp3parse_emit_frame (GstMPEGAudioParse * mp3parse, guint size)
|
gst_mp3parse_emit_frame (GstMPEGAudioParse * mp3parse, guint size)
|
||||||
{
|
{
|
||||||
GstBuffer *outbuf;
|
GstBuffer *outbuf;
|
||||||
|
guint bitrate;
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (mp3parse, "pushing buffer of %d bytes", size);
|
GST_DEBUG_OBJECT (mp3parse, "pushing buffer of %d bytes", size);
|
||||||
|
|
||||||
|
@ -462,11 +468,15 @@ gst_mp3parse_emit_frame (GstMPEGAudioParse * mp3parse, guint size)
|
||||||
gst_buffer_set_caps (outbuf, GST_PAD_CAPS (mp3parse->srcpad));
|
gst_buffer_set_caps (outbuf, GST_PAD_CAPS (mp3parse->srcpad));
|
||||||
|
|
||||||
/* Post a bitrate tag if we need to before pushing the buffer */
|
/* Post a bitrate tag if we need to before pushing the buffer */
|
||||||
if ((mp3parse->last_posted_bitrate / 10000) !=
|
if (mp3parse->xing_bitrate != 0)
|
||||||
(mp3parse->avg_bitrate / 10000)) {
|
bitrate = mp3parse->xing_bitrate;
|
||||||
|
else
|
||||||
|
bitrate = mp3parse->avg_bitrate;
|
||||||
|
|
||||||
|
if ((mp3parse->last_posted_bitrate / 10000) != (bitrate / 10000)) {
|
||||||
GstTagList *taglist = gst_tag_list_new ();
|
GstTagList *taglist = gst_tag_list_new ();
|
||||||
|
|
||||||
mp3parse->last_posted_bitrate = mp3parse->avg_bitrate;
|
mp3parse->last_posted_bitrate = bitrate;
|
||||||
gst_tag_list_add (taglist, GST_TAG_MERGE_REPLACE, GST_TAG_BITRATE,
|
gst_tag_list_add (taglist, GST_TAG_MERGE_REPLACE, GST_TAG_BITRATE,
|
||||||
mp3parse->last_posted_bitrate, NULL);
|
mp3parse->last_posted_bitrate, NULL);
|
||||||
gst_element_found_tags_for_pad (GST_ELEMENT (mp3parse),
|
gst_element_found_tags_for_pad (GST_ELEMENT (mp3parse),
|
||||||
|
@ -572,9 +582,21 @@ gst_mp3parse_handle_first_frame (GstMPEGAudioParse * mp3parse)
|
||||||
data += xing_offset + XING_HDR_MIN;
|
data += xing_offset + XING_HDR_MIN;
|
||||||
|
|
||||||
if (xing_flags & XING_FRAMES_FLAG) {
|
if (xing_flags & XING_FRAMES_FLAG) {
|
||||||
|
gint64 total_bytes;
|
||||||
|
|
||||||
mp3parse->xing_frames = GST_READ_UINT32_BE (data);
|
mp3parse->xing_frames = GST_READ_UINT32_BE (data);
|
||||||
mp3parse->xing_total_time = gst_util_uint64_scale (GST_SECOND,
|
mp3parse->xing_total_time = gst_util_uint64_scale (GST_SECOND,
|
||||||
(guint64) (mp3parse->xing_frames) * (mp3parse->spf), mp3parse->rate);
|
(guint64) (mp3parse->xing_frames) * (mp3parse->spf), mp3parse->rate);
|
||||||
|
|
||||||
|
/* We know the total time. If we also know the upstream size, compute the
|
||||||
|
* total bitrate, rounded up to the nearest kbit/sec */
|
||||||
|
if (mp3parse_total_bytes (mp3parse, &total_bytes)) {
|
||||||
|
mp3parse->xing_bitrate = gst_util_uint64_scale (total_bytes,
|
||||||
|
8 * GST_SECOND, mp3parse->xing_total_time);
|
||||||
|
mp3parse->xing_bitrate += 500;
|
||||||
|
mp3parse->xing_bitrate -= mp3parse->xing_bitrate % 1000;
|
||||||
|
}
|
||||||
|
|
||||||
data += 4;
|
data += 4;
|
||||||
} else {
|
} else {
|
||||||
mp3parse->xing_frames = 0;
|
mp3parse->xing_frames = 0;
|
||||||
|
|
|
@ -81,6 +81,7 @@ struct _GstMPEGAudioParse {
|
||||||
guint32 xing_bytes;
|
guint32 xing_bytes;
|
||||||
guchar xing_seek_table[100];
|
guchar xing_seek_table[100];
|
||||||
guint32 xing_vbr_scale;
|
guint32 xing_vbr_scale;
|
||||||
|
guint xing_bitrate;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _GstMPEGAudioParseClass {
|
struct _GstMPEGAudioParseClass {
|
||||||
|
|
Loading…
Reference in a new issue