diff --git a/ChangeLog b/ChangeLog index 2033245c76..d376281a9f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2004-09-15 Ronald S. Bultje + + * 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? + 2004-09-15 Ronald S. Bultje * gst/playback/gstplaybin.c: (gst_play_bin_get_property): diff --git a/gst/avi/gstavidemux.c b/gst/avi/gstavidemux.c index 3911a17dc6..58128199fc 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 d94433ae58..a2b24d4965 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;