Benjamin Otte
2007-Mar-28 13:37 UTC
[Swfdec] configure.ac doc/swfdec-sections.txt libswfdec/swfdec_buffer.c libswfdec/swfdec_buffer.h libswfdec/swfdec_codec_adpcm.c libswfdec/swfdec_codec_ffmpeg.c libswfdec/swfdec_codec_mad.c libswfdec/swfdec_loader.c libswfdec/swfdec_sound.c libswfdec/swfdec_swf_decoder.c test/sound test/swfdec-extract.c test/swfedit_file.c
configure.ac | 2 doc/swfdec-sections.txt | 10 +++- libswfdec/swfdec_buffer.c | 95 ++++++++++++++++++++++++++++++++++++---- libswfdec/swfdec_buffer.h | 16 +++++- libswfdec/swfdec_codec_adpcm.c | 2 libswfdec/swfdec_codec_ffmpeg.c | 6 +- libswfdec/swfdec_codec_mad.c | 2 libswfdec/swfdec_loader.c | 2 libswfdec/swfdec_sound.c | 2 libswfdec/swfdec_swf_decoder.c | 2 test/sound/sound.c | 2 test/swfdec-extract.c | 4 - test/swfedit_file.c | 2 13 files changed, 120 insertions(+), 27 deletions(-) New commits: diff-tree 7f7d106034cd5fac344b12e3c93562a24ecd825f (from 579955e4dcc87dd9c91428ee1967e01bc9cfa69b) Author: Benjamin Otte <otte@gnome.org> Date: Wed Mar 28 22:38:10 2007 +0200 make SwfdecBuffer and SwfdecBufferQueue boxed types - add and document the types - change SwfdecBufferQueue to be refcounted (most changes here are s/_buffer_queue_free/_buffer_queue_unref/ - break API by removing swfdec_buffer_queue_unref diff --git a/configure.ac b/configure.ac index 5309072..30801ce 100644 --- a/configure.ac +++ b/configure.ac @@ -33,7 +33,7 @@ else fi AC_DEFINE_UNQUOTED(SWFDEC_LEVEL_DEFAULT, $DEFAULT_DEBUG_LEVEL, [Default debug level used]) -SWFDEC_LIBVERSION="2:0:0" +SWFDEC_LIBVERSION="3:0:0" AC_SUBST(SWFDEC_LIBVERSION) AM_PROG_LIBTOOL diff --git a/doc/swfdec-sections.txt b/doc/swfdec-sections.txt index a6e2d96..3d270af 100644 --- a/doc/swfdec-sections.txt +++ b/doc/swfdec-sections.txt @@ -57,7 +57,7 @@ swfdec_player_render swfdec_player_advance swfdec_player_handle_mouse swfdec_player_render_audio -swfdec_player_get_audio_enabled +swfdec_player_get_audio <SUBSECTION Standard> SwfdecPlayerClass SWFDEC_PLAYER @@ -73,7 +73,9 @@ SWFDEC_PLAYER_GET_CLASS <FILE>SwfdecBuffer</FILE> <TITLE>SwfdecBuffer</TITLE> SwfdecBuffer +SWFDEC_TYPE_BUFFER SwfdecBufferQueue +SWFDEC_TYPE_BUFFER_QUEUE swfdec_buffer_new swfdec_buffer_new_and_alloc swfdec_buffer_new_and_alloc0 @@ -84,13 +86,17 @@ swfdec_buffer_ref swfdec_buffer_unref swfdec_buffer_queue_new swfdec_buffer_queue_clear -swfdec_buffer_queue_free +swfdec_buffer_queue_ref +swfdec_buffer_queue_unref swfdec_buffer_queue_get_depth swfdec_buffer_queue_get_offset swfdec_buffer_queue_push swfdec_buffer_queue_pull swfdec_buffer_queue_pull_buffer swfdec_buffer_queue_peek +<SUBSECTION Standard> +swfdec_buffer_get_type +swfdec_buffer_queue_get_type </SECTION> <SECTION> diff --git a/libswfdec/swfdec_buffer.c b/libswfdec/swfdec_buffer.c index 49d47e7..3b8e929 100644 --- a/libswfdec/swfdec_buffer.c +++ b/libswfdec/swfdec_buffer.c @@ -54,6 +54,26 @@ /*** SwfdecBuffer ***/ /** + * SWFDEC_TYPE_BUFFER: + * + * #SwfdecBuffer is a boxed type for the glib type system. This macro + * returns its type. + **/ +GType +swfdec_buffer_get_type (void) +{ + static GType type_swfdec_buffer = 0; + + if (!type_swfdec_buffer) + type_swfdec_buffer = g_boxed_type_register_static + ("SwfdecBuffer", + (GBoxedCopyFunc) swfdec_buffer_ref, + (GBoxedFreeFunc) swfdec_buffer_unref); + + return type_swfdec_buffer; +} + +/** * swfdec_buffer_new: * * Creates a new #SwfdecBuffer to be filled by the user. Use like this: @@ -267,12 +287,36 @@ swfdec_buffer_unref (SwfdecBuffer * buff } } -/*** SwfdecBuffer ***/ +/*** SwfdecBufferQueue ***/ + +/** + * SWFDEC_TYPE_BUFFER_QUEUE: + * + * #SwfdecBufferQueue is a boxed type for the glib type system. This macro + * returns its type. + **/ +GType +swfdec_buffer_queue_get_type (void) +{ + static GType type_swfdec_buffer_queue = 0; + + if (!type_swfdec_buffer_queue) + type_swfdec_buffer_queue = g_boxed_type_register_static + ("SwfdecBufferQueue", + (GBoxedCopyFunc) swfdec_buffer_queue_ref, + (GBoxedFreeFunc) swfdec_buffer_queue_unref); + + return type_swfdec_buffer_queue; +} SwfdecBufferQueue * swfdec_buffer_queue_new (void) { - return g_new0 (SwfdecBufferQueue, 1); + SwfdecBufferQueue *buffer_queue; + + buffer_queue = g_new0 (SwfdecBufferQueue, 1); + buffer_queue->ref_count = 1; + return buffer_queue; } int @@ -296,13 +340,6 @@ swfdec_buffer_queue_clear (SwfdecBufferQ } void -swfdec_buffer_queue_free (SwfdecBufferQueue * queue) -{ - swfdec_buffer_queue_clear (queue); - g_free (queue); -} - -void swfdec_buffer_queue_push (SwfdecBufferQueue * queue, SwfdecBuffer * buffer) { g_return_if_fail (queue != NULL); @@ -443,3 +480,43 @@ swfdec_buffer_queue_peek (SwfdecBufferQu return newbuffer; } + +/** + * swfdec_buffer_queue_ref: + * @queue: a #SwfdecBufferQueue + * + * increases the reference count of @queue by one. + * + * Returns: The passed in @queue. + **/ +SwfdecBufferQueue * +swfdec_buffer_queue_ref (SwfdecBufferQueue * queue) +{ + g_return_val_if_fail (queue != NULL, NULL); + g_return_val_if_fail (queue->ref_count > 0, NULL); + + queue->ref_count++; + return queue; +} + +/** + * swfdec_buffer_queue_unref: + * @queue: a #SwfdecBufferQueue + * + * Decreases the reference count of @queue by one. If no reference + * to this buffer exists anymore, the buffer and the memory + * it manages are freed. + **/ +void +swfdec_buffer_queue_unref (SwfdecBufferQueue * queue) +{ + g_return_if_fail (queue != NULL); + g_return_if_fail (queue->ref_count > 0); + + queue->ref_count--; + if (queue->ref_count == 0) { + swfdec_buffer_queue_clear (queue); + g_free (queue); + } +} + diff --git a/libswfdec/swfdec_buffer.h b/libswfdec/swfdec_buffer.h index 81f6f66..38a7f2f 100644 --- a/libswfdec/swfdec_buffer.h +++ b/libswfdec/swfdec_buffer.h @@ -23,6 +23,7 @@ #define __SWFDEC_BUFFER_H__ #include <glib.h> +#include <glib-object.h> typedef struct _SwfdecBuffer SwfdecBuffer; typedef struct _SwfdecBufferQueue SwfdecBufferQueue; @@ -40,13 +41,21 @@ struct _SwfdecBuffer void *priv; }; +#define SWFDEC_TYPE_BUFFER swfdec_buffer_get_type() +GType swfdec_buffer_get_type (void); + struct _SwfdecBufferQueue { GList *buffers; unsigned int depth; unsigned int offset; + + int ref_count; }; +#define SWFDEC_TYPE_BUFFER_QUEUE swfdec_buffer_queue_get_type() +GType swfdec_buffer_queue_get_type (void); + SwfdecBuffer *swfdec_buffer_new (void); SwfdecBuffer *swfdec_buffer_new_and_alloc (unsigned int size); SwfdecBuffer *swfdec_buffer_new_and_alloc0 (unsigned int size); @@ -54,12 +63,11 @@ SwfdecBuffer *swfdec_buffer_new_for_data SwfdecBuffer *swfdec_buffer_new_subbuffer (SwfdecBuffer * buffer, unsigned int offset, unsigned int length); SwfdecBuffer *swfdec_buffer_new_from_file (const char *filename, GError **error); -SwfdecBuffer * swfdec_buffer_ref (SwfdecBuffer * buffer); +SwfdecBuffer *swfdec_buffer_ref (SwfdecBuffer * buffer); void swfdec_buffer_unref (SwfdecBuffer * buffer); SwfdecBufferQueue *swfdec_buffer_queue_new (void); void swfdec_buffer_queue_clear (SwfdecBufferQueue *queue); -void swfdec_buffer_queue_free (SwfdecBufferQueue * queue); int swfdec_buffer_queue_get_depth (SwfdecBufferQueue * queue); int swfdec_buffer_queue_get_offset (SwfdecBufferQueue * queue); void swfdec_buffer_queue_push (SwfdecBufferQueue * queue, @@ -67,5 +75,7 @@ void swfdec_buffer_queue_push (SwfdecBuf SwfdecBuffer *swfdec_buffer_queue_pull (SwfdecBufferQueue * queue, unsigned int length); SwfdecBuffer *swfdec_buffer_queue_pull_buffer (SwfdecBufferQueue * queue); SwfdecBuffer *swfdec_buffer_queue_peek (SwfdecBufferQueue * queue, unsigned int length); - +SwfdecBufferQueue *swfdec_buffer_queue_ref (SwfdecBufferQueue * queue); +void swfdec_buffer_queue_unref (SwfdecBufferQueue * queue); #endif + diff --git a/libswfdec/swfdec_codec_adpcm.c b/libswfdec/swfdec_codec_adpcm.c index f0fcc0d..93775c2 100644 --- a/libswfdec/swfdec_codec_adpcm.c +++ b/libswfdec/swfdec_codec_adpcm.c @@ -157,7 +157,7 @@ swfdec_codec_adpcm_decode (gpointer data } else { buffer = NULL; } - swfdec_buffer_queue_free (queue); + swfdec_buffer_queue_unref (queue); return buffer; } diff --git a/libswfdec/swfdec_codec_ffmpeg.c b/libswfdec/swfdec_codec_ffmpeg.c index cc5852a..127e1bd 100644 --- a/libswfdec/swfdec_codec_ffmpeg.c +++ b/libswfdec/swfdec_codec_ffmpeg.c @@ -151,7 +151,7 @@ swfdec_codec_ffmpeg_decode (gpointer ctx if (len < 0) { SWFDEC_ERROR ("Error %d while decoding", len); - swfdec_buffer_queue_free (queue); + swfdec_buffer_queue_unref (queue); swfdec_buffer_unref (outbuf); return NULL; } @@ -160,7 +160,7 @@ swfdec_codec_ffmpeg_decode (gpointer ctx outbuf->length = out_size; convert = swfdec_codec_ffmpeg_convert (ctx, outbuf); if (convert == NULL) { - swfdec_buffer_queue_free (queue); + swfdec_buffer_queue_unref (queue); swfdec_buffer_unref (outbuf); return NULL; } @@ -176,7 +176,7 @@ swfdec_codec_ffmpeg_decode (gpointer ctx outbuf = swfdec_buffer_queue_pull (queue, amount); else outbuf = NULL; - swfdec_buffer_queue_free (queue); + swfdec_buffer_queue_unref (queue); return outbuf; } diff --git a/libswfdec/swfdec_codec_mad.c b/libswfdec/swfdec_codec_mad.c index 18ca2fb..fa59e9c 100644 --- a/libswfdec/swfdec_codec_mad.c +++ b/libswfdec/swfdec_codec_mad.c @@ -189,7 +189,7 @@ swfdec_codec_mad_decode (gpointer datap, out = swfdec_buffer_queue_pull (queue, size); else out = NULL; - swfdec_buffer_queue_free (queue); + swfdec_buffer_queue_unref (queue); return out; } diff --git a/libswfdec/swfdec_loader.c b/libswfdec/swfdec_loader.c index 81d536c..fc5b1b6 100644 --- a/libswfdec/swfdec_loader.c +++ b/libswfdec/swfdec_loader.c @@ -139,7 +139,7 @@ swfdec_loader_dispose (GObject *object) { SwfdecLoader *loader = SWFDEC_LOADER (object); - swfdec_buffer_queue_free (loader->queue); + swfdec_buffer_queue_unref (loader->queue); g_free (loader->url); g_free (loader->error); diff --git a/libswfdec/swfdec_sound.c b/libswfdec/swfdec_sound.c index 85e3bb8..bc4ea93 100644 --- a/libswfdec/swfdec_sound.c +++ b/libswfdec/swfdec_sound.c @@ -223,7 +223,7 @@ swfdec_sound_get_decoded (SwfdecSound *s swfdec_buffer_queue_push (queue, tmp); swfdec_buffer_queue_push (queue, tmp2); tmp = swfdec_buffer_queue_pull (queue, swfdec_buffer_queue_get_depth (queue)); - swfdec_buffer_queue_free (queue); + swfdec_buffer_queue_unref (queue); } } SWFDEC_LOG ("after decoding, got %u samples, should get %u and skip %u", diff --git a/libswfdec/swfdec_swf_decoder.c b/libswfdec/swfdec_swf_decoder.c index f205eed..3954b36 100644 --- a/libswfdec/swfdec_swf_decoder.c +++ b/libswfdec/swfdec_swf_decoder.c @@ -60,7 +60,7 @@ swfdec_decoder_dispose (GObject *object) swfdec_buffer_unref (s->uncompressed_buffer); s->uncompressed_buffer = NULL; } - swfdec_buffer_queue_free (s->input_queue); + swfdec_buffer_queue_unref (s->input_queue); if (s->jpegtables) { swfdec_buffer_unref (s->jpegtables); diff --git a/test/sound/sound.c b/test/sound/sound.c index f42149f..6cbb5cc 100644 --- a/test/sound/sound.c +++ b/test/sound/sound.c @@ -119,7 +119,7 @@ finish_stream (TestStream *stream) gboolean ret = TRUE; buffer = swfdec_buffer_queue_pull (stream->queue, swfdec_buffer_queue_get_depth (stream->queue)); - swfdec_buffer_queue_free (stream->queue); + swfdec_buffer_queue_unref (stream->queue); file = swfdec_buffer_new_from_file (stream->name, &error); if (file) { ret = audio_diff (buffer, file, stream->name); diff --git a/test/swfdec-extract.c b/test/swfdec-extract.c index da0964b..36ae146 100644 --- a/test/swfdec-extract.c +++ b/test/swfdec-extract.c @@ -122,12 +122,12 @@ export_sprite_sound (SwfdecSprite *sprit } depth = swfdec_buffer_queue_get_depth (queue); if (depth == 0) { - swfdec_buffer_queue_free (queue); + swfdec_buffer_queue_unref (queue); g_printerr ("Sprite contains no sound\n"); return FALSE; } buffer = swfdec_buffer_queue_pull (queue, depth); - swfdec_buffer_queue_free (queue); + swfdec_buffer_queue_unref (queue); wav = encode_wav (buffer); swfdec_buffer_unref (buffer); if (!g_file_set_contents (filename, (char *) wav->data, diff --git a/test/swfedit_file.c b/test/swfedit_file.c index 26699de..e257010 100644 --- a/test/swfedit_file.c +++ b/test/swfedit_file.c @@ -260,7 +260,7 @@ swfedit_file_write (SwfeditFile *file) swfdec_out_put_buffer (out, buffer); swfdec_buffer_unref (buffer); } - swfdec_buffer_queue_free (queue); + swfdec_buffer_queue_unref (queue); return swfdec_out_close (out); }