summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--gst/avi/gstavidemux.c88
1 files changed, 51 insertions, 37 deletions
diff --git a/gst/avi/gstavidemux.c b/gst/avi/gstavidemux.c
index ff95412a..4224aa38 100644
--- a/gst/avi/gstavidemux.c
+++ b/gst/avi/gstavidemux.c
@@ -410,6 +410,23 @@ gst_avi_demux_get_src_formats (GstPad * pad)
}
#endif
+/* assumes stream->strf.auds->av_bps != 0 */
+static inline GstClockTime
+avi_stream_convert_bytes_to_time_unchecked (avi_stream_context * stream,
+ guint64 bytes)
+{
+ return gst_util_uint64_scale (bytes, GST_SECOND, stream->strf.auds->av_bps);
+}
+
+/* assumes stream->strh->rate != 0 */
+static inline GstClockTime
+avi_stream_convert_frames_to_time_unchecked (avi_stream_context * stream,
+ guint64 frames)
+{
+ return gst_util_uint64_scale (frames, stream->strh->scale * GST_SECOND,
+ stream->strh->rate);
+}
+
static gboolean
gst_avi_demux_src_convert (GstPad * pad,
GstFormat src_format,
@@ -458,8 +475,8 @@ gst_avi_demux_src_convert (GstPad * pad,
switch (*dest_format) {
case GST_FORMAT_TIME:
if (stream->strf.auds->av_bps != 0) {
- *dest_value = gst_util_uint64_scale (src_value, GST_SECOND,
- (guint64) stream->strf.auds->av_bps);
+ *dest_value = avi_stream_convert_bytes_to_time_unchecked (stream,
+ src_value);
} else
res = FALSE;
break;
@@ -471,8 +488,8 @@ gst_avi_demux_src_convert (GstPad * pad,
case GST_FORMAT_DEFAULT:
switch (*dest_format) {
case GST_FORMAT_TIME:
- *dest_value = gst_util_uint64_scale (src_value,
- stream->strh->scale * GST_SECOND, (guint64) stream->strh->rate);
+ *dest_value =
+ avi_stream_convert_frames_to_time_unchecked (stream, src_value);
break;
default:
res = FALSE;
@@ -1024,7 +1041,6 @@ gst_avi_demux_parse_subindex (GstAviDemux * avi,
guint64 baseoff;
gst_avi_index_entry *entries, *entry;
GList *entries_list = NULL;
- GstFormat format = GST_FORMAT_TIME;
guint size;
*_entries_list = NULL;
@@ -1087,16 +1103,16 @@ gst_avi_demux_parse_subindex (GstAviDemux * avi,
if (stream->is_vbr) {
/* VBR stream next timestamp */
if (stream->strh->type == GST_RIFF_FCC_auds) {
- gst_avi_demux_src_convert (stream->pad, GST_FORMAT_DEFAULT,
- stream->total_blocks + 1, &format, &next_ts);
+ next_ts = avi_stream_convert_frames_to_time_unchecked (stream,
+ stream->total_blocks + 1);
} else {
- gst_avi_demux_src_convert (stream->pad, GST_FORMAT_DEFAULT,
- stream->total_frames + 1, &format, &next_ts);
+ next_ts = avi_stream_convert_frames_to_time_unchecked (stream,
+ stream->total_frames + 1);
}
} else {
/* CBR get next timestamp */
- gst_avi_demux_src_convert (stream->pad, GST_FORMAT_BYTES,
- stream->total_bytes + entry->size, &format, &next_ts);
+ next_ts = avi_stream_convert_bytes_to_time_unchecked (stream,
+ stream->total_bytes + entry->size);
}
/* duration is next - current */
entry->dur = next_ts - entry->ts;
@@ -1912,16 +1928,16 @@ gst_avi_demux_parse_index (GstAviDemux * avi,
if (stream->is_vbr) {
/* VBR stream next timestamp */
if (stream->strh->type == GST_RIFF_FCC_auds) {
- gst_avi_demux_src_convert (stream->pad, GST_FORMAT_DEFAULT,
- stream->total_blocks + 1, &format, &next_ts);
+ next_ts = avi_stream_convert_frames_to_time_unchecked (stream,
+ stream->total_blocks + 1);
} else {
- gst_avi_demux_src_convert (stream->pad, GST_FORMAT_DEFAULT,
- stream->total_frames + 1, &format, &next_ts);
+ next_ts = avi_stream_convert_frames_to_time_unchecked (stream,
+ stream->total_frames + 1);
}
} else {
/* constant rate stream */
- gst_avi_demux_src_convert (stream->pad, GST_FORMAT_BYTES,
- stream->total_bytes + target->size, &format, &next_ts);
+ next_ts = avi_stream_convert_bytes_to_time_unchecked (stream,
+ stream->total_bytes + target->size);
}
/* duration is next - current */
target->dur = next_ts - target->ts;
@@ -2364,7 +2380,6 @@ gst_avi_demux_stream_scan (GstAviDemux * avi,
while (TRUE) {
guint stream_nr;
guint size = 0;
- gint64 tmpts, tmpnextts;
res = gst_avi_demux_next_data_buffer (avi, &pos, &tag, &size);
if (G_UNLIKELY (res != GST_FLOW_OK))
@@ -2404,26 +2419,25 @@ gst_avi_demux_stream_scan (GstAviDemux * avi,
format = GST_FORMAT_TIME;
if (stream->is_vbr) {
/* VBR stream */
- gst_avi_demux_src_convert (stream->pad, GST_FORMAT_DEFAULT,
- stream->total_frames, &format, &tmpts);
- gst_avi_demux_src_convert (stream->pad, GST_FORMAT_DEFAULT,
- stream->total_frames + 1, &format, &tmpnextts);
+ entry->ts = avi_stream_convert_frames_to_time_unchecked (stream,
+ stream->total_frames);
+ entry->dur = avi_stream_convert_frames_to_time_unchecked (stream,
+ stream->total_frames + 1);
} else {
/* constant rate stream */
- gst_avi_demux_src_convert (stream->pad, GST_FORMAT_BYTES,
- stream->total_bytes, &format, &tmpts);
- gst_avi_demux_src_convert (stream->pad, GST_FORMAT_BYTES,
- stream->total_bytes + entry->size, &format, &tmpnextts);
+ entry->ts = avi_stream_convert_bytes_to_time_unchecked (stream,
+ stream->total_bytes);
+ entry->dur = avi_stream_convert_bytes_to_time_unchecked (stream,
+ stream->total_bytes + entry->size);
}
- entry->ts = tmpts;
- entry->dur = tmpnextts - tmpts;
+ entry->dur -= entry->ts;
/* stream position */
entry->bytes_before = stream->total_bytes;
stream->total_bytes += entry->size;
entry->frames_before = stream->total_frames;
stream->total_frames++;
- stream->idx_duration = tmpnextts;
+ stream->idx_duration = entry->ts + entry->dur;
list = g_list_prepend (list, entry);
GST_DEBUG_OBJECT (avi, "Added index entry %d (in stream: %d), offset %"
@@ -2466,16 +2480,16 @@ gst_avi_demux_stream_scan (GstAviDemux * avi,
/* timestamps */
if (stream->is_vbr) {
/* VBR stream */
- gst_avi_demux_src_convert (stream->pad, GST_FORMAT_DEFAULT,
- stream->total_frames, &format, &entry->ts);
- gst_avi_demux_src_convert (stream->pad, GST_FORMAT_DEFAULT,
- stream->total_frames + 1, &format, &entry->dur);
+ entry->ts = avi_stream_convert_frames_to_time_unchecked (stream,
+ stream->total_frames);
+ entry->dur = avi_stream_convert_frames_to_time_unchecked (stream,
+ stream->total_frames + 1);
} else {
/* constant rate stream */
- gst_avi_demux_src_convert (stream->pad, GST_FORMAT_BYTES,
- stream->total_bytes, &format, &entry->ts);
- gst_avi_demux_src_convert (stream->pad, GST_FORMAT_BYTES,
- stream->total_bytes + entry->size, &format, &entry->dur);
+ entry->ts = avi_stream_convert_bytes_to_time_unchecked (stream,
+ stream->total_bytes);
+ entry->dur = avi_stream_convert_bytes_to_time_unchecked (stream,
+ stream->total_bytes + entry->size);
}
entry->dur -= entry->ts;