Benjamin Otte
2007-Sep-05 11:36 UTC
[Swfdec] 5 commits - libswfdec/swfdec_codec_ffmpeg.c libswfdec/swfdec_codec_video.c libswfdec/swfdec_player.c libswfdec/swfdec_video.c
libswfdec/swfdec_codec_ffmpeg.c | 29 ++++++++++++++++++++++++++--- libswfdec/swfdec_codec_video.c | 13 +++++++------ libswfdec/swfdec_player.c | 16 +++++++++------- libswfdec/swfdec_video.c | 2 ++ 4 files changed, 44 insertions(+), 16 deletions(-) New commits: diff-tree 97b081a94b818aedc4c7f9f9aea6d6326ca181d9 (from parents) Merge: c5a17d5d70c47aa3cdddf31e038126a320e41d1c d16a6e3da03121a68bebcddb33473fda33bdf3db Author: Benjamin Otte <otte at gnome.org> Date: Wed Sep 5 13:36:42 2007 +0200 Merge branch 'master' of ssh://company at git.freedesktop.org/git/swfdec/swfdec diff-tree c5a17d5d70c47aa3cdddf31e038126a320e41d1c (from 8ca087c8c351a8aeb09d508b074170f18fb24572) Author: Benjamin Otte <otte at gnome.org> Date: Wed Sep 5 13:36:04 2007 +0200 various fixes: - align and pad input data correctly (FFmpeg is fast, because you do the memcpy in your own code!) - reallocate the scaling context when the size changes diff --git a/libswfdec/swfdec_codec_ffmpeg.c b/libswfdec/swfdec_codec_ffmpeg.c index 9fae7cf..1ed3054 100644 --- a/libswfdec/swfdec_codec_ffmpeg.c +++ b/libswfdec/swfdec_codec_ffmpeg.c @@ -208,26 +208,47 @@ typedef struct { AVCodecContext * ctx; /* out context (d'oh) */ AVFrame * frame; /* the frame we use for decoding */ struct SwsContext * sws; /* the format conversion */ + int sws_width; /* width used in resampler */ + int sws_height; /* height used in resampler */ } SwfdecVideoDecoderFFMpeg; +#define ALIGNMENT 31 static SwfdecBuffer * swfdec_video_decoder_ffmpeg_decode (SwfdecVideoDecoder *dec, SwfdecBuffer *buffer, guint *width, guint *height, guint *rowstride) { SwfdecVideoDecoderFFMpeg *codec = (SwfdecVideoDecoderFFMpeg *) dec; - int got_image; + int got_image = 0; SwfdecBuffer *ret; AVPicture picture; + guchar *tmp, *aligned; + /* fullfill alignment and padding requirements */ + tmp = g_try_malloc (buffer->length + ALIGNMENT + FF_INPUT_BUFFER_PADDING_SIZE); + if (tmp == NULL) { + SWFDEC_WARNING ("Could not allocate temporary memory"); + return NULL; + } + aligned = (guchar *) (((uintptr_t) tmp + ALIGNMENT) & ~ALIGNMENT); + memcpy (aligned, buffer->data, buffer->length); + memset (aligned + buffer->length, 0, FF_INPUT_BUFFER_PADDING_SIZE); if (avcodec_decode_video (codec->ctx, codec->frame, &got_image, - buffer->data, buffer->length) < 0) { + aligned, buffer->length) < 0) { + g_free (tmp); SWFDEC_WARNING ("error decoding frame"); return NULL; } + g_free (tmp); if (got_image == 0) { - SWFDEC_WARNING ("error: did not get an image from decoding"); + SWFDEC_WARNING ("did not get an image from decoding"); return NULL; } + if (codec->sws && + (codec->sws_width != codec->ctx->width || + codec->sws_height != codec->ctx->height)) { + sws_freeContext (codec->sws); + codec->sws = NULL; + } if (codec->sws == NULL) { codec->sws = sws_getContext (codec->ctx->width, codec->ctx->height, codec->ctx->pix_fmt, codec->ctx->width, codec->ctx->height, PIX_FMT_RGB32, 0, NULL, NULL, NULL); @@ -235,6 +256,8 @@ swfdec_video_decoder_ffmpeg_decode (Swfd SWFDEC_ERROR ("Could not get conversion context"); return NULL; } + codec->sws_width = codec->ctx->width; + codec->sws_height = codec->ctx->height; } ret = swfdec_buffer_new_and_alloc (codec->ctx->width * codec->ctx->height * 4); avpicture_fill (&picture, ret->data, PIX_FMT_RGB32, codec->ctx->width, diff-tree 8ca087c8c351a8aeb09d508b074170f18fb24572 (from ef42d5ca51f0a0a12ba3a87b79240f2348b2d8d2) Author: Benjamin Otte <otte at gnome.org> Date: Wed Sep 5 12:50:08 2007 +0200 only do size changes when decoding was successful diff --git a/libswfdec/swfdec_codec_video.c b/libswfdec/swfdec_codec_video.c index 51f3b10..842a13d 100644 --- a/libswfdec/swfdec_codec_video.c +++ b/libswfdec/swfdec_codec_video.c @@ -101,14 +101,15 @@ swfdec_video_decoder_decode (SwfdecVideo tmp = swfdec_buffer_new_subbuffer (buffer, 1, buffer->length - 1); buffer = decoder->decode (decoder, tmp, &width, &height, &rowstride); swfdec_buffer_unref (tmp); - if (wsub >= width || hsub >= height) { - SWFDEC_ERROR ("size subtraction too big"); - if (buffer) + if (buffer) { + if (wsub >= width || hsub >= height) { + SWFDEC_ERROR ("size subtraction too big"); swfdec_buffer_unref (buffer); - return NULL; + return NULL; + } + width -= wsub; + height -= hsub; } - width -= wsub; - height -= hsub; } else { buffer = decoder->decode (decoder, buffer, &width, &height, &rowstride); } diff-tree ef42d5ca51f0a0a12ba3a87b79240f2348b2d8d2 (from 7cc76a92b7d071df6adb6b4de61d7f1fe47d5472) Author: Benjamin Otte <otte at gnome.org> Date: Wed Sep 5 12:49:48 2007 +0200 only iterate audio if there is audio to iterate diff --git a/libswfdec/swfdec_player.c b/libswfdec/swfdec_player.c index ff8fc1e..45bbbb3 100644 --- a/libswfdec/swfdec_player.c +++ b/libswfdec/swfdec_player.c @@ -1134,13 +1134,15 @@ swfdec_player_do_advance (SwfdecPlayer * SWFDEC_DEBUG ("advancing %lu msecs (%u audio frames)", msecs, audio_samples); player->audio_skip = audio_samples; - /* iterate all playing sounds */ - walk = player->audio; - while (walk) { - audio = walk->data; - walk = walk->next; - if (swfdec_audio_iterate (audio, audio_samples) == 0) - swfdec_audio_remove (audio); + if (audio_samples) { + /* iterate all playing sounds */ + walk = player->audio; + while (walk) { + audio = walk->data; + walk = walk->next; + if (swfdec_audio_iterate (audio, audio_samples) == 0) + swfdec_audio_remove (audio); + } } for (timeout = player->timeouts ? player->timeouts->data : NULL; diff-tree 7cc76a92b7d071df6adb6b4de61d7f1fe47d5472 (from a84130c80ddc1efbce631010e77e2b1239d967b0) Author: Benjamin Otte <otte at gnome.org> Date: Wed Sep 5 10:01:35 2007 +0200 only provide a new image if decoding succeeded diff --git a/libswfdec/swfdec_video.c b/libswfdec/swfdec_video.c index 7caaeca..f825e3c 100644 --- a/libswfdec/swfdec_video.c +++ b/libswfdec/swfdec_video.c @@ -80,6 +80,8 @@ swfdec_video_input_iterate (SwfdecVideoM return; surface = swfdec_video_decoder_decode (input->decoder, buffer); + if (surface == NULL) + return; swfdec_video_movie_new_image (input->movie, surface); cairo_surface_destroy (surface); }
Possibly Parallel Threads
- 3 commits - libswfdec-gtk/swfdec_gtk_loader.c libswfdec/Makefile.am libswfdec/swfdec_codec.c libswfdec/swfdec_codec_ffmpeg.c libswfdec/swfdec_codec_gst.c libswfdec/swfdec_codec.h libswfdec/swfdec_codec_screen.c libswfdec/swfdec_codec_video.c
- 2 commits - libswfdec/swfdec_codec_ffmpeg.c
- 2 commits - libswfdec/swfdec_codec_ffmpeg.c libswfdec/swfdec_loader.c
- 4 commits - libswfdec/swfdec_codec_audio.c libswfdec/swfdec_codec_gst.c libswfdec/swfdec_codec_video.c libswfdec/swfdec_sound.c
- 5 commits - autogen.sh configure.ac libswfdec-gtk/Makefile.am libswfdec/swfdec_codec_audio.c libswfdec/swfdec_codec_video.c libswfdec/swfdec_player.c test/trace