summaryrefslogtreecommitdiff
path: root/transcode.c
diff options
context:
space:
mode:
Diffstat (limited to 'transcode.c')
-rw-r--r--transcode.c60
1 files changed, 52 insertions, 8 deletions
diff --git a/transcode.c b/transcode.c
index 54418cd..ebd7ded 100644
--- a/transcode.c
+++ b/transcode.c
@@ -4,11 +4,11 @@
#include <glib.h>
-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);*/
}