summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorРуслан Ижбулатов <lrn1986@gmail.com>2009-07-24 19:04:31 +0400
committerSebastian Dröge <sebastian.droege@collabora.co.uk>2009-07-29 13:58:33 +0200
commit3702fcdb801f13d5e0d5a988c7928639a2a8b2c7 (patch)
tree497c94b780e10363c686705faf62d76674e149a2
parent050e91995e0c8a451859fad365af5d85e9b3af77 (diff)
Fixed the fix for TIME->DEFAULT conversion.
Fixes bug #578052 again.
-rw-r--r--gst/avi/gstavidemux.c53
1 files changed, 47 insertions, 6 deletions
diff --git a/gst/avi/gstavidemux.c b/gst/avi/gstavidemux.c
index 7c660ec6b..1242f56a1 100644
--- a/gst/avi/gstavidemux.c
+++ b/gst/avi/gstavidemux.c
@@ -466,9 +466,19 @@ gst_avi_demux_src_convert (GstPad * pad,
(guint64) stream->strf.auds->av_bps, GST_SECOND);
break;
case GST_FORMAT_DEFAULT:
+ {
*dest_value = gst_util_uint64_scale (src_value, stream->strh->rate,
stream->strh->scale * GST_SECOND);
+ /* Attempt to round to nearest integer: if the difference is more
+ * than 0.5 (less than -0.5), it means that gst_util_uint64_scale()
+ * just truncated an integer, while it had to be rounded
+ */
+
+ *dest_value = *dest_value * GST_SECOND -
+ src_value * stream->strh->rate / stream->strh->scale <=
+ -0.5 ? *dest_value + 1: *dest_value;
break;
+ }
default:
res = FALSE;
break;
@@ -609,10 +619,17 @@ gst_avi_demux_handle_src_query (GstPad * pad, GstQuery * query)
gst_query_set_duration (query, fmt, stream->duration);
break;
case GST_FORMAT_DEFAULT:
+ {
+ gint64 dur;
GST_DEBUG_OBJECT (query, "total frames is %" G_GUINT32_FORMAT,
stream->total_frames);
- gst_query_set_duration (query, fmt, stream->total_frames);
+
+ if (total_frames >= 0)
+ gst_query_set_duration (query, fmt, stream->total_frames);
+ else if (gst_pad_query_convert (pad, GST_FORMAT_TIME, stream->duration, &fmt, &dur))
+ gst_query_set_duration (query, fmt, dur);
break;
+ }
default:
res = FALSE;
break;
@@ -3908,14 +3925,32 @@ gst_avi_demux_process_next_entry (GstAviDemux * avi)
GST_BUFFER_TIMESTAMP (buf) = entry->ts;
GST_BUFFER_DURATION (buf) = entry->dur;
- GST_BUFFER_OFFSET (buf) = GST_BUFFER_OFFSET_NONE;
+ if (stream->strh->type == GST_RIFF_FCC_vids)
+ {
+ if (stream->current_frame >= 0)
+ GST_BUFFER_OFFSET (buf) = stream->current_frame;
+ else
+ {
+ gint64 framenum;
+ GstFormat fmt = GST_FORMAT_DEFAULT;
+
+ if (gst_pad_query_convert (stream->pad, GST_FORMAT_TIME, entry->ts,
+ &fmt, &framenum))
+ GST_BUFFER_OFFSET (buf) = framenum;
+ else
+ GST_BUFFER_OFFSET (buf) = GST_BUFFER_OFFSET_NONE;
+ }
+ }
+ else
+ GST_BUFFER_OFFSET (buf) = GST_BUFFER_OFFSET_NONE;
GST_BUFFER_OFFSET_END (buf) = GST_BUFFER_OFFSET_NONE;
gst_buffer_set_caps (buf, GST_PAD_CAPS (stream->pad));
- GST_DEBUG_OBJECT (avi, "Pushing buffer of size %d and time %"
+ GST_DEBUG_OBJECT (avi, "Pushing buffer of size %d, offset %"
+ G_GUINT64_FORMAT " and time %"
GST_TIME_FORMAT " on pad %s",
- GST_BUFFER_SIZE (buf), GST_TIME_ARGS (entry->ts),
- GST_PAD_NAME (stream->pad));
+ GST_BUFFER_SIZE (buf), GST_BUFFER_OFFSET (buf),
+ GST_TIME_ARGS (entry->ts), GST_PAD_NAME (stream->pad));
/* update current position in the segment */
gst_segment_set_last_stop (&avi->segment, GST_FORMAT_TIME, entry->ts);
@@ -4153,10 +4188,16 @@ gst_avi_demux_stream_data (GstAviDemux * avi)
GST_BUFFER_TIMESTAMP (buf) = next_ts;
GST_BUFFER_DURATION (buf) = dur_ts - next_ts;
+ if (stream->strh->type == GST_RIFF_FCC_vids)
+ GST_BUFFER_OFFSET (buf) = stream->current_frame - 1;
+ else
+ GST_BUFFER_OFFSET (buf) = GST_BUFFER_OFFSET_NONE;
+
gst_buffer_set_caps (buf, GST_PAD_CAPS (stream->pad));
GST_DEBUG_OBJECT (avi,
"Pushing buffer with time=%" GST_TIME_FORMAT
- " and size %d over pad %s", GST_TIME_ARGS (next_ts), size,
+ ", offset %" G_GUINT64_FORMAT" and size %d over pad %s",
+ GST_TIME_ARGS (next_ts), GST_BUFFER_OFFSET (buf), size,
GST_PAD_NAME (stream->pad));
/* update current position in the segment */