From 30aa38e29a03250192c3c0d4faa3c37a9d4d0357 Mon Sep 17 00:00:00 2001 From: Jon Bergli Heier Date: Sun, 5 Sep 2010 18:26:30 +0200 Subject: Rewrote encoder/decoder setup to use streams instead of buffers. --- transcode.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 52 insertions(+), 8 deletions(-) (limited to 'transcode.c') diff --git a/transcode.c b/transcode.c index 54418cd..ebd7ded 100644 --- a/transcode.c +++ b/transcode.c @@ -4,11 +4,11 @@ #include -void transcode(GInputStream *input, const struct decoder_plugin *decoder, - GOutputStream *output, const struct encoder_plugin *encoder) { +void transcode(GInputStream *input, const struct decoder_plugin *_decoder, + GOutputStream *output, const struct encoder_plugin *_encoder) { GError *error = NULL; - DecodeConverter *dc = decode_converter_new(decoder); + /*DecodeConverter *dc = decode_converter_new(decoder); GInputStream *decoded_stream = g_converter_input_stream_new(input, (GConverter*)dc); @@ -17,16 +17,60 @@ void transcode(GInputStream *input, const struct decoder_plugin *decoder, (GConverter*)ec); gssize size = g_output_stream_splice(output, encoded_stream, - G_OUTPUT_STREAM_SPLICE_NONE, NULL, &error); + G_OUTPUT_STREAM_SPLICE_NONE, NULL, &error);*/ - if(size == -1 && error != NULL) { + gboolean decode_done = FALSE, encode_done = FALSE; + struct decoder *decoder = g_new0(struct decoder, 1); + struct encoder *encoder = g_new0(struct encoder, 1); + decoder->decoder = _decoder; + encoder->encoder = _encoder; + decoder_init(decoder); + encoder_init(encoder); + + /* holds decoded audio passed to encoder */ + GInputStream *decoded_in = g_memory_input_stream_new(); + + while(decode_done == FALSE || encode_done == FALSE) { + /* holds decoded audio from decoder */ + GOutputStream *decoded_out = g_memory_output_stream_new(NULL, 0, g_realloc, g_free); + + if(decode_done == FALSE && decoder_decode(decoder, input, decoded_out) <= 0) { + g_debug("decoding done"); + decode_done = TRUE; + } + + /* temp variables */ + gpointer data = g_memory_output_stream_get_data((GMemoryOutputStream*)decoded_out); + gsize size = g_memory_output_stream_get_data_size((GMemoryOutputStream*)decoded_out); + + if(size > 0) { + data = g_memdup(data, size); + g_memory_input_stream_add_data((GMemoryInputStream*)decoded_in, data, size, g_free); + } + + g_object_unref(decoded_out); + + if(encode_done == FALSE && encoder_encode(encoder, decoded_in, output) <= 0) { + g_debug("encoding done"); + encode_done = TRUE; + } + } + + g_object_unref(decoded_in); + + /*if(size == -1 && error != NULL) { g_warning(error->message); g_error_free(error); - } + }*/ + + decoder_close(decoder); + encoder_close(encoder); + g_free(decoder); + g_free(encoder); - g_object_unref(encoded_stream); + /*g_object_unref(encoded_stream); g_object_unref(ec); g_object_unref(decoded_stream); - g_object_unref(dc); + g_object_unref(dc);*/ } -- cgit v1.2.3