summaryrefslogtreecommitdiffstats
path: root/gst
diff options
context:
space:
mode:
authorRonald S. Bultje <rbultje@ronald.bitfreak.net>2003-09-12 11:39:29 +0000
committerRonald S. Bultje <rbultje@ronald.bitfreak.net>2003-09-12 11:39:29 +0000
commitf04b1b7858406d8295febd817adf4c333fd271f2 (patch)
treec1b3d40bdd6f001d942f507632561ebca909f733 /gst
parentf663868fcdc7239a9761de87d986fbb4595aa7a0 (diff)
Check for seekability and use gst_pad_push() instead of gst_pad_send_event()
Original commit message from CVS: Check for seekability and use gst_pad_push() instead of gst_pad_send_event()
Diffstat (limited to 'gst')
-rw-r--r--gst/avi/gstavimux.c68
1 files changed, 44 insertions, 24 deletions
diff --git a/gst/avi/gstavimux.c b/gst/avi/gstavimux.c
index f174f646..4a980a13 100644
--- a/gst/avi/gstavimux.c
+++ b/gst/avi/gstavimux.c
@@ -934,13 +934,27 @@ gst_avimux_write_index (GstAviMux *avimux)
avimux->avi_hdr.flags |= GST_RIFF_AVIH_HASINDEX;
}
+static gboolean
+gst_avimux_can_seek(GstAviMux *avimux)
+{
+ const GstEventMask *masks = gst_pad_get_event_masks(GST_PAD_PEER(avimux->srcpad));
+
+ while (masks->type != 0) {
+ if (masks->type == GST_EVENT_SEEK) {
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
static void
gst_avimux_bigfile(GstAviMux *avimux, gboolean last)
{
GstBuffer *header;
GstEvent *event;
- if (avimux->is_bigfile)
+ if (avimux->is_bigfile && gst_avimux_can_seek(avimux))
{
/* sarch back */
event = gst_event_new_seek (GST_FORMAT_BYTES |
@@ -948,19 +962,18 @@ gst_avimux_bigfile(GstAviMux *avimux, gboolean last)
GST_SEEK_FLAG_FLUSH,
avimux->avix_start);
/* if the event succeeds */
- if (gst_pad_send_event(GST_PAD_PEER(avimux->srcpad), event)) {
-
- /* rewrite AVIX header */
- header = gst_avimux_riff_get_avix_header(avimux->datax_size);
- gst_pad_push(avimux->srcpad, header);
-
- /* go back to current location */
- event = gst_event_new_seek (GST_FORMAT_BYTES |
- GST_SEEK_METHOD_SET |
- GST_SEEK_FLAG_FLUSH,
- avimux->total_data);
- gst_pad_send_event(GST_PAD_PEER(avimux->srcpad), event);
- }
+ gst_pad_push(avimux->srcpad, GST_BUFFER(event));
+
+ /* rewrite AVIX header */
+ header = gst_avimux_riff_get_avix_header(avimux->datax_size);
+ gst_pad_push(avimux->srcpad, header);
+
+ /* go back to current location */
+ event = gst_event_new_seek (GST_FORMAT_BYTES |
+ GST_SEEK_METHOD_SET |
+ GST_SEEK_FLAG_FLUSH,
+ avimux->total_data);
+ gst_pad_push(avimux->srcpad, GST_BUFFER(event));
}
avimux->avix_start = avimux->total_data;
@@ -1046,7 +1059,12 @@ gst_avimux_stop_file (GstAviMux *avimux)
if (avimux->audio_pad_connected) {
/* calculate bps if needed */
if (!avimux->auds.av_bps) {
- avimux->auds_hdr.rate = (GST_SECOND * avimux->audio_size) / avimux->audio_time;
+ if (avimux->audio_time) {
+ avimux->auds_hdr.rate = (GST_SECOND * avimux->audio_size) / avimux->audio_time;
+ } else {
+ gst_element_error (GST_ELEMENT (avimux), "Audio stream available, but no audio data transferred (or data with invalid timestamps). Resulting AVI will be corrupt");
+ avimux->auds_hdr.rate = 0;
+ }
avimux->auds.av_bps = avimux->auds_hdr.rate * avimux->auds_hdr.scale;
}
avimux->avi_hdr.max_bps += avimux->auds.av_bps;
@@ -1058,14 +1076,16 @@ gst_avimux_stop_file (GstAviMux *avimux)
}
/* seek and rewrite the header */
- header = gst_avimux_riff_get_avi_header(avimux);
- event = gst_event_new_seek (GST_FORMAT_BYTES |
- GST_SEEK_METHOD_SET, 0);
- gst_pad_push(avimux->srcpad, GST_BUFFER(event));
- gst_pad_push(avimux->srcpad, header);
- event = gst_event_new_seek (GST_FORMAT_BYTES |
- GST_SEEK_METHOD_SET, avimux->total_data);
- gst_pad_push(avimux->srcpad, GST_BUFFER(event));
+ if (gst_avimux_can_seek(avimux)) {
+ header = gst_avimux_riff_get_avi_header(avimux);
+ event = gst_event_new_seek (GST_FORMAT_BYTES |
+ GST_SEEK_METHOD_SET, 0);
+ gst_pad_push(avimux->srcpad, GST_BUFFER(event));
+ gst_pad_push(avimux->srcpad, header);
+ event = gst_event_new_seek (GST_FORMAT_BYTES |
+ GST_SEEK_METHOD_SET, avimux->total_data);
+ gst_pad_push(avimux->srcpad, GST_BUFFER(event));
+ }
avimux->write_header = TRUE;
}
@@ -1078,7 +1098,7 @@ gst_avimux_restart_file (GstAviMux *avimux)
gst_avimux_stop_file(avimux);
event = gst_event_new(GST_EVENT_EOS);
- gst_pad_send_event(avimux->srcpad, event);
+ gst_pad_push(avimux->srcpad, GST_BUFFER(event));
gst_avimux_start_file(avimux);
}