diff options
-rw-r--r-- | ChangeLog | 19 | ||||
-rw-r--r-- | gst/qtdemux/qtdemux.c | 13 |
2 files changed, 29 insertions, 3 deletions
@@ -1,5 +1,24 @@ 2005-08-10 Ronald S. Bultje <rbultje@ronald.bitfreak.net> + * 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 <rbultje@ronald.bitfreak.net> + * ext/gnomevfs/gstgnomevfssrc.c: (gst_gnomevfssrc_get): Fix premature EOS. This causes issues when reading ID3v1 tags using gnomevfssrc instead of filesrc; after ID3v1 tag typefinding, the 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 = |