From 1fa8403772d867e00b30cf98767ad9ab557fff47 Mon Sep 17 00:00:00 2001 From: Andrew Opalach Date: Tue, 9 Sep 2025 11:22:38 -0400 Subject: Consolidate smaller codec wrappers Signed-off-by: Andrew Opalach --- src/codec/codecs.c | 10 +- src/codec/meson.build | 25 ++++- src/codec/spng.c | 168 +++++++++++++++++++++++++++++++ src/codec/spng.h | 25 +++++ src/codec/spng/client.c | 77 -------------- src/codec/spng/decoder.h | 12 --- src/codec/spng/demuxer.h | 12 --- src/codec/spng/impl.c | 0 src/codec/spng/meson.build | 6 -- src/codec/spng/server.c | 91 ----------------- src/codec/stb_image.c | 167 +++++++++++++++++++++++++++++++ src/codec/stb_image.h | 25 +++++ src/codec/stb_image/client.c | 72 -------------- src/codec/stb_image/decoder.h | 12 --- src/codec/stb_image/demuxer.h | 12 --- src/codec/stb_image/impl.c | 8 -- src/codec/stb_image/meson.build | 6 -- src/codec/stb_image/server.c | 89 ----------------- src/codec/wuffs.c | 216 ++++++++++++++++++++++++++++++++++++++++ src/codec/wuffs.h | 26 +++++ src/codec/wuffs/client.c | 100 ------------------- src/codec/wuffs/decoder.h | 14 --- src/codec/wuffs/demuxer.h | 12 --- src/codec/wuffs/impl.c | 2 - src/codec/wuffs/inc.h | 12 --- src/codec/wuffs/meson.build | 6 -- src/codec/wuffs/server.c | 102 ------------------- 27 files changed, 650 insertions(+), 657 deletions(-) create mode 100644 src/codec/spng.c create mode 100644 src/codec/spng.h delete mode 100644 src/codec/spng/client.c delete mode 100644 src/codec/spng/decoder.h delete mode 100644 src/codec/spng/demuxer.h delete mode 100644 src/codec/spng/impl.c delete mode 100644 src/codec/spng/meson.build delete mode 100644 src/codec/spng/server.c create mode 100644 src/codec/stb_image.c create mode 100644 src/codec/stb_image.h delete mode 100644 src/codec/stb_image/client.c delete mode 100644 src/codec/stb_image/decoder.h delete mode 100644 src/codec/stb_image/demuxer.h delete mode 100644 src/codec/stb_image/impl.c delete mode 100644 src/codec/stb_image/meson.build delete mode 100644 src/codec/stb_image/server.c create mode 100644 src/codec/wuffs.c create mode 100644 src/codec/wuffs.h delete mode 100644 src/codec/wuffs/client.c delete mode 100644 src/codec/wuffs/decoder.h delete mode 100644 src/codec/wuffs/demuxer.h delete mode 100644 src/codec/wuffs/impl.c delete mode 100644 src/codec/wuffs/inc.h delete mode 100644 src/codec/wuffs/meson.build delete mode 100644 src/codec/wuffs/server.c (limited to 'src/codec') 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.c b/src/codec/spng.c new file mode 100644 index 0000000..2168c35 --- /dev/null +++ b/src/codec/spng.c @@ -0,0 +1,168 @@ +#include + +#include "spng.h" +#include "common.h" + +#ifdef LIANA_SERVER +#include "../cache/entry.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); + struct cch_backing *backing = spng->handle->entry->backing; + off_t size = backing->get_size_if_known(backing); + 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, bool bytes) +{ + (void)demux; + (void)pos; + (void)bytes; + 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; +} +#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 - -#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 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/spng/server.c b/src/codec/spng/server.c deleted file mode 100644 index 1bb2ca8..0000000 --- a/src/codec/spng/server.c +++ /dev/null @@ -1,91 +0,0 @@ -#include - -#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); - struct cch_backing *backing = spng->handle->entry->backing; - off_t size = backing->get_size_if_known(backing); - 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, bool bytes) -{ - (void)demux; - (void)pos; - (void)bytes; - 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.c b/src/codec/stb_image.c new file mode 100644 index 0000000..b4fabc2 --- /dev/null +++ b/src/codec/stb_image.c @@ -0,0 +1,167 @@ +#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 + +#include "stb_image.h" + +#ifdef LIANA_SERVER +#include "../../cache/entry.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); + struct cch_backing *backing = stb->handle->entry->backing; + off_t size = backing->get_size_if_known(backing); + 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)) { + return false; + } + + 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 = (u32)w; + fmt->height = (u32)h; + fmt->format = camu_pixel_format_from_channels(channels); + + al_array_push(stb->demux.streams, stream); + + return true; +} + +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, bool bytes) +{ + (void)demux; + (void)pos; + (void)bytes; + 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; +} +#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 - -#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 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/stb_image/server.c b/src/codec/stb_image/server.c deleted file mode 100644 index ba50360..0000000 --- a/src/codec/stb_image/server.c +++ /dev/null @@ -1,89 +0,0 @@ -#include - -#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); - struct cch_backing *backing = stb->handle->entry->backing; - off_t size = backing->get_size_if_known(backing); - 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 = (u32)w; - fmt->height = (u32)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, bool bytes) -{ - (void)demux; - (void)pos; - (void)bytes; - 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.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 + +#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.h b/src/codec/wuffs.h new file mode 100644 index 0000000..e18b40a --- /dev/null +++ b/src/codec/wuffs.h @@ -0,0 +1,26 @@ +#pragma once + +#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; + u8 file_type; + void (*callback)(void *, struct camu_codec_frame *); + void (*userdata); +}; + +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/decoder.h b/src/codec/wuffs/decoder.h deleted file mode 100644 index bd79236..0000000 --- a/src/codec/wuffs/decoder.h +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once - -#include "../common.h" -#include "../codec.h" - -struct camu_wuffs_decoder { - struct camu_decoder dec; - struct camu_codec_stream *stream; - u8 file_type; - void (*callback)(void *, struct camu_codec_frame *); - void (*userdata); -}; - -struct camu_decoder *camu_wuffs_decoder_create(void); 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 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; -} -- cgit v1.2.3-101-g0448