Benjamin Otte
2007-Oct-28 21:50 UTC
[Swfdec] 9 commits - configure.ac libswfdec/swfdec_as_context.c libswfdec/swfdec_audio_internal.h libswfdec/swfdec_codec_audio.c libswfdec/swfdec_codec_gst.c libswfdec/swfdec_sound.c
configure.ac | 8 ++--- libswfdec/swfdec_as_context.c | 14 ++++----- libswfdec/swfdec_audio_internal.h | 1 libswfdec/swfdec_codec_audio.c | 12 +++++++- libswfdec/swfdec_codec_gst.c | 54 +++++++++++++++++++++++++++++++------- libswfdec/swfdec_sound.c | 11 +++---- 6 files changed, 72 insertions(+), 28 deletions(-) New commits: commit 35fdb57f33b63f078b0fa7062d0b970c7c739c7e Author: Benjamin Otte <otte at gnome.org> Date: Sun Oct 28 22:49:46 2007 +0100 disable ffmpeg and mad backends in default configure diff --git a/configure.ac b/configure.ac index 296b09b..4f164b0 100644 --- a/configure.ac +++ b/configure.ac @@ -188,9 +188,9 @@ fi AC_ARG_ENABLE(mad, AS_HELP_STRING([--enable-mad], - [enable mad audio (default=yes)])], + [enable mad audio (default=no)])], enable_mad=$enableval, - enable_mad="yes") + enable_mad="no") if test "$enable_mad" = "yes"; then AC_CHECK_LIB(mad, mad_decoder_finish, HAVE_MAD="yes" MAD_LIBS="-lmad", HAVE_MAD="no") @@ -211,9 +211,9 @@ dnl So you'll have to update your ffmpeg checkout if compilation fails. dnl Or you submit a patch that detects ffmpeg reliably on the distros. AC_ARG_ENABLE(ffmpeg, AS_HELP_STRING([--enable-ffmpeg], - [enable ffmpeg support (default=yes)])], + [enable ffmpeg support (default=no)])], enable_ffmpeg=$enableval, - enable_ffmpeg="yes") + enable_ffmpeg="no") if test "$enable_ffmpeg" = "yes"; then PKG_CHECK_MODULES(FFMPEG, libavcodec libswscale, HAVE_FFMPEG=yes, HAVE_FFMPEG=no) commit 2aa0918b46d71707d1ca6f1ec22fd47de09bf23b Author: Benjamin Otte <otte at gnome.org> Date: Sun Oct 28 22:49:26 2007 +0100 only pop blocks when there's not been an error with the pc before diff --git a/libswfdec/swfdec_as_context.c b/libswfdec/swfdec_as_context.c index 54a1ac8..ca1af3d 100644 --- a/libswfdec/swfdec_as_context.c +++ b/libswfdec/swfdec_as_context.c @@ -863,13 +863,6 @@ start: pc = frame->pc; continue; } - if (check_block && (pc < frame->block_start || pc >= frame->block_end)) { - SWFDEC_LOG ("code exited block"); - swfdec_as_frame_pop_block (frame); - pc = frame->pc; - if (frame != context->frame) - goto start; - } if (pc == exitpc) { swfdec_as_frame_return (frame, NULL); goto start; @@ -878,6 +871,13 @@ start: SWFDEC_ERROR ("pc %p not in valid range [%p, %p) anymore", pc, startpc, endpc); goto error; } + if (check_block && (pc < frame->block_start || pc >= frame->block_end)) { + SWFDEC_LOG ("code exited block"); + swfdec_as_frame_pop_block (frame); + pc = frame->pc; + if (frame != context->frame) + goto start; + } /* decode next action */ action = *pc; commit 397be351d19a0f66a2b0b4836416a67b0098d233 Author: Benjamin Otte <otte at gnome.org> Date: Sun Oct 28 22:49:01 2007 +0100 rewrite to allow any output format This gets rid of long lags when audioresample takes its time diff --git a/libswfdec/swfdec_codec_gst.c b/libswfdec/swfdec_codec_gst.c index b449533..35f00e5 100644 --- a/libswfdec/swfdec_codec_gst.c +++ b/libswfdec/swfdec_codec_gst.c @@ -148,14 +148,16 @@ swfdec_gst_get_element (GstCaps *caps) static GstPad * swfdec_gst_connect_srcpad (GstElement *element, GstCaps *caps) { + GstPadTemplate *tmpl; GstPad *srcpad, *sinkpad; sinkpad = gst_element_get_pad (element, "sink"); if (sinkpad == NULL) return NULL; - srcpad = gst_pad_new ("src", GST_PAD_SRC); - if (!gst_pad_set_caps (srcpad, caps)) - goto error; + gst_caps_ref (caps); + tmpl = gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, caps); + srcpad = gst_pad_new_from_template (tmpl, "src"); + g_object_unref (tmpl); if (gst_pad_link (srcpad, sinkpad) != GST_PAD_LINK_OK) goto error; @@ -173,14 +175,16 @@ error: static GstPad * swfdec_gst_connect_sinkpad (GstElement *element, GstCaps *caps) { + GstPadTemplate *tmpl; GstPad *srcpad, *sinkpad; srcpad = gst_element_get_pad (element, "src"); if (srcpad == NULL) return NULL; - sinkpad = gst_pad_new ("sink", GST_PAD_SINK); - if (!gst_pad_set_caps (sinkpad, caps)) - goto error; + gst_caps_ref (caps); + tmpl = gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, caps); + sinkpad = gst_pad_new_from_template (tmpl, "sink"); + g_object_unref (tmpl); if (gst_pad_link (srcpad, sinkpad) != GST_PAD_LINK_OK) goto error; @@ -279,6 +283,12 @@ swfdec_gst_decoder_push (SwfdecGstDecoder *dec, GstBuffer *buffer) if (caps) { gst_caps_unref (caps); } else { + caps = GST_PAD_CAPS (dec->src); + if (caps == NULL) { + caps = (GstCaps *) gst_pad_get_pad_template_caps (dec->src); + g_assert (gst_caps_is_fixed (caps)); + gst_pad_set_caps (dec->src, caps); + } gst_buffer_set_caps (buffer, GST_PAD_CAPS (dec->src)); } @@ -370,6 +380,30 @@ swfdec_audio_decoder_gst_pull (SwfdecAudioDecoder *dec) return swfdec_buffer_new_from_gst (buf); } +static gboolean +swfdec_audio_decoder_set_caps (GstPad *pad, GstCaps *caps) +{ + SwfdecGstAudio *player = g_object_get_data (G_OBJECT (pad), "swfdec-player"); + GstStructure *structure = gst_caps_get_structure (caps, 0); + int depth, channels, rate; + + if (SWFDEC_IS_AUDIO_FORMAT (player->decoder.format)) { + SWFDEC_ERROR ("resetting format not allowed"); + player->error = TRUE; + return FALSE; + } + if (!gst_structure_get_int (structure, "depth", &depth) || + !gst_structure_get_int (structure, "rate", &rate) || + !gst_structure_get_int (structure, "channels", &channels)) { + SWFDEC_ERROR ("invalid caps"); + player->error = TRUE; + return FALSE; + } + + player->decoder.format = swfdec_audio_format_new (rate, channels, depth == 16 ? TRUE : FALSE); + return TRUE; +} + SwfdecAudioDecoder * swfdec_audio_decoder_gst_new (SwfdecAudioCodec type, SwfdecAudioFormat format) { @@ -389,7 +423,7 @@ swfdec_audio_decoder_gst_new (SwfdecAudioCodec type, SwfdecAudioFormat format) g_assert (srccaps); player = g_slice_new0 (SwfdecGstAudio); - player->decoder.format = swfdec_audio_format_new (44100, 2, TRUE); + player->decoder.format = SWFDEC_AUDIO_FORMAT_INVALID; player->decoder.pull = swfdec_audio_decoder_gst_pull; player->decoder.push = swfdec_audio_decoder_gst_push; player->decoder.free = swfdec_audio_decoder_gst_free; @@ -402,17 +436,19 @@ swfdec_audio_decoder_gst_new (SwfdecAudioCodec type, SwfdecAudioFormat format) /* create audioconvert */ gst_caps_unref (srccaps); srccaps = sinkcaps; - sinkcaps = gst_caps_from_string ("audio/x-raw-int, endianness=byte_order, signed=(boolean)true, width=16, depth=16, channels=2"); + sinkcaps = gst_caps_from_string ("audio/x-raw-int, endianness=byte_order, signed=(boolean)true, width=16, depth=16, channels={2,1}"); g_assert (sinkcaps); if (!swfdec_gst_decoder_init (&player->convert, "audioconvert", srccaps, sinkcaps)) goto error; /* create audiorate */ gst_caps_unref (srccaps); srccaps = sinkcaps; - sinkcaps = gst_caps_from_string ("audio/x-raw-int, endianness=byte_order, signed=(boolean)true, width=16, depth=16, rate=44100, channels=2"); + sinkcaps = gst_caps_from_string ("audio/x-raw-int, endianness=byte_order, signed=(boolean)true, width=16, depth=16, rate={44100, 22050, 11025, 5512}, channels={2,1}"); g_assert (sinkcaps); if (!swfdec_gst_decoder_init (&player->resample, "audioresample", srccaps, sinkcaps)) goto error; + g_object_set_data (G_OBJECT (player->resample.sink), "swfdec-player", player); + gst_pad_set_setcaps_function (player->resample.sink, swfdec_audio_decoder_set_caps); gst_caps_unref (srccaps); gst_caps_unref (sinkcaps); commit 6acb15e98eba17213203e44bcd15f2b327ebf02f Author: Benjamin Otte <otte at gnome.org> Date: Sun Oct 28 22:47:53 2007 +0100 only require a sane format if a buffer was returned diff --git a/libswfdec/swfdec_codec_audio.c b/libswfdec/swfdec_codec_audio.c index 770027c..5e8b9aa 100644 --- a/libswfdec/swfdec_codec_audio.c +++ b/libswfdec/swfdec_codec_audio.c @@ -276,6 +276,8 @@ swfdec_audio_decoder_pull (SwfdecAudioDecoder *decoder) g_return_val_if_fail (decoder != NULL, NULL); ret = decoder->pull (decoder); + if (ret == NULL) + return NULL; g_return_val_if_fail (SWFDEC_IS_AUDIO_FORMAT (decoder->format), ret); return ret; } commit c99e09aea38c969959691d2198c102ed17871857 Author: Benjamin Otte <otte at gnome.org> Date: Sun Oct 28 22:39:09 2007 +0100 check the audio format is valid after pulling diff --git a/libswfdec/swfdec_codec_audio.c b/libswfdec/swfdec_codec_audio.c index 0c5ba5c..770027c 100644 --- a/libswfdec/swfdec_codec_audio.c +++ b/libswfdec/swfdec_codec_audio.c @@ -185,7 +185,6 @@ swfdec_audio_decoder_new (SwfdecAudioCodec codec, SwfdecAudioFormat format) if (ret) { ret->codec = codec; - g_return_val_if_fail (SWFDEC_IS_AUDIO_FORMAT (ret->format), NULL); g_return_val_if_fail (ret->push, NULL); g_return_val_if_fail (ret->pull, NULL); g_return_val_if_fail (ret->free, NULL); @@ -272,8 +271,12 @@ swfdec_audio_decoder_push (SwfdecAudioDecoder *decoder, SwfdecBuffer *buffer) SwfdecBuffer * swfdec_audio_decoder_pull (SwfdecAudioDecoder *decoder) { + SwfdecBuffer *ret; + g_return_val_if_fail (decoder != NULL, NULL); - return decoder->pull (decoder); + ret = decoder->pull (decoder); + g_return_val_if_fail (SWFDEC_IS_AUDIO_FORMAT (decoder->format), ret); + return ret; } commit 82bd44abf501719be638d4c97ed834c6899eb670 Author: Benjamin Otte <otte at gnome.org> Date: Sun Oct 28 22:38:48 2007 +0100 query the format before destroying the decoder (oops) diff --git a/libswfdec/swfdec_sound.c b/libswfdec/swfdec_sound.c index 352d6ae..64e22a3 100644 --- a/libswfdec/swfdec_sound.c +++ b/libswfdec/swfdec_sound.c @@ -194,6 +194,7 @@ swfdec_sound_get_decoded (SwfdecSound *sound, SwfdecAudioFormat *format) while ((tmp = swfdec_audio_decoder_pull (decoder))) { swfdec_buffer_queue_push (queue, tmp); } + sound->decoded_format = swfdec_audio_decoder_get_format (decoder); swfdec_audio_decoder_free (decoder); depth = swfdec_buffer_queue_get_depth (queue); if (depth == 0) { @@ -204,7 +205,6 @@ swfdec_sound_get_decoded (SwfdecSound *sound, SwfdecAudioFormat *format) tmp = swfdec_buffer_queue_pull (queue, depth); swfdec_buffer_queue_unref (queue); - sound->decoded_format = swfdec_audio_decoder_get_format (decoder); sample_bytes = swfdec_audio_format_get_bytes_per_sample (sound->decoded_format); n_samples = sound->n_samples / swfdec_audio_format_get_granularity (sound->decoded_format); commit 43c2c77acd07323c9fe8d395ec58b782222f2a70 Author: Benjamin Otte <otte at gnome.org> Date: Sun Oct 28 21:58:33 2007 +0100 make sure the sound format only gets requested after decoding diff --git a/libswfdec/swfdec_sound.c b/libswfdec/swfdec_sound.c index 8bf57e5..352d6ae 100644 --- a/libswfdec/swfdec_sound.c +++ b/libswfdec/swfdec_sound.c @@ -187,11 +187,6 @@ swfdec_sound_get_decoded (SwfdecSound *sound, SwfdecAudioFormat *format) decoder = swfdec_audio_decoder_new (sound->codec, sound->format); if (decoder == NULL) return NULL; - sound->decoded_format = swfdec_audio_decoder_get_format (decoder); - sample_bytes = swfdec_audio_format_get_bytes_per_sample (sound->decoded_format); - n_samples = sound->n_samples / swfdec_audio_format_get_granularity (sound->decoded_format); - /* FIXME: The size is only a guess */ - swfdec_cached_load (SWFDEC_CACHED (sound), n_samples * sample_bytes); swfdec_audio_decoder_push (decoder, sound->encoded); swfdec_audio_decoder_push (decoder, NULL); @@ -203,12 +198,16 @@ 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; } + swfdec_cached_load (SWFDEC_CACHED (sound), depth); tmp = swfdec_buffer_queue_pull (queue, depth); swfdec_buffer_queue_unref (queue); + sound->decoded_format = swfdec_audio_decoder_get_format (decoder); + sample_bytes = swfdec_audio_format_get_bytes_per_sample (sound->decoded_format); + n_samples = sound->n_samples / swfdec_audio_format_get_granularity (sound->decoded_format); + SWFDEC_LOG ("after decoding, got %u samples, should get %u and skip %u", tmp->length / sample_bytes, n_samples, sound->skip); if (sound->skip) { commit cfb80250d2299f934879187d8e50b514b122ae75 Author: Benjamin Otte <otte at gnome.org> Date: Sun Oct 28 21:57:55 2007 +0100 check the audio format is valid before returning it diff --git a/libswfdec/swfdec_codec_audio.c b/libswfdec/swfdec_codec_audio.c index a46b315..0c5ba5c 100644 --- a/libswfdec/swfdec_codec_audio.c +++ b/libswfdec/swfdec_codec_audio.c @@ -217,6 +217,8 @@ swfdec_audio_decoder_free (SwfdecAudioDecoder *decoder) * @decoder: a #SwfdecAudioDecoder * * Queries the format that is used by the decoder for its produced output. + * The format will only be valid after swfdec_audio_decoder_pull () has been + * called at least once. * * Returns: the format of the decoded data **/ @@ -224,6 +226,7 @@ SwfdecAudioFormat swfdec_audio_decoder_get_format (SwfdecAudioDecoder *decoder) { g_return_val_if_fail (decoder != NULL, 0); + g_return_val_if_fail (SWFDEC_IS_AUDIO_FORMAT (decoder->format), 0); return decoder->format; } commit 61ad3e00c7b966edefbcd6984eff563d0834da9f Author: Benjamin Otte <otte at gnome.org> Date: Sun Oct 28 21:52:39 2007 +0100 add a macro to invalid a value as invalid diff --git a/libswfdec/swfdec_audio_internal.h b/libswfdec/swfdec_audio_internal.h index d6b3915..512f6e7 100644 --- a/libswfdec/swfdec_audio_internal.h +++ b/libswfdec/swfdec_audio_internal.h @@ -31,6 +31,7 @@ G_BEGIN_DECLS typedef guint SwfdecAudioFormat; #define SWFDEC_IS_AUDIO_FORMAT(format) ((format) <= 0xF) +#define SWFDEC_AUDIO_FORMAT_INVALID ((SwfdecAudioFormat) -1) struct _SwfdecAudio {
Reasonably Related Threads
- 6 commits - configure.ac libswfdec/swfdec_codec_audio.c libswfdec/swfdec_codec_gst.c libswfdec/swfdec_codec_video.c player/swfplay.c
- 6 commits - libswfdec/Makefile.am libswfdec/swfdec_audio_flv.c libswfdec/swfdec_audio_flv.h libswfdec/swfdec_audio_stream.c libswfdec/swfdec_audio_stream.h libswfdec/swfdec_buffer.c libswfdec/swfdec_codec_adpcm.c libswfdec/swfdec_codec_audio.c
- 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
- 3 commits - libswfdec/swfdec_as_interpret.c libswfdec/swfdec_codec_audio.h test/swfdec-extract.c
- libswfdec/swfdec_codec_audio.c libswfdec/swfdec_codec_gst.c