summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/buffer/meson.build5
-rw-r--r--src/cache/meson.build35
-rw-r--r--src/codec/codec.h17
-rw-r--r--src/codec/ffmpeg/decoder.c8
-rw-r--r--src/codec/ffmpeg/meson.build70
-rw-r--r--src/codec/meson.build79
-rw-r--r--src/codec/spng/client.c77
-rw-r--r--src/codec/spng/impl.c164
-rw-r--r--src/codec/spng/meson.build3
-rw-r--r--src/codec/spng/server.c90
-rw-r--r--src/codec/stb_image/client.c71
-rw-r--r--src/codec/stb_image/impl.c161
-rw-r--r--src/codec/stb_image/meson.build3
-rw-r--r--src/codec/stb_image/server.c87
-rw-r--r--src/codec/wuffs/meson.build3
-rw-r--r--src/fruits/cmsrv/cmsrv.c4
-rw-r--r--src/fruits/cmv/cmv.c20
-rw-r--r--src/fruits/cmv/meson.build6
-rw-r--r--src/fruits/ctv/meson.build1
-rw-r--r--src/fruits/meson.build20
-rw-r--r--src/liana/handlers.c6
-rw-r--r--src/liana/meson.build14
-rw-r--r--src/libsink/meson.build5
-rw-r--r--src/render/meson.build35
-rw-r--r--src/server/meson.build4
-rw-r--r--src/sink/meson.build3
-rw-r--r--src/util/color_palette.c6
-rw-r--r--src/util/color_palette.h2
28 files changed, 535 insertions, 464 deletions
diff --git a/src/buffer/meson.build b/src/buffer/meson.build
index debef54..6301206 100644
--- a/src/buffer/meson.build
+++ b/src/buffer/meson.build
@@ -1,8 +1,9 @@
buffer_src = ['audio.c', 'clock.c', 'peak_buffer.c']
buffer_deps = []
buffer_args = []
+
if not no_video
buffer_src += ['video.c']
endif
-buffer = declare_dependency(sources: buffer_src,
- dependencies: buffer_deps, compile_args: buffer_args)
+
+buffer = declare_dependency(sources: buffer_src, dependencies: buffer_deps, compile_args: buffer_args)
diff --git a/src/cache/meson.build b/src/cache/meson.build
index 5b70c3c..9c9af7b 100644
--- a/src/cache/meson.build
+++ b/src/cache/meson.build
@@ -8,6 +8,16 @@ cache_src = [
cache_deps = []
cache_args = []
+if naunet_has_mmap
+ cache_src += ['backings/file_mapped.c']
+else
+ cache_src += ['backings/file.c']
+endif
+
+if naunet_has_curl
+ cache_src += ['handlers/http.c']
+endif
+
cache_have_cdio = false
libcdio_paranoia = dependency('libcdio_paranoia', required: false, allow_fallback: true)
libcdio_cdda = dependency('libcdio_cdda', required: false, allow_fallback: true)
@@ -18,21 +28,14 @@ if libcdio_paranoia.found() and libcdio_cdda.found()
cache_have_cdio = true
endif
-#libdvdcss = dependency('libdvdcss', required: false, allow_fallback: true)
-#libdvdread = dependency('libdvdread', required: false, allow_fallback: true)
-#libdvdnav = dependency('libdvdnav', required: false, allow_fallback: true)
-#if libdvdcss.found() and libdvdread.found() and libdvdnav.found()
-#endif
-
-if naunet_has_mmap
- cache_src += ['backings/file_mapped.c']
-else
- cache_src += ['backings/file.c']
-endif
-
-if naunet_has_curl
- cache_src += ['handlers/http.c']
+cache_have_libdvd = false
+libdvdcss = dependency('libdvdcss', required: false, allow_fallback: true)
+libdvdread = dependency('dvdread', required: false, allow_fallback: true)
+libdvdnav = dependency('dvdnav', required: false, allow_fallback: true)
+if libdvdcss.found() and libdvdread.found() and libdvdnav.found()
+ cache_deps += [libdvdcss, libdvdread, libdvdnav]
+ cache_args += ['-DCACHE_HAVE_LIBDVD']
+ cache_have_libdvd = true
endif
-cache = declare_dependency(sources: cache_src, dependencies: cache_deps,
- compile_args: cache_args)
+cache = declare_dependency(sources: cache_src, dependencies: cache_deps, compile_args: cache_args)
diff --git a/src/codec/codec.h b/src/codec/codec.h
index b70e3cb..af824d7 100644
--- a/src/codec/codec.h
+++ b/src/codec/codec.h
@@ -9,12 +9,6 @@
#include "../cache/handle.h"
-#ifndef CAMU_SINK_NO_VIDEO
-#include "../render/renderer.h"
-#else
-struct camu_renderer;
-#endif
-
#ifdef CAMU_HAVE_FFMPEG
enum {
CAMU_OK = 0,
@@ -22,9 +16,11 @@ enum {
CAMU_ERR_EOF = AVERROR_EOF,
CAMU_ERR_AGAIN = AVERROR(EAGAIN)
};
+
enum {
CAMU_SEEK_SIZE = AVSEEK_SIZE
};
+
enum {
CAMU_STREAM_UNKNOWN = AVMEDIA_TYPE_UNKNOWN,
CAMU_STREAM_AUDIO = AVMEDIA_TYPE_AUDIO, // 1
@@ -32,6 +28,7 @@ enum {
CAMU_STREAM_SUBTITLE = AVMEDIA_TYPE_SUBTITLE,
CAMU_STREAM_ATTACHMENT = AVMEDIA_TYPE_ATTACHMENT
};
+
enum {
CAMU_SAMPLE_FORMAT_NONE = AV_SAMPLE_FMT_NONE,
CAMU_SAMPLE_FORMAT_U8 = AV_SAMPLE_FMT_U8,
@@ -47,12 +44,14 @@ enum {
CAMU_SAMPLE_FORMAT_S64 = AV_SAMPLE_FMT_S64,
CAMU_SAMPLE_FORMAT_S64P = AV_SAMPLE_FMT_S64P
};
+
enum {
CAMU_PIXEL_FORMAT_RGBA = AV_PIX_FMT_RGBA,
CAMU_PIXEL_FORMAT_RGB = AV_PIX_FMT_RGB8,
CAMU_PIXEL_FORMAT_GREYA = AV_PIX_FMT_GRAY8A,
CAMU_PIXEL_FORMAT_GREY = AV_PIX_FMT_GRAY8
};
+
#define CAMU_PLANAR_DATA_POINTERS AV_NUM_DATA_POINTERS
#else
enum {
@@ -61,9 +60,11 @@ enum {
CAMU_ERR_EOF = -1,
CAMU_ERR_AGAIN = -2
};
+
enum {
CAMU_SEEK_SIZE = 0x10000
};
+
enum {
CAMU_STREAM_UNKNOWN = -1,
CAMU_STREAM_AUDIO,
@@ -71,6 +72,7 @@ enum {
CAMU_STREAM_SUBTITLE,
CAMU_STREAM_ATTACHMENT
};
+
enum {
CAMU_SAMPLE_FORMAT_NONE = -1,
CAMU_SAMPLE_FORMAT_U8,
@@ -86,12 +88,14 @@ enum {
CAMU_SAMPLE_FORMAT_S64,
CAMU_SAMPLE_FORMAT_S64P
};
+
enum {
CAMU_PIXEL_FORMAT_RGBA = 0,
CAMU_PIXEL_FORMAT_RGB,
CAMU_PIXEL_FORMAT_GREYA,
CAMU_PIXEL_FORMAT_GREY
};
+
#define CAMU_PLANAR_DATA_POINTERS 8
#endif
@@ -176,6 +180,7 @@ struct camu_demuxer {
s32 subscribed;
};
+struct camu_renderer;
struct camu_decoder {
u8 mode;
bool (*init)(struct camu_decoder *, struct camu_renderer *, struct camu_codec_stream *,
diff --git a/src/codec/ffmpeg/decoder.c b/src/codec/ffmpeg/decoder.c
index 36e59dd..5ff99d7 100644
--- a/src/codec/ffmpeg/decoder.c
+++ b/src/codec/ffmpeg/decoder.c
@@ -2,9 +2,13 @@
#include <al/log.h>
#include <libavutil/cpu.h>
+#ifndef CAMU_SINK_NO_VIDEO
+#include "../../render/renderer.h"
+#endif
+
#include "decoder.h"
-#if !defined CAMU_SINK_NO_VIDEO
+#ifndef CAMU_SINK_NO_VIDEO
static s32 get_buffer2(AVCodecContext *context, AVFrame *pic, s32 flags)
{
struct camu_ff_decoder *av = (struct camu_ff_decoder *)context->opaque;
@@ -236,7 +240,7 @@ static bool ff_decoder_init(struct camu_decoder *dec, struct camu_renderer *rend
}
#endif
-#if !defined CAMU_SINK_NO_VIDEO
+#ifndef CAMU_SINK_NO_VIDEO
if (codecpar->codec_type == AVMEDIA_TYPE_VIDEO && renderer && renderer->get_buffer2) {
av->renderer = renderer;
av->codec_context->opaque = av;
diff --git a/src/codec/ffmpeg/meson.build b/src/codec/ffmpeg/meson.build
new file mode 100644
index 0000000..fc0bc91
--- /dev/null
+++ b/src/codec/ffmpeg/meson.build
@@ -0,0 +1,70 @@
+ffmpeg_src = [
+ 'common.c',
+ 'packet_ext.c',
+]
+ffmpeg_args = ['-DCAMU_HAVE_FFMPEG']
+ffmpeg_deps = []
+
+ffmpeg_server_src = [
+ ffmpeg_src,
+ 'demuxer.c',
+ 'avio.c'
+]
+ffmpeg_server_deps = []
+
+# This is layed out based on how things work currently.
+# Obviously the decoder, resampler, scaler, and encoder should
+# be a part of a server-side transcoding function.
+ffmpeg_client_src = [
+ ffmpeg_src,
+ 'decoder.c',
+ 'resampler.c',
+ 'scaler.c',
+ 'encoder.c'
+]
+ffmpeg_client_deps = []
+
+libavutil = dependency('libavutil', required: false)
+libavformat = dependency('libavformat', required: false)
+libavcodec = dependency('libavcodec', required: false)
+libswresample = dependency('libswresample', required: false)
+libswscale = dependency('libswscale', required: false)
+if not (libavutil.found() and libavformat.found() and libavcodec.found() and libswresample.found() and libswscale.found())
+ ffmpeg_proj = subproject('ffmpeg', required: false)
+ if ffmpeg_proj.found()
+ libavutil = ffmpeg_proj.get_variable('avutil')
+ libavformat = ffmpeg_proj.get_variable('avformat')
+ libavcodec = ffmpeg_proj.get_variable('avcodec')
+ libswresample = ffmpeg_proj.get_variable('swresample')
+ libswscale = ffmpeg_proj.get_variable('swscale')
+ # Only used to set include dirs for FFmpeg.
+ ffmpeg_deps += [ffmpeg_proj.get_variable('ffmpeg_inc_dep')]
+ # We explicitly enable zlib in the FFmpeg build.
+ ffmpeg_deps += [dependency('zlib')]
+ if is_windows
+ # Extra static dependencies for Windows.
+ ffmpeg_client_deps += [compiler.find_library('bcrypt')]
+ elif is_android
+ # Android MediaCodec HW decoding.
+ ffmpeg_client_deps += [compiler.find_library('mediandk')]
+ endif
+ soxr = compiler.find_library('soxr', required: false)
+ if soxr.found()
+ ffmpeg_client_deps += [soxr]
+ ffmpeg_args += ['-DCAMU_HAVE_SOXR']
+ endif
+ endif
+endif
+
+if libavutil.found() and libavformat.found() and libavcodec.found() and libswresample.found() and libswscale.found()
+ ffmpeg_server_deps += [libavutil, libavformat, libavcodec]
+ ffmpeg_client_deps += [libavutil, libavformat, libavcodec, libswresample, libswscale]
+ codec_server_deps += [
+ declare_dependency(sources: ffmpeg_server_src,
+ dependencies: [ffmpeg_deps, ffmpeg_server_deps], compile_args: ffmpeg_args)
+ ]
+ codec_client_deps += [
+ declare_dependency(sources: ffmpeg_client_src,
+ dependencies: [ffmpeg_deps, ffmpeg_client_deps], compile_args: ffmpeg_args)
+ ]
+endif
diff --git a/src/codec/meson.build b/src/codec/meson.build
index 2e89d95..4c9e16b 100644
--- a/src/codec/meson.build
+++ b/src/codec/meson.build
@@ -1,86 +1,25 @@
-codec_deps = []
+codec_server_deps = []
+codec_client_deps = []
if get_option('codecs').contains('ffmpeg')
- ffmpeg_src = [
- 'ffmpeg/common.c',
- 'ffmpeg/packet_ext.c',
- 'ffmpeg/decoder.c',
- 'ffmpeg/resampler.c',
- 'ffmpeg/scaler.c',
- 'ffmpeg/encoder.c',
- ]
- if not get_option('sink-only')
- ffmpeg_src += [
- 'ffmpeg/demuxer.c',
- 'ffmpeg/avio.c'
- ]
- endif
- ffmpeg_inc = []
- ffmpeg_deps = []
- ffmpeg_args = []
-
- libavutil = dependency('libavutil', required: false)
- libavformat = dependency('libavformat', required: false)
- libavcodec = dependency('libavcodec', required: false)
- libswresample = dependency('libswresample', required: false)
- libswscale = dependency('libswscale', required: false)
- if not (libavutil.found() and libavformat.found() and libavcodec.found() and libswresample.found() and libswscale.found())
- ffmpeg_proj = subproject('ffmpeg', required: false)
- if ffmpeg_proj.found()
- libavutil = ffmpeg_proj.get_variable('avutil')
- libavformat = ffmpeg_proj.get_variable('avformat')
- libavcodec = ffmpeg_proj.get_variable('avcodec')
- libswresample = ffmpeg_proj.get_variable('swresample')
- libswscale = ffmpeg_proj.get_variable('swscale')
- # Only used to set include dirs for FFmpeg.
- ffmpeg_deps += [ffmpeg_proj.get_variable('ffmpeg_inc_dep')]
- # We explicitly enable zlib in the FFmpeg build.
- ffmpeg_deps += [dependency('zlib')]
- if is_windows
- # Extra static dependencies for Windows.
- ffmpeg_deps += [compiler.find_library('bcrypt')]
- elif is_android
- ffmpeg_deps += [compiler.find_library('mediandk')]
- endif
- soxr = compiler.find_library('soxr', required: false)
- if soxr.found()
- ffmpeg_deps += [soxr]
- ffmpeg_args += ['-DCAMU_HAVE_SOXR']
- endif
- endif
- endif
-
- if libavutil.found() and libavformat.found() and libavcodec.found() and libswresample.found() and libswscale.found()
- ffmpeg_deps += [libavutil, libavformat, libavcodec, libswresample, libswscale]
- ffmpeg_args += ['-DCAMU_HAVE_FFMPEG']
- ffmpeg_codec = declare_dependency(sources: ffmpeg_src, dependencies: ffmpeg_deps,
- include_directories: ffmpeg_inc, compile_args: ffmpeg_args)
- codec_deps += [ffmpeg_codec]
- endif
+ subdir('ffmpeg')
endif
if get_option('codecs').contains('stb_image')
- stb = subproject('stb').get_variable('stb')
- stb_image_codec = declare_dependency(sources: ['stb_image/impl.c'], dependencies: stb)
- codec_deps += [stb_image_codec]
+ subdir('stb_image')
endif
if get_option('codecs').contains('spng')
- spng = dependency('spng', required: false)
- if spng.found()
- spng_codec = declare_dependency(sources: ['spng/impl.c'], dependencies: spng)
- codec_deps += [spng_codec]
- endif
+ subdir('spng')
endif
if get_option('codecs').contains('wuffs')
- wuffs = subproject('wuffs').get_variable('wuffs')
- wuffs_codec = declare_dependency(sources: ['wuffs/impl.c'], dependencies: wuffs)
- codec_deps += [wuffs_codec]
+ subdir('wuffs')
endif
if not no_video
- codec_deps += [stela]
+ codec_client_deps += [stela]
endif
-codecs = declare_dependency(dependencies: codec_deps)
+codecs_server = declare_dependency(dependencies: codec_server_deps)
+codecs_client = declare_dependency(dependencies: codec_client_deps)
diff --git a/src/codec/spng/client.c b/src/codec/spng/client.c
new file mode 100644
index 0000000..6edb9c9
--- /dev/null
+++ b/src/codec/spng/client.c
@@ -0,0 +1,77 @@
+#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/impl.c b/src/codec/spng/impl.c
index 3fb7e21..e69de29 100644
--- a/src/codec/spng/impl.c
+++ b/src/codec/spng/impl.c
@@ -1,164 +0,0 @@
-#include <al/lib.h>
-#include <nnwt/common.h>
-#include <spng.h>
-
-#include "../../cache/entry.h"
-
-#include "../common.h"
-
-#include "demuxer.h"
-#include "decoder.h"
-
-static bool spng_demuxer_init(struct camu_demuxer *demux, struct cch_handle *handle)
-{
- struct camu_spng_demuxer *spng = (struct camu_spng_demuxer *)demux;
-
- spng->handle = handle;
- nn_buffer_init(&spng->buffer);
- spng->eof = false;
-
- cch_handle_seek(spng->handle, 0, SEEK_SET);
- off_t size = cch_entry_get_size(spng->handle->entry);
- nn_buffer_ensure_space(&spng->buffer, size);
- cch_handle_read(spng->handle, nn_buffer_get_ptr(&spng->buffer, 0), size);
- spng->buffer.size = size;
-
- spng_ctx *ctx = spng_ctx_new(SPNG_CTX_IGNORE_ADLER32);
- spng_set_png_buffer(ctx, nn_buffer_get_ptr(&spng->buffer, 0), spng->buffer.size);
- spng_set_option(ctx, SPNG_CHUNK_COUNT_LIMIT, 6250);
- spng_set_crc_action(ctx, SPNG_CRC_DISCARD, SPNG_CRC_DISCARD);
-
- struct spng_ihdr ihdr;
- spng_get_ihdr(ctx, &ihdr);
-
- struct camu_codec_stream stream;
- stream.mode = CAMU_NORMAL;
- stream.type = CAMU_STREAM_VIDEO;
- stream.video.width = ihdr.width;
- stream.video.height = ihdr.height;
- stream.video.format = CAMU_PIXEL_FORMAT_RGBA;
-
- al_array_push(spng->demux.streams, stream);
-
- spng_ctx_free(ctx);
-
- return true;
-}
-
-static s32 spng_demuxer_get_packet(struct camu_demuxer *demux, struct camu_codec_packet *packet)
-{
- struct camu_spng_demuxer *spng = (struct camu_spng_demuxer *)demux;
- if (!spng->eof) {
- packet->mode = CAMU_NORMAL;
- packet->buffer = &spng->buffer;
- spng->eof = true;
- return CAMU_OK;
- }
- return CAMU_ERR_EOF;
-}
-
-static u64 spng_demuxer_get_duration(struct camu_demuxer *demux)
-{
- (void)demux;
- return 0;
-}
-
-static bool spng_demuxer_seek(struct camu_demuxer *demux, u64 pos)
-{
- (void)demux;
- (void)pos;
- return true;
-}
-
-static void spng_demuxer_free(struct camu_demuxer **demux)
-{
- struct camu_spng_demuxer *spng = (struct camu_spng_demuxer *)*demux;
- nn_buffer_free(&spng->buffer);
- al_array_free(spng->demux.streams);
- al_free(spng);
- *demux = NULL;
-}
-
-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;
- frame->width = spng->stream->video.width;
- frame->height = spng->stream->video.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_demuxer *camu_spng_demuxer_create(void)
-{
- struct camu_spng_demuxer *spng = al_alloc_object(struct camu_spng_demuxer);
- spng->demux.mode = CAMU_NORMAL;
- al_array_init(spng->demux.streams);
- spng->demux.init = spng_demuxer_init;
- spng->demux.get_packet = spng_demuxer_get_packet;
- spng->demux.get_duration = spng_demuxer_get_duration;
- spng->demux.seek = spng_demuxer_seek;
- spng->demux.free = spng_demuxer_free;
- return (struct camu_demuxer *)spng;
-}
-
-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/meson.build b/src/codec/spng/meson.build
new file mode 100644
index 0000000..d8af781
--- /dev/null
+++ b/src/codec/spng/meson.build
@@ -0,0 +1,3 @@
+spng = dependency('spng')
+codec_server_deps += [declare_dependency(sources: ['server.c'], dependencies: spng)]
+codec_client_deps += [declare_dependency(sources: ['client.c'], dependencies: spng)]
diff --git a/src/codec/spng/server.c b/src/codec/spng/server.c
new file mode 100644
index 0000000..8eb941b
--- /dev/null
+++ b/src/codec/spng/server.c
@@ -0,0 +1,90 @@
+#include <spng.h>
+
+#include "../../cache/entry.h"
+
+#include "demuxer.h"
+
+static bool spng_demuxer_init(struct camu_demuxer *demux, struct cch_handle *handle)
+{
+ struct camu_spng_demuxer *spng = (struct camu_spng_demuxer *)demux;
+
+ spng->handle = handle;
+ nn_buffer_init(&spng->buffer);
+ spng->eof = false;
+
+ cch_handle_seek(spng->handle, 0, SEEK_SET);
+ off_t size = cch_entry_get_size(spng->handle->entry);
+ nn_buffer_ensure_space(&spng->buffer, size);
+ cch_handle_read(spng->handle, nn_buffer_get_ptr(&spng->buffer, 0), size);
+ spng->buffer.size = size;
+
+ spng_ctx *ctx = spng_ctx_new(SPNG_CTX_IGNORE_ADLER32);
+ spng_set_png_buffer(ctx, nn_buffer_get_ptr(&spng->buffer, 0), spng->buffer.size);
+ spng_set_option(ctx, SPNG_CHUNK_COUNT_LIMIT, 6250);
+ spng_set_crc_action(ctx, SPNG_CRC_DISCARD, SPNG_CRC_DISCARD);
+
+ struct spng_ihdr ihdr;
+ spng_get_ihdr(ctx, &ihdr);
+
+ 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 = ihdr.width;
+ fmt->height = ihdr.height;
+ fmt->format = CAMU_PIXEL_FORMAT_RGBA;
+
+ al_array_push(spng->demux.streams, stream);
+
+ spng_ctx_free(ctx);
+
+ return true;
+}
+
+static s32 spng_demuxer_get_packet(struct camu_demuxer *demux, struct camu_codec_packet *packet)
+{
+ struct camu_spng_demuxer *spng = (struct camu_spng_demuxer *)demux;
+ if (!spng->eof) {
+ packet->mode = CAMU_NORMAL;
+ packet->buffer = &spng->buffer;
+ spng->eof = true;
+ return CAMU_OK;
+ }
+ return CAMU_ERR_EOF;
+}
+
+static u64 spng_demuxer_get_duration(struct camu_demuxer *demux)
+{
+ (void)demux;
+ return 0;
+}
+
+static bool spng_demuxer_seek(struct camu_demuxer *demux, u64 pos)
+{
+ (void)demux;
+ (void)pos;
+ return true;
+}
+
+static void spng_demuxer_free(struct camu_demuxer **demux)
+{
+ struct camu_spng_demuxer *spng = (struct camu_spng_demuxer *)*demux;
+ nn_buffer_free(&spng->buffer);
+ al_array_free(spng->demux.streams);
+ al_free(spng);
+ *demux = NULL;
+}
+
+
+struct camu_demuxer *camu_spng_demuxer_create(void)
+{
+ struct camu_spng_demuxer *spng = al_alloc_object(struct camu_spng_demuxer);
+ spng->demux.mode = CAMU_NORMAL;
+ al_array_init(spng->demux.streams);
+ spng->demux.init = spng_demuxer_init;
+ spng->demux.get_packet = spng_demuxer_get_packet;
+ spng->demux.get_duration = spng_demuxer_get_duration;
+ spng->demux.seek = spng_demuxer_seek;
+ spng->demux.free = spng_demuxer_free;
+ return (struct camu_demuxer *)spng;
+}
diff --git a/src/codec/stb_image/client.c b/src/codec/stb_image/client.c
new file mode 100644
index 0000000..3742def
--- /dev/null
+++ b/src/codec/stb_image/client.c
@@ -0,0 +1,71 @@
+#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 == fmt->width && 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 = w;
+ frame->video.height = 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/impl.c b/src/codec/stb_image/impl.c
index 1d3a4a1..e59d581 100644
--- a/src/codec/stb_image/impl.c
+++ b/src/codec/stb_image/impl.c
@@ -1,169 +1,8 @@
-#include <al/lib.h>
-#include <nnwt/common.h>
#include "../common.h"
#define STB_IMAGE_IMPLEMENTATION
-#define STB_IMAGE_STATIC
#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
-AL_UNUSED_FUNCTION_PUSH
#include <stb_image.h>
-AL_UNUSED_FUNCTION_POP
-
-#include "../../cache/entry.h"
-
-#include "demuxer.h"
-#include "decoder.h"
-
-static bool stbi_demuxer_init(struct camu_demuxer *demux, struct cch_handle *handle)
-{
- struct camu_stbi_demuxer *stb = (struct camu_stbi_demuxer *)demux;
-
- stb->handle = handle;
- nn_buffer_init(&stb->buffer);
- stb->eof = false;
-
- cch_handle_seek(stb->handle, 0, SEEK_SET);
- off_t size = cch_entry_get_size(stb->handle->entry);
- nn_buffer_ensure_space(&stb->buffer, size);
- cch_handle_read(stb->handle, nn_buffer_get_ptr(&stb->buffer, 0), size);
- stb->buffer.size = size;
-
- 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;
- }
-
- 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 = w;
- fmt->height = h;
- fmt->format = camu_pixel_format_from_channels(channels);
-
- 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)
-{
- struct camu_stbi_demuxer *stb = (struct camu_stbi_demuxer *)demux;
- if (!stb->eof) {
- packet->mode = CAMU_NORMAL;
- packet->buffer = &stb->buffer;
- stb->eof = true;
- return CAMU_OK;
- }
- return CAMU_ERR_EOF;
-}
-
-static u64 stbi_demuxer_get_duration(struct camu_demuxer *demux)
-{
- (void)demux;
- return 0;
-}
-
-static bool stbi_demuxer_seek(struct camu_demuxer *demux, u64 pos)
-{
- (void)demux;
- (void)pos;
- return true;
-}
-
-static void stbi_demuxer_free(struct camu_demuxer **demux)
-{
- struct camu_stbi_demuxer *stb = (struct camu_stbi_demuxer *)*demux;
- nn_buffer_free(&stb->buffer);
- al_array_free(stb->demux.streams);
- al_free(stb);
- *demux = NULL;
-}
-
-
-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 == fmt->width && 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 = w;
- frame->video.height = 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_demuxer *camu_stbi_demuxer_create(void)
-{
- struct camu_stbi_demuxer *stb = al_alloc_object(struct camu_stbi_demuxer);
- stb->demux.mode = CAMU_NORMAL;
- al_array_init(stb->demux.streams);
- stb->demux.init = stbi_demuxer_init;
- stb->demux.get_packet = stbi_demuxer_get_packet;
- stb->demux.get_duration = stbi_demuxer_get_duration;
- stb->demux.seek = stbi_demuxer_seek;
- stb->demux.free = stbi_demuxer_free;
- return (struct camu_demuxer *)stb;
-}
-
-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/meson.build b/src/codec/stb_image/meson.build
new file mode 100644
index 0000000..fea86ff
--- /dev/null
+++ b/src/codec/stb_image/meson.build
@@ -0,0 +1,3 @@
+stb = subproject('stb').get_variable('stb')
+codec_server_deps += declare_dependency(sources: ['server.c', 'impl.c'], dependencies: stb)
+codec_client_deps += declare_dependency(sources: ['client.c', 'impl.c'], dependencies: stb)
diff --git a/src/codec/stb_image/server.c b/src/codec/stb_image/server.c
new file mode 100644
index 0000000..3642a64
--- /dev/null
+++ b/src/codec/stb_image/server.c
@@ -0,0 +1,87 @@
+#include <stb_image.h>
+
+#include "../../cache/entry.h"
+
+#include "demuxer.h"
+
+static bool stbi_demuxer_init(struct camu_demuxer *demux, struct cch_handle *handle)
+{
+ struct camu_stbi_demuxer *stb = (struct camu_stbi_demuxer *)demux;
+
+ stb->handle = handle;
+ nn_buffer_init(&stb->buffer);
+ stb->eof = false;
+
+ cch_handle_seek(stb->handle, 0, SEEK_SET);
+ off_t size = cch_entry_get_size(stb->handle->entry);
+ nn_buffer_ensure_space(&stb->buffer, size);
+ cch_handle_read(stb->handle, nn_buffer_get_ptr(&stb->buffer, 0), size);
+ stb->buffer.size = size;
+
+ 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;
+ }
+
+ 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 = w;
+ fmt->height = h;
+ fmt->format = camu_pixel_format_from_channels(channels);
+
+ 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)
+{
+ struct camu_stbi_demuxer *stb = (struct camu_stbi_demuxer *)demux;
+ if (!stb->eof) {
+ packet->mode = CAMU_NORMAL;
+ packet->buffer = &stb->buffer;
+ stb->eof = true;
+ return CAMU_OK;
+ }
+ return CAMU_ERR_EOF;
+}
+
+static u64 stbi_demuxer_get_duration(struct camu_demuxer *demux)
+{
+ (void)demux;
+ return 0;
+}
+
+static bool stbi_demuxer_seek(struct camu_demuxer *demux, u64 pos)
+{
+ (void)demux;
+ (void)pos;
+ return true;
+}
+
+static void stbi_demuxer_free(struct camu_demuxer **demux)
+{
+ struct camu_stbi_demuxer *stb = (struct camu_stbi_demuxer *)*demux;
+ nn_buffer_free(&stb->buffer);
+ al_array_free(stb->demux.streams);
+ al_free(stb);
+ *demux = NULL;
+}
+
+struct camu_demuxer *camu_stbi_demuxer_create(void)
+{
+ struct camu_stbi_demuxer *stb = al_alloc_object(struct camu_stbi_demuxer);
+ stb->demux.mode = CAMU_NORMAL;
+ al_array_init(stb->demux.streams);
+ stb->demux.init = stbi_demuxer_init;
+ stb->demux.get_packet = stbi_demuxer_get_packet;
+ stb->demux.get_duration = stbi_demuxer_get_duration;
+ stb->demux.seek = stbi_demuxer_seek;
+ stb->demux.free = stbi_demuxer_free;
+ return (struct camu_demuxer *)stb;
+}
diff --git a/src/codec/wuffs/meson.build b/src/codec/wuffs/meson.build
new file mode 100644
index 0000000..bb5007a
--- /dev/null
+++ b/src/codec/wuffs/meson.build
@@ -0,0 +1,3 @@
+wuffs = subproject('wuffs').get_variable('wuffs')
+#codec_server_deps += declare_dependency(sources: ['server.c'], dependencies: wuffs)
+#codec_client_deps += declare_dependency(sources: ['client.c'], dependencies: wuffs)
diff --git a/src/fruits/cmsrv/cmsrv.c b/src/fruits/cmsrv/cmsrv.c
index 2f8322c..0149246 100644
--- a/src/fruits/cmsrv/cmsrv.c
+++ b/src/fruits/cmsrv/cmsrv.c
@@ -10,8 +10,10 @@
#include "../../server/server.h"
#include "../../server/common.h"
-#include "../../cache/handlers/cdio.h"
#include "../../codec/ffmpeg/common.h"
+#if CACHE_HAVE_CDIO
+#include "../../cache/handlers/cdio.h"
+#endif
#include "../common.h"
diff --git a/src/fruits/cmv/cmv.c b/src/fruits/cmv/cmv.c
index 9926f32..ac6f6e8 100644
--- a/src/fruits/cmv/cmv.c
+++ b/src/fruits/cmv/cmv.c
@@ -71,14 +71,16 @@ s32 main(s32 argc, char *argv[])
camu_ff_set_default_log_callback();
#endif
- str home;
- al_str_from(&home, getenv("HOME"));
-
- str color_palette;
- al_str_clone(&color_palette, &home);
- al_str_cat(&color_palette, &al_str_c("/.config/colors.json"));
- camu_color_palette_init(&color_palette);
- al_str_free(&color_palette);
+ str home = al_str_null();
+ char *home_env = getenv("HOME");
+ if (home_env) {
+ al_str_from(&home, home_env);
+ str color_palette;
+ al_str_clone(&color_palette, &home);
+ al_str_cat(&color_palette, &al_str_c("/.config/colors.json"));
+ camu_color_palette_init(&color_palette);
+ al_str_free(&color_palette);
+ }
nn_event_loop_init(&c.loop);
@@ -105,7 +107,7 @@ s32 main(s32 argc, char *argv[])
addr = &CAMU_TEST_ADDR;
}
#else
- type = NNWT_SOCKET_TCP; addr = CAMU_TEST_ADDR;
+ type = NNWT_SOCKET_TCP; addr = &CAMU_TEST_ADDR;
#endif
if (!camu_desktop_init(&c.desktop, "cmv")) failure();
diff --git a/src/fruits/cmv/meson.build b/src/fruits/cmv/meson.build
index 9b83847..870345e 100644
--- a/src/fruits/cmv/meson.build
+++ b/src/fruits/cmv/meson.build
@@ -7,14 +7,10 @@ else
cmv_deps += [server]
endif
-if get_option('portal').enabled()
- cmv_deps += [portal]
-endif
-
use_tui = false
if use_tui
cmv_src += []
- cmv_deps += [dependency('notcurses')]
+ cmv_deps += [notcurses]
endif
cmv_link_args = []
diff --git a/src/fruits/ctv/meson.build b/src/fruits/ctv/meson.build
index 5a4dca8..1b653e7 100644
--- a/src/fruits/ctv/meson.build
+++ b/src/fruits/ctv/meson.build
@@ -1,6 +1,5 @@
ctv_src = ['ctv.c', '../../sink/common.c']
ctv_deps = [common_deps, libsink]
ctv_args = ['-DCAMU_MIXER_THREADED', '-DCAMU_SCREEN_THREADED']
-
# https://github.com/google/ExoPlayer/issues/9933#issuecomment-1029775358
shared_library('ctv', ctv_src, dependencies: ctv_deps, c_args: ctv_args, link_args: ['-Wl,-Bsymbolic', '-static-libstdc++'])
diff --git a/src/fruits/meson.build b/src/fruits/meson.build
index 2ceeaa0..37edd0b 100644
--- a/src/fruits/meson.build
+++ b/src/fruits/meson.build
@@ -1,28 +1,34 @@
-if get_option('server').enabled() or get_option('client').enabled()
+if (get_option('server').enabled() or get_option('client').enabled()) and not is_windows
notcurses = dependency('notcurses', required: false, allow_fallback: false)
notcurses_core = dependency('notcurses-core', required: false, allow_fallback: false)
if not notcurses.found() or not notcurses_core.found()
notcurses_opts = cmake.subproject_options()
notcurses_opts.add_cmake_defines({ 'CMAKE_BUILD_TYPE': is_debug ? 'Debug' : 'Release' })
notcurses_opts.add_cmake_defines({ 'USE_CXX': false })
+ notcurses_opts.add_cmake_defines({ 'USE_DEFLATE': false })
notcurses_opts.add_cmake_defines({ 'USE_DOCTEST': false })
notcurses_opts.add_cmake_defines({ 'USE_PANDOC': false })
notcurses_opts.add_cmake_defines({ 'BUILD_EXECUTABLES': false })
notcurses_opts.add_cmake_defines({ 'BUILD_FFI_LIBRARY': false })
notcurses_opts.add_cmake_defines({ 'USE_POC': false })
- notcurses_opts.add_cmake_defines({ 'USE_STATIC': false })
- notcurses_opts.add_cmake_defines({ 'USE_MULTIMEDIA': 'ffmpeg' })
+ notcurses_opts.add_cmake_defines({ 'USE_STATIC': true })
+ notcurses_opts.add_cmake_defines({ 'USE_MULTIMEDIA': is_windows ? 'none' : 'ffmpeg' })
notcurses_proj = cmake.subproject('notcurses', options: notcurses_opts)
- notcurses = notcurses_proj.dependency('notcurses')
- notcurses_core = notcurses_proj.dependency('notcurses-core')
+ if is_windows
+ notcurses = notcurses_proj.dependency('notcurses-static')
+ notcurses_core = notcurses_proj.dependency('notcurses-core-static')
+ else
+ notcurses = notcurses_proj.dependency('notcurses')
+ notcurses_core = notcurses_proj.dependency('notcurses-core')
+ endif
endif
endif
-if get_option('server').enabled()
+if get_option('server').enabled() and not is_windows
subdir('cmsrv')
endif
-if get_option('client').enabled()
+if get_option('client').enabled() and not is_windows
subdir('cmc')
endif
diff --git a/src/liana/handlers.c b/src/liana/handlers.c
index 38e5bfa..69737ee 100644
--- a/src/liana/handlers.c
+++ b/src/liana/handlers.c
@@ -4,7 +4,7 @@
#ifdef CACHE_HAVE_CDIO
#include "handlers/cdio.h"
#endif
-#ifdef LIANA_HAVE_DVD
+#ifdef CACHE_HAVE_LIBDVD
#include "handlers/dvd.h"
#endif
@@ -29,9 +29,9 @@ struct lia_handler_entry liana_handlers[] = {
#endif
},
#endif
-#ifdef LIANA_HAVE_DVD
+#ifdef CACHE_HAVE_LIBDVD
{
- .name = al_str_c("dvd"),
+ .name = al_str_c("libdvd"),
#ifdef LIANA_SERVER
.create_server_handler = lia_dvd_server_create,
#endif
diff --git a/src/liana/meson.build b/src/liana/meson.build
index beb6f68..34abc66 100644
--- a/src/liana/meson.build
+++ b/src/liana/meson.build
@@ -10,7 +10,8 @@ liana_client_src = [
'handlers/codec_client.c',
'handlers.c'
]
-liana_deps = [codecs]
+liana_server_deps = [cache, codecs_server]
+liana_client_deps = [codecs_client]
liana_args = []
if cache_have_cdio
@@ -18,17 +19,12 @@ if cache_have_cdio
liana_client_src += ['handlers/cdio_client.c']
endif
-libdvdcss = dependency('libdvdcss')
-libdvdread = dependency('dvdread')
-libdvdnav = dependency('dvdnav')
-if libdvdcss.found() and libdvdread.found() and libdvdnav.found()
+if cache_have_libdvd
liana_server_src += ['handlers/dvd_server.c']
liana_client_src += ['handlers/dvd_client.c']
- liana_deps += [libdvdcss, libdvdread, libdvdnav]
- liana_args += ['-DLIANA_HAVE_DVD']
endif
liana_server = declare_dependency(sources: liana_server_src,
- dependencies: liana_deps, compile_args: [liana_args, '-DLIANA_SERVER'])
+ dependencies: liana_server_deps, compile_args: [liana_args, '-DLIANA_SERVER'])
liana_client = declare_dependency(sources: liana_client_src,
- dependencies: liana_deps, compile_args: [liana_args, '-DLIANA_CLIENT'])
+ dependencies: liana_client_deps, compile_args: [liana_args, '-DLIANA_CLIENT'])
diff --git a/src/libsink/meson.build b/src/libsink/meson.build
index 7f2d1d4..a0805af 100644
--- a/src/libsink/meson.build
+++ b/src/libsink/meson.build
@@ -1,10 +1,11 @@
libsink_src = ['sink.c']
libsink_deps = [buffer, mixer, liana_client]
libsink_args = []
+
if not no_video
libsink_deps += [screen]
else
libsink_args += ['-DCAMU_SINK_NO_VIDEO']
endif
-libsink = declare_dependency(sources: libsink_src, dependencies: libsink_deps,
- compile_args: libsink_args)
+
+libsink = declare_dependency(sources: libsink_src, dependencies: libsink_deps, compile_args: libsink_args)
diff --git a/src/render/meson.build b/src/render/meson.build
index c2bcfd7..668c3d4 100644
--- a/src/render/meson.build
+++ b/src/render/meson.build
@@ -62,7 +62,42 @@ endif
libass_opts = []
if not is_windows
libass_opts += ['fontconfig=enabled']
+ # libass(e46aede):meson.build:126
+ fontconfig = dependency('fontconfig',
+ version: '>=2.10.92',
+ default_options: [
+ 'doc=disabled',
+ 'nls=disabled',
+ 'tests=disabled',
+ 'tools=disabled',
+ 'cache-build=disabled'
+ ])
endif
+# libass(e46aede):meson.build:90
+fribidi = dependency('fribidi',
+ version: '>=0.19.1',
+ default_options: [
+ 'docs=false',
+ 'tests=false',
+ 'bin=false'
+ ])
+# libass(e46aede):meson.build:84
+# fontconfig(72b9a48):meson.build:28
+freetype = dependency('freetype2',
+ version: '>=9.17.3',
+ default_options: [
+ 'harfbuzz=disabled'
+ ])
+# freetype2(42608f7):meson.build:346
+harfbuz = dependency('harfbuzz',
+ version: '>=2.0.0',
+ default_options: [
+ 'freetype=disabled',
+ 'tests=disabled',
+ 'introspection=disabled',
+ 'docs=disabled',
+ 'utilities=disabled'
+ ])
libass = dependency('libass', default_options: libass_opts)
render_deps += [libass]
diff --git a/src/server/meson.build b/src/server/meson.build
index 52c993f..1b9676c 100644
--- a/src/server/meson.build
+++ b/src/server/meson.build
@@ -3,8 +3,10 @@ server_src = [
'user.c',
'db.c'
]
-server_deps = [cache, liana_server]
+server_deps = [liana_server]
+
if get_option('portal').enabled()
server_deps += [portal]
endif
+
server = declare_dependency(sources: server_src, dependencies: server_deps)
diff --git a/src/sink/meson.build b/src/sink/meson.build
index 124c7a5..0c115f8 100644
--- a/src/sink/meson.build
+++ b/src/sink/meson.build
@@ -1,5 +1,4 @@
desktop_src = ['desktop.c', 'common.c', 'input_simulator.c']
desktop_deps = [libsink]
desktop_args = ['-DCAMU_MIXER_THREADED', '-DCAMU_SCREEN_THREADED']
-desktop = declare_dependency(sources: desktop_src, dependencies: desktop_deps,
- compile_args: desktop_args)
+desktop = declare_dependency(sources: desktop_src, dependencies: desktop_deps, compile_args: desktop_args)
diff --git a/src/util/color_palette.c b/src/util/color_palette.c
index 02af36f..73dfc83 100644
--- a/src/util/color_palette.c
+++ b/src/util/color_palette.c
@@ -31,9 +31,11 @@ static char *normal_colors[16] = {
"color14",
"color15"
};
+#endif
bool camu_color_palette_init(str *path)
{
+#ifdef NAUNET_HAS_JSON
struct nn_file file;
if (!nn_file_open(&file, path, NNWT_FILE_READONLY)) {
return false;
@@ -93,6 +95,8 @@ bool camu_color_palette_init(str *path)
al_log_warn("color_palette", "%s is not a valid hex color.", normal_colors[i]);
}
}
+#else
+ (void)path;
+#endif
return true;
}
-#endif
diff --git a/src/util/color_palette.h b/src/util/color_palette.h
index e3e4ed5..a71360c 100644
--- a/src/util/color_palette.h
+++ b/src/util/color_palette.h
@@ -32,6 +32,4 @@ struct camu_color_palette {
extern struct camu_color_palette global_color_palette;
-#ifdef NAUNET_HAS_JSON
bool camu_color_palette_init(str *path);
-#endif