summaryrefslogtreecommitdiffstats
path: root/gst
diff options
context:
space:
mode:
authorWim Taymans <wim.taymans@gmail.com>2002-06-02 21:42:49 +0000
committerWim Taymans <wim.taymans@gmail.com>2002-06-02 21:42:49 +0000
commitcdfc0665ce04b6a0386d2a2e80b11ddd60430760 (patch)
tree231ae89277dbb0172bf0c99e99c42836ba158350 /gst
parent227da5468807034c07337510c36503018daeaa96 (diff)
Some cleanups, add convert functions
Original commit message from CVS: Some cleanups, add convert functions
Diffstat (limited to 'gst')
-rw-r--r--gst/avi/gstavidemux.c112
-rw-r--r--gst/avi/gstavidemux.h1
2 files changed, 87 insertions, 26 deletions
diff --git a/gst/avi/gstavidemux.c b/gst/avi/gstavidemux.c
index dbfd5585..1fc8cb11 100644
--- a/gst/avi/gstavidemux.c
+++ b/gst/avi/gstavidemux.c
@@ -158,6 +158,8 @@ static gboolean gst_avi_demux_send_event (GstElement *element, GstEvent *event)
static gboolean gst_avi_demux_handle_src_event (GstPad *pad, GstEvent *event);
static gboolean gst_avi_demux_handle_src_query (GstPad *pad, GstPadQueryType type,
GstFormat *format, gint64 *value);
+static gboolean gst_avi_demux_src_convert (GstPad *pad, GstFormat src_format, gint64 src_value,
+ GstFormat *dest_format, gint64 *dest_value);
static GstElementStateReturn
gst_avi_demux_change_state (GstElement *element);
@@ -444,6 +446,7 @@ gst_avi_demux_strf_vids (GstAviDemux *avi_demux)
gst_pad_try_set_caps (srcpad, capslist);
gst_pad_set_event_function (srcpad, gst_avi_demux_handle_src_event);
gst_pad_set_query_function (srcpad, gst_avi_demux_handle_src_query);
+ gst_pad_set_convert_function (srcpad, gst_avi_demux_src_convert);
stream = &avi_demux->stream[avi_demux->num_streams];
stream->pad = srcpad;
@@ -523,6 +526,7 @@ gst_avi_demux_strf_auds (GstAviDemux *avi_demux)
gst_pad_try_set_caps(srcpad, capslist);
gst_pad_set_event_function (srcpad, gst_avi_demux_handle_src_event);
gst_pad_set_query_function (srcpad, gst_avi_demux_handle_src_query);
+ gst_pad_set_convert_function (srcpad, gst_avi_demux_src_convert);
stream = &avi_demux->stream[avi_demux->num_streams];
stream->pad = srcpad;
@@ -584,6 +588,7 @@ gst_avi_demux_strf_iavs (GstAviDemux *avi_demux)
gst_pad_try_set_caps(srcpad, capslist);
gst_pad_set_event_function (srcpad, gst_avi_demux_handle_src_event);
gst_pad_set_query_function (srcpad, gst_avi_demux_handle_src_query);
+ gst_pad_set_convert_function (srcpad, gst_avi_demux_src_convert);
stream = &avi_demux->stream[avi_demux->num_streams];
stream->pad = srcpad;
@@ -597,7 +602,7 @@ gst_avi_demux_strf_iavs (GstAviDemux *avi_demux)
static void
gst_avi_debug_entry (const gchar *prefix, gst_avi_index_entry *entry)
{
- GST_DEBUG (0, "%s: %05d %d %08llx %05d %08lld %08x %08x %08x\n", prefix, entry->index_nr, entry->stream_nr,
+ GST_DEBUG (0, "%s: %05d %d %08llx %05d %08lld %08x %08x %08x", prefix, entry->index_nr, entry->stream_nr,
entry->bytes_before, entry->frames_before, entry->ts, entry->flags, entry->offset, entry->size);
}
@@ -655,6 +660,7 @@ gst_avi_demux_parse_index (GstAviDemux *avi_demux,
avi_stream_context *stream;
gint stream_nr;
gst_avi_index_entry *target = &avi_demux->index_entries[i];
+ GstFormat format;
stream_nr = CHUNKID_TO_STREAMNR (entry[i].id);
target->stream_nr = stream_nr;
@@ -668,11 +674,14 @@ gst_avi_demux_parse_index (GstAviDemux *avi_demux,
target->bytes_before = stream->total_bytes;
target->frames_before = stream->total_frames;
+ format = GST_FORMAT_TIME;
if (stream->strh.type == GST_RIFF_FCC_auds) {
- target->ts = stream->total_bytes * GST_SECOND * stream->strh.scale / stream->strh.rate;
+ gst_pad_convert (stream->pad, GST_FORMAT_BYTES, stream->total_bytes,
+ &format, &target->ts);
}
else {
- target->ts = stream->total_frames * GST_SECOND * stream->strh.scale / stream->strh.rate;
+ gst_pad_convert (stream->pad, GST_FORMAT_UNITS, stream->total_frames,
+ &format, &target->ts);
}
gst_avi_debug_entry ("index", target);
@@ -684,7 +693,7 @@ gst_avi_demux_parse_index (GstAviDemux *avi_demux,
end:
avi_demux->index_offset = filepos;
- GST_DEBUG (GST_CAT_PLUGIN_INFO, "index offset at %08lx\n", filepos);
+ GST_DEBUG (GST_CAT_PLUGIN_INFO, "index offset at %08lx", filepos);
if (!gst_bytestream_seek (avi_demux->bs, filepos, GST_SEEK_METHOD_SET)) {
GST_INFO (GST_CAT_PLUGIN_INFO, "avidemux: could not seek back to movi");
@@ -733,6 +742,61 @@ gst_avi_demux_index_entry_for_time (GstAviDemux *avi_demux, gint stream_nr, guin
}
static gboolean
+gst_avi_demux_src_convert (GstPad *pad, GstFormat src_format, gint64 src_value,
+ GstFormat *dest_format, gint64 *dest_value)
+{
+ gboolean res = TRUE;
+ avi_stream_context *stream = gst_pad_get_element_private (pad);
+
+ switch (src_format) {
+ case GST_FORMAT_TIME:
+ switch (*dest_format) {
+ case GST_FORMAT_BYTES:
+ if (stream->strh.type == GST_RIFF_FCC_auds)
+ *dest_value = src_value * stream->strh.rate / (stream->strh.scale * GST_SECOND);
+ else
+ res = FALSE;
+ break;
+ case GST_FORMAT_DEFAULT:
+ *dest_format = GST_FORMAT_UNITS;
+ case GST_FORMAT_UNITS:
+ *dest_value = src_value * stream->strh.rate / (stream->strh.scale * GST_SECOND);
+ break;
+ default:
+ res = FALSE;
+ break;
+ }
+ break;
+ case GST_FORMAT_BYTES:
+ switch (*dest_format) {
+ case GST_FORMAT_TIME:
+ if (stream->strh.type == GST_RIFF_FCC_auds)
+ *dest_value = src_value * GST_SECOND * stream->strh.scale / stream->strh.rate;
+ else
+ res = FALSE;
+ default:
+ res = FALSE;
+ break;
+ }
+ break;
+ case GST_FORMAT_UNITS:
+ switch (*dest_format) {
+ case GST_FORMAT_TIME:
+ *dest_value = src_value * GST_SECOND * stream->strh.scale / stream->strh.rate;
+ break;
+ default:
+ res = FALSE;
+ break;
+ }
+ break;
+ default:
+ res = FALSE;
+ }
+
+ return res;
+}
+
+static gboolean
gst_avi_demux_handle_src_query (GstPad *pad, GstPadQueryType type,
GstFormat *format, gint64 *value)
{
@@ -747,7 +811,7 @@ gst_avi_demux_handle_src_query (GstPad *pad, GstPadQueryType type,
*format = GST_FORMAT_TIME;
/* fall through */
case GST_FORMAT_TIME:
- *value = GST_SECOND * stream->strh.scale *stream->strh.length / stream->strh.rate;
+ *value = GST_SECOND * stream->strh.scale * stream->strh.length / stream->strh.rate;
break;
case GST_FORMAT_BYTES:
if (stream->strh.type == GST_RIFF_FCC_auds)
@@ -774,10 +838,10 @@ gst_avi_demux_handle_src_query (GstPad *pad, GstPadQueryType type,
*format = GST_FORMAT_TIME;
/* fall through */
case GST_FORMAT_TIME:
- if (stream->strh.type == GST_RIFF_FCC_auds)
- *value = stream->current_byte * GST_SECOND / stream->strh.rate;
- else
- *value = stream->next_ts;
+ if (stream->strh.type == GST_RIFF_FCC_vids)
+ *value = stream->current_frame * GST_SECOND * stream->strh.scale / stream->strh.rate;
+ else
+ *value = stream->current_byte * GST_SECOND * stream->strh.scale / stream->strh.rate;
break;
case GST_FORMAT_BYTES:
*value = stream->current_byte;
@@ -814,7 +878,7 @@ gst_avi_demux_sync_streams (GstAviDemux *avi_demux, guint64 time)
for (i = 0; i < avi_demux->num_streams; i++) {
stream = &avi_demux->stream[i];
- GST_DEBUG (0, "finding %d for time %lld\n", i, time);
+ GST_DEBUG (0, "finding %d for time %lld", i, time);
entry = gst_avi_demux_index_entry_for_time (avi_demux, stream->num, time, GST_RIFF_IF_KEYFRAME);
if (entry) {
@@ -836,12 +900,11 @@ gst_avi_demux_sync_streams (GstAviDemux *avi_demux, guint64 time)
entry = gst_avi_demux_index_next (avi_demux, stream->num, min_index, GST_RIFF_IF_KEYFRAME);
gst_avi_debug_entry ("final sync", entry);
- stream->next_ts = next_entry->ts;
stream->current_byte = next_entry->bytes_before;
stream->current_frame = next_entry->frames_before;
stream->skip = entry->frames_before - next_entry->frames_before;
- GST_DEBUG (0, "%d skip %d\n", stream->num, stream->skip);
+ GST_DEBUG (0, "%d skip %d", stream->num, stream->skip);
}
return min_index;
@@ -939,10 +1002,10 @@ gst_avi_demux_handle_sink_event (GstAviDemux *avi_demux)
gst_pad_event_default (avi_demux->sinkpad, event);
break;
case GST_EVENT_SEEK:
- g_warning ("seek event\n");
+ g_warning ("seek event");
break;
case GST_EVENT_FLUSH:
- g_warning ("flush event\n");
+ g_warning ("flush event");
break;
case GST_EVENT_DISCONTINUOUS:
{
@@ -958,7 +1021,7 @@ gst_avi_demux_handle_sink_event (GstAviDemux *avi_demux)
break;
}
default:
- g_warning ("unhandled event %d\n", type);
+ g_warning ("unhandled event %d", type);
break;
}
@@ -973,7 +1036,7 @@ gst_avi_demux_read_chunk (GstAviDemux *avi_demux, guint32 *id, guint32 *size)
guint32 got_bytes;
if (avi_demux->seek_pending) {
- GST_DEBUG (0, "avidemux: seek pending to %lld %08llx\n", avi_demux->seek_offset, avi_demux->seek_offset);
+ GST_DEBUG (0, "avidemux: seek pending to %lld %08llx", avi_demux->seek_offset, avi_demux->seek_offset);
if (!gst_bytestream_seek (avi_demux->bs, avi_demux->seek_offset, GST_SEEK_METHOD_SET)) {
GST_INFO (GST_CAT_PLUGIN_INFO, "avidemux: could not seek");
}
@@ -1110,6 +1173,8 @@ gst_avi_demux_process_chunk (GstAviDemux *avi_demux, guint64 *filepos,
{
gint stream_id;
avi_stream_context *stream;
+ gint64 next_ts;
+ GstFormat format;
stream_id = CHUNKID_TO_STREAMNR (chunkid);
@@ -1118,14 +1183,11 @@ gst_avi_demux_process_chunk (GstAviDemux *avi_demux, guint64 *filepos,
GST_DEBUG (0,"gst_avi_demux_chain: tag found %08x size %08x",
chunkid, *chunksize);
- if (stream->strh.type == GST_RIFF_FCC_vids) {
- stream->next_ts = stream->current_frame * GST_SECOND * stream->strh.scale / stream->strh.rate;
- }
- else {
- stream->next_ts = stream->current_byte * GST_SECOND * stream->strh.scale / stream->strh.rate;
- }
+ format = GST_FORMAT_TIME;
+ gst_pad_query (stream->pad, GST_PAD_QUERY_POSITION, &format, &next_ts);
+
if (stream->strh.init_frames == stream->current_frame && stream->delay==0)
- stream->delay = stream->next_ts;
+ stream->delay = next_ts;
if (stream->skip) {
stream->skip--;
@@ -1138,13 +1200,13 @@ gst_avi_demux_process_chunk (GstAviDemux *avi_demux, guint64 *filepos,
if (*chunksize) {
got_bytes = gst_bytestream_peek (bs, &buf, *chunksize);
- GST_BUFFER_TIMESTAMP (buf) = stream->next_ts;
+ GST_BUFFER_TIMESTAMP (buf) = next_ts;
if (stream->need_flush) {
/* FIXME, do some flush event here */
stream->need_flush = FALSE;
}
- GST_DEBUG (0, "send stream %d: %lld %d %lld %08x\n", stream_id, stream->next_ts, stream->current_frame,
+ GST_DEBUG (0, "send stream %d: %lld %d %lld %08x", stream_id, next_ts, stream->current_frame,
stream->delay, *chunksize);
gst_pad_push(stream->pad, buf);
diff --git a/gst/avi/gstavidemux.h b/gst/avi/gstavidemux.h
index 3667a205..9bea4712 100644
--- a/gst/avi/gstavidemux.h
+++ b/gst/avi/gstavidemux.h
@@ -69,7 +69,6 @@ typedef struct
GstPad *pad;
gint num;
gst_riff_strh strh;
- guint64 next_ts;
guint32 current_frame;
guint32 current_byte;
guint64 delay;