diff options
Diffstat (limited to 'src')
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 |