summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--decoder.c15
-rw-r--r--decoder.h30
2 files changed, 45 insertions, 0 deletions
diff --git a/decoder.c b/decoder.c
new file mode 100644
index 0000000..555757d
--- /dev/null
+++ b/decoder.c
@@ -0,0 +1,15 @@
+#include "decoder.h"
+
+gboolean decoder_init(struct decoder *decoder) {
+ return decoder->decoder->init(&(decoder->data));
+}
+
+gssize decoder_decode(struct decoder *decoder, const guchar *inbuf,
+ gsize inbuf_size, guchar *outbuf, gsize outbuf_size) {
+ return decoder->decoder->decode(decoder->data, inbuf, inbuf_size,
+ outbuf, outbuf_size);
+}
+
+void decoder_close(struct decoder *decoder) {
+ decoder->decoder->close(decoder->data);
+}
diff --git a/decoder.h b/decoder.h
new file mode 100644
index 0000000..0a29c64
--- /dev/null
+++ b/decoder.h
@@ -0,0 +1,30 @@
+#ifndef _DECODER_H_
+#define _DECODER_H_
+
+#include <glib.h>
+#include <gio/gio.h>
+
+struct decoder_plugin {
+ const gchar *name;
+ const gchar * const *extensions;
+
+ gboolean (*init)(gpointer *data);
+ gssize (*decode)(gpointer data, const guchar *inbuf, gsize inbuf_size,
+ guchar *outbuf, gsize outbuf_size);
+ void (*close)(gpointer data);
+};
+
+struct decoder {
+ const struct decoder_plugin *decoder;
+
+ gpointer data;
+};
+
+extern struct decoder_plugin *decoder_plugins;
+
+gboolean decoder_init(struct decoder *decoder);
+gssize decoder_decode(struct decoder *decoder, const guchar *inbuf,
+ gsize inbuf_size, guchar *outbuf, gsize outbuf_size);
+void decoder_close(struct decoder *decoder);
+
+#endif