[Swfdec-commits] swfdec/swfdec_net_stream.c swfdec/swfdec_video_decoder.c swfdec/swfdec_video_decoder_gst.c
Benjamin Otte
company at kemper.freedesktop.org
Sun Jun 29 12:23:47 PDT 2008
swfdec/swfdec_net_stream.c | 10 +++++-----
swfdec/swfdec_video_decoder.c | 5 +++++
swfdec/swfdec_video_decoder_gst.c | 16 ++++++++--------
3 files changed, 18 insertions(+), 13 deletions(-)
New commits:
commit d221a0557bcec8dbe0f5070760ee5a922c48e403
Author: Benjamin Otte <otte at gnome.org>
Date: Sun Jun 29 21:18:34 2008 +0200
make single frame decoding not fatal
diff --git a/swfdec/swfdec_net_stream.c b/swfdec/swfdec_net_stream.c
index 5df42f3..0ea5b8f 100644
--- a/swfdec/swfdec_net_stream.c
+++ b/swfdec/swfdec_net_stream.c
@@ -82,11 +82,11 @@ swfdec_net_stream_decode_video (SwfdecVideoDecoder *decoder, SwfdecBuffer *buffe
tmp = swfdec_buffer_new_subbuffer (buffer, 1, buffer->length - 1);
swfdec_video_decoder_decode (decoder, tmp);
swfdec_buffer_unref (tmp);
- if (hsub || wsub) {
- if (hsub >= decoder->height || wsub >= decoder->width) {
- swfdec_video_decoder_error (decoder, "can't reduce size by more than available");
- return;
- }
+ if (hsub >= decoder->height || wsub >= decoder->width) {
+ SWFDEC_ERROR ("can't reduce size by more than available");
+ decoder->width = 0;
+ decoder->height = 0;
+ } else {
decoder->width -= wsub;
decoder->height -= hsub;
}
diff --git a/swfdec/swfdec_video_decoder.c b/swfdec/swfdec_video_decoder.c
index 439f59a..aee07d5 100644
--- a/swfdec/swfdec_video_decoder.c
+++ b/swfdec/swfdec_video_decoder.c
@@ -321,6 +321,11 @@ swfdec_video_decoder_get_image (SwfdecVideoDecoder *decoder, SwfdecRenderer *ren
if (decoder->error)
return NULL;
+ /* special case: If decoding an image failed, setting plane[0] to NULL means
+ * "currently no image available". This is generally only useful for the
+ * first image, as otherwise the video decoder is meant to keep the last image. */
+ if (decoder->plane[0] == NULL)
+ return NULL;
if (swfdec_video_codec_get_format (decoder->codec) == SWFDEC_VIDEO_FORMAT_I420) {
data = swfdec_video_i420_to_rgb (decoder);
diff --git a/swfdec/swfdec_video_decoder_gst.c b/swfdec/swfdec_video_decoder_gst.c
index 8122bc6..893fc45 100644
--- a/swfdec/swfdec_video_decoder_gst.c
+++ b/swfdec/swfdec_video_decoder_gst.c
@@ -127,22 +127,22 @@ swfdec_video_decoder_gst_decode (SwfdecVideoDecoder *dec, SwfdecBuffer *buffer)
GstCaps *caps;
GstStructure *structure;
- if (player->last) {
- gst_buffer_unref (player->last);
- player->last = NULL;
- }
-
buf = swfdec_gst_buffer_new (swfdec_buffer_ref (buffer));
if (!swfdec_gst_decoder_push (&player->dec, buf)) {
swfdec_video_decoder_error (dec, "failed to push buffer");
return;
}
- player->last = swfdec_gst_decoder_pull (&player->dec);
- if (player->last == NULL) {
- swfdec_video_decoder_error (dec, "failed to pull decoded buffer");
+ buf = swfdec_gst_decoder_pull (&player->dec);
+ if (buf == NULL) {
+ SWFDEC_ERROR ("failed to pull decoded buffer. Broken stream?");
return;
+ } else {
+ if (player->last)
+ gst_buffer_unref (player->last);
+ player->last = buf;
}
+
while ((buf = swfdec_gst_decoder_pull (&player->dec))) {
SWFDEC_ERROR ("too many output buffers!");
gst_buffer_unref (buf);
More information about the Swfdec-commits
mailing list