Benjamin Otte
2007-Oct-14 20:02 UTC
[Swfdec] 4 commits - libswfdec/swfdec_codec_audio.c libswfdec/swfdec_codec_gst.c libswfdec/swfdec_codec_video.c libswfdec/swfdec_sound.c
libswfdec/swfdec_codec_audio.c | 72 ++++++++++++++++++++++++++++++++--------- libswfdec/swfdec_codec_gst.c | 11 +++--- libswfdec/swfdec_codec_video.c | 64 ++++++++++++++++++++++++++++++------ libswfdec/swfdec_sound.c | 1 4 files changed, 117 insertions(+), 31 deletions(-) New commits: commit f31f005192c5b59e3fa793fef78cc8f06a30ba1b Author: Benjamin Otte <otte at gnome.org> Date: Sun Oct 14 21:59:12 2007 +0200 fix plane computation to be correct Code is copied from gst-plugins-good/jpeg/gstjpegdec.c diff --git a/libswfdec/swfdec_codec_gst.c b/libswfdec/swfdec_codec_gst.c index a125598..08cf154 100644 --- a/libswfdec/swfdec_codec_gst.c +++ b/libswfdec/swfdec_codec_gst.c @@ -351,6 +351,7 @@ swfdec_video_decoder_gst_decode (SwfdecVideoDecoder *dec, SwfdecBuffer *buffer, SwfdecVideoImage *image) { SwfdecGstVideo *player = (SwfdecGstVideo *) dec; +#define ALIGN(x, n) (((x) + (n) - 1) & (~((n) - 1))) while (player->in != NULL && !player->error) { swfdec_cond_wait (player->cond, player->mutex); @@ -376,12 +377,12 @@ swfdec_video_decoder_gst_decode (SwfdecVideoDecoder *dec, SwfdecBuffer *buffer, break; case SWFDEC_VIDEO_FORMAT_I420: image->plane[0] = player->out->data; - image->rowstride[0] = player->width; - image->plane[1] = image->plane[0] + player->width * player->height; - image->rowstride[1] = (player->width + 1) / 2; - image->plane[2] = image->plane[1] + image->rowstride[1] * ((player->height + 1) / 2); + image->rowstride[0] = ALIGN (player->width, 4); + image->plane[1] = image->plane[0] + image->rowstride[0] * ALIGN (player->height, 2); + image->rowstride[1] = ALIGN (player->width, 8) / 2; + image->plane[2] = image->plane[1] + image->rowstride[1] * ALIGN (player->height, 2) / 2; image->rowstride[2] = image->rowstride[1]; - g_assert (image->plane[2] + (image->rowstride[2] * ((player->height + 1) / 2)) == image->plane[0] + player->out->size); + g_assert (image->plane[2] + image->rowstride[2] * ALIGN (player->height, 2) / 2 == image->plane[0] + player->out->size); break; } return TRUE; commit cba64ff0c2275420c7f251fc6d90467be3d3353b Author: Benjamin Otte <otte at gnome.org> Date: Sun Oct 14 21:26:49 2007 +0200 free the reserved cache space on error diff --git a/libswfdec/swfdec_sound.c b/libswfdec/swfdec_sound.c index e4e9086..f086849 100644 --- a/libswfdec/swfdec_sound.c +++ b/libswfdec/swfdec_sound.c @@ -203,6 +203,7 @@ swfdec_sound_get_decoded (SwfdecSound *sound, SwfdecAudioFormat *format) depth = swfdec_buffer_queue_get_depth (queue); if (depth == 0) { SWFDEC_ERROR ("decoding didn't produce any data, bailing"); + swfdec_cached_unload (SWFDEC_CACHED (sound)); return NULL; } tmp = swfdec_buffer_queue_pull (queue, depth); commit b083f36d612e43ae936073772857075c959079ad Author: Benjamin Otte <otte at gnome.org> Date: Sun Oct 14 21:21:46 2007 +0200 allow env vars SWFDEC_CODEC_VIDEO or SWFDEC_CODEC for limiting codec options the env vars should be set to a colon-seperated list of codecs to try. The first one available is taken. Possible values are "builtin", "mad", "ffmpeg" and "gst". Other values are ignored. diff --git a/libswfdec/swfdec_codec_audio.c b/libswfdec/swfdec_codec_audio.c index a42dba8..bdf33f3 100644 --- a/libswfdec/swfdec_codec_audio.c +++ b/libswfdec/swfdec_codec_audio.c @@ -109,6 +109,35 @@ swfdec_audio_decoder_uncompressed_new (SwfdecAudioCodec type, SwfdecAudioFormat /*** PUBLIC API ***/ +static SwfdecAudioDecoder * +swfdec_audio_decoder_builtin_new (SwfdecAudioCodec codec, SwfdecAudioFormat format) +{ + SwfdecAudioDecoder *ret; + + ret = swfdec_audio_decoder_uncompressed_new (codec, format); + if (ret == NULL) + ret = swfdec_audio_decoder_adpcm_new (codec, format); + + return ret; +} + +struct { + const char * name; + SwfdecAudioDecoder * (* func) (SwfdecAudioCodec, SwfdecAudioFormat); +} audio_codecs[] = { + { "builtin", swfdec_audio_decoder_builtin_new }, +#ifdef HAVE_MAD + { "mad", swfdec_audio_decoder_mad_new }, +#endif +#ifdef HAVE_GST + { "gst", swfdec_audio_decoder_gst_new }, +#endif +#ifdef HAVE_FFMPEG + { "ffmpeg", swfdec_audio_decoder_ffmpeg_new }, +#endif + { NULL, } +}; + /** * swfdec_audio_decoder_new: * @format: #SwfdecAudioCodec to decode @@ -122,24 +151,37 @@ SwfdecAudioDecoder * swfdec_audio_decoder_new (SwfdecAudioCodec codec, SwfdecAudioFormat format) { SwfdecAudioDecoder *ret; + const char *list; g_return_val_if_fail (SWFDEC_IS_AUDIO_FORMAT (format), NULL); - ret = swfdec_audio_decoder_uncompressed_new (codec, format); - if (ret == NULL) - ret = swfdec_audio_decoder_adpcm_new (codec, format); -#ifdef HAVE_MAD - if (ret == NULL) - ret = swfdec_audio_decoder_mad_new (codec, format); -#endif -#ifdef HAVE_FFMPEG - if (ret == NULL) - ret = swfdec_audio_decoder_ffmpeg_new (codec, format); -#endif -#ifdef HAVE_GST - if (ret == NULL) - ret = swfdec_audio_decoder_gst_new (codec, format); -#endif + list = g_getenv ("SWFDEC_CODEC_AUDIO"); + if (list == NULL) + list = g_getenv ("SWFDEC_CODEC"); + if (list == NULL) { + guint i; + for (i = 0; audio_codecs[i].name != NULL; i++) { + ret = audio_codecs[i].func (codec, format); + if (ret) + break; + } + } else { + char **split = g_strsplit (list, ":", -1); + guint i, j; + ret = NULL; + SWFDEC_LOG ("codecs limited to \"%s\"", list); + for (i = 0; split[i] != NULL && ret == NULL; i++) { + for (j = 0; audio_codecs[j].name != NULL; j++) { + if (g_ascii_strcasecmp (audio_codecs[j].name, split[i]) != 0) + continue; + ret = audio_codecs[j].func (codec, format); + if (ret) + break; + } + } + g_strfreev (split); + } + if (ret) { ret->codec = codec; g_return_val_if_fail (SWFDEC_IS_AUDIO_FORMAT (ret->format), NULL); commit 3ca6fc618facfd4ad5699070806d374b0714d901 Author: Benjamin Otte <otte at gnome.org> Date: Sun Oct 14 21:12:01 2007 +0200 allow env vars SWFDEC_CODEC_VIDEO or SWFDEC_CODEC for limiting codec options the env vars should be set to a colon-seperated list of codecs to try. The first one available is taken. Possible values are "builtin", "ffmpeg" and "gst". Other values are ignored. diff --git a/libswfdec/swfdec_codec_video.c b/libswfdec/swfdec_codec_video.c index e088d00..bdcce56 100644 --- a/libswfdec/swfdec_codec_video.c +++ b/libswfdec/swfdec_codec_video.c @@ -27,6 +27,32 @@ #include "swfdec_debug.h" #include "swfdec_internal.h" +static SwfdecVideoDecoder * +swfdec_video_decoder_builtin_new (SwfdecVideoCodec codec) +{ + SwfdecVideoDecoder *ret; + + ret = swfdec_video_decoder_screen_new (codec); + if (ret == NULL) + ret = swfdec_video_decoder_vp6_alpha_new (codec); + + return ret; +} + +struct { + const char * name; + SwfdecVideoDecoder * (* func) (SwfdecVideoCodec); +} video_codecs[] = { + { "builtin", swfdec_video_decoder_builtin_new }, +#ifdef HAVE_FFMPEG + { "ffmpeg", swfdec_video_decoder_ffmpeg_new }, +#endif +#ifdef HAVE_GST + { "gst", swfdec_video_decoder_gst_new }, +#endif + { NULL, } +}; + /** * swfdec_video_decoder_new: * @codec: #SwfdecVideoCodec to create the #SwfdecVideoDecoder for @@ -40,18 +66,34 @@ SwfdecVideoDecoder * swfdec_video_decoder_new (SwfdecVideoCodec codec) { SwfdecVideoDecoder *ret; + const char *list; - ret = swfdec_video_decoder_screen_new (codec); - if (ret == NULL) - ret = swfdec_video_decoder_vp6_alpha_new (codec); -#ifdef HAVE_FFMPEG - if (ret == NULL) - ret = swfdec_video_decoder_ffmpeg_new (codec); -#endif -#ifdef HAVE_GST - if (ret == NULL) - ret = swfdec_video_decoder_gst_new (codec); -#endif + list = g_getenv ("SWFDEC_CODEC_VIDEO"); + if (list == NULL) + list = g_getenv ("SWFDEC_CODEC"); + if (list == NULL) { + guint i; + for (i = 0; video_codecs[i].name != NULL; i++) { + ret = video_codecs[i].func (codec); + if (ret) + break; + } + } else { + char **split = g_strsplit (list, ":", -1); + guint i, j; + ret = NULL; + SWFDEC_LOG ("codecs limited to \"%s\"", list); + for (i = 0; split[i] != NULL && ret == NULL; i++) { + for (j = 0; video_codecs[j].name != NULL; j++) { + if (g_ascii_strcasecmp (video_codecs[j].name, split[i]) != 0) + continue; + ret = video_codecs[j].func (codec); + if (ret) + break; + } + } + g_strfreev (split); + } if (ret != NULL) { ret->codec = codec;
Seemingly Similar Threads
- configure.ac libswfdec-gtk/swfdec_gtk_widget.c libswfdec-gtk/swfdec_playback_alsa.c libswfdec/swfdec_as_date.c libswfdec/swfdec_as_interpret.c libswfdec/swfdec_as_types.c libswfdec/swfdec_audio_flv.c libswfdec/swfdec_audio_flv.h
- 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
- libswfdec/swfdec_codec_audio.c libswfdec/swfdec_codec_gst.c
- 6 commits - configure.ac libswfdec/swfdec_codec_audio.c libswfdec/swfdec_codec_gst.c libswfdec/swfdec_codec_video.c player/swfplay.c
- 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