summaryrefslogtreecommitdiffstats
path: root/gst/avi
diff options
context:
space:
mode:
authorRonald S. Bultje <rbultje@ronald.bitfreak.net>2004-09-15 17:14:34 +0000
committerRonald S. Bultje <rbultje@ronald.bitfreak.net>2004-09-15 17:14:34 +0000
commit3bae21ef6118d1de75830e476cfd6e86e6311215 (patch)
tree035b9355323d618603c127933fb2b79b03185b8f /gst/avi
parent00375a43f6d712bb0aa3b419f45feee619a7afe4 (diff)
gst/avi/gstavidemux.*: Fix for compressed audio (mp3) timestamp generation. How did this ever work?
Original commit message from CVS: * gst/avi/gstavidemux.c: (gst_avi_demux_handle_src_query), (gst_avi_demux_add_stream), (gst_avi_demux_stream_data): * gst/avi/gstavidemux.h: Fix for compressed audio (mp3) timestamp generation. How did this ever work?
Diffstat (limited to 'gst/avi')
-rw-r--r--gst/avi/gstavidemux.c15
-rw-r--r--gst/avi/gstavidemux.h1
2 files changed, 13 insertions, 3 deletions
diff --git a/gst/avi/gstavidemux.c b/gst/avi/gstavidemux.c
index 3911a17d..58128199 100644
--- a/gst/avi/gstavidemux.c
+++ b/gst/avi/gstavidemux.c
@@ -440,8 +440,13 @@ gst_avi_demux_handle_src_query (GstPad * pad,
switch (*format) {
case GST_FORMAT_TIME:
if (stream->strh->rate && stream->strh->type == GST_RIFF_FCC_auds) {
- *value = ((gfloat) stream->current_byte) * GST_SECOND /
- stream->strh->rate;
+ if (stream->strh->rate != 0) {
+ *value = ((gfloat) stream->current_byte) * GST_SECOND /
+ stream->bitrate;
+ } else {
+ *value = (((gfloat) stream->current_frame) * stream->strh->scale /
+ (stream->strh->rate * stream->blockalign)) * GST_SECOND;
+ }
} else {
*value = (((gfloat) stream->current_frame) * stream->strh->scale /
stream->strh->rate) * GST_SECOND;
@@ -747,6 +752,7 @@ gst_avi_demux_add_stream (GstAviDemux * avi)
GstPadTemplate *templ = NULL;
GstPad *pad;
avi_stream_context *stream;
+ gint blockalign = 0, bitrate = 0;
union
{
gst_riff_strf_vids *vids;
@@ -870,6 +876,8 @@ gst_avi_demux_add_stream (GstAviDemux * avi)
gst_tag_list_free (list);
if (codec_name)
g_free (codec_name);
+ blockalign = strf.auds->blockalign;
+ bitrate = strf.auds->av_bps;
g_free (strf.auds);
avi->num_a_streams++;
break;
@@ -921,6 +929,8 @@ gst_avi_demux_add_stream (GstAviDemux * avi)
stream->current_byte = 0;
stream->current_entry = -1;
stream->skip = 0;
+ stream->blockalign = blockalign;
+ stream->bitrate = bitrate;
gst_pad_set_element_private (pad, stream);
avi->num_streams++;
@@ -1479,7 +1489,6 @@ gst_avi_demux_stream_data (GstAviDemux * avi)
GST_BUFFER_TIMESTAMP (buf) = next_ts;
gst_pad_query (stream->pad, GST_QUERY_POSITION, &format, &dur_ts);
GST_BUFFER_DURATION (buf) = dur_ts - next_ts;
-
gst_pad_push (stream->pad, GST_DATA (buf));
}
}
diff --git a/gst/avi/gstavidemux.h b/gst/avi/gstavidemux.h
index d94433ae..a2b24d49 100644
--- a/gst/avi/gstavidemux.h
+++ b/gst/avi/gstavidemux.h
@@ -63,6 +63,7 @@ typedef struct {
GstPad *pad;
GstCaps *caps;
gst_riff_strh *strh;
+ gint blockalign, bitrate;
/* current position (byte, frame, time) */
guint current_frame;