summaryrefslogtreecommitdiff
path: root/src/codec
diff options
context:
space:
mode:
Diffstat (limited to 'src/codec')
-rw-r--r--src/codec/codecs.c10
-rw-r--r--src/codec/meson.build25
-rw-r--r--src/codec/spng.c (renamed from src/codec/spng/server.c)81
-rw-r--r--src/codec/spng.h25
-rw-r--r--src/codec/spng/client.c77
-rw-r--r--src/codec/spng/decoder.h12
-rw-r--r--src/codec/spng/demuxer.h12
-rw-r--r--src/codec/spng/impl.c0
-rw-r--r--src/codec/spng/meson.build6
-rw-r--r--src/codec/stb_image.c (renamed from src/codec/stb_image/server.c)88
-rw-r--r--src/codec/stb_image.h25
-rw-r--r--src/codec/stb_image/client.c72
-rw-r--r--src/codec/stb_image/decoder.h12
-rw-r--r--src/codec/stb_image/demuxer.h12
-rw-r--r--src/codec/stb_image/impl.c8
-rw-r--r--src/codec/stb_image/meson.build6
-rw-r--r--src/codec/wuffs.c216
-rw-r--r--src/codec/wuffs.h (renamed from src/codec/wuffs/decoder.h)16
-rw-r--r--src/codec/wuffs/client.c100
-rw-r--r--src/codec/wuffs/demuxer.h12
-rw-r--r--src/codec/wuffs/impl.c2
-rw-r--r--src/codec/wuffs/inc.h12
-rw-r--r--src/codec/wuffs/meson.build6
-rw-r--r--src/codec/wuffs/server.c102
24 files changed, 465 insertions, 472 deletions
diff --git a/src/codec/codecs.c b/src/codec/codecs.c
index 6d830d2..dbec693 100644
--- a/src/codec/codecs.c
+++ b/src/codec/codecs.c
@@ -2,22 +2,18 @@
#include "codec.h"
#ifdef LIANA_SERVER
-#include "wuffs/demuxer.h"
-#include "stb_image/demuxer.h"
-#include "spng/demuxer.h"
#ifdef CAMU_HAVE_FFMPEG
#include "ffmpeg/demuxer.h"
#endif
#endif
-
#ifdef LIANA_CLIENT
-#include "wuffs/decoder.h"
-#include "stb_image/decoder.h"
-#include "spng/decoder.h"
#ifdef CAMU_HAVE_FFMPEG
#include "ffmpeg/decoder.h"
#endif
#endif
+#include "stb_image.h"
+#include "wuffs.h"
+#include "spng.h"
struct camu_codec_info codec_information[] = {
#ifdef CAMU_HAVE_WUFFS
diff --git a/src/codec/meson.build b/src/codec/meson.build
index 851a72a..81144d4 100644
--- a/src/codec/meson.build
+++ b/src/codec/meson.build
@@ -8,15 +8,30 @@ if get_option('codecs').contains('ffmpeg')
endif
if get_option('codecs').contains('stb_image')
- subdir('stb_image')
+ stb = subproject('stb').get_variable('stb')
+ stb_args = ['-DCAMU_HAVE_STB_IMAGE']
+ stb_codec = declare_dependency(sources: ['stb_image.c'],
+ dependencies: stb, compile_args: stb_args)
+ codec_server_deps += [stb_codec]
+ codec_client_deps += [stb_codec]
endif
-if get_option('codecs').contains('spng')
- subdir('spng')
+if get_option('codecs').contains('wuffs')
+ wuffs = subproject('wuffs').get_variable('wuffs')
+ wuffs_args = ['-DCAMU_HAVE_WUFFS']
+ wuffs_codec = declare_dependency(sources: ['wuffs.c'],
+ dependencies: wuffs, compile_args: wuffs_args)
+ codec_server_deps += [wuffs_codec]
+ codec_client_deps += [wuffs_codec]
endif
-if get_option('codecs').contains('wuffs')
- subdir('wuffs')
+if get_option('codecs').contains('spng')
+ spng = dependency('spng')
+ spng_args = ['-DCAMU_HAVE_SPNG']
+ spng_codec = declare_dependency(sources: ['spng.c'],
+ dependencies: spng, compile_args: spng_args)
+ codec_server_deps += [spng_codec]
+ codec_client_deps += [spng_codec]
endif
codec_client_deps += [stela]
diff --git a/src/codec/spng/server.c b/src/codec/spng.c
index 1bb2ca8..2168c35 100644
--- a/src/codec/spng/server.c
+++ b/src/codec/spng.c
@@ -1,8 +1,10 @@
#include <spng.h>
-#include "../../cache/entry.h"
+#include "spng.h"
+#include "common.h"
-#include "demuxer.h"
+#ifdef LIANA_SERVER
+#include "../cache/entry.h"
static bool spng_demuxer_init(struct camu_demuxer *demux, struct cch_handle *handle)
{
@@ -89,3 +91,78 @@ struct camu_demuxer *camu_spng_demuxer_create(void)
spng->demux.free = spng_demuxer_free;
return (struct camu_demuxer *)spng;
}
+#endif
+
+#ifdef LIANA_CLIENT
+static bool spng_decoder_init(struct camu_decoder *dec, struct camu_renderer *renderer, struct camu_codec_stream *stream,
+ void (*callback)(void *, struct camu_codec_frame *), void *userdata)
+{
+ struct camu_spng_decoder *spng = (struct camu_spng_decoder *)dec;
+ (void)renderer;
+ spng->stream = stream;
+ spng->callback = callback;
+ spng->userdata = userdata;
+ return true;
+}
+
+static s32 spng_decoder_push(struct camu_decoder *dec, struct camu_codec_packet *packet)
+{
+ struct camu_spng_decoder *spng = (struct camu_spng_decoder *)dec;
+ if (!packet) return CAMU_OK;
+
+ spng_ctx *ctx = spng_ctx_new(SPNG_CTX_IGNORE_ADLER32);
+ spng_set_png_buffer(ctx, nn_buffer_get_ptr(packet->buffer, 0), packet->buffer->size);
+ spng_set_option(ctx, SPNG_CHUNK_COUNT_LIMIT, 6250);
+ spng_set_crc_action(ctx, SPNG_CRC_DISCARD, SPNG_CRC_DISCARD);
+
+ size_t out_size;
+ spng_decoded_image_size(ctx, SPNG_FMT_RGBA8, &out_size);
+
+ struct camu_codec_frame *frame = al_alloc_object(struct camu_codec_frame);
+ frame->mode = CAMU_NORMAL;
+ frame->data = camu_page_alloc(out_size);
+ spng_decode_chunks(ctx);
+ spng_decode_image(ctx, frame->data, out_size, SPNG_FMT_RGBA8, 0);
+ spng_ctx_free(ctx);
+ frame->flags = 0;
+ frame->format = CAMU_PIXEL_FORMAT_RGBA;
+ struct camu_video_format *fmt = &spng->stream->video.fmt;
+ frame->video.width = fmt->width;
+ frame->video.height = fmt->height;
+ frame->pts = 0.0;
+
+ spng->callback(spng->userdata, frame);
+
+ return CAMU_OK;
+}
+
+static void spng_decoder_flush(struct camu_decoder *dec)
+{
+ (void)dec;
+}
+
+static s32 spng_decoder_process(struct camu_decoder *dec)
+{
+ (void)dec;
+ return CAMU_ERR_EOF;
+}
+
+static void spng_decoder_free(struct camu_decoder **dec)
+{
+ struct camu_spng_decoder *spng = (struct camu_spng_decoder *)*dec;
+ al_free(spng);
+ *dec = NULL;
+}
+
+struct camu_decoder *camu_spng_decoder_create(void)
+{
+ struct camu_spng_decoder *spng = al_alloc_object(struct camu_spng_decoder);
+ spng->dec.mode = CAMU_NORMAL;
+ spng->dec.init = spng_decoder_init;
+ spng->dec.push = spng_decoder_push;
+ spng->dec.process = spng_decoder_process;
+ spng->dec.flush = spng_decoder_flush;
+ spng->dec.free = spng_decoder_free;
+ return (struct camu_decoder *)spng;
+}
+#endif
diff --git a/src/codec/spng.h b/src/codec/spng.h
new file mode 100644
index 0000000..b7dd93f
--- /dev/null
+++ b/src/codec/spng.h
@@ -0,0 +1,25 @@
+#pragma once
+
+#include "codec.h"
+
+#ifdef LIANA_SERVER
+struct camu_spng_demuxer {
+ struct camu_demuxer demux;
+ struct cch_handle *handle;
+ struct nn_buffer buffer;
+ bool eof;
+};
+
+struct camu_demuxer *camu_spng_demuxer_create(void);
+#endif
+
+#ifdef LIANA_CLIENT
+struct camu_spng_decoder {
+ struct camu_decoder dec;
+ struct camu_codec_stream *stream;
+ void (*callback)(void *, struct camu_codec_frame *);
+ void (*userdata);
+};
+
+struct camu_decoder *camu_spng_decoder_create(void);
+#endif
diff --git a/src/codec/spng/client.c b/src/codec/spng/client.c
deleted file mode 100644
index 6edb9c9..0000000
--- a/src/codec/spng/client.c
+++ /dev/null
@@ -1,77 +0,0 @@
-#include <spng.h>
-
-#include "../common.h"
-
-#include "decoder.h"
-
-static bool spng_decoder_init(struct camu_decoder *dec, struct camu_renderer *renderer, struct camu_codec_stream *stream,
- void (*callback)(void *, struct camu_codec_frame *), void *userdata)
-{
- struct camu_spng_decoder *spng = (struct camu_spng_decoder *)dec;
- (void)renderer;
- spng->stream = stream;
- spng->callback = callback;
- spng->userdata = userdata;
- return true;
-}
-
-static s32 spng_decoder_push(struct camu_decoder *dec, struct camu_codec_packet *packet)
-{
- struct camu_spng_decoder *spng = (struct camu_spng_decoder *)dec;
- if (!packet) return CAMU_OK;
-
- spng_ctx *ctx = spng_ctx_new(SPNG_CTX_IGNORE_ADLER32);
- spng_set_png_buffer(ctx, nn_buffer_get_ptr(packet->buffer, 0), packet->buffer->size);
- spng_set_option(ctx, SPNG_CHUNK_COUNT_LIMIT, 6250);
- spng_set_crc_action(ctx, SPNG_CRC_DISCARD, SPNG_CRC_DISCARD);
-
- size_t out_size;
- spng_decoded_image_size(ctx, SPNG_FMT_RGBA8, &out_size);
-
- struct camu_codec_frame *frame = al_alloc_object(struct camu_codec_frame);
- frame->mode = CAMU_NORMAL;
- frame->data = camu_page_alloc(out_size);
- spng_decode_chunks(ctx);
- spng_decode_image(ctx, frame->data, out_size, SPNG_FMT_RGBA8, 0);
- spng_ctx_free(ctx);
- frame->flags = 0;
- frame->format = CAMU_PIXEL_FORMAT_RGBA;
- struct camu_video_format *fmt = &spng->stream->video.fmt;
- frame->video.width = fmt->width;
- frame->video.height = fmt->height;
- frame->pts = 0.0;
-
- spng->callback(spng->userdata, frame);
-
- return CAMU_OK;
-}
-
-static void spng_decoder_flush(struct camu_decoder *dec)
-{
- (void)dec;
-}
-
-static s32 spng_decoder_process(struct camu_decoder *dec)
-{
- (void)dec;
- return CAMU_ERR_EOF;
-}
-
-static void spng_decoder_free(struct camu_decoder **dec)
-{
- struct camu_spng_decoder *spng = (struct camu_spng_decoder *)*dec;
- al_free(spng);
- *dec = NULL;
-}
-
-struct camu_decoder *camu_spng_decoder_create(void)
-{
- struct camu_spng_decoder *spng = al_alloc_object(struct camu_spng_decoder);
- spng->dec.mode = CAMU_NORMAL;
- spng->dec.init = spng_decoder_init;
- spng->dec.push = spng_decoder_push;
- spng->dec.process = spng_decoder_process;
- spng->dec.flush = spng_decoder_flush;
- spng->dec.free = spng_decoder_free;
- return (struct camu_decoder *)spng;
-}
diff --git a/src/codec/spng/decoder.h b/src/codec/spng/decoder.h
deleted file mode 100644
index c027fce..0000000
--- a/src/codec/spng/decoder.h
+++ /dev/null
@@ -1,12 +0,0 @@
-#pragma once
-
-#include "../codec.h"
-
-struct camu_spng_decoder {
- struct camu_decoder dec;
- struct camu_codec_stream *stream;
- void (*callback)(void *, struct camu_codec_frame *);
- void (*userdata);
-};
-
-struct camu_decoder *camu_spng_decoder_create(void);
diff --git a/src/codec/spng/demuxer.h b/src/codec/spng/demuxer.h
deleted file mode 100644
index bd89ef1..0000000
--- a/src/codec/spng/demuxer.h
+++ /dev/null
@@ -1,12 +0,0 @@
-#pragma once
-
-#include "../codec.h"
-
-struct camu_spng_demuxer {
- struct camu_demuxer demux;
- struct cch_handle *handle;
- struct nn_buffer buffer;
- bool eof;
-};
-
-struct camu_demuxer *camu_spng_demuxer_create(void);
diff --git a/src/codec/spng/impl.c b/src/codec/spng/impl.c
deleted file mode 100644
index e69de29..0000000
--- a/src/codec/spng/impl.c
+++ /dev/null
diff --git a/src/codec/spng/meson.build b/src/codec/spng/meson.build
deleted file mode 100644
index f99a885..0000000
--- a/src/codec/spng/meson.build
+++ /dev/null
@@ -1,6 +0,0 @@
-spng = dependency('spng')
-spng_args = ['-DCAMU_HAVE_SPNG']
-codec_server_deps += declare_dependency(sources: ['server.c'],
- dependencies: spng, compile_args: spng_args)
-codec_client_deps += declare_dependency(sources: ['client.c'],
- dependencies: spng, compile_args: spng_args)
diff --git a/src/codec/stb_image/server.c b/src/codec/stb_image.c
index ba50360..b4fabc2 100644
--- a/src/codec/stb_image/server.c
+++ b/src/codec/stb_image.c
@@ -1,8 +1,16 @@
+#include "common.h"
+#define STBI_MALLOC camu_page_alloc
+#define STBI_FREE al_free
+#define STBI_REALLOC camu_page_realloc
+#define STBI_NO_STDIO
+#define STBI_NO_FAILURE_STRINGS
+#define STB_IMAGE_IMPLEMENTATION
#include <stb_image.h>
-#include "../../cache/entry.h"
+#include "stb_image.h"
-#include "demuxer.h"
+#ifdef LIANA_SERVER
+#include "../../cache/entry.h"
static bool stbi_demuxer_init(struct camu_demuxer *demux, struct cch_handle *handle)
{
@@ -22,7 +30,7 @@ static bool stbi_demuxer_init(struct camu_demuxer *demux, struct cch_handle *han
s32 w, h, channels;
u8 *data = nn_buffer_get_ptr(&stb->buffer, 0);
if (!stbi_info_from_memory(data, stb->buffer.size, &w, &h, &channels)) {
- goto err;
+ return false;
}
struct camu_codec_stream stream = { 0 };
@@ -36,8 +44,6 @@ static bool stbi_demuxer_init(struct camu_demuxer *demux, struct cch_handle *han
al_array_push(stb->demux.streams, stream);
return true;
-err:
- return false;
}
static s32 stbi_demuxer_get_packet(struct camu_demuxer *demux, struct camu_codec_packet *packet)
@@ -87,3 +93,75 @@ struct camu_demuxer *camu_stbi_demuxer_create(void)
stb->demux.free = stbi_demuxer_free;
return (struct camu_demuxer *)stb;
}
+#endif
+
+#ifdef LIANA_CLIENT
+static bool stbi_decoder_init(struct camu_decoder *dec, struct camu_renderer *renderer, struct camu_codec_stream *stream,
+ void (*callback)(void *, struct camu_codec_frame *), void *userdata)
+{
+ struct camu_stbi_decoder *stb = (struct camu_stbi_decoder *)dec;
+ (void)renderer;
+ stb->stream = stream;
+ stb->callback = callback;
+ stb->userdata = userdata;
+ return true;
+}
+
+static s32 stbi_decoder_push(struct camu_decoder *dec, struct camu_codec_packet *packet)
+{
+ struct camu_stbi_decoder *stb = (struct camu_stbi_decoder *)dec;
+ if (!packet) return CAMU_OK;
+
+ s32 w, h, channels;
+ u8 *data = nn_buffer_get_ptr(packet->buffer, 0);
+ u8 *pixels = stbi_load_from_memory(data, packet->buffer->size, &w, &h, &channels, 0);
+ if (!pixels) return CAMU_ERR_ERROR;
+
+ struct camu_video_format *fmt = &stb->stream->video.fmt;
+ al_assert(w > 0 && h > 0 && (u32)w == fmt->width && (u32)h == fmt->height);
+
+ struct camu_codec_frame *frame = al_alloc_object(struct camu_codec_frame);
+ frame->mode = CAMU_NORMAL;
+ frame->flags = 0;
+ frame->data = pixels;
+ frame->video.width = (u32)w;
+ frame->video.height = (u32)h;
+ frame->format = camu_pixel_format_from_channels(channels);
+ al_assert(frame->format == fmt->format);
+ frame->pts = 0.0;
+
+ stb->callback(stb->userdata, frame);
+
+ return CAMU_OK;
+}
+
+static void stbi_decoder_flush(struct camu_decoder *dec)
+{
+ (void)dec;
+}
+
+static s32 stbi_decoder_process(struct camu_decoder *dec)
+{
+ (void)dec;
+ return CAMU_ERR_EOF;
+}
+
+static void stbi_decoder_free(struct camu_decoder **dec)
+{
+ struct camu_stbi_decoder *stb = (struct camu_stbi_decoder *)*dec;
+ al_free(stb);
+ *dec = NULL;
+}
+
+struct camu_decoder *camu_stbi_decoder_create(void)
+{
+ struct camu_stbi_decoder *stb = al_alloc_object(struct camu_stbi_decoder);
+ stb->dec.mode = CAMU_NORMAL;
+ stb->dec.init = stbi_decoder_init;
+ stb->dec.push = stbi_decoder_push;
+ stb->dec.process = stbi_decoder_process;
+ stb->dec.flush = stbi_decoder_flush;
+ stb->dec.free = stbi_decoder_free;
+ return (struct camu_decoder *)stb;
+}
+#endif
diff --git a/src/codec/stb_image.h b/src/codec/stb_image.h
new file mode 100644
index 0000000..4130cec
--- /dev/null
+++ b/src/codec/stb_image.h
@@ -0,0 +1,25 @@
+#pragma once
+
+#include "codec.h"
+
+#ifdef LIANA_SERVER
+struct camu_stbi_demuxer {
+ struct camu_demuxer demux;
+ struct cch_handle *handle;
+ struct nn_buffer buffer;
+ bool eof;
+};
+
+struct camu_demuxer *camu_stbi_demuxer_create(void);
+#endif
+
+#ifdef LIANA_CLIENT
+struct camu_stbi_decoder {
+ struct camu_decoder dec;
+ struct camu_codec_stream *stream;
+ void (*callback)(void *, struct camu_codec_frame *);
+ void (*userdata);
+};
+
+struct camu_decoder *camu_stbi_decoder_create(void);
+#endif
diff --git a/src/codec/stb_image/client.c b/src/codec/stb_image/client.c
deleted file mode 100644
index 250876f..0000000
--- a/src/codec/stb_image/client.c
+++ /dev/null
@@ -1,72 +0,0 @@
-#include <stb_image.h>
-
-#include "decoder.h"
-
-static bool stbi_decoder_init(struct camu_decoder *dec, struct camu_renderer *renderer, struct camu_codec_stream *stream,
- void (*callback)(void *, struct camu_codec_frame *), void *userdata)
-{
- struct camu_stbi_decoder *stb = (struct camu_stbi_decoder *)dec;
- (void)renderer;
- stb->stream = stream;
- stb->callback = callback;
- stb->userdata = userdata;
- return true;
-}
-
-static s32 stbi_decoder_push(struct camu_decoder *dec, struct camu_codec_packet *packet)
-{
- struct camu_stbi_decoder *stb = (struct camu_stbi_decoder *)dec;
- if (!packet) return CAMU_OK;
-
- s32 w, h, channels;
- u8 *data = nn_buffer_get_ptr(packet->buffer, 0);
- u8 *pixels = stbi_load_from_memory(data, packet->buffer->size, &w, &h, &channels, 0);
- if (!pixels) return CAMU_ERR_ERROR;
-
- struct camu_video_format *fmt = &stb->stream->video.fmt;
- al_assert(w > 0 && h > 0 && (u32)w == fmt->width && (u32)h == fmt->height);
-
- struct camu_codec_frame *frame = al_alloc_object(struct camu_codec_frame);
- frame->mode = CAMU_NORMAL;
- frame->flags = 0;
- frame->data = pixels;
- frame->video.width = (u32)w;
- frame->video.height = (u32)h;
- frame->format = camu_pixel_format_from_channels(channels);
- al_assert(frame->format == fmt->format);
- frame->pts = 0.0;
-
- stb->callback(stb->userdata, frame);
-
- return CAMU_OK;
-}
-
-static void stbi_decoder_flush(struct camu_decoder *dec)
-{
- (void)dec;
-}
-
-static s32 stbi_decoder_process(struct camu_decoder *dec)
-{
- (void)dec;
- return CAMU_ERR_EOF;
-}
-
-static void stbi_decoder_free(struct camu_decoder **dec)
-{
- struct camu_stbi_decoder *stb = (struct camu_stbi_decoder *)*dec;
- al_free(stb);
- *dec = NULL;
-}
-
-struct camu_decoder *camu_stbi_decoder_create(void)
-{
- struct camu_stbi_decoder *stb = al_alloc_object(struct camu_stbi_decoder);
- stb->dec.mode = CAMU_NORMAL;
- stb->dec.init = stbi_decoder_init;
- stb->dec.push = stbi_decoder_push;
- stb->dec.process = stbi_decoder_process;
- stb->dec.flush = stbi_decoder_flush;
- stb->dec.free = stbi_decoder_free;
- return (struct camu_decoder *)stb;
-}
diff --git a/src/codec/stb_image/decoder.h b/src/codec/stb_image/decoder.h
deleted file mode 100644
index af50799..0000000
--- a/src/codec/stb_image/decoder.h
+++ /dev/null
@@ -1,12 +0,0 @@
-#pragma once
-
-#include "../codec.h"
-
-struct camu_stbi_decoder {
- struct camu_decoder dec;
- struct camu_codec_stream *stream;
- void (*callback)(void *, struct camu_codec_frame *);
- void (*userdata);
-};
-
-struct camu_decoder *camu_stbi_decoder_create(void);
diff --git a/src/codec/stb_image/demuxer.h b/src/codec/stb_image/demuxer.h
deleted file mode 100644
index d64e311..0000000
--- a/src/codec/stb_image/demuxer.h
+++ /dev/null
@@ -1,12 +0,0 @@
-#pragma once
-
-#include "../codec.h"
-
-struct camu_stbi_demuxer {
- struct camu_demuxer demux;
- struct cch_handle *handle;
- struct nn_buffer buffer;
- bool eof;
-};
-
-struct camu_demuxer *camu_stbi_demuxer_create(void);
diff --git a/src/codec/stb_image/impl.c b/src/codec/stb_image/impl.c
deleted file mode 100644
index e59d581..0000000
--- a/src/codec/stb_image/impl.c
+++ /dev/null
@@ -1,8 +0,0 @@
-#include "../common.h"
-#define STB_IMAGE_IMPLEMENTATION
-#define STBI_NO_STDIO
-#define STBI_NO_FAILURE_STRINGS
-#define STBI_MALLOC camu_page_alloc
-#define STBI_FREE al_free
-#define STBI_REALLOC camu_page_realloc
-#include <stb_image.h>
diff --git a/src/codec/stb_image/meson.build b/src/codec/stb_image/meson.build
deleted file mode 100644
index e6faa21..0000000
--- a/src/codec/stb_image/meson.build
+++ /dev/null
@@ -1,6 +0,0 @@
-stb = subproject('stb').get_variable('stb')
-stb_args = ['-DCAMU_HAVE_STB_IMAGE']
-codec_server_deps += declare_dependency(sources: ['server.c', 'impl.c'],
- dependencies: stb, compile_args: stb_args)
-codec_client_deps += declare_dependency(sources: ['client.c', 'impl.c'],
- dependencies: stb, compile_args: stb_args)
diff --git a/src/codec/wuffs.c b/src/codec/wuffs.c
new file mode 100644
index 0000000..6ae81d9
--- /dev/null
+++ b/src/codec/wuffs.c
@@ -0,0 +1,216 @@
+#define WUFFS_CONFIG__MODULES
+#define WUFFS_CONFIG__MODULE__BASE
+#define WUFFS_CONFIG__MODULE__ADLER32
+#define WUFFS_CONFIG__MODULE__DEFLATE
+#define WUFFS_CONFIG__MODULE__ZLIB
+#define WUFFS_CONFIG__MODULE__CRC32
+#define WUFFS_CONFIG__MODULE__PNG
+#define WUFFS_CONFIG__MODULE__JPEG
+#define WUFFS_CONFIG__MODULE__IMAGE
+#define WUFFS_IMPLEMENTATION
+#include <wuffs-unsupported-snapshot.c>
+
+#include "wuffs.h"
+#include "common.h"
+
+#ifdef LIANA_SERVER
+#include "../cache/entry.h"
+
+static bool wuffs_demuxer_init(struct camu_demuxer *demux, struct cch_handle *handle)
+{
+ struct camu_wuffs_demuxer *wfs = (struct camu_wuffs_demuxer *)demux;
+
+ wfs->handle = handle;
+ nn_buffer_init(&wfs->buffer);
+ wfs->eof = false;
+
+ cch_handle_seek(wfs->handle, 0, SEEK_SET);
+ struct cch_backing *backing = wfs->handle->entry->backing;
+ off_t size = backing->get_size_if_known(backing);
+ nn_buffer_ensure_space(&wfs->buffer, size);
+ cch_handle_read(wfs->handle, nn_buffer_get_ptr(&wfs->buffer, 0), size);
+ wfs->buffer.size = size;
+
+ wuffs_png__decoder *wf_dec = wuffs_png__decoder__alloc();
+ if (!wf_dec) goto err;
+
+ wuffs_png__decoder__set_quirk(wf_dec, WUFFS_BASE__QUIRK_IGNORE_CHECKSUM, true);
+
+ wuffs_base__io_buffer src = { 0 };
+ src.data.ptr = nn_buffer_get_ptr(&wfs->buffer, 0);
+ src.data.len = size;
+ src.meta.wi = size;
+ src.meta.closed = true;
+
+ wuffs_base__image_config ic = { 0 };
+ wuffs_base__status status = wuffs_png__decoder__decode_image_config(wf_dec, &ic, &src);
+ if (!wuffs_base__status__is_ok(&status)) goto err;
+ if (!wuffs_base__image_config__is_valid(&ic)) goto err;
+
+ struct camu_codec_stream stream = { 0 };
+ stream.mode = CAMU_NORMAL;
+ stream.type = CAMU_STREAM_VIDEO;
+ struct camu_video_format *fmt = &stream.video.fmt;
+ fmt->width = wuffs_base__pixel_config__width(&ic.pixcfg);
+ fmt->height = wuffs_base__pixel_config__height(&ic.pixcfg);
+ fmt->format = CAMU_PIXEL_FORMAT_RGBA;
+
+ al_array_push(wfs->demux.streams, stream);
+
+ free(wf_dec);
+
+ return true;
+err:
+ if (wf_dec) free(wf_dec);
+
+ return false;
+}
+
+static s32 wuffs_demuxer_get_packet(struct camu_demuxer *demux, struct camu_codec_packet *packet)
+{
+ struct camu_wuffs_demuxer *wfs = (struct camu_wuffs_demuxer *)demux;
+ if (!wfs->eof) {
+ packet->mode = CAMU_NORMAL;
+ packet->buffer = &wfs->buffer;
+ wfs->eof = true;
+ return CAMU_OK;
+ }
+ return CAMU_ERR_EOF;
+}
+
+static u64 wuffs_demuxer_get_duration(struct camu_demuxer *demux)
+{
+ (void)demux;
+ return 0;
+}
+
+static bool wuffs_demuxer_seek(struct camu_demuxer *demux, u64 pos, bool bytes)
+{
+ (void)demux;
+ (void)pos;
+ (void)bytes;
+ return true;
+}
+
+static void wuffs_demuxer_free(struct camu_demuxer **demux)
+{
+ struct camu_wuffs_demuxer *wfs = (struct camu_wuffs_demuxer *)*demux;
+ nn_buffer_free(&wfs->buffer);
+ al_array_free(wfs->demux.streams);
+ al_free(wfs);
+ *demux = NULL;
+}
+
+struct camu_demuxer *camu_wuffs_demuxer_create(void)
+{
+ struct camu_wuffs_demuxer *wfs = al_alloc_object(struct camu_wuffs_demuxer);
+ wfs->demux.mode = CAMU_NORMAL;
+ al_array_init(wfs->demux.streams);
+ wfs->demux.init = wuffs_demuxer_init;
+ wfs->demux.get_packet = wuffs_demuxer_get_packet;
+ wfs->demux.get_duration = wuffs_demuxer_get_duration;
+ wfs->demux.seek = wuffs_demuxer_seek;
+ wfs->demux.free = wuffs_demuxer_free;
+ return (struct camu_demuxer *)wfs;
+}
+#endif
+
+#ifdef LIANA_CLIENT
+static bool wuffs_decoder_init(struct camu_decoder *dec, struct camu_renderer *renderer, struct camu_codec_stream *stream,
+ void (*callback)(void *, struct camu_codec_frame *), void *userdata)
+{
+ struct camu_wuffs_decoder *wfs = (struct camu_wuffs_decoder *)dec;
+ (void)renderer;
+ wfs->stream = stream;
+ wfs->callback = callback;
+ wfs->userdata = userdata;
+ return true;
+}
+
+static s32 wuffs_decoder_push(struct camu_decoder *dec, struct camu_codec_packet *packet)
+{
+ struct camu_wuffs_decoder *wfs = (struct camu_wuffs_decoder *)dec;
+ if (!packet) return CAMU_OK;
+
+ struct camu_codec_frame *frame = al_alloc_object(struct camu_codec_frame);
+ frame->mode = CAMU_NORMAL;
+ frame->flags = 0;
+ frame->data = NULL;
+ struct camu_video_format *fmt = &wfs->stream->video.fmt;
+ frame->video.width = fmt->width;
+ frame->video.height = fmt->height;
+ frame->format = CAMU_PIXEL_FORMAT_RGBA;
+
+ wuffs_png__decoder *wf_dec = wuffs_png__decoder__alloc();
+ if (!wf_dec) goto err;
+
+ wuffs_png__decoder__set_quirk(wf_dec, WUFFS_BASE__QUIRK_IGNORE_CHECKSUM, true);
+
+ wuffs_base__io_buffer src = { 0 };
+ src.data.ptr = nn_buffer_get_ptr(packet->buffer, 0);
+ src.data.len = packet->buffer->size;
+ src.meta.wi = packet->buffer->size;
+ src.meta.closed = true;
+
+ wuffs_base__image_config ic = { 0 };
+ wuffs_base__status status = wuffs_png__decoder__decode_image_config(wf_dec, &ic, &src);
+ if (!wuffs_base__status__is_ok(&status)) goto err;
+ if (!wuffs_base__image_config__is_valid(&ic)) goto err;
+
+ u32 pixsub = WUFFS_BASE__PIXEL_SUBSAMPLING__NONE;
+ u32 pixfmt = WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL;
+ wuffs_base__pixel_config__set(&ic.pixcfg, pixfmt, pixsub, fmt->width, fmt->height);
+
+ wuffs_base__pixel_buffer pb = { 0 };
+ size_t dst_size = fmt->width * fmt->height * 4;
+ size_t wrk_size = wuffs_png__decoder__workbuf_len(wf_dec).max_incl;
+ frame->data = camu_page_alloc(dst_size + wrk_size);
+ status = wuffs_base__pixel_buffer__set_from_slice(&pb, &ic.pixcfg, wuffs_base__make_slice_u8(frame->data, dst_size));
+ if (!wuffs_base__status__is_ok(&status)) goto err;
+ wuffs_base__slice_u8 wrk = wuffs_base__make_slice_u8(frame->data + dst_size, wrk_size);
+
+ status = wuffs_png__decoder__decode_frame(wf_dec, &pb, &src, 0, wrk, NULL);
+ if (!wuffs_base__status__is_ok(&status)) goto err;
+
+ wfs->callback(wfs->userdata, frame);
+
+ free(wf_dec);
+
+ return CAMU_OK;
+err:
+ if (wf_dec) free(wf_dec);
+ camu_codec_frame_discard(frame);
+
+ return CAMU_ERR_ERROR;
+}
+
+static void wuffs_decoder_flush(struct camu_decoder *dec)
+{
+ (void)dec;
+}
+
+static s32 wuffs_decoder_process(struct camu_decoder *dec)
+{
+ (void)dec;
+ return CAMU_ERR_EOF;
+}
+
+static void wuffs_decoder_free(struct camu_decoder **dec)
+{
+ struct camu_wuffs_decoder *wfs = (struct camu_wuffs_decoder *)*dec;
+ al_free(wfs);
+ *dec = NULL;
+}
+
+struct camu_decoder *camu_wuffs_decoder_create(void)
+{
+ struct camu_wuffs_decoder *wfs = al_alloc_object(struct camu_wuffs_decoder);
+ wfs->dec.mode = CAMU_NORMAL;
+ wfs->dec.init = wuffs_decoder_init;
+ wfs->dec.push = wuffs_decoder_push;
+ wfs->dec.process = wuffs_decoder_process;
+ wfs->dec.flush = wuffs_decoder_flush;
+ wfs->dec.free = wuffs_decoder_free;
+ return (struct camu_decoder *)wfs;
+}
+#endif
diff --git a/src/codec/wuffs/decoder.h b/src/codec/wuffs.h
index bd79236..e18b40a 100644
--- a/src/codec/wuffs/decoder.h
+++ b/src/codec/wuffs.h
@@ -1,8 +1,19 @@
#pragma once
-#include "../common.h"
-#include "../codec.h"
+#include "codec.h"
+#ifdef LIANA_SERVER
+struct camu_wuffs_demuxer {
+ struct camu_demuxer demux;
+ struct cch_handle *handle;
+ struct nn_buffer buffer;
+ bool eof;
+};
+
+struct camu_demuxer *camu_wuffs_demuxer_create(void);
+#endif
+
+#ifdef LIANA_CLIENT
struct camu_wuffs_decoder {
struct camu_decoder dec;
struct camu_codec_stream *stream;
@@ -12,3 +23,4 @@ struct camu_wuffs_decoder {
};
struct camu_decoder *camu_wuffs_decoder_create(void);
+#endif
diff --git a/src/codec/wuffs/client.c b/src/codec/wuffs/client.c
deleted file mode 100644
index c57e506..0000000
--- a/src/codec/wuffs/client.c
+++ /dev/null
@@ -1,100 +0,0 @@
-#include "decoder.h"
-#include "inc.h"
-
-static bool wuffs_decoder_init(struct camu_decoder *dec, struct camu_renderer *renderer, struct camu_codec_stream *stream,
- void (*callback)(void *, struct camu_codec_frame *), void *userdata)
-{
- struct camu_wuffs_decoder *wfs = (struct camu_wuffs_decoder *)dec;
- (void)renderer;
- wfs->stream = stream;
- wfs->callback = callback;
- wfs->userdata = userdata;
- return true;
-}
-
-static s32 wuffs_decoder_push(struct camu_decoder *dec, struct camu_codec_packet *packet)
-{
- struct camu_wuffs_decoder *wfs = (struct camu_wuffs_decoder *)dec;
- if (!packet) return CAMU_OK;
-
- struct camu_codec_frame *frame = al_alloc_object(struct camu_codec_frame);
- frame->mode = CAMU_NORMAL;
- frame->flags = 0;
- frame->data = NULL;
- struct camu_video_format *fmt = &wfs->stream->video.fmt;
- frame->video.width = fmt->width;
- frame->video.height = fmt->height;
- frame->format = CAMU_PIXEL_FORMAT_RGBA;
-
- wuffs_png__decoder *wf_dec = wuffs_png__decoder__alloc();
- if (!wf_dec) goto err;
-
- wuffs_png__decoder__set_quirk(wf_dec, WUFFS_BASE__QUIRK_IGNORE_CHECKSUM, true);
-
- wuffs_base__io_buffer src = { 0 };
- src.data.ptr = nn_buffer_get_ptr(packet->buffer, 0);
- src.data.len = packet->buffer->size;
- src.meta.wi = packet->buffer->size;
- src.meta.closed = true;
-
- wuffs_base__image_config ic = { 0 };
- wuffs_base__status status = wuffs_png__decoder__decode_image_config(wf_dec, &ic, &src);
- if (!wuffs_base__status__is_ok(&status)) goto err;
- if (!wuffs_base__image_config__is_valid(&ic)) goto err;
-
- u32 pixsub = WUFFS_BASE__PIXEL_SUBSAMPLING__NONE;
- u32 pixfmt = WUFFS_BASE__PIXEL_FORMAT__RGBA_NONPREMUL;
- wuffs_base__pixel_config__set(&ic.pixcfg, pixfmt, pixsub, fmt->width, fmt->height);
-
- wuffs_base__pixel_buffer pb = { 0 };
- size_t dst_size = fmt->width * fmt->height * 4;
- size_t wrk_size = wuffs_png__decoder__workbuf_len(wf_dec).max_incl;
- frame->data = camu_page_alloc(dst_size + wrk_size);
- status = wuffs_base__pixel_buffer__set_from_slice(&pb, &ic.pixcfg, wuffs_base__make_slice_u8(frame->data, dst_size));
- if (!wuffs_base__status__is_ok(&status)) goto err;
- wuffs_base__slice_u8 wrk = wuffs_base__make_slice_u8(frame->data + dst_size, wrk_size);
-
- status = wuffs_png__decoder__decode_frame(wf_dec, &pb, &src, 0, wrk, NULL);
- if (!wuffs_base__status__is_ok(&status)) goto err;
-
- wfs->callback(wfs->userdata, frame);
-
- free(wf_dec);
-
- return CAMU_OK;
-err:
- if (wf_dec) free(wf_dec);
- camu_codec_frame_discard(frame);
-
- return CAMU_ERR_ERROR;
-}
-
-static void wuffs_decoder_flush(struct camu_decoder *dec)
-{
- (void)dec;
-}
-
-static s32 wuffs_decoder_process(struct camu_decoder *dec)
-{
- (void)dec;
- return CAMU_ERR_EOF;
-}
-
-static void wuffs_decoder_free(struct camu_decoder **dec)
-{
- struct camu_wuffs_decoder *wfs = (struct camu_wuffs_decoder *)*dec;
- al_free(wfs);
- *dec = NULL;
-}
-
-struct camu_decoder *camu_wuffs_decoder_create(void)
-{
- struct camu_wuffs_decoder *wfs = al_alloc_object(struct camu_wuffs_decoder);
- wfs->dec.mode = CAMU_NORMAL;
- wfs->dec.init = wuffs_decoder_init;
- wfs->dec.push = wuffs_decoder_push;
- wfs->dec.process = wuffs_decoder_process;
- wfs->dec.flush = wuffs_decoder_flush;
- wfs->dec.free = wuffs_decoder_free;
- return (struct camu_decoder *)wfs;
-}
diff --git a/src/codec/wuffs/demuxer.h b/src/codec/wuffs/demuxer.h
deleted file mode 100644
index c2cb8a5..0000000
--- a/src/codec/wuffs/demuxer.h
+++ /dev/null
@@ -1,12 +0,0 @@
-#pragma once
-
-#include "../codec.h"
-
-struct camu_wuffs_demuxer {
- struct camu_demuxer demux;
- struct cch_handle *handle;
- struct nn_buffer buffer;
- bool eof;
-};
-
-struct camu_demuxer *camu_wuffs_demuxer_create(void);
diff --git a/src/codec/wuffs/impl.c b/src/codec/wuffs/impl.c
deleted file mode 100644
index ab291cb..0000000
--- a/src/codec/wuffs/impl.c
+++ /dev/null
@@ -1,2 +0,0 @@
-#define WUFFS_IMPLEMENTATION
-#include "inc.h"
diff --git a/src/codec/wuffs/inc.h b/src/codec/wuffs/inc.h
deleted file mode 100644
index 51e3743..0000000
--- a/src/codec/wuffs/inc.h
+++ /dev/null
@@ -1,12 +0,0 @@
-#pragma once
-
-#define WUFFS_CONFIG__MODULES
-#define WUFFS_CONFIG__MODULE__BASE
-#define WUFFS_CONFIG__MODULE__ADLER32
-#define WUFFS_CONFIG__MODULE__DEFLATE
-#define WUFFS_CONFIG__MODULE__ZLIB
-#define WUFFS_CONFIG__MODULE__CRC32
-#define WUFFS_CONFIG__MODULE__PNG
-#define WUFFS_CONFIG__MODULE__JPEG
-#define WUFFS_CONFIG__MODULE__IMAGE
-#include <wuffs-unsupported-snapshot.c>
diff --git a/src/codec/wuffs/meson.build b/src/codec/wuffs/meson.build
deleted file mode 100644
index 5e5c398..0000000
--- a/src/codec/wuffs/meson.build
+++ /dev/null
@@ -1,6 +0,0 @@
-wuffs = subproject('wuffs').get_variable('wuffs')
-wuffs_args = ['-DCAMU_HAVE_WUFFS']
-codec_server_deps += declare_dependency(sources: ['server.c', 'impl.c'],
- dependencies: wuffs, compile_args: wuffs_args)
-codec_client_deps += declare_dependency(sources: ['client.c', 'impl.c'],
- dependencies: wuffs, compile_args: wuffs_args)
diff --git a/src/codec/wuffs/server.c b/src/codec/wuffs/server.c
deleted file mode 100644
index 5e7e885..0000000
--- a/src/codec/wuffs/server.c
+++ /dev/null
@@ -1,102 +0,0 @@
-#include "../../cache/entry.h"
-
-#include "demuxer.h"
-#include "inc.h"
-
-static bool wuffs_demuxer_init(struct camu_demuxer *demux, struct cch_handle *handle)
-{
- struct camu_wuffs_demuxer *wfs = (struct camu_wuffs_demuxer *)demux;
-
- wfs->handle = handle;
- nn_buffer_init(&wfs->buffer);
- wfs->eof = false;
-
- cch_handle_seek(wfs->handle, 0, SEEK_SET);
- struct cch_backing *backing = wfs->handle->entry->backing;
- off_t size = backing->get_size_if_known(backing);
- nn_buffer_ensure_space(&wfs->buffer, size);
- cch_handle_read(wfs->handle, nn_buffer_get_ptr(&wfs->buffer, 0), size);
- wfs->buffer.size = size;
-
- wuffs_png__decoder *wf_dec = wuffs_png__decoder__alloc();
- if (!wf_dec) goto err;
-
- wuffs_png__decoder__set_quirk(wf_dec, WUFFS_BASE__QUIRK_IGNORE_CHECKSUM, true);
-
- wuffs_base__io_buffer src = { 0 };
- src.data.ptr = nn_buffer_get_ptr(&wfs->buffer, 0);
- src.data.len = size;
- src.meta.wi = size;
- src.meta.closed = true;
-
- wuffs_base__image_config ic = { 0 };
- wuffs_base__status status = wuffs_png__decoder__decode_image_config(wf_dec, &ic, &src);
- if (!wuffs_base__status__is_ok(&status)) goto err;
- if (!wuffs_base__image_config__is_valid(&ic)) goto err;
-
- struct camu_codec_stream stream = { 0 };
- stream.mode = CAMU_NORMAL;
- stream.type = CAMU_STREAM_VIDEO;
- struct camu_video_format *fmt = &stream.video.fmt;
- fmt->width = wuffs_base__pixel_config__width(&ic.pixcfg);
- fmt->height = wuffs_base__pixel_config__height(&ic.pixcfg);
- fmt->format = CAMU_PIXEL_FORMAT_RGBA;
-
- al_array_push(wfs->demux.streams, stream);
-
- free(wf_dec);
-
- return true;
-err:
- if (wf_dec) free(wf_dec);
-
- return false;
-}
-
-static s32 wuffs_demuxer_get_packet(struct camu_demuxer *demux, struct camu_codec_packet *packet)
-{
- struct camu_wuffs_demuxer *wfs = (struct camu_wuffs_demuxer *)demux;
- if (!wfs->eof) {
- packet->mode = CAMU_NORMAL;
- packet->buffer = &wfs->buffer;
- wfs->eof = true;
- return CAMU_OK;
- }
- return CAMU_ERR_EOF;
-}
-
-static u64 wuffs_demuxer_get_duration(struct camu_demuxer *demux)
-{
- (void)demux;
- return 0;
-}
-
-static bool wuffs_demuxer_seek(struct camu_demuxer *demux, u64 pos, bool bytes)
-{
- (void)demux;
- (void)pos;
- (void)bytes;
- return true;
-}
-
-static void wuffs_demuxer_free(struct camu_demuxer **demux)
-{
- struct camu_wuffs_demuxer *wfs = (struct camu_wuffs_demuxer *)*demux;
- nn_buffer_free(&wfs->buffer);
- al_array_free(wfs->demux.streams);
- al_free(wfs);
- *demux = NULL;
-}
-
-struct camu_demuxer *camu_wuffs_demuxer_create(void)
-{
- struct camu_wuffs_demuxer *wfs = al_alloc_object(struct camu_wuffs_demuxer);
- wfs->demux.mode = CAMU_NORMAL;
- al_array_init(wfs->demux.streams);
- wfs->demux.init = wuffs_demuxer_init;
- wfs->demux.get_packet = wuffs_demuxer_get_packet;
- wfs->demux.get_duration = wuffs_demuxer_get_duration;
- wfs->demux.seek = wuffs_demuxer_seek;
- wfs->demux.free = wuffs_demuxer_free;
- return (struct camu_demuxer *)wfs;
-}