summaryrefslogtreecommitdiffstats
path: root/gst/avi
diff options
context:
space:
mode:
authorRonald S. Bultje <rbultje@ronald.bitfreak.net>2004-09-23 14:59:22 +0000
committerRonald S. Bultje <rbultje@ronald.bitfreak.net>2004-09-23 14:59:22 +0000
commit40cec75c3f14d98d085cd8d3f705829144446b77 (patch)
treef78e544d7e282677f41b2e7a5aa84ee43f765100 /gst/avi
parent131232f2210eb51a4ea40e2e5518f44a04f90733 (diff)
ext/dirac/: Do something. Don't actually know if this works because I don't have a demuxer yet.
Original commit message from CVS: * ext/dirac/Makefile.am: * ext/dirac/gstdirac.cc: * ext/dirac/gstdiracdec.cc: * ext/dirac/gstdiracdec.h: Do something. Don't actually know if this works because I don't have a demuxer yet. * ext/gsm/gstgsmdec.c: (gst_gsmdec_getcaps): Add channels=1 to caps returned from _getcaps(). * ext/ogg/gstogmparse.c: (gst_ogm_audio_parse_get_type), (gst_ogm_video_parse_get_type), (gst_ogm_audio_parse_base_init), (gst_ogm_video_parse_base_init), (gst_ogm_parse_init), (gst_ogm_audio_parse_init), (gst_ogm_video_parse_init), (gst_ogm_parse_sink_convert), (gst_ogm_parse_chain), (gst_ogm_parse_change_state): Separate between audio/video so ogmaudioparse actually uses the audio pad templates. Both audio and video work now, including autoplugging. Also use sometimes-srcpad hack. * gst-libs/gst/riff/riff-read.c: (gst_riff_read_seek): Handle events better. Don't hang on infinite loops. * gst/avi/gstavidemux.c: (gst_avi_demux_class_init), (gst_avi_demux_init), (gst_avi_demux_reset), (gst_avi_demux_src_convert), (gst_avi_demux_handle_src_query), (gst_avi_demux_stream_header), (gst_avi_demux_stream_data), (gst_avi_demux_change_state): * gst/avi/gstavidemux.h: Improve A/V sync. Still not perfect. * gst/matroska/ebml-read.c: (gst_ebml_read_seek), (gst_ebml_read_skip): Handle events better. * gst/qtdemux/qtdemux.c: (gst_qtdemux_handle_sink_event), (gst_qtdemux_loop_header), (qtdemux_parse_trak), (qtdemux_audio_caps): Add IMA4. Improve event handling. Save offset after a seek when the headers are at the end of the file so that we don't end up in an infinite loop. * gst/typefind/gsttypefindfunctions.c: (qt_type_find): Add low-priority typefind support for files with no length.
Diffstat (limited to 'gst/avi')
-rw-r--r--gst/avi/gstavidemux.c72
-rw-r--r--gst/avi/gstavidemux.h3
2 files changed, 7 insertions, 68 deletions
diff --git a/gst/avi/gstavidemux.c b/gst/avi/gstavidemux.c
index fc167586..5a006e26 100644
--- a/gst/avi/gstavidemux.c
+++ b/gst/avi/gstavidemux.c
@@ -31,20 +31,6 @@
GST_DEBUG_CATEGORY_STATIC (avidemux_debug);
#define GST_CAT_DEFAULT avidemux_debug
-/* AviDemux signals and args */
-enum
-{
- /* FILL ME */
- LAST_SIGNAL
-};
-
-enum
-{
- ARG_0,
- ARG_STREAMINFO
- /* FILL ME */
-};
-
static GstStaticPadTemplate sink_templ = GST_STATIC_PAD_TEMPLATE ("sink",
GST_PAD_SINK,
GST_PAD_ALWAYS,
@@ -73,13 +59,8 @@ static gboolean gst_avi_demux_src_convert (GstPad * pad,
static GstElementStateReturn gst_avi_demux_change_state (GstElement * element);
-static void gst_avi_demux_get_property (GObject * object,
- guint prop_id, GValue * value, GParamSpec * pspec);
-
static GstRiffReadClass *parent_class = NULL;
-/*static guint gst_avi_demux_signals[LAST_SIGNAL] = { 0 }; */
-
GType
gst_avi_demux_get_type (void)
{
@@ -145,17 +126,11 @@ gst_avi_demux_class_init (GstAviDemuxClass * klass)
gobject_class = (GObjectClass *) klass;
gstelement_class = (GstElementClass *) klass;
- g_object_class_install_property (gobject_class, ARG_STREAMINFO,
- g_param_spec_boxed ("streaminfo", "Streaminfo", "Streaminfo",
- GST_TYPE_CAPS, G_PARAM_READABLE));
-
GST_DEBUG_CATEGORY_INIT (avidemux_debug, "avidemux",
0, "Demuxer for AVI streams");
parent_class = g_type_class_ref (GST_TYPE_RIFF_READ);
- gobject_class->get_property = gst_avi_demux_get_property;
-
gstelement_class->change_state = gst_avi_demux_change_state;
gstelement_class->send_event = gst_avi_demux_send_event;
}
@@ -174,7 +149,6 @@ gst_avi_demux_init (GstAviDemux * avi)
gst_element_set_loop_function (GST_ELEMENT (avi), gst_avi_demux_loop);
gst_avi_demux_reset (avi);
- avi->streaminfo = NULL;
avi->index_entries = NULL;
memset (&avi->stream, 0, sizeof (avi->stream));
}
@@ -208,19 +182,6 @@ gst_avi_demux_reset (GstAviDemux * avi)
avi->us_per_frame = 0;
avi->seek_offset = (guint64) - 1;
-
- gst_caps_replace (&avi->streaminfo, NULL);
-}
-
-static void
-gst_avi_demux_streaminfo (GstAviDemux * avi)
-{
- /* compression formats are added later - a bit hacky */
-
- gst_caps_replace (&avi->streaminfo,
- gst_caps_new_simple ("application/x-gst-streaminfo", NULL));
-
- /*g_object_notify(G_OBJECT(avi), "streaminfo"); */
}
static gst_avi_index_entry *
@@ -341,7 +302,7 @@ gst_avi_demux_src_convert (GstPad * pad,
/*GstAviDemux *avi = GST_AVI_DEMUX (gst_pad_get_parent (pad)); */
avi_stream_context *stream = gst_pad_get_element_private (pad);
- if (stream->strh->type != GST_RIFF_FCC_auds &&
+ if (stream->strh->type == GST_RIFF_FCC_vids &&
(src_format == GST_FORMAT_BYTES || *dest_format == GST_FORMAT_BYTES))
return FALSE;
@@ -444,12 +405,15 @@ gst_avi_demux_handle_src_query (GstPad * pad,
if (stream->strh->samplesize == 1 && stream->blockalign != 0) {
*value = stream->current_byte * GST_SECOND /
(stream->blockalign * stream->strh->rate);
- } else if (stream->strh->rate != 0) {
- *value = (gfloat) stream->current_frame * stream->strh->scale *
- GST_SECOND / stream->strh->rate;
} else if (stream->bitrate != 0) {
*value = ((gfloat) stream->current_byte) * GST_SECOND /
stream->bitrate;
+ } else if (stream->total_frames != 0) {
+ /* calculate timestamps based on video size */
+ guint64 len = demux->us_per_frame * demux->num_frames *
+ GST_USECOND;
+
+ *value = len * stream->current_frame / stream->total_frames;
} else {
*value = 0;
}
@@ -1289,9 +1253,6 @@ gst_avi_demux_stream_header (GstAviDemux * avi)
GST_DEBUG ("signaling no more pads");
gst_element_no_more_pads (GST_ELEMENT (avi));
- /* we've got streaminfo now */
- g_object_notify (G_OBJECT (avi), "streaminfo");
-
/* Now, find the data (i.e. skip all junk between header and data) */
while (1) {
if (!(tag = gst_riff_peek_tag (riff, NULL)))
@@ -1544,9 +1505,6 @@ gst_avi_demux_change_state (GstElement * element)
GstAviDemux *avi = GST_AVI_DEMUX (element);
switch (GST_STATE_TRANSITION (element)) {
- case GST_STATE_READY_TO_PAUSED:
- gst_avi_demux_streaminfo (avi);
- break;
case GST_STATE_PAUSED_TO_READY:
gst_avi_demux_reset (avi);
break;
@@ -1559,19 +1517,3 @@ gst_avi_demux_change_state (GstElement * element)
return GST_STATE_SUCCESS;
}
-
-static void
-gst_avi_demux_get_property (GObject * object,
- guint prop_id, GValue * value, GParamSpec * pspec)
-{
- GstAviDemux *avi = GST_AVI_DEMUX (object);
-
- switch (prop_id) {
- case ARG_STREAMINFO:
- g_value_set_boxed (value, avi->streaminfo);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
diff --git a/gst/avi/gstavidemux.h b/gst/avi/gstavidemux.h
index a2b24d49..51e785f9 100644
--- a/gst/avi/gstavidemux.h
+++ b/gst/avi/gstavidemux.h
@@ -114,9 +114,6 @@ typedef struct _GstAviDemux {
/* seeking */
guint64 seek_offset;
guint64 last_seek;
-
- /* info */
- GstCaps *streaminfo;
} GstAviDemux;
typedef struct _GstAviDemuxClass {