[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