From 1671b7d73a6e2791729f83e3af3ef4e3dfca020f Mon Sep 17 00:00:00 2001 From: "Ronald S. Bultje" Date: Wed, 10 Aug 2005 16:52:40 +0000 Subject: ext/gdk_pixbuf/gstgdkpixbuf.c: Support various image formats (e.g. RGBA). Makes gif images work. Original commit message from CVS: * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_chain): Support various image formats (e.g. RGBA). Makes gif images work. * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header), (gst_qtdemux_add_stream), (qtdemux_parse_trak): Some workarounds for odd behaviour I found while crawling through apple.com/trailers. For one, if you load single-image (still-image) trailers containing gif images, they will have an infinite framerate since there is no duration. Capping framerate makes negotiation work. Also, some movies don't actually have size markers, since they only contain a single chunk of data (or so? I don't understand quicktime at all, I guess), so throwing the whole binary blob from the offset to end-of-file to the decoder makes at least something display (yes, this actually works :) ). Lastly, for some reason, one redirect URI movies caused an assertion because it read a negative size (immediate return) and tried to flush it (guint, signflip), leading to odd stuff and subsequent crashes. --- ChangeLog | 19 +++++++++++++++++++ gst/qtdemux/qtdemux.c | 13 ++++++++++--- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index f8ef9495..5a6c1a6f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,22 @@ +2005-08-10 Ronald S. Bultje + + * ext/gdk_pixbuf/gstgdkpixbuf.c: (gst_gdk_pixbuf_chain): + Support various image formats (e.g. RGBA). Makes gif images work. + * gst/qtdemux/qtdemux.c: (gst_qtdemux_loop_header), + (gst_qtdemux_add_stream), (qtdemux_parse_trak): + Some workarounds for odd behaviour I found while crawling through + apple.com/trailers. For one, if you load single-image (still-image) + trailers containing gif images, they will have an infinite framerate + since there is no duration. Capping framerate makes negotiation work. + Also, some movies don't actually have size markers, since they only + contain a single chunk of data (or so? I don't understand quicktime + at all, I guess), so throwing the whole binary blob from the offset + to end-of-file to the decoder makes at least something display (yes, + this actually works :) ). Lastly, for some reason, one redirect URI + movies caused an assertion because it read a negative size (immediate + return) and tried to flush it (guint, signflip), leading to odd + stuff and subsequent crashes. + 2005-08-10 Ronald S. Bultje * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnomevfssrc_get): diff --git a/gst/qtdemux/qtdemux.c b/gst/qtdemux/qtdemux.c index c92c2a9b..be75424f 100644 --- a/gst/qtdemux/qtdemux.c +++ b/gst/qtdemux/qtdemux.c @@ -730,14 +730,12 @@ gst_qtdemux_loop_header (GstElement * element) min_time = G_MAXUINT64; for (i = 0; i < qtdemux->n_streams; i++) { stream = qtdemux->streams[i]; - if (stream->sample_index < stream->n_samples && stream->samples[stream->sample_index].timestamp < min_time) { min_time = stream->samples[stream->sample_index].timestamp; index = i; } } - if (index == -1) { qtdemux->state = QTDEMUX_STATE_SEEKING_EOS; return; @@ -790,7 +788,8 @@ gst_qtdemux_loop_header (GstElement * element) break; } } while (TRUE); - gst_bytestream_flush_fast (qtdemux->bs, size); + if (size > 0) + gst_bytestream_flush_fast (qtdemux->bs, size); qtdemux->offset += size; if (buf) { @@ -864,6 +863,10 @@ gst_qtdemux_add_stream (GstQTDemux * qtdemux, (&gst_qtdemux_videosrc_template), name); g_free (name); stream->fps = 1. * GST_SECOND / stream->samples[0].duration; + if (stream->fps < 1) + stream->fps = 1; + else if (stream->fps > 100) + stream->fps = 100; if (stream->caps) { gst_caps_set_simple (stream->caps, "width", G_TYPE_INT, stream->width, @@ -2417,6 +2420,10 @@ qtdemux_parse_trak (GstQTDemux * qtdemux, GNode * trak) samples[j].size = samples_per_chunk * stream->bytes_per_frame / stream->samples_per_packet / stream->compression; + else if (n_samples == 1 && j == 0 && + gst_bytestream_length (qtdemux->bs) > samples[j].offset) + samples[j].size = + gst_bytestream_length (qtdemux->bs) - samples[j].offset; else samples[j].size = stream->bytes_per_frame; samples[j].duration = -- cgit v1.2.1